reworked antiflood. it now has some logic in core to take care of loading order nastiness, and to fully prevent trigger spamming
3 * =============================================================================
5 * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
32 #include "sm_globals.h"
35 #include "concmd_cleaner.h"
36 #include "sm_stringutil.h"
37 #include "sourcemm_api.h"
39 #if defined ORANGEBOX_BUILD
40 SH_DECL_HOOK1_void(ICvar, UnregisterConCommand, SH_NOATTRIB, 0, ConCommandBase *);
43 using namespace SourceHook;
47 ConCommandBase *pBase;
48 IConCommandTracker *cls;
52 List<ConCommandInfo *> tracked_bases;
54 ConCommandBase *FindConCommandBase(const char *name);
56 class ConCommandCleaner : public SMGlobalClass
59 #if defined ORANGEBOX_BUILD
60 void OnSourceModAllInitialized()
62 SH_ADD_HOOK_MEMFUNC(ICvar, UnregisterConCommand, icvar, this, &ConCommandCleaner::UnlinkConCommandBase, false);
65 void OnSourceModShutdown()
67 SH_REMOVE_HOOK_MEMFUNC(ICvar, UnregisterConCommand, icvar, this, &ConCommandCleaner::UnlinkConCommandBase, false);
71 void UnlinkConCommandBase(ConCommandBase *pBase)
73 ConCommandInfo *pInfo;
74 List<ConCommandInfo *>::iterator iter = tracked_bases.begin();
78 while (iter != tracked_bases.end())
80 if ((*iter)->pBase == pBase)
83 iter = tracked_bases.erase(iter);
84 pInfo->cls->OnUnlinkConCommandBase(pBase, pBase->GetName(), true);
95 while (iter != tracked_bases.end())
97 /* This is just god-awful! */
98 if (FindConCommandBase((*iter)->name) != (*iter)->pBase)
101 iter = tracked_bases.erase(iter);
102 pInfo->cls->OnUnlinkConCommandBase(pBase, pInfo->name, false);
113 void AddTarget(ConCommandBase *pBase, IConCommandTracker *cls)
115 ConCommandInfo *info = new ConCommandInfo;
119 strncopy(info->name, pBase->GetName(), sizeof(info->name));
121 tracked_bases.push_back(info);
124 void RemoveTarget(ConCommandBase *pBase, IConCommandTracker *cls)
126 List<ConCommandInfo *>::iterator iter;
127 ConCommandInfo *pInfo;
129 iter = tracked_bases.begin();
130 while (iter != tracked_bases.end())
133 if (pInfo->pBase == pBase && pInfo->cls == cls)
136 iter = tracked_bases.erase(iter);
146 ConCommandBase *FindConCommandBase(const char *name)
148 const ConCommandBase *pBase = icvar->GetCommands();
150 while (pBase != NULL)
152 if (strcmp(pBase->GetName(), name) == 0)
154 return const_cast<ConCommandBase *>(pBase);
156 pBase = pBase->GetNext();
162 void TrackConCommandBase(ConCommandBase *pBase, IConCommandTracker *me)
164 s_ConCmdTracker.AddTarget(pBase, me);
167 void UntrackConCommandBase(ConCommandBase *pBase, IConCommandTracker *me)
169 s_ConCmdTracker.RemoveTarget(pBase, me);
172 void Global_OnUnlinkConCommandBase(ConCommandBase *pBase)
174 s_ConCmdTracker.UnlinkConCommandBase(pBase);