bool SoundHooks::RemoveHook(int type, IPluginFunction *pFunc) { SoundHookIter iter; if (type == NORMAL_SOUND_HOOK) { if ((iter=m_NormalFuncs.find(pFunc)) != m_NormalFuncs.end()) { m_NormalFuncs.erase(iter); _DecRefCounter(NORMAL_SOUND_HOOK); return true; } else { return false; } } else if (type == AMBIENT_SOUND_HOOK) { if ((iter=m_AmbientFuncs.find(pFunc)) != m_AmbientFuncs.end()) { m_AmbientFuncs.erase(iter); _DecRefCounter(AMBIENT_SOUND_HOOK); return true; } else { return false; } } return false; }
void UserMessages::OnMessageEnd_Post() { if (!m_InHook || m_BlockEndPost) { RETURN_META(MRES_IGNORED); } MsgList *pList; MsgIter iter; ListenerInfo *pInfo; pList = &m_msgIntercepts[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessageSent(m_CurId); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } m_InHook = false; pList = &m_msgHooks[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessageSent(m_CurId); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } }
bool TempEntHooks::RemoveHook(const char *name, IPluginFunction *pFunc) { TEHookInfo *pInfo; if (m_TEHooks->Retrieve(name, reinterpret_cast<void **>(&pInfo))) { SourceHook::List<IPluginFunction *>::iterator iter; if ((iter=pInfo->lst.find(pFunc)) != pInfo->lst.end()) { pInfo->lst.erase(iter); if (pInfo->lst.empty()) { m_HookInfo.remove(pInfo); m_TEHooks->Delete(name); delete pInfo; } _DecRefCounter(); } else { return false; } } else { return false; } return true; }
void SoundHooks::OnPluginUnloaded(IPlugin *plugin) { SoundHookIter iter; IPluginContext *pContext = plugin->GetBaseContext(); if (m_AmbientCount) { for (iter=m_AmbientFuncs.begin(); iter!=m_AmbientFuncs.end(); ) { if ((*iter)->GetParentContext() == pContext) { iter = m_AmbientFuncs.erase(iter); _DecRefCounter(AMBIENT_SOUND_HOOK); } else { iter++; } } } if (m_NormalCount) { for (iter=m_NormalFuncs.begin(); iter!=m_NormalFuncs.end(); ) { if ((*iter)->GetParentContext() == pContext) { iter = m_NormalFuncs.erase(iter); _DecRefCounter(NORMAL_SOUND_HOOK); } else { iter++; } } } }
void TempEntHooks::Shutdown() { if (!tenatives_initialized) { return; } plsys->RemovePluginsListener(this); SourceHook::List<TEHookInfo *>::iterator iter; for (iter=m_HookInfo.begin(); iter!=m_HookInfo.end(); iter++) { delete (*iter); } if (m_HookCount) { m_HookCount = 1; _DecRefCounter(); } m_TEHooks->Destroy(); tenatives_initialized = false; }
void TempEntHooks::OnPluginUnloaded(IPlugin *plugin) { SourceHook::List<TEHookInfo *>::iterator iter = m_HookInfo.begin(); IPluginContext *pContext = plugin->GetBaseContext(); /* For each hook list... */ while (iter != m_HookInfo.end()) { SourceHook::List<IPluginFunction *>::iterator f_iter = (*iter)->lst.begin(); /* Find the hooks on the given temp entity */ while (f_iter != (*iter)->lst.end()) { /* If it matches, remove it and dec the ref count */ if ((*f_iter)->GetParentContext() == pContext) { f_iter = (*iter)->lst.erase(f_iter); _DecRefCounter(); } else { f_iter++; } } /* If there are no more hooks left, we can safely * remove it from the cache and remove its list. */ if ((*iter)->lst.size() == 0) { m_TEHooks->Delete((*iter)->te->GetName()); delete (*iter); iter = m_HookInfo.erase(iter); } else { iter++; } } }
bool UserMessages::InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew) #endif { MsgList *pList; MsgIter iter; ListenerInfo *pInfo; bool deleted = false; if (msg_id < 0 || msg_id >= 255) { return false; } pList = (intercept) ? &m_msgIntercepts[msg_id] : &m_msgHooks[msg_id]; for (iter=pList->begin(); iter!=pList->end(); iter++) { pInfo = (*iter); if (pInfo->Callback == pListener && pInfo->IsNew == isNew) { if (pInfo->IsHooked) { pInfo->KillMe = true; return true; } pList->erase(iter); deleted = true; break; } } if (deleted) { _DecRefCounter(); } return deleted; }
void UserMessages::OnMessageEnd_Pre() { if (!m_InHook) { RETURN_META(MRES_IGNORED); } MsgList *pList; MsgIter iter; ListenerInfo *pInfo; ResultType res; bool intercepted = false; bool handled = false; pList = &m_msgIntercepts[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter); intercepted = true; switch (res) { case Pl_Stop: { if (pInfo->KillMe) { pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); goto supercede; } pInfo->IsHooked = false; goto supercede; } case Pl_Handled: { handled = true; if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } default: { if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } } pInfo->IsHooked = false; iter++; } if (handled) { goto supercede; } if (intercepted) { bf_write *engine_bfw; engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId); m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten()); engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten()); ENGINE_CALL(MessageEnd)(); } pList = &m_msgHooks[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessage(m_CurId, m_OrigBuffer, m_CurRecFilter); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED); supercede: m_InHook = false; m_BlockEndPost = true; RETURN_META(MRES_SUPERCEDE); }
void UserMessages::OnMessageEnd_Pre() { if (!m_InHook) { UM_RETURN_META(MRES_IGNORED); } MsgList *pList; MsgIter iter; ListenerInfo *pInfo; ResultType res; bool intercepted = false; bool handled = false; pList = &m_msgIntercepts[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; #ifdef USE_PROTOBUF_USERMESSAGES res = pInfo->Callback->InterceptUserMessage(m_CurId, m_InterceptBuffer, m_CurRecFilter); #else res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter); #endif intercepted = true; switch (res) { case Pl_Stop: { if (pInfo->KillMe) { pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); goto supercede; } pInfo->IsHooked = false; goto supercede; } case Pl_Handled: { handled = true; if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } default: { if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } break; } } pInfo->IsHooked = false; iter++; } if (!handled && intercepted) { #if SOURCE_ENGINE == SE_CSGO ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(*m_CurRecFilter), m_CurId, *m_InterceptBuffer); #else bf_write *engine_bfw; #if SOURCE_ENGINE >= SE_LEFT4DEAD engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId)); #else engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId); #endif m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten()); engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten()); ENGINE_CALL(MessageEnd)(); #endif // SE_CSGO } { #if SOURCE_ENGINE == SE_CSGO int size = m_OrigBuffer->ByteSize(); uint8 *data = (uint8 *)stackalloc(size); m_OrigBuffer->SerializePartialToArray(data, size); protobuf::Message *pTempMsg = GetMessagePrototype(m_CurId)->New(); pTempMsg->ParsePartialFromArray(data, size); #else bf_write *pTempMsg = m_OrigBuffer; #endif pList = &m_msgHooks[m_CurId]; for (iter=pList->begin(); iter!=pList->end(); ) { pInfo = (*iter); pInfo->IsHooked = true; pInfo->Callback->OnUserMessage(m_CurId, pTempMsg, m_CurRecFilter); if (pInfo->KillMe) { iter = pList->erase(iter); m_FreeListeners.push(pInfo); _DecRefCounter(); continue; } pInfo->IsHooked = false; iter++; } #if SOURCE_ENGINE == SE_CSGO delete pTempMsg; #endif } UM_RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED); supercede: m_BlockEndPost = true; UM_RETURN_META(MRES_SUPERCEDE); }