From cd7cb8c1a887bd332fd24ce8585935c36e984106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Gr=C3=BCnbacher?= Date: Wed, 21 May 2014 18:17:09 +0200 Subject: [PATCH] Newmenus: Execute menu callback when old-style menu overwrites new menu show_menu simply resets CPlayer::newmenu. The menu callback is never fired and the plugin never informed that the menu has been closed. This can result in leaking menu handles. Using "menuselect 10" on the client is not an appropriate solution because it is possible to construct newmenus that contain 10 valid items. --- amxmodx/amxmodx.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 8d0c644d..94b0e73a 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -32,6 +32,7 @@ #include #include "amxmodx.h" #include "CMenu.h" +#include "newmenus.h" #include "natives.h" #include "debugger.h" #include "binlog.h" @@ -1292,6 +1293,17 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ pPlayer->keys = 0; pPlayer->menu = 0; + // Fire newmenu callback so closing it can be handled by the plugin + int menu = pPlayer->newmenu; + if (menu >= 0 && menu < (int)g_NewMenus.size() && g_NewMenus[menu]) + { + Menu *pMenu = g_NewMenus[menu]; + + pPlayer->newmenu = -1; + + executeForwards(pMenu->func, static_cast(pPlayer->index), static_cast(menu), static_cast(MENU_EXIT)); + } + UTIL_FakeClientCommand(pPlayer->pEdict, "menuselect", "10", 0); pPlayer->keys = keys; @@ -1303,7 +1315,6 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ else pPlayer->menuexpire = gpGlobals->time + static_cast(time); - pPlayer->newmenu = -1; pPlayer->page = 0; UTIL_ShowMenu(pPlayer->pEdict, keys, time, sMenu, ilen); } @@ -1324,6 +1335,17 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ pPlayer->keys = 0; pPlayer->menu = 0; + // Fire newmenu callback so closing it can be handled by the plugin + int menu = pPlayer->newmenu; + if (menu >= 0 && menu < (int)g_NewMenus.size() && g_NewMenus[menu]) + { + Menu *pMenu = g_NewMenus[menu]; + + pPlayer->newmenu = -1; + + executeForwards(pMenu->func, static_cast(pPlayer->index), static_cast(menu), static_cast(MENU_EXIT)); + } + UTIL_FakeClientCommand(pPlayer->pEdict, "menuselect", "10", 0); pPlayer->keys = keys; @@ -1335,7 +1357,6 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ else pPlayer->menuexpire = gpGlobals->time + static_cast(time); - pPlayer->newmenu = -1; pPlayer->page = 0; UTIL_ShowMenu(pPlayer->pEdict, keys, time, sMenu, ilen); } @@ -2948,6 +2969,7 @@ static cell AMX_NATIVE_CALL get_user_menu(AMX *amx, cell *params) /* 3 param */ if (gpGlobals->time > pPlayer->menuexpire) { pPlayer->menu = 0; + *cpMenu = 0; *cpKeys = 0;