Added more missing svn:keywords properties to some files (this should be the last of them before I never have to do this again)

Moved sm_memtable files in sqlite extension to sdk directory (to be consistent with topmenus)
Some extension source files had an incorrect extension name in their headers

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402037
This commit is contained in:
Scott Ehlert
2008-04-11 17:16:36 +00:00
parent 0c5e4b5a2f
commit c473d75d3d
61 changed files with 3599 additions and 3443 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* SourceMod Counter-Strike:Source Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* SourceMod Counter-Strike:Source Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+155 -155
View File
@@ -1,155 +1,155 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SQLite Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include "pcre.h"
#include "CRegEx.h"
#include <sh_string.h>
#include "extension.h"
RegEx::RegEx()
{
mErrorOffset = 0;
mError = NULL;
re = NULL;
mFree = true;
subject = NULL;
mSubStrings = 0;
}
void RegEx::Clear ()
{
mErrorOffset = 0;
mError = NULL;
if (re)
pcre_free(re);
re = NULL;
mFree = true;
if (subject)
delete [] subject;
subject = NULL;
mSubStrings = 0;
}
RegEx::~RegEx()
{
Clear();
}
bool RegEx::isFree(bool set, bool val)
{
if (set)
{
mFree = val;
return true;
} else {
return mFree;
}
}
int RegEx::Compile(const char *pattern, int iFlags)
{
if (!mFree)
Clear();
re = pcre_compile(pattern, iFlags, &mError, &mErrorOffset, NULL);
if (re == NULL)
{
return 0;
}
mFree = false;
return 1;
}
int RegEx::Match(const char *str)
{
int rc = 0;
if (mFree || re == NULL)
return -1;
this->ClearMatch();
//save str
subject = new char[strlen(str)+1];
strcpy(subject, str);
rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 0, 0, ovector, 30);
if (rc < 0)
{
if (rc == PCRE_ERROR_NOMATCH)
{
return 0;
} else {
mErrorOffset = rc;
return -1;
}
}
mSubStrings = rc;
return 1;
}
void RegEx::ClearMatch()
{
// Clears match results
mErrorOffset = 0;
mError = NULL;
if (subject)
delete [] subject;
subject = NULL;
mSubStrings = 0;
}
const char *RegEx::GetSubstring(int s, char buffer[], int max)
{
int i = 0;
if (s >= mSubStrings || s < 0)
return NULL;
char *substr_a = subject + ovector[2*s];
int substr_l = ovector[2*s+1] - ovector[2*s];
for (i = 0; i<substr_l; i++)
{
if (i >= max)
break;
buffer[i] = substr_a[i];
}
buffer[i] = '\0';
return buffer;
}
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include "pcre.h"
#include "CRegEx.h"
#include <sh_string.h>
#include "extension.h"
RegEx::RegEx()
{
mErrorOffset = 0;
mError = NULL;
re = NULL;
mFree = true;
subject = NULL;
mSubStrings = 0;
}
void RegEx::Clear ()
{
mErrorOffset = 0;
mError = NULL;
if (re)
pcre_free(re);
re = NULL;
mFree = true;
if (subject)
delete [] subject;
subject = NULL;
mSubStrings = 0;
}
RegEx::~RegEx()
{
Clear();
}
bool RegEx::isFree(bool set, bool val)
{
if (set)
{
mFree = val;
return true;
} else {
return mFree;
}
}
int RegEx::Compile(const char *pattern, int iFlags)
{
if (!mFree)
Clear();
re = pcre_compile(pattern, iFlags, &mError, &mErrorOffset, NULL);
if (re == NULL)
{
return 0;
}
mFree = false;
return 1;
}
int RegEx::Match(const char *str)
{
int rc = 0;
if (mFree || re == NULL)
return -1;
this->ClearMatch();
//save str
subject = new char[strlen(str)+1];
strcpy(subject, str);
rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 0, 0, ovector, 30);
if (rc < 0)
{
if (rc == PCRE_ERROR_NOMATCH)
{
return 0;
} else {
mErrorOffset = rc;
return -1;
}
}
mSubStrings = rc;
return 1;
}
void RegEx::ClearMatch()
{
// Clears match results
mErrorOffset = 0;
mError = NULL;
if (subject)
delete [] subject;
subject = NULL;
mSubStrings = 0;
}
const char *RegEx::GetSubstring(int s, char buffer[], int max)
{
int i = 0;
if (s >= mSubStrings || s < 0)
return NULL;
char *substr_a = subject + ovector[2*s];
int substr_l = ovector[2*s+1] - ovector[2*s];
for (i = 0; i<substr_l; i++)
{
if (i >= max)
break;
buffer[i] = substr_a[i];
}
buffer[i] = '\0';
return buffer;
}
+59 -59
View File
@@ -1,59 +1,59 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SQLite Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_CREGEX_H
#define _INCLUDE_CREGEX_H
class RegEx
{
public:
RegEx();
~RegEx();
bool isFree(bool set=false, bool val=false);
void Clear();
int Compile(const char *pattern, int iFlags);
int Match(const char *str);
void ClearMatch();
const char *GetSubstring(int s, char buffer[], int max);
public:
int mErrorOffset;
const char *mError;
int mSubStrings;
private:
pcre *re;
bool mFree;
int ovector[30];
char *subject;
};
#endif //_INCLUDE_CREGEX_H
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_CREGEX_H
#define _INCLUDE_CREGEX_H
class RegEx
{
public:
RegEx();
~RegEx();
bool isFree(bool set=false, bool val=false);
void Clear();
int Compile(const char *pattern, int iFlags);
int Match(const char *str);
void ClearMatch();
const char *GetSubstring(int s, char buffer[], int max);
public:
int mErrorOffset;
const char *mError;
int mSubStrings;
private:
pcre *re;
bool mFree;
int ovector[30];
char *subject;
};
#endif //_INCLUDE_CREGEX_H
+2 -2
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
@@ -38,7 +38,7 @@ using namespace SourceHook;
/**
* @file extension.cpp
* @brief Implement extension code here.
* @brief Implement Regex extension code here.
*/
RegexExtension g_RegexExtension; /**< Global singleton for extension's main interface */
+2 -2
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
@@ -34,7 +34,7 @@
/**
* @file extension.h
* @brief Sample extension code header.
* @brief Regex extension code header.
*/
#include "smsdk_ext.h"
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SQLite Extension
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SQLite Extension
* SourceMod Regular Expressions Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+1 -1
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+1 -1
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+1 -1
View File
@@ -2,7 +2,7 @@
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+1 -1
View File
@@ -17,7 +17,7 @@ PROJECT = dbi.sqlite
#Uncomment for Metamod: Source enabled extension
#USEMETA = true
OBJECTS = sdk/smsdk_ext.cpp extension.cpp sm_memtable.cpp \
OBJECTS = sdk/smsdk_ext.cpp sdk/sm_memtable.cpp extension.cpp \
driver/SqDatabase.cpp driver/SqDriver.cpp driver/SqQuery.cpp \
driver/SqResults.cpp
+8 -8
View File
@@ -189,10 +189,6 @@
RelativePath="..\extension.cpp"
>
</File>
<File
RelativePath="..\sm_memtable.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
@@ -203,10 +199,6 @@
RelativePath="..\extension.h"
>
</File>
<File
RelativePath="..\sm_memtable.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
@@ -226,6 +218,14 @@
Name="SourceMod SDK"
UniqueIdentifier="{31958233-BB2D-4e41-A8F9-CE8A4684F436}"
>
<File
RelativePath="..\sdk\sm_memtable.cpp"
>
</File>
<File
RelativePath="..\sdk\sm_memtable.h"
>
</File>
<File
RelativePath="..\sdk\smsdk_config.h"
>
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod TF2 Extension
* SourceMod Team Fortress 2 Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod TF2 Extension
* SourceMod Team Fortress 2 Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+2 -2
View File
@@ -1,8 +1,8 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* SourceMod Team Fortress 2 Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Team Fortress 2 Extension
* SourceMod Base Extension Code
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Team Fortress 2 Extension
* SourceMod Base Extension Code
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+2 -2
View File
@@ -1,8 +1,8 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* SourceMod Team Fortress 2 Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+2 -2
View File
@@ -1,8 +1,8 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SDKTools Extension
* Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
* SourceMod Team Fortress 2 Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
+2 -2
View File
@@ -17,8 +17,8 @@ PROJECT = topmenus
#Uncomment for Metamod: Source enabled extension
#USEMETA = true
OBJECTS = sdk/smsdk_ext.cpp extension.cpp TopMenuManager.cpp TopMenu.cpp \
sdk/sm_memtable.cpp smn_topmenus.cpp
OBJECTS = sdk/smsdk_ext.cpp sdk/sm_memtable.cpp extension.cpp TopMenuManager.cpp \
TopMenu.cpp smn_topmenus.cpp
##############################################
### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
File diff suppressed because it is too large Load Diff
+181 -181
View File
@@ -1,181 +1,181 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_TOP_MENU_H_
#define _INCLUDE_SOURCEMOD_TOP_MENU_H_
#include <sh_list.h>
#include <sh_vector.h>
#include <sm_trie_tpl.h>
#include <ITopMenus.h>
#include "smsdk_ext.h"
#include "sm_memtable.h"
using namespace SourceHook;
using namespace SourceMod;
struct config_category_t
{
int name;
CVector<int> commands;
};
struct config_root_t
{
config_root_t() : strings(1024)
{
}
BaseStringTable strings;
CVector<config_category_t *> cats;
};
struct topmenu_object_t
{
char name[64]; /** Name */
char cmdname[64]; /** Command name */
FlagBits flags; /** Admin flags */
ITopMenuObjectCallbacks *callbacks; /** Callbacks */
IdentityToken_t *owner; /** Owner */
unsigned int object_id; /** Object ID */
topmenu_object_t *parent; /** Parent, if any */
TopMenuObjectType type; /** Object Type */
bool is_free; /** Free or not? */
char info[255]; /** Info string */
};
struct topmenu_category_t
{
CVector<topmenu_object_t *> obj_list; /** Full object list */
CVector<topmenu_object_t *> sorted; /** Sorted items */
CVector<topmenu_object_t *> unsorted; /** Unsorted items */
topmenu_object_t *obj; /** Bound object */
unsigned int serial; /** Serial number */
bool reorder; /** Whether ordering needs updating */
};
struct topmenu_player_category_t
{
IBaseMenu *menu; /** menu pointer */
unsigned int serial; /** last known serial */
};
struct topmenu_player_t
{
int user_id; /** userid on server */
unsigned int menu_serial; /** menu serial no */
IBaseMenu *root; /** root menu display */
topmenu_player_category_t *cats; /** category display */
unsigned int cat_count; /** number of categories */
unsigned int last_category; /** last category they selected */
unsigned int last_position; /** last position in that category */
unsigned int last_root_pos; /** last page in the root menu */
};
class TopMenu :
public ITopMenu,
public IMenuHandler,
public ITextListener_SMC
{
friend class TopMenuManager;
public:
TopMenu(ITopMenuObjectCallbacks *callbacks);
~TopMenu();
public: //ITopMenu
virtual unsigned int AddToMenu(const char *name,
TopMenuObjectType type,
ITopMenuObjectCallbacks *callbacks,
IdentityToken_t *owner,
const char *cmdname,
FlagBits flags,
unsigned int parent);
unsigned int AddToMenu2(const char *name,
TopMenuObjectType type,
ITopMenuObjectCallbacks *callbacks,
IdentityToken_t *owner,
const char *cmdname,
FlagBits flags,
unsigned int parent,
const char *info_string);
virtual void RemoveFromMenu(unsigned int object_id);
virtual bool DisplayMenu(int client,
unsigned int hold_time,
TopMenuPosition position);
virtual bool LoadConfiguration(const char *file, char *error, size_t maxlength);
virtual unsigned int FindCategory(const char *name);
const char *GetObjectInfoString(unsigned int object_id);
const char *GetObjectName(unsigned int object_id);
public: //IMenuHandler
virtual void OnMenuSelect2(IBaseMenu *menu, int client, unsigned int item, unsigned int item_on_page);
virtual void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style);
virtual unsigned int OnMenuDisplayItem(IBaseMenu *menu,
int client,
IMenuPanel *panel,
unsigned int item,
const ItemDrawInfo &dr);
virtual void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason);
public: //ITextListener_SMC
void ReadSMC_ParseStart();
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
SMCResult ReadSMC_LeavingSection(const SMCStates *states);
public:
unsigned int CalcMemUsage();
private:
void SortCategoriesIfNeeded();
void SortCategoryIfNeeded(unsigned int category);
private:
bool DisplayCategory(int client, unsigned int category, unsigned int hold_time, bool last_position);
void CreatePlayers(int max_clients);
void UpdateClientRoot(int client, IGamePlayer *pGamePlayer=NULL);
void UpdateClientCategory(int client, unsigned int category);
void TearDownClient(topmenu_player_t *player);
private:
void OnClientConnected(int client);
void OnClientDisconnected(int client);
void OnServerActivated(int max_clients);
bool OnIdentityRemoval(IdentityToken_t *owner);
private:
config_root_t m_Config; /* Configuration from file */
topmenu_player_t *m_clients; /* Client array */
CVector<unsigned int> m_SortedCats; /* Sorted categories */
CVector<unsigned int> m_UnsortedCats; /* Un-sorted categories */
CVector<topmenu_category_t *> m_Categories; /* Category array */
CVector<topmenu_object_t *> m_Objects; /* Object array */
KTrie<topmenu_object_t *> m_ObjLookup; /* Object lookup trie */
unsigned int m_SerialNo; /* Serial number for updating */
ITopMenuObjectCallbacks *m_pTitle; /* Title callbacks */
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);
#endif //_INCLUDE_SOURCEMOD_TOP_MENU_H_
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_TOP_MENU_H_
#define _INCLUDE_SOURCEMOD_TOP_MENU_H_
#include <sh_list.h>
#include <sh_vector.h>
#include <sm_trie_tpl.h>
#include <ITopMenus.h>
#include "smsdk_ext.h"
#include "sm_memtable.h"
using namespace SourceHook;
using namespace SourceMod;
struct config_category_t
{
int name;
CVector<int> commands;
};
struct config_root_t
{
config_root_t() : strings(1024)
{
}
BaseStringTable strings;
CVector<config_category_t *> cats;
};
struct topmenu_object_t
{
char name[64]; /** Name */
char cmdname[64]; /** Command name */
FlagBits flags; /** Admin flags */
ITopMenuObjectCallbacks *callbacks; /** Callbacks */
IdentityToken_t *owner; /** Owner */
unsigned int object_id; /** Object ID */
topmenu_object_t *parent; /** Parent, if any */
TopMenuObjectType type; /** Object Type */
bool is_free; /** Free or not? */
char info[255]; /** Info string */
};
struct topmenu_category_t
{
CVector<topmenu_object_t *> obj_list; /** Full object list */
CVector<topmenu_object_t *> sorted; /** Sorted items */
CVector<topmenu_object_t *> unsorted; /** Unsorted items */
topmenu_object_t *obj; /** Bound object */
unsigned int serial; /** Serial number */
bool reorder; /** Whether ordering needs updating */
};
struct topmenu_player_category_t
{
IBaseMenu *menu; /** menu pointer */
unsigned int serial; /** last known serial */
};
struct topmenu_player_t
{
int user_id; /** userid on server */
unsigned int menu_serial; /** menu serial no */
IBaseMenu *root; /** root menu display */
topmenu_player_category_t *cats; /** category display */
unsigned int cat_count; /** number of categories */
unsigned int last_category; /** last category they selected */
unsigned int last_position; /** last position in that category */
unsigned int last_root_pos; /** last page in the root menu */
};
class TopMenu :
public ITopMenu,
public IMenuHandler,
public ITextListener_SMC
{
friend class TopMenuManager;
public:
TopMenu(ITopMenuObjectCallbacks *callbacks);
~TopMenu();
public: //ITopMenu
virtual unsigned int AddToMenu(const char *name,
TopMenuObjectType type,
ITopMenuObjectCallbacks *callbacks,
IdentityToken_t *owner,
const char *cmdname,
FlagBits flags,
unsigned int parent);
unsigned int AddToMenu2(const char *name,
TopMenuObjectType type,
ITopMenuObjectCallbacks *callbacks,
IdentityToken_t *owner,
const char *cmdname,
FlagBits flags,
unsigned int parent,
const char *info_string);
virtual void RemoveFromMenu(unsigned int object_id);
virtual bool DisplayMenu(int client,
unsigned int hold_time,
TopMenuPosition position);
virtual bool LoadConfiguration(const char *file, char *error, size_t maxlength);
virtual unsigned int FindCategory(const char *name);
const char *GetObjectInfoString(unsigned int object_id);
const char *GetObjectName(unsigned int object_id);
public: //IMenuHandler
virtual void OnMenuSelect2(IBaseMenu *menu, int client, unsigned int item, unsigned int item_on_page);
virtual void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style);
virtual unsigned int OnMenuDisplayItem(IBaseMenu *menu,
int client,
IMenuPanel *panel,
unsigned int item,
const ItemDrawInfo &dr);
virtual void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason);
public: //ITextListener_SMC
void ReadSMC_ParseStart();
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
SMCResult ReadSMC_LeavingSection(const SMCStates *states);
public:
unsigned int CalcMemUsage();
private:
void SortCategoriesIfNeeded();
void SortCategoryIfNeeded(unsigned int category);
private:
bool DisplayCategory(int client, unsigned int category, unsigned int hold_time, bool last_position);
void CreatePlayers(int max_clients);
void UpdateClientRoot(int client, IGamePlayer *pGamePlayer=NULL);
void UpdateClientCategory(int client, unsigned int category);
void TearDownClient(topmenu_player_t *player);
private:
void OnClientConnected(int client);
void OnClientDisconnected(int client);
void OnServerActivated(int max_clients);
bool OnIdentityRemoval(IdentityToken_t *owner);
private:
config_root_t m_Config; /* Configuration from file */
topmenu_player_t *m_clients; /* Client array */
CVector<unsigned int> m_SortedCats; /* Sorted categories */
CVector<unsigned int> m_UnsortedCats; /* Un-sorted categories */
CVector<topmenu_category_t *> m_Categories; /* Category array */
CVector<topmenu_object_t *> m_Objects; /* Object array */
KTrie<topmenu_object_t *> m_ObjLookup; /* Object lookup trie */
unsigned int m_SerialNo; /* Serial number for updating */
ITopMenuObjectCallbacks *m_pTitle; /* Title callbacks */
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);
#endif //_INCLUDE_SOURCEMOD_TOP_MENU_H_
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+388 -388
View File
@@ -1,388 +1,388 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include "extension.h"
#include "TopMenuManager.h"
#include "TopMenu.h"
HandleType_t hTopMenuType;
class TopMenuHandle : public IHandleTypeDispatch
{
public:
void OnHandleDestroy(HandleType_t type, void *object)
{
ITopMenu *pTopMenu = (ITopMenu *)object;
g_TopMenus.DestroyTopMenu(pTopMenu);
}
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
{
*pSize = ((TopMenu *)object)->CalcMemUsage();
return true;
}
} s_TopMenuHandle;
void Initialize_Natives()
{
hTopMenuType = handlesys->CreateType("ITopMenu",
&s_TopMenuHandle,
0,
NULL,
NULL,
myself->GetIdentity(),
NULL);
}
void Shutdown_Natives()
{
handlesys->RemoveType(hTopMenuType, myself->GetIdentity());
}
enum TopMenuAction
{
TopMenuAction_DisplayOption = 0,
TopMenuAction_DisplayTitle = 1,
TopMenuAction_SelectOption = 2,
TopMenuAction_DrawOption = 3,
TopMenuAction_RemoveObject = 4,
};
class TopMenuCallbacks : public ITopMenuObjectCallbacks
{
public:
TopMenuCallbacks(IPluginFunction *pFunction) : m_pFunction(pFunction)
{
}
unsigned int OnTopMenuDrawOption(ITopMenu *menu,
int client,
unsigned int object_id)
{
char buffer[2] = {ITEMDRAW_DEFAULT, 0x0};
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DrawOption);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, sizeof(buffer), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
m_pFunction->PushCell(sizeof(buffer));
m_pFunction->Execute(NULL);
return (unsigned int)buffer[0];
}
void OnTopMenuDisplayOption(ITopMenu *menu,
int client,
unsigned int object_id,
char buffer[],
size_t maxlength)
{
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DisplayOption);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK);
m_pFunction->PushCell(maxlength);
m_pFunction->Execute(NULL);
}
void OnTopMenuDisplayTitle(ITopMenu *menu,
int client,
unsigned int object_id,
char buffer[],
size_t maxlength)
{
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DisplayTitle);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK);
m_pFunction->PushCell(maxlength);
m_pFunction->Execute(NULL);
}
void OnTopMenuSelectOption(ITopMenu *menu,
int client,
unsigned int object_id)
{
unsigned int old_reply = playerhelpers->SetReplyTo(SM_REPLY_CHAT);
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_SelectOption);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushString("");
m_pFunction->PushCell(0);
m_pFunction->Execute(NULL);
playerhelpers->SetReplyTo(old_reply);
}
void OnTopMenuObjectRemoved(ITopMenu *menu, unsigned int object_id)
{
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_RemoveObject);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(0);
m_pFunction->PushString("");
m_pFunction->PushCell(0);
m_pFunction->Execute(NULL);
delete this;
}
Handle_t m_hMenuHandle;
IPluginFunction *m_pFunction;
};
static cell_t CreateTopMenu(IPluginContext *pContext, const cell_t *params)
{
IPluginFunction *func = pContext->GetFunctionById(params[1]);
if (func == NULL)
{
return pContext ->ThrowNativeError("Invalid function specified");
}
TopMenuCallbacks *cb = new TopMenuCallbacks(func);
ITopMenu *pMenu = g_TopMenus.CreateTopMenu(cb);
if (!pMenu)
{
delete cb;
return BAD_HANDLE;
}
Handle_t hndl = handlesys->CreateHandle(hTopMenuType,
pMenu,
pContext->GetIdentity(),
myself->GetIdentity(),
NULL);
if (hndl == 0)
{
g_TopMenus.DestroyTopMenu(pMenu);
return BAD_HANDLE;
}
cb->m_hMenuHandle = hndl;
return hndl;
}
static cell_t LoadTopMenuConfig(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
char *file, *err_buf;
pContext->LocalToString(params[2], &file);
pContext->LocalToString(params[3], &err_buf);
char path[PLATFORM_MAX_PATH];
g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
return pMenu->LoadConfiguration(path, err_buf, params[4]) ? 1 : 0;
}
static cell_t AddToTopMenu(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
IPluginFunction *func = pContext->GetFunctionById(params[4]);
if (func == NULL)
{
return pContext ->ThrowNativeError("Invalid function specified");
}
TopMenuCallbacks *cb = new TopMenuCallbacks(func);
char *name, *cmdname, *info_string = NULL;
pContext->LocalToString(params[2], &name);
pContext->LocalToString(params[6], &cmdname);
if (params[0] >= 8)
{
pContext->LocalToString(params[8], &info_string);
}
TopMenuObjectType obj_type = (TopMenuObjectType)params[3];
unsigned int object_id;
if ((object_id = pMenu->AddToMenu2(name,
obj_type,
cb,
pContext->GetIdentity(),
cmdname,
params[7],
params[5],
info_string)) == 0)
{
delete cb;
return 0;
}
cb->m_hMenuHandle = params[1];
return object_id;
}
static cell_t RemoveFromTopMenu(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
pMenu->RemoveFromMenu(params[2]);
return 1;
}
static cell_t FindTopMenuCategory(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
char *name;
pContext->LocalToString(params[2], &name);
return pMenu->FindCategory(name);
}
static cell_t DisplayTopMenu(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
int client = params[2];
IGamePlayer *player = playerhelpers->GetGamePlayer(client);
if (!player)
{
return pContext->ThrowNativeError("Invalid client index %d", client);
}
else if (!player->IsInGame())
{
return pContext->ThrowNativeError("Client %d is not in game", client);
}
return pMenu->DisplayMenu(client, 0, (TopMenuPosition)params[3]);
}
static cell_t GetTopMenuInfoString(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
const char *str;
if ((str = pMenu->GetObjectInfoString(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]);
}
static cell_t GetTopMenuName(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
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},
{"GetTopMenuObjName", GetTopMenuName},
{NULL, NULL},
};
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include "extension.h"
#include "TopMenuManager.h"
#include "TopMenu.h"
HandleType_t hTopMenuType;
class TopMenuHandle : public IHandleTypeDispatch
{
public:
void OnHandleDestroy(HandleType_t type, void *object)
{
ITopMenu *pTopMenu = (ITopMenu *)object;
g_TopMenus.DestroyTopMenu(pTopMenu);
}
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
{
*pSize = ((TopMenu *)object)->CalcMemUsage();
return true;
}
} s_TopMenuHandle;
void Initialize_Natives()
{
hTopMenuType = handlesys->CreateType("ITopMenu",
&s_TopMenuHandle,
0,
NULL,
NULL,
myself->GetIdentity(),
NULL);
}
void Shutdown_Natives()
{
handlesys->RemoveType(hTopMenuType, myself->GetIdentity());
}
enum TopMenuAction
{
TopMenuAction_DisplayOption = 0,
TopMenuAction_DisplayTitle = 1,
TopMenuAction_SelectOption = 2,
TopMenuAction_DrawOption = 3,
TopMenuAction_RemoveObject = 4,
};
class TopMenuCallbacks : public ITopMenuObjectCallbacks
{
public:
TopMenuCallbacks(IPluginFunction *pFunction) : m_pFunction(pFunction)
{
}
unsigned int OnTopMenuDrawOption(ITopMenu *menu,
int client,
unsigned int object_id)
{
char buffer[2] = {ITEMDRAW_DEFAULT, 0x0};
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DrawOption);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, sizeof(buffer), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
m_pFunction->PushCell(sizeof(buffer));
m_pFunction->Execute(NULL);
return (unsigned int)buffer[0];
}
void OnTopMenuDisplayOption(ITopMenu *menu,
int client,
unsigned int object_id,
char buffer[],
size_t maxlength)
{
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DisplayOption);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK);
m_pFunction->PushCell(maxlength);
m_pFunction->Execute(NULL);
}
void OnTopMenuDisplayTitle(ITopMenu *menu,
int client,
unsigned int object_id,
char buffer[],
size_t maxlength)
{
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_DisplayTitle);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushStringEx(buffer, maxlength, 0, SM_PARAM_COPYBACK);
m_pFunction->PushCell(maxlength);
m_pFunction->Execute(NULL);
}
void OnTopMenuSelectOption(ITopMenu *menu,
int client,
unsigned int object_id)
{
unsigned int old_reply = playerhelpers->SetReplyTo(SM_REPLY_CHAT);
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_SelectOption);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(client);
m_pFunction->PushString("");
m_pFunction->PushCell(0);
m_pFunction->Execute(NULL);
playerhelpers->SetReplyTo(old_reply);
}
void OnTopMenuObjectRemoved(ITopMenu *menu, unsigned int object_id)
{
m_pFunction->PushCell(m_hMenuHandle);
m_pFunction->PushCell(TopMenuAction_RemoveObject);
m_pFunction->PushCell(object_id);
m_pFunction->PushCell(0);
m_pFunction->PushString("");
m_pFunction->PushCell(0);
m_pFunction->Execute(NULL);
delete this;
}
Handle_t m_hMenuHandle;
IPluginFunction *m_pFunction;
};
static cell_t CreateTopMenu(IPluginContext *pContext, const cell_t *params)
{
IPluginFunction *func = pContext->GetFunctionById(params[1]);
if (func == NULL)
{
return pContext ->ThrowNativeError("Invalid function specified");
}
TopMenuCallbacks *cb = new TopMenuCallbacks(func);
ITopMenu *pMenu = g_TopMenus.CreateTopMenu(cb);
if (!pMenu)
{
delete cb;
return BAD_HANDLE;
}
Handle_t hndl = handlesys->CreateHandle(hTopMenuType,
pMenu,
pContext->GetIdentity(),
myself->GetIdentity(),
NULL);
if (hndl == 0)
{
g_TopMenus.DestroyTopMenu(pMenu);
return BAD_HANDLE;
}
cb->m_hMenuHandle = hndl;
return hndl;
}
static cell_t LoadTopMenuConfig(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
char *file, *err_buf;
pContext->LocalToString(params[2], &file);
pContext->LocalToString(params[3], &err_buf);
char path[PLATFORM_MAX_PATH];
g_pSM->BuildPath(Path_Game, path, sizeof(path), "%s", file);
return pMenu->LoadConfiguration(path, err_buf, params[4]) ? 1 : 0;
}
static cell_t AddToTopMenu(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
IPluginFunction *func = pContext->GetFunctionById(params[4]);
if (func == NULL)
{
return pContext ->ThrowNativeError("Invalid function specified");
}
TopMenuCallbacks *cb = new TopMenuCallbacks(func);
char *name, *cmdname, *info_string = NULL;
pContext->LocalToString(params[2], &name);
pContext->LocalToString(params[6], &cmdname);
if (params[0] >= 8)
{
pContext->LocalToString(params[8], &info_string);
}
TopMenuObjectType obj_type = (TopMenuObjectType)params[3];
unsigned int object_id;
if ((object_id = pMenu->AddToMenu2(name,
obj_type,
cb,
pContext->GetIdentity(),
cmdname,
params[7],
params[5],
info_string)) == 0)
{
delete cb;
return 0;
}
cb->m_hMenuHandle = params[1];
return object_id;
}
static cell_t RemoveFromTopMenu(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
pMenu->RemoveFromMenu(params[2]);
return 1;
}
static cell_t FindTopMenuCategory(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
char *name;
pContext->LocalToString(params[2], &name);
return pMenu->FindCategory(name);
}
static cell_t DisplayTopMenu(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
int client = params[2];
IGamePlayer *player = playerhelpers->GetGamePlayer(client);
if (!player)
{
return pContext->ThrowNativeError("Invalid client index %d", client);
}
else if (!player->IsInGame())
{
return pContext->ThrowNativeError("Client %d is not in game", client);
}
return pMenu->DisplayMenu(client, 0, (TopMenuPosition)params[3]);
}
static cell_t GetTopMenuInfoString(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
}
const char *str;
if ((str = pMenu->GetObjectInfoString(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]);
}
static cell_t GetTopMenuName(IPluginContext *pContext, const cell_t *params)
{
HandleError err;
ITopMenu *pMenu;
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
if ((err = handlesys->ReadHandle(params[1], hTopMenuType, &sec, (void **)&pMenu))
!= HandleError_None)
{
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},
{"GetTopMenuObjName", GetTopMenuName},
{NULL, NULL},
};
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod Sample Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SQLite Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod SQLite Extension
* SourceMod TopMenus Extension
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*