core/smn_menus.cpp
author David Anderson <dvander@alliedmods.net>
Tue Jul 03 20:46:17 2007 +0000 (2007-07-03)
changeset 1036 2a073d5b3454
parent 1011 b413072540fd
child 1163 0bb03cb6277b
permissions -rw-r--r--
added amb505
dvander@790
     1
/**
dvander@790
     2
 * vim: set ts=4 :
dvander@790
     3
 * ===============================================================
dvander@790
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@790
     5
 * ===============================================================
dvander@790
     6
 *
dvander@790
     7
 * This file is not open source and may not be copied without explicit
dvander@790
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@790
     9
 * in whole or significant part.
dvander@790
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@790
    11
 *
dvander@790
    12
 * Version: $Id$
dvander@790
    13
 */
dvander@790
    14
dvander@790
    15
#include "sm_globals.h"
dvander@790
    16
#include <sh_stack.h>
dvander@790
    17
#include "MenuManager.h"
dvander@790
    18
#include "MenuStyle_Valve.h"
dvander@790
    19
#include "MenuStyle_Radio.h"
dvander@790
    20
#include "HandleSys.h"
dvander@790
    21
#include "PluginSys.h"
dvander@1011
    22
#include "sm_stringutil.h"
dvander@970
    23
#if defined MENU_DEBUG
dvander@970
    24
#include "Logger.h"
dvander@970
    25
#endif
dvander@790
    26
dvander@790
    27
#if defined CreateMenu
dvander@790
    28
#undef CreateMenu
dvander@790
    29
#endif
dvander@790
    30
dvander@790
    31
/**
dvander@790
    32
 * And God said, "let there be menus," and behold, there were menus.  
dvander@790
    33
 * God saw the menus and they were good.  And the evening and the morning
dvander@790
    34
 * were the third day.
dvander@790
    35
 */
dvander@790
    36
dvander@790
    37
enum MenuAction
dvander@790
    38
{
dvander@790
    39
	MenuAction_Start = (1<<0),		/**< A menu has been started (nothing passed) */
dvander@790
    40
	MenuAction_Display = (1<<1),	/**< A menu is about to be displayed (param1=client, param2=MenuPanel Handle) */
dvander@790
    41
	MenuAction_Select = (1<<2),		/**< An item was selected (param1=client, param2=item) */
dvander@790
    42
	MenuAction_Cancel = (1<<3),		/**< The menu was cancelled (param1=client, param2=item) */
dvander@790
    43
	MenuAction_End = (1<<4),		/**< A menu's display/selection cycle is complete (nothing passed). */
dvander@790
    44
	MenuAction_VoteEnd = (1<<5),	/**< (VOTE ONLY): A vote sequence has ended (param1=chosen item) */
dvander@878
    45
	MenuAction_VoteStart = (1<<6), 	/**< (VOTE ONLY): A vote sequence has started */
dvander@885
    46
	MenuAction_VoteCancel = (1<<7),	/**< (VOTE ONLY): A vote sequence has been cancelled (nothing passed) */
dvander@1006
    47
	MenuAction_DrawItem = (1<<8),	/**< A style is being drawn; return the new style (param1=client, param2=item) */
dvander@790
    48
};
dvander@790
    49
dvander@790
    50
class CPanelHandler : public IMenuHandler
dvander@790
    51
{
dvander@790
    52
	friend class MenuNativeHelpers;
dvander@790
    53
public:
dvander@790
    54
	CPanelHandler()
dvander@790
    55
	{
dvander@790
    56
	}
dvander@790
    57
	void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason);
dvander@790
    58
	void OnMenuSelect(IBaseMenu *menu, int client, unsigned int item);
dvander@790
    59
private:
dvander@790
    60
	IPluginFunction *m_pFunc;
dvander@790
    61
	IPlugin *m_pPlugin;
dvander@790
    62
};
dvander@790
    63
dvander@790
    64
class CMenuHandler : public IMenuHandler
dvander@790
    65
{
dvander@790
    66
	friend class MenuNativeHelpers;
dvander@790
    67
public:
dvander@790
    68
	CMenuHandler(IPluginFunction *pBasic, int flags);
dvander@790
    69
public:
dvander@790
    70
	void OnMenuStart(IBaseMenu *menu);
dvander@790
    71
	void OnMenuDisplay(IBaseMenu *menu, int client, IMenuPanel *display);
dvander@790
    72
	void OnMenuSelect(IBaseMenu *menu, int client, unsigned int item);
dvander@790
    73
	void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason);
dvander@997
    74
	void OnMenuEnd(IBaseMenu *menu, MenuEndReason reason);
dvander@790
    75
	void OnMenuDestroy(IBaseMenu *menu);
dvander@878
    76
	void OnMenuVoteStart(IBaseMenu *menu);
dvander@960
    77
	void OnMenuVoteEnd(IBaseMenu *menu,
dvander@960
    78
		unsigned int item, 
dvander@960
    79
		unsigned int winningVotes,
dvander@960
    80
		unsigned int totalVotes);
dvander@885
    81
	void OnMenuVoteCancel(IBaseMenu *menu);
dvander@1006
    82
	void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style);
dvander@790
    83
#if 0
dvander@790
    84
	void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style);
dvander@790
    85
	void OnMenuDisplayItem(IBaseMenu *menu, int client, unsigned int item, const char **display);
dvander@790
    86
#endif
dvander@790
    87
private:
dvander@1006
    88
	cell_t DoAction(IBaseMenu *menu, MenuAction action, cell_t param1, cell_t param2, cell_t def_res=0);
dvander@878
    89
private:
dvander@790
    90
	IPluginFunction *m_pBasic;
dvander@790
    91
	int m_Flags;
dvander@790
    92
};
dvander@790
    93
dvander@790
    94
/**
dvander@790
    95
 * GLOBAL CLASS FOR HELPERS
dvander@790
    96
 */
dvander@790
    97
dvander@790
    98
class MenuNativeHelpers : 
dvander@790
    99
	public SMGlobalClass,
dvander@790
   100
	public IHandleTypeDispatch,
dvander@790
   101
	public IPluginsListener
dvander@790
   102
{
dvander@790
   103
public:
dvander@790
   104
	virtual void OnSourceModAllInitialized()
dvander@790
   105
	{
dvander@790
   106
		m_PanelType = g_HandleSys.CreateType("IMenuPanel", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@790
   107
		g_PluginSys.AddPluginsListener(this);
dvander@790
   108
	}
dvander@790
   109
dvander@790
   110
	virtual void OnSourceModShutdown()
dvander@790
   111
	{
dvander@790
   112
		g_HandleSys.RemoveType(m_PanelType, g_pCoreIdent);
dvander@790
   113
dvander@790
   114
		while (!m_FreePanelHandlers.empty())
dvander@790
   115
		{
dvander@790
   116
			delete m_FreePanelHandlers.front();
dvander@790
   117
			m_FreePanelHandlers.pop();
dvander@790
   118
		}
dvander@790
   119
dvander@790
   120
		while (!m_FreeMenuHandlers.empty())
dvander@790
   121
		{
dvander@790
   122
			delete m_FreeMenuHandlers.front();
dvander@790
   123
			m_FreeMenuHandlers.pop();
dvander@790
   124
		}
dvander@790
   125
	}
dvander@790
   126
dvander@790
   127
	virtual void OnHandleDestroy(HandleType_t type, void *object)
dvander@790
   128
	{
dvander@790
   129
		IMenuPanel *panel = (IMenuPanel *)object;
dvander@790
   130
		panel->DeleteThis();
dvander@790
   131
	}
dvander@790
   132
dvander@790
   133
	/**
dvander@790
   134
	 *   It is extremely important that unloaded plugins don't crash.
dvander@790
   135
	 * Thus, if a plugin unloads, we run through every handler we have.
dvander@790
   136
	 * This means we do almost no runtime work for keeping track of
dvander@790
   137
	 * our panel handlers (we don't have to store a list of the running 
dvander@790
   138
	 * ones), but when push comes to shove, we have to scan them all
dvander@790
   139
	 * in case any of them are active.
dvander@790
   140
	 */
dvander@790
   141
	virtual void OnPluginUnloaded(IPlugin *plugin)
dvander@790
   142
	{
dvander@790
   143
		for (size_t i = 0; i < m_PanelHandlers.size(); i++)
dvander@790
   144
		{
dvander@790
   145
			if (m_PanelHandlers[i]->m_pPlugin == plugin)
dvander@790
   146
			{
dvander@790
   147
				m_PanelHandlers[i]->m_pPlugin = NULL;
dvander@790
   148
				m_PanelHandlers[i]->m_pFunc = NULL;
dvander@790
   149
			}
dvander@790
   150
		}
dvander@790
   151
	}
dvander@790
   152
dvander@790
   153
	inline HandleType_t GetPanelType()
dvander@790
   154
	{
dvander@790
   155
		return m_PanelType;
dvander@790
   156
	}
dvander@790
   157
dvander@790
   158
	CPanelHandler *GetPanelHandler(IPluginFunction *pFunction)
dvander@790
   159
	{
dvander@790
   160
		CPanelHandler *handler;
dvander@790
   161
		if (m_FreePanelHandlers.empty())
dvander@790
   162
		{
dvander@790
   163
			handler = new CPanelHandler;
dvander@790
   164
			m_PanelHandlers.push_back(handler);
dvander@790
   165
		} else {
dvander@790
   166
			handler = m_FreePanelHandlers.front();
dvander@790
   167
			m_FreePanelHandlers.pop();
dvander@790
   168
		}
dvander@790
   169
		handler->m_pFunc = pFunction;
dvander@790
   170
		handler->m_pPlugin = g_PluginSys.GetPluginByCtx(pFunction->GetParentContext()->GetContext());
dvander@790
   171
		return handler;
dvander@790
   172
	}
dvander@790
   173
dvander@790
   174
	void FreePanelHandler(CPanelHandler *handler)
dvander@790
   175
	{
dvander@790
   176
		handler->m_pFunc = NULL;
dvander@790
   177
		handler->m_pPlugin = NULL;
dvander@790
   178
		m_FreePanelHandlers.push(handler);
dvander@790
   179
	}
dvander@790
   180
dvander@790
   181
	CMenuHandler *GetMenuHandler(IPluginFunction *pFunction, int flags)
dvander@790
   182
	{
dvander@790
   183
		CMenuHandler *handler;
dvander@790
   184
		if (m_FreeMenuHandlers.empty())
dvander@790
   185
		{
dvander@790
   186
			handler = new CMenuHandler(pFunction, flags);
dvander@790
   187
		} else {
dvander@790
   188
			handler = m_FreeMenuHandlers.front();
dvander@790
   189
			m_FreeMenuHandlers.pop();
dvander@790
   190
			handler->m_pBasic = pFunction;
dvander@790
   191
			handler->m_Flags = flags;
dvander@790
   192
		}
dvander@790
   193
		return handler;
dvander@790
   194
	}
dvander@790
   195
dvander@790
   196
	void FreeMenuHandler(CMenuHandler *handler)
dvander@790
   197
	{
dvander@790
   198
		m_FreeMenuHandlers.push(handler);
dvander@790
   199
	}
dvander@790
   200
dvander@790
   201
private:
dvander@790
   202
	HandleType_t m_PanelType;
dvander@790
   203
	CStack<CPanelHandler *> m_FreePanelHandlers;
dvander@790
   204
	CStack<CMenuHandler *> m_FreeMenuHandlers;
dvander@790
   205
	CVector<CPanelHandler *> m_PanelHandlers;
dvander@790
   206
} g_MenuHelpers;
dvander@790
   207
dvander@790
   208
/**
dvander@790
   209
 * BASIC PANEL HANDLER WRAPPER
dvander@790
   210
 */
dvander@790
   211
dvander@790
   212
void CPanelHandler::OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason)
dvander@790
   213
{
dvander@790
   214
	if (m_pFunc)
dvander@790
   215
	{
dvander@790
   216
		m_pFunc->PushCell(BAD_HANDLE);
dvander@790
   217
		m_pFunc->PushCell(MenuAction_Cancel);
dvander@790
   218
		m_pFunc->PushCell(client);
dvander@790
   219
		m_pFunc->PushCell(reason);
dvander@790
   220
		m_pFunc->Execute(NULL);
dvander@790
   221
	}
dvander@790
   222
	g_MenuHelpers.FreePanelHandler(this);
dvander@790
   223
}
dvander@790
   224
dvander@790
   225
void CPanelHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int item)
dvander@790
   226
{
dvander@790
   227
	if (m_pFunc)
dvander@790
   228
	{
dvander@790
   229
		m_pFunc->PushCell(BAD_HANDLE);
dvander@790
   230
		m_pFunc->PushCell(MenuAction_Select);
dvander@790
   231
		m_pFunc->PushCell(client);
dvander@790
   232
		m_pFunc->PushCell(item);
dvander@790
   233
		m_pFunc->Execute(NULL);
dvander@790
   234
	}
dvander@790
   235
	g_MenuHelpers.FreePanelHandler(this);
dvander@790
   236
}
dvander@790
   237
dvander@790
   238
/**
dvander@790
   239
 * MENU HANDLER WRAPPER
dvander@790
   240
 */
dvander@790
   241
CMenuHandler::CMenuHandler(IPluginFunction *pBasic, int flags) : 
dvander@790
   242
	m_pBasic(pBasic), m_Flags(flags)
dvander@790
   243
{
dvander@790
   244
	/* :TODO: We can probably cache the handle ahead of time */
dvander@790
   245
}
dvander@790
   246
dvander@790
   247
void CMenuHandler::OnMenuStart(IBaseMenu *menu)
dvander@790
   248
{
dvander@790
   249
	if ((m_Flags & (int)MenuAction_Start) == (int)MenuAction_Start)
dvander@790
   250
	{
dvander@878
   251
		DoAction(menu, MenuAction_Start, 0, 0);
dvander@790
   252
	}
dvander@790
   253
}
dvander@790
   254
dvander@790
   255
void CMenuHandler::OnMenuDisplay(IBaseMenu *menu, int client, IMenuPanel *panel)
dvander@790
   256
{
dvander@790
   257
	if ((m_Flags & (int)MenuAction_Display) == (int)MenuAction_Display)
dvander@790
   258
	{
dvander@790
   259
		HandleSecurity sec;
dvander@790
   260
		sec.pIdentity = m_pBasic->GetParentContext()->GetIdentity();
dvander@790
   261
		sec.pOwner = g_pCoreIdent;
dvander@790
   262
	
dvander@790
   263
		HandleAccess access;
dvander@790
   264
		g_HandleSys.InitAccessDefaults(NULL, &access);
dvander@790
   265
		access.access[HandleAccess_Delete] = HANDLE_RESTRICT_IDENTITY|HANDLE_RESTRICT_OWNER;
dvander@790
   266
dvander@790
   267
		Handle_t hndl =  g_HandleSys.CreateHandleEx(g_MenuHelpers.GetPanelType(), panel, &sec, &access, NULL);
dvander@790
   268
dvander@878
   269
		DoAction(menu, MenuAction_Display, client, hndl);
dvander@790
   270
dvander@790
   271
		g_HandleSys.FreeHandle(hndl, &sec);
dvander@790
   272
	}
dvander@790
   273
}
dvander@790
   274
dvander@790
   275
void CMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int item)
dvander@790
   276
{
dvander@878
   277
	DoAction(menu, MenuAction_Select, client, item);
dvander@790
   278
}
dvander@790
   279
dvander@790
   280
void CMenuHandler::OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason)
dvander@790
   281
{
dvander@878
   282
	DoAction(menu, MenuAction_Cancel, client, (cell_t)reason);
dvander@790
   283
}
dvander@790
   284
dvander@997
   285
void CMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason)
dvander@790
   286
{
dvander@997
   287
	DoAction(menu, MenuAction_End, reason, 0);
dvander@790
   288
}
dvander@790
   289
dvander@790
   290
void CMenuHandler::OnMenuDestroy(IBaseMenu *menu)
dvander@790
   291
{
dvander@790
   292
	g_MenuHelpers.FreeMenuHandler(this);
dvander@790
   293
}
dvander@790
   294
dvander@878
   295
void CMenuHandler::OnMenuVoteStart(IBaseMenu *menu)
dvander@878
   296
{
dvander@878
   297
	DoAction(menu, MenuAction_VoteStart, 0, 0);
dvander@878
   298
}
dvander@878
   299
dvander@960
   300
void CMenuHandler::OnMenuVoteEnd(IBaseMenu *menu,
dvander@960
   301
								 unsigned int item,
dvander@960
   302
								 unsigned int winningVotes,
dvander@960
   303
								 unsigned int totalVotes)
dvander@878
   304
{
dvander@977
   305
	DoAction(menu, MenuAction_VoteEnd, item, (totalVotes << 16) | (winningVotes & 0xFFFF));
dvander@878
   306
}
dvander@878
   307
dvander@885
   308
void CMenuHandler::OnMenuVoteCancel(IBaseMenu *menu)
dvander@885
   309
{
dvander@885
   310
	DoAction(menu, MenuAction_VoteCancel, 0, 0);
dvander@885
   311
}
dvander@885
   312
dvander@1006
   313
void CMenuHandler::OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style)
dvander@1006
   314
{
dvander@1006
   315
	if ((m_Flags & (int)MenuAction_DrawItem) == (int)MenuAction_DrawItem)
dvander@1006
   316
	{
dvander@1006
   317
		cell_t result = DoAction(menu, MenuAction_DrawItem, client, item, style);
dvander@1006
   318
		style = (unsigned int)result;
dvander@1006
   319
	}
dvander@1006
   320
}
dvander@1006
   321
dvander@1006
   322
cell_t CMenuHandler::DoAction(IBaseMenu *menu, MenuAction action, cell_t param1, cell_t param2, cell_t def_res)
dvander@878
   323
{
dvander@970
   324
#if defined MENU_DEBUG
dvander@970
   325
	g_Logger.LogMessage("[SM_MENU] CMenuHandler::DoAction() (menu %p/%08x) (action %d) (param1 %d) (param2 %d)",
dvander@970
   326
		menu,
dvander@970
   327
		menu->GetHandle(),
dvander@970
   328
		action,
dvander@970
   329
		param1,
dvander@970
   330
		param2);
dvander@970
   331
#endif
dvander@1006
   332
	cell_t res = def_res;
dvander@878
   333
	m_pBasic->PushCell(menu->GetHandle());
dvander@878
   334
	m_pBasic->PushCell((cell_t)action);
dvander@878
   335
	m_pBasic->PushCell(param1);
dvander@878
   336
	m_pBasic->PushCell(param2);
dvander@1006
   337
	m_pBasic->Execute(&res);
dvander@1006
   338
	return res;
dvander@878
   339
}
dvander@878
   340
dvander@790
   341
/**
dvander@790
   342
 * INLINE FUNCTIONS FOR NATIVES
dvander@790
   343
 */
dvander@790
   344
dvander@790
   345
inline Handle_t MakePanelHandle(IMenuPanel *panel, IPluginContext *pContext)
dvander@790
   346
{
dvander@790
   347
	return g_HandleSys.CreateHandle(g_MenuHelpers.GetPanelType(), panel, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@790
   348
}
dvander@790
   349
dvander@790
   350
inline HandleError ReadPanelHandle(Handle_t hndl, IMenuPanel **panel)
dvander@790
   351
{
dvander@790
   352
	HandleSecurity sec;
dvander@790
   353
	sec.pIdentity = g_pCoreIdent;
dvander@790
   354
	sec.pOwner = NULL;
dvander@790
   355
	return g_HandleSys.ReadHandle(hndl, g_MenuHelpers.GetPanelType(), &sec, (void **)panel);
dvander@790
   356
}
dvander@790
   357
dvander@790
   358
inline IMenuStyle *GetStyleFromCell(cell_t cell)
dvander@790
   359
{
dvander@790
   360
	enum MenuStyle
dvander@790
   361
	{
dvander@790
   362
		MenuStyle_Default = 0,		/**< The "default" menu style for the mod */
dvander@790
   363
		MenuStyle_Valve = 1,		/**< The Valve provided menu style (Used on HL2DM) */
dvander@790
   364
		MenuStyle_Radio = 2,		/**< The simpler menu style commonly used on CS:S */
dvander@790
   365
	};
dvander@790
   366
dvander@790
   367
	if (cell == MenuStyle_Valve)
dvander@790
   368
	{
dvander@790
   369
		return &g_ValveMenuStyle;
dvander@790
   370
	} else if (cell == MenuStyle_Radio
dvander@790
   371
			   && g_RadioMenuStyle.IsSupported())
dvander@790
   372
	{
dvander@790
   373
		return &g_RadioMenuStyle;
dvander@790
   374
	}
dvander@790
   375
dvander@790
   376
	return g_Menus.GetDefaultStyle();
dvander@790
   377
}
dvander@790
   378
dvander@790
   379
/***********************************
dvander@790
   380
 **** NATIVE DEFINITIONS ***********
dvander@790
   381
 ***********************************/
dvander@790
   382
dvander@790
   383
static cell_t CreateMenu(IPluginContext *pContext, const cell_t *params)
dvander@790
   384
{
dvander@790
   385
	IMenuStyle *style = g_Menus.GetDefaultStyle();
dvander@790
   386
	IPluginFunction *pFunction;
dvander@790
   387
dvander@790
   388
	if ((pFunction=pContext->GetFunctionById(params[1])) == NULL)
dvander@790
   389
	{
dvander@790
   390
		return pContext->ThrowNativeError("Function id %x is invalid", params[1]);
dvander@790
   391
	}
dvander@790
   392
dvander@790
   393
	CMenuHandler *handler = g_MenuHelpers.GetMenuHandler(pFunction, params[2]);
dvander@790
   394
	IBaseMenu *menu = style->CreateMenu(handler, pContext->GetIdentity());
dvander@790
   395
dvander@790
   396
	Handle_t hndl = menu->GetHandle();
dvander@790
   397
	if (!hndl)
dvander@790
   398
	{
dvander@790
   399
		menu->Destroy();
dvander@790
   400
		return BAD_HANDLE;
dvander@790
   401
	}
dvander@790
   402
dvander@790
   403
	return hndl;
dvander@790
   404
}
dvander@790
   405
dvander@790
   406
static cell_t DisplayMenu(IPluginContext *pContext, const cell_t *params)
dvander@790
   407
{
dvander@790
   408
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   409
	HandleError err;
dvander@790
   410
	IBaseMenu *menu;
dvander@790
   411
dvander@790
   412
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   413
	{
dvander@790
   414
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   415
	}
dvander@790
   416
dvander@790
   417
	return menu->Display(params[2], params[3]) ? 1 : 0;
dvander@790
   418
}
dvander@790
   419
dvander@878
   420
static cell_t VoteMenu(IPluginContext *pContext, const cell_t *params)
dvander@878
   421
{
dvander@878
   422
	Handle_t hndl = (Handle_t)params[1];
dvander@878
   423
	HandleError err;
dvander@878
   424
	IBaseMenu *menu;
dvander@878
   425
dvander@878
   426
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@878
   427
	{
dvander@878
   428
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@878
   429
	}
dvander@878
   430
dvander@878
   431
	cell_t *addr;
dvander@878
   432
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@878
   433
dvander@879
   434
	return menu->BroadcastVote(addr, params[3], params[4]) ? 1 : 0;
dvander@878
   435
}
dvander@878
   436
dvander@790
   437
static cell_t AddMenuItem(IPluginContext *pContext, const cell_t *params)
dvander@790
   438
{
dvander@790
   439
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   440
	HandleError err;
dvander@790
   441
	IBaseMenu *menu;
dvander@790
   442
dvander@790
   443
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   444
	{
dvander@790
   445
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   446
	}
dvander@790
   447
dvander@790
   448
	char *info;
dvander@790
   449
	ItemDrawInfo dr;
dvander@790
   450
dvander@790
   451
	pContext->LocalToString(params[2], &info);
dvander@790
   452
	pContext->LocalToString(params[3], (char **)&dr.display);
dvander@790
   453
	dr.style = params[4];
dvander@790
   454
dvander@790
   455
	return menu->AppendItem(info, dr) ? 1 : 0;
dvander@790
   456
}
dvander@790
   457
dvander@790
   458
static cell_t InsertMenuItem(IPluginContext *pContext, const cell_t *params)
dvander@790
   459
{
dvander@790
   460
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   461
	HandleError err;
dvander@790
   462
	IBaseMenu *menu;
dvander@790
   463
dvander@790
   464
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   465
	{
dvander@790
   466
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   467
	}
dvander@790
   468
dvander@790
   469
	char *info;
dvander@790
   470
	ItemDrawInfo dr;
dvander@790
   471
dvander@790
   472
	pContext->LocalToString(params[3], &info);
dvander@790
   473
	pContext->LocalToString(params[4], (char **)&dr.display);
dvander@790
   474
	dr.style = params[5];
dvander@790
   475
dvander@790
   476
	return menu->InsertItem(params[2], info, dr) ? 1 : 0;
dvander@790
   477
}
dvander@790
   478
dvander@790
   479
static cell_t RemoveMenuItem(IPluginContext *pContext, const cell_t *params)
dvander@790
   480
{
dvander@790
   481
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   482
	HandleError err;
dvander@790
   483
	IBaseMenu *menu;
dvander@790
   484
dvander@790
   485
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   486
	{
dvander@790
   487
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   488
	}
dvander@790
   489
dvander@790
   490
	return menu->RemoveItem(params[2]) ? 1 : 0;
dvander@790
   491
}
dvander@790
   492
dvander@790
   493
static cell_t RemoveAllMenuItems(IPluginContext *pContext, const cell_t *params)
dvander@790
   494
{
dvander@790
   495
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   496
	HandleError err;
dvander@790
   497
	IBaseMenu *menu;
dvander@790
   498
dvander@790
   499
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   500
	{
dvander@790
   501
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   502
	}
dvander@790
   503
dvander@790
   504
	menu->RemoveAllItems();
dvander@790
   505
dvander@790
   506
	return 1;
dvander@790
   507
}
dvander@790
   508
dvander@790
   509
static cell_t GetMenuItem(IPluginContext *pContext, const cell_t *params)
dvander@790
   510
{
dvander@790
   511
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   512
	HandleError err;
dvander@790
   513
	IBaseMenu *menu;
dvander@790
   514
dvander@790
   515
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   516
	{
dvander@790
   517
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   518
	}
dvander@790
   519
dvander@790
   520
	ItemDrawInfo dr;
dvander@790
   521
	const char *info;
dvander@790
   522
dvander@790
   523
	if ((info=menu->GetItemInfo(params[2], &dr)) == NULL)
dvander@790
   524
	{
dvander@790
   525
		return 0;
dvander@790
   526
	}
dvander@790
   527
dvander@790
   528
	pContext->StringToLocalUTF8(params[3], params[4], info, NULL);
dvander@790
   529
	pContext->StringToLocalUTF8(params[6], params[7], dr.display ? dr.display : "", NULL);
dvander@790
   530
dvander@790
   531
	cell_t *addr;
dvander@790
   532
	pContext->LocalToPhysAddr(params[5], &addr);
dvander@790
   533
	*addr = dr.style;
dvander@790
   534
dvander@790
   535
	return 1;
dvander@790
   536
}
dvander@790
   537
dvander@790
   538
static cell_t SetMenuPagination(IPluginContext *pContext, const cell_t *params)
dvander@790
   539
{
dvander@790
   540
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   541
	HandleError err;
dvander@790
   542
	IBaseMenu *menu;
dvander@790
   543
dvander@790
   544
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   545
	{
dvander@790
   546
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   547
	}
dvander@790
   548
dvander@790
   549
	return menu->SetPagination(params[2]) ? 1 : 0;
dvander@790
   550
}
dvander@790
   551
dvander@790
   552
static cell_t GetMenuPagination(IPluginContext *pContext, const cell_t *params)
dvander@790
   553
{
dvander@790
   554
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   555
	HandleError err;
dvander@790
   556
	IBaseMenu *menu;
dvander@790
   557
dvander@790
   558
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   559
	{
dvander@790
   560
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   561
	}
dvander@790
   562
dvander@790
   563
	return menu->GetPagination();
dvander@790
   564
}
dvander@790
   565
dvander@790
   566
static cell_t GetMenuItemCount(IPluginContext *pContext, const cell_t *params)
dvander@790
   567
{
dvander@790
   568
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   569
	HandleError err;
dvander@790
   570
	IBaseMenu *menu;
dvander@790
   571
dvander@790
   572
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   573
	{
dvander@790
   574
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   575
	}
dvander@790
   576
dvander@790
   577
	return menu->GetItemCount();
dvander@790
   578
}
dvander@790
   579
dvander@790
   580
static cell_t SetMenuTitle(IPluginContext *pContext, const cell_t *params)
dvander@790
   581
{
dvander@790
   582
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   583
	HandleError err;
dvander@790
   584
	IBaseMenu *menu;
dvander@790
   585
dvander@790
   586
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   587
	{
dvander@790
   588
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   589
	}
dvander@790
   590
dvander@1011
   591
	g_SourceMod.SetGlobalTarget(LANG_SERVER);
dvander@1011
   592
dvander@790
   593
	char buffer[1024];
dvander@790
   594
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
dvander@790
   595
dvander@790
   596
	menu->SetDefaultTitle(buffer);
dvander@790
   597
dvander@790
   598
	return 1;
dvander@790
   599
}
dvander@790
   600
dvander@790
   601
static cell_t CreatePanelFromMenu(IPluginContext *pContext, const cell_t *params)
dvander@790
   602
{
dvander@790
   603
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   604
	HandleError err;
dvander@790
   605
	IBaseMenu *menu;
dvander@790
   606
dvander@790
   607
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   608
	{
dvander@790
   609
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   610
	}
dvander@790
   611
dvander@790
   612
	IMenuPanel *panel = menu->CreatePanel();
dvander@790
   613
	hndl = MakePanelHandle(panel, pContext);
dvander@790
   614
	if (!hndl)
dvander@790
   615
	{
dvander@790
   616
		panel->DeleteThis();
dvander@790
   617
	}
dvander@790
   618
dvander@790
   619
	return hndl;
dvander@790
   620
}
dvander@790
   621
dvander@790
   622
static cell_t GetMenuExitButton(IPluginContext *pContext, const cell_t *params)
dvander@790
   623
{
dvander@790
   624
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   625
	HandleError err;
dvander@790
   626
	IBaseMenu *menu;
dvander@790
   627
dvander@790
   628
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   629
	{
dvander@790
   630
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   631
	}
dvander@790
   632
dvander@790
   633
	return menu->GetExitButton() ? 1 : 0;
dvander@790
   634
}
dvander@790
   635
dvander@1005
   636
static cell_t GetMenuExitBackButton(IPluginContext *pContext, const cell_t *params)
dvander@1005
   637
{
dvander@1005
   638
	Handle_t hndl = (Handle_t)params[1];
dvander@1005
   639
	HandleError err;
dvander@1005
   640
	IBaseMenu *menu;
dvander@1005
   641
dvander@1005
   642
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@1005
   643
	{
dvander@1005
   644
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@1005
   645
	}
dvander@1005
   646
dvander@1005
   647
	return menu->GetExitBackButton() ? 1 : 0;
dvander@1005
   648
}
dvander@1005
   649
dvander@790
   650
static cell_t SetMenuExitButton(IPluginContext *pContext, const cell_t *params)
dvander@790
   651
{
dvander@790
   652
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   653
	HandleError err;
dvander@790
   654
	IBaseMenu *menu;
dvander@790
   655
dvander@790
   656
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   657
	{
dvander@790
   658
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   659
	}
dvander@790
   660
dvander@790
   661
	return menu->SetExitButton(params[2] ? true : false) ? 1 : 0;
dvander@790
   662
}
dvander@790
   663
dvander@1005
   664
static cell_t SetMenuExitBackButton(IPluginContext *pContext, const cell_t *params)
dvander@1005
   665
{
dvander@1005
   666
	Handle_t hndl = (Handle_t)params[1];
dvander@1005
   667
	HandleError err;
dvander@1005
   668
	IBaseMenu *menu;
dvander@1005
   669
dvander@1005
   670
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@1005
   671
	{
dvander@1005
   672
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@1005
   673
	}
dvander@1005
   674
dvander@1005
   675
	menu->SetExitBackButton(params[2] ? true : false);
dvander@1005
   676
dvander@1005
   677
	return 1;
dvander@1005
   678
}
dvander@1005
   679
dvander@790
   680
static cell_t CancelMenu(IPluginContext *pContext, const cell_t *params)
dvander@790
   681
{
dvander@790
   682
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   683
	HandleError err;
dvander@790
   684
	IBaseMenu *menu;
dvander@790
   685
dvander@790
   686
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   687
	{
dvander@790
   688
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   689
	}
dvander@790
   690
dvander@790
   691
	menu->Cancel();
dvander@790
   692
dvander@790
   693
	return 1;
dvander@790
   694
}
dvander@790
   695
dvander@885
   696
static cell_t IsVoteInProgress(IPluginContext *pContext, const cell_t *params)
dvander@885
   697
{
dvander@885
   698
	Handle_t hndl = (Handle_t)params[1];
dvander@885
   699
	HandleError err;
dvander@885
   700
	IBaseMenu *menu;
dvander@885
   701
dvander@885
   702
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@885
   703
	{
dvander@885
   704
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@885
   705
	}
dvander@885
   706
dvander@885
   707
	return menu->IsVoteInProgress() ? 1 : 0;
dvander@885
   708
}
dvander@885
   709
dvander@790
   710
static cell_t GetMenuStyle(IPluginContext *pContext, const cell_t *params)
dvander@790
   711
{
dvander@790
   712
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   713
	HandleError err;
dvander@790
   714
	IBaseMenu *menu;
dvander@790
   715
dvander@790
   716
	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
dvander@790
   717
	{
dvander@790
   718
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   719
	}
dvander@790
   720
dvander@790
   721
	return menu->GetDrawStyle()->GetHandle();
dvander@790
   722
}
dvander@790
   723
dvander@790
   724
static cell_t GetMenuStyleHandle(IPluginContext *pContext, const cell_t *params)
dvander@790
   725
{
dvander@790
   726
	IMenuStyle *style = GetStyleFromCell(params[1]);
dvander@790
   727
	if (!style)
dvander@790
   728
	{
dvander@790
   729
		return BAD_HANDLE;
dvander@790
   730
	}
dvander@790
   731
dvander@790
   732
	return style->GetHandle();
dvander@790
   733
}
dvander@790
   734
dvander@790
   735
static cell_t CreatePanel(IPluginContext *pContext, const cell_t *params)
dvander@790
   736
{
dvander@790
   737
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   738
	HandleError err;
dvander@790
   739
	IMenuStyle *style;
dvander@790
   740
dvander@790
   741
	if (hndl != 0)
dvander@790
   742
	{
dvander@790
   743
		if ((err=g_Menus.ReadStyleHandle(params[1], &style)) != HandleError_None)
dvander@790
   744
		{
dvander@790
   745
			return pContext->ThrowNativeError("MenuStyle handle %x is invalid (error %d)", hndl, err);
dvander@790
   746
		}
dvander@790
   747
	} else {
dvander@790
   748
		style = g_Menus.GetDefaultStyle();
dvander@790
   749
	}
dvander@790
   750
dvander@790
   751
	IMenuPanel *panel = style->CreatePanel();
dvander@790
   752
dvander@790
   753
	hndl = MakePanelHandle(panel, pContext);
dvander@790
   754
	if (!hndl)
dvander@790
   755
	{
dvander@790
   756
		panel->DeleteThis();
dvander@790
   757
		return BAD_HANDLE;
dvander@790
   758
	}
dvander@790
   759
dvander@790
   760
	return hndl;
dvander@790
   761
}
dvander@790
   762
dvander@790
   763
static cell_t CreateMenuEx(IPluginContext *pContext, const cell_t *params)
dvander@790
   764
{
dvander@790
   765
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   766
	HandleError err;
dvander@790
   767
	IMenuStyle *style;
dvander@790
   768
dvander@790
   769
	if (hndl != 0)
dvander@790
   770
	{
dvander@790
   771
		if ((err=g_Menus.ReadStyleHandle(params[1], &style)) != HandleError_None)
dvander@790
   772
		{
dvander@790
   773
			return pContext->ThrowNativeError("MenuStyle handle %x is invalid (error %d)", hndl, err);
dvander@790
   774
		}
dvander@790
   775
	} else {
dvander@790
   776
		style = g_Menus.GetDefaultStyle();
dvander@790
   777
	}
dvander@790
   778
dvander@790
   779
	IPluginFunction *pFunction;
dvander@790
   780
	if ((pFunction=pContext->GetFunctionById(params[2])) == NULL)
dvander@790
   781
	{
dvander@790
   782
		return pContext->ThrowNativeError("Function id %x is invalid", params[2]);
dvander@790
   783
	}
dvander@790
   784
dvander@790
   785
	CMenuHandler *handler = g_MenuHelpers.GetMenuHandler(pFunction, params[3]);
dvander@790
   786
dvander@790
   787
	IBaseMenu *pMenu = style->CreateMenu(handler, pContext->GetIdentity());
dvander@790
   788
	hndl = pMenu->GetHandle();
dvander@790
   789
	if (!hndl)
dvander@790
   790
	{
dvander@790
   791
		pMenu->Destroy();
dvander@790
   792
		return BAD_HANDLE;
dvander@790
   793
	}
dvander@790
   794
dvander@790
   795
	return hndl;
dvander@790
   796
}
dvander@790
   797
dvander@790
   798
static cell_t GetClientMenu(IPluginContext *pContext, const cell_t *params)
dvander@790
   799
{
dvander@790
   800
	Handle_t hndl = (Handle_t)params[2];
dvander@790
   801
	HandleError err;
dvander@790
   802
	IMenuStyle *style;
dvander@790
   803
dvander@790
   804
	if (hndl != 0)
dvander@790
   805
	{
dvander@790
   806
		if ((err=g_Menus.ReadStyleHandle(params[1], &style)) != HandleError_None)
dvander@790
   807
		{
dvander@790
   808
			return pContext->ThrowNativeError("MenuStyle handle %x is invalid (error %d)", hndl, err);
dvander@790
   809
		}
dvander@790
   810
	} else {
dvander@790
   811
		style = g_Menus.GetDefaultStyle();
dvander@790
   812
	}
dvander@790
   813
dvander@790
   814
	return style->GetClientMenu(params[1], NULL);
dvander@790
   815
}
dvander@790
   816
dvander@790
   817
static cell_t CancelClientMenu(IPluginContext *pContext, const cell_t *params)
dvander@790
   818
{
dvander@790
   819
	Handle_t hndl = (Handle_t)params[3];
dvander@790
   820
	HandleError err;
dvander@790
   821
	IMenuStyle *style;
dvander@790
   822
dvander@790
   823
	if (hndl != 0)
dvander@790
   824
	{
dvander@790
   825
		if ((err=g_Menus.ReadStyleHandle(params[1], &style)) != HandleError_None)
dvander@790
   826
		{
dvander@790
   827
			return pContext->ThrowNativeError("MenuStyle handle %x is invalid (error %d)", hndl, err);
dvander@790
   828
		}
dvander@790
   829
	} else {
dvander@790
   830
		style = g_Menus.GetDefaultStyle();
dvander@790
   831
	}
dvander@790
   832
dvander@790
   833
	return style->CancelClientMenu(params[1], params[2] ? true : false) ? 1 : 0;
dvander@790
   834
}
dvander@790
   835
dvander@790
   836
static cell_t GetMaxPageItems(IPluginContext *pContext, const cell_t *params)
dvander@790
   837
{
dvander@790
   838
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   839
	HandleError err;
dvander@790
   840
	IMenuStyle *style;
dvander@790
   841
dvander@790
   842
	if (hndl != 0)
dvander@790
   843
	{
dvander@790
   844
		if ((err=g_Menus.ReadStyleHandle(params[1], &style)) != HandleError_None)
dvander@790
   845
		{
dvander@790
   846
			return pContext->ThrowNativeError("MenuStyle handle %x is invalid (error %d)", hndl, err);
dvander@790
   847
		}
dvander@790
   848
	} else {
dvander@790
   849
		style = g_Menus.GetDefaultStyle();
dvander@790
   850
	}
dvander@790
   851
dvander@790
   852
	return style->GetMaxPageItems();
dvander@790
   853
}
dvander@790
   854
dvander@790
   855
static cell_t GetPanelStyle(IPluginContext *pContext, const cell_t *params)
dvander@790
   856
{
dvander@790
   857
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   858
	HandleError err;
dvander@790
   859
	IMenuPanel *panel;
dvander@790
   860
dvander@790
   861
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@790
   862
	{
dvander@790
   863
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   864
	}
dvander@790
   865
dvander@790
   866
	return panel->GetParentStyle()->GetHandle();
dvander@790
   867
}
dvander@790
   868
dvander@790
   869
static cell_t SetPanelTitle(IPluginContext *pContext, const cell_t *params)
dvander@790
   870
{
dvander@790
   871
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   872
	HandleError err;
dvander@790
   873
	IMenuPanel *panel;
dvander@790
   874
dvander@790
   875
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@790
   876
	{
dvander@790
   877
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   878
	}
dvander@790
   879
dvander@790
   880
	char *text;
dvander@790
   881
	pContext->LocalToString(params[2], &text);
dvander@790
   882
dvander@790
   883
	panel->DrawTitle(text, params[3] ? true : false);
dvander@790
   884
dvander@790
   885
	return 1;
dvander@790
   886
}
dvander@790
   887
dvander@790
   888
static cell_t DrawPanelItem(IPluginContext *pContext, const cell_t *params)
dvander@790
   889
{
dvander@790
   890
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   891
	HandleError err;
dvander@790
   892
	IMenuPanel *panel;
dvander@790
   893
dvander@790
   894
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@790
   895
	{
dvander@790
   896
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   897
	}
dvander@790
   898
dvander@790
   899
	ItemDrawInfo dr;
dvander@790
   900
	pContext->LocalToString(params[2], (char **)&dr.display);
dvander@790
   901
	dr.style = params[3];
dvander@790
   902
dvander@790
   903
	return panel->DrawItem(dr);
dvander@790
   904
}
dvander@790
   905
dvander@790
   906
static cell_t DrawPanelText(IPluginContext *pContext, const cell_t *params)
dvander@790
   907
{
dvander@790
   908
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   909
	HandleError err;
dvander@790
   910
	IMenuPanel *panel;
dvander@790
   911
dvander@790
   912
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@790
   913
	{
dvander@790
   914
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   915
	}
dvander@790
   916
dvander@790
   917
	char *text;
dvander@790
   918
	pContext->LocalToString(params[2], &text);
dvander@790
   919
dvander@790
   920
	return panel->DrawRawLine(text) ? 1 : 0;
dvander@790
   921
}
dvander@790
   922
dvander@790
   923
static cell_t CanPanelDrawFlags(IPluginContext *pContext, const cell_t *params)
dvander@790
   924
{
dvander@790
   925
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   926
	HandleError err;
dvander@790
   927
	IMenuPanel *panel;
dvander@790
   928
dvander@790
   929
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@790
   930
	{
dvander@790
   931
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   932
	}
dvander@790
   933
dvander@790
   934
	return panel->CanDrawItem(params[2]);
dvander@790
   935
}
dvander@790
   936
dvander@790
   937
static cell_t SendPanelToClient(IPluginContext *pContext, const cell_t *params)
dvander@790
   938
{
dvander@790
   939
	Handle_t hndl = (Handle_t)params[1];
dvander@790
   940
	HandleError err;
dvander@790
   941
	IMenuPanel *panel;
dvander@790
   942
dvander@790
   943
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@790
   944
	{
dvander@790
   945
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@790
   946
	}
dvander@790
   947
dvander@790
   948
	IPluginFunction *pFunction;
dvander@790
   949
	if ((pFunction=pContext->GetFunctionById(params[3])) == NULL)
dvander@790
   950
	{
dvander@790
   951
		return pContext->ThrowNativeError("Function id %x is invalid", params[3]);
dvander@790
   952
	}
dvander@790
   953
dvander@790
   954
	CPanelHandler *handler = g_MenuHelpers.GetPanelHandler(pFunction);
dvander@790
   955
	if (!panel->SendDisplay(params[2], handler, params[4]))
dvander@790
   956
	{
dvander@790
   957
		g_MenuHelpers.FreePanelHandler(handler);
dvander@790
   958
	}
dvander@790
   959
dvander@790
   960
	return 1;
dvander@790
   961
}
dvander@790
   962
dvander@819
   963
static cell_t SetPanelKeys(IPluginContext *pContext, const cell_t *params)
dvander@819
   964
{
dvander@819
   965
	Handle_t hndl = (Handle_t)params[1];
dvander@819
   966
	HandleError err;
dvander@819
   967
	IMenuPanel *panel;
dvander@819
   968
dvander@819
   969
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@819
   970
	{
dvander@819
   971
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@819
   972
	}
dvander@819
   973
dvander@819
   974
	return panel->SetSelectableKeys(params[2]);
dvander@819
   975
}
dvander@819
   976
dvander@840
   977
static cell_t GetPanelCurrentKey(IPluginContext *pContext, const cell_t *params)
dvander@840
   978
{
dvander@840
   979
	Handle_t hndl = (Handle_t)params[1];
dvander@840
   980
	HandleError err;
dvander@840
   981
	IMenuPanel *panel;
dvander@840
   982
dvander@840
   983
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@840
   984
	{
dvander@840
   985
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@840
   986
	}
dvander@840
   987
dvander@840
   988
	return panel->GetCurrentKey();
dvander@840
   989
}
dvander@840
   990
dvander@840
   991
static cell_t SetPanelCurrentKey(IPluginContext *pContext, const cell_t *params)
dvander@840
   992
{
dvander@840
   993
	Handle_t hndl = (Handle_t)params[1];
dvander@840
   994
	HandleError err;
dvander@840
   995
	IMenuPanel *panel;
dvander@840
   996
dvander@840
   997
	if ((err=ReadPanelHandle(hndl, &panel)) != HandleError_None)
dvander@840
   998
	{
dvander@840
   999
		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
dvander@840
  1000
	}
dvander@840
  1001
dvander@840
  1002
	return panel->SetCurrentKey(params[2]) ? 1 : 0;
dvander@840
  1003
}
dvander@840
  1004
dvander@790
  1005
REGISTER_NATIVES(menuNatives)
dvander@790
  1006
{
dvander@790
  1007
	{"AddMenuItem",				AddMenuItem},
dvander@790
  1008
	{"CanPanelDrawFlags",		CanPanelDrawFlags},
dvander@790
  1009
	{"CancelClientMenu",		CancelClientMenu},
dvander@790
  1010
	{"CancelMenu",				CancelMenu},
dvander@790
  1011
	{"CreateMenu",				CreateMenu},
dvander@790
  1012
	{"CreateMenuEx",			CreateMenuEx},
dvander@790
  1013
	{"CreatePanel",				CreatePanel},
ds@874
  1014
	{"CreatePanelFromMenu",		CreatePanelFromMenu},
dvander@790
  1015
	{"DisplayMenu",				DisplayMenu},
dvander@790
  1016
	{"DrawPanelItem",			DrawPanelItem},
dvander@790
  1017
	{"DrawPanelText",			DrawPanelText},
dvander@790
  1018
	{"GetClientMenu",			GetClientMenu},
dvander@790
  1019
	{"GetMaxPageItems",			GetMaxPageItems},
dvander@1005
  1020
	{"GetMenuExitBackButton",	GetMenuExitBackButton},
dvander@790
  1021
	{"GetMenuExitButton",		GetMenuExitButton},
dvander@790
  1022
	{"GetMenuItem",				GetMenuItem},
dvander@790
  1023
	{"GetMenuItemCount",		GetMenuItemCount},
dvander@790
  1024
	{"GetMenuPagination",		GetMenuPagination},
dvander@790
  1025
	{"GetMenuStyle",			GetMenuStyle},
dvander@790
  1026
	{"GetMenuStyleHandle",		GetMenuStyleHandle},
dvander@840
  1027
	{"GetPanelCurrentKey",		GetPanelCurrentKey},
dvander@790
  1028
	{"GetPanelStyle",			GetPanelStyle},
dvander@790
  1029
	{"InsertMenuItem",			InsertMenuItem},
dvander@885
  1030
	{"IsVoteInProgress",		IsVoteInProgress},
dvander@790
  1031
	{"RemoveAllMenuItems",		RemoveAllMenuItems},
dvander@790
  1032
	{"RemoveMenuItem",			RemoveMenuItem},
dvander@790
  1033
	{"SendPanelToClient",		SendPanelToClient},
dvander@1005
  1034
	{"SetMenuExitBackButton",	SetMenuExitBackButton},
dvander@790
  1035
	{"SetMenuExitButton",		SetMenuExitButton},
dvander@790
  1036
	{"SetMenuPagination",		SetMenuPagination},
dvander@790
  1037
	{"SetMenuTitle",			SetMenuTitle},
dvander@840
  1038
	{"SetPanelCurrentKey",		SetPanelCurrentKey},
dvander@790
  1039
	{"SetPanelTitle",			SetPanelTitle},
dvander@819
  1040
	{"SetPanelKeys",			SetPanelKeys},
dvander@878
  1041
	{"VoteMenu",				VoteMenu},
dvander@790
  1042
	{NULL,						NULL},
dvander@790
  1043
};