added feature for leader to nominate a map which skips the restrictions
This commit is contained in:
		
							parent
							
								
									0394a2a402
								
							
						
					
					
						commit
						04ab4f9602
					
				| @ -9,6 +9,11 @@ native int PushMapsIntoNominationPool(ArrayList maps); | |||||||
| native int RemoveMapFromNominationPool(char[] map); | native int RemoveMapFromNominationPool(char[] map); | ||||||
| native int RemoveMapsFromNominationPool(ArrayList maps); | native int RemoveMapsFromNominationPool(ArrayList maps); | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @MapleaderNominatedMapname is the map nominated from a map leader | ||||||
|  | */ | ||||||
|  | native void GetMapleaderNominatedMap(char[] MapleaderNominatedMapname); | ||||||
|  | 
 | ||||||
| public SharedPlugin __pl_nominations_extended = | public SharedPlugin __pl_nominations_extended = | ||||||
| { | { | ||||||
| 	name = "nominations", | 	name = "nominations", | ||||||
|  | |||||||
| @ -51,6 +51,7 @@ | |||||||
| #include <sdktools> | #include <sdktools> | ||||||
| #include <multicolors> | #include <multicolors> | ||||||
| #include <PlayerManager> | #include <PlayerManager> | ||||||
|  | #include <nominations_extended> | ||||||
| #include <rockthevote_extended> | #include <rockthevote_extended> | ||||||
| 
 | 
 | ||||||
| #pragma semicolon 1 | #pragma semicolon 1 | ||||||
| @ -236,6 +237,7 @@ public void OnPluginEnd() | |||||||
|             Call_StartForward(g_NominationsResetForward); |             Call_StartForward(g_NominationsResetForward); | ||||||
|             GetArrayString(g_NominateList[i], j, oldmap, PLATFORM_MAX_PATH); |             GetArrayString(g_NominateList[i], j, oldmap, PLATFORM_MAX_PATH); | ||||||
|             Call_PushString(oldmap); |             Call_PushString(oldmap); | ||||||
|  |             Call_PushCell(i); | ||||||
|             Call_Finish(); |             Call_Finish(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -640,6 +642,7 @@ public void OnClientDisconnect(int client) | |||||||
|         char oldmap[PLATFORM_MAX_PATH]; |         char oldmap[PLATFORM_MAX_PATH]; | ||||||
|         GetArrayString(g_NominateList[client], i, oldmap, PLATFORM_MAX_PATH); |         GetArrayString(g_NominateList[client], i, oldmap, PLATFORM_MAX_PATH); | ||||||
|         Call_PushString(oldmap); |         Call_PushString(oldmap); | ||||||
|  |         Call_PushCell(client); | ||||||
|         Call_Finish(); |         Call_Finish(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -1021,6 +1024,11 @@ public Handle get_most_nominated_maps() | |||||||
|     Handle most_nominated_maps = CreateArray(arraySize); |     Handle most_nominated_maps = CreateArray(arraySize); | ||||||
|     StringMap sm = new StringMap(); |     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. | ||||||
|  |     char MapleaderNominatedMap[PLATFORM_MAX_PATH]; | ||||||
|  |     GetMapleaderNominatedMap(MapleaderNominatedMap); | ||||||
|  | 
 | ||||||
|     for (int i = 0; i < MaxClients; i++) |     for (int i = 0; i < MaxClients; i++) | ||||||
|     { |     { | ||||||
|         for (int j = 0; j < GetArraySize(g_NominateList[i]); j++) |         for (int j = 0; j < GetArraySize(g_NominateList[i]); j++) | ||||||
| @ -1030,12 +1038,19 @@ public Handle get_most_nominated_maps() | |||||||
|             int nominate_count_for_particular_map = 0; |             int nominate_count_for_particular_map = 0; | ||||||
|             sm.GetValue(map_iteration, nominate_count_for_particular_map); |             sm.GetValue(map_iteration, nominate_count_for_particular_map); | ||||||
|             nominate_count_for_particular_map++; |             nominate_count_for_particular_map++; | ||||||
|             //if i is 0 its admin nominated map that must come into the vote |             //if i is 0 its admin nominated map that must come into the vote. | ||||||
|             if(!i) |             //if strequal the map was nominated by a leader and most be forced on the vote. | ||||||
|  |             if(!i || StrEqual(map_iteration, MapleaderNominatedMap, false)) | ||||||
|             { |             { | ||||||
|                 nominate_count_for_particular_map = 999; |                 nominate_count_for_particular_map = 999; | ||||||
|             } |             } | ||||||
|             sm.SetValue(map_iteration, nominate_count_for_particular_map, true); |             sm.SetValue(map_iteration, nominate_count_for_particular_map, true); | ||||||
|  | 
 | ||||||
|  |             /* Notify Nominations that this map is now free */ | ||||||
|  |             Call_StartForward(g_NominationsResetForward); | ||||||
|  |             Call_PushString(map_iteration); | ||||||
|  |             Call_PushCell(i + 100); //differentiate between all other calls and the call invoked by get_most_nominated_maps() | ||||||
|  |             Call_Finish(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     static char map_[PLATFORM_MAX_PATH]; |     static char map_[PLATFORM_MAX_PATH]; | ||||||
| @ -1245,27 +1260,9 @@ void InitiateVote(MapChange when, Handle inputlist=INVALID_HANDLE) | |||||||
| 
 | 
 | ||||||
|             if(randomizeList == INVALID_HANDLE) |             if(randomizeList == INVALID_HANDLE) | ||||||
|                 AddMapItem(map); |                 AddMapItem(map); | ||||||
| 
 |  | ||||||
|             RemoveStringFromArray(g_NextMapList, map); |             RemoveStringFromArray(g_NextMapList, map); | ||||||
| 
 |  | ||||||
|             /* Notify Nominations that this map is now free */ |  | ||||||
|             Call_StartForward(g_NominationsResetForward); |  | ||||||
|             Call_PushString(map); |  | ||||||
|             Call_Finish(); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* Clear out the rest of the nominations array */ |  | ||||||
|         for(int i = nominationsToAdd; i < nominateCount; i++) |  | ||||||
|         { |  | ||||||
|             //2023 edit: might need to run all g_NominateList[client] through this instead |  | ||||||
|             GetArrayString(most_nominated_maps, i, map, PLATFORM_MAX_PATH); |  | ||||||
|             /* These maps shouldn't be excluded from the vote as they weren't really nominated at all */ |  | ||||||
| 
 |  | ||||||
|             /* Notify Nominations that this map is now free */ |  | ||||||
|             Call_StartForward(g_NominationsResetForward); |  | ||||||
|             Call_PushString(map); |  | ||||||
|             Call_Finish(); |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         /* There should currently be 'nominationsToAdd' unique maps in the vote */ |         /* There should currently be 'nominationsToAdd' unique maps in the vote */ | ||||||
| 
 | 
 | ||||||
| @ -1521,7 +1518,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)); | ||||||
| 
 | 
 | ||||||
|         CPrintToChatAll("[MCE] %t", "Current Map Extended", RoundToFloor((map_votes /num_votes)*100.0)); |         PrintToChatAll("The current map has been extended. (Received %i%s of votes)", RoundToFloor((map_votes /num_votes)*100.0), "%"); | ||||||
|         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); | ||||||
| 
 | 
 | ||||||
| @ -1532,7 +1529,7 @@ public void Handler_VoteFinishedGeneric(char[] map, | |||||||
|     } |     } | ||||||
|     else if(strcmp(map, VOTE_DONTCHANGE, false) == 0) |     else if(strcmp(map, VOTE_DONTCHANGE, false) == 0) | ||||||
|     { |     { | ||||||
|         CPrintToChatAll("[MCE] %t", "Current Map Stays", RoundToFloor((map_votes /num_votes)*100.0)); |         PrintToChatAll("Current map continues! The Vote has spoken! (Received %i%s of votes)", RoundToFloor((map_votes /num_votes)*100.0), "%"); | ||||||
|         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; | ||||||
| @ -2027,6 +2024,7 @@ NominateResult InternalNominateMap(char[] map, int owner) | |||||||
|         GetArrayString(g_NominateList[owner], 0, oldmap, PLATFORM_MAX_PATH); |         GetArrayString(g_NominateList[owner], 0, oldmap, PLATFORM_MAX_PATH); | ||||||
|         Call_StartForward(g_NominationsResetForward); |         Call_StartForward(g_NominationsResetForward); | ||||||
|         Call_PushString(oldmap); |         Call_PushString(oldmap); | ||||||
|  |         Call_PushCell(owner); | ||||||
|         Call_Finish(); |         Call_Finish(); | ||||||
| 
 | 
 | ||||||
|         RemoveFromArray(g_NominateList[owner], 0); |         RemoveFromArray(g_NominateList[owner], 0); | ||||||
| @ -2079,6 +2077,7 @@ NominateResult InternalNominateMap(char[] map, int owner) | |||||||
|         GetArrayString(g_NominateList[owner], 0, oldmap, PLATFORM_MAX_PATH); |         GetArrayString(g_NominateList[owner], 0, oldmap, PLATFORM_MAX_PATH); | ||||||
|         Call_StartForward(g_NominationsResetForward); |         Call_StartForward(g_NominationsResetForward); | ||||||
|         Call_PushString(oldmap); |         Call_PushString(oldmap); | ||||||
|  |         Call_PushCell(owner); | ||||||
|         int owner_ = GetArrayCell(g_NominateOwners, 0); |         int owner_ = GetArrayCell(g_NominateOwners, 0); | ||||||
|         Call_Finish(); |         Call_Finish(); | ||||||
| 
 | 
 | ||||||
| @ -2123,6 +2122,7 @@ bool InternalRemoveNominationByMap(char[] map) | |||||||
|             { |             { | ||||||
|                 Call_StartForward(g_NominationsResetForward); |                 Call_StartForward(g_NominationsResetForward); | ||||||
|                 Call_PushString(oldmap); |                 Call_PushString(oldmap); | ||||||
|  |                 Call_PushCell(client); | ||||||
|                 Call_Finish(); |                 Call_Finish(); | ||||||
| 
 | 
 | ||||||
|                 int owner = GetArrayCell(g_NominateOwners, i); |                 int owner = GetArrayCell(g_NominateOwners, i); | ||||||
| @ -2158,26 +2158,27 @@ public int Native_RemoveNominationByMap(Handle plugin, int numParams) | |||||||
| 
 | 
 | ||||||
| bool InternalRemoveNominationByOwner(int owner) | bool InternalRemoveNominationByOwner(int owner) | ||||||
| { | { | ||||||
| 	int index; |     int index; | ||||||
| 
 | 
 | ||||||
| 	if(owner && ((index = FindValueInArray(g_NominateOwners, owner)) != -1)) |     if(owner && ((index = FindValueInArray(g_NominateOwners, owner)) != -1)) | ||||||
| 	{ |     { | ||||||
| 		char oldmap[PLATFORM_MAX_PATH]; |         char oldmap[PLATFORM_MAX_PATH]; | ||||||
| 		GetArrayString(g_NominateList[owner], index, oldmap, PLATFORM_MAX_PATH); |         GetArrayString(g_NominateList[owner], index, oldmap, PLATFORM_MAX_PATH); | ||||||
| 
 | 
 | ||||||
| 		Call_StartForward(g_NominationsResetForward); |         Call_StartForward(g_NominationsResetForward); | ||||||
| 		Call_PushString(oldmap); |         Call_PushString(oldmap); | ||||||
| 		Call_Finish(); |         Call_PushCell(owner); | ||||||
|  |         Call_Finish(); | ||||||
| 
 | 
 | ||||||
| 		RemoveFromArray(g_NominateList[owner], index); |         RemoveFromArray(g_NominateList[owner], index); | ||||||
|         //maybe only do once or change g_NominateOwners |         //maybe only do once or change g_NominateOwners | ||||||
| 		RemoveFromArray(g_NominateOwners, index); |         RemoveFromArray(g_NominateOwners, index); | ||||||
| 		g_NominateCount--; |         g_NominateCount--; | ||||||
| 
 | 
 | ||||||
| 		return true; |         return true; | ||||||
| 	} |     } | ||||||
| 
 | 
 | ||||||
| 	return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* native  bool RemoveNominationByOwner(owner); */ | /* native  bool RemoveNominationByOwner(owner); */ | ||||||
| @ -2867,6 +2868,7 @@ void CheckMapRestrictions(bool time = false, bool players = false) | |||||||
|                 { |                 { | ||||||
|                     Call_StartForward(g_NominationsResetForward); |                     Call_StartForward(g_NominationsResetForward); | ||||||
|                     Call_PushString(map); |                     Call_PushString(map); | ||||||
|  |                     Call_PushCell(client); | ||||||
|                     Call_Finish(); |                     Call_Finish(); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -39,9 +39,10 @@ | |||||||
| #include <mapchooser> | #include <mapchooser> | ||||||
| #include <mapchooser_extended> | #include <mapchooser_extended> | ||||||
| #include <multicolors> | #include <multicolors> | ||||||
|  | #include <leader> | ||||||
| #include <basecomm> | #include <basecomm> | ||||||
| 
 | 
 | ||||||
| #define MCE_VERSION "1.3.1" | #define MCE_VERSION "1.4.1" | ||||||
| 
 | 
 | ||||||
| public Plugin myinfo = | public Plugin myinfo = | ||||||
| { | { | ||||||
| @ -82,6 +83,8 @@ Handle g_Cvar_VIPTimeframeMaxTime = INVALID_HANDLE; | |||||||
| 
 | 
 | ||||||
| int g_Player_NominationDelay[MAXPLAYERS+1]; | int g_Player_NominationDelay[MAXPLAYERS+1]; | ||||||
| int g_NominationDelay; | int g_NominationDelay; | ||||||
|  | int g_iMapleaderWhoNominatedMap = -1; | ||||||
|  | char g_cMapLeaderNominatedMap[256]; | ||||||
| 
 | 
 | ||||||
| //clients ignoring maps that are unavailable | //clients ignoring maps that are unavailable | ||||||
| bool g_bClientsIgnoring[MAXPLAYERS + 1]; | bool g_bClientsIgnoring[MAXPLAYERS + 1]; | ||||||
| @ -135,6 +138,8 @@ public void OnPluginStart() | |||||||
| 
 | 
 | ||||||
| public void OnMapStart() | public void OnMapStart() | ||||||
| { | { | ||||||
|  |     Format(g_cMapLeaderNominatedMap, sizeof(g_cMapLeaderNominatedMap), ""); | ||||||
|  |     g_iMapleaderWhoNominatedMap = -1; | ||||||
|     if (!g_dDatabase) |     if (!g_dDatabase) | ||||||
|     { |     { | ||||||
|         //we have too many dbs so i am just re-using racetimercss |         //we have too many dbs so i am just re-using racetimercss | ||||||
| @ -259,6 +264,7 @@ public APLRes AskPluginLoad2(Handle hThis, bool bLate, char[] err, int iErrLen) | |||||||
| 	CreateNative("PushMapsIntoNominationPool", Native_PushMapsIntoNominationPool); | 	CreateNative("PushMapsIntoNominationPool", Native_PushMapsIntoNominationPool); | ||||||
| 	CreateNative("RemoveMapFromNominationPool", Native_RemoveMapFromNominationPool); | 	CreateNative("RemoveMapFromNominationPool", Native_RemoveMapFromNominationPool); | ||||||
| 	CreateNative("RemoveMapsFromNominationPool", Native_RemoveMapsFromNominationPool); | 	CreateNative("RemoveMapsFromNominationPool", Native_RemoveMapsFromNominationPool); | ||||||
|  | 	CreateNative("GetMapleaderNominatedMap", Native_GetMapleaderNominatedMap); | ||||||
| 
 | 
 | ||||||
| 	return APLRes_Success; | 	return APLRes_Success; | ||||||
| } | } | ||||||
| @ -362,17 +368,38 @@ void UpdateMapTrie() | |||||||
| 		delete excludeMaps; | 		delete excludeMaps; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| public void OnNominationRemoved(const char[] map) | public void OnNominationRemoved(const char[] map, int client) | ||||||
| { | { | ||||||
|     int status; |     int status; | ||||||
|     /* Is the map in our list? */ |     /* Is the map in our list? */ | ||||||
|     if(!GetTrieValue(g_mapTrie, map, status)) |     if(!GetTrieValue(g_mapTrie, map, status)) | ||||||
|         return; |         return; | ||||||
| 
 |     int newclient = 0; | ||||||
|  |     //just differientiating between if nomination was removed because of starting vote or because of anything else possible. | ||||||
|  |     if (client > 100) | ||||||
|  |     { | ||||||
|  |         newclient = client - 100; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         newclient = client; | ||||||
|  |     } | ||||||
|  |     if (newclient == g_iMapleaderWhoNominatedMap && StrEqual(map, g_cMapLeaderNominatedMap, false)) | ||||||
|  |     { | ||||||
|  |         if (client > 100) | ||||||
|  |         { | ||||||
|  |             CPrintToChatAll("{darkorange}[UNLOZE Nominations] {white}The map leader {lightgreen}%N {white}nomination {red}%s {white}was forced into the mapvote.", newclient, map); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             CPrintToChatAll("{darkorange}[UNLOZE Nominations] {white}The map leader {lightgreen}%N {white}has removed his Mapleader nomination {red}%s", newclient, map); | ||||||
|  |         } | ||||||
|  |         Format(g_cMapLeaderNominatedMap, sizeof(g_cMapLeaderNominatedMap), ""); | ||||||
|  |         g_iMapleaderWhoNominatedMap = -1; | ||||||
|  |     } | ||||||
|     /* Was the map disabled due to being nominated */ |     /* Was the map disabled due to being nominated */ | ||||||
|     if((status & MAPSTATUS_EXCLUDE_NOMINATED) != MAPSTATUS_EXCLUDE_NOMINATED) |     if((status & MAPSTATUS_EXCLUDE_NOMINATED) != MAPSTATUS_EXCLUDE_NOMINATED) | ||||||
|         return; |         return; | ||||||
| 
 |  | ||||||
|     SetTrieValue(g_mapTrie, map, MAPSTATUS_ENABLED); |     SetTrieValue(g_mapTrie, map, MAPSTATUS_ENABLED); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -400,7 +427,7 @@ public Action Command_Addmap(int client, int args) | |||||||
|         return Plugin_Handled; |         return Plugin_Handled; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     if(!CheckCommandAccess(client, "sm_nominate_ignore", ADMFLAG_KICK, true)) |     if(!CheckCommandAccess(client, "sm_nominate_ignore", ADMFLAG_KICK, true) ) | ||||||
|     { |     { | ||||||
|         bool RestrictionsActive = AreRestrictionsActive(); |         bool RestrictionsActive = AreRestrictionsActive(); | ||||||
| 
 | 
 | ||||||
| @ -461,6 +488,7 @@ public Action Command_Addmap(int client, int args) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     NominateResult result = NominateMap(mapname, true, 0); |     NominateResult result = NominateMap(mapname, true, 0); | ||||||
| 
 | 
 | ||||||
|     if(result > Nominate_Replaced) |     if(result > Nominate_Replaced) | ||||||
| @ -697,49 +725,60 @@ public Action Command_Nominate(int client, int args) | |||||||
|         return Plugin_Handled; |         return Plugin_Handled; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     int Cooldown = GetMapCooldownTime(mapname); |     int mapLeader = Leader_CurrentLeader(); | ||||||
|     if(RestrictionsActive && Cooldown > GetTime()) |     //2023 November edit: one map nominated by mapleader will automatically go to the vote.  | ||||||
|  |     if (client == mapLeader && StrEqual(g_cMapLeaderNominatedMap, "")) | ||||||
|     { |     { | ||||||
|         int Seconds = Cooldown - GetTime(); |         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.", client, mapname); | ||||||
|         CPrintToChat(client, "[NE] %t", "Map Cooldown Time Error", Seconds / 3600, (Seconds % 3600) / 60); |         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), mapname); | ||||||
|         return Plugin_Handled; |         g_iMapleaderWhoNominatedMap = client; | ||||||
|     } |     } | ||||||
| 
 |     else | ||||||
|     bool VIPRestriction = GetMapVIPRestriction(mapname, client); |  | ||||||
|     if(RestrictionsActive && VIPRestriction) |  | ||||||
|     { |     { | ||||||
|         CPrintToChat(client, "[NE] %t", "Map Nominate VIP Error"); |         int Cooldown = GetMapCooldownTime(mapname); | ||||||
|  |         if(RestrictionsActive && Cooldown > GetTime()) | ||||||
|  |         { | ||||||
|  |             int Seconds = Cooldown - GetTime(); | ||||||
|  |             CPrintToChat(client, "[NE] %t", "Map Cooldown Time Error", Seconds / 3600, (Seconds % 3600) / 60); | ||||||
| 
 | 
 | ||||||
|         return Plugin_Handled; |             return Plugin_Handled; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         bool VIPRestriction = GetMapVIPRestriction(mapname, client); | ||||||
|  |         if(RestrictionsActive && VIPRestriction) | ||||||
|  |         { | ||||||
|  |             CPrintToChat(client, "[NE] %t", "Map Nominate VIP Error"); | ||||||
|  | 
 | ||||||
|  |             return Plugin_Handled; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         int TimeRestriction = GetMapTimeRestriction(mapname); | ||||||
|  |         if(RestrictionsActive && TimeRestriction) | ||||||
|  |         { | ||||||
|  |             CPrintToChat(client, "[NE] %t", "Map Nominate Time Error", TimeRestriction / 60, TimeRestriction % 60); | ||||||
|  | 
 | ||||||
|  |             return Plugin_Handled; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         int AverageHourRestricted = GetAveragePlayerTimeOnServerMapRestriction(mapname); | ||||||
|  |         if (AverageHourRestricted > 0) | ||||||
|  |         { | ||||||
|  |             PrintToChat(client, "%s requires +%i hours average. Use sm_houravg to check average.", mapname, AverageHourRestricted); | ||||||
|  |             return Plugin_Handled; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         int PlayerRestriction = GetMapPlayerRestriction(mapname); | ||||||
|  |         if(RestrictionsActive && PlayerRestriction) | ||||||
|  |         { | ||||||
|  |             if(PlayerRestriction < 0) | ||||||
|  |                 CPrintToChat(client, "[NE] %t", "Map Nominate MinPlayers Error", PlayerRestriction * -1); | ||||||
|  |             else | ||||||
|  |                 CPrintToChat(client, "[NE] %t", "Map Nominate MaxPlayers Error", PlayerRestriction); | ||||||
|  | 
 | ||||||
|  |             return Plugin_Handled; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     int TimeRestriction = GetMapTimeRestriction(mapname); |  | ||||||
|     if(RestrictionsActive && TimeRestriction) |  | ||||||
|     { |  | ||||||
|         CPrintToChat(client, "[NE] %t", "Map Nominate Time Error", TimeRestriction / 60, TimeRestriction % 60); |  | ||||||
| 
 |  | ||||||
|         return Plugin_Handled; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     int AverageHourRestricted = GetAveragePlayerTimeOnServerMapRestriction(mapname); |  | ||||||
|     if (AverageHourRestricted > 0) |  | ||||||
|     { |  | ||||||
|         PrintToChat(client, "%s requires +%i hours average. Use sm_houravg to check average.", mapname, AverageHourRestricted); |  | ||||||
|         return Plugin_Handled; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     int PlayerRestriction = GetMapPlayerRestriction(mapname); |  | ||||||
|     if(RestrictionsActive && PlayerRestriction) |  | ||||||
|     { |  | ||||||
|         if(PlayerRestriction < 0) |  | ||||||
|             CPrintToChat(client, "[NE] %t", "Map Nominate MinPlayers Error", PlayerRestriction * -1); |  | ||||||
|         else |  | ||||||
|             CPrintToChat(client, "[NE] %t", "Map Nominate MaxPlayers Error", PlayerRestriction); |  | ||||||
| 
 |  | ||||||
|         return Plugin_Handled; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     NominateResult result = NominateMap(mapname, false, client); |     NominateResult result = NominateMap(mapname, false, client); | ||||||
| 
 | 
 | ||||||
|     if (result == Nominate_InvalidMap) |     if (result == Nominate_InvalidMap) | ||||||
| @ -768,7 +807,9 @@ public Action Command_Nominate(int client, int args) | |||||||
|     if(result == Nominate_Added) |     if(result == Nominate_Added) | ||||||
|         PrintToChatAll("[NE] %t", "Map Nominated", name, mapname); |         PrintToChatAll("[NE] %t", "Map Nominated", name, mapname); | ||||||
|     else if(result == Nominate_Replaced) |     else if(result == Nominate_Replaced) | ||||||
|  |     { | ||||||
|         PrintToChatAll("[NE] %t", "Map Nomination Changed", name, mapname); |         PrintToChatAll("[NE] %t", "Map Nomination Changed", name, mapname); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     LogMessage("%s nominated %s", name, mapname); |     LogMessage("%s nominated %s", name, mapname); | ||||||
| 
 | 
 | ||||||
| @ -835,7 +876,15 @@ void AttemptNominate(int client, const char[] filter = "") | |||||||
|     Menu menu = g_MapMenu; |     Menu menu = g_MapMenu; | ||||||
|     menu = BuildMapMenu(filter, client); |     menu = BuildMapMenu(filter, client); | ||||||
| 
 | 
 | ||||||
|     SetMenuTitle(menu, "%T", "Nominate Title", client); |     int mapLeader = Leader_CurrentLeader(); | ||||||
|  |     if (client == mapLeader && StrEqual(g_cMapLeaderNominatedMap, "")) | ||||||
|  |     { | ||||||
|  |         SetMenuTitle(menu, "Nominate Map as Mapleader:", client); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         SetMenuTitle(menu, "%T", "Nominate Title", client); | ||||||
|  |     } | ||||||
|     DisplayMenu(menu, client, MENU_TIME_FOREVER); |     DisplayMenu(menu, client, MENU_TIME_FOREVER); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -918,7 +967,8 @@ bool PopulateNominateListMenu(Menu menu, int client, const char[] filter = "") | |||||||
|             int owner = GetArrayCell(OwnerList, i); |             int owner = GetArrayCell(OwnerList, i); | ||||||
|             int nominate_count_for_particular_map = 0; |             int nominate_count_for_particular_map = 0; | ||||||
|             sm.GetValue(map, nominate_count_for_particular_map); |             sm.GetValue(map, nominate_count_for_particular_map); | ||||||
|             if(!owner) |             //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))) | ||||||
|             { |             { | ||||||
|                 nominate_count_for_particular_map = 999; |                 nominate_count_for_particular_map = 999; | ||||||
|             } |             } | ||||||
| @ -958,6 +1008,12 @@ bool PopulateNominateListMenu(Menu menu, int client, const char[] filter = "") | |||||||
| 
 | 
 | ||||||
|             if(!owner) |             if(!owner) | ||||||
|                 Format(display, sizeof(display), "%s (Admin)", display); |                 Format(display, sizeof(display), "%s (Admin)", display); | ||||||
|  |             else if (StrEqual(map, g_cMapLeaderNominatedMap)) | ||||||
|  |             { | ||||||
|  |                 char leadername[MAX_NAME_LENGTH]; | ||||||
|  |                 GetClientName(g_iMapleaderWhoNominatedMap, leadername, MAX_NAME_LENGTH); | ||||||
|  |                 Format(display, sizeof(display), "%s (Mapleader %s)", display, leadername); | ||||||
|  |             } | ||||||
|             else |             else | ||||||
|                 Format(display, sizeof(display), "%s (%i %s)", display, nominate_count_for_particular_map, spelling); |                 Format(display, sizeof(display), "%s (%i %s)", display, nominate_count_for_particular_map, spelling); | ||||||
| 
 | 
 | ||||||
| @ -1094,7 +1150,7 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p | |||||||
|     { |     { | ||||||
|         case MenuAction_End: |         case MenuAction_End: | ||||||
|         { |         { | ||||||
|             if (menu != g_MapMenu) |             if (menu != g_MapMenu && menu != null) | ||||||
|             { |             { | ||||||
|                 delete menu; |                 delete menu; | ||||||
|             } |             } | ||||||
| @ -1130,7 +1186,16 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p | |||||||
| 
 | 
 | ||||||
|                 GetClientName(param1, name, MAX_NAME_LENGTH); |                 GetClientName(param1, name, MAX_NAME_LENGTH); | ||||||
| 
 | 
 | ||||||
|                 if(AreRestrictionsActive() && ( |                 int mapLeader = Leader_CurrentLeader(); | ||||||
|  |                 //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("{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; | ||||||
|  |                 } | ||||||
|  |                 else if(AreRestrictionsActive() && ( | ||||||
|                     GetMapCooldownTime(map) > GetTime() || |                     GetMapCooldownTime(map) > GetTime() || | ||||||
|                     GetMapTimeRestriction(map) || |                     GetMapTimeRestriction(map) || | ||||||
|                     GetMapPlayerRestriction(map) || |                     GetMapPlayerRestriction(map) || | ||||||
| @ -1166,7 +1231,9 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p | |||||||
|                 if(result == Nominate_Added) |                 if(result == Nominate_Added) | ||||||
|                     PrintToChatAll("[NE] %t", "Map Nominated", name, map); |                     PrintToChatAll("[NE] %t", "Map Nominated", name, map); | ||||||
|                 else if(result == Nominate_Replaced) |                 else if(result == Nominate_Replaced) | ||||||
|  |                 { | ||||||
|                     PrintToChatAll("[NE] %t", "Map Nomination Changed", name, map); |                     PrintToChatAll("[NE] %t", "Map Nomination Changed", name, map); | ||||||
|  |                 } | ||||||
| 
 | 
 | ||||||
|                 LogMessage("%s nominated %s", name, map); |                 LogMessage("%s nominated %s", name, map); | ||||||
|                 g_Player_NominationDelay[param1] = GetTime() + GetConVarInt(g_Cvar_NominateDelay); |                 g_Player_NominationDelay[param1] = GetTime() + GetConVarInt(g_Cvar_NominateDelay); | ||||||
| @ -1200,6 +1267,12 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             int mapLeader = Leader_CurrentLeader(); | ||||||
|  |             if (param1 == mapLeader && StrEqual(g_cMapLeaderNominatedMap, "")) | ||||||
|  |             { | ||||||
|  |                 return ITEMDRAW_DEFAULT; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             if(AreRestrictionsActive() && ( |             if(AreRestrictionsActive() && ( | ||||||
|                 GetMapCooldownTime(map) > GetTime() || |                 GetMapCooldownTime(map) > GetTime() || | ||||||
|                 GetMapTimeRestriction(map) || |                 GetMapTimeRestriction(map) || | ||||||
| @ -1556,6 +1629,12 @@ public int Native_RemoveMapsFromNominationPool(Handle plugin, int numArgs) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | public int Native_GetMapleaderNominatedMap(Handle plugin, int numArgs) | ||||||
|  | { | ||||||
|  | 	SetNativeString(1, g_cMapLeaderNominatedMap, sizeof(g_cMapLeaderNominatedMap), true); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| stock int GetVIPTimeRestriction() | stock int GetVIPTimeRestriction() | ||||||
| { | { | ||||||
| 	if (!GetConVarBool(g_Cvar_VIPTimeframe)) | 	if (!GetConVarBool(g_Cvar_VIPTimeframe)) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user