core/ConCmdManager.cpp
changeset 4113 12e7f3b54c35
parent 4112 31f38e6aae4e
child 4217 4c87212c5817
     1.1 --- a/core/ConCmdManager.cpp	Sat Aug 31 11:51:23 2013 -0700
     1.2 +++ b/core/ConCmdManager.cpp	Sat Aug 31 19:50:15 2013 -0700
     1.3 @@ -38,6 +38,8 @@
     1.4  #include "ChatTriggers.h"
     1.5  #include "logic_bridge.h"
     1.6  
     1.7 +using namespace ke;
     1.8 +
     1.9  ConCmdManager g_ConCmds;
    1.10  
    1.11  #if SOURCE_ENGINE == SE_DOTA
    1.12 @@ -53,7 +55,7 @@
    1.13  typedef ke::LinkedList<CmdHook *> PluginHookList;
    1.14  void RegisterInPlugin(CmdHook *hook);
    1.15  
    1.16 -ConCmdManager::ConCmdManager() : m_Strings(1024)
    1.17 +ConCmdManager::ConCmdManager()
    1.18  {
    1.19  	m_CmdClient = 0;
    1.20  }
    1.21 @@ -105,6 +107,9 @@
    1.22  			}
    1.23  		}
    1.24  
    1.25 +		if (hook->admin)
    1.26 +			hook->admin->group->hooks.remove(hook);
    1.27 +
    1.28  		iter = pInfo->hooks.erase(iter);
    1.29  		delete hook;
    1.30  	}
    1.31 @@ -124,6 +129,8 @@
    1.32  		CmdHook *hook = *iter;
    1.33  
    1.34  		hook->info->hooks.remove(hook);
    1.35 +		if (hook->admin)
    1.36 +			hook->admin->group->hooks.remove(hook);
    1.37  
    1.38  		if (hook->info->hooks.empty())
    1.39  			RemoveConCmd(hook->info, hook->info->pCmd->GetName(), true, true);
    1.40 @@ -450,19 +457,17 @@
    1.41  	if (!pInfo)
    1.42  		return false;
    1.43  
    1.44 -	CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
    1.45 -
    1.46 -	pHook->admin = new AdminCmdInfo();
    1.47 -
    1.48 -	int grpid;
    1.49 -	if (!m_CmdGrps.retrieve(group, &grpid))
    1.50 +	GroupMap::Insert i = m_CmdGrps.findForAdd(group);
    1.51 +	if (!i.found())
    1.52  	{
    1.53 -		grpid = m_Strings.AddString(group);
    1.54 -		m_CmdGrps.insert(group, grpid);
    1.55 +		if (!m_CmdGrps.add(i, group))
    1.56 +			return false;
    1.57 +		i->value = NoAddRef(new CommandGroup());
    1.58  	}
    1.59 +	Ref<CommandGroup> cmdgroup = i->value;
    1.60  
    1.61 -	pHook->admin->cmdGrpId = grpid;
    1.62 -	pHook->admin->flags = adminflags;
    1.63 +	CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
    1.64 +	pHook->admin = new AdminCmdInfo(cmdgroup, adminflags);
    1.65  
    1.66  	/* First get the command group override, if any */
    1.67  	bool override = g_Admins.GetCommandOverride(group, 
    1.68 @@ -482,6 +487,7 @@
    1.69  		pHook->admin->eflags = pHook->admin->flags;
    1.70  	pInfo->eflags = pHook->admin->eflags;
    1.71  
    1.72 +	cmdgroup->hooks.append(pHook);
    1.73  	pInfo->hooks.append(pHook);
    1.74  	RegisterInPlugin(pHook);
    1.75  	return true;
    1.76 @@ -586,27 +592,20 @@
    1.77  	}
    1.78  	else if (type == Override_CommandGroup)
    1.79  	{
    1.80 -		int grpid;
    1.81 -		if (!m_CmdGrps.retrieve(cmd, &grpid))
    1.82 +		GroupMap::Result r = m_CmdGrps.find(cmd);
    1.83 +		if (!r.found())
    1.84  			return;
    1.85  
    1.86 -		/* This is bad :( loop through all commands */
    1.87 -		List<ConCmdInfo *>::iterator iter;
    1.88 -		for (iter=m_CmdList.begin(); iter!=m_CmdList.end(); iter++)
    1.89 +		Ref<CommandGroup> group(r->value);
    1.90 +
    1.91 +		for (PluginHookList::iterator iter = group->hooks.begin(); iter != group->hooks.end(); iter++)
    1.92  		{
    1.93 -			ConCmdInfo *pInfo = *iter;
    1.94 -			for (CmdHookList::iterator citer = pInfo->hooks.begin(); citer != pInfo->hooks.end(); citer++)
    1.95 -			{
    1.96 -				CmdHook *hook = (*citer);
    1.97 -				if (!hook->admin || hook->admin->cmdGrpId != grpid)
    1.98 -					continue;
    1.99 -
   1.100 -				if (remove)
   1.101 -					hook->admin->eflags = bits;
   1.102 -				else
   1.103 -					hook->admin->eflags = hook->admin->flags;
   1.104 -				pInfo->eflags = hook->admin->eflags;
   1.105 -			}
   1.106 +			CmdHook *hook = *iter;
   1.107 +			if (remove)
   1.108 +				hook->admin->eflags = bits;
   1.109 +			else
   1.110 +				hook->admin->eflags = hook->admin->flags;
   1.111 +			hook->info->eflags = hook->admin->eflags;
   1.112  		}
   1.113  	}
   1.114  }