bool BaseMenuStyle::RedoClientMenu(int client, ItemOrder order) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] RedoClientMenu() (client %d) (order %d)", client, order); #endif CBaseMenuPlayer *player = GetMenuPlayer(client); menu_states_t &states = player->states; player->bAutoIgnore = true; IMenuPanel *display = g_Menus.RenderMenu(client, states, order); if (!display) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] RedoClientMenu(): Failed to render menu"); #endif if (player->menuHoldTime) { RemoveClientFromWatch(client); } player->bAutoIgnore = false; return false; } SendDisplay(client, display); display->DeleteThis(); player->bAutoIgnore = false; #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] RedoClientMenu(): Succeeded to client %d", client); #endif return true; }
bool BaseMenuStyle::DoClientMenu(int client, IMenuPanel *menu, IMenuHandler *mh, unsigned int time) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu() (client %d) (panel %p) (mh %p) (time %d)", client, menu, mh, time); #endif CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); if (!pPlayer || pPlayer->IsFakeClient() || !pPlayer->IsInGame()) { return false; } CBaseMenuPlayer *player = GetMenuPlayer(client); if (player->bAutoIgnore) { return false; } /* For the duration of this, we are going to totally ignore whether * the player is already in a menu or not (except to cancel the old one). * Instead, we are simply going to ignore any further menu displays, so * this display can't be interrupted. */ player->bAutoIgnore = true; /* Cancel any old menus */ menu_states_t &states = player->states; if (player->bInMenu) { _CancelClientMenu(client, MenuCancel_Interrupted, true); } states.firstItem = 0; states.lastItem = 0; states.menu = NULL; states.mh = mh; states.apiVers = SMINTERFACE_MENUMANAGER_VERSION; player->bInMenu = true; player->bInExternMenu = false; player->menuStartTime = gpGlobals->curtime; player->menuHoldTime = time; if (time) { AddClientToWatch(client); } /* Draw the display */ SendDisplay(client, menu); /* We can be interrupted again! */ player->bAutoIgnore = false; return true; }
bool BaseBuiltinVoteStyle::RedoClientVote(int client) { CBaseBuiltinVotePlayer *player = GetVotePlayer(client); vote_states_t &states = player->states; // player->bAutoIgnore = true; IBaseBuiltinVote *vote = states.vote; if (!vote) { // player->bAutoIgnore = false; return false; } SendDisplay(client, vote); // player->bAutoIgnore = false; return true; }
bool BaseMenuStyle::DoClientMenu(int client, CBaseMenu *menu, unsigned int first_item, IMenuHandler *mh, unsigned int time) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu() (client %d) (menu %p) (mh %p) (time %d)", client, menu, mh, time); #endif mh->OnMenuStart(menu); CPlayer *pPlayer = g_Players.GetPlayerByIndex(client); if (!pPlayer || pPlayer->IsFakeClient() || !pPlayer->IsInGame()) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu(): Failed to display to client %d", client); #endif mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay); mh->OnMenuEnd(menu, MenuEnd_Cancelled); return false; } CBaseMenuPlayer *player = GetMenuPlayer(client); if (player->bAutoIgnore) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu(): Client %d is autoIgnoring", client); #endif mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay); mh->OnMenuEnd(menu, MenuEnd_Cancelled); return false; } /* For the duration of this, we are going to totally ignore whether * the player is already in a menu or not (except to cancel the old one). * Instead, we are simply going to ignore any further menu displays, so * this display can't be interrupted. */ player->bAutoIgnore = true; /* Cancel any old menus */ menu_states_t &states = player->states; if (player->bInMenu) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu(): Cancelling old menu to client %d", client); #endif _CancelClientMenu(client, MenuCancel_Interrupted, true); } states.firstItem = 0; states.lastItem = first_item; states.menu = menu; states.mh = mh; states.apiVers = SMINTERFACE_MENUMANAGER_VERSION; IMenuPanel *display = g_Menus.RenderMenu(client, states, ItemOrder_Ascending); if (!display) { #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu(): Failed to render to client %d", client); #endif player->bAutoIgnore = false; player->bInMenu = false; mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay); mh->OnMenuEnd(menu, MenuEnd_Cancelled); return false; } /* Finally, set our states */ player->bInMenu = true; player->bInExternMenu = false; player->menuStartTime = gpGlobals->curtime; player->menuHoldTime = time; if (time) { AddClientToWatch(client); } /* Draw the display */ SendDisplay(client, display); /* Free the display pointer */ display->DeleteThis(); /* We can be interrupted again! */ player->bAutoIgnore = false; #if defined MENU_DEBUG g_Logger.LogMessage("[SM_MENU] DoClientMenu() finished successfully (client %d)", client); #endif return true; }
void BaseBuiltinVoteStyle::SendDisplay(int client, IBaseBuiltinVote *vote) { int clients[1] = { client }; SendDisplay(clients, 1, vote); }