using System; using InfinityScript; using Utility; using System.IO; using System.Collections.Generic; using System.Collections; namespace GameTypeChanger { public class GameTypeChanger : BaseScript { public Dictionary aliases = new Dictionary(); List Admins = new List(); string Admin; bool isDLC; string mapName; string gameType; string dspfile; public GameTypeChanger() { Log.Info("Script GameTypeChanger by frst_ loaded. v1.0.0.2 | Mordekai74.3dn.ru"); CheckForFile(); isDLC = false; mapName = string.Empty; gameType = string.Empty; Admin = UL.GET.GetServerCFG("GametypeChanger", "Admins", ""); dspfile = UL.GET.GetServerCFG("GametypeChanger", "dsplfile", "default"); if (!Admin.Equals("")) Admins = new List(Admin.ToLower().Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)); aliases.Add("maps", new List() { new AliasListing() { name = "lockdown", value = "std:mp_alpha" }, new AliasListing() { name = "bootleg", value = "std:mp_bootleg" }, new AliasListing() { name = "mission", value = "std:mp_bravo" }, new AliasListing() { name = "carbon", value = "std:mp_carbon" }, new AliasListing() { name = "dome", value = "std:mp_dome" }, new AliasListing() { name = "downturn", value = "std:mp_exchange" }, new AliasListing() { name = "hardhat", value = "std:mp_hardhat" }, new AliasListing() { name = "interchange", value = "std:mp_interchange" }, new AliasListing() { name = "fallen", value = "std:mp_lambeth" }, new AliasListing() { name = "bakaara", value = "std:mp_mogadishu" }, new AliasListing() { name = "resistance", value = "std:mp_paris" }, new AliasListing() { name = "arkaden", value = "std:mp_plaza2" }, new AliasListing() { name = "outpost", value = "std:mp_radar" }, new AliasListing() { name = "seatown", value = "std:mp_seatown" }, new AliasListing() { name = "underground", value = "std:mp_underground" }, new AliasListing() { name = "village", value = "std:mp_village" }, new AliasListing() { name = "aground", value = "dlc:mp_aground_ss" }, new AliasListing() { name = "blackbox", value = "dlc:mp_morningwood" }, new AliasListing() { name = "boardwalk", value = "dlc:mp_Boardwalk" }, new AliasListing() { name = "decommission", value = "dlc:mp_Shipbreaker" }, new AliasListing() { name = "erosion", value = "dlc:mp_courtyard_ss" }, new AliasListing() { name = "foundation", value = "dlc:mp_Foundation" }, new AliasListing() { name = "getaway", value = "dlc:mp_hillside_ss" }, new AliasListing() { name = "gulch", value = "dlc:mp_gulch" }, new AliasListing() { name = "liberation", value = "dlc:mp_park" }, new AliasListing() { name = "lookout", value = "dlc:mp_restrepo_ss" }, new AliasListing() { name = "terminal", value = "dlc:mp_terminal_cls" }, new AliasListing() { name = "oasis", value = "dlc:mp_Qadeem" }, new AliasListing() { name = "offshore", value = "dlc:mp_roughneck" }, new AliasListing() { name = "overwatch", value = "dlc:mp_overwatch" }, new AliasListing() { name = "parish", value = "dlc:mp_NOLA" }, new AliasListing() { name = "piazza", value = "dlc:mp_italy" }, new AliasListing() { name = "sanctuary", value = "dlc:mp_meteora" } }); string[] zoneDirectories = Directory.GetDirectories("zone"); List directories = new List(); foreach (string directory in zoneDirectories) { if (!directory.Contains("dlc")) directories.Add(directory); } aliases.Add("zones", directories); } public override EventEat OnSay2(Entity player, string name, string Message) { string[] parsed = Message.Split(null as char[], StringSplitOptions.RemoveEmptyEntries); if (IsAdmin(player)) { if (Message.ToLower().StartsWith("!gametype", StringComparison.InvariantCultureIgnoreCase) || Message.ToLower().StartsWith("!gt", StringComparison.InvariantCultureIgnoreCase)) { if (parsed.Length < 3) { UL.TellClient("^2Use: ^7!gametype | !gt ", player); return EventEat.EatGame; } mapName = parsed[1].ToLower(); gameType = parsed[2]; if (string.IsNullOrEmpty(mapName) || string.IsNullOrEmpty(gameType)) { UL.TellClient((string.IsNullOrEmpty(mapName) ? "^2Введите название карты" : "^2Введите название DSR файла"), player); return EventEat.EatGame; } string realMapName = setMapNameAndIsDLC(mapName); UL.ServerPrint("map name real: " + realMapName); bool isMapValid = checkIfTheMapExists(realMapName); bool isGameTypeValid = File.Exists(@"admin\" + gameType + ".dsr"); UL.ServerPrint("isMapValid: " + isMapValid.ToString()); if (!isMapValid) { UL.TellClient("^1Ошибка. ^7Карта не найдена!", player); return EventEat.EatGame; } if (!isGameTypeValid) { UL.TellClient("^1Ошибка. ^7DSR файл не найден!", player); return EventEat.EatGame; } ChangeMapAndGametype(realMapName, gameType); return EventEat.EatGame; } } return EventEat.EatNone; } private string setMapNameAndIsDLC(string mapname) { foreach (AliasListing map in aliases["maps"]) { string[] value = map.value.Split(':'); if (mapname == map.name || mapname == value[1]) { if (value[0] == "dlc") //std или dlc типа карты isDLC = true; UL.ServerPrint("realmapname out"); return value[1]; //реальное название карты } } return null; } private bool checkIfTheMapExists(string mapname) { if ((isDLC && File.Exists(@"zone\dlc\" + mapname + ".ff")) || !isDLC) { if (!isDLC) { foreach (string directory in aliases["zones"]) { UL.ServerPrint("#" + directory + " #" + mapname); if (File.Exists(directory + @"\" + mapname + ".ff")) return true; } } else { return true; } } return false; } private void ChangeMapAndGametype(string real_MapName, string real_Gametype) { if (File.Exists(@"admin\gametypechanger.dspl")) File.Delete(@"admin\gametypechanger.dspl"); using (StreamWriter file = new StreamWriter(@"admin\gametypechanger.dspl", true)) { file.WriteLine(real_MapName + "," + real_Gametype + ",1"); } UL.ServerCommand("sv_maprotation gametypechanger"); UL.ServerCommand("start_map_rotate"); AfterDelay(5000, () => { UL.ServerCommand("sv_maprotation " + dspfile); //возврат установленного плей-листа }); } private void CheckForFile() { if (!File.Exists("scripts\\sv_config.ini")) { Log.Info("SV_CONFIG.INI HAS CREATED (SCRIPTS\\\\SV_CONFIG.INI"); using (StreamWriter sw = new StreamWriter("scripts\\sv_config.ini", true)) { sw.WriteLine("[GametypeChanger]"); sw.WriteLine("dsplfile=default"); sw.WriteLine("Admins=HWID,GUID,XUID,IP,NAME"); } } } private bool IsAdmin(Entity player) { return Admins.Contains(player.HWID.ToLower()) || Admins.Contains(player.GUID.ToString().ToLower()) || Admins.Contains(player.GetXUID().ToLower()) || Admins.Contains(player.IP.Address.ToString()) || Admins.Contains(player.Name.ToLower()); } } public struct AliasListing { public string name, value; } }