fixed recursion problem
fixed handle leak fixed player defaults
This commit is contained in:
parent
c602308acb
commit
52aa992a2f
|
@ -29,6 +29,7 @@
|
||||||
* version.
|
* version.
|
||||||
*/
|
*/
|
||||||
#include "amxmodx.h"
|
#include "amxmodx.h"
|
||||||
|
#include "newmenus.h"
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
// class CPlayer
|
// class CPlayer
|
||||||
// *****************************************************
|
// *****************************************************
|
||||||
|
@ -49,6 +50,7 @@ void CPlayer::Init(edict_t* e, int i)
|
||||||
menu = 0;
|
menu = 0;
|
||||||
keys = 0;
|
keys = 0;
|
||||||
menuexpire = 0.0;
|
menuexpire = 0.0;
|
||||||
|
newmenu = -1;
|
||||||
|
|
||||||
death_weapon.clear();
|
death_weapon.clear();
|
||||||
name.clear();
|
name.clear();
|
||||||
|
@ -62,6 +64,21 @@ void CPlayer::Disconnect()
|
||||||
initialized = false;
|
initialized = false;
|
||||||
authorized = false;
|
authorized = false;
|
||||||
|
|
||||||
|
if (newmenu != -1)
|
||||||
|
{
|
||||||
|
Menu *pMenu = g_NewMenus[newmenu];
|
||||||
|
if (pMenu)
|
||||||
|
{
|
||||||
|
//prevent recursion
|
||||||
|
newmenu = -1;
|
||||||
|
menu = 0;
|
||||||
|
executeForwards(pMenu->func,
|
||||||
|
static_cast<cell>(ENTINDEX(pEdict)),
|
||||||
|
static_cast<cell>(pMenu->thisId),
|
||||||
|
static_cast<cell>(MENU_EXIT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
|
List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
|
||||||
for (iter=queries.begin(); iter!=end; iter++)
|
for (iter=queries.begin(); iter!=end; iter++)
|
||||||
{
|
{
|
||||||
|
@ -72,6 +89,8 @@ void CPlayer::Disconnect()
|
||||||
queries.clear();
|
queries.clear();
|
||||||
|
|
||||||
bot = 0;
|
bot = 0;
|
||||||
|
menu = 0;
|
||||||
|
newmenu = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::PutInServer()
|
void CPlayer::PutInServer()
|
||||||
|
@ -101,6 +120,7 @@ bool CPlayer::Connect(const char* connectname, const char* ipaddress)
|
||||||
bot = IsBot();
|
bot = IsBot();
|
||||||
death_killer = 0;
|
death_killer = 0;
|
||||||
menu = 0;
|
menu = 0;
|
||||||
|
newmenu = -1;
|
||||||
|
|
||||||
memset(flags, 0, sizeof(flags));
|
memset(flags, 0, sizeof(flags));
|
||||||
memset(weapons, 0, sizeof(weapons));
|
memset(weapons, 0, sizeof(weapons));
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "newmenus.h"
|
#include "newmenus.h"
|
||||||
|
|
||||||
CVector<Menu *> g_NewMenus;
|
CVector<Menu *> g_NewMenus;
|
||||||
|
CStack<int> g_MenuFreeStack;
|
||||||
|
|
||||||
void ClearMenus()
|
void ClearMenus()
|
||||||
{
|
{
|
||||||
|
@ -39,6 +40,8 @@ void ClearMenus()
|
||||||
delete g_NewMenus[i];
|
delete g_NewMenus[i];
|
||||||
|
|
||||||
g_NewMenus.clear();
|
g_NewMenus.clear();
|
||||||
|
while (!g_MenuFreeStack.empty())
|
||||||
|
g_MenuFreeStack.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void validate_menu_text(char *str)
|
void validate_menu_text(char *str)
|
||||||
|
@ -90,6 +93,7 @@ Menu::Menu(const char *title, int mid, int tid)
|
||||||
items_per_page = 7;
|
items_per_page = 7;
|
||||||
func = 0;
|
func = 0;
|
||||||
padding = 0;
|
padding = 0;
|
||||||
|
isDestroying = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Menu::~Menu()
|
Menu::~Menu()
|
||||||
|
@ -393,7 +397,7 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GETMENU(p) if (p >= (int)g_NewMenus.size() || p < 0 || !g_NewMenus[p]) { \
|
#define GETMENU(p) if (p >= (int)g_NewMenus.size() || p < 0 || !g_NewMenus[p]) { \
|
||||||
LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d", p); \
|
LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.size()); \
|
||||||
return 0; } \
|
return 0; } \
|
||||||
Menu *pMenu = g_NewMenus[p];
|
Menu *pMenu = g_NewMenus[p];
|
||||||
|
|
||||||
|
@ -417,13 +421,22 @@ static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params)
|
||||||
int id = g_menucmds.registerMenuId(title, amx);
|
int id = g_menucmds.registerMenuId(title, amx);
|
||||||
g_menucmds.registerMenuCmd(g_plugins.findPluginFast(amx), id, 1023, func);
|
g_menucmds.registerMenuCmd(g_plugins.findPluginFast(amx), id, 1023, func);
|
||||||
|
|
||||||
Menu *pMenu = new Menu(title, id, (int)g_NewMenus.size());
|
Menu *pMenu = new Menu(title, id, 0);
|
||||||
|
|
||||||
pMenu->func = func;
|
pMenu->func = func;
|
||||||
|
|
||||||
g_NewMenus.push_back(pMenu);
|
if (g_MenuFreeStack.empty())
|
||||||
|
{
|
||||||
return (int)g_NewMenus.size() - 1;
|
g_NewMenus.push_back(pMenu);
|
||||||
|
pMenu->thisId = (int)g_NewMenus.size() - 1;
|
||||||
|
return (int)g_NewMenus.size() - 1;
|
||||||
|
} else {
|
||||||
|
int pos = g_MenuFreeStack.front();
|
||||||
|
g_MenuFreeStack.pop();
|
||||||
|
g_NewMenus[pos] = pMenu;
|
||||||
|
pMenu->thisId = pos;
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
|
||||||
|
@ -724,6 +737,10 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
GETMENU(params[1]);
|
GETMENU(params[1]);
|
||||||
|
|
||||||
|
if (pMenu->isDestroying)
|
||||||
|
return 0; //prevent infinite recursion
|
||||||
|
|
||||||
|
pMenu->isDestroying = true;
|
||||||
g_NewMenus[params[1]] = NULL;
|
g_NewMenus[params[1]] = NULL;
|
||||||
g_menucmds.removeMenuId(pMenu->menuId);
|
g_menucmds.removeMenuId(pMenu->menuId);
|
||||||
CPlayer *player;
|
CPlayer *player;
|
||||||
|
@ -741,6 +758,7 @@ static cell AMX_NATIVE_CALL menu_destroy(AMX *amx, cell *params)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete pMenu;
|
delete pMenu;
|
||||||
|
g_MenuFreeStack.push(params[1]);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,7 @@ public:
|
||||||
int thisId;
|
int thisId;
|
||||||
int func;
|
int func;
|
||||||
int padding;
|
int padding;
|
||||||
|
bool isDestroying;
|
||||||
public:
|
public:
|
||||||
unsigned int items_per_page;
|
unsigned int items_per_page;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user