Fixed revote bug and inflexibilities in RedrawClientVoteMenu (bug 3834, r=fyren).
This commit is contained in:
parent
c2c4ed1fe5
commit
d4798ccaa5
@ -798,5 +798,11 @@ bool MenuManager::IsClientInVotePool(int client)
|
||||
|
||||
bool MenuManager::RedrawClientVoteMenu(int client)
|
||||
{
|
||||
return s_VoteHandler.RedrawToClient(client);
|
||||
return RedrawClientVoteMenu2(client, true);
|
||||
}
|
||||
|
||||
bool MenuManager::RedrawClientVoteMenu2(int client, bool revote)
|
||||
{
|
||||
return s_VoteHandler.RedrawToClient(client, revote);
|
||||
}
|
||||
|
||||
|
@ -91,6 +91,7 @@ public:
|
||||
unsigned int GetRemainingVoteDelay();
|
||||
bool IsClientInVotePool(int client);
|
||||
bool RedrawClientVoteMenu(int client);
|
||||
bool RedrawClientVoteMenu2(int client, bool revote);
|
||||
public: //IHandleTypeDispatch
|
||||
void OnHandleDestroy(HandleType_t type, void *object);
|
||||
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize);
|
||||
|
@ -1,8 +1,8 @@
|
||||
/**
|
||||
* vim: set ts=4 :
|
||||
* vim: set ts=4 sw=4 :
|
||||
* =============================================================================
|
||||
* SourceMod
|
||||
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
|
||||
* Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
|
||||
* =============================================================================
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
@ -205,7 +205,7 @@ bool VoteMenuHandler::GetClientVoteChoice(int client, unsigned int *pItem)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool VoteMenuHandler::RedrawToClient(int client)
|
||||
bool VoteMenuHandler::RedrawToClient(int client, bool revotes)
|
||||
{
|
||||
unsigned int time_limit;
|
||||
|
||||
@ -214,6 +214,18 @@ bool VoteMenuHandler::RedrawToClient(int client)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_ClientVotes[client] >= 0)
|
||||
{
|
||||
if ((m_VoteFlags & VOTEFLAG_NO_REVOTES) == VOTEFLAG_NO_REVOTES || !revotes)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
assert((unsigned)m_ClientVotes[client] < m_Items);
|
||||
assert(m_Votes[m_ClientVotes[client]] > 0);
|
||||
m_Votes[m_ClientVotes[client]]--;
|
||||
m_ClientVotes[client] = -1;
|
||||
}
|
||||
|
||||
if (m_nMenuTime == MENU_TIME_FOREVER)
|
||||
{
|
||||
time_limit = m_nMenuTime;
|
||||
@ -489,3 +501,4 @@ bool VoteMenuHandler::IsCancelling()
|
||||
{
|
||||
return m_bCancelled;
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public:
|
||||
unsigned int GetRemainingVoteDelay();
|
||||
bool IsClientInVotePool(int client);
|
||||
bool GetClientVoteChoice(int client, unsigned int *pItem);
|
||||
bool RedrawToClient(int client);
|
||||
bool RedrawToClient(int client, bool revote);
|
||||
private:
|
||||
void Reset(IMenuHandler *mh);
|
||||
void DecrementPlayerCount();
|
||||
@ -102,3 +102,4 @@ private:
|
||||
};
|
||||
|
||||
#endif //_INCLUDE_SOURCEMOD_MENUVOTING_H_
|
||||
|
||||
|
@ -676,7 +676,13 @@ static cell_t VoteMenu(IPluginContext *pContext, const cell_t *params)
|
||||
cell_t *addr;
|
||||
pContext->LocalToPhysAddr(params[2], &addr);
|
||||
|
||||
if (!g_Menus.StartVote(menu, params[3], addr, params[4]))
|
||||
cell_t flags = 0;
|
||||
if (params[0] >= 5)
|
||||
{
|
||||
flags = params[5];
|
||||
}
|
||||
|
||||
if (!g_Menus.StartVote(menu, params[3], addr, params[4], flags))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -1445,7 +1451,13 @@ static cell_t RedrawClientVoteMenu(IPluginContext *pContext, const cell_t *param
|
||||
return pContext->ThrowNativeError("Client is not in the voting pool");
|
||||
}
|
||||
|
||||
return g_Menus.RedrawClientVoteMenu(client) ? 1 : 0;
|
||||
bool revote = true;
|
||||
if (params[0] >= 2 && !params[2])
|
||||
{
|
||||
revote = false;
|
||||
}
|
||||
|
||||
return g_Menus.RedrawClientVoteMenu2(client, revote) ? 1 : 0;
|
||||
}
|
||||
|
||||
class EmptyMenuHandler : public IMenuHandler
|
||||
@ -1567,3 +1579,4 @@ REGISTER_NATIVES(menuNatives)
|
||||
{"VoteMenu", VoteMenu},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -94,6 +94,8 @@ enum MenuAction
|
||||
#define VOTEINFO_ITEM_INDEX 0 /**< Item index */
|
||||
#define VOTEINFO_ITEM_VOTES 1 /**< Number of votes for the item */
|
||||
|
||||
#define VOTEFLAG_NO_REVOTES (1<<0) /**< Players cannot change their votes */
|
||||
|
||||
/**
|
||||
* Reasons a menu can be cancelled (MenuAction_Cancel).
|
||||
*/
|
||||
@ -469,22 +471,24 @@ native CancelVote();
|
||||
* @param clients Array of clients to broadcast to.
|
||||
* @param numClients Number of clients in the array.
|
||||
* @param time Maximum time to leave menu on the screen.
|
||||
* @param flags Optional voting flags.
|
||||
* @return True on success, false if this menu already has a vote session
|
||||
* in progress.
|
||||
* @error Invalid Handle, or a vote is already in progress.
|
||||
*/
|
||||
native bool:VoteMenu(Handle:menu, clients[], numClients, time);
|
||||
native bool:VoteMenu(Handle:menu, clients[], numClients, time, flags=0);
|
||||
|
||||
/**
|
||||
* Sends a vote menu to all clients. See VoteMenu() for more information.
|
||||
*
|
||||
* @param menu Menu Handle.
|
||||
* @param time Maximum time to leave menu on the screen.
|
||||
* @param flags Optional voting flags.
|
||||
* @return True on success, false if this menu already has a vote session
|
||||
* in progress.
|
||||
* @error Invalid Handle.
|
||||
*/
|
||||
stock VoteMenuToAll(Handle:menu, time)
|
||||
stock VoteMenuToAll(Handle:menu, time, flags=0)
|
||||
{
|
||||
new num = GetMaxClients();
|
||||
new total;
|
||||
@ -499,7 +503,7 @@ stock VoteMenuToAll(Handle:menu, time)
|
||||
players[total++] = i;
|
||||
}
|
||||
|
||||
return VoteMenu(menu, players, total, time);
|
||||
return VoteMenu(menu, players, total, time, flags);
|
||||
}
|
||||
/**
|
||||
* Callback for when a vote has ended and results are available.
|
||||
@ -543,7 +547,7 @@ native CheckVoteDelay();
|
||||
/**
|
||||
* Returns whether a client is in the pool of clients allowed
|
||||
* to participate in the current vote. This is determined by
|
||||
* the client list passed to StartVote().
|
||||
* the client list passed to VoteMenu().
|
||||
*
|
||||
* @param client Client index.
|
||||
* @return True if client is allowed to vote, false otherwise.
|
||||
@ -555,12 +559,13 @@ native bool:IsClientInVotePool(client);
|
||||
* Redraws the current vote menu to a client in the voting pool.
|
||||
*
|
||||
* @param client Client index.
|
||||
* @param revotes True to allow revotes, false otherwise.
|
||||
* @return True on success, false if the client is in the vote pool
|
||||
* but cannot vote again.
|
||||
* @error No vote in progress, client is not in the voting pool,
|
||||
* or client index is invalid.
|
||||
*/
|
||||
native bool:RedrawClientVoteMenu(client);
|
||||
native bool:RedrawClientVoteMenu(client, bool:revotes=true);
|
||||
|
||||
/**
|
||||
* Returns a style's global Handle.
|
||||
@ -807,3 +812,4 @@ stock bool:IsNewVoteAllowed()
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@
|
||||
#include <IHandleSys.h>
|
||||
|
||||
#define SMINTERFACE_MENUMANAGER_NAME "IMenuManager"
|
||||
#define SMINTERFACE_MENUMANAGER_VERSION 15
|
||||
#define SMINTERFACE_MENUMANAGER_VERSION 16
|
||||
|
||||
/**
|
||||
* @file IMenuManager.h
|
||||
@ -179,6 +179,8 @@ namespace SourceMod
|
||||
#define MENUFLAG_BUTTON_EXITBACK (1<<1) /**< Menu has an "exit back" button */
|
||||
#define MENUFLAG_NO_SOUND (1<<2) /**< Menu will not have any select sounds */
|
||||
|
||||
#define VOTEFLAG_NO_REVOTES (1<<0) /**< Players cannot change their votes */
|
||||
|
||||
/**
|
||||
* @brief Extended menu options.
|
||||
*/
|
||||
@ -869,7 +871,7 @@ namespace SourceMod
|
||||
* @param num_clients Number of clients to display to.
|
||||
* @param clients Client index array.
|
||||
* @param max_time Maximum time to hold menu for.
|
||||
* @param flags Vote flags (currently unused).
|
||||
* @param flags Vote flags.
|
||||
* @return True on success, false if a vote is in progress.
|
||||
*/
|
||||
virtual bool StartVote(IBaseMenu *menu,
|
||||
@ -914,7 +916,17 @@ namespace SourceMod
|
||||
* @return True on success, false if client is not allowed to vote.
|
||||
*/
|
||||
virtual bool RedrawClientVoteMenu(int client) =0;
|
||||
|
||||
/**
|
||||
* @brief Redraws the current vote menu to a client in the voting pool.
|
||||
*
|
||||
* @param client Client index.
|
||||
* @param revotes True to allow revotes, false otherwise.
|
||||
* @return True on success, false if client is not allowed to vote.
|
||||
*/
|
||||
virtual bool RedrawClientVoteMenu2(int client, bool revotes) =0;
|
||||
};
|
||||
}
|
||||
|
||||
#endif //_INCLUDE_SOURCEMOD_MENU_SYSTEM_H_
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user