From 8502fb51b396e9df3a50645f1a54c7f7789fce77 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 24 Feb 2006 08:34:37 +0000 Subject: [PATCH] fixed bug where deleting oldmenus would make the next key non-unique --- amxmodx/CMenu.cpp | 10 +++++++--- amxmodx/CMenu.h | 2 -- amxmodx/newmenus.cpp | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/amxmodx/CMenu.cpp b/amxmodx/CMenu.cpp index a2651036..17a7afb9 100755 --- a/amxmodx/CMenu.cpp +++ b/amxmodx/CMenu.cpp @@ -47,6 +47,7 @@ MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f MenuMngr::~MenuMngr() { clear(); + MenuMngr::MenuIdEle::uniqueid = 0; } int MenuMngr::findMenuId(const char* name, AMX* amx) @@ -81,6 +82,7 @@ void MenuMngr::removeMenuId(int id) MenuCommand *c = headcmd; MenuCommand *lc = NULL; + MenuCommand *tmp; while (c) { if (c->menuid == id) @@ -89,11 +91,13 @@ void MenuMngr::removeMenuId(int id) lc->next = c->next; else headcmd = c->next; + tmp = c->next; delete c; - break; + c = tmp; + } else { + lc = c; + c = c->next; } - lc = c; - c = c->next; } } diff --git a/amxmodx/CMenu.h b/amxmodx/CMenu.h index 0170a59d..902e670c 100755 --- a/amxmodx/CMenu.h +++ b/amxmodx/CMenu.h @@ -51,8 +51,6 @@ class MenuMngr { id = ++uniqueid; } - - ~MenuIdEle() { --uniqueid; } } *headid; public: diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index 510d9798..45731693 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -679,7 +679,8 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params) case MPROP_TITLE: { char *str = get_amxstring(amx, params[3], 0, len); - g_menucmds.removeMenuId(pMenu->menuId); + int old = pMenu->menuId; + g_menucmds.removeMenuId(old); pMenu->m_Title.assign(str); pMenu->menuId = g_menucmds.registerMenuId(str, amx); g_menucmds.registerMenuCmd( @@ -687,6 +688,18 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params) pMenu->menuId, 1023, pMenu->func); + CPlayer *pl; + /** + * NOTE - this is actually bogus + * the client's screen won't actually match the cmd here + * I think, this scenario needs to be tested. + */ + for (int i=1; i<=gpGlobals->maxClients; i++) + { + pl = GET_PLAYER_POINTER_I(i); + if (pl->menu == old) + pl->menu = pMenu->menuId; + } break; } case MPROP_EXITALL: