re-using the function xen made for comperator. differentiating between leader and admin nom a bit more clearly

This commit is contained in:
jenz 2024-07-23 19:40:48 +02:00
parent b354b75736
commit 103cbc4d56
2 changed files with 51 additions and 40 deletions

View File

@ -282,7 +282,7 @@ public void OnPluginStart()
g_Cvar_ExtendFragStep = CreateConVar("mce_extend_fragstep", "10", "Specifies how many more frags are allowed when map is extended.", _, true, 5.0);
g_Cvar_ExcludeMaps = CreateConVar("mce_exclude", "5", "Specifies how many past maps to exclude from the vote.", _, true, 0.0);
g_Cvar_ExcludeMapsTime = CreateConVar("mce_exclude_time", "5h", "Specifies how long in minutes an old map is excluded from the vote.");
g_Cvar_IncludeMaps = CreateConVar("mce_include", "5", "Specifies how many maps to include in the vote.", _, true, 2.0, true, 7.0);
g_Cvar_IncludeMaps = CreateConVar("mce_include", "5", "Specifies how many maps to include in the vote.", _, true, 2.0, true, 9.0);
g_Cvar_IncludeMapsReserved = CreateConVar("mce_include_reserved", "2", "Specifies how many private/random maps to include in the vote.", _, true, 0.0, true, 5.0);
g_Cvar_NoVoteMode = CreateConVar("mce_novote", "1", "Specifies whether or not MapChooser should pick a map if no votes are received.", _, true, 0.0, true, 1.0);
g_Cvar_Extend = CreateConVar("mce_extend", "0", "Number of extensions allowed each map.", _, true, 0.0);
@ -1055,13 +1055,12 @@ public Action Command_Mapvote(int client, int args)
public Handle get_most_nominated_maps()
{
int voteSize = GetVoteSize(2);
int arraySize = ByteCountToCells(PLATFORM_MAX_PATH);
Handle most_nominated_maps = CreateArray(arraySize);
StringMap sm = new StringMap();
//november 2023 edit: now the leader can nominate one map per map played that can skip requirements: Expectation is the leader will want to lead the map.
//if leaders abuse the feature they should simply be removed from the feature.
//if leaders abuse the feature they should simply be removed from the leader list file.
char MapleaderNominatedMap[PLATFORM_MAX_PATH];
GetMapleaderNominatedMap(MapleaderNominatedMap);
@ -1075,8 +1074,12 @@ public Handle get_most_nominated_maps()
sm.GetValue(map_iteration, nominate_count_for_particular_map);
//if i is 0 its admin nominated map that must come into the vote.
//if strequal the map was nominated by a leader and most be forced on the vote.
if(!i || StrEqual(map_iteration, MapleaderNominatedMap, false))
//if strequal the map was nominated by a leader and must be forced on the vote.
if (!i)
{
nominate_count_for_particular_map = 1999;
}
else if(StrEqual(map_iteration, MapleaderNominatedMap, false))
{
nominate_count_for_particular_map = 999;
}
@ -1100,37 +1103,21 @@ public Handle get_most_nominated_maps()
}
static char map_[PLATFORM_MAX_PATH];
for (int i = 0; i < voteSize; i++)
StringMapSnapshot sm_snapshot = sm.Snapshot();
ArrayList SortedList = CreateArray(arraySize);
for(int i = 0; i < sm_snapshot.Length; i++)
{
int max_count = 0;
char picked_map[PLATFORM_MAX_PATH];
StringMapSnapshot keys = sm.Snapshot();
for (int j = 0; j < keys.Length; j++)
{
int size = keys.KeyBufferSize(j);
char[] buffer = new char[size];
keys.GetKey(j, buffer, size);
if (StrEqual(buffer, "nominated_maps"))
{
continue;
}
int value = 0;
sm.GetValue(buffer, value);
sm_snapshot.GetKey(i, map_, sizeof(map_));
SortedList.PushString(map_);
}
//first selection has most nominates, second selection second most etc etc
if (value >= max_count)
{
max_count = value;
strcopy(picked_map, sizeof(picked_map), buffer);
}
}
SortedList.SortCustom(NominateListSortCmp, sm);
delete keys;
if (strlen(picked_map) == 0)
{
continue;
}
sm.Remove(picked_map);
for(int i = 0; i < GetArraySize(SortedList); i++)
{
char picked_map[MAX_NAME_LENGTH];
GetArrayString(SortedList, i, picked_map, sizeof(picked_map));
//2023 edit: respecting that only right amount of maps per group is allowed in vote
int groups_[32];
@ -1175,6 +1162,26 @@ public Handle get_most_nominated_maps()
return most_nominated_maps;
}
int NominateListSortCmp(int index1, int index2, Handle array, Handle hndl)
{
char map1[PLATFORM_MAX_PATH];
char map2[PLATFORM_MAX_PATH];
GetArrayString(array, index1, map1, sizeof(map1));
GetArrayString(array, index2, map2, sizeof(map2));
int count1, count2;
StringMap sm = view_as<StringMap>(hndl);
sm.GetValue(map1, count1);
sm.GetValue(map2, count2);
if (count1 == count2)
return 0;
return count1 > count2 ? -1 : 1;
}
/**
* Starts a new map vote
*
@ -1279,7 +1286,7 @@ void InitiateVote(MapChange when, Handle inputlist=INVALID_HANDLE)
//2023 edit to allow multiple nominations per player
Handle most_nominated_maps = get_most_nominated_maps();
int voteSize = GetVoteSize(2); //voteSize wrong size probably for my for loop
int voteSize = GetVoteSize(0); //voteSize wrong size probably for my for loop
if(GetConVarBool(g_Cvar_RandomizeNominations))
randomizeList = CloneArray(most_nominated_maps);
@ -1410,7 +1417,7 @@ void InitiateVote(MapChange when, Handle inputlist=INVALID_HANDLE)
//SetMenuExitButton(g_VoteMenu, false);
if(GetVoteSize(2) <= GetMaxPageItems(GetMenuStyle(g_VoteMenu)))
if(GetVoteSize(0) <= GetMaxPageItems(GetMenuStyle(g_VoteMenu)))
{
//This is necessary to get items 9 and 0 as usable voting items
SetMenuPagination(g_VoteMenu, MENU_NO_PAGINATION);
@ -1972,7 +1979,7 @@ void CreateNextVote()
delete TimeMapListSnapshot;
}
int voteSize = GetVoteSize(2);
int voteSize = GetVoteSize(0);
int limit = (voteSize < GetArraySize(tempMaps) ? voteSize : GetArraySize(tempMaps));
// group -> number of maps nominated from group
@ -2125,12 +2132,12 @@ NominateResult InternalNominateMap(char[] map, int owner)
PushArrayString(g_NominateList[owner], map);
PushArrayCell(g_NominateOwners, owner); //maybe i only want to do this for the first nomination of each client
if(owner == 0 && g_NominateReservedCount < GetVoteSize(1))
if(owner == 0 && g_NominateReservedCount < GetVoteSize(0))
g_NominateReservedCount++;
else
g_NominateCount++;
while(GetArraySize(g_NominateList[owner]) > GetVoteSize(2))
while(GetArraySize(g_NominateList[owner]) > GetVoteSize(0))
{
char oldmap[PLATFORM_MAX_PATH];
GetArrayString(g_NominateList[owner], 0, oldmap, PLATFORM_MAX_PATH);

View File

@ -982,7 +982,11 @@ bool PopulateNominateListMenu(Menu menu, int client, const char[] filter = "")
int nominate_count_for_particular_map = 0;
sm.GetValue(map, nominate_count_for_particular_map);
//if its console its admin nomination. if its g_iMapleaderWhoNominatedMap it was map nominated by leader, also has to be correct map out of 3.
if(!owner || (owner == g_iMapleaderWhoNominatedMap && StrEqual(map, g_cMapLeaderNominatedMap)))
if (!owner)
{
nominate_count_for_particular_map = 1999;
}
else if(owner == g_iMapleaderWhoNominatedMap && StrEqual(map, g_cMapLeaderNominatedMap))
{
nominate_count_for_particular_map = 999;
}
@ -1213,7 +1217,7 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p
//2023 November edit: one map nominated by mapleader will automatically go to the vote.
if (param1 == mapLeader && StrEqual(g_cMapLeaderNominatedMap, ""))
{
CPrintToChatAll("{darkorange}[UNLOZE Nominations] {white}The map leader {lightgreen}%N {white}has nominated the map {red}%s{white}. The map will be in the next mapvote.", param1, map);
CPrintToChatAll("{darkorange}[UNLOZE Nominations] {white}The map leader {lightgreen}%N {white}has nominated the map {red}%s{white}. The map will be in the mapvote.", param1, map);
CPrintToChatAll("{lightblue}If the map is nextmap and the leader wont play it he will be removed from leader access.");
Format(g_cMapLeaderNominatedMap, sizeof(g_cMapLeaderNominatedMap), map);
g_iMapleaderWhoNominatedMap = param1;