void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample, float flVolume, float flAttenuation, int iFlags, int iPitch, const Vector *pOrigin, const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions, float soundtime, int speakerentity) { SoundHookIter iter; IPluginFunction *pFunc; cell_t res = static_cast<ResultType>(Pl_Continue); cell_t sndlevel = static_cast<cell_t>(ATTN_TO_SNDLVL(flAttenuation)); char buffer[PLATFORM_MAX_PATH]; strcpy(buffer, pSample); for (iter=m_NormalFuncs.begin(); iter!=m_NormalFuncs.end(); iter++) { int players[64], size; size = _FillInPlayers(players, &filter); pFunc = (*iter); pFunc->PushArray(players, 64, SM_PARAM_COPYBACK); pFunc->PushCellByRef(&size); pFunc->PushStringEx(buffer, sizeof(buffer), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); pFunc->PushCellByRef(&iEntIndex); pFunc->PushCellByRef(&iChannel); pFunc->PushFloatByRef(&flVolume); pFunc->PushCellByRef(&sndlevel); pFunc->PushCellByRef(&iPitch); pFunc->PushCellByRef(&iFlags); g_InSoundHook = true; pFunc->Execute(&res); g_InSoundHook = false; switch (res) { case Pl_Handled: case Pl_Stop: { RETURN_META(MRES_SUPERCEDE); } case Pl_Changed: { CellRecipientFilter crf; crf.Initialize(players, size); RETURN_META_NEWPARAMS( MRES_IGNORED, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, float, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>(&IEngineSound::EmitSound), (crf, iEntIndex, iChannel, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)), iFlags, iPitch, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity) ); } } } }
static cell_t smn_TESend(IPluginContext *pContext, const cell_t *params) { if (!g_TEManager.IsAvailable()) { return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report"); } if (!g_CurrentTE) { return pContext->ThrowNativeError("No TempEntity call is in progress"); } cell_t *cl_array; unsigned int numClients; int client; IGamePlayer *pPlayer = NULL; pContext->LocalToPhysAddr(params[1], &cl_array); numClients = params[2]; /* Client validation */ for (unsigned int i = 0; i < numClients; i++) { client = cl_array[i]; pPlayer = playerhelpers->GetGamePlayer(client); if (!pPlayer) { return pContext->ThrowNativeError("Client index %d is invalid", client); } else if (!pPlayer->IsInGame()) { return pContext->ThrowNativeError("Client %d is not connected", client); } } g_TERecFilter.Reset(); g_TERecFilter.Initialize(cl_array, numClients); g_CurrentTE->Send(g_TERecFilter, sp_ctof(params[3])); g_CurrentTE = NULL; return 1; }
static cell_t EmitSound(IPluginContext *pContext, const cell_t *params) { cell_t *addr, *cl_array; CellRecipientFilter crf; unsigned int numClients; int client; IGamePlayer *pPlayer = NULL; pContext->LocalToPhysAddr(params[1], &cl_array); numClients = params[2]; /* Client validation */ for (unsigned int i = 0; i < numClients; i++) { client = cl_array[i]; pPlayer = playerhelpers->GetGamePlayer(client); if (!pPlayer) { return pContext->ThrowNativeError("Client index %d is invalid", client); } else if (!pPlayer->IsInGame()) { return pContext->ThrowNativeError("Client %d is not connected", client); } } crf.Initialize(cl_array, numClients); char *sample; pContext->LocalToString(params[3], &sample); int entity = SoundReferenceToIndex(params[4]); int channel = params[5]; int level = params[6]; int flags = params[7]; float vol = sp_ctof(params[8]); int pitch = params[9]; int speakerentity = params[10]; Vector *pOrigin = NULL, origin; Vector *pDir = NULL, dir; pContext->LocalToPhysAddr(params[11], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pOrigin = &origin; origin.x = sp_ctof(addr[0]); origin.y = sp_ctof(addr[1]); origin.z = sp_ctof(addr[2]); } pContext->LocalToPhysAddr(params[12], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pDir = &dir; dir.x = sp_ctof(addr[0]); dir.y = sp_ctof(addr[1]); dir.z = sp_ctof(addr[2]); } bool updatePos = params[13] ? true : false; float soundtime = sp_ctof(params[14]); CUtlVector<Vector> *pOrigVec = NULL; CUtlVector<Vector> origvec; if (params[0] > 14) { pOrigVec = &origvec; for (cell_t i = 15; i <= params[0]; i++) { Vector vec; pContext->LocalToPhysAddr(params[i], &addr); vec.x = sp_ctof(addr[0]); vec.y = sp_ctof(addr[1]); vec.z = sp_ctof(addr[2]); origvec.AddToTail(vec); } } /* If we're going to a "local player" and this is a dedicated server, * intelligently redirect each sound. */ if (entity == -2 && engine->IsDedicatedServer()) { for (unsigned int i = 0; i < numClients; i++) { cell_t player[1]; player[0] = cl_array[i]; crf.Reset(); crf.Initialize(player, 1); #if SOURCE_ENGINE >= SE_PORTAL2 if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char*, unsigned int, const char*, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, player[0], channel, sample, -1, sample, vol, (soundlevel_t)level, 0, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, player[0], channel, sample, -1, sample, vol, (soundlevel_t)level, 0, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } #elif SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_SDK2013 \ || SOURCE_ENGINE == SE_BMS || SOURCE_ENGINE == SE_TF2 if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, player[0], channel, sample, vol, (soundlevel_t)level, flags, pitch, 0, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, player[0], channel, sample, vol, (soundlevel_t)level, flags, pitch, 0, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } #else if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, player[0], channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, player[0], channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } #endif } } else { #if SOURCE_ENGINE >= SE_PORTAL2 if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char*, unsigned int, const char*, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, entity, channel, sample, -1, sample, vol, (soundlevel_t)level, 0, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, entity, channel, sample, -1, sample, vol, (soundlevel_t)level, 0, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } #elif SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_SDK2013 \ || SOURCE_ENGINE == SE_BMS || SOURCE_ENGINE == SE_TF2 if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, entity, channel, sample, vol, (soundlevel_t)level, flags, pitch, 0, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, entity, channel, sample, vol, (soundlevel_t)level, flags, pitch, 0, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } #else if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, entity, channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, entity, channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } #endif } return 1; }
void SoundHooks::OnEmitSound2(IRecipientFilter &filter, int iEntIndex, int iChannel, const char *pSample, float flVolume, float flAttenuation, int iFlags, int iPitch, const Vector *pOrigin, const Vector *pDirection, CUtlVector<Vector> *pUtlVecOrigins, bool bUpdatePositions, float soundtime, int speakerentity) #endif { SoundHookIter iter; IPluginFunction *pFunc; cell_t res = static_cast<ResultType>(Pl_Continue); cell_t sndlevel = static_cast<cell_t>(ATTN_TO_SNDLVL(flAttenuation)); char buffer[PLATFORM_MAX_PATH]; strcpy(buffer, pSample); char soundEntry[PLATFORM_MAX_PATH] = ""; #if SOURCE_ENGINE >= SE_PORTAL2 Q_strncpy(soundEntry, pSoundEntry, sizeof(soundEntry)); #endif #if SOURCE_ENGINE < SE_PORTAL2 int nSeed = 0; #endif for (iter=m_NormalFuncs.begin(); iter!=m_NormalFuncs.end(); iter++) { int players[SM_MAXPLAYERS], size; size = _FillInPlayers(players, &filter); pFunc = (*iter); pFunc->PushArray(players, SM_ARRAYSIZE(players), SM_PARAM_COPYBACK); pFunc->PushCellByRef(&size); pFunc->PushStringEx(buffer, sizeof(buffer), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); pFunc->PushCellByRef(&iEntIndex); pFunc->PushCellByRef(&iChannel); pFunc->PushFloatByRef(&flVolume); pFunc->PushCellByRef(&sndlevel); pFunc->PushCellByRef(&iPitch); pFunc->PushCellByRef(&iFlags); pFunc->PushStringEx(soundEntry, sizeof(soundEntry), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); pFunc->PushCellByRef(&nSeed); g_InSoundHook = true; pFunc->Execute(&res); g_InSoundHook = false; switch (res) { case Pl_Handled: case Pl_Stop: { #if SOURCE_ENGINE >= SE_PORTAL2 RETURN_META_VALUE(MRES_SUPERCEDE, -1); #else RETURN_META(MRES_SUPERCEDE); #endif } case Pl_Changed: { /* Client validation */ for (int i = 0; i < size; i++) { int client = players[i]; IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); if (!pPlayer) { pFunc->GetParentContext()->BlamePluginError(pFunc, "Client index %d is invalid", client); } else if (!pPlayer->IsInGame()) { pFunc->GetParentContext()->BlamePluginError(pFunc, "Client %d is not connected", client); } else { continue; } #if SOURCE_ENGINE >= SE_PORTAL2 RETURN_META_VALUE(MRES_IGNORED, -1 ); #else return; #endif } #if SOURCE_ENGINE >= SE_PORTAL2 if (strcmp(pSoundEntry, soundEntry) != 0 || strcmp(pSample, buffer) != 0) { if (strcmp(soundEntry, buffer) == 0) nSoundEntryHash = -1; else if (strcmp(soundEntry, "") != 0) nSoundEntryHash = GenerateSoundEntryHash(soundEntry); } #endif CellRecipientFilter crf; crf.Initialize(players, size); #if SOURCE_ENGINE >= SE_PORTAL2 RETURN_META_VALUE_NEWPARAMS( MRES_IGNORED, -1, static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char *, unsigned int, const char *, float, float, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>(&IEngineSound::EmitSound), (crf, iEntIndex, iChannel, soundEntry, nSoundEntryHash, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)), nSeed, iFlags, iPitch, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity) ); #elif SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_SDK2013 \ || SOURCE_ENGINE == SE_BMS || SOURCE_ENGINE == SE_TF2 RETURN_META_NEWPARAMS( MRES_IGNORED, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char *, float, float, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>(&IEngineSound::EmitSound), (crf, iEntIndex, iChannel, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)), iFlags, iPitch, iSpecialDSP, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity) ); #else RETURN_META_NEWPARAMS( MRES_IGNORED, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char *, float, float, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)>(&IEngineSound::EmitSound), (crf, iEntIndex, iChannel, buffer, flVolume, SNDLVL_TO_ATTN(static_cast<soundlevel_t>(sndlevel)), iFlags, iPitch, pOrigin, pDirection, pUtlVecOrigins, bUpdatePositions, soundtime, speakerentity) ); #endif } } } #if SOURCE_ENGINE >= SE_PORTAL2 RETURN_META_VALUE(MRES_IGNORED, -1 ); #endif }
static cell_t EmitSentence(IPluginContext *pContext, const cell_t *params) { cell_t *addr; CellRecipientFilter crf; unsigned int numClients; int client; IGamePlayer *pPlayer = NULL; pContext->LocalToPhysAddr(params[1], &addr); numClients = params[2]; /* Client validation */ for (unsigned int i = 0; i < numClients; i++) { client = addr[i]; pPlayer = playerhelpers->GetGamePlayer(client); if (!pPlayer) { return pContext->ThrowNativeError("Client index %d is invalid", client); } else if (!pPlayer->IsInGame()) { return pContext->ThrowNativeError("Client %d is not connected", client); } } crf.Initialize(addr, numClients); int sentence = params[3]; int entity = SoundReferenceToIndex(params[4]); int channel = params[5]; int level = params[6]; int flags = params[7]; float vol = sp_ctof(params[8]); int pitch = params[9]; int speakerentity = params[10]; Vector *pOrigin = NULL, origin; Vector *pDir = NULL, dir; pContext->LocalToPhysAddr(params[11], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pOrigin = &origin; origin.x = sp_ctof(addr[0]); origin.y = sp_ctof(addr[1]); origin.z = sp_ctof(addr[2]); } pContext->LocalToPhysAddr(params[12], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pDir = &dir; dir.x = sp_ctof(addr[0]); dir.y = sp_ctof(addr[1]); dir.z = sp_ctof(addr[2]); } bool updatePos = params[13] ? true : false; float soundtime = sp_ctof(params[14]); CUtlVector<Vector> *pOrigVec = NULL; CUtlVector<Vector> origvec; if (params[0] > 14) { pOrigVec = &origvec; for (cell_t i = 15; i <= params[0]; i++) { Vector vec; pContext->LocalToPhysAddr(params[i], &addr); vec.x = sp_ctof(addr[0]); vec.y = sp_ctof(addr[1]); vec.z = sp_ctof(addr[2]); origvec.AddToTail(vec); } } engsound->EmitSentenceByIndex(crf, entity, channel, sentence, vol, (soundlevel_t)level, #if SOURCE_ENGINE >= SE_PORTAL2 0, #endif flags, pitch, #if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_SDK2013 \ || SOURCE_ENGINE == SE_BMS || SOURCE_ENGINE == SE_TF2 0, #endif pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); return 1; }
static cell_t EmitSoundEntry(IPluginContext *pContext, const cell_t *params) { #if SOURCE_ENGINE < SE_PORTAL2 return pContext->ThrowNativeError("EmitSoundEntry is not available in this game."); #else cell_t *addr, *cl_array; CellRecipientFilter crf; unsigned int numClients; int client; IGamePlayer *pPlayer = NULL; pContext->LocalToPhysAddr(params[1], &cl_array); numClients = params[2]; /* Client validation */ for (unsigned int i = 0; i < numClients; i++) { client = cl_array[i]; pPlayer = playerhelpers->GetGamePlayer(client); if (!pPlayer) { return pContext->ThrowNativeError("Client index %d is invalid", client); } else if (!pPlayer->IsInGame()) { return pContext->ThrowNativeError("Client %d is not connected", client); } } crf.Initialize(cl_array, numClients); char *soundEntry; pContext->LocalToString(params[3], &soundEntry); char *sample; pContext->LocalToString(params[4], &sample); // By default, we want the hash to equal maxint unsigned int soundEntryHash = -1; // We only generate a hash if the sample is not the same as the sound entry and the sound entry is not empty. if (strcmp(soundEntry, sample) != 0 && strcmp(soundEntry, "") != 0) soundEntryHash = GenerateSoundEntryHash(soundEntry); int entity = SoundReferenceToIndex(params[5]); int channel = params[6]; int level = params[7]; int seed = params[8]; int flags = params[9]; float vol = sp_ctof(params[10]); int pitch = params[11]; int speakerentity = params[12]; Vector *pOrigin = NULL, origin; Vector *pDir = NULL, dir; pContext->LocalToPhysAddr(params[13], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pOrigin = &origin; origin.x = sp_ctof(addr[0]); origin.y = sp_ctof(addr[1]); origin.z = sp_ctof(addr[2]); } pContext->LocalToPhysAddr(params[14], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pDir = &dir; dir.x = sp_ctof(addr[0]); dir.y = sp_ctof(addr[1]); dir.z = sp_ctof(addr[2]); } bool updatePos = params[15] ? true : false; float soundtime = sp_ctof(params[16]); CUtlVector<Vector> *pOrigVec = NULL; CUtlVector<Vector> origvec; if (params[0] > 16) { pOrigVec = &origvec; for (cell_t i = 17; i <= params[0]; i++) { Vector vec; pContext->LocalToPhysAddr(params[i], &addr); vec.x = sp_ctof(addr[0]); vec.y = sp_ctof(addr[1]); vec.z = sp_ctof(addr[2]); origvec.AddToTail(vec); } } /* If we're going to a "local player" and this is a dedicated server, * intelligently redirect each sound. */ if (entity == -2 && engine->IsDedicatedServer()) { for (unsigned int i = 0; i < numClients; i++) { cell_t player[1]; player[0] = cl_array[i]; crf.Reset(); crf.Initialize(player, 1); if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char*, unsigned int, const char*, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound))(crf, player[0], channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, player[0], channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } } } else { if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<int (IEngineSound::*)(IRecipientFilter &, int, int, const char*, unsigned int, const char*, float, soundlevel_t, int, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound))(crf, entity, channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, entity, channel, soundEntry, soundEntryHash, sample, vol, (soundlevel_t)level, seed, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } } return 1; #endif }
void BaseMenuStyle::ClientPressedKey(int client, unsigned int key_press) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] ClientPressedKey() (client %d) (key_press %d)", client, key_press); #endif CBaseMenuPlayer *player = GetMenuPlayer(client); /* First question: Are we in a menu? */ if (!player->bInMenu) { return; } bool cancel = false; unsigned int item = 0; MenuCancelReason reason = MenuCancel_Exit; MenuEndReason end_reason = MenuEnd_Selected; menu_states_t &states = player->states; /* Save variables */ IMenuHandler *mh = states.mh; IBaseMenu *menu = states.menu; unsigned int item_on_page = states.item_on_page; assert(mh != NULL); if (menu == NULL) { item = key_press; } else if (key_press < 1 || key_press > GetMaxPageItems()) { cancel = true; } else { ItemSelection type = states.slots[key_press].type; /* Check if we should play a sound about the type */ if (g_Menus.MenuSoundsEnabled() && (!menu || (menu->GetMenuOptionFlags() & MENUFLAG_NO_SOUND) != MENUFLAG_NO_SOUND)) { CellRecipientFilter filter; cell_t clients[1]; clients[0] = client; filter.Initialize(clients, 1); const char *sound = g_Menus.GetMenuSound(type); if (sound != NULL) { edict_t *pEdict = PEntityOfEntIndex(client); if (pEdict) { ICollideable *pCollideable = pEdict->GetCollideable(); if (pCollideable) { const Vector & pos = pCollideable->GetCollisionOrigin(); enginesound->EmitSound(filter, client, CHAN_AUTO, #if SOURCE_ENGINE >= SE_PORTAL2 sound, -1, #endif sound, VOL_NORM, ATTN_NORM, #if SOURCE_ENGINE >= SE_PORTAL2 0, #endif 0, PITCH_NORM, #if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS \ || SOURCE_ENGINE == SE_SDK2013 || SOURCE_ENGINE == SE_BMS || SOURCE_ENGINE == SE_TF2 0, #endif &pos); } } } } /* For navigational items, we're going to redisplay */ if (type == ItemSel_Back) { if (!RedoClientMenu(client, ItemOrder_Descending)) { cancel = true; reason = MenuCancel_NoDisplay; end_reason = MenuEnd_Cancelled; } else { return; } } else if (type == ItemSel_Next) { if (!RedoClientMenu(client, ItemOrder_Ascending)) { cancel = true; /* I like Saltines. */ reason = MenuCancel_NoDisplay; end_reason = MenuEnd_Cancelled; } else { return; } } else if (type == ItemSel_Exit || type == ItemSel_None) { cancel = true; reason = MenuCancel_Exit; end_reason = MenuEnd_Exit; } else if (type == ItemSel_ExitBack) { cancel = true; reason = MenuCancel_ExitBack; end_reason = MenuEnd_ExitBack; } else { item = states.slots[key_press].item; } } /* Clear states */ player->bInMenu = false; if (player->menuHoldTime) { RemoveClientFromWatch(client); } Handle_t hndl = menu ? menu->GetHandle() : BAD_HANDLE; AutoHandleRooter ahr(hndl); if (cancel) { mh->OnMenuCancel(menu, client, reason); } else { mh->OnMenuSelect(menu, client, item); if (mh->GetMenuAPIVersion2() >= 13) { mh->OnMenuSelect2(menu, client, item, item_on_page); } } /* Only fire end for valid menus */ if (menu) { mh->OnMenuEnd(menu, end_reason); } }
static cell_t EmitSentence(IPluginContext *pContext, const cell_t *params) { cell_t *addr; CellRecipientFilter crf; pContext->LocalToPhysAddr(params[1], &addr); crf.Initialize(addr, params[2]); int sentence = params[3]; int entity = params[4]; int channel = params[5]; int level = params[6]; int flags = params[7]; float vol = sp_ctof(params[8]); int pitch = params[9]; int speakerentity = params[10]; Vector *pOrigin = NULL, origin; Vector *pDir = NULL, dir; pContext->LocalToPhysAddr(params[11], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pOrigin = &origin; origin.x = sp_ctof(addr[0]); origin.y = sp_ctof(addr[1]); origin.z = sp_ctof(addr[2]); } pContext->LocalToPhysAddr(params[12], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pDir = &dir; dir.x = sp_ctof(addr[0]); dir.y = sp_ctof(addr[1]); dir.z = sp_ctof(addr[2]); } bool updatePos = params[13] ? true : false; float soundtime = sp_ctof(params[14]); CUtlVector<Vector> *pOrigVec = NULL; CUtlVector<Vector> origvec; if (params[0] > 14) { pOrigVec = &origvec; for (cell_t i = 15; i <= params[0]; i++) { Vector vec; pContext->LocalToPhysAddr(params[i], &addr); vec.x = sp_ctof(addr[0]); vec.y = sp_ctof(addr[1]); vec.z = sp_ctof(addr[2]); origvec.AddToTail(vec); } } engsound->EmitSentenceByIndex(crf, entity, channel, sentence, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); return 1; }
static cell_t EmitSound(IPluginContext *pContext, const cell_t *params) { cell_t *addr, *pl_addr; CellRecipientFilter crf; pContext->LocalToPhysAddr(params[1], &pl_addr); crf.Initialize(pl_addr, params[2]); char *sample; pContext->LocalToString(params[3], &sample); int entity = params[4]; int channel = params[5]; int level = params[6]; int flags = params[7]; float vol = sp_ctof(params[8]); int pitch = params[9]; int speakerentity = params[10]; Vector *pOrigin = NULL, origin; Vector *pDir = NULL, dir; pContext->LocalToPhysAddr(params[11], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pOrigin = &origin; origin.x = sp_ctof(addr[0]); origin.y = sp_ctof(addr[1]); origin.z = sp_ctof(addr[2]); } pContext->LocalToPhysAddr(params[12], &addr); if (addr != pContext->GetNullRef(SP_NULL_VECTOR)) { pDir = &dir; dir.x = sp_ctof(addr[0]); dir.y = sp_ctof(addr[1]); dir.z = sp_ctof(addr[2]); } bool updatePos = params[13] ? true : false; float soundtime = sp_ctof(params[14]); CUtlVector<Vector> *pOrigVec = NULL; CUtlVector<Vector> origvec; if (params[0] > 14) { pOrigVec = &origvec; for (cell_t i = 15; i <= params[0]; i++) { Vector vec; pContext->LocalToPhysAddr(params[i], &addr); vec.x = sp_ctof(addr[0]); vec.y = sp_ctof(addr[1]); vec.z = sp_ctof(addr[2]); origvec.AddToTail(vec); } } /* If we're going to a "local player" and this is a dedicated server, * intelligently redirect each sound. */ if (entity == -2 && engine->IsDedicatedServer()) { for (cell_t i=0; i<params[2]; i++) { cell_t player[1]; player[0] = pl_addr[i]; crf.Reset(); crf.Initialize(player, 1); if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, player[0], channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, player[0], channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } } } else { if (g_InSoundHook) { SH_CALL(enginesoundPatch, static_cast<void (IEngineSound::*)(IRecipientFilter &, int, int, const char*, float, soundlevel_t, int, int, const Vector *, const Vector *, CUtlVector<Vector> *, bool, float, int)> (&IEngineSound::EmitSound)) (crf, entity, channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } else { engsound->EmitSound(crf, entity, channel, sample, vol, (soundlevel_t)level, flags, pitch, pOrigin, pDir, pOrigVec, updatePos, soundtime, speakerentity); } } return 1; }
static cell_t SlapPlayer(IPluginContext *pContext, const cell_t *params) { static bool s_slap_supported = false; static bool s_slap_setup = false; static ICallWrapper *s_teleport = NULL; static int s_health_offs = 0; static int s_sound_count = 0; static int s_frag_offs = 0; if (!s_slap_setup) { int tries = 0; s_slap_setup = true; if (IsTeleportSupported()) { tries++; } if (IsGetVelocitySupported()) { tries++; } /* Setup health */ if (g_pGameConf->GetOffset("m_iHealth", &s_health_offs) && s_health_offs) { tries++; } if (tries == 3) { s_slap_supported = true; const char *key; if ((key = g_pGameConf->GetKeyValue("SlapSoundCount")) != NULL) { s_sound_count = atoi(key); } } } if (!s_slap_supported) { return pContext->ThrowNativeError("This function is not supported on this mod"); } /* First check if the client is valid */ int client = params[1]; IGamePlayer *player = playerhelpers->GetGamePlayer(client); if (!player) { return pContext->ThrowNativeError("Client %d is not valid", client); } else if (!player->IsInGame()) { return pContext->ThrowNativeError("Client %d is not in game", client); } edict_t *pEdict = player->GetEdict(); CBaseEntity *pEntity = pEdict->GetUnknown()->GetBaseEntity(); /* See if we should be taking away health */ bool should_slay = false; if (params[2]) { #if SOURCE_ENGINE != SE_DARKMESSIAH int *health = (int *)((char *)pEntity + s_health_offs); if (*health - params[2] <= 0) { *health = 1; should_slay = true; } else { *health -= params[2]; } #else float *health = (float *)((char *)pEntity + s_health_offs); if (*health - (float)params[2] <= 0) { *health = 1.0f; should_slay = true; } else { *health -= (float)params[2]; } #endif } /* Teleport in a random direction - thank you, Mani!*/ Vector velocity; GetVelocity(pEntity, &velocity, NULL); velocity.x += ((rand() % 180) + 50) * (((rand() % 2) == 1) ? -1 : 1); velocity.y += ((rand() % 180) + 50) * (((rand() % 2) == 1) ? -1 : 1); velocity.z += rand() % 200 + 100; Teleport(pEntity, NULL, NULL, &velocity); /* Play a random sound */ if (params[3] && s_sound_count > 0) { char name[48]; const char *sound_name; cell_t player_list[256], total_players = 0; int maxClients = playerhelpers->GetMaxClients(); int r = (rand() % s_sound_count) + 1; snprintf(name, sizeof(name), "SlapSound%d", r); if ((sound_name = g_pGameConf->GetKeyValue(name)) != NULL) { IGamePlayer *other; for (int i=1; i<=maxClients; i++) { other = playerhelpers->GetGamePlayer(i); if (other->IsInGame()) { player_list[total_players++] = i; } } const Vector & pos = pEdict->GetCollideable()->GetCollisionOrigin(); CellRecipientFilter rf; rf.SetToReliable(true); rf.Initialize(player_list, total_players); engsound->EmitSound(rf, client, CHAN_AUTO, sound_name, VOL_NORM, ATTN_NORM, 0, PITCH_NORM, &pos); } } if (!s_frag_offs) { const char *frag_prop = g_pGameConf->GetKeyValue("m_iFrags"); if (frag_prop) { datamap_t *pMap = gamehelpers->GetDataMap(pEntity); typedescription_t *pType = gamehelpers->FindInDataMap(pMap, frag_prop); if (pType != NULL) { s_frag_offs = pType->fieldOffset[TD_OFFSET_NORMAL]; } } if (!s_frag_offs) { s_frag_offs = -1; } } int old_frags = 0; if (s_frag_offs > 0) { old_frags = *(int *)((char *)pEntity + s_frag_offs); } /* Force suicide */ if (should_slay) { pluginhelpers->ClientCommand(pEdict, "kill\n"); } if (s_frag_offs > 0) { *(int *)((char *)pEntity + s_frag_offs) = old_frags; } return 1; }