changing map chooser again to use numbers of votes instead of percentages

This commit is contained in:
jenz 2025-02-23 13:15:52 +01:00
parent dcbfe513d5
commit 239d53c57b
5 changed files with 94 additions and 228 deletions

View File

@ -151,7 +151,6 @@ int g_iPlayerAFKTime;
int g_NominateCount = 0; int g_NominateCount = 0;
int g_NominateReservedCount = 0; int g_NominateReservedCount = 0;
int g_iInterval; int g_iInterval;
float player_mapvote_worth[MAXPLAYERS + 1];
char player_mapvote[MAXPLAYERS + 1][PLATFORM_MAX_PATH]; char player_mapvote[MAXPLAYERS + 1][PLATFORM_MAX_PATH];
MapChange g_ChangeTime; MapChange g_ChangeTime;
@ -514,7 +513,6 @@ public void OnMapStart()
int total_time = (GetConVarInt(g_Cvar_VoteDuration) * 2) + GetConVarInt(g_Cvar_RunOffWarningTime) + 10; int total_time = (GetConVarInt(g_Cvar_VoteDuration) * 2) + GetConVarInt(g_Cvar_RunOffWarningTime) + 10;
ServerCommand("sm_cvar mp_chattime %i", total_time); //prevents map switching supposedly. ServerCommand("sm_cvar mp_chattime %i", total_time); //prevents map switching supposedly.
ServerCommand("sm_cvar sm_vote_progress_hintbox 1"); //yeah its cheesy but does the job.
g_iInterval = 0; g_iInterval = 0;
static char folder[64]; static char folder[64];
GetGameFolderName(folder, sizeof(folder)); GetGameFolderName(folder, sizeof(folder));
@ -617,7 +615,6 @@ public void OnMapEnd()
int total_time = (GetConVarInt(g_Cvar_VoteDuration) * 2) + GetConVarInt(g_Cvar_RunOffWarningTime) + 10; int total_time = (GetConVarInt(g_Cvar_VoteDuration) * 2) + GetConVarInt(g_Cvar_RunOffWarningTime) + 10;
ServerCommand("sm_cvar mp_chattime %i", total_time); ServerCommand("sm_cvar mp_chattime %i", total_time);
ServerCommand("sm_cvar sm_vote_progress_hintbox 1"); //yeah its cheesy but does the job.
g_iInterval = 0; g_iInterval = 0;
g_HasVoteStarted = false; g_HasVoteStarted = false;
g_WaitingForVote = false; g_WaitingForVote = false;
@ -682,7 +679,6 @@ public void OnClientPutInServer(int client)
public void OnClientDisconnect(int client) public void OnClientDisconnect(int client)
{ {
is_bot_player[client] = false; is_bot_player[client] = false;
player_mapvote_worth[client] = 0.0;
Format(player_mapvote[client], 128, ""); Format(player_mapvote[client], 128, "");
int index = FindValueInArray(g_NominateOwners, client); int index = FindValueInArray(g_NominateOwners, client);
@ -753,32 +749,10 @@ public Action Command_ReloadMaps(int client, int args)
public Action Command_hours_average(int client, int args) public Action Command_hours_average(int client, int args)
{ {
float total_votes = 0.0; int nominate_worth = GetPlayerWorthRTV_boost_(client);
for (int i = 0; i < MaxClients; i++) CReplyToCommand(client, "Average hour count is: %i \nYour mapvote and rtv boost is: %i",
{
if (IsValidClient(i) && !is_bot_player[i] && PM_IsPlayerSteam(i))
{
GetPlayerWorthRTV_(i);
float nominate_worth = GetPlayerWorthRTV_boost_(i);
if (nominate_worth < 1.0)
{
nominate_worth = 1.0;
}
total_votes += nominate_worth;
}
}
float nominate_worth = GetPlayerWorthRTV_boost_(client);
if (nominate_worth < 1.0)
{
nominate_worth = 1.0;
}
CReplyToCommand(client, "Average hour count for nominations is: %i \nAverage hour count for mapvote and rtv boost is: %i \nYour mapvote and rtv boost is %0.1f \n(%i%% mapvote) (%i%% rtv)",
GetAveragePlayerTimeOnServer(), GetAveragePlayerTimeOnServer(),
GetAveragePlayerTimeOnServerRTV(), nominate_worth);
nominate_worth,
RoundToFloor((nominate_worth/total_votes) * 100),
GetRtvPercentage(client));
return Plugin_Handled; return Plugin_Handled;
} }
@ -1172,11 +1146,7 @@ public Handle get_most_nominated_maps(bool create_next_vote)
} }
else else
{ {
int nominate_worth = RoundToFloor(GetPlayerWorthRTV_boost_(i)); int nominate_worth = GetPlayerWorthRTV_boost_(i);
if (nominate_worth < 1)
{
nominate_worth = 1;
}
nominate_count_for_particular_map += nominate_worth; nominate_count_for_particular_map += nominate_worth;
} }
sm.SetValue(map_iteration, nominate_count_for_particular_map, true); sm.SetValue(map_iteration, nominate_count_for_particular_map, true);
@ -1328,7 +1298,6 @@ void InitiateVote(MapChange when, Handle inputlist=INVALID_HANDLE)
g_ChangeTime = when; g_ChangeTime = when;
ServerCommand("sm_cvar sm_vote_progress_hintbox 0"); //yeah its cheesy but does the job.
g_iInterval = GetConVarInt(g_Cvar_VoteDuration); g_iInterval = GetConVarInt(g_Cvar_VoteDuration);
CreateTimer(1.0, Timer_Countdown, _, TIMER_REPEAT); CreateTimer(1.0, Timer_Countdown, _, TIMER_REPEAT);
@ -1535,24 +1504,16 @@ void InitiateVote(MapChange when, Handle inputlist=INVALID_HANDLE)
MenuShufflePerClient(g_VoteMenu, MenuRandomShuffleStart, GetMenuItemCount(g_VoteMenu) - MenuRandomShuffleStop); MenuShufflePerClient(g_VoteMenu, MenuRandomShuffleStart, GetMenuItemCount(g_VoteMenu) - MenuRandomShuffleStop);
//VoteMenuToAll(g_VoteMenu, voteDuration); //VoteMenuToAll(g_VoteMenu, voteDuration);
//2023 excluding nosteamers and autismbots.
int clients[MAXPLAYERS + 1]; int clients[MAXPLAYERS + 1];
int count = 0; int count = 0;
//here we pick clients to show the vote to, we dont show it to autismbots and nosteamers. //here we pick clients to show the vote to, we dont show it to autismbots and nosteamers.
for (int i = 0; i < MaxClients; i++) for (int i = 0; i < MaxClients; i++)
{ {
player_mapvote_worth[i] = 0.0;
Format(player_mapvote[i], 128, ""); Format(player_mapvote[i], 128, "");
if (IsValidClient(i) && PM_IsPlayerSteam(i) && !is_bot_player[i]) //2023 excluding autismbots.
if (IsValidClient(i) && !is_bot_player[i])
{ {
GetPlayerWorthRTV_(i);
float nominate_worth = GetPlayerWorthRTV_boost_(i);
if (nominate_worth < 1.0)
{
nominate_worth = 1.0;
}
player_mapvote_worth[i] = nominate_worth;
clients[count] = i; clients[count] = i;
count++; count++;
} }
@ -1575,26 +1536,26 @@ public Action Timer_Countdown(Handle timer)
if (g_iInterval <= 0) if (g_iInterval <= 0)
return Plugin_Stop; return Plugin_Stop;
float most_voted[3]; int most_voted[3];
char most_voted_map[3][PLATFORM_MAX_PATH]; char most_voted_map[3][PLATFORM_MAX_PATH];
for (int j = 0; j < 3; j++) for (int j = 0; j < 3; j++)
{ {
float max_count = 0.0; int max_count = 0;
StringMap sm = new StringMap(); StringMap sm = new StringMap();
char picked_map[PLATFORM_MAX_PATH]; char picked_map[PLATFORM_MAX_PATH];
for (int i = 0; i < MaxClients; i++) for (int i = 0; i < MaxClients; i++)
{ {
if (IsValidClient(i) && !StrEqual(player_mapvote[i], "") && !is_bot_player[i] && PM_IsPlayerSteam(i)) if (IsValidClient(i) && !StrEqual(player_mapvote[i], "") && !is_bot_player[i] )
{ {
if (StrEqual(player_mapvote[i], most_voted_map[0]) || StrEqual(player_mapvote[i], most_voted_map[1]) || if (StrEqual(player_mapvote[i], most_voted_map[0]) || StrEqual(player_mapvote[i], most_voted_map[1]) ||
StrEqual(player_mapvote[i], most_voted_map[2])) StrEqual(player_mapvote[i], most_voted_map[2]))
{ {
continue; continue;
} }
float value = 0.0; int value = 0;
sm.GetValue(player_mapvote[i], value); sm.GetValue(player_mapvote[i], value);
value += player_mapvote_worth[i]; value += GetPlayerWorthRTV_boost_(i);
sm.SetValue(player_mapvote[i], value, true); sm.SetValue(player_mapvote[i], value, true);
if (value >= max_count) if (value >= max_count)
{ {
@ -1608,52 +1569,50 @@ public Action Timer_Countdown(Handle timer)
delete sm; delete sm;
} }
float total_votes = 0.0; int total_votes = 0;
float voted_so_far = 0.0; int voted_so_far = 0;
for (int i = 0; i < MaxClients; i++) for (int i = 0; i < MaxClients; i++)
{ {
if (IsValidClient(i) && !is_bot_player[i] && PM_IsPlayerSteam(i)) if (IsValidClient(i) && !is_bot_player[i])
{ {
total_votes += player_mapvote_worth[i]; total_votes += GetPlayerWorthRTV_boost_(i);
//LogMessage("client: %N player_mapvote_worth i: %f", i, player_mapvote_worth[i]);
if (!StrEqual(player_mapvote[i], "")) if (!StrEqual(player_mapvote[i], ""))
{ {
voted_so_far += player_mapvote_worth[i]; voted_so_far += GetPlayerWorthRTV_boost_(i);
} }
} }
} }
//why on earth is %%%s needed for formatting it to show a % lmao. just %s, "%" or %% on their own dont work.
if (strlen(most_voted_map[2]) > 0) if (strlen(most_voted_map[2]) > 0)
{ {
//displaying 3 most voted maps //displaying 3 most voted maps
PrintHintTextToAll("Votes: %i/100%%%s, %ds left\n1. %s: (%i%%%s)\n2. %s: (%i%%%s)\n3. %s: (%i%%%s)", RoundToFloor((voted_so_far/total_votes) * 100), PrintHintTextToAll("Votes: %i/%i, %ds left\n1. %s: (%i/%i)\n2. %s: (%i/%i)\n3. %s: (%i/%i)", voted_so_far, total_votes,
"%", g_iInterval, most_voted_map[0], RoundToFloor((most_voted[0]/total_votes) * 100), "%", most_voted_map[1], RoundToFloor((most_voted[1]/total_votes) * 100), "%", g_iInterval, most_voted_map[0], most_voted[0], total_votes, most_voted_map[1], most_voted[1], total_votes,
"%", most_voted_map[2], RoundToFloor((most_voted[2]/total_votes) * 100), "%"); most_voted_map[2], most_voted[2], total_votes);
} }
else if (strlen(most_voted_map[1]) > 0) else if (strlen(most_voted_map[1]) > 0)
{ {
//displaying 2 most voted maps //displaying 2 most voted maps
PrintHintTextToAll("Votes: %i/100%%%s, %ds left\n1. %s: (%i%%%s)\n2. %s: (%i%%%s)", RoundToFloor((voted_so_far/total_votes) * 100), "%", g_iInterval, PrintHintTextToAll("Votes: %i/%i, %ds left\n1. %s: (%i/%i)\n2. %s: (%i/%i)", voted_so_far, total_votes, g_iInterval,
most_voted_map[0], RoundToFloor((most_voted[0]/total_votes) * 100), "%", most_voted_map[1], RoundToFloor((most_voted[1]/total_votes) * 100), "%"); most_voted_map[0], most_voted[0], total_votes, most_voted_map[1], most_voted[1], total_votes);
} }
else if (strlen(most_voted_map[0]) > 0) else if (strlen(most_voted_map[0]) > 0)
{ {
//displaying the most voted map //displaying the most voted map
PrintHintTextToAll("Votes: %i/100%%%s, %ds left\n1. %s: (%i%%%s)", RoundToFloor((voted_so_far/total_votes) * 100), PrintHintTextToAll("Votes: %i/%i, %ds left\n1. %s: (%i/%i)", voted_so_far, total_votes,
"%", g_iInterval, most_voted_map[0], RoundToFloor((most_voted[0]/total_votes) * 100), "%"); g_iInterval, most_voted_map[0], most_voted[0], total_votes);
} }
else else
{ {
//displaying just the votecount and vote duration remaining //displaying just the votecount and vote duration remaining
PrintHintTextToAll("Votes: %i/100%%%s, %ds left", RoundToFloor((voted_so_far/total_votes) * 100), "%", g_iInterval); PrintHintTextToAll("Votes: %i/%i, %ds left", voted_so_far, total_votes, g_iInterval);
} }
g_iInterval--; g_iInterval--;
return Plugin_Continue; return Plugin_Continue;
} }
public void Handler_VoteFinishedGeneric(char[] map, public void Handler_VoteFinishedGeneric(char[] map,
float num_votes, int num_votes,
float map_votes) int map_votes)
{ {
Call_StartForward(g_MapVoteEndForward); Call_StartForward(g_MapVoteEndForward);
Call_PushString(map); Call_PushString(map);
@ -1681,7 +1640,7 @@ public void Handler_VoteFinishedGeneric(char[] map,
if(fraglimit) if(fraglimit)
SetConVarInt(g_Cvar_Fraglimit, fraglimit + GetConVarInt(g_Cvar_ExtendFragStep)); SetConVarInt(g_Cvar_Fraglimit, fraglimit + GetConVarInt(g_Cvar_ExtendFragStep));
PrintToChatAll("The current map has been extended. (Received %i%s of votes)", RoundToFloor((map_votes /num_votes)*100.0), "%"); PrintToChatAll("The current map has been extended. (Received %i/%i of votes)", map_votes, num_votes);
LogAction(-1, -1, "Voting for next map has finished. The current map has been extended."); LogAction(-1, -1, "Voting for next map has finished. The current map has been extended.");
CPrintToChatAll("[MCE] Available Extends: %d", GetConVarInt(g_Cvar_Extend) - g_Extends); CPrintToChatAll("[MCE] Available Extends: %d", GetConVarInt(g_Cvar_Extend) - g_Extends);
@ -1698,7 +1657,7 @@ public void Handler_VoteFinishedGeneric(char[] map,
} }
else if(strcmp(map, VOTE_DONTCHANGE, false) == 0) else if(strcmp(map, VOTE_DONTCHANGE, false) == 0)
{ {
PrintToChatAll("[MCE] Current map continues! The Vote has spoken! (Received %i%s of votes)", RoundToFloor((map_votes /num_votes)*100.0), "%"); PrintToChatAll("[MCE] Current map continues! The Vote has spoken! (Received %i/%i of votes)", map_votes, num_votes);
LogAction(-1, -1, "Voting for next map has finished. 'No Change' was the winner"); LogAction(-1, -1, "Voting for next map has finished. 'No Change' was the winner");
g_RunoffCount = 0; g_RunoffCount = 0;
@ -1731,23 +1690,17 @@ public void Handler_VoteFinishedGeneric(char[] map,
g_MapVoteCompleted = true; g_MapVoteCompleted = true;
//checking on MapStart and MapEnd is not good enough. Players are not considered alive and on teams at those points in time. //checking on MapStart and MapEnd is not good enough. Players are not considered alive and on teams at those points in time.
//therefore instead applying the bool here after the mapvote completed. //therefore instead applying the bool here after the mapvote completed.
/*
if(InternalAreRestrictionsActive(false))
g_SaveCDOnMapEnd = true;
else
g_SaveCDOnMapEnd = false;
*/
g_SaveCDOnMapEnd = true; g_SaveCDOnMapEnd = true;
//PrintToChatAll("map: %s", map); //PrintToChatAll("map: %s", map);
if (g_ChangeTime == MapChange_MapEnd) if (g_ChangeTime == MapChange_MapEnd)
{ {
CPrintToChatAll("[MCE] %t", "Extend Voting Failed", RoundToFloor((map_votes /num_votes)*100.0)); CPrintToChatAll("[MCE] %t", "Extend Voting Failed", map_votes, num_votes);
g_MapVoteCompleted = false; //this was only the extend or dont extend vote, still need actual mapvote. g_MapVoteCompleted = false; //this was only the extend or dont extend vote, still need actual mapvote.
} }
else else
{ {
CPrintToChatAll("[MCE] %t", "Nextmap Voting Finished", map, RoundToFloor((map_votes /num_votes)*100.0)); CPrintToChatAll("[MCE] %t", "Nextmap Voting Finished", map, map_votes, num_votes);
LogAction(-1, -1, "Voting for next map has finished. Nextmap: %s.", map); LogAction(-1, -1, "Voting for next map has finished. Nextmap: %s.", map);
} }
} }
@ -1761,9 +1714,9 @@ public void Handler_MapVoteFinished(Handle menu,
const int[][] item_info) const int[][] item_info)
{ {
g_iInterval = 1; //we display it shortly after finishing g_iInterval = 1; //we display it shortly after finishing
ServerCommand("sm_cvar sm_vote_progress_hintbox 1"); //yeah its cheesy but does the job.
//reweighting votes
StringMap sm = new StringMap(); StringMap sm = new StringMap();
for (int i = 0; i < num_clients; i++) for (int i = 0; i < num_clients; i++)
{ {
int client = client_info[i][0]; int client = client_info[i][0];
@ -1780,33 +1733,28 @@ public void Handler_MapVoteFinished(Handle menu,
break; break;
} }
} }
float value = 0.0;
sm.GetValue(map, value);
float nominate_worth = GetPlayerWorthRTV_boost_(client); int value = 0;
if (nominate_worth < 1.0) sm.GetValue(map, value);
{ value += GetPlayerWorthRTV_boost_(client);
nominate_worth = 1.0;
}
value += nominate_worth;
sm.SetValue(map, value, true); sm.SetValue(map, value, true);
} }
} }
//ordering stringmap by voteweight //ordering stringmap by voteweight
float[] weighted_votes = new float[num_items]; int[] weighted_votes = new int[num_items];
char[][] weighted_maps = new char[num_items][PLATFORM_MAX_PATH]; char[][] weighted_maps = new char[num_items][PLATFORM_MAX_PATH];
for (int i = 0; i < num_items; i++) for (int i = 0; i < num_items; i++)
{ {
StringMapSnapshot keys = sm.Snapshot(); StringMapSnapshot keys = sm.Snapshot();
float max_count = 0.0; int max_count = 0;
char picked_map[PLATFORM_MAX_PATH]; char picked_map[PLATFORM_MAX_PATH];
for (int j = 0; j < keys.Length; j++) for (int j = 0; j < keys.Length; j++)
{ {
int size = keys.KeyBufferSize(j); int size = keys.KeyBufferSize(j);
char[] buffer = new char[size]; char[] buffer = new char[size];
keys.GetKey(j, buffer, size); keys.GetKey(j, buffer, size);
float value = 0.0; int value = 0;
sm.GetValue(buffer, value); sm.GetValue(buffer, value);
//first selection has most votes, second selection second most etc etc //first selection has most votes, second selection second most etc etc
@ -1823,18 +1771,11 @@ public void Handler_MapVoteFinished(Handle menu,
} }
delete sm; delete sm;
float total_votes = 0.0;
for (int i = 0; i < MaxClients; i++)
{
if (IsValidClient(i) && !is_bot_player[i] && PM_IsPlayerSteam(i))
{
total_votes += player_mapvote_worth[i];
}
}
// Implement revote logic - Only run this` block if revotes are enabled and this isn't the last revote' // Implement revote logic - Only run this` block if revotes are enabled and this isn't the last revote'
//LogMessage("Mapchooser_extended_avg Handler_MapVoteFinished."); //LogMessage("Mapchooser_extended_avg Handler_MapVoteFinished.");
int required_percent = GetConVarInt(g_Cvar_RunOffPercent); int required_percent = GetConVarInt(g_Cvar_RunOffPercent);
int most_voted_map_percentage = RoundToFloor((weighted_votes[0] / total_votes) * 100);
int most_voted_map_percentage = ((weighted_votes[0] / num_votes) * 100);
if(GetConVarBool(g_Cvar_RunOff) && g_RunoffCount < GetConVarInt(g_Cvar_MaxRunOffs) && num_items > 1 && g_ChangeTime != MapChange_MapEnd && if(GetConVarBool(g_Cvar_RunOff) && g_RunoffCount < GetConVarInt(g_Cvar_MaxRunOffs) && num_items > 1 && g_ChangeTime != MapChange_MapEnd &&
(weighted_votes[0] == weighted_votes[1] || most_voted_map_percentage < required_percent)) (weighted_votes[0] == weighted_votes[1] || most_voted_map_percentage < required_percent))
{ {
@ -1896,7 +1837,7 @@ public void Handler_MapVoteFinished(Handle menu,
g_WaitingForVote = false; g_WaitingForVote = false;
//LogMessage("Mapchooser_extended_avg no revote needed, continue as normal."); //LogMessage("Mapchooser_extended_avg no revote needed, continue as normal.");
// No revote needed, continue as normal. // No revote needed, continue as normal.
Handler_VoteFinishedGeneric(weighted_maps[0], total_votes, weighted_votes[0]); Handler_VoteFinishedGeneric(weighted_maps[0], num_votes, weighted_votes[0]); //change again
} }
public int Handler_MapVoteMenu(Handle menu, MenuAction action, int param1, int param2) public int Handler_MapVoteMenu(Handle menu, MenuAction action, int param1, int param2)
@ -1927,23 +1868,15 @@ public int Handler_MapVoteMenu(Handle menu, MenuAction action, int param1, int p
Format(player_mapvote[param1], 128, ""); Format(player_mapvote[param1], 128, "");
static char buffer[255]; static char buffer[255];
//displaying to the client how much percent his vote is worth. //displaying to the client how much his vote is worth.
float total_votes = 0.0;
for (int i = 0; i < MaxClients; i++)
{
if (IsValidClient(i) && !is_bot_player[i] && PM_IsPlayerSteam(i))
{
total_votes += player_mapvote_worth[i];
}
}
//second parameter shows for example 5.0, last parameter is how much percentage of the entire vote the client decides. //second parameter shows for example 5.0, last parameter is how much percentage of the entire vote the client decides.
if (g_ChangeTime == MapChange_MapEnd) if (g_ChangeTime == MapChange_MapEnd)
{ {
Format(buffer, sizeof(buffer), "%T", "Vote Extend", param1, player_mapvote_worth[param1], RoundToFloor((player_mapvote_worth[param1]/total_votes) * 100)); Format(buffer, sizeof(buffer), "%T", "Vote Extend", param1, GetPlayerWorthRTV_boost_(param1));
} }
else else
{ {
Format(buffer, sizeof(buffer), "%T", "Vote Nextmap", param1, player_mapvote_worth[param1], RoundToFloor((player_mapvote_worth[param1]/total_votes) * 100)); Format(buffer, sizeof(buffer), "%T", "Vote Nextmap", param1, GetPlayerWorthRTV_boost_(param1));
} }
Handle panel = view_as<Handle>(param2); Handle panel = view_as<Handle>(param2);
SetPanelTitle(panel, buffer); SetPanelTitle(panel, buffer);
@ -2036,7 +1969,6 @@ public int Handler_MapVoteMenu(Handle menu, MenuAction action, int param1, int p
g_HasVoteStarted = false; g_HasVoteStarted = false;
g_RunoffCount = 0; g_RunoffCount = 0;
g_iInterval = 1; //we display it shortly after finishing g_iInterval = 1; //we display it shortly after finishing
ServerCommand("sm_cvar sm_vote_progress_hintbox 1"); //yeah its cheesy but does the job.
} }
} }
return 0; return 0;
@ -3209,7 +3141,6 @@ stock int InternalGetMapTimeRestriction(const char[] map)
public void OnClientPostAdminCheck(int client) public void OnClientPostAdminCheck(int client)
{ {
is_bot_player[client] = false; is_bot_player[client] = false;
player_mapvote_worth[client] = 0.0;
Format(player_mapvote[client], 128, ""); Format(player_mapvote[client], 128, "");
char auth[50]; char auth[50];
GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth)); GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth));
@ -3242,7 +3173,7 @@ stock int InternalGetMapPlayerRestriction(const char[] map)
for (int client = 1; client <= MaxClients; client++) for (int client = 1; client <= MaxClients; client++)
{ {
if (IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client) && !IsClientSourceTV(client) && !is_bot_player[client] if (IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client) && !IsClientSourceTV(client) && !is_bot_player[client]
&& PM_IsPlayerSteam(client)) )
{ {
NumPlayers++; NumPlayers++;
} }

View File

@ -169,7 +169,6 @@ public void sql_select_hiding_unavailable_maps(int client)
char query[255]; char query[255];
char steam_auth[64]; char steam_auth[64];
GetClientAuthId(client, AuthId_Steam2, steam_auth, sizeof(steam_auth)); GetClientAuthId(client, AuthId_Steam2, steam_auth, sizeof(steam_auth));
//we have way too many dbs, just adding this to unloze_race_timer
Format(query, sizeof(query), "SELECT is_ignoring FROM `mapchooser_hide_unavailable` where steam_auth = '%s'", steam_auth); Format(query, sizeof(query), "SELECT is_ignoring FROM `mapchooser_hide_unavailable` where steam_auth = '%s'", steam_auth);
g_dDatabase.Query(SQL_OnQueryCompleted_ignoring, query, GetClientSerial(client)); g_dDatabase.Query(SQL_OnQueryCompleted_ignoring, query, GetClientSerial(client));
} }
@ -501,7 +500,7 @@ public Action Command_Removemap(int client, int args)
GetCmdArg(1, mapname, sizeof(mapname)); GetCmdArg(1, mapname, sizeof(mapname));
// int status; // int status;
if(/*!GetTrieValue(g_mapTrie, mapname, status)*/!IsMapValid(mapname)) if(!IsMapValid(mapname))
{ {
CReplyToCommand(client, "%t", "Map was not found", mapname); CReplyToCommand(client, "%t", "Map was not found", mapname);
AttemptAdminRemoveMap(client, mapname); AttemptAdminRemoveMap(client, mapname);
@ -669,7 +668,6 @@ public Action Command_Nominate(int client, int args)
static char mapname[PLATFORM_MAX_PATH]; static char mapname[PLATFORM_MAX_PATH];
GetCmdArg(1, mapname, sizeof(mapname)); GetCmdArg(1, mapname, sizeof(mapname));
int status; int status;
if(!GetTrieValue(g_mapTrie, mapname, status)) if(!GetTrieValue(g_mapTrie, mapname, status))
{ {
@ -773,11 +771,7 @@ public Action Command_Nominate(int client, int args)
if(result == Nominate_Added) if(result == Nominate_Added)
{ {
int nominate_worth = RoundToFloor(GetPlayerWorthRTV_boost_(client)); int nominate_worth = GetPlayerWorthRTV_boost_(client);
if (nominate_worth < 1)
{
nominate_worth = 1;
}
PrintToChatAll("[NE] %t", "Map Nominated", name, mapname, nominate_worth); PrintToChatAll("[NE] %t", "Map Nominated", name, mapname, nominate_worth);
} }
else if(result == Nominate_Replaced) else if(result == Nominate_Replaced)
@ -850,12 +844,7 @@ void AttemptNominate(int client, const char[] filter = "")
Menu menu = g_MapMenu; Menu menu = g_MapMenu;
menu = BuildMapMenu(filter, client); menu = BuildMapMenu(filter, client);
GetPlayerWorthRTV_(client); int nominate_worth = GetPlayerWorthRTV_boost_(client);
int nominate_worth = RoundToFloor(GetPlayerWorthRTV_boost_(client));
if (nominate_worth < 1)
{
nominate_worth = 1;
}
SetMenuTitle(menu, "%T", "Nominate Title", client, nominate_worth); SetMenuTitle(menu, "%T", "Nominate Title", client, nominate_worth);
DisplayMenu(menu, client, MENU_TIME_FOREVER); DisplayMenu(menu, client, MENU_TIME_FOREVER);
} }
@ -946,11 +935,8 @@ bool PopulateNominateListMenu(Menu menu, int client, const char[] filter = "")
} }
else else
{ {
int nominate_worth = RoundToFloor(GetPlayerWorthRTV_boost_(owner)); int nominate_worth = GetPlayerWorthRTV_boost_(owner);
if (nominate_worth < 1) //atm everybody just has equal voting again, so this is just += 1
{
nominate_worth = 1;
}
nominate_count_for_particular_map += nominate_worth; nominate_count_for_particular_map += nominate_worth;
} }
sm.SetValue(map, nominate_count_for_particular_map, true); sm.SetValue(map, nominate_count_for_particular_map, true);
@ -1207,11 +1193,7 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p
if(result == Nominate_Added) if(result == Nominate_Added)
{ {
int nominate_worth = RoundToFloor(GetPlayerWorthRTV_boost_(param1)); int nominate_worth = GetPlayerWorthRTV_boost_(param1);
if (nominate_worth < 1)
{
nominate_worth = 1;
}
PrintToChatAll("[NE] %t", "Map Nominated", name, map, nominate_worth); PrintToChatAll("[NE] %t", "Map Nominated", name, map, nominate_worth);
} }
else if(result == Nominate_Replaced) else if(result == Nominate_Replaced)

View File

@ -68,7 +68,7 @@ ConVar g_Cvar_RTVRevoteDelay;
bool is_bot_player[MAXPLAYERS + 1]; bool is_bot_player[MAXPLAYERS + 1];
bool g_CanRTV = false; // True if RTV loaded maps and is active. bool g_CanRTV = false; // True if RTV loaded maps and is active.
bool g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes. bool g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes.
int g_VotesNeeded = 0; // Necessary votes before map vote begins. (2023: voters average hour count * percent_needed) int g_VotesNeeded = 0; // Necessary votes before map vote begins.
bool g_Voted[MAXPLAYERS+1] = {false, ...}; bool g_Voted[MAXPLAYERS+1] = {false, ...};
int g_iTimeTillRTV[MAXPLAYERS+1] = {0, ...}; int g_iTimeTillRTV[MAXPLAYERS+1] = {0, ...};
@ -200,51 +200,38 @@ public int Native_GetRtvPercentageForClient(Handle plugin, int numParams)
} }
UpdateRTV(); UpdateRTV();
int clients_percentage = 0; int player_worth_rtv = GetPlayerWorthRTV_boost_(client);
if (g_VotesNeeded == 0) return player_worth_rtv;
{
clients_percentage = RoundToFloor((GetPlayerWorthRTV_(client) / float(100)) * 100);
}
else
{
clients_percentage = RoundToFloor((GetPlayerWorthRTV_(client) / float(g_VotesNeeded)) * 100);
}
if (clients_percentage > 100)
{
clients_percentage = 100;
}
return clients_percentage;
} }
void UpdateRTV() void update_g_VotesNeeded()
{ {
int iVotersSteam = 0; int iVoters = 0;
for (int i=1; i<=MaxClients; i++) for (int i=1; i<=MaxClients; i++)
{ {
if (IsClientInGame(i) && !IsFakeClient(i) && !is_bot_player[i]) if (IsClientInGame(i) && !IsFakeClient(i) && !is_bot_player[i])
{ {
if (GetClientIdleTime(i) >= g_Cvar_AFKTime.IntValue) if (GetClientIdleTime(i) >= g_Cvar_AFKTime.IntValue)
continue; continue;
iVoters++;
if (PM_IsPlayerSteam(i))
iVotersSteam++;
} }
} }
g_VotesNeeded = RoundToFloor(iVoters * GetConVarFloat(g_Cvar_Steam_Needed));
if (g_VotesNeeded == 0)
{
g_VotesNeeded = 1;
}
}
g_VotesNeeded = RoundToFloor(float(iVotersSteam) * GetConVarFloat(g_Cvar_Steam_Needed)); void UpdateRTV()
{
g_VotesNeeded *= GetAveragePlayerTimeOnServerRTV();
if (!g_CanRTV) if (!g_CanRTV)
{ {
return; return;
} }
int Votes = get_voted_rtv(); update_g_VotesNeeded();
if (Votes && if (get_voted_rtv() >= g_VotesNeeded && RTVAllowed())
iVotersSteam &&
Votes >= g_VotesNeeded &&
RTVAllowed())
{ {
if (g_Cvar_RTVPostVoteAction.IntValue == 1 && HasEndOfMapVoteFinished()) if (g_Cvar_RTVPostVoteAction.IntValue == 1 && HasEndOfMapVoteFinished())
{ {
@ -262,7 +249,8 @@ public int get_voted_rtv()
{ {
if (IsValidClient(i) && g_Voted[i]) if (IsValidClient(i) && g_Voted[i])
{ {
Votes += GetPlayerWorthRTV_(i); int player_worth_boost = GetPlayerWorthRTV_boost_(i);
Votes += player_worth_boost;
} }
} }
return Votes; return Votes;
@ -322,32 +310,12 @@ void AttemptRTV(int client)
ReplyToCommand(client, "[RTVE] %t", "Wait Before Revoting", g_iTimeTillRTV[client] - GetTime()); ReplyToCommand(client, "[RTVE] %t", "Wait Before Revoting", g_iTimeTillRTV[client] - GetTime());
return; return;
} }
update_g_VotesNeeded();
int Votes = get_voted_rtv();
if (g_Voted[client]) if (g_Voted[client])
{ {
float rtv_worth = GetPlayerWorthRTV_boost_(client); ReplyToCommand(client, "[RTVE] %t", "Already Voted", Votes, g_VotesNeeded, GetPlayerWorthRTV_boost_(client));
int Votes = get_voted_rtv();
if (g_VotesNeeded == 0)
{
g_VotesNeeded = Votes;
}
int rtv_percentage_reached = RoundToFloor((float(Votes) / float(g_VotesNeeded)) * 100);
if (rtv_percentage_reached > 100)
{
rtv_percentage_reached = 100;
}
int clients_percentage = RoundToFloor((GetPlayerWorthRTV_(client) / float(g_VotesNeeded)) * 100);
if (clients_percentage > 100)
{
clients_percentage = 100;
}
ReplyToCommand(client, "[RTVE] %t", "Already Voted", rtv_percentage_reached, rtv_worth, clients_percentage);
return;
}
if (!PM_IsPlayerSteam(client))
{
ReplyToCommand(client, "Disabled rtv participation for nosteamers.");
return; return;
} }
@ -356,23 +324,9 @@ void AttemptRTV(int client)
g_Voted[client] = true; g_Voted[client] = true;
int Votes = get_voted_rtv(); Votes = get_voted_rtv();
float rtv_worth = GetPlayerWorthRTV_boost_(client);
if (g_VotesNeeded == 0) PrintToChatAll("[RTVE] %t", "RTV Requested", name, Votes, g_VotesNeeded, GetPlayerWorthRTV_boost_(client));
{
g_VotesNeeded = Votes;
}
int rtv_percentage_reached = RoundToFloor((float(Votes) / float(g_VotesNeeded)) * 100);
if (rtv_percentage_reached > 100 || rtv_percentage_reached < 0)
{
rtv_percentage_reached = 100;
}
int clients_percentage = RoundToFloor((GetPlayerWorthRTV_(client) / float(g_VotesNeeded)) * 100);
if (clients_percentage > 100 || clients_percentage < 0)
{
clients_percentage = 100;
}
PrintToChatAll("[RTVE] %t", "RTV Requested", name, rtv_percentage_reached, rtv_worth, clients_percentage);
if (Votes >= g_VotesNeeded) if (Votes >= g_VotesNeeded)
{ {
@ -468,7 +422,7 @@ public Action Timer_ChangeMap(Handle hTimer)
{ {
g_InChange = false; g_InChange = false;
LogMessage("RTV changing map manually"); //LogMessage("RTV changing map manually");
char map[PLATFORM_MAX_PATH]; char map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map))) if (GetNextMap(map, sizeof(map)))
@ -523,7 +477,7 @@ public Action Command_DebugRTV(int client, int args)
return Plugin_Handled; return Plugin_Handled;
} }
int iVotersSteam = 0; int iVoters = 0;
for (int i=1; i<=MaxClients; i++) for (int i=1; i<=MaxClients; i++)
{ {
@ -532,12 +486,11 @@ public Action Command_DebugRTV(int client, int args)
if (GetClientIdleTime(i) >= g_Cvar_AFKTime.IntValue) if (GetClientIdleTime(i) >= g_Cvar_AFKTime.IntValue)
continue; continue;
if (PM_IsPlayerSteam(i)) iVoters++;
iVotersSteam++;
} }
} }
int iVotesNeededTotal = RoundToFloor(float(iVotersSteam) * GetConVarFloat(g_Cvar_Steam_Needed)); int iVotesNeededTotal = RoundToFloor(float(iVoters) * GetConVarFloat(g_Cvar_Steam_Needed));
ReplyToCommand(client, "[RTVE] Currently %d Players needed to start a RTV vote.", iVotesNeededTotal); ReplyToCommand(client, "[RTVE] Currently %d Players needed to start a RTV vote.", iVotesNeededTotal);
return Plugin_Handled; return Plugin_Handled;

View File

@ -2,14 +2,14 @@
{ {
"Vote Nextmap" "Vote Nextmap"
{ {
"#format" "{1:.1f},{2:i}" "#format" "{1:i}"
"en" "Vote for the next map! ({1} Mapvote Boost) ({2}%%)" "en" "Vote for the next map! ({1} Mapvote Boost)"
} }
"Vote Extend" "Vote Extend"
{ {
"#format" "{1:.1f},{2:i}" "#format" "{1:i}"
"en" "Vote for the map extend! ({1} Mapvote Boost) ({2}%%)" "en" "Vote for the map extend! ({1} Mapvote Boost)"
} }
"Nextmap Voting Started" "Nextmap Voting Started"
@ -19,14 +19,14 @@
"Nextmap Voting Finished" "Nextmap Voting Finished"
{ {
"#format" "{1:s},{2:i}" "#format" "{1:s},{2:i},{3:i}"
"en" "Map voting has finished. The next map will be {1}. (Received {2}%% of votes)" "en" "Map voting has finished. The next map will be {1}. (Received {2}/{3} of votes)"
} }
"Extend Voting Failed" "Extend Voting Failed"
{ {
"#format" "{1:i}" "#format" "{1:i},{2:i}"
"en" "Extend voting finished. The map was not extended. (Received {1}%% of votes)" "en" "Extend voting finished. The map was not extended. (Received {1}/{2} of votes)"
} }
"Current Map Extended" "Current Map Extended"
@ -47,8 +47,8 @@
"Current Map Stays" "Current Map Stays"
{ {
"#format" "{1:i}" "#format" "{1:i},{2:i}"
"en" "Current map continues! The Vote has spoken! (Received {1}%% of votes)" "en" "Current map continues! The Vote has spoken! (Received {1}/{2} of votes)"
} }
"Changed Next Map" "Changed Next Map"

View File

@ -22,8 +22,8 @@
"Already Voted" "Already Voted"
{ {
"#format" "{1:d},{2:.1f},{3:i}" "#format" "{1:i},{2:i},{3:i}"
"en" "You have already voted to Rock the Vote. ({1}%% RTV reached. ({2} RTV boost) ({3}%%)" "en" "You have already voted to Rock the Vote. ({1}/{2} Votes. ({3} client RTV boost))"
} }
"Wait Before Revoting" "Wait Before Revoting"
@ -44,8 +44,8 @@
"RTV Requested" "RTV Requested"
{ {
"#format" "{1:s},{2:d},{3:.1f},{4:d}" "#format" "{1:s},{2:d},{3:i},{4:i}"
"en" "{1} wants to rock the vote. ({2}%% RTV reached) ({3} RTV boost) ({4}%%)" "en" "{1} wants to rock the vote. ({2}/{3} RTV reached) ({4} RTV boost)."
} }
"RTV Undone" "RTV Undone"