mapchooser_extended: multiple groups per map support GROUPS CAN NOW ONLY HAVE NUMBERS AS THEIR NAME!!!
This commit is contained in:
		
							parent
							
								
									ef5e739376
								
							
						
					
					
						commit
						ea03209f15
					
				@ -2,7 +2,7 @@
 | 
			
		||||
{
 | 
			
		||||
	"_groups"
 | 
			
		||||
	{
 | 
			
		||||
		"final_fantasy"
 | 
			
		||||
		"1" // final fantasy
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "2"
 | 
			
		||||
			"ze_ffvii_cosmo_canyon_v1beta1" {}
 | 
			
		||||
@ -32,7 +32,7 @@
 | 
			
		||||
			"ze_FFXIV_Wanderers_Palace_v5_2f" {}
 | 
			
		||||
			"ze_FFVII_Temple_Ancient_v3_3" {}
 | 
			
		||||
		}
 | 
			
		||||
		"cosmo"
 | 
			
		||||
		"2" // cosmo
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "1"
 | 
			
		||||
			"ze_ffvii_cosmo_canyon_v1beta1" {}
 | 
			
		||||
@ -42,7 +42,7 @@
 | 
			
		||||
			"ze_ffvii_cosmo_canyon_v5test2" {}
 | 
			
		||||
			"ze_ffvii_cosmo_canyon_v5fix" {}
 | 
			
		||||
		}
 | 
			
		||||
		"wester"
 | 
			
		||||
		"3" // wester
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "1"
 | 
			
		||||
			"ze_ffxii_westersand_v2_11a" {}
 | 
			
		||||
@ -51,7 +51,7 @@
 | 
			
		||||
			"ze_FFXII_Westersand_v7" {}
 | 
			
		||||
			"ze_FFXII_Westersand_v7_2" {}
 | 
			
		||||
		}
 | 
			
		||||
		"mako"
 | 
			
		||||
		"4" // mako
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "1"
 | 
			
		||||
			"ze_FFVII_Mako_Reactor_b2" {}
 | 
			
		||||
@ -60,20 +60,20 @@
 | 
			
		||||
			"ze_FFVII_Mako_Reactor_v5_3" {}
 | 
			
		||||
			"ZE_FFVII_Mako_Reactor_V6_B08" {}
 | 
			
		||||
		}
 | 
			
		||||
		"wanderes"
 | 
			
		||||
		"5" // wanderes
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "1"
 | 
			
		||||
			"ze_ffxiv_wanderers_palace_css" {}
 | 
			
		||||
			"ze_ffxiv_wanderers_palace_v4_5s" {}
 | 
			
		||||
			"ze_FFXIV_Wanderers_Palace_v5_2f" {}
 | 
			
		||||
		}
 | 
			
		||||
		"minas"
 | 
			
		||||
		"6" // minas
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "1"
 | 
			
		||||
			"ze_lotr_minas_tirith_v2_2fix" {}
 | 
			
		||||
			"ze_lotr_minas_tirith_v3_3" {}
 | 
			
		||||
		}
 | 
			
		||||
		"rooftop"
 | 
			
		||||
		"7" // rooftop
 | 
			
		||||
		{
 | 
			
		||||
			"_max" "2"
 | 
			
		||||
			"ze_gargantua_v2_0" {}
 | 
			
		||||
 | 
			
		||||
@ -122,9 +122,9 @@ native int GetMapTimeRestriction(const char[] map);
 | 
			
		||||
// >0 = More than MaxPlayers
 | 
			
		||||
native int GetMapPlayerRestriction(const char[] map);
 | 
			
		||||
 | 
			
		||||
// <0 = No group
 | 
			
		||||
// >=0 = Group _max
 | 
			
		||||
native int GetMapGroup(const char[] map, char[] group, int size);
 | 
			
		||||
// <=0 = No group
 | 
			
		||||
// >0 = Groups found
 | 
			
		||||
native int GetMapGroups(const char[] map, int[] groups, int size);
 | 
			
		||||
 | 
			
		||||
// <0 = No restriction
 | 
			
		||||
// >=0 = Group _max -> Group full
 | 
			
		||||
 | 
			
		||||
@ -408,7 +408,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max
 | 
			
		||||
	CreateNative("GetMapMaxPlayers", Native_GetMapMaxPlayers);
 | 
			
		||||
	CreateNative("GetMapTimeRestriction", Native_GetMapTimeRestriction);
 | 
			
		||||
	CreateNative("GetMapPlayerRestriction", Native_GetMapPlayerRestriction);
 | 
			
		||||
	CreateNative("GetMapGroup", Native_GetMapGroup);
 | 
			
		||||
	CreateNative("GetMapGroups", Native_GetMapGroups);
 | 
			
		||||
	CreateNative("GetMapGroupRestriction", Native_GetMapGroupRestriction);
 | 
			
		||||
 | 
			
		||||
	return APLRes_Success;
 | 
			
		||||
@ -1659,9 +1659,28 @@ void CreateNextVote()
 | 
			
		||||
	int voteSize = GetVoteSize(2);
 | 
			
		||||
	int limit = (voteSize < GetArraySize(tempMaps) ? voteSize : GetArraySize(tempMaps));
 | 
			
		||||
 | 
			
		||||
	StringMap groups = new StringMap();
 | 
			
		||||
	char group[255];
 | 
			
		||||
	// group -> number of maps nominated from group
 | 
			
		||||
	StringMap groupmap = new StringMap();
 | 
			
		||||
	char groupstr[8];
 | 
			
		||||
 | 
			
		||||
	// populate groupmap with maps from nomination list
 | 
			
		||||
	static char map_[PLATFORM_MAX_PATH];
 | 
			
		||||
	int groups_[32];
 | 
			
		||||
	for(int i = 0; i < GetArraySize(g_NominateList); i++)
 | 
			
		||||
	{
 | 
			
		||||
		GetArrayString(g_NominateList, i, map_, PLATFORM_MAX_PATH);
 | 
			
		||||
		int groupsfound = InternalGetMapGroups(map_, groups_, sizeof(groups_));
 | 
			
		||||
		for(int group = 0; group < groupsfound; group++)
 | 
			
		||||
		{
 | 
			
		||||
			IntToString(group, groupstr, sizeof(groupstr));
 | 
			
		||||
			int groupcur = 0;
 | 
			
		||||
			groupmap.GetValue(groupstr, groupcur);
 | 
			
		||||
			groupcur++;
 | 
			
		||||
			groupmap.SetValue(groupstr, groupcur, true);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// find random maps which honor all restrictions
 | 
			
		||||
	for(int i = 0; i < limit; i++)
 | 
			
		||||
	{
 | 
			
		||||
		int b;
 | 
			
		||||
@ -1673,23 +1692,39 @@ void CreateNextVote()
 | 
			
		||||
			if(InternalGetMapPlayerRestriction(map) == 0)
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			int groupmax = InternalGetMapGroup(map, group, sizeof(group));
 | 
			
		||||
			bool okay = true;
 | 
			
		||||
 | 
			
		||||
			int groups[32];
 | 
			
		||||
			int groupsfound = InternalGetMapGroups(map, groups, sizeof(groups));
 | 
			
		||||
			for(int group = 0; group < groupsfound; group++)
 | 
			
		||||
			{
 | 
			
		||||
				IntToString(group, groupstr, sizeof(groupstr));
 | 
			
		||||
 | 
			
		||||
				int groupmax = InternalGetGroupMax(groups[group]);
 | 
			
		||||
				if(groupmax >= 0)
 | 
			
		||||
				{
 | 
			
		||||
					int groupcur = 0;
 | 
			
		||||
				groups.GetValue(group, groupcur);
 | 
			
		||||
					groupmap.GetValue(groupstr, groupcur);
 | 
			
		||||
 | 
			
		||||
					if(groupcur >= groupmax)
 | 
			
		||||
					{
 | 
			
		||||
						okay = false;
 | 
			
		||||
						break;
 | 
			
		||||
				groupcur++;
 | 
			
		||||
				groups.SetValue(group, groupcur, true);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					groupcur++;
 | 
			
		||||
					groupmap.SetValue(groupstr, groupcur, true);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(okay)
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
		PushArrayString(g_NextMapList, map);
 | 
			
		||||
		RemoveFromArray(tempMaps, b);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	delete groups;
 | 
			
		||||
	delete groupmap;
 | 
			
		||||
	CloseHandle(tempMaps);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2177,7 +2212,7 @@ public int Native_GetMapPlayerRestriction(Handle plugin, int numParams)
 | 
			
		||||
	return InternalGetMapPlayerRestriction(map);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public int Native_GetMapGroup(Handle plugin, int numParams)
 | 
			
		||||
public int Native_GetMapGroups(Handle plugin, int numParams)
 | 
			
		||||
{
 | 
			
		||||
	int len;
 | 
			
		||||
	GetNativeStringLength(1, len);
 | 
			
		||||
@ -2189,11 +2224,11 @@ public int Native_GetMapGroup(Handle plugin, int numParams)
 | 
			
		||||
	char[] map = new char[len+1];
 | 
			
		||||
	GetNativeString(1, map, len+1);
 | 
			
		||||
 | 
			
		||||
	char[] group = new char[size];
 | 
			
		||||
	int groupmax = InternalGetMapGroup(map, group, size);
 | 
			
		||||
	if(groupmax >= 0)
 | 
			
		||||
		SetNativeString(2, group, size);
 | 
			
		||||
	return groupmax;
 | 
			
		||||
	int[] groups = new int[size];
 | 
			
		||||
	int found = InternalGetMapGroups(map, groups, size);
 | 
			
		||||
	if(found >= 0)
 | 
			
		||||
		SetNativeArray(2, groups, size);
 | 
			
		||||
	return found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public int Native_GetMapGroupRestriction(Handle plugin, int numParams)
 | 
			
		||||
@ -2208,24 +2243,30 @@ public int Native_GetMapGroupRestriction(Handle plugin, int numParams)
 | 
			
		||||
	char[] map = new char[len+1];
 | 
			
		||||
	GetNativeString(1, map, len+1);
 | 
			
		||||
 | 
			
		||||
	static char group[255];
 | 
			
		||||
	int groupmax = InternalGetMapGroup(map, group, sizeof(group));
 | 
			
		||||
	int groups[32];
 | 
			
		||||
	int groupsfound = InternalGetMapGroups(map, groups, sizeof(groups));
 | 
			
		||||
 | 
			
		||||
	for(int group = 0; group < groupsfound; group ++)
 | 
			
		||||
	{
 | 
			
		||||
		int groupcur = 0;
 | 
			
		||||
		int groupmax = InternalGetGroupMax(groups[group]);
 | 
			
		||||
 | 
			
		||||
		if(groupmax >= 0)
 | 
			
		||||
		{
 | 
			
		||||
			static char map_[PLATFORM_MAX_PATH];
 | 
			
		||||
		static char group_[255];
 | 
			
		||||
			int groups_[32];
 | 
			
		||||
			for(int i = 0; i < GetArraySize(g_NominateList); i++)
 | 
			
		||||
			{
 | 
			
		||||
				GetArrayString(g_NominateList, i, map_, PLATFORM_MAX_PATH);
 | 
			
		||||
			int tmp = InternalGetMapGroup(map_, group_, sizeof(group_));
 | 
			
		||||
			if(tmp == groupmax && StrEqual(group, group_))
 | 
			
		||||
				int tmp = InternalGetMapGroups(map_, groups_, sizeof(groups_));
 | 
			
		||||
				if(FindIntInArray(groups_, tmp, groups[group]) != -1)
 | 
			
		||||
					groupcur++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(groupcur >= groupmax)
 | 
			
		||||
			{
 | 
			
		||||
				// Check if client has nominated a map in the same group and can change their nomination
 | 
			
		||||
				bool okay = false;
 | 
			
		||||
				if(client > 0 && client < MaxClients)
 | 
			
		||||
				{
 | 
			
		||||
					int index = FindValueInArray(g_NominateOwners, client);
 | 
			
		||||
@ -2233,20 +2274,20 @@ public int Native_GetMapGroupRestriction(Handle plugin, int numParams)
 | 
			
		||||
					{
 | 
			
		||||
						static char oldmap[PLATFORM_MAX_PATH];
 | 
			
		||||
						GetArrayString(g_NominateList, index, oldmap, PLATFORM_MAX_PATH);
 | 
			
		||||
					char oldgroup[255];
 | 
			
		||||
					int tmp = InternalGetMapGroup(oldmap, oldgroup, sizeof(oldgroup));
 | 
			
		||||
					if(tmp == groupmax && StrEqual(group, group_))
 | 
			
		||||
						return -321;
 | 
			
		||||
						static int oldgroups[32];
 | 
			
		||||
						int tmp = InternalGetMapGroups(oldmap, oldgroups, sizeof(oldgroups));
 | 
			
		||||
						if(FindIntInArray(groups_, tmp, groups[group]) != -1)
 | 
			
		||||
							okay = true;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if(!okay)
 | 
			
		||||
					return groupmax;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		return -123;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return groupmax;
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2433,8 +2474,9 @@ stock int InternalGetMapMaxPlayers(const char[] map)
 | 
			
		||||
	return MaxPlayers;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stock int InternalGetMapGroup(const char[] map, char[] group, int size)
 | 
			
		||||
stock int InternalGetMapGroups(const char[] map, int[] groups, int size)
 | 
			
		||||
{
 | 
			
		||||
	int found = 0;
 | 
			
		||||
	if(g_Config && g_Config.JumpToKey("_groups"))
 | 
			
		||||
	{
 | 
			
		||||
		if(!g_Config.GotoFirstSubKey(false))
 | 
			
		||||
@ -2445,19 +2487,44 @@ stock int InternalGetMapGroup(const char[] map, char[] group, int size)
 | 
			
		||||
 | 
			
		||||
		do
 | 
			
		||||
		{
 | 
			
		||||
			int ret = g_Config.GetNum("_max", 1);
 | 
			
		||||
			g_Config.GetSectionName(group, size);
 | 
			
		||||
			char groupstr[8];
 | 
			
		||||
			g_Config.GetSectionName(groupstr, sizeof(groupstr));
 | 
			
		||||
			int group = StringToInt(groupstr);
 | 
			
		||||
			if(g_Config.JumpToKey(map, false))
 | 
			
		||||
			{
 | 
			
		||||
				groups[found++] = group;
 | 
			
		||||
				if(found >= size)
 | 
			
		||||
				{
 | 
			
		||||
					g_Config.Rewind();
 | 
			
		||||
				return ret;
 | 
			
		||||
					return found;
 | 
			
		||||
				}
 | 
			
		||||
				g_Config.GoBack();
 | 
			
		||||
			}
 | 
			
		||||
		} while(g_Config.GotoNextKey());
 | 
			
		||||
 | 
			
		||||
		g_Config.Rewind();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -999;
 | 
			
		||||
	return found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stock int InternalGetGroupMax(int group)
 | 
			
		||||
{
 | 
			
		||||
	char groupstr[8];
 | 
			
		||||
	IntToString(group, groupstr, sizeof(groupstr));
 | 
			
		||||
	if(g_Config && g_Config.JumpToKey("_groups"))
 | 
			
		||||
	{
 | 
			
		||||
		if(g_Config.JumpToKey(groupstr, false))
 | 
			
		||||
		{
 | 
			
		||||
			int max = g_Config.GetNum("_max", -1);
 | 
			
		||||
			g_Config.Rewind();
 | 
			
		||||
			return max;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		g_Config.Rewind();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 0 = Okay
 | 
			
		||||
@ -2509,3 +2576,14 @@ stock int InternalGetMapPlayerRestriction(const char[] map)
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stock int FindIntInArray(int[] array, int size, int value)
 | 
			
		||||
{
 | 
			
		||||
	for(int i = 0; i < size; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if(array[i] == value)
 | 
			
		||||
			return i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user