1.1 --- a/core/ConCmdManager.cpp Sat Aug 31 11:50:28 2013 -0700
1.2 +++ b/core/ConCmdManager.cpp Sat Aug 31 11:51:23 2013 -0700
1.3 @@ -50,15 +50,8 @@
1.4
1.5 SH_DECL_HOOK1_void(IServerGameClients, SetCommandClient, SH_NOATTRIB, false, int);
1.6
1.7 -struct PlCmdInfo
1.8 -{
1.9 - ConCmdInfo *pInfo;
1.10 - CmdHook *pHook;
1.11 - CmdType type;
1.12 -};
1.13 -typedef List<PlCmdInfo> CmdList;
1.14 -
1.15 -void AddToPlCmdList(CmdList *pList, const PlCmdInfo &info);
1.16 +typedef ke::LinkedList<CmdHook *> PluginHookList;
1.17 +void RegisterInPlugin(CmdHook *hook);
1.18
1.19 ConCmdManager::ConCmdManager() : m_Strings(1024)
1.20 {
1.21 @@ -92,116 +85,56 @@
1.22 if (!m_Cmds.retrieve(name, &pInfo))
1.23 return;
1.24
1.25 - RemoveConCmds(pInfo->srvhooks);
1.26 - RemoveConCmds(pInfo->conhooks);
1.27 + CmdHookList::iterator iter = pInfo->hooks.begin();
1.28 + while (iter != pInfo->hooks.end())
1.29 + {
1.30 + CmdHook *hook = *iter;
1.31 +
1.32 + IPluginContext *pContext = hook->pf->GetParentContext();
1.33 + IPlugin *pPlugin = scripts->FindPluginByContext(pContext->GetContext());
1.34 +
1.35 + // The list is guaranteed to exist.
1.36 + PluginHookList *list;
1.37 + pPlugin->GetProperty("CommandList", (void **)&list, false);
1.38 + for (PluginHookList::iterator hiter = list->begin(); hiter != list->end(); hiter++)
1.39 + {
1.40 + if (*hiter == hook)
1.41 + {
1.42 + list->erase(hiter);
1.43 + break;
1.44 + }
1.45 + }
1.46 +
1.47 + iter = pInfo->hooks.erase(iter);
1.48 + delete hook;
1.49 + }
1.50
1.51 RemoveConCmd(pInfo, name, is_read_safe, false);
1.52 }
1.53
1.54 -void ConCmdManager::RemoveConCmds(List<CmdHook *> &cmdlist)
1.55 +void ConCmdManager::OnPluginDestroyed(IPlugin *plugin)
1.56 {
1.57 - List<CmdHook *>::iterator iter = cmdlist.begin();
1.58 + PluginHookList *pList;
1.59 + if (!plugin->GetProperty("CommandList", (void **)&pList, true))
1.60 + return;
1.61
1.62 - while (iter != cmdlist.end())
1.63 + PluginHookList::iterator iter = pList->begin();
1.64 + while (iter != pList->end())
1.65 {
1.66 - CmdHook *pHook = (*iter);
1.67 - IPluginContext *pContext = pHook->pf->GetParentContext();
1.68 - IPlugin *pPlugin = scripts->FindPluginByContext(pContext->GetContext());
1.69 - CmdList *pList = NULL;
1.70 -
1.71 - //gaben
1.72 - if (!pPlugin->GetProperty("CommandList", (void **)&pList, false) || !pList)
1.73 - {
1.74 - continue;
1.75 - }
1.76 + CmdHook *hook = *iter;
1.77
1.78 - CmdList::iterator p_iter = pList->begin();
1.79 - while (p_iter != pList->end())
1.80 - {
1.81 - PlCmdInfo &cmd = (*p_iter);
1.82 - if (cmd.pHook == pHook)
1.83 - {
1.84 - p_iter = pList->erase(p_iter);
1.85 - }
1.86 - else
1.87 - {
1.88 - p_iter++;
1.89 - }
1.90 - }
1.91 + hook->info->hooks.remove(hook);
1.92 +
1.93 + if (hook->info->hooks.empty())
1.94 + RemoveConCmd(hook->info, hook->info->pCmd->GetName(), true, true);
1.95
1.96 - delete pHook->pAdmin;
1.97 - delete pHook;
1.98 -
1.99 - iter = cmdlist.erase(iter);
1.100 + iter = pList->erase(iter);
1.101 + delete hook;
1.102 }
1.103 +
1.104 + delete pList;
1.105 }
1.106
1.107 -void ConCmdManager::RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext)
1.108 -{
1.109 - List<CmdHook *>::iterator iter = cmdlist.begin();
1.110 - CmdHook *pHook;
1.111 -
1.112 - while (iter != cmdlist.end())
1.113 - {
1.114 - pHook = (*iter);
1.115 - if (pHook->pf->GetParentContext() == pContext)
1.116 - {
1.117 - delete pHook->pAdmin;
1.118 - delete pHook;
1.119 - iter = cmdlist.erase(iter);
1.120 - }
1.121 - else
1.122 - {
1.123 - iter++;
1.124 - }
1.125 - }
1.126 -}
1.127 -
1.128 -void ConCmdManager::OnPluginDestroyed(IPlugin *plugin)
1.129 -{
1.130 - CmdList *pList;
1.131 - List<ConCmdInfo *> removed;
1.132 - if (plugin->GetProperty("CommandList", (void **)&pList, true))
1.133 - {
1.134 - IPluginContext *pContext = plugin->GetBaseContext();
1.135 - CmdList::iterator iter;
1.136 - /* First pass!
1.137 - * Only bother if there's an actual command list on this plugin...
1.138 - */
1.139 - for (iter=pList->begin();
1.140 - iter!=pList->end();
1.141 - iter++)
1.142 - {
1.143 - PlCmdInfo &cmd = (*iter);
1.144 - ConCmdInfo *pInfo = cmd.pInfo;
1.145 -
1.146 - /* Has this chain already been fully cleaned/removed? */
1.147 - if (removed.find(pInfo) != removed.end())
1.148 - {
1.149 - continue;
1.150 - }
1.151 -
1.152 - /* Remove any hooks from us on this command */
1.153 - RemoveConCmds(pInfo->conhooks, pContext);
1.154 - RemoveConCmds(pInfo->srvhooks, pContext);
1.155 -
1.156 - /* See if there are still hooks */
1.157 - if (pInfo->srvhooks.size())
1.158 - {
1.159 - continue;
1.160 - }
1.161 - if (pInfo->conhooks.size())
1.162 - {
1.163 - continue;
1.164 - }
1.165 -
1.166 - /* Remove the command, it should be safe now */
1.167 - RemoveConCmd(pInfo, pInfo->pCmd->GetName(), true, true);
1.168 - removed.push_back(pInfo);
1.169 - }
1.170 - delete pList;
1.171 - }
1.172 -}
1.173 #if SOURCE_ENGINE == SE_DOTA
1.174 void CommandCallback(const CCommandContext &context, const CCommand &command)
1.175 {
1.176 @@ -261,44 +194,34 @@
1.177 }
1.178
1.179 cell_t result = type;
1.180 - cell_t tempres = result;
1.181 - List<CmdHook *>::iterator iter;
1.182 - CmdHook *pHook;
1.183 - for (iter=pInfo->conhooks.begin();
1.184 - iter!=pInfo->conhooks.end();
1.185 - iter++)
1.186 + for (CmdHookList::iterator iter = pInfo->hooks.begin(); iter != pInfo->hooks.end(); iter++)
1.187 {
1.188 - pHook = (*iter);
1.189 - if (!pHook->pf->IsRunnable())
1.190 - {
1.191 + CmdHook *hook = *iter;
1.192 +
1.193 + if (hook->type == CmdHook::Server || !hook->pf->IsRunnable())
1.194 continue;
1.195 - }
1.196 - if (pHook->pAdmin && !CheckAccess(client, cmd, pHook->pAdmin))
1.197 +
1.198 + if (hook->admin && !CheckAccess(client, cmd, hook->admin))
1.199 {
1.200 if (result < Pl_Handled)
1.201 - {
1.202 result = Pl_Handled;
1.203 - }
1.204 continue;
1.205 }
1.206 - pHook->pf->PushCell(client);
1.207 - pHook->pf->PushCell(args);
1.208 - if (pHook->pf->Execute(&tempres) == SP_ERROR_NONE)
1.209 +
1.210 + hook->pf->PushCell(client);
1.211 + hook->pf->PushCell(args);
1.212 +
1.213 + cell_t tempres = result;
1.214 + if (hook->pf->Execute(&tempres) == SP_ERROR_NONE)
1.215 {
1.216 if (tempres > result)
1.217 - {
1.218 result = tempres;
1.219 - }
1.220 if (result == Pl_Stop)
1.221 - {
1.222 break;
1.223 - }
1.224 }
1.225 }
1.226
1.227 - type = (ResultType)result;
1.228 -
1.229 - return type;
1.230 + return (ResultType)result;
1.231 }
1.232
1.233 void ConCmdManager::InternalDispatch(const CCommand &command)
1.234 @@ -309,9 +232,7 @@
1.235 {
1.236 CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
1.237 if (!pPlayer || !pPlayer->IsConnected())
1.238 - {
1.239 return;
1.240 - }
1.241 }
1.242
1.243 /**
1.244 @@ -343,109 +264,61 @@
1.245 * "nicer" when we expose explicit say hooks.
1.246 */
1.247 if (g_ChatTriggers.WasFloodedMessage())
1.248 - {
1.249 return;
1.250 - }
1.251
1.252 cell_t result = Pl_Continue;
1.253 int args = command.ArgC() - 1;
1.254
1.255 - List<CmdHook *>::iterator iter;
1.256 - CmdHook *pHook;
1.257 + // On a listen server, sometimes the server host's client index can be set
1.258 + // as 0. So index 1 is passed to the command callback to correct this
1.259 + // potential problem.
1.260 + int realClient = (!engine->IsDedicatedServer() && client == 0)
1.261 + ? g_Players.ListenClient()
1.262 + : client;
1.263 + int dedicatedClient = engine->IsDedicatedServer() ? 0 : g_Players.ListenClient();
1.264
1.265 - /* Execute server-only commands if viable */
1.266 - if (client == 0 && pInfo->srvhooks.size())
1.267 + for (CmdHookList::iterator iter = pInfo->hooks.begin(); iter != pInfo->hooks.end(); iter++)
1.268 {
1.269 - cell_t tempres = result;
1.270 - for (iter=pInfo->srvhooks.begin();
1.271 - iter!=pInfo->srvhooks.end();
1.272 - iter++)
1.273 + CmdHook *hook = *iter;
1.274 +
1.275 + if (!hook->pf->IsRunnable())
1.276 + continue;
1.277 +
1.278 + if (hook->type == CmdHook::Server)
1.279 {
1.280 - pHook = (*iter);
1.281 - if (!pHook->pf->IsRunnable())
1.282 - {
1.283 + // Don't execute unless we're in the server console.
1.284 + if (realClient != dedicatedClient)
1.285 continue;
1.286 - }
1.287 - pHook->pf->PushCell(args);
1.288 - if (pHook->pf->Execute(&tempres) == SP_ERROR_NONE)
1.289 - {
1.290 - if (tempres > result)
1.291 - {
1.292 - result = tempres;
1.293 - }
1.294 - if (result == Pl_Stop)
1.295 - {
1.296 - break;
1.297 - }
1.298 - }
1.299 - }
1.300 -
1.301 - /* Check if there's an early stop */
1.302 - if (result >= Pl_Stop)
1.303 - {
1.304 - if (!pInfo->sourceMod)
1.305 - {
1.306 - RETURN_META(MRES_SUPERCEDE);
1.307 - }
1.308 - return;
1.309 - }
1.310 - }
1.311 -
1.312 - /* Execute console commands */
1.313 - if (pInfo->conhooks.size())
1.314 - {
1.315 - cell_t tempres = result;
1.316 - for (iter=pInfo->conhooks.begin();
1.317 - iter!=pInfo->conhooks.end();
1.318 - iter++)
1.319 - {
1.320 - pHook = (*iter);
1.321 - if (!pHook->pf->IsRunnable())
1.322 - {
1.323 - continue;
1.324 - }
1.325 - if (client
1.326 - && pHook->pAdmin
1.327 - && !CheckAccess(client, cmd, pHook->pAdmin))
1.328 + } else {
1.329 + // Check admin rights if needed. realClient isn't needed since we
1.330 + // should bypass admin checks if client == 0 anyway.
1.331 + if (client && hook->admin && !CheckAccess(client, cmd, hook->admin))
1.332 {
1.333 if (result < Pl_Handled)
1.334 - {
1.335 result = Pl_Handled;
1.336 - }
1.337 continue;
1.338 }
1.339
1.340 - /* On a listen server, sometimes the server host's client index can be set as 0.
1.341 - * So index 1 is passed to the command callback to correct this potential problem.
1.342 - */
1.343 - if (!engine->IsDedicatedServer())
1.344 - {
1.345 - client = g_Players.ListenClient();
1.346 - }
1.347 + // Client hooks get a client argument.
1.348 + hook->pf->PushCell(realClient);
1.349 + }
1.350
1.351 - pHook->pf->PushCell(client);
1.352 - pHook->pf->PushCell(args);
1.353 + hook->pf->PushCell(args);
1.354
1.355 - if (pHook->pf->Execute(&tempres) == SP_ERROR_NONE)
1.356 - {
1.357 - if (tempres > result)
1.358 - {
1.359 - result = tempres;
1.360 - }
1.361 - if (result == Pl_Stop)
1.362 - {
1.363 - break;
1.364 - }
1.365 - }
1.366 + cell_t tempres = result;
1.367 + if (hook->pf->Execute(&tempres) == SP_ERROR_NONE)
1.368 + {
1.369 + if (tempres > result)
1.370 + result = tempres;
1.371 + if (result == Pl_Stop)
1.372 + break;
1.373 }
1.374 }
1.375
1.376 if (result >= Pl_Handled)
1.377 {
1.378 if (!pInfo->sourceMod)
1.379 - {
1.380 RETURN_META(MRES_SUPERCEDE);
1.381 - }
1.382 return;
1.383 }
1.384 }
1.385 @@ -575,19 +448,11 @@
1.386 ConCmdInfo *pInfo = AddOrFindCommand(name, description, flags);
1.387
1.388 if (!pInfo)
1.389 - {
1.390 return false;
1.391 - }
1.392 -
1.393 - CmdHook *pHook = new CmdHook();
1.394 - AdminCmdInfo *pAdmin = new AdminCmdInfo();
1.395
1.396 - pHook->pf = pFunction;
1.397 - if (description && description[0])
1.398 - {
1.399 - pHook->helptext.assign(description);
1.400 - }
1.401 - pHook->pAdmin = pAdmin;
1.402 + CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description);
1.403 +
1.404 + pHook->admin = new AdminCmdInfo();
1.405
1.406 int grpid;
1.407 if (!m_CmdGrps.retrieve(group, &grpid))
1.408 @@ -596,46 +461,29 @@
1.409 m_CmdGrps.insert(group, grpid);
1.410 }
1.411
1.412 - pAdmin->cmdGrpId = grpid;
1.413 - pAdmin->flags = adminflags;
1.414 + pHook->admin->cmdGrpId = grpid;
1.415 + pHook->admin->flags = adminflags;
1.416
1.417 /* First get the command group override, if any */
1.418 bool override = g_Admins.GetCommandOverride(group,
1.419 Override_CommandGroup,
1.420 - &(pAdmin->eflags));
1.421 + &(pHook->admin->eflags));
1.422
1.423 /* Next get the command override, if any */
1.424 if (g_Admins.GetCommandOverride(name,
1.425 Override_Command,
1.426 - &(pAdmin->eflags)))
1.427 + &(pHook->admin->eflags)))
1.428 {
1.429 override = true;
1.430 }
1.431
1.432 /* Assign normal flags if there were no overrides */
1.433 if (!override)
1.434 - {
1.435 - pAdmin->eflags = pAdmin->flags;
1.436 - }
1.437 -
1.438 - /* Finally, add the hook */
1.439 - pInfo->conhooks.push_back(pHook);
1.440 - pInfo->admin = *(pHook->pAdmin);
1.441 + pHook->admin->eflags = pHook->admin->flags;
1.442 + pInfo->eflags = pHook->admin->eflags;
1.443
1.444 - /* Now add to the plugin */
1.445 - CmdList *pList;
1.446 - IPlugin *pPlugin = scripts->FindPluginByContext(pFunction->GetParentContext()->GetContext());
1.447 - if (!pPlugin->GetProperty("CommandList", (void **)&pList))
1.448 - {
1.449 - pList = new CmdList();
1.450 - pPlugin->SetProperty("CommandList", pList);
1.451 - }
1.452 - PlCmdInfo info;
1.453 - info.pInfo = pInfo;
1.454 - info.type = Cmd_Admin;
1.455 - info.pHook = pHook;
1.456 - AddToPlCmdList(pList, info);
1.457 -
1.458 + pInfo->hooks.append(pHook);
1.459 + RegisterInPlugin(pHook);
1.460 return true;
1.461 }
1.462
1.463 @@ -648,63 +496,42 @@
1.464 ConCmdInfo *pInfo = AddOrFindCommand(name, description, flags);
1.465
1.466 if (!pInfo)
1.467 - {
1.468 return false;
1.469 - }
1.470 -
1.471 - CmdHook *pHook = new CmdHook();
1.472 -
1.473 - pHook->pf = pFunction;
1.474 - if (description && description[0])
1.475 - {
1.476 - pHook->helptext.assign(description);
1.477 - }
1.478 -
1.479 - pInfo->srvhooks.push_back(pHook);
1.480
1.481 - /* Add to the plugin */
1.482 - CmdList *pList;
1.483 - IPlugin *pPlugin = scripts->FindPluginByContext(pFunction->GetParentContext()->GetContext());
1.484 - if (!pPlugin->GetProperty("CommandList", (void **)&pList))
1.485 - {
1.486 - pList = new CmdList();
1.487 - pPlugin->SetProperty("CommandList", pList);
1.488 - }
1.489 - PlCmdInfo info;
1.490 - info.pInfo = pInfo;
1.491 - info.type = Cmd_Server;
1.492 - info.pHook = pHook;
1.493 - AddToPlCmdList(pList, info);
1.494 + CmdHook *pHook = new CmdHook(CmdHook::Server, pInfo, pFunction, description);
1.495
1.496 + pInfo->hooks.append(pHook);
1.497 + RegisterInPlugin(pHook);
1.498 return true;
1.499 }
1.500
1.501 -void AddToPlCmdList(CmdList *pList, const PlCmdInfo &info)
1.502 +void RegisterInPlugin(CmdHook *hook)
1.503 {
1.504 - CmdList::iterator iter = pList->begin();
1.505 - bool inserted = false;
1.506 - const char *orig = NULL;
1.507 + PluginHookList *pList;
1.508
1.509 - orig = info.pInfo->pCmd->GetName();
1.510 + IPlugin *pPlugin = scripts->FindPluginByContext(hook->pf->GetParentContext());
1.511 + if (!pPlugin->GetProperty("CommandList", (void **)&pList))
1.512 + {
1.513 + pList = new PluginHookList();
1.514 + pPlugin->SetProperty("CommandList", pList);
1.515 + }
1.516 +
1.517 + const char *orig = hook->info->pCmd->GetName();
1.518
1.519 /* Insert this into the help list, SORTED alphabetically. */
1.520 + PluginHookList::iterator iter = pList->begin();
1.521 while (iter != pList->end())
1.522 {
1.523 - PlCmdInfo &obj = (*iter);
1.524 - const char *cmd = obj.pInfo->pCmd->GetName();
1.525 + const char *cmd = (*iter)->info->pCmd->GetName();
1.526 if (strcmp(orig, cmd) < 0)
1.527 {
1.528 - pList->insert(iter, info);
1.529 - inserted = true;
1.530 - break;
1.531 + pList->insertBefore(iter, hook);
1.532 + return;
1.533 }
1.534 iter++;
1.535 }
1.536
1.537 - if (!inserted)
1.538 - {
1.539 - pList->push_back(info);
1.540 - }
1.541 + pList->append(hook);
1.542 }
1.543
1.544 void ConCmdManager::AddToCmdList(ConCmdInfo *info)
1.545 @@ -739,29 +566,22 @@
1.546
1.547 void ConCmdManager::UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits, bool remove)
1.548 {
1.549 - ConCmdInfo *pInfo;
1.550 -
1.551 if (type == Override_Command)
1.552 {
1.553 + ConCmdInfo *pInfo;
1.554 if (!m_Cmds.retrieve(cmd, &pInfo))
1.555 return;
1.556
1.557 - List<CmdHook *>::iterator iter;
1.558 - CmdHook *pHook;
1.559 -
1.560 - for (iter=pInfo->conhooks.begin(); iter!=pInfo->conhooks.end(); iter++)
1.561 + for (CmdHookList::iterator iter = pInfo->hooks.begin(); iter != pInfo->hooks.end(); iter++)
1.562 {
1.563 - pHook = (*iter);
1.564 - if (pHook->pAdmin)
1.565 - {
1.566 - if (!remove)
1.567 - {
1.568 - pHook->pAdmin->eflags = bits;
1.569 - } else {
1.570 - pHook->pAdmin->eflags = pHook->pAdmin->flags;
1.571 - }
1.572 - pInfo->admin = *(pHook->pAdmin);
1.573 - }
1.574 + if (!iter->admin)
1.575 + continue;
1.576 +
1.577 + if (!remove)
1.578 + iter->admin->eflags = bits;
1.579 + else
1.580 + iter->admin->eflags = iter->admin->flags;
1.581 + pInfo->eflags = iter->admin->eflags;
1.582 }
1.583 }
1.584 else if (type == Override_CommandGroup)
1.585 @@ -772,25 +592,20 @@
1.586
1.587 /* This is bad :( loop through all commands */
1.588 List<ConCmdInfo *>::iterator iter;
1.589 - CmdHook *pHook;
1.590 for (iter=m_CmdList.begin(); iter!=m_CmdList.end(); iter++)
1.591 {
1.592 - pInfo = (*iter);
1.593 - for (List<CmdHook *>::iterator citer=pInfo->conhooks.begin();
1.594 - citer!=pInfo->conhooks.end();
1.595 - citer++)
1.596 + ConCmdInfo *pInfo = *iter;
1.597 + for (CmdHookList::iterator citer = pInfo->hooks.begin(); citer != pInfo->hooks.end(); citer++)
1.598 {
1.599 - pHook = (*citer);
1.600 - if (pHook->pAdmin && pHook->pAdmin->cmdGrpId == grpid)
1.601 - {
1.602 - if (remove)
1.603 - {
1.604 - pHook->pAdmin->eflags = bits;
1.605 - } else {
1.606 - pHook->pAdmin->eflags = pHook->pAdmin->flags;
1.607 - }
1.608 - pInfo->admin = *(pHook->pAdmin);
1.609 - }
1.610 + CmdHook *hook = (*citer);
1.611 + if (!hook->admin || hook->admin->cmdGrpId != grpid)
1.612 + continue;
1.613 +
1.614 + if (remove)
1.615 + hook->admin->eflags = bits;
1.616 + else
1.617 + hook->admin->eflags = hook->admin->flags;
1.618 + pInfo->eflags = hook->admin->eflags;
1.619 }
1.620 }
1.621 }
1.622 @@ -843,7 +658,7 @@
1.623 if (!m_Cmds.retrieve(cmd, &pInfo))
1.624 return false;
1.625
1.626 - return pInfo->sourceMod && (pInfo->conhooks.size() > 0);
1.627 + return pInfo->sourceMod && !pInfo->hooks.empty();
1.628 }
1.629
1.630 bool ConCmdManager::LookForCommandAdminFlags(const char *cmd, FlagBits *pFlags)
1.631 @@ -852,7 +667,7 @@
1.632 if (!m_Cmds.retrieve(cmd, &pInfo))
1.633 return false;
1.634
1.635 - *pFlags = pInfo->admin.eflags;
1.636 + *pFlags = pInfo->eflags;
1.637 return true;
1.638 }
1.639
1.640 @@ -915,46 +730,36 @@
1.641 const sm_plugininfo_t *plinfo = pPlugin->GetPublicInfo();
1.642 const char *plname = IS_STR_FILLED(plinfo->name) ? plinfo->name : pPlugin->GetFilename();
1.643
1.644 - CmdList *pList;
1.645 + PluginHookList *pList;
1.646 if (!pPlugin->GetProperty("CommandList", (void **)&pList))
1.647 {
1.648 g_RootMenu.ConsolePrint("[SM] No commands found for: %s", plname);
1.649 return;
1.650 }
1.651 - if (!pList->size())
1.652 + if (pList->empty())
1.653 {
1.654 g_RootMenu.ConsolePrint("[SM] No commands found for: %s", plname);
1.655 return;
1.656 }
1.657
1.658 - CmdList::iterator iter;
1.659 const char *type = NULL;
1.660 const char *name;
1.661 const char *help;
1.662 - g_RootMenu.ConsolePrint("[SM] Listing %d commands for: %s", pList->size(), plname);
1.663 + g_RootMenu.ConsolePrint("[SM] Listing commands for: %s", plname);
1.664 g_RootMenu.ConsolePrint(" %-17.16s %-8.7s %s", "[Name]", "[Type]", "[Help]");
1.665 - for (iter=pList->begin();
1.666 - iter!=pList->end();
1.667 - iter++)
1.668 + for (PluginHookList::iterator iter = pList->begin(); iter != pList->end(); iter++)
1.669 {
1.670 - PlCmdInfo &cmd = (*iter);
1.671 - if (cmd.type == Cmd_Server)
1.672 - {
1.673 + CmdHook *hook = *iter;
1.674 + if (hook->type == CmdHook::Server)
1.675 type = "server";
1.676 - }
1.677 - else if (cmd.type == Cmd_Admin)
1.678 - {
1.679 - type = (cmd.pInfo->admin.eflags == 0)?"console":"admin";
1.680 - }
1.681 - name = cmd.pInfo->pCmd->GetName();
1.682 - if (cmd.pHook->helptext.size())
1.683 - {
1.684 - help = cmd.pHook->helptext.c_str();
1.685 - }
1.686 + else
1.687 + type = hook->info->eflags == 0 ? "console" : "admin";
1.688 +
1.689 + name = hook->info->pCmd->GetName();
1.690 + if (hook->helptext.length())
1.691 + help = hook->helptext.chars();
1.692 else
1.693 - {
1.694 - help = cmd.pInfo->pCmd->GetHelpText();
1.695 - }
1.696 + help = hook->info->pCmd->GetHelpText();
1.697 g_RootMenu.ConsolePrint(" %-17.16s %-12.11s %s", name, type, help);
1.698 }
1.699