Allow mapchooser to exclude maps based on Daytime.

This commit is contained in:
zaCade
2017-10-12 21:52:19 +02:00
parent 54eca07b3e
commit 9532c0893f
4 changed files with 206 additions and 13 deletions
@@ -399,8 +399,11 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
CreateNative("CanNominate", Native_CanNominate);
CreateNative("ExcludeMap", Native_ExcludeMap);
CreateNative("GetMapCooldown", Native_GetMapCooldown);
CreateNative("GetMapMinTime", Native_GetMapMinTime);
CreateNative("GetMapMaxTime", Native_GetMapMaxTime);
CreateNative("GetMapMinPlayers", Native_GetMapMinPlayers);
CreateNative("GetMapMaxPlayers", Native_GetMapMaxPlayers);
CreateNative("GetMapTimeRestriction", Native_GetMapTimeRestriction);
CreateNative("GetMapPlayerRestriction", Native_GetMapPlayerRestriction);
return APLRes_Success;
@@ -544,12 +547,12 @@ public void OnMapEnd()
public void OnClientPutInServer(int client)
{
CheckMapPlayerRestriction();
CheckMapRestrictions(false, true);
}
public void OnClientDisconnect_Post(int client)
{
CheckMapPlayerRestriction();
CheckMapRestrictions(false, true);
}
public void OnClientDisconnect(int client)
@@ -990,7 +993,7 @@ void InitiateVote(MapChange when, Handle inputlist=INVALID_HANDLE)
if(g_MapVoteCompleted && g_ChangeMapInProgress)
return;
CheckMapPlayerRestriction();
CheckMapRestrictions(true, true);
CreateNextVote();
g_ChangeTime = when;
@@ -2060,6 +2063,34 @@ public int Native_GetMapCooldown(Handle plugin, int numParams)
return Cooldown;
}
public int Native_GetMapMinTime(Handle plugin, int numParams)
{
int len;
GetNativeStringLength(1, len);
if(len <= 0)
return false;
char[] map = new char[len+1];
GetNativeString(1, map, len+1);
return InternalGetMapMinTime(map);
}
public int Native_GetMapMaxTime(Handle plugin, int numParams)
{
int len;
GetNativeStringLength(1, len);
if(len <= 0)
return false;
char[] map = new char[len+1];
GetNativeString(1, map, len+1);
return InternalGetMapMaxTime(map);
}
public int Native_GetMapMinPlayers(Handle plugin, int numParams)
{
int len;
@@ -2088,6 +2119,20 @@ public int Native_GetMapMaxPlayers(Handle plugin, int numParams)
return InternalGetMapMaxPlayers(map);
}
public int Native_GetMapTimeRestriction(Handle plugin, int numParams)
{
int len;
GetNativeStringLength(1, len);
if(len <= 0)
return false;
char[] map = new char[len+1];
GetNativeString(1, map, len+1);
return InternalGetMapTimeRestriction(map);
}
public int Native_GetMapPlayerRestriction(Handle plugin, int numParams)
{
int len;
@@ -2169,7 +2214,7 @@ stock int InternalGetMapCooldown(const char[] map)
return Cooldown;
}
void CheckMapPlayerRestriction()
void CheckMapRestrictions(bool time = false, bool players = false)
{
static char map[PLATFORM_MAX_PATH];
for(int i = 0; i < GetArraySize(g_NominateList); i++)
@@ -2178,9 +2223,38 @@ void CheckMapPlayerRestriction()
if(CheckCommandAccess(client, "sm_nominate_ignore", ADMFLAG_CHEATS, true))
continue;
bool remove;
GetArrayString(g_NominateList, i, map, PLATFORM_MAX_PATH);
int Restriction = InternalGetMapPlayerRestriction(map);
if(Restriction)
if (time)
{
int TimeRestriction = InternalGetMapTimeRestriction(map);
if(TimeRestriction)
{
remove = true;
if(TimeRestriction < 0)
CPrintToChat(client, "[MCE] %t", "Nomination Removed MinTime Error", map);
else
CPrintToChat(client, "[MCE] %t", "Nomination Removed MaxTime Error", map);
}
}
if (players)
{
int PlayerRestriction = InternalGetMapPlayerRestriction(map);
if(PlayerRestriction)
{
remove = true;
if(PlayerRestriction < 0)
CPrintToChat(client, "[MCE] %t", "Nomination Removed MinPlayers Error", map);
else
CPrintToChat(client, "[MCE] %t", "Nomination Removed MaxPlayers Error", map);
}
}
if (remove)
{
Call_StartForward(g_NominationsResetForward);
Call_PushString(map);
@@ -2190,15 +2264,36 @@ void CheckMapPlayerRestriction()
RemoveFromArray(g_NominateList, i);
RemoveFromArray(g_NominateOwners, i);
g_NominateCount--;
if(Restriction < 0)
CPrintToChat(client, "[MCE] %t", "Nomination Removed MinPlayers Error", map);
else if(Restriction > 0)
CPrintToChat(client, "[MCE] %t", "Nomination Removed MaxPlayers Error", map);
}
}
}
stock int InternalGetMapMinTime(const char[] map)
{
int MinTime = 0;
if(g_Config && g_Config.JumpToKey(map))
{
MinTime = g_Config.GetNum("MinTime", MinTime);
g_Config.Rewind();
}
return MinTime;
}
stock int InternalGetMapMaxTime(const char[] map)
{
int MaxTime = 0;
if(g_Config && g_Config.JumpToKey(map))
{
MaxTime = g_Config.GetNum("MaxTime", MaxTime);
g_Config.Rewind();
}
return MaxTime;
}
stock int InternalGetMapMinPlayers(const char[] map)
{
int MinPlayers = 0;
@@ -2225,6 +2320,27 @@ stock int InternalGetMapMaxPlayers(const char[] map)
return MaxPlayers;
}
// <0 = Less than MinTime
// 0 = Okay
// >0 = More than MaxTime
stock int InternalGetMapTimeRestriction(const char[] map)
{
char sHour[8];
FormatTime(sHour, sizeof(sHour), "%H");
int CurTime = StringToInt(sHour);
int MinTime = InternalGetMapMinTime(map);
int MaxTime = InternalGetMapMaxTime(map);
if(MinTime && CurTime < MinTime)
return CurTime - MinTime;
if(MaxTime && CurTime > MaxTime)
return CurTime - MinTime;
return 0;
}
// <0 = Less than MinPlayers
// 0 = Okay
// >0 = More than MaxPlayers