submitting patch from amb1181 - retrieving topmenu object name

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401705
This commit is contained in:
David Anderson 2007-11-20 02:22:26 +00:00
parent 3d4d583182
commit d04d0e4089
4 changed files with 1971 additions and 1918 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,178 +1,179 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod Sample Extension * SourceMod Sample Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * 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 * the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation. * Free Software Foundation.
* *
* This program is distributed in the hope that it will be useful, but WITHOUT * 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 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details. * details.
* *
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
* *
* As a special exception, AlliedModders LLC gives you permission to link the * 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 * 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 * "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 * by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants * all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further * this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>. * or <http://www.sourcemod.net/license.php>.
* *
* Version: $Id$ * Version: $Id$
*/ */
#ifndef _INCLUDE_SOURCEMOD_TOP_MENU_H_ #ifndef _INCLUDE_SOURCEMOD_TOP_MENU_H_
#define _INCLUDE_SOURCEMOD_TOP_MENU_H_ #define _INCLUDE_SOURCEMOD_TOP_MENU_H_
#include <sh_list.h> #include <sh_list.h>
#include <sh_vector.h> #include <sh_vector.h>
#include <sm_trie_tpl.h> #include <sm_trie_tpl.h>
#include <ITopMenus.h> #include <ITopMenus.h>
#include "smsdk_ext.h" #include "smsdk_ext.h"
#include "sm_memtable.h" #include "sm_memtable.h"
using namespace SourceHook; using namespace SourceHook;
using namespace SourceMod; using namespace SourceMod;
struct config_category_t struct config_category_t
{ {
int name; int name;
CVector<int> commands; CVector<int> commands;
}; };
struct config_root_t struct config_root_t
{ {
config_root_t() : strings(1024) config_root_t() : strings(1024)
{ {
} }
BaseStringTable strings; BaseStringTable strings;
CVector<config_category_t *> cats; CVector<config_category_t *> cats;
}; };
struct topmenu_object_t struct topmenu_object_t
{ {
char name[64]; /** Name */ char name[64]; /** Name */
char cmdname[64]; /** Command name */ char cmdname[64]; /** Command name */
FlagBits flags; /** Admin flags */ FlagBits flags; /** Admin flags */
ITopMenuObjectCallbacks *callbacks; /** Callbacks */ ITopMenuObjectCallbacks *callbacks; /** Callbacks */
IdentityToken_t *owner; /** Owner */ IdentityToken_t *owner; /** Owner */
unsigned int object_id; /** Object ID */ unsigned int object_id; /** Object ID */
topmenu_object_t *parent; /** Parent, if any */ topmenu_object_t *parent; /** Parent, if any */
TopMenuObjectType type; /** Object Type */ TopMenuObjectType type; /** Object Type */
bool is_free; /** Free or not? */ bool is_free; /** Free or not? */
char info[255]; /** Info string */ char info[255]; /** Info string */
}; };
struct topmenu_category_t struct topmenu_category_t
{ {
CVector<topmenu_object_t *> obj_list; /** Full object list */ CVector<topmenu_object_t *> obj_list; /** Full object list */
CVector<topmenu_object_t *> sorted; /** Sorted items */ CVector<topmenu_object_t *> sorted; /** Sorted items */
CVector<topmenu_object_t *> unsorted; /** Unsorted items */ CVector<topmenu_object_t *> unsorted; /** Unsorted items */
topmenu_object_t *obj; /** Bound object */ topmenu_object_t *obj; /** Bound object */
unsigned int serial; /** Serial number */ unsigned int serial; /** Serial number */
bool reorder; /** Whether ordering needs updating */ bool reorder; /** Whether ordering needs updating */
}; };
struct topmenu_player_category_t struct topmenu_player_category_t
{ {
IBaseMenu *menu; /** menu pointer */ IBaseMenu *menu; /** menu pointer */
unsigned int serial; /** last known serial */ unsigned int serial; /** last known serial */
}; };
struct topmenu_player_t struct topmenu_player_t
{ {
int user_id; /** userid on server */ int user_id; /** userid on server */
unsigned int menu_serial; /** menu serial no */ unsigned int menu_serial; /** menu serial no */
IBaseMenu *root; /** root menu display */ IBaseMenu *root; /** root menu display */
topmenu_player_category_t *cats; /** category display */ topmenu_player_category_t *cats; /** category display */
unsigned int cat_count; /** number of categories */ unsigned int cat_count; /** number of categories */
unsigned int last_category; /** last category they selected */ unsigned int last_category; /** last category they selected */
unsigned int last_position; /** last position in that category */ unsigned int last_position; /** last position in that category */
unsigned int last_root_pos; /** last page in the root menu */ unsigned int last_root_pos; /** last page in the root menu */
}; };
class TopMenu : class TopMenu :
public ITopMenu, public ITopMenu,
public IMenuHandler, public IMenuHandler,
public ITextListener_SMC public ITextListener_SMC
{ {
friend class TopMenuManager; friend class TopMenuManager;
public: public:
TopMenu(ITopMenuObjectCallbacks *callbacks); TopMenu(ITopMenuObjectCallbacks *callbacks);
~TopMenu(); ~TopMenu();
public: //ITopMenu public: //ITopMenu
virtual unsigned int AddToMenu(const char *name, virtual unsigned int AddToMenu(const char *name,
TopMenuObjectType type, TopMenuObjectType type,
ITopMenuObjectCallbacks *callbacks, ITopMenuObjectCallbacks *callbacks,
IdentityToken_t *owner, IdentityToken_t *owner,
const char *cmdname, const char *cmdname,
FlagBits flags, FlagBits flags,
unsigned int parent); unsigned int parent);
unsigned int AddToMenu2(const char *name, unsigned int AddToMenu2(const char *name,
TopMenuObjectType type, TopMenuObjectType type,
ITopMenuObjectCallbacks *callbacks, ITopMenuObjectCallbacks *callbacks,
IdentityToken_t *owner, IdentityToken_t *owner,
const char *cmdname, const char *cmdname,
FlagBits flags, FlagBits flags,
unsigned int parent, unsigned int parent,
const char *info_string); const char *info_string);
virtual void RemoveFromMenu(unsigned int object_id); virtual void RemoveFromMenu(unsigned int object_id);
virtual bool DisplayMenu(int client, virtual bool DisplayMenu(int client,
unsigned int hold_time, unsigned int hold_time,
TopMenuPosition position); TopMenuPosition position);
virtual bool LoadConfiguration(const char *file, char *error, size_t maxlength); virtual bool LoadConfiguration(const char *file, char *error, size_t maxlength);
virtual unsigned int FindCategory(const char *name); virtual unsigned int FindCategory(const char *name);
const char *GetObjectInfoString(unsigned int object_id); const char *GetObjectInfoString(unsigned int object_id);
public: //IMenuHandler const char *GetObjectName(unsigned int object_id);
virtual void OnMenuSelect2(IBaseMenu *menu, int client, unsigned int item, unsigned int item_on_page); public: //IMenuHandler
virtual void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style); virtual void OnMenuSelect2(IBaseMenu *menu, int client, unsigned int item, unsigned int item_on_page);
virtual unsigned int OnMenuDisplayItem(IBaseMenu *menu, virtual void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style);
int client, virtual unsigned int OnMenuDisplayItem(IBaseMenu *menu,
IMenuPanel *panel, int client,
unsigned int item, IMenuPanel *panel,
const ItemDrawInfo &dr); unsigned int item,
virtual void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason); const ItemDrawInfo &dr);
public: //ITextListener_SMC virtual void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason);
void ReadSMC_ParseStart(); public: //ITextListener_SMC
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name); void ReadSMC_ParseStart();
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value); SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
SMCResult ReadSMC_LeavingSection(const SMCStates *states); SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
private: SMCResult ReadSMC_LeavingSection(const SMCStates *states);
void SortCategoriesIfNeeded(); private:
void SortCategoryIfNeeded(unsigned int category); void SortCategoriesIfNeeded();
private: void SortCategoryIfNeeded(unsigned int category);
bool DisplayCategory(int client, unsigned int category, unsigned int hold_time, bool last_position); private:
void CreatePlayers(int max_clients); bool DisplayCategory(int client, unsigned int category, unsigned int hold_time, bool last_position);
void UpdateClientRoot(int client, IGamePlayer *pGamePlayer=NULL); void CreatePlayers(int max_clients);
void UpdateClientCategory(int client, unsigned int category); void UpdateClientRoot(int client, IGamePlayer *pGamePlayer=NULL);
void TearDownClient(topmenu_player_t *player); void UpdateClientCategory(int client, unsigned int category);
private: void TearDownClient(topmenu_player_t *player);
void OnClientConnected(int client); private:
void OnClientDisconnected(int client); void OnClientConnected(int client);
void OnServerActivated(int max_clients); void OnClientDisconnected(int client);
bool OnIdentityRemoval(IdentityToken_t *owner); void OnServerActivated(int max_clients);
private: bool OnIdentityRemoval(IdentityToken_t *owner);
config_root_t m_Config; /* Configuration from file */ private:
topmenu_player_t *m_clients; /* Client array */ config_root_t m_Config; /* Configuration from file */
CVector<unsigned int> m_SortedCats; /* Sorted categories */ topmenu_player_t *m_clients; /* Client array */
CVector<unsigned int> m_UnsortedCats; /* Un-sorted categories */ CVector<unsigned int> m_SortedCats; /* Sorted categories */
CVector<topmenu_category_t *> m_Categories; /* Category array */ CVector<unsigned int> m_UnsortedCats; /* Un-sorted categories */
CVector<topmenu_object_t *> m_Objects; /* Object array */ CVector<topmenu_category_t *> m_Categories; /* Category array */
KTrie<topmenu_object_t *> m_ObjLookup; /* Object lookup trie */ CVector<topmenu_object_t *> m_Objects; /* Object array */
unsigned int m_SerialNo; /* Serial number for updating */ KTrie<topmenu_object_t *> m_ObjLookup; /* Object lookup trie */
ITopMenuObjectCallbacks *m_pTitle; /* Title callbacks */ unsigned int m_SerialNo; /* Serial number for updating */
int m_max_clients; /* Maximum number of clients */ ITopMenuObjectCallbacks *m_pTitle; /* Title callbacks */
bool m_bCatsNeedResort; /* True if categories need a resort */ int m_max_clients; /* Maximum number of clients */
}; bool m_bCatsNeedResort; /* True if categories need a resort */
};
unsigned int strncopy(char *dest, const char *src, size_t count);
unsigned int strncopy(char *dest, const char *src, size_t count);
#endif //_INCLUDE_SOURCEMOD_TOP_MENU_H_
#endif //_INCLUDE_SOURCEMOD_TOP_MENU_H_

View File

@ -1,358 +1,383 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod Sample Extension * SourceMod Sample Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This program is free software; you can redistribute it and/or modify it under * 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 * the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation. * Free Software Foundation.
* *
* This program is distributed in the hope that it will be useful, but WITHOUT * 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 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details. * details.
* *
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
* *
* As a special exception, AlliedModders LLC gives you permission to link the * 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 * 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 * "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 * by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants * all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further * this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>. * or <http://www.sourcemod.net/license.php>.
* *
* Version: $Id$ * Version: $Id$
*/ */
#include "extension.h" #include "extension.h"
#include "TopMenuManager.h" #include "TopMenuManager.h"
#include "TopMenu.h" #include "TopMenu.h"
HandleType_t hTopMenuType; HandleType_t hTopMenuType;
class TopMenuHandle : public IHandleTypeDispatch class TopMenuHandle : public IHandleTypeDispatch
{ {
public: public:
void OnHandleDestroy(HandleType_t type, void *object) void OnHandleDestroy(HandleType_t type, void *object)
{ {
ITopMenu *pTopMenu = (ITopMenu *)object; ITopMenu *pTopMenu = (ITopMenu *)object;
g_TopMenus.DestroyTopMenu(pTopMenu); g_TopMenus.DestroyTopMenu(pTopMenu);
} }
} s_TopMenuHandle; } s_TopMenuHandle;
void Initialize_Natives() void Initialize_Natives()
{ {
hTopMenuType = handlesys->CreateType("ITopMenu", hTopMenuType = handlesys->CreateType("ITopMenu",
&s_TopMenuHandle, &s_TopMenuHandle,
0, 0,
NULL, NULL,
NULL, NULL,
myself->GetIdentity(), myself->GetIdentity(),
NULL); NULL);
} }
void Shutdown_Natives() void Shutdown_Natives()
{ {
handlesys->RemoveType(hTopMenuType, myself->GetIdentity()); handlesys->RemoveType(hTopMenuType, myself->GetIdentity());
} }
enum TopMenuAction enum TopMenuAction
{ {
TopMenuAction_DisplayOption = 0, TopMenuAction_DisplayOption = 0,
TopMenuAction_DisplayTitle = 1, TopMenuAction_DisplayTitle = 1,
TopMenuAction_SelectOption = 2, TopMenuAction_SelectOption = 2,
TopMenuAction_DrawOption = 3, TopMenuAction_DrawOption = 3,
TopMenuAction_RemoveObject = 4, TopMenuAction_RemoveObject = 4,
}; };
class TopMenuCallbacks : public ITopMenuObjectCallbacks class TopMenuCallbacks : public ITopMenuObjectCallbacks
{ {
public: public:
TopMenuCallbacks(IPluginFunction *pFunction) : m_pFunction(pFunction) TopMenuCallbacks(IPluginFunction *pFunction) : m_pFunction(pFunction)
{ {
} }
unsigned int OnTopMenuDrawOption(ITopMenu *menu, unsigned int OnTopMenuDrawOption(ITopMenu *menu,
int client, int client,
unsigned int object_id) unsigned int object_id)
{ {
char buffer[2] = {ITEMDRAW_DEFAULT, 0x0}; char buffer[2] = {ITEMDRAW_DEFAULT, 0x0};
m_pFunction->PushCell(m_hMenuHandle); m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DrawOption); m_pFunction->PushCell(TopMenuAction_DrawOption);
m_pFunction->PushCell(object_id); m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client); m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, sizeof(buffer), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK); m_pFunction->PushStringEx(buffer, sizeof(buffer), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
m_pFunction->PushCell(sizeof(buffer)); m_pFunction->PushCell(sizeof(buffer));
m_pFunction->Execute(NULL); m_pFunction->Execute(NULL);
return (unsigned int)buffer[0]; return (unsigned int)buffer[0];
} }
void OnTopMenuDisplayOption(ITopMenu *menu, void OnTopMenuDisplayOption(ITopMenu *menu,
int client, int client,
unsigned int object_id, unsigned int object_id,
char buffer[], char buffer[],
size_t maxlength) size_t maxlength)
{ {
m_pFunction->PushCell(m_hMenuHandle); m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DisplayOption); m_pFunction->PushCell(TopMenuAction_DisplayOption);
m_pFunction->PushCell(object_id); m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client); m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK); m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK);
m_pFunction->PushCell(maxlength); m_pFunction->PushCell(maxlength);
m_pFunction->Execute(NULL); m_pFunction->Execute(NULL);
} }
void OnTopMenuDisplayTitle(ITopMenu *menu, void OnTopMenuDisplayTitle(ITopMenu *menu,
int client, int client,
unsigned int object_id, unsigned int object_id,
char buffer[], char buffer[],
size_t maxlength) size_t maxlength)
{ {
m_pFunction->PushCell(m_hMenuHandle); m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DisplayTitle); m_pFunction->PushCell(TopMenuAction_DisplayTitle);
m_pFunction->PushCell(object_id); m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client); m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK); m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK);
m_pFunction->PushCell(maxlength); m_pFunction->PushCell(maxlength);
m_pFunction->Execute(NULL); m_pFunction->Execute(NULL);
} }
void OnTopMenuSelectOption(ITopMenu *menu, void OnTopMenuSelectOption(ITopMenu *menu,
int client, int client,
unsigned int object_id) unsigned int object_id)
{ {
unsigned int old_reply = playerhelpers->SetReplyTo(SM_REPLY_CHAT); unsigned int old_reply = playerhelpers->SetReplyTo(SM_REPLY_CHAT);
m_pFunction->PushCell(m_hMenuHandle); m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_SelectOption); m_pFunction->PushCell(TopMenuAction_SelectOption);
m_pFunction->PushCell(object_id); m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client); m_pFunction->PushCell(client);
m_pFunction->PushString(""); m_pFunction->PushString("");
m_pFunction->PushCell(0); m_pFunction->PushCell(0);
m_pFunction->Execute(NULL); m_pFunction->Execute(NULL);
playerhelpers->SetReplyTo(old_reply); playerhelpers->SetReplyTo(old_reply);
} }
void OnTopMenuObjectRemoved(ITopMenu *menu, unsigned int object_id) void OnTopMenuObjectRemoved(ITopMenu *menu, unsigned int object_id)
{ {
m_pFunction->PushCell(m_hMenuHandle); m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_RemoveObject); m_pFunction->PushCell(TopMenuAction_RemoveObject);
m_pFunction->PushCell(object_id); m_pFunction->PushCell(object_id);
m_pFunction->PushCell(0); m_pFunction->PushCell(0);
m_pFunction->PushString(""); m_pFunction->PushString("");
m_pFunction->PushCell(0); m_pFunction->PushCell(0);
m_pFunction->Execute(NULL); m_pFunction->Execute(NULL);
delete this; delete this;
} }
Handle_t m_hMenuHandle; Handle_t m_hMenuHandle;
IPluginFunction *m_pFunction; IPluginFunction *m_pFunction;
}; };
static cell_t CreateTopMenu(IPluginContext *pContext, const cell_t *params) static cell_t CreateTopMenu(IPluginContext *pContext, const cell_t *params)
{ {
IPluginFunction *func = pContext->GetFunctionById(params[1]); IPluginFunction *func = pContext->GetFunctionById(params[1]);
if (func == NULL) if (func == NULL)
{ {
return pContext ->ThrowNativeError("Invalid function specified"); return pContext ->ThrowNativeError("Invalid function specified");
} }
TopMenuCallbacks *cb = new TopMenuCallbacks(func); TopMenuCallbacks *cb = new TopMenuCallbacks(func);
ITopMenu *pMenu = g_TopMenus.CreateTopMenu(cb); ITopMenu *pMenu = g_TopMenus.CreateTopMenu(cb);
if (!pMenu) if (!pMenu)
{ {
delete cb; delete cb;
return BAD_HANDLE; return BAD_HANDLE;
} }
Handle_t hndl = handlesys->CreateHandle(hTopMenuType, Handle_t hndl = handlesys->CreateHandle(hTopMenuType,
pMenu, pMenu,
pContext->GetIdentity(), pContext->GetIdentity(),
myself->GetIdentity(), myself->GetIdentity(),
NULL); NULL);
if (hndl == 0) if (hndl == 0)
{ {
g_TopMenus.DestroyTopMenu(pMenu); g_TopMenus.DestroyTopMenu(pMenu);
return BAD_HANDLE; return BAD_HANDLE;
} }
cb->m_hMenuHandle = hndl; cb->m_hMenuHandle = hndl;
return hndl; return hndl;
} }
static cell_t LoadTopMenuConfig(IPluginContext *pContext, const cell_t *params) static cell_t LoadTopMenuConfig(IPluginContext *pContext, const cell_t *params)
{ {
HandleError err; HandleError err;
ITopMenu *pMenu; ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu)) if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
} }
char *file, *err_buf; char *file, *err_buf;
pContext->LocalToString(params[2], &file); pContext->LocalToString(params[2], &file);
pContext->LocalToString(params[3], &err_buf); pContext->LocalToString(params[3], &err_buf);
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file); g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
return pMenu->LoadConfiguration(path, err_buf, params[4]) ? 1 : 0; return pMenu->LoadConfiguration(path, err_buf, params[4]) ? 1 : 0;
} }
static cell_t AddToTopMenu(IPluginContext *pContext, const cell_t *params) static cell_t AddToTopMenu(IPluginContext *pContext, const cell_t *params)
{ {
HandleError err; HandleError err;
ITopMenu *pMenu; ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu)) if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
} }
IPluginFunction *func = pContext->GetFunctionById(params[4]); IPluginFunction *func = pContext->GetFunctionById(params[4]);
if (func == NULL) if (func == NULL)
{ {
return pContext ->ThrowNativeError("Invalid function specified"); return pContext ->ThrowNativeError("Invalid function specified");
} }
TopMenuCallbacks *cb = new TopMenuCallbacks(func); TopMenuCallbacks *cb = new TopMenuCallbacks(func);
char *name, *cmdname, *info_string = NULL; char *name, *cmdname, *info_string = NULL;
pContext->LocalToString(params[2], &name); pContext->LocalToString(params[2], &name);
pContext->LocalToString(params[6], &cmdname); pContext->LocalToString(params[6], &cmdname);
if (params[0] >= 8) if (params[0] >= 8)
{ {
pContext->LocalToString(params[8], &info_string); pContext->LocalToString(params[8], &info_string);
} }
TopMenuObjectType obj_type = (TopMenuObjectType)params[3]; TopMenuObjectType obj_type = (TopMenuObjectType)params[3];
unsigned int object_id; unsigned int object_id;
if ((object_id = pMenu->AddToMenu2(name, if ((object_id = pMenu->AddToMenu2(name,
obj_type, obj_type,
cb, cb,
pContext->GetIdentity(), pContext->GetIdentity(),
cmdname, cmdname,
params[7], params[7],
params[5], params[5],
info_string)) == 0) info_string)) == 0)
{ {
delete cb; delete cb;
return 0; return 0;
} }
cb->m_hMenuHandle = params[1]; cb->m_hMenuHandle = params[1];
return object_id; return object_id;
} }
static cell_t RemoveFromTopMenu(IPluginContext *pContext, const cell_t *params) static cell_t RemoveFromTopMenu(IPluginContext *pContext, const cell_t *params)
{ {
HandleError err; HandleError err;
ITopMenu *pMenu; ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu)) if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
} }
pMenu->RemoveFromMenu(params[2]); pMenu->RemoveFromMenu(params[2]);
return 1; return 1;
} }
static cell_t FindTopMenuCategory(IPluginContext *pContext, const cell_t *params) static cell_t FindTopMenuCategory(IPluginContext *pContext, const cell_t *params)
{ {
HandleError err; HandleError err;
ITopMenu *pMenu; ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu)) if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
} }
char *name; char *name;
pContext->LocalToString(params[2], &name); pContext->LocalToString(params[2], &name);
return pMenu->FindCategory(name); return pMenu->FindCategory(name);
} }
static cell_t DisplayTopMenu(IPluginContext *pContext, const cell_t *params) static cell_t DisplayTopMenu(IPluginContext *pContext, const cell_t *params)
{ {
HandleError err; HandleError err;
ITopMenu *pMenu; ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu)) if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
} }
int client = params[2]; int client = params[2];
IGamePlayer *player = playerhelpers->GetGamePlayer(client); IGamePlayer *player = playerhelpers->GetGamePlayer(client);
if (!player) if (!player)
{ {
return pContext->ThrowNativeError("Invalid client index %d", client); return pContext->ThrowNativeError("Invalid client index %d", client);
} }
else if (!player->IsInGame()) else if (!player->IsInGame())
{ {
return pContext->ThrowNativeError("Client %d is not in game", client); return pContext->ThrowNativeError("Client %d is not in game", client);
} }
return pMenu->DisplayMenu(client, 0, (TopMenuPosition)params[3]); return pMenu->DisplayMenu(client, 0, (TopMenuPosition)params[3]);
} }
static cell_t GetTopMenuInfoString(IPluginContext *pContext, const cell_t *params) static cell_t GetTopMenuInfoString(IPluginContext *pContext, const cell_t *params)
{ {
HandleError err; HandleError err;
ITopMenu *pMenu; ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu)) if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None) != HandleError_None)
{ {
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
} }
const char *str; const char *str;
if ((str = pMenu->GetObjectInfoString(params[2])) == NULL) if ((str = pMenu->GetObjectInfoString(params[2])) == NULL)
{ {
return pContext->ThrowNativeError("Invalid menu object %d", params[2]); return pContext->ThrowNativeError("Invalid menu object %d", params[2]);
} }
char *buffer; char *buffer;
pContext->LocalToString(params[3], &buffer); pContext->LocalToString(params[3], &buffer);
return strncopy(buffer, str, params[4]); return strncopy(buffer, str, params[4]);
} }
sp_nativeinfo_t g_TopMenuNatives[] = static cell_t GetTopMenuName(IPluginContext *pContext, const cell_t *params)
{ {
{"AddToTopMenu", AddToTopMenu}, HandleError err;
{"CreateTopMenu", CreateTopMenu}, ITopMenu *pMenu;
{"DisplayTopMenu", DisplayTopMenu}, HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
{"LoadTopMenuConfig", LoadTopMenuConfig},
{"RemoveFromTopMenu", RemoveFromTopMenu}, if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
{"FindTopMenuCategory", FindTopMenuCategory}, != HandleError_None)
{"GetTopMenuInfoString", GetTopMenuInfoString}, {
{NULL, NULL}, return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}; }
const char *str;
if ((str = pMenu->GetObjectName(params[2])) == NULL)
{
return pContext->ThrowNativeError("Invalid menu object %d", params[2]);
}
char *buffer;
pContext->LocalToString(params[3], &buffer);
return strncopy(buffer, str, params[4]);
}
sp_nativeinfo_t g_TopMenuNatives[] =
{
{"AddToTopMenu", AddToTopMenu},
{"CreateTopMenu", CreateTopMenu},
{"DisplayTopMenu", DisplayTopMenu},
{"LoadTopMenuConfig", LoadTopMenuConfig},
{"RemoveFromTopMenu", RemoveFromTopMenu},
{"FindTopMenuCategory", FindTopMenuCategory},
{"GetTopMenuInfoString", GetTopMenuInfoString},
{"GetTopMenuName", GetTopMenuName},
{NULL, NULL},
};

View File

@ -1,277 +1,290 @@
/** /**
* vim: set ts=4 : * vim: set ts=4 :
* ============================================================================= * =============================================================================
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
* ============================================================================= * =============================================================================
* *
* This file is part of the SourceMod/SourcePawn SDK. * This file is part of the SourceMod/SourcePawn SDK.
* *
* This program is free software; you can redistribute it and/or modify it under * 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 * the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation. * Free Software Foundation.
* *
* This program is distributed in the hope that it will be useful, but WITHOUT * 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 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details. * details.
* *
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
* *
* As a special exception, AlliedModders LLC gives you permission to link the * 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 * 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 * "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 * by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants * all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further * this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>. * or <http://www.sourcemod.net/license.php>.
* *
* Version: $Id$ * Version: $Id$
*/ */
#if defined _topmenus_included #if defined _topmenus_included
#endinput #endinput
#endif #endif
#define _topmenus_included #define _topmenus_included
#include <menus> #include <menus>
/** /**
* Actions a top menu will take on an object. * Actions a top menu will take on an object.
*/ */
enum TopMenuAction enum TopMenuAction
{ {
/** /**
* An option is being drawn for a menu (or for sorting purposes). * An option is being drawn for a menu (or for sorting purposes).
* *
* INPUT : TopMenu Handle, object ID, client index. * INPUT : TopMenu Handle, object ID, client index.
* OUTPUT: Buffer for rendering, maxlength of buffer. * OUTPUT: Buffer for rendering, maxlength of buffer.
*/ */
TopMenuAction_DisplayOption = 0, TopMenuAction_DisplayOption = 0,
/** /**
* The title of a menu is being drawn for a given object. * The title of a menu is being drawn for a given object.
* *
* Note: The Object ID will be INVALID_TOPMENUOBJECT if drawing the * Note: The Object ID will be INVALID_TOPMENUOBJECT if drawing the
* root title. Otherwise, the Object ID is a category. * root title. Otherwise, the Object ID is a category.
* *
* INPUT : TopMenu Handle, object ID, client index. * INPUT : TopMenu Handle, object ID, client index.
* OUTPUT: Buffer for rendering, maxlength of buffer. * OUTPUT: Buffer for rendering, maxlength of buffer.
*/ */
TopMenuAction_DisplayTitle = 1, TopMenuAction_DisplayTitle = 1,
/** /**
* A menu option has been selected. * A menu option has been selected.
* *
* The Object ID will always be an item (not a category). * The Object ID will always be an item (not a category).
* *
* INPUT : TopMenu Handle, object ID, client index. * INPUT : TopMenu Handle, object ID, client index.
*/ */
TopMenuAction_SelectOption = 2, TopMenuAction_SelectOption = 2,
/** /**
* A menu option is being drawn and its flags can be overridden. * A menu option is being drawn and its flags can be overridden.
* *
* INPUT : TopMenu Handle, object ID, client index. * INPUT : TopMenu Handle, object ID, client index.
* OUTPUT: The first byte of the 'buffer' string should be set * OUTPUT: The first byte of the 'buffer' string should be set
* to the desired flags. By default, it will contain * to the desired flags. By default, it will contain
* ITEMDRAW_DEFAULT. * ITEMDRAW_DEFAULT.
*/ */
TopMenuAction_DrawOption = 3, TopMenuAction_DrawOption = 3,
/** /**
* Called when an object is being removed from the menu. * Called when an object is being removed from the menu.
* This can be used to clean up data stored in the info string. * This can be used to clean up data stored in the info string.
* *
* INPUT : TopMenu Handle, object ID. * INPUT : TopMenu Handle, object ID.
*/ */
TopMenuAction_RemoveObject = 4, TopMenuAction_RemoveObject = 4,
}; };
/** /**
* Top menu object types. * Top menu object types.
*/ */
enum TopMenuObjectType enum TopMenuObjectType
{ {
TopMenuObject_Category = 0, /**< Category (sub-menu branching from root) */ TopMenuObject_Category = 0, /**< Category (sub-menu branching from root) */
TopMenuObject_Item = 1 /**< Item on a sub-menu */ TopMenuObject_Item = 1 /**< Item on a sub-menu */
}; };
/** /**
* Top menu starting positions for display. * Top menu starting positions for display.
*/ */
enum TopMenuPosition enum TopMenuPosition
{ {
TopMenuPosition_Start = 0, /**< Start/root of the menu */ TopMenuPosition_Start = 0, /**< Start/root of the menu */
TopMenuPosition_LastRoot = 1, /**< Last position in the root menu */ TopMenuPosition_LastRoot = 1, /**< Last position in the root menu */
TopMenuPosition_LastCategory = 3, /**< Last position in their last category */ TopMenuPosition_LastCategory = 3, /**< Last position in their last category */
}; };
/** /**
* Top menu object tag for type checking. * Top menu object tag for type checking.
*/ */
enum TopMenuObject enum TopMenuObject
{ {
INVALID_TOPMENUOBJECT = 0, INVALID_TOPMENUOBJECT = 0,
} }
/** /**
* TopMenu callback prototype. * TopMenu callback prototype.
* *
* @param topmenu Handle to the TopMenu. * @param topmenu Handle to the TopMenu.
* @param action TopMenuAction being performed. * @param action TopMenuAction being performed.
* @param object_id The object ID (if used). * @param object_id The object ID (if used).
* @param param Extra parameter (if used). * @param param Extra parameter (if used).
* @param buffer Output buffer (if used). * @param buffer Output buffer (if used).
* @param maxlength Output buffer (if used). * @param maxlength Output buffer (if used).
* @noreturn * @noreturn
*/ */
functag TopMenuHandler public(Handle:topmenu, functag TopMenuHandler public(Handle:topmenu,
TopMenuAction:action, TopMenuAction:action,
TopMenuObject:object_id, TopMenuObject:object_id,
param, param,
String:buffer[], String:buffer[],
maxlength); maxlength);
/** /**
* Creates a TopMenu. * Creates a TopMenu.
* *
* @param handler Handler to use for drawing the root title. * @param handler Handler to use for drawing the root title.
* @return A new TopMenu Handle, or INVALID_HANDLE on failure. * @return A new TopMenu Handle, or INVALID_HANDLE on failure.
*/ */
native Handle:CreateTopMenu(TopMenuHandler:handler); native Handle:CreateTopMenu(TopMenuHandler:handler);
/** /**
* Re-sorts the items in a TopMenu via a configuration file. * Re-sorts the items in a TopMenu via a configuration file.
* *
* The format of the configuration file should be a Valve Key-Values * The format of the configuration file should be a Valve Key-Values
* formatted file that SourceMod can parse. There should be one root * formatted file that SourceMod can parse. There should be one root
* section, and one sub-section for each category. Each sub-section's * section, and one sub-section for each category. Each sub-section's
* name should match the category name. * name should match the category name.
* *
* Each sub-section may only contain key/value pairs in the form of: * Each sub-section may only contain key/value pairs in the form of:
* key: "item" * key: "item"
* value: Name of the item as passed to AddToTopMenu(). * value: Name of the item as passed to AddToTopMenu().
* *
* The TopMenu will draw items in the order declared in the configuration * The TopMenu will draw items in the order declared in the configuration
* file. If items do not appear in the configuration file, they are sorted * file. If items do not appear in the configuration file, they are sorted
* per-player based on how the handler function renders for that player. * per-player based on how the handler function renders for that player.
* These items appear after the configuration sorted items. * These items appear after the configuration sorted items.
* *
* @param topmenu TopMenu Handle. * @param topmenu TopMenu Handle.
* @param file File path. * @param file File path.
* @param error Error buffer. * @param error Error buffer.
* @param maxlength Maximum size of the error buffer. * @param maxlength Maximum size of the error buffer.
* Error buffer will be filled with a * Error buffer will be filled with a
* zero-terminated string if false is * zero-terminated string if false is
* returned. * returned.
* @return True on success, false on failure. * @return True on success, false on failure.
* @error Invalid TopMenu Handle. * @error Invalid TopMenu Handle.
*/ */
native bool:LoadTopMenuConfig(Handle:topmenu, const String:file[], String:error[], maxlength); native bool:LoadTopMenuConfig(Handle:topmenu, const String:file[], String:error[], maxlength);
/** /**
* Adds an object to a TopMenu. * Adds an object to a TopMenu.
* *
* @param topmenu TopMenu Handle. * @param topmenu TopMenu Handle.
* @param name Object name (MUST be unique). * @param name Object name (MUST be unique).
* @param type Object type. * @param type Object type.
* @param handler Handler for object. * @param handler Handler for object.
* @param cmdname Command name (for access overrides). * @param cmdname Command name (for access overrides).
* @param flags Default access flags. * @param flags Default access flags.
* @param parent Parent object ID, or INVALID_TOPMENUOBJECT for none. * @param parent Parent object ID, or INVALID_TOPMENUOBJECT for none.
* Items must have a category parent. * Items must have a category parent.
* Categories must not have a parent. * Categories must not have a parent.
* @param info_string Arbitrary storage (max 255 bytes). * @param info_string Arbitrary storage (max 255 bytes).
* @return A new TopMenuObject ID, or INVALID_TOPMENUOBJECT on * @return A new TopMenuObject ID, or INVALID_TOPMENUOBJECT on
* failure. * failure.
* @error Invalid TopMenu Handle. * @error Invalid TopMenu Handle.
*/ */
native TopMenuObject:AddToTopMenu(Handle:topmenu, native TopMenuObject:AddToTopMenu(Handle:topmenu,
const String:name[], const String:name[],
TopMenuObjectType:type, TopMenuObjectType:type,
TopMenuHandler:handler, TopMenuHandler:handler,
TopMenuObject:parent, TopMenuObject:parent,
const String:cmdname[]="", const String:cmdname[]="",
flags=0, flags=0,
const String:info_string[]=""); const String:info_string[]="");
/** /**
* Retrieves the info string of a top menu item. * Retrieves the info string of a top menu item.
* *
* @param topmenu TopMenu Handle. * @param topmenu TopMenu Handle.
* @param object TopMenuObject ID. * @param object TopMenuObject ID.
* @param buffer Buffer to store info string. * @param buffer Buffer to store info string.
* @param maxlength Maximum size of info string. * @param maxlength Maximum size of info string.
* @return Number of bytes written, not including the * @return Number of bytes written, not including the
* null terminator. * null terminator.
* @error Invalid TopMenu Handle or TopMenuObject ID. * @error Invalid TopMenu Handle or TopMenuObject ID.
*/ */
native GetTopMenuInfoString(Handle:topmenu, TopMenuObject:parent, String:buffer[], maxlength); native GetTopMenuInfoString(Handle:topmenu, TopMenuObject:parent, String:buffer[], maxlength);
/** /**
* Removes an object from a TopMenu. * Retrieves the name string of a top menu item.
* *
* Plugins' objects are automatically removed all TopMenus when the given * @param topmenu TopMenu Handle.
* plugin unloads or pauses. In the case of unpausing, all items are restored. * @param object TopMenuObject ID.
* * @param buffer Buffer to store info string.
* @param topmenu TopMenu Handle. * @param maxlength Maximum size of info string.
* @param object TopMenuObject ID. * @return Number of bytes written, not including the
* @noreturn * null terminator.
* @error Invalid TopMenu Handle. * @error Invalid TopMenu Handle or TopMenuObject ID.
*/ */
native RemoveFromTopMenu(Handle:topmenu, TopMenuObject:object); native GetTopMenuName(Handle:topmenu, TopMenuObject:parent, String:buffer[], maxlength);
/** /**
* Displays a TopMenu to a client. * Removes an object from a TopMenu.
* *
* @param topmenu TopMenu Handle. * Plugins' objects are automatically removed all TopMenus when the given
* @param client Client index. * plugin unloads or pauses. In the case of unpausing, all items are restored.
* @param position Position to display from. *
* @return True on success, false on failure. * @param topmenu TopMenu Handle.
* @error Invalid TopMenu Handle or client not in game. * @param object TopMenuObject ID.
*/ * @noreturn
native bool:DisplayTopMenu(Handle:topmenu, client, TopMenuPosition:position); * @error Invalid TopMenu Handle.
*/
/** native RemoveFromTopMenu(Handle:topmenu, TopMenuObject:object);
* Finds a category's object ID in a TopMenu.
* /**
* @param topmenu TopMenu Handle. * Displays a TopMenu to a client.
* @param name Object's unique name. *
* @return TopMenuObject ID on success, or * @param topmenu TopMenu Handle.
* INVALID_TOPMENUOBJECT on failure. * @param client Client index.
* @error Invalid TopMenu Handle. * @param position Position to display from.
*/ * @return True on success, false on failure.
native TopMenuObject:FindTopMenuCategory(Handle:topmenu, const String:name[]); * @error Invalid TopMenu Handle or client not in game.
*/
/** native bool:DisplayTopMenu(Handle:topmenu, client, TopMenuPosition:position);
* Do not edit below this line!
*/ /**
public Extension:__ext_topmenus = * Finds a category's object ID in a TopMenu.
{ *
name = "TopMenus", * @param topmenu TopMenu Handle.
file = "topmenus.ext", * @param name Object's unique name.
#if defined AUTOLOAD_EXTENSIONS * @return TopMenuObject ID on success, or
autoload = 1, * INVALID_TOPMENUOBJECT on failure.
#else * @error Invalid TopMenu Handle.
autoload = 0, */
#endif native TopMenuObject:FindTopMenuCategory(Handle:topmenu, const String:name[]);
#if defined REQUIRE_EXTENSIONS
required = 1, /**
#else * Do not edit below this line!
required = 0, */
#endif public Extension:__ext_topmenus =
}; {
name = "TopMenus",
#if !defined REQUIRE_EXTENSIONS file = "topmenus.ext",
public __ext_topmenus_SetNTVOptional() #if defined AUTOLOAD_EXTENSIONS
{ autoload = 1,
MarkNativeAsOptional("CreateTopMenu"); #else
MarkNativeAsOptional("LoadTopMenuConfig"); autoload = 0,
MarkNativeAsOptional("AddToTopMenu"); #endif
MarkNativeAsOptional("RemoveFromTopMenu"); #if defined REQUIRE_EXTENSIONS
MarkNativeAsOptional("DisplayTopMenu"); required = 1,
MarkNativeAsOptional("FindTopMenuCategory"); #else
} required = 0,
#endif #endif
};
#if !defined REQUIRE_EXTENSIONS
public __ext_topmenus_SetNTVOptional()
{
MarkNativeAsOptional("CreateTopMenu");
MarkNativeAsOptional("LoadTopMenuConfig");
MarkNativeAsOptional("AddToTopMenu");
MarkNativeAsOptional("RemoveFromTopMenu");
MarkNativeAsOptional("DisplayTopMenu");
MarkNativeAsOptional("FindTopMenuCategory");
}
#endif