07-25-2013, 12:47
(This post was last modified: 07-27-2013, 05:13 by First_Semyon.)
Code:
using System;
using System.Collections.Generic;
using System.IO;
using Addon;
namespace YuMap
{
public class PluPack : CPlugin
{
const int MAPS = 34;
bool haveadmin = false;
List<string> admins = new List<string>();
string[] mapdev, mapuser;
int[] maprange = new int[MAPS];
int range;
int nextmap = -1;
string dspl, dsr;
string[] dsrlist;
Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
int max, counter;
bool mult = false;
bool requireAdmin = true;
void GetMaps()
{
//fetch data
string tempdev, tempuser;
string defaultmapdev = "mp_alpha, mp_bootleg, mp_bravo, mp_carbon, mp_dome, mp_exchange, mp_hardhat, mp_interchange, mp_lambeth, mp_mogadishu, mp_paris, mp_plaza2, mp_radar, mp_seatown, mp_underground, mp_village, mp_overwatch, mp_park, mp_italy, mp_morningwood, mp_cement, mp_meteora, mp_qadeem, mp_hillside_ss, mp_restrepo_ss, mp_six_ss, mp_burn_ss, mp_crosswalk_ss, mp_nola, mp_roughneck, mp_aground_ss, mp_courtyard_ss, mp_terminal_cls, mp_shipbreaker";
string defaultmapuser = "lockdown, bootleg, mission, carbon, dome, downturn, hardhat, interchange, fallen, bakaara, resistance, arkaden, outpost, seatown, underground, village, overwatch, liberation, piazza, blackbox, foundation, sancuary, oasis, getaway, lookout, vortex, u-turn, intersection, parish, offshore, aground, erosion, terminal, decommission";
tempdev = GetServerCFG("Yu", "mapdev", defaultmapdev);
tempuser = GetServerCFG("Yu", "mapuser", defaultmapuser);
//populate arrays
mapdev = tempdev.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
mapuser = tempuser.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
}
void GetAdmins()
{
bool.TryParse(GetServerCFG("Yu", "requireAdmin", "TRUE"), out requireAdmin);
string xuids = GetServerCFG("Yu", "xuids", "");
if (xuids != "")
foreach (string x in xuids.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries))
admins.Add(x);
if (admins.Count > 0) { haveadmin = true; }
}
bool Admin(string id)
{
if (requireAdmin)
{
foreach (string a in admins)
{
if (id.ToLowerInvariant().Contains(a.ToLowerInvariant()))
{
return true;
}
}
return false;
}
else
{
return true;
}
}
void GetRotation()
{
dspl = GetServerCFG("Yu", "dspl", "default") + ".dspl";
dsrlist = GetServerCFG("Yu", "dsr", "FFA_default").Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
max = dsrlist.Length;
if (max == 1)
dsr = dsrlist[0];
else
{
counter = 0;
mult = true;
}
string[] weights = GetServerCFG("Yu", "weights", "3, 2, 5, 3, 5, 2, 5, 3, 2, 5, 5, 3, 2, 3, 2, 5, 3, 5, 2, 5, 3 ,4 ,5 ,3, 4, 5, 2, 4, 5, 3, 5, 3, 4, 2").Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < MAPS; i++)
{
range += int.Parse(weights[i]);
maprange[i] = range;
}
}
int FindMap(int r)
{
for (int i = 0; i < MAPS; i++)
if (r <= maprange[i])
return i;
return -1;
}
void WriteDSPL(string map)
{
File.WriteAllText(@"admin\" + dspl, map + "," + dsr + ",1");
}
void GetNextMode()
{
dsr = dsrlist[counter];
counter++;
if (counter == max) { counter = 0; }
}
int GetMapByName(string map, bool dev = false)
{
string[] m = dev ? mapdev : mapuser;
for (int i = 0; i < MAPS; i++)
if (m[i].StartsWith(map, StringComparison.InvariantCultureIgnoreCase))
return i;
return -1;
}
int GetModeByName(string mode)
{
for (int i = 0; i < max; i++)
if (dsrlist[i].StartsWith(mode, StringComparison.InvariantCultureIgnoreCase))
return i;
return -1;
}
void SetMode(string[] p, int n = 2)
{
if (mult && p.Length > n)
{
int mode = GetModeByName(p[n]);
if (mode != -1)
{
dsr = dsrlist[mode];
counter = mode + 1;
if (counter == max) { counter = 0; }
}
}
}
public override void OnServerLoad()
{
ServerPrint("Yurio Map Plugin v1.4 loaded");
GetMaps();
GetAdmins();
GetRotation();
}
public override void OnMapChange()
{
int prevmap = GetMapByName(GetDvar("mapname"), true);
repeat:
nextmap = FindMap(1 + rnd.Next(range));
if (prevmap == nextmap) { goto repeat; }
if (mult) { GetNextMode(); }
WriteDSPL(mapdev[nextmap]);
}
public override ChatType OnSay(string Message, ServerClient Client)
{
string[] parsed = Message.Split(null as char[], StringSplitOptions.RemoveEmptyEntries);
bool admin = haveadmin && Admin(Client.XUID);
if (Message.StartsWith("!mode", StringComparison.InvariantCultureIgnoreCase) && mult)
{
if (admin)
{
if (Message.StartsWith("!modes", StringComparison.InvariantCultureIgnoreCase))
{
//list maps
string message = "MODES: ";
foreach (string mode in dsrlist)
{
message += mode + " ";
}
TellClient(Client.ClientNum, message, true);
return ChatType.ChatNone;
}
SetMode(parsed, 1);
WriteDSPL(mapdev[nextmap]);
}
string msg = "Next map is ^3" + mapuser[nextmap].ToUpperInvariant() + " ^7(^3" + dsr.ToUpperInvariant() + "^7)";
ServerSay(msg, true);
ServerPrint(msg);
return ChatType.ChatNone;
}
else if (Message.StartsWith("!map", StringComparison.InvariantCultureIgnoreCase))
{
if (!admin) { return ChatType.ChatGame; }
if (Message.StartsWith("!maps", StringComparison.InvariantCultureIgnoreCase))
{
//list maps
string message = "MAPS: ";
foreach (string map in mapuser)
{
message += map + " ";
}
TellClient(Client.ClientNum, message, true);
return ChatType.ChatNone;
}
if (parsed.Length > 1)
{
int map = GetMapByName(parsed[1]);
if (map != -1)
{
nextmap = map;
SetMode(parsed);
WriteDSPL(mapdev[nextmap]);
ServerCommand("map_rotate");
}
}
return ChatType.ChatNone;
}
else if (Message.StartsWith("!nextmap", StringComparison.InvariantCultureIgnoreCase))
{
if (admin && parsed.Length > 1)
{
int map = GetMapByName(parsed[1]);
if (map != -1)
{
nextmap = map;
SetMode(parsed);
WriteDSPL(mapdev[nextmap]);
}
}
string m = (mult) ? " ^7(^3" + dsr.ToUpperInvariant() + "^7)" : String.Empty;
string msg = "Next map is ^3" + mapuser[nextmap].ToUpperInvariant() + m;
ServerSay(msg, true);
ServerPrint(msg);
return ChatType.ChatNone;
}
else if (Message.StartsWith("!res", StringComparison.InvariantCultureIgnoreCase))
{
if (admin)
{
ServerCommand("map_restart");
return ChatType.ChatNone;
}
}
return ChatType.ChatContinue;
}
}
}