Implement per-client randomized menus with MenuShufflePerClient native.
Add MenuSetClientMapping native. fix remaining issues
This commit is contained in:
		
							parent
							
								
									67a0d18ce7
								
							
						
					
					
						commit
						2e9619ff67
					
				| @ -308,7 +308,7 @@ IMenuPanel *MenuManager::RenderMenu(int client, menu_states_t &md, ItemOrder ord | |||||||
| 	{ | 	{ | ||||||
| 		ItemDrawInfo &dr = drawItems[foundItems].draw; | 		ItemDrawInfo &dr = drawItems[foundItems].draw; | ||||||
| 		/* Is the item valid? */ | 		/* Is the item valid? */ | ||||||
| 		if (menu->GetItemInfo(i, &dr) != NULL) | 		if (menu->GetItemInfo(i, &dr, client) != NULL) | ||||||
| 		{ | 		{ | ||||||
| 			/* Ask the user to change the style, if necessary */ | 			/* Ask the user to change the style, if necessary */ | ||||||
| 			mh->OnMenuDrawItem(menu, client, i, dr.style); | 			mh->OnMenuDrawItem(menu, client, i, dr.style); | ||||||
| @ -398,7 +398,7 @@ IMenuPanel *MenuManager::RenderMenu(int client, menu_states_t &md, ItemOrder ord | |||||||
| 			} | 			} | ||||||
| 			while (++lastItem < totalItems) | 			while (++lastItem < totalItems) | ||||||
| 			{ | 			{ | ||||||
| 				if (menu->GetItemInfo(lastItem, &dr) != NULL) | 				if (menu->GetItemInfo(lastItem, &dr, client) != NULL) | ||||||
| 				{ | 				{ | ||||||
| 					mh->OnMenuDrawItem(menu, client, lastItem, dr.style); | 					mh->OnMenuDrawItem(menu, client, lastItem, dr.style); | ||||||
| 					if (IsSlotItem(panel, dr.style)) | 					if (IsSlotItem(panel, dr.style)) | ||||||
| @ -420,7 +420,7 @@ IMenuPanel *MenuManager::RenderMenu(int client, menu_states_t &md, ItemOrder ord | |||||||
| 			lastItem--; | 			lastItem--; | ||||||
| 			while (lastItem != 0) | 			while (lastItem != 0) | ||||||
| 			{ | 			{ | ||||||
| 				if (menu->GetItemInfo(lastItem, &dr) != NULL) | 				if (menu->GetItemInfo(lastItem, &dr, client) != NULL) | ||||||
| 				{ | 				{ | ||||||
| 					mh->OnMenuDrawItem(menu, client, lastItem, dr.style); | 					mh->OnMenuDrawItem(menu, client, lastItem, dr.style); | ||||||
| 					if (IsSlotItem(panel, dr.style)) | 					if (IsSlotItem(panel, dr.style)) | ||||||
|  | |||||||
| @ -633,7 +633,7 @@ bool CBaseMenu::AppendItem(const char *info, const ItemDrawInfo &draw) | |||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	CItem item; | 	CItem item(m_items.length()); | ||||||
| 
 | 
 | ||||||
| 	item.info = info; | 	item.info = info; | ||||||
| 	if (draw.display) | 	if (draw.display) | ||||||
| @ -655,7 +655,7 @@ bool CBaseMenu::InsertItem(unsigned int position, const char *info, const ItemDr | |||||||
| 	if (position >= m_items.length()) | 	if (position >= m_items.length()) | ||||||
| 		return false; | 		return false; | ||||||
| 
 | 
 | ||||||
| 	CItem item; | 	CItem item(position); | ||||||
| 	item.info = info; | 	item.info = info; | ||||||
| 	if (draw.display) | 	if (draw.display) | ||||||
| 		item.display = new ke::AString(draw.display); | 		item.display = new ke::AString(draw.display); | ||||||
| @ -679,11 +679,16 @@ void CBaseMenu::RemoveAllItems() | |||||||
| 	m_items.clear(); | 	m_items.clear(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* =NULL */) | const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* =NULL */, int client/* =0 */) | ||||||
| { | { | ||||||
| 	if (position >= m_items.length()) | 	if (position >= m_items.length()) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
|  | 	if (client > 0 && position < m_RandomMaps[client].length()) | ||||||
|  | 	{ | ||||||
|  | 		position = m_RandomMaps[client][position]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (draw) | 	if (draw) | ||||||
| 	{ | 	{ | ||||||
| 		draw->display = m_items[position].display->chars(); | 		draw->display = m_items[position].display->chars(); | ||||||
| @ -693,6 +698,62 @@ const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* = | |||||||
| 	return m_items[position].info.chars(); | 	return m_items[position].info.chars(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CBaseMenu::ShufflePerClient(int start, int stop) | ||||||
|  | { | ||||||
|  | 	// limit map len to 255 items since it's using uint8
 | ||||||
|  | 	int length = MIN(GetItemCount(), 255); | ||||||
|  | 	if (stop >= 0) | ||||||
|  | 		length = MIN(length, stop); | ||||||
|  | 
 | ||||||
|  | 	for (int i = 1; i < SM_MAXPLAYERS + 1; i++) | ||||||
|  | 	{ | ||||||
|  | 		// populate per-client map ...
 | ||||||
|  | 		m_RandomMaps[i].resize(length); | ||||||
|  | 		for (int j = 0; j < length; j++) | ||||||
|  | 			m_RandomMaps[i][j] = j; | ||||||
|  | 
 | ||||||
|  | 		// ... and random shuffle it
 | ||||||
|  | 		for (int j = length - 1; j > start; j--) | ||||||
|  | 		{ | ||||||
|  | 			int x = rand() % (j - start + 1) + start; | ||||||
|  | 			uint8_t tmp = m_RandomMaps[i][x]; | ||||||
|  | 			m_RandomMaps[i][x] = m_RandomMaps[i][j]; | ||||||
|  | 			m_RandomMaps[i][j] = tmp; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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() | ||||||
|  | { | ||||||
|  | 	for (int i = 1; i < SM_MAXPLAYERS + 1; i++) | ||||||
|  | 	{ | ||||||
|  | 		if(m_RandomMaps[i].length() > 0) | ||||||
|  | 			return true; | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | unsigned int CBaseMenu::GetRealItemIndex(int client, unsigned int position) | ||||||
|  | { | ||||||
|  | 	if (client > 0 && position < m_RandomMaps[client].length()) | ||||||
|  | 	{ | ||||||
|  | 		position = m_RandomMaps[client][position]; | ||||||
|  | 		return m_items[position].index; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return position; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| unsigned int CBaseMenu::GetItemCount() | unsigned int CBaseMenu::GetItemCount() | ||||||
| { | { | ||||||
| 	return m_items.length(); | 	return m_items.length(); | ||||||
|  | |||||||
| @ -43,8 +43,9 @@ using namespace SourceMod; | |||||||
| class CItem | class CItem | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 	CItem() | 	CItem(unsigned int index) | ||||||
| 	{ | 	{ | ||||||
|  | 		this->index = index; | ||||||
| 		style = 0; | 		style = 0; | ||||||
| 		access = 0; | 		access = 0; | ||||||
| 	} | 	} | ||||||
| @ -52,11 +53,13 @@ public: | |||||||
| 	: info(ke::Move(other.info)), | 	: info(ke::Move(other.info)), | ||||||
| 	  display(ke::Move(other.display)) | 	  display(ke::Move(other.display)) | ||||||
| 	{ | 	{ | ||||||
|  | 		index = other.index; | ||||||
| 		style = other.style; | 		style = other.style; | ||||||
| 		access = other.access; | 		access = other.access; | ||||||
| 	} | 	} | ||||||
| 	CItem & operator =(CItem &&other) | 	CItem & operator =(CItem &&other) | ||||||
| 	{ | 	{ | ||||||
|  | 		index = other.index; | ||||||
| 		info = ke::Move(other.info); | 		info = ke::Move(other.info); | ||||||
| 		display = ke::Move(other.display); | 		display = ke::Move(other.display); | ||||||
| 		style = other.style; | 		style = other.style; | ||||||
| @ -65,6 +68,7 @@ public: | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|  | 	unsigned int index; | ||||||
| 	ke::AString info; | 	ke::AString info; | ||||||
| 	ke::AutoPtr<ke::AString> display; | 	ke::AutoPtr<ke::AString> display; | ||||||
| 	unsigned int style; | 	unsigned int style; | ||||||
| @ -137,7 +141,7 @@ public: | |||||||
| 	virtual bool InsertItem(unsigned int position, const char *info, const ItemDrawInfo &draw); | 	virtual bool InsertItem(unsigned int position, const char *info, const ItemDrawInfo &draw); | ||||||
| 	virtual bool RemoveItem(unsigned int position); | 	virtual bool RemoveItem(unsigned int position); | ||||||
| 	virtual void RemoveAllItems(); | 	virtual void RemoveAllItems(); | ||||||
| 	virtual const char *GetItemInfo(unsigned int position, ItemDrawInfo *draw=NULL); | 	virtual const char *GetItemInfo(unsigned int position, ItemDrawInfo *draw=NULL, int client=0); | ||||||
| 	virtual unsigned int GetItemCount(); | 	virtual unsigned int GetItemCount(); | ||||||
| 	virtual bool SetPagination(unsigned int itemsPerPage); | 	virtual bool SetPagination(unsigned int itemsPerPage); | ||||||
| 	virtual unsigned int GetPagination(); | 	virtual unsigned int GetPagination(); | ||||||
| @ -151,6 +155,10 @@ public: | |||||||
| 	virtual unsigned int GetMenuOptionFlags(); | 	virtual unsigned int GetMenuOptionFlags(); | ||||||
| 	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 SetClientMapping(int client, int *array, int length); | ||||||
|  | 	virtual bool IsPerClientShuffled(); | ||||||
|  | 	virtual unsigned int GetRealItemIndex(int client, unsigned int position); | ||||||
| 	unsigned int GetBaseMemUsage(); | 	unsigned int GetBaseMemUsage(); | ||||||
| private: | private: | ||||||
| 	void InternalDelete(); | 	void InternalDelete(); | ||||||
| @ -167,6 +175,7 @@ protected: | |||||||
| 	Handle_t m_hHandle; | 	Handle_t m_hHandle; | ||||||
| 	IMenuHandler *m_pHandler; | 	IMenuHandler *m_pHandler; | ||||||
| 	unsigned int m_nFlags; | 	unsigned int m_nFlags; | ||||||
|  | 	ke::Vector<uint8_t> m_RandomMaps[SM_MAXPLAYERS+1]; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif //_INCLUDE_MENUSTYLE_BASE_H
 | #endif //_INCLUDE_MENUSTYLE_BASE_H
 | ||||||
|  | |||||||
| @ -514,15 +514,16 @@ void VoteMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int ite | |||||||
| 	/* Check by our item count, NOT the vote array size */ | 	/* Check by our item count, NOT the vote array size */ | ||||||
| 	if (item < m_Items) | 	if (item < m_Items) | ||||||
| 	{ | 	{ | ||||||
| 		m_ClientVotes[client] = item; | 		unsigned int index = menu->GetRealItemIndex(client, item); | ||||||
| 		m_Votes[item]++; | 		m_ClientVotes[client] = index; | ||||||
|  | 		m_Votes[index]++; | ||||||
| 		m_NumVotes++; | 		m_NumVotes++; | ||||||
| 
 | 
 | ||||||
| 		if (sm_vote_chat.GetBool() || sm_vote_console.GetBool() || sm_vote_client_console.GetBool()) | 		if (sm_vote_chat.GetBool() || sm_vote_console.GetBool() || sm_vote_client_console.GetBool()) | ||||||
| 		{ | 		{ | ||||||
| 			static char buffer[1024]; | 			static char buffer[1024]; | ||||||
| 			ItemDrawInfo dr; | 			ItemDrawInfo dr; | ||||||
| 			menu->GetItemInfo(item, &dr); | 			menu->GetItemInfo(item, &dr, client); | ||||||
| 
 | 
 | ||||||
| 			if (sm_vote_console.GetBool()) | 			if (sm_vote_console.GetBool()) | ||||||
| 			{ | 			{ | ||||||
|  | |||||||
| @ -816,8 +816,14 @@ static cell_t GetMenuItem(IPluginContext *pContext, const cell_t *params) | |||||||
| 
 | 
 | ||||||
| 	ItemDrawInfo dr; | 	ItemDrawInfo dr; | ||||||
| 	const char *info; | 	const char *info; | ||||||
|  | 	cell_t client = (params[0] >= 8) ? params[8] : 0; | ||||||
|  | 	if(!client && menu->IsPerClientShuffled()) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("This menu has been per-client random shuffled. " | ||||||
|  | 										  "You have to call GetMenuItem with a client index!"); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if ((info=menu->GetItemInfo(params[2], &dr)) == NULL) | 	if ((info=menu->GetItemInfo(params[2], &dr, client)) == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| @ -832,6 +838,57 @@ static cell_t GetMenuItem(IPluginContext *pContext, const cell_t *params) | |||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static cell_t MenuShufflePerClient(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 start = params[2]; | ||||||
|  | 	int stop = params[3]; | ||||||
|  | 
 | ||||||
|  | 	if (stop > 0 && !(stop >= start)) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Stop must be -1 or >= start!"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	menu->ShufflePerClient(start, stop); | ||||||
|  | 
 | ||||||
|  | 	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]; | ||||||
| @ -1645,6 +1702,8 @@ REGISTER_NATIVES(menuNatives) | |||||||
| 	{"SetPanelKeys",			SetPanelKeys}, | 	{"SetPanelKeys",			SetPanelKeys}, | ||||||
| 	{"SetVoteResultCallback",	SetVoteResultCallback}, | 	{"SetVoteResultCallback",	SetVoteResultCallback}, | ||||||
| 	{"VoteMenu",				VoteMenu}, | 	{"VoteMenu",				VoteMenu}, | ||||||
|  | 	{"MenuShufflePerClient",	MenuShufflePerClient}, | ||||||
|  | 	{"MenuSetClientMapping",	MenuSetClientMapping}, | ||||||
| 	{"SetMenuNoVoteButton",		SetMenuNoVoteButton}, | 	{"SetMenuNoVoteButton",		SetMenuNoVoteButton}, | ||||||
| 
 | 
 | ||||||
| 	// Transitional syntax support.
 | 	// Transitional syntax support.
 | ||||||
| @ -1673,6 +1732,8 @@ REGISTER_NATIVES(menuNatives) | |||||||
| 	{"Menu.ToPanel",			CreatePanelFromMenu}, | 	{"Menu.ToPanel",			CreatePanelFromMenu}, | ||||||
| 	{"Menu.Cancel",				CancelMenu}, | 	{"Menu.Cancel",				CancelMenu}, | ||||||
| 	{"Menu.DisplayVote",		VoteMenu}, | 	{"Menu.DisplayVote",		VoteMenu}, | ||||||
|  | 	{"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}, | ||||||
|  | |||||||
| @ -309,9 +309,23 @@ methodmap Menu < Handle | |||||||
| 	// @param style         By-reference variable to store drawing flags.
 | 	// @param style         By-reference variable to store drawing flags.
 | ||||||
| 	// @param dispBuf       Display buffer.
 | 	// @param dispBuf       Display buffer.
 | ||||||
| 	// @param dispBufLen    Maximum length of the display buffer.
 | 	// @param dispBufLen    Maximum length of the display buffer.
 | ||||||
|  | 	// @param client		Client index. Must be specified if menu is per-client random shuffled, -1 to ignore.
 | ||||||
| 	// @return              True on success, false if position is invalid.
 | 	// @return              True on success, false if position is invalid.
 | ||||||
| 	public native bool GetItem(int position, char[] infoBuf, int infoBufLen, | 	public native bool GetItem(int position, char[] infoBuf, int infoBufLen, | ||||||
| 							   int &style=0, char[] dispBuf="", int dispBufLen=0); | 							   int &style=0, char[] dispBuf="", int dispBufLen=0, int client=0); | ||||||
|  | 
 | ||||||
|  | 	// Generates a per-client random mapping for the current vote options.
 | ||||||
|  | 	//
 | ||||||
|  | 	// @param start         Menu item index to start randomizing from.
 | ||||||
|  | 	// @param stop          Menu item index to stop randomizing at. -1 = infinite
 | ||||||
|  | 	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.
 | ||||||
| 	//
 | 	//
 | ||||||
| @ -539,6 +553,7 @@ native void RemoveAllMenuItems(Handle menu); | |||||||
|  * @param style				By-reference variable to store drawing flags. |  * @param style				By-reference variable to store drawing flags. | ||||||
|  * @param dispBuf			Display buffer. |  * @param dispBuf			Display buffer. | ||||||
|  * @param dispBufLen		Maximum length of the display buffer. |  * @param dispBufLen		Maximum length of the display buffer. | ||||||
|  |  * @param client			Client index. Must be specified if menu is per-client random shuffled, -1 to ignore. | ||||||
|  * @return					True on success, false if position is invalid. |  * @return					True on success, false if position is invalid. | ||||||
|  * @error					Invalid Handle. |  * @error					Invalid Handle. | ||||||
|  */ |  */ | ||||||
| @ -548,7 +563,27 @@ native bool GetMenuItem(Handle menu, | |||||||
| 						int infoBufLen,  | 						int infoBufLen,  | ||||||
| 						int &style=0,  | 						int &style=0,  | ||||||
| 						char[] dispBuf="", | 						char[] dispBuf="", | ||||||
| 						int dispBufLen=0); | 						int dispBufLen=0, | ||||||
|  | 						int client=0); | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * 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 stop          Menu item index to stop randomizing at. -1 = infinite | ||||||
|  |  */ | ||||||
|  | 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. | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ | |||||||
| #include <IHandleSys.h> | #include <IHandleSys.h> | ||||||
| 
 | 
 | ||||||
| #define SMINTERFACE_MENUMANAGER_NAME		"IMenuManager" | #define SMINTERFACE_MENUMANAGER_NAME		"IMenuManager" | ||||||
| #define SMINTERFACE_MENUMANAGER_VERSION		16 | #define SMINTERFACE_MENUMANAGER_VERSION		17 | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * @file IMenuManager.h |  * @file IMenuManager.h | ||||||
| @ -485,9 +485,10 @@ namespace SourceMod | |||||||
| 		 * | 		 * | ||||||
| 		 * @param position		Position, starting from 0. | 		 * @param position		Position, starting from 0. | ||||||
| 		 * @param draw			Optional pointer to store a draw information. | 		 * @param draw			Optional pointer to store a draw information. | ||||||
|  | 		 * @param client		Client index. (Important for randomized menus.) | ||||||
| 		 * @return				Info string pointer, or NULL if position was invalid. | 		 * @return				Info string pointer, or NULL if position was invalid. | ||||||
| 		 */ | 		 */ | ||||||
| 		virtual const char *GetItemInfo(unsigned int position, ItemDrawInfo *draw) =0; | 		virtual const char *GetItemInfo(unsigned int position, ItemDrawInfo *draw, int client=0) =0; | ||||||
| 
 | 
 | ||||||
| 		/**
 | 		/**
 | ||||||
| 		 * @brief Returns the number of items. | 		 * @brief Returns the number of items. | ||||||
| @ -636,6 +637,35 @@ namespace SourceMod | |||||||
| 		 * @return				Approximate number of bytes being used. | 		 * @return				Approximate number of bytes being used. | ||||||
| 		 */ | 		 */ | ||||||
| 		virtual unsigned int GetApproxMemUsage() =0; | 		virtual unsigned int GetApproxMemUsage() =0; | ||||||
|  | 
 | ||||||
|  | 		/**
 | ||||||
|  | 		 * @brief Generates a per-client random mapping for the current vote options. | ||||||
|  | 		 * @param start			Menu item index to start randomizing from. | ||||||
|  | 		 * @param stop			Menu item index to stop randomizing at. -1 = infinite | ||||||
|  | 		 */ | ||||||
|  | 		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. | ||||||
|  | 		 * @return				True on success, false otherwise. | ||||||
|  | 		 */ | ||||||
|  | 		virtual bool IsPerClientShuffled() =0; | ||||||
|  | 
 | ||||||
|  | 		/**
 | ||||||
|  | 		 * @brief Returns the actual (not shuffled) item index from the client position. | ||||||
|  | 		 * @param client		Client index. | ||||||
|  | 		 * @param position		Position, starting from 0. | ||||||
|  | 		 * @return				Actual item index in menu. | ||||||
|  | 		 */ | ||||||
|  | 		virtual unsigned int GetRealItemIndex(int client, unsigned int position) =0; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	/** 
 | 	/** 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user