diff -r c7b4237fff50 -r 03a67e41afbc core/MenuStyle_Valve.cpp --- a/core/MenuStyle_Valve.cpp Fri Mar 28 06:21:34 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,430 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * SourceMod - * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - * - * Version: $Id$ - */ - -#include "sm_stringutil.h" -#include "PlayerManager.h" -#include "MenuStyle_Valve.h" -#include "Translator.h" -#include "PlayerManager.h" -#include "ConCmdManager.h" - -SH_DECL_HOOK4_void(IServerPluginHelpers, CreateMessage, SH_NOATTRIB, false, edict_t *, DIALOG_TYPE, KeyValues *, IServerPluginCallbacks *); - -ValveMenuStyle g_ValveMenuStyle; -extern const char *g_OptionNumTable[]; -extern const char *g_OptionCmdTable[]; -CallClass *g_pSPHCC = NULL; - -ValveMenuStyle::ValveMenuStyle() : m_players(new CValveMenuPlayer[256+1]) -{ -} - -CBaseMenuPlayer *ValveMenuStyle::GetMenuPlayer(int client) -{ - return &m_players[client]; -} - -bool ValveMenuStyle::OnClientCommand(int client, const char *cmdname, const CCommand &cmd) -{ - if (strcmp(cmdname, "sm_vmenuselect") == 0) - { - int key_press = atoi(cmd.Arg(1)); - g_ValveMenuStyle.ClientPressedKey(client, key_press); - return true; - } - - return false; -} - -void ValveMenuStyle::OnSourceModAllInitialized() -{ - g_Players.AddClientListener(this); - SH_ADD_HOOK_MEMFUNC(IServerPluginHelpers, CreateMessage, serverpluginhelpers, this, &ValveMenuStyle::HookCreateMessage, false); - g_pSPHCC = SH_GET_CALLCLASS(serverpluginhelpers); -} - -void ValveMenuStyle::OnSourceModShutdown() -{ - SH_RELEASE_CALLCLASS(g_pSPHCC); - SH_REMOVE_HOOK_MEMFUNC(IServerPluginHelpers, CreateMessage, serverpluginhelpers, this, &ValveMenuStyle::HookCreateMessage, false); - g_Players.RemoveClientListener(this); -} - -void ValveMenuStyle::HookCreateMessage(edict_t *pEdict, - DIALOG_TYPE type, - KeyValues *kv, - IServerPluginCallbacks *plugin) -{ - if (type != DIALOG_MENU) - { - return; - } - - int client = engine->IndexOfEdict(pEdict); - if (client < 1 || client > 256) - { - return; - } - - CValveMenuPlayer *player = &m_players[client]; - - /* We don't care if the player is in a menu because, for all intents and purposes, - * the menu is completely private. Instead, we just figure out the level we'll need - * in order to override it. - */ - player->curPrioLevel = kv->GetInt("level", player->curPrioLevel); - - /* Oh no! What happens if we got a menu that overwrites ours?! */ - if (player->bInMenu) - { - /* Okay, let the external menu survive for now. It may live another - * day to avenge its grandfather, killed in the great Menu Interruption - * battle. - */ - _CancelClientMenu(client, MenuCancel_Interrupted, true); - } -} - -IMenuPanel *ValveMenuStyle::CreatePanel() -{ - return new CValveMenuDisplay(); -} - -IBaseMenu *ValveMenuStyle::CreateMenu(IMenuHandler *pHandler, IdentityToken_t *pOwner) -{ - return new CValveMenu(pHandler, pOwner); -} - -const char *ValveMenuStyle::GetStyleName() -{ - return "valve"; -} - -unsigned int ValveMenuStyle::GetMaxPageItems() -{ - return 8; -} - -void ValveMenuStyle::SendDisplay(int client, IMenuPanel *display) -{ - m_players[client].curPrioLevel--; - CValveMenuDisplay *vDisplay = (CValveMenuDisplay *)display; - vDisplay->SendRawDisplay(client, m_players[client].curPrioLevel, m_players[client].menuHoldTime); -} - -bool ValveMenuStyle::DoClientMenu(int client, IMenuPanel *menu, IMenuHandler *mh, unsigned int time) -{ - if (vsp_interface == NULL) - { - return false; - } - - return BaseMenuStyle::DoClientMenu(client, menu, mh, time); -} - -bool ValveMenuStyle::DoClientMenu(int client, CBaseMenu *menu, unsigned int first_item, IMenuHandler *mh, unsigned int time) -{ - if (vsp_interface == NULL) - { - mh->OnMenuStart(menu); - mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay); - mh->OnMenuEnd(menu, MenuEnd_Cancelled); - return false; - } - - return BaseMenuStyle::DoClientMenu(client, menu, first_item, mh, time); -} - -CValveMenuDisplay::CValveMenuDisplay() -{ - m_pKv = NULL; - Reset(); -} - -CValveMenuDisplay::CValveMenuDisplay(CValveMenu *pMenu) -{ - m_pKv = NULL; - Reset(); - m_pKv->SetColor("color", pMenu->m_IntroColor); - m_pKv->SetString("title", pMenu->m_IntroMsg); -} - -void CValveMenuDisplay::DeleteThis() -{ - delete this; -} - -CValveMenuDisplay::~CValveMenuDisplay() -{ - m_pKv->deleteThis(); -} - -IMenuStyle *CValveMenuDisplay::GetParentStyle() -{ - return &g_ValveMenuStyle; -} - -void CValveMenuDisplay::Reset() -{ - if (m_pKv) - { - m_pKv->deleteThis(); - } - m_pKv = new KeyValues("menu"); - m_NextPos = 1; - m_TitleDrawn = false; -} - -unsigned int CValveMenuDisplay::GetCurrentKey() -{ - return m_NextPos; -} - -bool CValveMenuDisplay::SetCurrentKey(unsigned int key) -{ - if (key < m_NextPos || key > 9) - { - return false; - } - - m_NextPos = key; - - return true; -} - -bool CValveMenuDisplay::SetExtOption(MenuOption option, const void *valuePtr) -{ - if (option == MenuOption_IntroMessage) - { - m_pKv->SetString("title", (const char *)valuePtr); - return true; - } else if (option == MenuOption_IntroColor) { - int *array = (int *)valuePtr; - m_pKv->SetColor("color", Color(array[0], array[1], array[2], array[3])); - return true; - } else if (option == MenuOption_Priority) { - m_pKv->SetInt("level", *(int *)valuePtr); - return true; - } - - return false; -} - -bool CValveMenuDisplay::CanDrawItem(unsigned int drawFlags) -{ - /** - * ITEMDRAW_RAWLINE - We can't draw random text, and this doesn't add a slot, - * so it's completely safe to ignore it. - * ----------------------------------------- - */ - if (drawFlags & ITEMDRAW_RAWLINE) - { - return false; - } - - /** - * Special cases, explained in DrawItem() - */ - if ((drawFlags & ITEMDRAW_NOTEXT) - || (drawFlags & ITEMDRAW_SPACER)) - { - return true; - } - - /** - * We can't draw disabled text. We could bump the position, but we - * want DirectDraw() to find some actual items to display. - */ - if (drawFlags & ITEMDRAW_DISABLED) - { - return false; - } - - return true; -} - -unsigned int CValveMenuDisplay::DrawItem(const ItemDrawInfo &item) -{ - if (m_NextPos > 9 || !CanDrawItem(item.style)) - { - return 0; - } - - /** - * For these cases we can't draw anything at all, but - * we can at least bump the position since we were explicitly asked to. - */ - if ((item.style & ITEMDRAW_NOTEXT) - || (item.style & ITEMDRAW_SPACER)) - { - return m_NextPos++; - } - - char buffer[255]; - UTIL_Format(buffer, sizeof(buffer), "%d. %s", m_NextPos, item.display); - - KeyValues *ki = m_pKv->FindKey(g_OptionNumTable[m_NextPos], true); - ki->SetString("command", g_OptionCmdTable[m_NextPos]); - ki->SetString("msg", buffer); - - return m_NextPos++; -} - -void CValveMenuDisplay::DrawTitle(const char *text, bool onlyIfEmpty/* =false */) -{ - if (onlyIfEmpty && m_TitleDrawn) - { - return; - } - - m_pKv->SetString("msg", text); - m_TitleDrawn = true; -} - -bool CValveMenuDisplay::DrawRawLine(const char *rawline) -{ - return false; -} - -void CValveMenuDisplay::SendRawDisplay(int client, int priority, unsigned int time) -{ - m_pKv->SetInt("level", priority); - m_pKv->SetInt("time", time ? time : 200); - - SH_CALL(g_pSPHCC, &IServerPluginHelpers::CreateMessage)( - engine->PEntityOfEntIndex(client), - DIALOG_MENU, - m_pKv, - vsp_interface); -} - -bool CValveMenuDisplay::SendDisplay(int client, IMenuHandler *handler, unsigned int time) -{ - return g_ValveMenuStyle.DoClientMenu(client, this, handler, time); -} - -bool CValveMenuDisplay::SetSelectableKeys(unsigned int keymap) -{ - return false; -} - -int CValveMenuDisplay::GetAmountRemaining() -{ - /* :TODO: this is a lie, but nothing really seems meaningful... */ - return -1; -} - -CValveMenu::CValveMenu(IMenuHandler *pHandler, IdentityToken_t *pOwner) : -CBaseMenu(pHandler, &g_ValveMenuStyle, pOwner), - m_IntroColor(255, 0, 0, 255) -{ - strcpy(m_IntroMsg, "You have a menu, press ESC"); - m_Pagination = 5; -} - -void CValveMenu::Cancel_Finally() -{ - g_ValveMenuStyle.CancelMenu(this); -} - -bool CValveMenu::SetPagination(unsigned int itemsPerPage) -{ - if (itemsPerPage > 5) - { - return false; - } - - return CBaseMenu::SetPagination(itemsPerPage); -} - -bool CValveMenu::SetExtOption(MenuOption option, const void *valuePtr) -{ - if (option == MenuOption_IntroMessage) - { - strncopy(m_IntroMsg, (const char *)valuePtr, sizeof(m_IntroMsg)); - return true; - } else if (option == MenuOption_IntroColor) { - unsigned int *array = (unsigned int *)valuePtr; - m_IntroColor = Color(array[0], array[1], array[2], array[3]); - return true; - } - - return false; -} - -bool CValveMenu::Display(int client, unsigned int time, IMenuHandler *alt_handler) -{ - return DisplayAtItem(client, time, 0, alt_handler); -} - -bool CValveMenu::DisplayAtItem(int client, - unsigned int time, - unsigned int start_item, - IMenuHandler *alt_handler/* =NULL */) -{ - if (m_bCancelling) - { - return false; - } - - return g_ValveMenuStyle.DoClientMenu(client, this, start_item, alt_handler ? alt_handler : m_pHandler, time); -} - -IMenuPanel *CValveMenu::CreatePanel() -{ - return new CValveMenuDisplay(this); -} - -void CValveMenu::SetMenuOptionFlags(unsigned int flags) -{ - flags |= MENUFLAG_BUTTON_EXIT; - CBaseMenu::SetMenuOptionFlags(flags); -} - -const char *g_OptionNumTable[] = -{ - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" -}; - -const char *g_OptionCmdTable[] = -{ - "sm_vmenuselect 0", /* INVALID! */ - "sm_vmenuselect 1", - "sm_vmenuselect 2", - "sm_vmenuselect 3", - "sm_vmenuselect 4", - "sm_vmenuselect 5", - "sm_vmenuselect 6", - "sm_vmenuselect 7", - "sm_vmenuselect 8", - "sm_vmenuselect 9", - "sm_vmenuselect 10" -};