fixed bug amb571 (FakeClientCommand having weird side effects)

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401341
This commit is contained in:
David Anderson 2007-08-15 17:14:48 +00:00
parent 4016c52a38
commit 84a08ba000
7 changed files with 16 additions and 18 deletions

View File

@ -155,11 +155,8 @@ void ConCmdManager::SetCommandClient(int client)
m_CmdClient = client + 1; m_CmdClient = client + 1;
} }
ResultType ConCmdManager::DispatchClientCommand(int client, ResultType type) ResultType ConCmdManager::DispatchClientCommand(int client, const char *cmd, int args, ResultType type)
{ {
const char *cmd = engine->Cmd_Argv(0);
int args = engine->Cmd_Argc() - 1;
ConCmdInfo *pInfo; ConCmdInfo *pInfo;
if (sm_trie_retrieve(m_pCmds, cmd, (void **)&pInfo)) if (sm_trie_retrieve(m_pCmds, cmd, (void **)&pInfo))
{ {

View File

@ -115,7 +115,7 @@ public:
int adminflags, int adminflags,
const char *description, const char *description,
int flags); int flags);
ResultType DispatchClientCommand(int client, ResultType type); ResultType DispatchClientCommand(int client, const char *cmd, int args, ResultType type);
void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits); void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits);
bool LookForSourceModCommand(const char *cmd); bool LookForSourceModCommand(const char *cmd);
bool CheckCommandAccess(int client, const char *cmd, FlagBits flags); bool CheckCommandAccess(int client, const char *cmd, FlagBits flags);

View File

@ -96,10 +96,8 @@ bool CRadioStyle::IsSupported()
return (g_ShowMenuId != -1); return (g_ShowMenuId != -1);
} }
bool CRadioStyle::OnClientCommand(int client) bool CRadioStyle::OnClientCommand(int client, const char *cmd)
{ {
const char *cmd = engine->Cmd_Argv(0);
if (strcmp(cmd, "menuselect") == 0) if (strcmp(cmd, "menuselect") == 0)
{ {
if (!m_players[client].bInMenu) if (!m_players[client].bInMenu)

View File

@ -70,7 +70,7 @@ public: //IUserMessageListener
void OnUserMessageSent(int msg_id); void OnUserMessageSent(int msg_id);
public: public:
bool IsSupported(); bool IsSupported();
bool OnClientCommand(int client); bool OnClientCommand(int client, const char *cmd);
public: public:
CRadioDisplay *MakeRadioDisplay(CRadioMenu *menu=NULL); CRadioDisplay *MakeRadioDisplay(CRadioMenu *menu=NULL);
void FreeRadioDisplay(CRadioDisplay *display); void FreeRadioDisplay(CRadioDisplay *display);

View File

@ -53,10 +53,8 @@ CBaseMenuPlayer *ValveMenuStyle::GetMenuPlayer(int client)
return &m_players[client]; return &m_players[client];
} }
bool ValveMenuStyle::OnClientCommand(int client) bool ValveMenuStyle::OnClientCommand(int client, const char *cmd)
{ {
const char *cmd = engine->Cmd_Argv(0);
if (strcmp(cmd, "sm_vmenuselect") == 0) if (strcmp(cmd, "sm_vmenuselect") == 0)
{ {
int key_press = atoi(engine->Cmd_Argv(1)); int key_press = atoi(engine->Cmd_Argv(1));

View File

@ -59,7 +59,7 @@ class ValveMenuStyle :
{ {
public: public:
ValveMenuStyle(); ValveMenuStyle();
bool OnClientCommand(int client); bool OnClientCommand(int client, const char *cmd);
public: //BaseMenuStyle public: //BaseMenuStyle
CBaseMenuPlayer *GetMenuPlayer(int client); CBaseMenuPlayer *GetMenuPlayer(int client);
void SendDisplay(int client, IMenuPanel *display); void SendDisplay(int client, IMenuPanel *display);

View File

@ -535,23 +535,28 @@ void PlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
void PlayerManager::OnClientCommand(edict_t *pEntity) void PlayerManager::OnClientCommand(edict_t *pEntity)
{ {
/**
* We cache this because the engine is not re-entrant.
*/
char cmd[300];
int args = engine->Cmd_Argc() - 1;
strncopy(cmd, engine->Cmd_Argv(0), sizeof(cmd));
int client = engine->IndexOfEdict(pEntity); int client = engine->IndexOfEdict(pEntity);
cell_t res = Pl_Continue; cell_t res = Pl_Continue;
bool result = g_ValveMenuStyle.OnClientCommand(client); bool result = g_ValveMenuStyle.OnClientCommand(client, cmd);
if (result) if (result)
{ {
res = Pl_Handled; res = Pl_Handled;
} else { } else {
result = g_RadioMenuStyle.OnClientCommand(client); result = g_RadioMenuStyle.OnClientCommand(client, cmd);
if (result) if (result)
{ {
res = Pl_Handled; res = Pl_Handled;
} }
} }
int args = engine->Cmd_Argc() - 1;
cell_t res2 = Pl_Continue; cell_t res2 = Pl_Continue;
m_clcommand->PushCell(client); m_clcommand->PushCell(client);
m_clcommand->PushCell(args); m_clcommand->PushCell(args);
@ -567,7 +572,7 @@ void PlayerManager::OnClientCommand(edict_t *pEntity)
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
res = g_ConCmds.DispatchClientCommand(client, (ResultType)res); res = g_ConCmds.DispatchClientCommand(client, cmd, args, (ResultType)res);
if (res >= Pl_Handled) if (res >= Pl_Handled)
{ {