Add MenuSetClientMapping native.
This commit is contained in:
		
							parent
							
								
									d67d6321ad
								
							
						
					
					
						commit
						5ac1379b67
					
				@ -607,7 +607,7 @@ bool BaseMenuStyle::RedoClientMenu(int client, ItemOrder order)
 | 
				
			|||||||
CBaseMenu::CBaseMenu(IMenuHandler *pHandler, IMenuStyle *pStyle, IdentityToken_t *pOwner) : 
 | 
					CBaseMenu::CBaseMenu(IMenuHandler *pHandler, IMenuStyle *pStyle, IdentityToken_t *pOwner) : 
 | 
				
			||||||
m_pStyle(pStyle), m_Pagination(7), m_bShouldDelete(false), m_bCancelling(false), 
 | 
					m_pStyle(pStyle), m_Pagination(7), m_bShouldDelete(false), m_bCancelling(false), 
 | 
				
			||||||
m_pOwner(pOwner ? pOwner : g_pCoreIdent), m_bDeleting(false), m_bWillFreeHandle(false), 
 | 
					m_pOwner(pOwner ? pOwner : g_pCoreIdent), m_bDeleting(false), m_bWillFreeHandle(false), 
 | 
				
			||||||
m_hHandle(BAD_HANDLE), m_pHandler(pHandler), m_nFlags(MENUFLAG_BUTTON_EXIT), m_RandomMapLen(0)
 | 
					m_hHandle(BAD_HANDLE), m_pHandler(pHandler), m_nFlags(MENUFLAG_BUTTON_EXIT)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -684,7 +684,7 @@ const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* =
 | 
				
			|||||||
	if (position >= m_items.length())
 | 
						if (position >= m_items.length())
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (client > 0 && position < m_RandomMapLen)
 | 
						if (client > 0 && position < m_RandomMaps[client].length())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		position = m_RandomMaps[client][position];
 | 
							position = m_RandomMaps[client][position];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -701,19 +701,19 @@ const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* =
 | 
				
			|||||||
void CBaseMenu::ShufflePerClient(int start, int stop)
 | 
					void CBaseMenu::ShufflePerClient(int start, int stop)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// limit map len to 255 items since it's using uint8
 | 
						// limit map len to 255 items since it's using uint8
 | 
				
			||||||
	m_RandomMapLen = MIN(GetItemCount(), 255);
 | 
						int length = MIN(GetItemCount(), 255);
 | 
				
			||||||
	if (stop >= 0)
 | 
						if (stop >= 0)
 | 
				
			||||||
		m_RandomMapLen = MIN(m_RandomMapLen, (unsigned int)stop);
 | 
							length = MIN(length, (unsigned int)stop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (int i = 1; i < SM_MAXPLAYERS + 1; i++)
 | 
						for (int i = 1; i < SM_MAXPLAYERS + 1; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// populate per-client map ...
 | 
							// populate per-client map ...
 | 
				
			||||||
		m_RandomMaps[i].resize(m_RandomMapLen);
 | 
							m_RandomMaps[i].resize(length);
 | 
				
			||||||
		for(unsigned int j = 0; j < m_RandomMapLen; j++)
 | 
							for (unsigned int j = 0; j < length; j++)
 | 
				
			||||||
			m_RandomMaps[i][j] = j;
 | 
								m_RandomMaps[i][j] = j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// ... and random shuffle it
 | 
							// ... and random shuffle it
 | 
				
			||||||
		for(int j = m_RandomMapLen - 1; j > start; j--)
 | 
							for (int j = length - 1; j > start; j--)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			int x = rand() % (j - start + 1) + start;
 | 
								int x = rand() % (j - start + 1) + start;
 | 
				
			||||||
			uint8_t tmp = m_RandomMaps[i][x];
 | 
								uint8_t tmp = m_RandomMaps[i][x];
 | 
				
			||||||
@ -723,14 +723,24 @@ void CBaseMenu::ShufflePerClient(int start, int stop)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CBaseMenu::SetClientMapping(int client, int *array, int length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						length = MIN(length, 255);
 | 
				
			||||||
 | 
						m_RandomMaps[client].resize(length);
 | 
				
			||||||
 | 
						for (int i = 0; i < length; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							m_RandomMaps[client][i] = array[i];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool CBaseMenu::IsPerClientShuffled()
 | 
					bool CBaseMenu::IsPerClientShuffled()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return m_RandomMapLen > 0;
 | 
						return m_RandomMaps[1].length() > 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned int CBaseMenu::GetRealItemIndex(int client, unsigned int position)
 | 
					unsigned int CBaseMenu::GetRealItemIndex(int client, unsigned int position)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (client > 0 && position < m_RandomMapLen)
 | 
						if (client > 0 && position < m_RandomMaps[client].length())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		position = m_RandomMaps[client][position];
 | 
							position = m_RandomMaps[client][position];
 | 
				
			||||||
		return m_items[position].index;
 | 
							return m_items[position].index;
 | 
				
			||||||
 | 
				
			|||||||
@ -157,6 +157,7 @@ public:
 | 
				
			|||||||
	virtual void SetMenuOptionFlags(unsigned int flags);
 | 
						virtual void SetMenuOptionFlags(unsigned int flags);
 | 
				
			||||||
	virtual IMenuHandler *GetHandler();
 | 
						virtual IMenuHandler *GetHandler();
 | 
				
			||||||
	virtual void ShufflePerClient(int start, int stop);
 | 
						virtual void ShufflePerClient(int start, int stop);
 | 
				
			||||||
 | 
						virtual void SetClientMapping(int client, int *array, int length);
 | 
				
			||||||
	virtual bool IsPerClientShuffled();
 | 
						virtual bool IsPerClientShuffled();
 | 
				
			||||||
	virtual unsigned int GetRealItemIndex(int client, unsigned int position);
 | 
						virtual unsigned int GetRealItemIndex(int client, unsigned int position);
 | 
				
			||||||
	unsigned int GetBaseMemUsage();
 | 
						unsigned int GetBaseMemUsage();
 | 
				
			||||||
@ -175,7 +176,6 @@ protected:
 | 
				
			|||||||
	Handle_t m_hHandle;
 | 
						Handle_t m_hHandle;
 | 
				
			||||||
	IMenuHandler *m_pHandler;
 | 
						IMenuHandler *m_pHandler;
 | 
				
			||||||
	unsigned int m_nFlags;
 | 
						unsigned int m_nFlags;
 | 
				
			||||||
	unsigned int m_RandomMapLen;
 | 
					 | 
				
			||||||
	ke::Vector<uint8_t> m_RandomMaps[SM_MAXPLAYERS+1];
 | 
						ke::Vector<uint8_t> m_RandomMaps[SM_MAXPLAYERS+1];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -862,6 +862,33 @@ static cell_t MenuShufflePerClient(IPluginContext *pContext, const cell_t *param
 | 
				
			|||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static cell_t MenuSetClientMapping(IPluginContext *pContext, const cell_t *params)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Handle_t hndl = (Handle_t)params[1];
 | 
				
			||||||
 | 
						HandleError err;
 | 
				
			||||||
 | 
						IBaseMenu *menu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ((err = ReadMenuHandle(params[1], &menu)) != HandleError_None)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int client = params[2];
 | 
				
			||||||
 | 
						if (client < 1 || client > SM_MAXPLAYERS)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return pContext->ThrowNativeError("Invalid client index!");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cell_t *array;
 | 
				
			||||||
 | 
						pContext->LocalToPhysAddr(params[3], &array);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int length = params[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						menu->SetClientMapping(client, array, length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static cell_t SetMenuPagination(IPluginContext *pContext, const cell_t *params)
 | 
					static cell_t SetMenuPagination(IPluginContext *pContext, const cell_t *params)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Handle_t hndl = (Handle_t)params[1];
 | 
						Handle_t hndl = (Handle_t)params[1];
 | 
				
			||||||
@ -1676,6 +1703,7 @@ REGISTER_NATIVES(menuNatives)
 | 
				
			|||||||
	{"SetVoteResultCallback",	SetVoteResultCallback},
 | 
						{"SetVoteResultCallback",	SetVoteResultCallback},
 | 
				
			||||||
	{"VoteMenu",				VoteMenu},
 | 
						{"VoteMenu",				VoteMenu},
 | 
				
			||||||
	{"MenuShufflePerClient",	MenuShufflePerClient},
 | 
						{"MenuShufflePerClient",	MenuShufflePerClient},
 | 
				
			||||||
 | 
						{"MenuSetClientMapping",	MenuSetClientMapping},
 | 
				
			||||||
	{"SetMenuNoVoteButton",		SetMenuNoVoteButton},
 | 
						{"SetMenuNoVoteButton",		SetMenuNoVoteButton},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Transitional syntax support.
 | 
						// Transitional syntax support.
 | 
				
			||||||
@ -1705,6 +1733,7 @@ REGISTER_NATIVES(menuNatives)
 | 
				
			|||||||
	{"Menu.Cancel",				CancelMenu},
 | 
						{"Menu.Cancel",				CancelMenu},
 | 
				
			||||||
	{"Menu.DisplayVote",		VoteMenu},
 | 
						{"Menu.DisplayVote",		VoteMenu},
 | 
				
			||||||
	{"Menu.ShufflePerClient",	MenuShufflePerClient},
 | 
						{"Menu.ShufflePerClient",	MenuShufflePerClient},
 | 
				
			||||||
 | 
						{"Menu.SetClientMapping",	MenuSetClientMapping},
 | 
				
			||||||
	{"Menu.Pagination.get",		GetMenuPagination},
 | 
						{"Menu.Pagination.get",		GetMenuPagination},
 | 
				
			||||||
	{"Menu.Pagination.set",		SetMenuPagination},
 | 
						{"Menu.Pagination.set",		SetMenuPagination},
 | 
				
			||||||
	{"Menu.OptionFlags.get",	GetMenuOptionFlags},
 | 
						{"Menu.OptionFlags.get",	GetMenuOptionFlags},
 | 
				
			||||||
 | 
				
			|||||||
@ -318,6 +318,13 @@ methodmap Menu < Handle
 | 
				
			|||||||
	// @param stop          Menu item index to stop randomizing at. -1 = infinite
 | 
						// @param stop          Menu item index to stop randomizing at. -1 = infinite
 | 
				
			||||||
	public native void ShufflePerClient(int start=0, int stop=-1);
 | 
						public native void ShufflePerClient(int start=0, int stop=-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Fills the client vote option mapping with user supplied values.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// @param client		Client index.
 | 
				
			||||||
 | 
						// @param array			Integer array with mapping.
 | 
				
			||||||
 | 
						// @param length		Length of array.
 | 
				
			||||||
 | 
						public native void SetClientMapping(int client, int[] array, int length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Sets the menu's default title/instruction message.
 | 
						// Sets the menu's default title/instruction message.
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	// @param fmt           Message string format
 | 
						// @param fmt           Message string format
 | 
				
			||||||
@ -560,11 +567,22 @@ native bool GetMenuItem(Handle menu,
 | 
				
			|||||||
/**
 | 
					/**
 | 
				
			||||||
 * Generates a per-client random mapping for the current vote options.
 | 
					 * Generates a per-client random mapping for the current vote options.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 * @param menu          Menu Handle.
 | 
				
			||||||
 * @param start         Menu item index to start randomizing from.
 | 
					 * @param start         Menu item index to start randomizing from.
 | 
				
			||||||
 * @param stop          Menu item index to stop randomizing at. -1 = infinite
 | 
					 * @param stop          Menu item index to stop randomizing at. -1 = infinite
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
native void MenuShufflePerClient(Handle menu, int start=0, int stop=-1);
 | 
					native void MenuShufflePerClient(Handle menu, int start=0, int stop=-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Fills the client vote option mapping with user supplied values.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param menu          Menu Handle.
 | 
				
			||||||
 | 
					 * @param client		Client index.
 | 
				
			||||||
 | 
					 * @param array			Integer array with mapping.
 | 
				
			||||||
 | 
					 * @param length		Length of array.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					native void MenuSetClientMapping(Handle menu, int client, int[] array, int length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Returns the first item on the page of a currently selected menu.
 | 
					 * Returns the first item on the page of a currently selected menu.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
@ -645,6 +645,14 @@ namespace SourceMod
 | 
				
			|||||||
		 */
 | 
							 */
 | 
				
			||||||
		virtual void ShufflePerClient(int start=0, int stop=-1) =0;
 | 
							virtual void ShufflePerClient(int start=0, int stop=-1) =0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/**
 | 
				
			||||||
 | 
							 * @brief Fills the client vote option mapping with user supplied values.
 | 
				
			||||||
 | 
							 * @param client		Client index.
 | 
				
			||||||
 | 
							 * @param array			Integer array with mapping.
 | 
				
			||||||
 | 
							 * @param length		Length of array.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							virtual void SetClientMapping(int client, int *array, int length) =0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/**
 | 
							/**
 | 
				
			||||||
		 * @brief Returns true if the menu has a per-client random mapping.
 | 
							 * @brief Returns true if the menu has a per-client random mapping.
 | 
				
			||||||
		 * @return				True on success, false otherwise.
 | 
							 * @return				True on success, false otherwise.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user