diff --git a/Classic/antiLouEDITED.vl2 b/Classic/antiLouEDITED.vl2 deleted file mode 100644 index b8aed0e..0000000 Binary files a/Classic/antiLouEDITED.vl2 and /dev/null differ diff --git a/Classic/evoClassicTaco.vl2 b/Classic/evoClassicTaco.vl2 deleted file mode 100644 index 6684842..0000000 Binary files a/Classic/evoClassicTaco.vl2 and /dev/null differ diff --git a/Classic/prefs/MapRotation.cs b/Classic/prefs/MapRotation.cs new file mode 100644 index 0000000..4472561 --- /dev/null +++ b/Classic/prefs/MapRotation.cs @@ -0,0 +1,538 @@ +// __ __ _____ _ _ _ +// | \/ | | __ \ | | | | (_) +// | \ / | __ _ _ __ | |__) |___ | |_ __ _| |_ _ ___ _ __ +// | |\/| |/ _` | '_ \ | _ // _ \| __/ _` | __| |/ _ \| '_ \ +// | | | | (_| | |_) | | | \ \ (_) | || (_| | |_| | (_) | | | | +// |_| |_|\__,_| .__/ |_| \_\___/ \__\__,_|\__|_|\___/|_| |_| +// | | +// |_| +// +// Use of this file +// To add a new map follow this rules: +// 1. Find the file name, ending in .mis (ie BeggarsRun.mis) +// 2. Add a line with this syntact: addRotationMap(filename, gametype, %voteable, %cycle, %min. %max); +// +//addRotationMap("MAP_NAME","MAP_MODE",VOTEABLE,IN-ROTATION,MINIMUM_PLAYERS,MAXIMUM_PLAYERS); +// +// Example: addRotationMap("BeggarsRun","CTF",1,1,-1,64); +// Beggar's Run will be in the mapRotation. It's in the cycle and can be voted. The map has no minimum player count requirement, and a 64 player max. +// +// Example: addRotationMap("BeggarsRun","CTF",1,0,10,20); +// Beggar's Run will be in the mapRotation. It's not in the cycle, but can be voted. The map has a minimum player count requirement of 10, and 20 players is the maximum to be picked. +// +// Example: addRotationMap("BeggarsRun","CTF",0,0,18,-1); +// Beggar's Run won't be in the mapRotation. It's not in the cycle and can't be voted. The map has a minimum player count requirement of 18, and has no maximum for players. +// +// +//addRotationMap("Casern_Cavite","Bounty",1,1,0,64); +//addRotationMap("Sirocco","CnH",1,1,0,64); +//addRotationMap("aabaaGH","CTF",1,0,0,64); +//addRotationMap("AcidRain","DnD",1,1,0,64); +//addRotationMap("AgentsOfFortune","Hunters",1,1,0,64); +//addRotationMap("SunDriedLak1","LakRabbit",1,1,0,64); +//addRotationMap("Arrakis","Rabbit",1,1,0,64); +//addRotationMap("VulcansHammer","Siege",1,1,0,64); +//addRotationMap("AgentsOfFortune","TeamHunters",1,1,0,64); +// +// _____ _______ ______ +// / ____|__ __| ____| +// | | | | | |__ +// | | | | | __| +// | |____ | | | | +// \_____| |_| |_| +///////////////////////////////////////////////////////////////////// + +//Small Maps +///////////////////////////////////////////////////////////////////// + +addRotationMap("SmallCrossing", "CTF",1,1,-1,12); +addRotationMap("TWL2_CanyonCrusadeDeluxe", "CTF",1,1,-1,12); +addRotationMap("RoundTheMountain", "CTF",1,1,-1,14); +addRotationMap("oasisintensity", "CTF",1,1,-1,12); +addRotationMap("Minotaur", "CTF",1,0,-1,12); +//addRotationMap("Island", "CTF",1,1,-1,12); +//addRotationMap("TitForTat", "CTF",1,1,-1,12); +addRotationMap("SmallMelee", "CTF",1,0,-1,12); +//addRotationMap("SuperHappyBouncyFunTime", "CTF",1,1,-1,12); +addRotationMap("Machineeggs", "CTF",1,1,-1,12); +addRotationMap("Mac_FlagArena", "CTF",1,0,-1,12); +addRotationMap("SmallTimeCTF", "CTF",1,1,-1,10); +addRotationMap("TWL2_Hildebrand", "CTF",1,1,-1,12); +addRotationMap("ArenaDome", "CTF",1,1,-1,12); +addRotationMap("Firestorm", "CTF",1,1,-1,12); +addRotationMap("Bulwark", "CTF",1,1,-1,12); + +//Medium Maps +///////////////////////////////////////////////////////////////////// + +addRotationMap("HighOctane", "CTF",1,1,8,20); +addRotationMap("S5_Mordacity", "CTF",1,1,10,20); +addRotationMap("S5_Damnation", "CTF",1,1,8,20); +addRotationMap("TWL2_JaggedClaw", "CTF",1,0,8,20); +addRotationMap("S5_Massive", "CTF",1,1,8,20); +addRotationMap("TWL_Stonehenge", "CTF",1,1,8,20); +addRotationMap("TWL_Feign", "CTF",1,0,8,20); +addRotationMap("TheFray", "CTF",1,1,8,20); +addRotationMap("DangerousCrossing_nef", "CTF",1,1,8,20); +addRotationMap("TWL2_Skylight", "CTF",1,0,8,20); +addRotationMap("TWL2_Ocular", "CTF",1,1,12,20); +addRotationMap("Dire", "CTF",1,1,8,20); +addRotationMap("berlard", "CTF",1,1,8,20); +addRotationMap("S8_Opus", "CTF",1,0,8,20); +addRotationMap("BeggarsRun", "CTF",1,0,8,20); +addRotationMap("Headstone", "CTF",1,0,8,20); +addRotationMap("Signal", "CTF",1,1,8,20); +addRotationMap("S5_Woodymyrk", "CTF",1,1,8,20); +addRotationMap("Discord", "CTF",1,1,8,20); +addRotationMap("TenebrousCTF", "CTF",1,1,8,20); +addRotationMap("Pariah", "CTF",1,0,8,20); +addRotationMap("Prismatic", "CTF",1,0,8,20); +addRotationMap("TWL_WilderZone", "CTF",1,1,8,20); +addRotationMap("Mirage", "CTF",1,1,8,20); +addRotationMap("S5_Mimicry", "CTF",1,1,10,20); +addRotationMap("TWL_Snowblind", "CTF",1,0,12,20); +addRotationMap("ShortFall", "CTF",1,0,8,20); +addRotationMap("IceRidge_nef", "CTF",1,0,8,20); +//addRotationMap(Disjointed", "CTF",1,1,8,20); +addRotationMap("TWL2_MuddySwamp", "CTF",1,0,8,20); +addRotationMap("Blink", "CTF",1,1,8,20); +addRotationMap("HighAnxiety", "CTF",1,0,8,20); +addRotationMap("S5_Centaur", "CTF",1,0,8,20); +addRotationMap("S8_Cardiac", "CTF",1,1,12,24); +addRotationMap("CirclesEdge", "CTF",1,1,10,20); +addRotationMap("S5_Icedance", "CTF",1,1,8,20); +addRotationMap("Surreal", "CTF",1,1,8,20); + +//Voteable but Not in Rotation +///////////////////////////////////////////////////////////////////// + +//addRotationMap("Snowcone", "CTF",1,0,10,20); +//addRotationMap("S5_Drache", "CTF",1,0,10,20); +//addRotationMap("S5_HawkingHeat", "CTF",1,0,10,20); +//addRotationMap("JadeValley", "CTF",1,0,10,20); +//addRotationMap("S5_Sherman", "CTF",1,0,10,20); +addRotationMap("S5_Silenus", "CTF",1,0,8,20); +addRotationMap("TWL2_FrozenHope", "CTF",1,0,8,20); +//addRotationMap("TWL2_IceDagger", "CTF",1,0,10,20); +//addRotationMap("S5_Reynard", "CTF",1,0,10,20); +//addRotationMap("TWL_Cinereous", "CTF",1,0,10,20); +//addRotationMap("TWL_OsIris, CTF", "CTF",1,0,10,20); +addRotationMap("Coppersky", "CTF",1,0,8,20); +//addRotationMap("TWL2_Crevice", "CTF",1,0,10,20); +//addRotationMap("TWL_SubZero", "CTF",1,0,10,20); +addRotationMap("TWL_Titan", "CTF",1,0,10,20); +addRotationMap("Confusco", "CTF",1,0,10,20); +//addRotationMap("Fallout", "CTF",1,0,10,20); +addRotationMap("TheClocktower", "CTF",1,0,10,20); +//addRotationMap("oylentGreen", "CTF",1,0,10,20); +addRotationMap("TWL2_MidnightMayhemDeluxe", "CTF",1,0,8,20); +addRotationMap("Nightdance", "CTF",1,0,10,20); +//addRotationMap("Ramparts", "CTF",1,0,10,20); +addRotationMap("TWL2_Celerity", "CTF",1,0,8,20); +addRotationMap("Blastside_nef", "CTF",1,0,10,20); +addRotationMap("Infernus", "CTF",1,0,10,20); +addRotationMap("NatureMagic", "CTF",1,0,10,20); +//addRotationMap(TWL_Damnation", "CTF",1,0,10,20); +//addRotationMap(TWL_DangerousCrossing", "CTF",1,0,10,20); +//addRotationMap(TWL_DeadlyBirdsSong", "CTF",1,0,10,20); +addRotationMap("Vauban", "CTF",1,0,12,20); + +//Vehicle Maps +///////////////////////////////////////////////////////////////////// + +addRotationMap("HostileLoch", "CTF",1,1,12,20); +addRotationMap("TWL_BeachBlitz", "CTF",1,0,12,20); +addRotationMap("TWL2_Magnum", "CTF",1,1,12,20); +addRotationMap("Logans_Run", "CTF",1,1,12,20); +addRotationMap("Rollercoaster_nef", "CTF",1,1,12,24); +addRotationMap("MoonDance", "CTF",1,1,12,24); +addRotationMap("Raindance_nef", "CTF",1,1,12,20); +addRotationMap("TWL_Magmatic", "CTF",1,1,12,20); +addRotationMap("TWL2_FrozenGlory", "CTF",1,1,12,20); +addRotationMap("LandingParty", "CTF",1,1,12,20); +addRotationMap("TitanV", "CTF",1,0,12,20); +addRotationMap("TWL_Crossfire", "CTF",1,1,12,20); +//addRotationMap("Surro", "CTF",1,0,12,20); +//addRotationMap("The_Calm", "CTF",1,0,12,20); + +//Vehicle Maps: Voteable, But Not in Rotation +///////////////////////////////////////////////////////////////////// + +addRotationMap("SubZeroV", "CTF",1,0,12,20); +//addRotationMap("TWL2_RoughLand", "CTF",1,0,12,20); +addRotationMap("S8_Geothermal", "CTF",1,0,12,20); +addRotationMap("Lakefront", "CTF",1,0,12,20); +addRotationMap("ShockRidge", "CTF",1,0,12,20); +addRotationMap("TWL2_BlueMoon", "CTF",1,0,12,20); +addRotationMap("FullCircle", "CTF",1,0,12,20); +addRotationMap("TWL_Katabatic", "CTF",1,0,12,20); +addRotationMap("TWL_Starfallen", "CTF",1,0,12,20); +addRotationMap("ConstructionYard", "CTF",1,0,12,20); +//addRotationMap("AcidRain", "CTF",1,0,12,20); +addRotationMap("SandOcean", "CTF",1,0,12,20); +//addRotationMap("StarIce", "CTF",1,0,12,20); +addRotationMap("ks_braistv", "CTF",1,0,12,20); +addRotationMap("FilteredDust", "CTF",1,0,12,20); +//addRotationMap("Choke", "CTF",1,0,12,20); +//addRotationMap("TWL2_Ruined", "CTF",1,0,12,20); +//addRotationMap("TWL_Chokepoint", "CTF",1,0,12,20); +//addRotationMap("Glade", "CTF",1,0,12,20); + +//BIG Vehicle Maps +///////////////////////////////////////////////////////////////////// + +addRotationMap("HarvestDance", "CTF",1,1,18,32); +addRotationMap("WindyGap", "CTF",1,1,20,32); +addRotationMap("Fenix", "CTF",1,1,24,32); +addRotationMap("Hillside", "CTF",1,1,20,32); +//addRotationMap("Sangre_de_Grado", "CTF",1,0,20,32); +addRotationMap("Slapdash", "CTF",1,0,20,32); +addRotationMap("BerylBasin", "CTF",1,0,18,32); +//addRotationMap("TWL_Frozen", "CTF",1,0,20,32); +addRotationMap("TWL_Harvester", "CTF",1,0,20,32); +addRotationMap("Archipelago", "CTF",1,0,20,32); +addRotationMap("TWL2_Bleed", "CTF",1,0,20,32); +//addRotationMap("Pantheon", "CTF",1,0,20,32); +addRotationMap("Circleofstones", "CTF",1,1,20,32); +addRotationMap("Scarabrae_nef", "CTF",1,0,20,32); + +//Not In Rotation - Not Voteable +///////////////////////////////////////////////////////////////////// + +//addRotationMap("Sandstorm", "CTF",1,0,-1,32); +//addRotationMap("Starfallen", "CTF",1,0,-1,32); +//addRotationMap("Stonehenge_nef", "CTF",1,0,-1,32); +//addRotationMap("Extractor", "CTF",1,0,-1,32); +//addRotationMap("AstersDescent", "CTF",1,0,-1,32); +//addRotationMap("Azoth", "CTF",1,0,-1,32); +//addRotationMap("BattleGrove", "CTF",1,0,-1,32); +//addRotationMap("Durango", "CTF",1,0,-1,32); +//addRotationMap("DustLust", "CTF",1,0,-1,32); +//addRotationMap("IceGulch", "CTF",1,0,-1,32); +//addRotationMap("MountainMist", "CTF",1,0,-1,32); +//addRotationMap("Peak", "CTF",1,0,-1,32); +//addRotationMap("Pendulum", "CTF",1,0,-1,32); +//addRotationMap("S5_Misadventure", "CTF",1,0,-1,32); +//addRotationMap("S8_CentralDogma", "CTF",1,0,-1,32); +//addRotationMap("S8_Mountking", "CTF",1,0,-1,32); +//addRotationMap("S8_Zilch", "CTF",1,0,-1,32); +//addRotationMap("TWL2_CloakOfNight", "CTF",1,0,-1,32); +//addRotationMap("TWL2_Dissention", "CTF",1,0,-1,32); +//addRotationMap("TWL2_Drifts", "CTF",1,0,-1,32); +//addRotationMap("TWL2_Drorck", "CTF",1,0,-1,32); +//addRotationMap("TWL2_Norty", "CTF",1,0,-1,32); +//addRotationMap("TWL_Abaddon", "CTF",1,0,-1,32); +//addRotationMap("TWL_BaNsHee", "CTF",1,0,-1,32); +//addRotationMap("TWL_Boss", "CTF",1,0,-1,32); +//addRotationMap("TWL_NoShelter", "CTF",1,0,-1,32); +//addRotationMap("TWL_Clusterfuct", "CTF",1,0,-1,32); +//addRotationMap("TWL_Curtilage", "CTF",1,0,-1,32); +//addRotationMap("TWL_Deserted", "CTF",1,0,-1,32); +//addRotationMap("TWL_Frostclaw", "CTF",1,0,-1,32); +//addRotationMap("TWL_Horde", "CTF",1,0,-1,32); +//addRotationMap("TWL_Neve", "CTF",1,0,-1,32); +//addRotationMap("TWL_Pandemonium", "CTF",1,0,-1,32); +//addRotationMap("TWL_Ramparts", "CTF",1,0,-1,32); +//addRotationMap("TWL_Sandstorm", "CTF",1,0,-1,32); +//addRotationMap("TWL_WoodyMyrk", "CTF",1,0,-1,32); +//addRotationMap("OctoberRust", "CTF",1,0,-1,32); +//addRotationMap("DevilsElbow", "CTF",1,0,-1,32); +//addRotationMap("CloudCity", "CTF",1,0,-1,32); +//addRotationMap("Damnation", "CTF",1,0,-1,32); +//addRotationMap("DeathBirdsFly", "CTF",1,0,-1,32); +//addRotationMap("Desiccator", "CTF",1,0,-1,32); +//addRotationMap("DustToDust", "CTF",1,0,-1,32); +//addRotationMap("Katabatic", "CTF",1,0,-1,32); +//addRotationMap("Quagmire", "CTF",1,0,-1,32); +//addRotationMap("Recalescence", "CTF",1,0,-1,32); +//addRotationMap("Reversion", "CTF",1,0,-1,32); +//addRotationMap("RiverDance", "CTF",1,0,-1,32); +//addRotationMap("Sanctuary", "CTF",1,0,-1,32); +//addRotationMap("ThinIce", "CTF",1,0,-1,32); +//addRotationMap("Tombstone", "CTF",1,0,-1,32); +//addRotationMap("Broadside_nef", "CTF",1,0,-1,32); +//addRotationMap("Camelland", "CTF",1,0,-1,32); +//addRotationMap("HighTrepidation", "CTF",1,0,-1,32); +//addRotationMap("SmallDesertofDeath", "CTF",1,0,-1,32); +//addRotationMap("Agorazscium", "CTF",1,0,-1,32); +//addRotationMap("BasinFury", "CTF",1,0,-1,32); +//addRotationMap("Cadaver", "CTF",1,0,-1,32); +//addRotationMap("EivoItoxico", "CTF",1,0,-1,32); +//addRotationMap("Einfach", "CTF",1,0,-1,32); +//addRotationMap("PicnicTable", "CTF",1,0,-1,32); +//addRotationMap("Hostility", "CTF",1,0,-1,32); +//addRotationMap("HighWire", "CTF",1,0,-1,32); +//addRotationMap("CloudBurst", "CTF",1,0,-1,32); +//addRotationMap("CloseCombat", "CTF",1,0,-1,32); +//addRotationMap("DesertofDeath_nef", "CTF",1,0,-1,32); +//addRotationMap("Gorgon", "CTF",1,0,-1,32); +//addRotationMap("Magamatic", "CTF",1,0,-1,32); +//addRotationMap("Sub-zero", "CTF",1,0,-1,32); + + + +// _ _ _ _ _ _ +// | | | | | | | | (_) | +// | | __ _| | ___ __ __ _| |__ | |__ _| |_ +// | | / _` | |/ / '__/ _` | '_ \| '_ \| | __| +// | |___| (_| | <| | | (_| | |_) | |_) | | |_ +// |______\__,_|_|\_\_| \__,_|_.__/|_.__/|_|\__| +///////////////////////////////////////////////////////////////////// + +//In Rotation +///////////////////////////////////////////////////////////////////// + +addRotationMap("VaubanLak", "Lakrabbit",1,1,-1,32); +addRotationMap("MiniSunDried", "Lakrabbit",1,1,-1,12); +addRotationMap("Sundance", "Lakrabbit",1,1,-1,32); +addRotationMap("TWL_BeachBlitzLak", "Lakrabbit",1,1,-1,32); +addRotationMap("DesertofDeathLak", "Lakrabbit",1,1,-1,32); +addRotationMap("Raindance_nefLak", "Lakrabbit",1,1,-1,32); +addRotationMap("SunDriedLak", "Lakrabbit",1,1,-1,32); +addRotationMap("SkinnyDipLak", "Lakrabbit",1,1,-1,32); +addRotationMap("SaddiesHill", "Lakrabbit",1,1,-1,32); +addRotationMap("HavenLak", "Lakrabbit",1,0,-1,32); +addRotationMap("LushLak", "Lakrabbit",1,1,-1,32); +addRotationMap("BoxLak", "Lakrabbit",1,1,-1,10); +addRotationMap("TitaniaLak", "Lakrabbit",1,0,8,32); +addRotationMap("TibbawLak", "Lakrabbit",1,1,-1,32); +addRotationMap("InfernusLak", "Lakrabbit",1,1,-1,32); +addRotationMap("S8_GeothermalLak", "Lakrabbit",1,1,-1,32); +addRotationMap("CankerLak", "Lakrabbit",1,1,-1,32); +addRotationMap("DustRunLak", "Lakrabbit",1,1,-1,32); +addRotationMap("CrossfiredLak", "Lakrabbit",1,0,-1,32); + +//Voteable, But not in rotation +///////////////////////////////////////////////////////////////////// + +addRotationMap("TreasureIslandLak", "Lakrabbit",1,0,-1,32); +addRotationMap("Sulfide", "Lakrabbit",1,0,-1,32); +addRotationMap("FrozenFuryLak", "Lakrabbit",1,0,-1,32); +addRotationMap("Arrakis", "Lakrabbit",1,0,-1,32); +addRotationMap("EquinoxLak", "Lakrabbit",1,0,-1,32); +addRotationMap("PhasmaDustLak", "Lakrabbit",1,1,-1,12); +addRotationMap("GodsRiftLak", "Lakrabbit",1,0,-1,32); +addRotationMap("SolsDescentLak", "Lakrabbit",1,0,-1,32); +addRotationMap("Crater71Lak", "Lakrabbit",1,0,-1,32); + +//Not Voteable, Not in rotation +///////////////////////////////////////////////////////////////////// + +//addRotationMap("EscaladeLak", "Lakrabbit",1,0,-1,32); +//addRotationMap("MagmaticLak", "Lakrabbit",1,0,-1,32); +//addRotationMap("HillsOfSorrow", "Lakrabbit",1,0,-1,32); +//addRotationMap("TWL2_MuddySwampLak", "Lakrabbit",1,0,-1,32); +//addRotationMap("SandStormLak", "Lakrabbit",1,0,-1,32); +//addRotationMap("BeggarsRunLak", "Lakrabbit",1,0,-1,32); +//addRotationMap("DamnnationLak", "Lakrabbit",1,0,-1,32); + + +// _ _____ _______ ______ +// | | / ____|__ __| ____| +// | | | | | | | |__ +// | | | | | | | __| +// | |___| |____ | | | | +// |______\_____| |_| |_| +///////////////////////////////////////////////////////////////////// + +//In Rotation +///////////////////////////////////////////////////////////////////// + +addRotationMap("BastardForgeLT", "sctf",1,1,-1,32); +//addRotationMap("FirestormLT", "sctf",1,1,-1,32); +addRotationMap("DangerousCrossingLT", "sctf",1,1,-1,32); +addRotationMap("SmallCrossingLT", "sctf",1,0,-1,12); +addRotationMap("DireLT", "sctf",1,1,-1,32); +addRotationMap("RoundTheMountainLT", "sctf",1,1,-1,32); +addRotationMap("CirclesEdgeLT", "sctf",1,1,-1,32); +addRotationMap("TenebrousCTF", "sctf",1,1,-1,32); +addRotationMap("TheFray", "sctf",1,0,-1,32); +addRotationMap("SignalLT", "sctf",1,1,-1,32); +addRotationMap("StarFallLT", "sctf",1,1,-1,32); +addRotationMap("S5_DamnationLT", "sctf",1,1,-1,32); +addRotationMap("S5_Icedance", "sctf",1,1,-1,32); +addRotationMap("S5_Mordacity", "sctf",1,1,-1,32); +addRotationMap("S5_SilenusLT", "sctf",1,0,-1,32); +addRotationMap("TWL2_CanyonCrusadeDeluxeLT", "sctf",1,1,-1,32); +addRotationMap("TWL2_FrozenHopeLT", "sctf",1,1,-1,32); +//addRotationMap("TWL2_JaggedClawLT", "sctf",1,1,-1,32); +addRotationMap("TWL2_HildebrandLT", "sctf",1,1,-1,32); +addRotationMap("TWL2_SkylightLT", "sctf",1,1,-1,32); +//addRotationMap("TWL_BeachBlitzLT", "sctf",1,1,-1,32); +addRotationMap("TWL_FeignLT", "sctf",1,0,-1,32); +addRotationMap("TWL_RollercoasterLT", "sctf",1,1,-1,32); +addRotationMap("TWL_StonehengeLT", "sctf",1,1,-1,32); +addRotationMap("TWL_WilderZoneLT", "sctf",1,1,-1,32); +addRotationMap("oasisintensity", "sctf",1,1,-1,10); +addRotationMap("berlard", "sctf",1,0,-1,32); +addRotationMap("RaindanceLT", "sctf",1,1,-1,32); +addRotationMap("SmallTimeLT", "sctf",1,0,-1,32); +addRotationMap("ArenaDome", "sctf",1,1,-1,32); +addRotationMap("Bulwark", "sctf",1,1,-1,32); +addRotationMap("Discord", "sctf",1,1,-1,32); +//addRotationMap("JadeValley", "sctf",1,1,-1,32); +addRotationMap("S5_MassiveLT", "sctf",1,1,-1,32); +addRotationMap("Blink", "sctf",1,1,-1,32); +addRotationMap("HillSideLT", "sctf",1,1,-1,12); +addRotationMap("IcePick", "sctf",1,1,-1,16); +addRotationMap("OsIrisLT", "sctf",1,1,-1,32); +addRotationMap("GrassyKnoll", "sctf",1,1,-1,32); +addRotationMap("TWL2_MuddySwamp", "sctf",1,1,8,32); +addRotationMap("SandyRunLT", "sctf",1,1,-1,12); + +//Voteable, But not in rotation +///////////////////////////////////////////////////////////////////// + +addRotationMap("CamellandLT", "sctf",1,1,-1,32); +//addRotationMap("Headstone", "sctf",1,0,-1,32); +//addRotationMap("Mirage", "sctf",1,0,-1,32); +addRotationMap("BeggarsRunLT", "sctf",1,0,-1,32); +//addRotationMap("S5_HawkingHeat", "sctf",1,0,-1,32); +//addRotationMap("S5_Mimicry", "sctf",1,0,-1,32); +addRotationMap("S5_Woodymyrk", "sctf",1,0,-1,32); +//addRotationMap("S8_Cardiac", "sctf",1,0,-1,32); +//addRotationMap("TWL2_Celerity", "sctf",1,0,-1,32); +//addRotationMap("TWL2_Crevice", "sctf",1,0,-1,32); +addRotationMap("S8_Opus", "sctf",1,0,-1,32); +//addRotationMap("TWL2_MidnightMayhemDeluxe", "sctf",1,0,-1,32); +//addRotationMap("TWL2_Ocular", "sctf",1,0,-1,32); +//addRotationMap("TWL_Cinereous", "sctf",1,0,-1,32); +//addRotationMap("TWL_Deserted", "sctf",1,0,-1,32); +addRotationMap("TWL_DangerousCrossing", "sctf",1,0,-1,32); +//addRotationMap("TWL_OsIris", "sctf",1,0,-1,32); +//addRotationMap("TWL_Damnation", "sctf",1,0,-1,32); +//addRotationMap("TWL_Titan", "sctf",1,0,-1,32); + +//Not Voteable, Not in rotation +///////////////////////////////////////////////////////////////////// + +//addRotationMap("SurrealLT", "sctf",1,1,-1,32); +//addRotationMap("Coppersky", "sctf",1,1,-1,32); +addRotationMap("DuelersDelight", "sctf",1,0,-1,12); +//addRotationMap("SuperHappyBouncyFunTime", "sctf",1,1,-1,32); +addRotationMap("PariahLT", "sctf",1,1,-1,16); +//addRotationMap("SmallMelee", "sctf",1,1,-1,32); +//addRotationMap("TitForTat", "sctf",1,1,-1,32); +//addRotationMap("CloseCombatLT", "sctf",1,1,-1,32); +//addRotationMap("Prismatic", "sctf",1,1,-1,32); +//addRotationMap("Damnation", "sctf",1,1,-1,32); +//addRotationMap("DustToDust", "sctf",1,1,-1,32); +//addRotationMap("Minotaur", "sctf",1,1,-1,32); +//addRotationMap("DesertofDeath_nef", "sctf",1,1,-1,32); +//addRotationMap("Gorgon", "sctf",1,1,-1,32); +//addRotationMap("Titan", "sctf",1,1,-1,32); +//addRotationMap("Mac_FlagArena", "sctf",1,1,-1,32); +//addRotationMap("Extractor", "sctf",1,1,-1,32); +//addRotationMap("AstersDescent", "sctf",1,1,-1,32); +//addRotationMap("Azoth", "sctf",1,1,-1,32); +//addRotationMap("DustLust", "sctf",1,1,-1,32); +//addRotationMap("Disjointed", "sctf",1,1,-1,32); +//addRotationMap("Peak", "sctf",1,1,-1,32); +//addRotationMap("Snowcone", "sctf",1,1,-1,32); +//addRotationMap("S5_Centaur", "sctf",1,1,-1,32); +//addRotationMap("S5_Drache", "sctf",1,1,-1,32); +//addRotationMap("S5_Misadventure", "sctf",1,1,-1,32); +//addRotationMap("S5_Reynard", "sctf",1,1,-1,32); +//addRotationMap("S5_Sherman", "sctf",1,1,-1,32); +//addRotationMap("S8_Geothermal", "sctf",1,1,-1,32); +//addRotationMap("S8_Zilch", "sctf",1,1,-1,32); +//addRotationMap("TWL2_Drifts", "sctf",1,1,-1,32); +//addRotationMap("TWL2_Drorck", "sctf",1,1,-1,32); +//addRotationMap("TWL2_FrozenGlory", "sctf",1,1,-1,32); +//addRotationMap("TWL2_IceDagger", "sctf",1,1,-1,32); +//addRotationMap("TWL2_Norty", "sctf",1,1,-1,32); +//addRotationMap("TWL2_RoughLand", "sctf",1,1,-1,32); +//addRotationMap("TWL2_Ruined", "sctf",1,1,-1,32); +//addRotationMap("TWL_BaNsHee", "sctf",1,1,-1,32); +//addRotationMap("TWL_Boss", "sctf",1,1,-1,32); +//addRotationMap("TWL_Crossfire", "sctf",1,1,-1,32); +//addRotationMap("TWL_NoShelter", "sctf",1,1,-1,32); +//addRotationMap("TWL_Clusterfuct", "sctf",1,1,-1,32); +//addRotationMap("TWL_Curtilage", "sctf",1,1,-1,32); +//addRotationMap("TWL_DeadlyBirdsSong", "sctf",1,1,-1,32); +//addRotationMap("TWL_Frostclaw", "sctf",1,1,-1,32); +//addRotationMap("TWL_Magamatic", "sctf",1,1,-1,32); +//addRotationMap("TWL_Neve", "sctf",1,1,-1,32); +//addRotationMap("TWL_Pandemonium", "sctf",1,1,-1,32); +//addRotationMap("TWL_Ramparts", "sctf",1,1,-1,32); +//addRotationMap("DehSwamp", "sctf",1,1,-1,32); +//addRotationMap("HostileLoch", "sctf",1,1,-1,32); +//addRotationMap("DevilsElbow", "sctf",1,1,-1,32); +//addRotationMap("SmallDesertofDeath", "sctf",1,1,-1,32); +//addRotationMap("ShortFall", "sctf",1,1,-1,32); +//addRotationMap("Fallout", "sctf",1,1,-1,32); +//addRotationMap("SoylentGreen", "sctf",1,1,-1,32); +//addRotationMap("Island", "sctf",1,1,-1,32); +//addRotationMap("HighOctane", "sctf",1,1,-1,32); + +// _____ _ _ _ _ +// | __ \ | | | | | | | | +// | | | | ___ __ _| |_| |__ _ __ ___ __ _| |_ ___| |__ +// | | | |/ _ \/ _` | __| '_ \| '_ ` _ \ / _` | __/ __| '_ \ +// | |__| | __/ (_| | |_| | | | | | | | | (_| | || (__| | | | +// |_____/ \___|\__,_|\__|_| |_|_| |_| |_|\__,_|\__\___|_| |_| +///////////////////////////////////////////////////////////////////// + +addRotationMap("RaspDM", "DM",1,1,8,32); +addRotationMap("EntombedDM", "DM",1,1,-1,32); +addRotationMap("IceDomeDM", "DM",1,1,-1,32); +addRotationMap("HoofToeDM", "DM",1,1,6,32); +addRotationMap("ArenaDomeDM", "DM",1,1,-1,32); +addRotationMap("VulcansWrathDM", "DM",1,1,-1,32); +addRotationMap("RampartsDM", "DM",1,1,-1,32); +addRotationMap("ShrineDM", "DM",1,1,-1,12); +addRotationMap("LiveBaitDM", "DM",1,1,-1,32); +addRotationMap("FourSquareDM", "DM",1,1,-1,10); +addRotationMap("BrigDM", "DM",1,1,-1,8); + + + +// _____ _ +// | __ \ | | +// | | | |_ _ ___| | +// | | | | | | |/ _ \ | +// | |__| | |_| | __/ | +// |_____/ \__,_|\___|_| +///////////////////////////////////////////////////////////////////// + +//addRotationMap("AgentsOfFortune", "Duel",1,1,-1,32); +//addRotationMap("Casern_Cavite", "Duel",1,1,-1,32); +//addRotationMap("Equinox", "Duel",1,1,-1,32); +//addRotationMap("Escalade", "Duel",1,1,-1,32); +//addRotationMap("Fracas", "Duel",1,1,-1,32); +//addRotationMap("Invictus", "Duel",1,1,-1,32); +//addRotationMap("MyrkWood", "Duel",1,1,-1,32); +//addRotationMap("Oasis", "Duel",1,1,-1,32); +//addRotationMap("Pyroclasm", "Duel",1,1,-1,32); +//addRotationMap("Rasp", "Duel",1,1,-1,32); +//addRotationMap("SunDried", "Duel",1,1,-1,32); +//addRotationMap("Talus", "Duel",1,1,-1,32); +//addRotationMap("Underhill", "Duel",1,1,-1,32); +//addRotationMap("Whiteout", "Duel",1,1,-1,32); +//addRotationMap("Tombstone", "Duel",1,1,-1,32); +//addRotationMap("VaubanLak", "Duel",1,1,-1,32); +//addRotationMap("DesertofDeathLak", "Duel",1,1,-1,32); + + + +// _____ _ +// / ____(_) +// | (___ _ ___ __ _ ___ +// \___ \| |/ _ \/ _` |/ _ \ +// ____) | | __/ (_| | __/ +// |_____/|_|\___|\__, |\___| +// __/ | +// |___/ +///////////////////////////////////////////////////////////////////// + +addRotationMap("Alcatraz", "Siege",1,1,-1,32); +addRotationMap("BridgeTooFar", "Siege",1,1,-1,32); +addRotationMap("Caldera", "Siege",1,1,-1,32); +addRotationMap("Gauntlet", "Siege",1,1,-1,32); +addRotationMap("IceBound", "Siege",1,1,-1,32); +addRotationMap("Isleofman", "Siege",1,1,-1,32); +addRotationMap("Masada", "Siege",1,1,-1,32); +addRotationMap("Respite", "Siege",1,1,-1,32); +addRotationMap("Trident", "Siege",1,1,-1,32); +addRotationMap("UltimaThule", "Siege",1,1,-1,32); + diff --git a/Classic/prefs/SctfPrefs.cs b/Classic/prefs/SctfPrefs.cs index 20e145c..9e606fa 100644 --- a/Classic/prefs/SctfPrefs.cs +++ b/Classic/prefs/SctfPrefs.cs @@ -44,7 +44,7 @@ function setArmorDefaults(%armor) $InvBanList[SCtF, "Mine"] = 0; $InvBanList[SCtF, "ConcussionGrenade"] = 0; $InvBanList[SCtF, "CameraGrenade"] = 1; - $InvBanList[SCtF, "FlareGrenade"] = 0; + $InvBanList[SCtF, "FlareGrenade"] = 1; $InvBanList[SCtF, "FlashGrenade"] = 1; $InvBanList[SCtF, "Grenade"] = 0; //Pro Mode diff --git a/Classic/prefs/SetMapLimits.cs b/Classic/prefs/SetMapLimits.cs deleted file mode 100644 index 89869a7..0000000 --- a/Classic/prefs/SetMapLimits.cs +++ /dev/null @@ -1,573 +0,0 @@ -// __ __ _ _ _ _ -// | \/ | | | (_) (_) | -// | \ / | __ _ _ __ | | _ _ __ ___ _| |_ ___ -// | |\/| |/ _` | '_ \ | | | | '_ ` _ \| | __/ __| -// | | | | (_| | |_) | | |____| | | | | | | | |_\__ \ -// |_| |_|\__,_| .__/ |______|_|_| |_| |_|_|\__|___/ -// | | -// |_| - -// To set when tribes can select a map(based on the current population of the server) when looking thru the rotation for a suitable Next map. -// The First number is the minimum. The Second number is the maximum. -// -// $Host::MapPlayerLimitsAcidRain_CTF = "8 32"; -// -// This Example shows a map with the mimimum of 8 for the map to be selected, and a max of 32. -// Furthermore, if you did not want to have a minimum or maximum you can just set these values to -1. -// -// To see if a Limit has indeed loaded. -// echo( $Host::MapPlayerLimitsSmallCrossing_CTF ); -// echo( $Host::MapPlayerLimitsHighOctane_CTF ); -// echo( $Host::MapPlayerLimitsSnowcone_CTF ); -// -// %min SPC %max is just the preset %min SPC(Space) %max in the "Set Values for this Group" section -// "8 32" or "-1 -1" or "-1 16" will also work. Just dont forget the quotes. -// As the list goes down %min %max will stay the same unless you change them (a new %min = ? %max = ?) etc - -// This is done so a crash cant occur using local variables -// Using exec( $Host::EvoCustomMapLimitsFile ); in console -function setmaps() -{ - -// _____ _______ ______ -// / ____|__ __| ____| -// | | | | | |__ -// | | | | | __| -// | |____ | | | | -// \_____| |_| |_| -///////////////////////////////////////////////////////////////////// - -//Small Maps -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = -1; -%max = 18; - -$Host::MapPlayerLimitsSmallCrossing_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_CanyonCrusadeDeluxe_CTF = %min SPC %max; -$Host::MapPlayerLimitsRoundTheMountain_CTF = %min SPC "14"; -$Host::MapPlayerLimitsoasisintensity_CTF = %min SPC "12"; -$Host::MapPlayerLimitsMinotaur_CTF = %min SPC %max; -$Host::MapPlayerLimitsIsland_CTF = %min SPC %max; -$Host::MapPlayerLimitsTitForTat_CTF = %min SPC %max; -$Host::MapPlayerLimitsSmallMelee_CTF = %min SPC "12"; -$Host::MapPlayerLimitsSuperHappyBouncyFunTime_CTF = %min SPC "10"; -$Host::MapPlayerLimitsMachineeggs_CTF = %min SPC "10"; -$Host::MapPlayerLimitsMac_FlagArena_CTF = %min SPC "12"; -$Host::MapPlayerLimitsSmallTimeCTF_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Hildebrand_CTF = %min SPC %max; -$Host::MapPlayerLimitsArenaDome_CTF = %min SPC "10"; -$Host::MapPlayerLimitsFirestorm_CTF = %min SPC %max; -$Host::MapPlayerLimitsBulwark_CTF = %min SPC "12"; - -//Medium Maps -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = 8; -%max = 32; - -$Host::MapPlayerLimitsHighOctane_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Mordacity_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Damnation_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_JaggedClaw_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Massive_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Stonehenge_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Feign_CTF = %min SPC %max; -$Host::MapPlayerLimitsTheFray_CTF = %min SPC %max; -$Host::MapPlayerLimitsDangerousCrossing_nef_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Skylight_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Ocular_CTF = %min SPC %max; -$Host::MapPlayerLimitsDire_CTF = %min SPC %max; -$Host::MapPlayerLimitsberlard_CTF = %min SPC %max; -$Host::MapPlayerLimitsS8_Opus_CTF = %min SPC %max; -$Host::MapPlayerLimitsBeggarsRun_CTF = %min SPC %max; -$Host::MapPlayerLimitsSignal_CTF = %min SPC %max; -$Host::MapPlayerLimitsHeadstone_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Centaur_CTF = %min SPC %max; -$Host::MapPlayerLimitsS8_Cardiac_CTF = %min SPC %max; -$Host::MapPlayerLimitsCirclesEdge_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Icedance_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Woodymyrk_CTF = %min SPC %max; -$Host::MapPlayerLimitsDiscord_CTF = %min SPC %max; -$Host::MapPlayerLimitsTenebrousCTF_CTF = %min SPC %max; -$Host::MapPlayerLimitsPariah_CTF = %min SPC %max; -$Host::MapPlayerLimitsPrismatic_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_WilderZone_CTF = %min SPC %max; -$Host::MapPlayerLimitsMirage_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Mimicry_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Snowblind_CTF = %min SPC %max; -$Host::MapPlayerLimitsShortFall_CTF = %min SPC %max; -$Host::MapPlayerLimitsIceRidge_nef_CTF = %min SPC %max; -$Host::MapPlayerLimitsDisjointed_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_MuddySwamp_CTF = %min SPC %max; -$Host::MapPlayerLimitsBlink_CTF = %min SPC %max; -$Host::MapPlayerLimitsHighAnxiety_CTF = %min SPC %max; - -//Voteable but Not in Rotation -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = 10; -%max = 32; - -$Host::MapPlayerLimitsSnowcone_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Drache_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_HawkingHeat_CTF = %min SPC %max; -$Host::MapPlayerLimitsJadeValley_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Sherman_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Silenus_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_FrozenHope_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_IceDagger_CTF = %min SPC %max; -$Host::MapPlayerLimitsS5_Reynard_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Cinereous_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_OsIris_CTF = %min SPC %max; -$Host::MapPlayerLimitsCoppersky_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Crevice_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_SubZero_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Titan_CTF = %min SPC %max; -$Host::MapPlayerLimitsConfusco_CTF = %min SPC %max; -$Host::MapPlayerLimitsFallout_CTF = %min SPC %max; -$Host::MapPlayerLimitsTheClocktower_CTF = %min SPC %max; -$Host::MapPlayerLimitsSoylentGreen_CTF = %min SPC %max; -$Host::MapPlayerLimitsSurreal_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_MidnightMayhemDeluxe_CTF = %min SPC %max; -$Host::MapPlayerLimitsNightdance_CTF = %min SPC %max; -$Host::MapPlayerLimitsRamparts_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Celerity_CTF = %min SPC %max; -$Host::MapPlayerLimitsBlastside_nef_CTF = %min SPC %max; -$Host::MapPlayerLimitsInfernus_CTF = %min SPC %max; -$Host::MapPlayerLimitsNatureMagic_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Damnation_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_DangerousCrossing_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_DeadlyBirdsSong_CTF = %min SPC %max; -$Host::MapPlayerLimitsVauban_CTF = %min SPC %max; - -//Vehicle Maps -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = 12; -%max = 32; - -$Host::MapPlayerLimitsHostileLoch_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_BeachBlitz_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Magnum_CTF = %min SPC %max; -$Host::MapPlayerLimitsLogans_Run_CTF = %min SPC %max; -$Host::MapPlayerLimitsRollercoaster_nef_CTF = %min SPC %max; -$Host::MapPlayerLimitsMoonDance_CTF = %min SPC %max; -$Host::MapPlayerLimitsRaindance_nef_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Magamatic_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_FrozenGlory_CTF = %min SPC %max; -$Host::MapPlayerLimitsLandingParty_CTF = %min SPC %max; -$Host::MapPlayerLimitsTitanV_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Crossfire_CTF = %min SPC %max; -$Host::MapPlayerLimitsWindyGap_CTF = %min SPC %max; -$Host::MapPlayerLimitsSurro_CTF = %min SPC %max; -$Host::MapPlayerLimitsHarvestDance_CTF = %min SPC %max; -$Host::MapPlayerLimitsSubZeroV_CTF = %min SPC %max; -$Host::MapPlayerLimitsThe_Calm_CTF = %min SPC %max; - -//Vehicle Maps: Voteable, But Not in Rotation -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = 12; -%max = 32; - -$Host::MapPlayerLimitsTWL2_RoughLand_CTF = %min SPC %max; -$Host::MapPlayerLimitsS8_Geothermal_CTF = %min SPC %max; -$Host::MapPlayerLimitsLakefront_CTF = %min SPC %max; -$Host::MapPlayerLimitsShockRidge_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_BlueMoon_CTF = %min SPC %max; -$Host::MapPlayerLimitsFullCircle_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Katabatic_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Starfallen_CTF = %min SPC %max; -$Host::MapPlayerLimitsConstructionYard_CTF = %min SPC %max; -$Host::MapPlayerLimitsAcidRain_CTF = %min SPC %max; -$Host::MapPlayerLimitsSandOcean_CTF = %min SPC %max; -$Host::MapPlayerLimitsStarIce_CTF = %min SPC %max; -$Host::MapPlayerLimitsks_braistv_CTF = %min SPC %max; -$Host::MapPlayerLimitsFilteredDust_CTF = %min SPC %max; -$Host::MapPlayerLimitsChoke_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Ruined_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Chokepoint_CTF = %min SPC %max; -$Host::MapPlayerLimitsGlade_CTF = %min SPC %max; - -//BIG Vehicle Maps -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = 14; -%max = 32; - -$Host::MapPlayerLimitsFenix_CTF = "18" SPC %max; -$Host::MapPlayerLimitsHillside_CTF = "18" SPC %max; -$Host::MapPlayerLimitsSangre_de_Grado_CTF = %min SPC %max; -$Host::MapPlayerLimitsSlapdash_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Bleed_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Harvester_CTF = %min SPC %max; -$Host::MapPlayerLimitsArchipelago_CTF = %min SPC %max; -$Host::MapPlayerLimitsPantheon_CTF = %min SPC %max; -$Host::MapPlayerLimitsCircleofstones_CTF = %min SPC %max; -$Host::MapPlayerLimitsBerylBasin_CTF = %min SPC %max; -$Host::MapPlayerLimitsTWL_Frozen_CTF = %min SPC %max; - -//Not In Rotation - Not Voteable -///////////////////////////////////////////////////////////////////// - -//$Host::MapPlayerLimitsSandstorm_CTF = "8 32"; -//$Host::MapPlayerLimitsScarabrae_nef_CTF = "8 32"; -//$Host::MapPlayerLimitsStarfallen_CTF = "8 32"; -//$Host::MapPlayerLimitsStonehenge_nef_CTF = "8 32"; -//$Host::MapPlayerLimitsExtractor_CTF = "8 32"; -//$Host::MapPlayerLimitsAstersDescent_CTF = "8 32"; -//$Host::MapPlayerLimitsAzoth_CTF = "8 32"; -//$Host::MapPlayerLimitsBattleGrove_CTF = "8 32"; -//$Host::MapPlayerLimitsDurango_CTF = "8 32"; -//$Host::MapPlayerLimitsDustLust_CTF = "8 32"; -//$Host::MapPlayerLimitsIceGulch_CTF = "8 32"; -//$Host::MapPlayerLimitsMountainMist_CTF = "8 32"; -//$Host::MapPlayerLimitsPeak_CTF = "8 32"; -//$Host::MapPlayerLimitsPendulum_CTF = "8 32"; -//$Host::MapPlayerLimitsS5_Misadventure_CTF = "8 32"; -//$Host::MapPlayerLimitsS8_CentralDogma_CTF = "8 32"; -//$Host::MapPlayerLimitsS8_Mountking_CTF = "8 32"; -//$Host::MapPlayerLimitsS8_Zilch_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL2_CloakOfNight_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL2_Dissention_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL2_Drifts_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL2_Drorck_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL2_Norty_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Abaddon_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_BaNsHee_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Boss_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_NoShelter_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Clusterfuct_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Curtilage_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Deserted_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Frostclaw_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Horde_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Neve_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Pandemonium_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Ramparts_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_Sandstorm_CTF = "8 32"; -//$Host::MapPlayerLimitsTWL_WoodyMyrk_CTF = "8 32"; -//$Host::MapPlayerLimitsOctoberRust_CTF = "8 32"; -//$Host::MapPlayerLimitsDevilsElbow_CTF = "8 32"; -//$Host::MapPlayerLimitsCloudCity_CTF = "8 32"; -//$Host::MapPlayerLimitsDamnation_CTF = "8 32"; -//$Host::MapPlayerLimitsDeathBirdsFly_CTF = "8 32"; -//$Host::MapPlayerLimitsDesiccator_CTF = "8 32"; -//$Host::MapPlayerLimitsDustToDust_CTF = "8 32"; -//$Host::MapPlayerLimitsKatabatic_CTF = "8 32"; -//$Host::MapPlayerLimitsQuagmire_CTF = "8 32"; -//$Host::MapPlayerLimitsRecalescence_CTF = "8 32"; -//$Host::MapPlayerLimitsReversion_CTF = "8 32"; -//$Host::MapPlayerLimitsRiverDance_CTF = "8 32"; -//$Host::MapPlayerLimitsSanctuary_CTF = "8 32"; -//$Host::MapPlayerLimitsThinIce_CTF = "8 32"; -//$Host::MapPlayerLimitsTombstone_CTF = "8 32"; -//$Host::MapPlayerLimitsBroadside_nef_CTF = "8 32"; -//$Host::MapPlayerLimitsCamelland_CTF = "8 32"; -//$Host::MapPlayerLimitsHighTrepidation_CTF = "8 32"; -//$Host::MapPlayerLimitsSmallDesertofDeath_CTF = "8 32"; -//$Host::MapPlayerLimitsAgorazscium_CTF = "8 32"; -//$Host::MapPlayerLimitsBasinFury_CTF = "8 32"; -//$Host::MapPlayerLimitsCadaver_CTF = "8 32"; -//$Host::MapPlayerLimitsEivoItoxico_CTF = "8 32"; -//$Host::MapPlayerLimitsEinfach_CTF = "8 32"; -//$Host::MapPlayerLimitsPicnicTable_CTF = "8 32"; -//$Host::MapPlayerLimitsHostility_CTF = "8 32"; -//$Host::MapPlayerLimitsHighWire_CTF = "8 32"; -//$Host::MapPlayerLimitsCloudBurst_CTF = "8 32"; -//$Host::MapPlayerLimitsCloseCombat_CTF = "8 32"; -//$Host::MapPlayerLimitsDesertofDeath_nef_CTF = "8 32"; -//$Host::MapPlayerLimitsGorgon_CTF = "8 32"; -//$Host::MapPlayerLimitsMagamatic_CTF = "8 32"; -//$Host::MapPlayerLimitsSub-zero_CTF = "8 32"; - - - -// _ _ _ _ _ _ -// | | | | | | | | (_) | -// | | __ _| | ___ __ __ _| |__ | |__ _| |_ -// | | / _` | |/ / '__/ _` | '_ \| '_ \| | __| -// | |___| (_| | <| | | (_| | |_) | |_) | | |_ -// |______\__,_|_|\_\_| \__,_|_.__/|_.__/|_|\__| -///////////////////////////////////////////////////////////////////// - -//In Rotation -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = -1; -%max = 32; - -$Host::MapPlayerLimitsVaubanLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsMiniSunDried_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsSundance_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsTWL_BeachBlitzLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsDesertofDeathLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsRaindance_nefLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsSunDriedLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsSkinnyDipLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsSaddiesHill_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsHavenLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsLushLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsBoxLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsTitaniaLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsTibbawLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsInfernusLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsS8_GeothermalLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsCankerLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsDustRunLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsCrossfiredLak_LakRabbit = %min SPC %max; - -//Voteable, But not in rotation -///////////////////////////////////////////////////////////////////// - -$Host::MapPlayerLimitsTreasureIslandLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsSulfide_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsFrozenFuryLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsArrakis_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsEquinoxLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsPhasmaDustLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsGodsRiftLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsSolsDescentLak_LakRabbit = %min SPC %max; -$Host::MapPlayerLimitsCrater71Lak_LakRabbit = %min SPC %max; - -//Not Voteable, Not in rotation -///////////////////////////////////////////////////////////////////// - -//$Host::MapPlayerLimitsEscaladeLak_LakRabbit = "8 32"; -//$Host::MapPlayerLimitsMagmaticLak_LakRabbit = "8 32"; -//$Host::MapPlayerLimitsHillsOfSorrow_LakRabbit = "8 32"; -//$Host::MapPlayerLimitsTWL2_MuddySwampLak_LakRabbit = "8 32"; -//$Host::MapPlayerLimitsSandStormLak_LakRabbit = "8 32"; -//$Host::MapPlayerLimitsBeggarsRunLak_LakRabbit = "8 32"; -//$Host::MapPlayerLimitsDamnnationLak_LakRabbit = "8 32"; - - - -// _ _____ _______ ______ -// | | / ____|__ __| ____| -// | | | | | | | |__ -// | | | | | | | __| -// | |___| |____ | | | | -// |______\_____| |_| |_| -///////////////////////////////////////////////////////////////////// - -//In Rotation -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = -1; -%max = 32; - -$Host::MapPlayerLimitsBastardForgeLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsFirestormLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsDangerousCrossingLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsSmallCrossingLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsDireLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsRoundTheMountainLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsCirclesEdgeLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTenebrousCTF_sctf = %min SPC %max; -$Host::MapPlayerLimitsTheFray_sctf = %min SPC %max; -$Host::MapPlayerLimitsSignalLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsStarFallLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_DamnationLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_Icedance_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_Mordacity_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_SilenusLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_CanyonCrusadeDeluxeLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_FrozenHopeLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_JaggedClawLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_HildebrandLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_SkylightLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_BeachBlitzLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_FeignLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_RollercoasterLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_StonehengeLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_WilderZoneLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsoasisintensity_sctf = %min SPC %max; -$Host::MapPlayerLimitsberlard_sctf = %min SPC %max; -$Host::MapPlayerLimitsRaindanceLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsSmallTimeLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsArenaDome_sctf = %min SPC %max; -$Host::MapPlayerLimitsBulwark_sctf = %min SPC %max; -$Host::MapPlayerLimitsDiscord_sctf = %min SPC %max; -$Host::MapPlayerLimitsJadeValley_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_MassiveLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsBlink_sctf = %min SPC %max; -$Host::MapPlayerLimitsHillTopHop_sctf = %min SPC %max; - -//Voteable, But not in rotation -///////////////////////////////////////////////////////////////////// - -$Host::MapPlayerLimitsHeadstone_sctf = %min SPC %max; -$Host::MapPlayerLimitsMirage_sctf = %min SPC %max; -$Host::MapPlayerLimitsBeggarsRunLT_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_HawkingHeat_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_Mimicry_sctf = %min SPC %max; -$Host::MapPlayerLimitsS5_Woodymyrk_sctf = %min SPC %max; -$Host::MapPlayerLimitsS8_Cardiac_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Celerity_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Crevice_sctf = %min SPC %max; -$Host::MapPlayerLimitsS8_Opus_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_MidnightMayhemDeluxe_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL2_Ocular_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_Cinereous_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_Deserted_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_DangerousCrossing_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_OsIris_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_Damnation_sctf = %min SPC %max; -$Host::MapPlayerLimitsTWL_Titan_sctf = %min SPC %max; - -//Not Voteable, Not in rotation -///////////////////////////////////////////////////////////////////// - -//$Host::MapPlayerLimitsSurrealLT_sctf = "8 32"; -//$Host::MapPlayerLimitsCoppersky_sctf = "8 32"; -//$Host::MapPlayerLimitsDuelersDelight_sctf = "8 32"; -//$Host::MapPlayerLimitsSuperHappyBouncyFunTime_sctf = "8 32"; -//$Host::MapPlayerLimitsPariahLT_sctf = "8 32"; -//$Host::MapPlayerLimitsSmallMelee_sctf = "8 32"; -//$Host::MapPlayerLimitsTitForTat_sctf = "8 32"; -//$Host::MapPlayerLimitsCloseCombatLT_sctf = "8 32"; -//$Host::MapPlayerLimitsPrismatic_sctf = "8 32"; -//$Host::MapPlayerLimitsDamnation_sctf = "8 32"; -//$Host::MapPlayerLimitsDustToDust_sctf = "8 32"; -//$Host::MapPlayerLimitsMinotaur_sctf = "8 32"; -//$Host::MapPlayerLimitsDesertofDeath_nef_sctf = "8 32"; -//$Host::MapPlayerLimitsGorgon_sctf = "8 32"; -//$Host::MapPlayerLimitsTitan_sctf = "8 32"; -//$Host::MapPlayerLimitsMac_FlagArena_sctf = "8 32"; -//$Host::MapPlayerLimitsExtractor_sctf = "8 32"; -//$Host::MapPlayerLimitsAstersDescent_sctf = "8 32"; -//$Host::MapPlayerLimitsAzoth_sctf = "8 32"; -//$Host::MapPlayerLimitsDustLust_sctf = "8 32"; -//$Host::MapPlayerLimitsDisjointed_sctf = "8 32"; -//$Host::MapPlayerLimitsPeak_sctf = "8 32"; -//$Host::MapPlayerLimitsSnowcone_sctf = "8 32"; -//$Host::MapPlayerLimitsS5_Centaur_sctf = "8 32"; -//$Host::MapPlayerLimitsS5_Drache_sctf = "8 32"; -//$Host::MapPlayerLimitsS5_Misadventure_sctf = "8 32"; -//$Host::MapPlayerLimitsS5_Reynard_sctf = "8 32"; -//$Host::MapPlayerLimitsS5_Sherman_sctf = "8 32"; -//$Host::MapPlayerLimitsS8_Geothermal_sctf = "8 32"; -//$Host::MapPlayerLimitsS8_Zilch_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_Drifts_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_Drorck_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_FrozenGlory_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_IceDagger_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_MuddySwamp_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_Norty_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_RoughLand_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL2_Ruined_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_BaNsHee_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Boss_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Crossfire_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_NoShelter_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Clusterfuct_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Curtilage_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_DeadlyBirdsSong_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Frostclaw_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Magamatic_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Neve_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Pandemonium_sctf = "8 32"; -//$Host::MapPlayerLimitsTWL_Ramparts_sctf = "8 32"; -//$Host::MapPlayerLimitsDehSwamp_sctf = "8 32"; -//$Host::MapPlayerLimitsHostileLoch_sctf = "8 32"; -//$Host::MapPlayerLimitsDevilsElbow_sctf = "8 32"; -//$Host::MapPlayerLimitsCamelland_sctf = "8 32"; -//$Host::MapPlayerLimitsSmallDesertofDeath_sctf = "8 32"; -//$Host::MapPlayerLimitsShortFall_sctf = "8 32"; -//$Host::MapPlayerLimitsFallout_sctf = "8 32"; -//$Host::MapPlayerLimitsSoylentGreen_sctf = "8 32"; -//$Host::MapPlayerLimitsIsland_sctf = "8 32"; -//$Host::MapPlayerLimitsHighOctane_sctf = "8 32"; - - - -// _____ _ _ _ _ -// | __ \ | | | | | | | | -// | | | | ___ __ _| |_| |__ _ __ ___ __ _| |_ ___| |__ -// | | | |/ _ \/ _` | __| '_ \| '_ ` _ \ / _` | __/ __| '_ \ -// | |__| | __/ (_| | |_| | | | | | | | | (_| | || (__| | | | -// |_____/ \___|\__,_|\__|_| |_|_| |_| |_|\__,_|\__\___|_| |_| -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -%min = -1; -%max = 32; - -$Host::MapPlayerLimitsRaspDM_DM = %min SPC %max; -$Host::MapPlayerLimitsEntombedDM_DM = %min SPC %max; -$Host::MapPlayerLimitsIceDomeDM_DM = %min SPC %max; -$Host::MapPlayerLimitsHoofToeDM_DM = %min SPC %max; -$Host::MapPlayerLimitsArenaDomeDM_DM = %min SPC %max; -$Host::MapPlayerLimitsVulcansWrathDM_DM = %min SPC %max; -$Host::MapPlayerLimitsRampartsDM_DM = %min SPC %max; -$Host::MapPlayerLimitsShrineDM_DM = %min SPC %max; -$Host::MapPlayerLimitsLiveBaitDM_DM = %min SPC %max; -$Host::MapPlayerLimitsFourSquareDM_DM = %min SPC %max; -$Host::MapPlayerLimitsBrigDM_DM = %min SPC %max; - - - -// _____ _ -// | __ \ | | -// | | | |_ _ ___| | -// | | | | | | |/ _ \ | -// | |__| | |_| | __/ | -// |_____/ \__,_|\___|_| -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -//%min = -1; -//%max = 32; - -//$Host::MapPlayerLimitsAgentsOfFortune_Duel = %min SPC %max; -//$Host::MapPlayerLimitsCasern_Cavite_Duel = %min SPC %max; -//$Host::MapPlayerLimitsEquinox_Duel = %min SPC %max; -//$Host::MapPlayerLimitsEscalade_Duel = %min SPC %max; -//$Host::MapPlayerLimitsFracas_Duel = %min SPC %max; -//$Host::MapPlayerLimitsInvictus_Duel = %min SPC %max; -//$Host::MapPlayerLimitsMyrkWood_Duel = %min SPC %max; -//$Host::MapPlayerLimitsOasis_Duel = %min SPC %max; -//$Host::MapPlayerLimitsPyroclasm_Duel = %min SPC %max; -//$Host::MapPlayerLimitsRasp_Duel = %min SPC %max; -//$Host::MapPlayerLimitsSunDried_Duel = %min SPC %max; -//$Host::MapPlayerLimitsTalus_Duel = %min SPC %max; -//$Host::MapPlayerLimitsUnderhill_Duel = %min SPC %max; -//$Host::MapPlayerLimitsWhiteout_Duel = %min SPC %max; -//$Host::MapPlayerLimitsTombstone_Duel = %min SPC %max; -//$Host::MapPlayerLimitsVaubanLak_Duel = %min SPC %max; -//$Host::MapPlayerLimitsDesertofDeathLak_Duel = %min SPC %max; - - - -// _____ _ -// / ____(_) -// | (___ _ ___ __ _ ___ -// \___ \| |/ _ \/ _` |/ _ \ -// ____) | | __/ (_| | __/ -// |_____/|_|\___|\__, |\___| -// __/ | -// |___/ -///////////////////////////////////////////////////////////////////// - -//Set Values for this Group -//%min = -1; -//%max = 32; - -//$Host::MapPlayerLimitsIsleofman_Siege = %min SPC %max; -//$Host::MapPlayerLimitsTrident_Siege = %min SPC %max; -//$Host::MapPlayerLimitsAlcatraz_Siege = %min SPC %max; - -} - -// Run our function -setmaps(); \ No newline at end of file diff --git a/Classic/prefs/evo_mapRotation.cs b/Classic/prefs/evo_mapRotation.cs deleted file mode 100644 index c462f5c..0000000 --- a/Classic/prefs/evo_mapRotation.cs +++ /dev/null @@ -1,530 +0,0 @@ -// __ __ _____ _ _ _ -// | \/ | | __ \ | | | | (_) -// | \ / | __ _ _ __ | |__) |___ | |_ __ _| |_ _ ___ _ __ -// | |\/| |/ _` | '_ \ | _ // _ \| __/ _` | __| |/ _ \| '_ \ -// | | | | (_| | |_) | | | \ \ (_) | || (_| | |_| | (_) | | | | -// |_| |_|\__,_| .__/ |_| \_\___/ \__\__,_|\__|_|\___/|_| |_| -// | | -// |_| -// -// Use of this file -// To add a new map follow this rules: -// 1. Find the file name, ending in .mis (ie BeggarsRun.mis) -// 2. Add a line with this syntact: addRotationMap(filename, gametype, %ffa, %cycle); -// -// %ffa = changing this to 0, will remove the map from the FFA mode -// %cycle = changing this to 0 will remove the map from the FFA cycle, but not from the rotation (optional) -// if %ffa is 0, %cycle is useless -// -// Note: filename must be written without .mis -// -// Example: addRotationMap(BeggarsRun, CTF, 1, 1); -// Beggar's Run will be in the FFA mapRotation. It's in the cycle and can be voted -// -// Example: addRotationMap(BeggarsRun, CTF, 1, 0); -// Beggar's Run will be in the FFA mapRotation. It's not in the cycle, but can be voted -// -// Example: addRotationMap(BeggarsRun, CTF, 0); -// Beggar's Run won't be in the FFA mapRotation. It's not in the cycle and can't be voted -// -// Info: -// If you don't want a map to be played neither in Tournement Mode, write // at the beginning of the line (or delete the line) -// If you don't want a gametype to be played, just don't add any map of that gametype -// Some Mods (ie LakLakRabbit) use own maps. To use this mods, you must add the maps in this file -// %cycle variable is optional and if not included the map will always be in the cycle (if %ffa is 1). - - -// _____ _______ ______ -// / ____|__ __| ____| -// | | | | | |__ -// | | | | | __| -// | |____ | | | | -// \_____| |_| |_| -///////////////////////////////////////////////////////////////////// - -//Small Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap(SmallCrossing, CTF, 1, 1); -addRotationMap(TWL2_CanyonCrusadeDeluxe, CTF, 1, 1); -addRotationMap(RoundTheMountain, CTF, 1, 1); -addRotationMap(oasisintensity, CTF, 1, 1); -addRotationMap(Minotaur, CTF, 1, 0); -addRotationMap(Island, CTF, 1, 0); -addRotationMap(TitForTat, CTF, 1, 0); -addRotationMap(SmallMelee, CTF, 1, 0); -addRotationMap(SuperHappyBouncyFunTime, CTF, 1, 0); -addRotationMap(Machineeggs, CTF, 1, 0); -addRotationMap(Mac_FlagArena, CTF, 1, 0); -addRotationMap(SmallTimeCTF, CTF, 1, 1); -addRotationMap(TWL2_Hildebrand, CTF, 1, 1); -addRotationMap(ArenaDome, CTF, 1, 0); -addRotationMap(Firestorm, CTF, 1, 0); - -//Medium Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap(HighOctane, CTF, 1, 1); -addRotationMap(S5_Mordacity, CTF, 1, 1); -addRotationMap(S5_Damnation, CTF, 1, 1); -addRotationMap(TWL2_JaggedClaw, CTF, 1, 1); -addRotationMap(S5_Massive, CTF, 1, 1); -addRotationMap(TWL_Stonehenge, CTF, 1, 1); -addRotationMap(TWL_Feign, CTF, 1, 0); -addRotationMap(TheFray, CTF, 1, 1); -addRotationMap(DangerousCrossing_nef, CTF, 1, 1); -addRotationMap(TWL2_Skylight, CTF, 1, 1); -addRotationMap(TWL2_Ocular, CTF, 1, 1); -addRotationMap(Dire, CTF, 1, 0); -addRotationMap(berlard, CTF, 1, 1); -addRotationMap(S8_Opus, CTF, 1, 0); -addRotationMap(BeggarsRun, CTF, 1, 0); -addRotationMap(Signal, CTF, 1, 1); -addRotationMap(Bulwark, CTF, 1, 1); -addRotationMap(S5_Woodymyrk, CTF, 1, 1); -addRotationMap(Discord, CTF, 1, 1); -addRotationMap(TenebrousCTF, CTF, 1, 1); -addRotationMap(Pariah, CTF, 1, 1); -addRotationMap(Prismatic, CTF, 1, 0); -addRotationMap(TWL_WilderZone, CTF, 1, 1); -addRotationMap(Mirage, CTF, 1, 1); -addRotationMap(S5_Mimicry, CTF, 1, 1); -addRotationMap(TWL_Snowblind, CTF, 1, 0); -addRotationMap(ShortFall, CTF, 1, 0); -addRotationMap(IceRidge_nef, CTF, 1, 0); -addRotationMap(Disjointed, CTF, 1, 0); -addRotationMap(TWL2_MuddySwamp, CTF, 1, 0); -addRotationMap(Blink, CTF, 1, 1); -addRotationMap(HighAnxiety, CTF, 1, 1); -addRotationMap(Headstone, CTF, 1, 0); -addRotationMap(S5_Centaur, CTF, 1, 0); -addRotationMap(S8_Cardiac, CTF, 1, 1); -addRotationMap(CirclesEdge, CTF, 1, 1); -addRotationMap(S5_Icedance, CTF, 1, 1); -addRotationMap(Surreal, CTF, 1, 0); - -//Voteable but Not in Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap(Snowcone, CTF, 1, 0); -addRotationMap(S5_Drache, CTF, 1, 0); -addRotationMap(S5_HawkingHeat, CTF, 1, 0); -addRotationMap(JadeValley, CTF, 1, 0); -addRotationMap(S5_Sherman, CTF, 1, 0); -addRotationMap(S5_Silenus, CTF, 1, 0); -addRotationMap(TWL2_FrozenHope, CTF, 1, 0); -addRotationMap(TWL2_IceDagger, CTF, 1, 0); -addRotationMap(S5_Reynard, CTF, 1, 0); -addRotationMap(TWL_Cinereous, CTF, 1, 0); -addRotationMap(TWL_OsIris, CTF, 1, 0); -addRotationMap(Coppersky, CTF, 1, 0); -addRotationMap(TWL2_Crevice, CTF, 1, 0); -addRotationMap(TWL_SubZero, CTF, 1, 0); -addRotationMap(TWL_Titan, CTF, 1, 0); -addRotationMap(Confusco, CTF, 1, 0); -addRotationMap(Fallout, CTF, 1, 0); -addRotationMap(TheClocktower, CTF, 1, 0); -addRotationMap(SoylentGreen, CTF, 1, 0); -addRotationMap(TWL2_MidnightMayhemDeluxe, CTF, 1, 0); -addRotationMap(Nightdance, CTF, 1, 0); -addRotationMap(Ramparts, CTF, 1, 0); -addRotationMap(TWL2_Celerity, CTF, 1, 1); -addRotationMap(Blastside_nef, CTF, 1, 0); -addRotationMap(Infernus, CTF, 1, 0); -addRotationMap(NatureMagic, CTF, 1, 0); -addRotationMap(TWL_Damnation, CTF, 1, 0); -addRotationMap(TWL_DangerousCrossing, CTF, 1, 0); -addRotationMap(TWL_DeadlyBirdsSong, CTF, 1, 0); -addRotationMap(Vauban, CTF, 1, 0); - -//Vehicle Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap(HostileLoch, CTF, 1, 1); -addRotationMap(TWL_BeachBlitz, CTF, 1, 1); -addRotationMap(TWL2_Magnum, CTF, 1, 1); -addRotationMap(Logans_Run, CTF, 1, 1); -addRotationMap(Rollercoaster_nef, CTF, 1, 1); -addRotationMap(MoonDance, CTF, 1, 1); -addRotationMap(Raindance_nef, CTF, 1, 0); -addRotationMap(TWL_Magmatic, CTF, 1, 0); -addRotationMap(TWL2_FrozenGlory, CTF, 1, 1); -addRotationMap(LandingParty, CTF, 1, 1); -addRotationMap(TitanV, CTF, 1, 0); -addRotationMap(TWL_Crossfire, CTF, 1, 1); -addRotationMap(WindyGap, CTF, 1, 0); -addRotationMap(Surro, CTF, 1, 0); -addRotationMap(HarvestDance, CTF, 1, 0); -addRotationMap(The_Calm, CTF, 1, 0); - -//Vehicle Maps: Voteable, But Not in Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap(SubZeroV, CTF, 1, 0); -addRotationMap(TWL2_RoughLand, CTF, 1, 0); -addRotationMap(S8_Geothermal, CTF, 1, 0); -addRotationMap(Lakefront, CTF, 1, 0); -addRotationMap(ShockRidge, CTF, 1, 0); -addRotationMap(TWL2_BlueMoon, CTF, 1, 0); -addRotationMap(FullCircle, CTF, 1, 0); -addRotationMap(TWL_Katabatic, CTF, 1, 0); -addRotationMap(TWL_Starfallen, CTF, 1, 0); -addRotationMap(ConstructionYard, CTF, 1, 0); -addRotationMap(AcidRain, CTF, 1, 0); -addRotationMap(SandOcean, CTF, 1, 0); -addRotationMap(StarIce, CTF, 1, 0); -addRotationMap(ks_braistv , CTF, 1, 0); -addRotationMap(FilteredDust, CTF, 1, 0); -addRotationMap(Choke, CTF, 1, 0); -addRotationMap(TWL2_Ruined, CTF, 1, 0); -addRotationMap(TWL_Chokepoint, CTF, 1, 0); -addRotationMap(Glade, CTF, 1, 0); - -//BIG Vehicle Maps -///////////////////////////////////////////////////////////////////// - -addRotationMap(Fenix, CTF, 1, 0); -addRotationMap(Hillside, CTF, 1, 0); -addRotationMap(Sangre_de_Grado, CTF, 1, 0); -addRotationMap(Slapdash, CTF, 1, 0); -addRotationMap(BerylBasin, CTF, 1, 0); -addRotationMap(TWL_Frozen, CTF, 1, 0); -addRotationMap(TWL_Harvester, CTF, 1, 0); -addRotationMap(Archipelago, CTF, 1, 0); -addRotationMap(TWL2_Bleed, CTF, 1, 0); -addRotationMap(Pantheon, CTF, 1, 0); -addRotationMap(Circleofstones, CTF, 1, 1); - -//Not In Rotation - Not Voteable -///////////////////////////////////////////////////////////////////// - -//addRotationMap(Sandstorm, CTF, 1, 0); -//addRotationMap(Scarabrae_nef, CTF, 0, 0); -//addRotationMap(Starfallen, CTF, 1, 0); -//addRotationMap(Stonehenge_nef, CTF, 1, 0); -//addRotationMap(Extractor, CTF, 0, 0); -//addRotationMap(AstersDescent, CTF, 1, 0); -//addRotationMap(Azoth, CTF, 0, 0); -//addRotationMap(BattleGrove, CTF, 0, 0); -//addRotationMap(Durango, CTF, 0, 0); -//addRotationMap(DustLust, CTF, 0, 0); -//addRotationMap(IceGulch, CTF, 0, 0); -//addRotationMap(MountainMist, CTF, 0, 0); -//addRotationMap(Peak, CTF, 0, 0); -//addRotationMap(Pendulum, CTF, 0, 0); -//addRotationMap(S5_Misadventure, CTF, 1, 0); -//addRotationMap(S8_CentralDogma, CTF, 0, 0); -//addRotationMap(S8_Mountking, CTF, 0, 0); -//addRotationMap(S8_Zilch, CTF, 0, 0); -//addRotationMap(TWL2_CloakOfNight, CTF, 1, 0); -//addRotationMap(TWL2_Dissention, CTF, 0, 0); -//addRotationMap(TWL2_Drifts, CTF, 1, 0); -//addRotationMap(TWL2_Drorck, CTF, 0, 0); -//addRotationMap(TWL2_Norty, CTF, 1, 0); -//addRotationMap(TWL_Abaddon, CTF, 0, 0); -//addRotationMap(TWL_BaNsHee, CTF, 0, 0); -//addRotationMap(TWL_Boss, CTF, 0, 0); -//addRotationMap(TWL_NoShelter, CTF, 1, 0); -//addRotationMap(TWL_Clusterfuct, CTF, 0, 0); -//addRotationMap(TWL_Curtilage, CTF, 0, 0); -//addRotationMap(TWL_Deserted, CTF, 1, 0); -//addRotationMap(TWL_Frostclaw, CTF, 1, 0); -//addRotationMap(TWL_Horde, CTF, 0, 0); -//addRotationMap(TWL_Neve, CTF, 0, 0); -//addRotationMap(TWL_Pandemonium, CTF, 0, 0); -//addRotationMap(TWL_Ramparts, CTF, 0, 0); -//addRotationMap(TWL_Sandstorm, CTF, 0, 0); -//addRotationMap(TWL_WoodyMyrk, CTF, 1, 0); -//addRotationMap(OctoberRust, CTF, 0, 0); -//addRotationMap(DevilsElbow, CTF, 0, 0); -//addRotationMap(CloudCity, CTF, 0, 0); -//addRotationMap(Damnation, CTF, 0, 0); -//addRotationMap(DeathBirdsFly, CTF, 0, 0); -//addRotationMap(Desiccator, CTF, 0, 0); -//addRotationMap(DustToDust, CTF, 0, 0); -//addRotationMap(Katabatic, CTF, 0, 0); -//addRotationMap(Quagmire, CTF, 0, 0); -//addRotationMap(Recalescence, CTF, 0, 0); -//addRotationMap(Reversion, CTF, 0, 0); -//addRotationMap(RiverDance, CTF, 1, 0); -//addRotationMap(Sanctuary, CTF, 0, 0); -//addRotationMap(ThinIce, CTF, 0, 0); -//addRotationMap(Tombstone, CTF, 0, 0); -//addRotationMap(Broadside_nef, CTF, 0, 0); -//addRotationMap(Camelland, CTF, 0, 0); -//addRotationMap(HighTrepidation, CTF, 0, 0); -//addRotationMap(SmallDesertofDeath, CTF, 0, 0); -//addRotationMap(Agorazscium, CTF, 0, 0); -//addRotationMap(BasinFury, CTF, 0, 0); -//addRotationMap(Cadaver, CTF, 0, 0); -//addRotationMap(EivoItoxico, CTF, 0, 0); -//addRotationMap(Einfach, CTF, 0, 0); -//addRotationMap(PicnicTable, CTF, 1, 0); -//addRotationMap(Hostility, CTF, 0, 0); -//addRotationMap(HighWire, CTF, 0, 0); -//addRotationMap(CloudBurst, CTF, 1, 0); -//addRotationMap(CloseCombat, CTF, 1, 0); -//addRotationMap(DesertofDeath_nef, CTF, 0, 0); -//addRotationMap(Gorgon, CTF, 1, 0); -//addRotationMap(Magamatic, CTF, 1, 0); -//addRotationMap(Sub-zero, CTF, 1, 1); - - - -// _ _ _ _ _ _ -// | | | | | | | | (_) | -// | | __ _| | ___ __ __ _| |__ | |__ _| |_ -// | | / _` | |/ / '__/ _` | '_ \| '_ \| | __| -// | |___| (_| | <| | | (_| | |_) | |_) | | |_ -// |______\__,_|_|\_\_| \__,_|_.__/|_.__/|_|\__| -///////////////////////////////////////////////////////////////////// - -//In Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap(VaubanLak, LakRabbit, 1, 1); -addRotationMap(MiniSunDried, LakRabbit, 1, 1); -addRotationMap(Sundance, LakRabbit, 1, 1); -addRotationMap(TWL_BeachBlitzLak, LakRabbit, 1, 1); -addRotationMap(DesertofDeathLak, LakRabbit, 1, 1); -addRotationMap(Raindance_nefLak, LakRabbit, 1, 1); -addRotationMap(SunDriedLak, LakRabbit, 1, 1); -addRotationMap(SkinnyDipLak, LakRabbit, 1, 1); -addRotationMap(SaddiesHill, LakRabbit, 1, 1); -addRotationMap(HavenLak, LakRabbit, 1, 0); -addRotationMap(LushLak, LakRabbit, 1, 1); -addRotationMap(BoxLak, LakRabbit, 1, 1); -addRotationMap(TitaniaLak, LakRabbit, 1, 0); -addRotationMap(TibbawLak, LakRabbit, 1, 1); -addRotationMap(InfernusLak, LakRabbit, 1, 1); -addRotationMap(S8_GeothermalLak, LakRabbit, 1, 1); -addRotationMap(CankerLak, LakRabbit, 1, 1); -addRotationMap(DustRunLak, LakRabbit, 1, 1); -addRotationMap(CrossfiredLak, LakRabbit, 1, 0); - -//Voteable, But not in rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap(TreasureIslandLak, LakRabbit, 1, 0); -addRotationMap(Sulfide, LakRabbit, 1, 0); -addRotationMap(FrozenFuryLak, LakRabbit, 1, 0); -addRotationMap(Arrakis, LakRabbit, 1, 0); -addRotationMap(EquinoxLak, LakRabbit, 1, 0); -addRotationMap(PhasmaDustLak, LakRabbit, 1, 1); -addRotationMap(GodsRiftLak, LakRabbit, 1, 0); -addRotationMap(SolsDescentLak, LakRabbit, 1, 0); -addRotationMap(Crater71Lak, LakRabbit, 1, 0); - -//Not Voteable, Not in rotation -///////////////////////////////////////////////////////////////////// - -//addRotationMap(EscaladeLak, LakRabbit, 1, 0); -//addRotationMap(MagmaticLak, LakRabbit, 1, 0); -//addRotationMap(HillsOfSorrow, LakRabbit, 1, 1); -//addRotationMap(TWL2_MuddySwampLak, LakRabbit, 0, 0); -//addRotationMap(SandStormLak, LakRabbit, 1, 0); -//addRotationMap(BeggarsRunLak, LakRabbit, 1, 0); -//addRotationMap(DamnnationLak, LakRabbit, 1, 0); - - - -// _ _____ _______ ______ -// | | / ____|__ __| ____| -// | | | | | | | |__ -// | | | | | | | __| -// | |___| |____ | | | | -// |______\_____| |_| |_| -///////////////////////////////////////////////////////////////////// - -//In Rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap(BastardForgeLT, sctf, 1, 1); -addRotationMap(FirestormLT, sctf, 1, 1); -addRotationMap(DangerousCrossingLT, sctf, 1, 1); -addRotationMap(SmallCrossingLT, sctf, 1, 1); -addRotationMap(DireLT, sctf, 1, 1); -addRotationMap(RoundTheMountainLT, sctf, 1, 1); -addRotationMap(CirclesEdgeLT, sctf, 1, 1); -addRotationMap(TenebrousCTF, sctf, 1, 1); -addRotationMap(TheFray, sctf, 1, 1); -addRotationMap(SignalLT, sctf, 1, 1); -addRotationMap(StarFallLT, sctf, 1, 1); -addRotationMap(S5_DamnationLT, sctf, 1, 1); -addRotationMap(S5_Icedance, sctf, 1, 1); -addRotationMap(S5_Mordacity, sctf, 1, 1); -addRotationMap(S5_SilenusLT, sctf, 1, 1); -addRotationMap(TWL2_CanyonCrusadeDeluxeLT, sctf, 1, 1); -addRotationMap(TWL2_FrozenHopeLT, sctf, 1, 1); -addRotationMap(TWL2_JaggedClawLT, sctf, 1, 1); -addRotationMap(TWL2_HildebrandLT, sctf, 1, 1); -addRotationMap(TWL2_SkylightLT, sctf, 1, 1); -addRotationMap(TWL_BeachBlitzLT, sctf, 1, 1); -addRotationMap(TWL_FeignLT, sctf, 1, 1); -addRotationMap(TWL_RollercoasterLT, sctf, 1, 1); -addRotationMap(TWL_StonehengeLT, sctf, 1, 1); -addRotationMap(TWL_WilderZoneLT, sctf, 1, 1); -addRotationMap(oasisintensity, sctf, 1, 1); -addRotationMap(berlard, sctf, 1, 1); -addRotationMap(RaindanceLT, sctf, 1, 1); -addRotationMap(SmallTimeLT, sctf, 1, 1); -addRotationMap(ArenaDome, sctf, 1, 1); -addRotationMap(Bulwark, sctf, 1, 1); -addRotationMap(Discord, sctf, 1, 1); -addRotationMap(JadeValley, sctf, 1, 1); -addRotationMap(S5_MassiveLT, sctf, 1, 1); -addRotationMap(Blink, sctf, 1, 1); -addRotationMap(HillTopHop, sctf, 1, 1); - -//Voteable, But not in rotation -///////////////////////////////////////////////////////////////////// - -addRotationMap(Headstone, sctf, 1, 0); -addRotationMap(Mirage, sctf, 1, 0); -addRotationMap(BeggarsRunLT, sctf, 1, 0); -addRotationMap(S5_HawkingHeat, sctf, 1, 0); -addRotationMap(S5_Mimicry, sctf, 1, 0); -addRotationMap(S5_Woodymyrk, sctf, 1, 0); -addRotationMap(S8_Cardiac, sctf, 1, 0); -addRotationMap(TWL2_Celerity, sctf, 1, 0); -addRotationMap(TWL2_Crevice, sctf, 1, 0); -addRotationMap(S8_Opus, sctf, 1, 0); -addRotationMap(TWL2_MidnightMayhemDeluxe, sctf, 1, 0); -addRotationMap(TWL2_Ocular, sctf, 1, 0); -addRotationMap(TWL_Cinereous, sctf, 1, 0); -addRotationMap(TWL_Deserted, sctf, 1, 0); -addRotationMap(TWL_DangerousCrossing, sctf, 1, 0); -addRotationMap(TWL_OsIris, sctf, 1, 0); -addRotationMap(TWL_Damnation, sctf, 1, 0); -addRotationMap(TWL_Titan, sctf, 1, 0); - -//Not Voteable, Not in rotation -///////////////////////////////////////////////////////////////////// - -//addRotationMap(SurrealLT, sctf, 1, 1); -//addRotationMap(Coppersky, sctf, 1, 1); -//addRotationMap(DuelersDelight, sctf, 1, 1); -//addRotationMap(SuperHappyBouncyFunTime, sctf, 1, 0); -//addRotationMap(PariahLT, sctf, 1, 1); -//addRotationMap(SmallMelee, sctf, 1, 1); -//addRotationMap(TitForTat, sctf, 1, 1); -//addRotationMap(CloseCombatLT, sctf, 1, 1); -//addRotationMap(Prismatic, sctf, 1, 1); -//addRotationMap(Damnation, sctf, 0, 0); -//addRotationMap(DustToDust, sctf, 0, 0); -//addRotationMap(Minotaur, sctf, 0, 0); -//addRotationMap(DesertofDeath_nef, sctf, 0, 0); -//addRotationMap(Gorgon, sctf, 0, 0); -//addRotationMap(Titan, sctf, 0, 0); -//addRotationMap(Mac_FlagArena, sctf, 0, 0); -//addRotationMap(Extractor, sctf, 0, 0); -//addRotationMap(AstersDescent, sctf, 0, 0); -//addRotationMap(Azoth, sctf, 0, 0); -//addRotationMap(DustLust, sctf, 0, 0); -//addRotationMap(Disjointed, sctf, 0, 0); -//addRotationMap(Peak, sctf, 0, 0); -//addRotationMap(Snowcone, sctf, 0, 0); -//addRotationMap(S5_Centaur, sctf, 0, 0); -//addRotationMap(S5_Drache, sctf, 0, 0); -//addRotationMap(S5_Misadventure, sctf, 0, 0); -//addRotationMap(S5_Reynard, sctf, 0, 0); -//addRotationMap(S5_Sherman, sctf, 0, 0); -//addRotationMap(S8_Geothermal, sctf, 0, 0); -//addRotationMap(S8_Zilch, sctf, 0, 0); -//addRotationMap(TWL2_Drifts, sctf, 0, 0); -//addRotationMap(TWL2_Drorck, sctf, 0, 0); -//addRotationMap(TWL2_FrozenGlory, sctf, 0, 0); -//addRotationMap(TWL2_IceDagger, sctf, 0, 0); -//addRotationMap(TWL2_MuddySwamp, sctf, 0, 0); -//addRotationMap(TWL2_Norty, sctf, 0, 0); -//addRotationMap(TWL2_RoughLand, sctf, 0, 0); -//addRotationMap(TWL2_Ruined, sctf, 0, 0); -//addRotationMap(TWL_BaNsHee, sctf, 0, 0); -//addRotationMap(TWL_Boss, sctf, 0, 0); -//addRotationMap(TWL_Crossfire, sctf, 0, 0); -//addRotationMap(TWL_NoShelter, sctf, 0, 0); -//addRotationMap(TWL_Clusterfuct, sctf, 0, 0); -//addRotationMap(TWL_Curtilage, sctf, 0, 0); -//addRotationMap(TWL_DeadlyBirdsSong, sctf, 0, 0); -//addRotationMap(TWL_Frostclaw, sctf, 0, 0); -//addRotationMap(TWL_Magamatic, sctf, 0, 0); -//addRotationMap(TWL_Neve, sctf, 0, 0); -//addRotationMap(TWL_Pandemonium, sctf, 0, 0); -//addRotationMap(TWL_Ramparts, sctf, 0, 0); -//addRotationMap(DehSwamp, sctf, 0, 0); -//addRotationMap(HostileLoch, sctf, 0, 0); -//addRotationMap(DevilsElbow, sctf, 0, 0); -//addRotationMap(Camelland, sctf, 0, 0); -//addRotationMap(SmallDesertofDeath, sctf, 0, 0); -//addRotationMap(ShortFall, sctf, 0, 0); -//addRotationMap(Fallout, sctf, 0, 0); -//addRotationMap(SoylentGreen, sctf, 0, 0); -//addRotationMap(Island, sctf, 0, 0); -//addRotationMap(HighOctane, sctf, 0, 0); - - - - -// _____ _ _ _ _ -// | __ \ | | | | | | | | -// | | | | ___ __ _| |_| |__ _ __ ___ __ _| |_ ___| |__ -// | | | |/ _ \/ _` | __| '_ \| '_ ` _ \ / _` | __/ __| '_ \ -// | |__| | __/ (_| | |_| | | | | | | | | (_| | || (__| | | | -// |_____/ \___|\__,_|\__|_| |_|_| |_| |_|\__,_|\__\___|_| |_| -///////////////////////////////////////////////////////////////////// - -addRotationMap(RaspDM, DM, 1, 1); -addRotationMap(EntombedDM, DM, 1, 1); -addRotationMap(IceDomeDM, DM, 1, 1); -addRotationMap(HoofToeDM, DM, 1, 1); -addRotationMap(ArenaDomeDM, DM, 1, 1); -addRotationMap(VulcansWrathDM, DM, 1, 1); -addRotationMap(RampartsDM, DM, 1, 1); -addRotationMap(ShrineDM, DM, 1, 1); -addRotationMap(LiveBaitDM, DM, 1, 1); -addRotationMap(FourSquareDM, DM, 1, 1); -addRotationMap(BrigDM, DM, 1, 1); - - - -// _____ _ -// | __ \ | | -// | | | |_ _ ___| | -// | | | | | | |/ _ \ | -// | |__| | |_| | __/ | -// |_____/ \__,_|\___|_| -///////////////////////////////////////////////////////////////////// - -//addRotationMap(AgentsOfFortune, Duel, 0, 0); -//addRotationMap(Casern_Cavite, Duel, 0, 0); -//addRotationMap(Equinox, Duel, 1, 1); -//addRotationMap(Escalade, Duel, 1, 1); -//addRotationMap(Fracas, Duel, 0, 0); -//addRotationMap(Invictus, Duel, 0, 0); -//addRotationMap(MyrkWood, Duel, 1, 1); -//addRotationMap(Oasis, Duel, 1, 1); -//addRotationMap(Pyroclasm, Duel, 1, 1); -//addRotationMap(Rasp, Duel, 1, 1); -//addRotationMap(SunDried, Duel, 1, 1); -//addRotationMap(Talus, Duel, 0, 0); -//addRotationMap(Underhill, Duel, 0, 0); -//addRotationMap(Whiteout, Duel, 1, 1); -//addRotationMap(Tombstone, Duel, 1, 1); -//addRotationMap(VaubanLak, Duel, 1, 1); -//addRotationMap(DesertofDeathLak, Duel, 1, 1); - - - -// _____ _ -// / ____(_) -// | (___ _ ___ __ _ ___ -// \___ \| |/ _ \/ _` |/ _ \ -// ____) | | __/ (_| | __/ -// |_____/|_|\___|\__, |\___| -// __/ | -// |___/ -///////////////////////////////////////////////////////////////////// - -//addRotationMap(Isleofman, Siege, 1, 1); -//addRotationMap(Trident, Siege, 1, 1); -//addRotationMap(Alcatraz, Siege, 1, 1); \ No newline at end of file diff --git a/Classic/prefs/serverPrefs.cs b/Classic/prefs/serverPrefs.cs index 544b99b..3e8080f 100644 --- a/Classic/prefs/serverPrefs.cs +++ b/Classic/prefs/serverPrefs.cs @@ -1,17 +1,25 @@ -$Host::AdminList = ""; -$Host::AdminPassword = "changeme"; -$Host::AdvStats::Delim = "\c7"; -$Host::AdvStats::LogChat = 0; -$Host::AdvStats::SpamInfoToConsole = 0; -$Host::allowAdminPlayerVotes = 0; +$Host::AdminPassword = "changethis"; +$Host::AllowAdmin2Admin = 0; +$Host::AllowAdminBan = 0; +$Host::AllowAdminPassVote = 1; +$Host::allowAdminPlayerVotes = "0"; +$Host::AllowAdminStopVote = 1; +$Host::AllowAdminStopVotes = 1; +$Host::AllowAdminVotes = 1; $Host::AllowMapScript = "True"; -$Host::AnimateWithTransitions = 0; +$Host::AllowPlayerVoteChangeMission = 1; +$Host::AllowPlayerVoteSkipMission = 1; +$Host::AllowPlayerVoteTimeLimit = 1; +$Host::AllowPlayerVoteTournamentMode = 0; +$Host::AnimateWithTransitions = 1; $Host::AntiCloakEnable = 1; $Host::AntiCloakPlayerCount = 6; +$Host::AveragePings = 1; $Host::BanTime = 1440; -$Host::BotCount = 2; -$Host::BotsEnabled = 0; -$Host::ClassicAdminLogPath = "prefs"; +$Host::BotCount = 14; +$Host::BotsEnabled = "0"; +$Host::ClassicAdminLog = 1; +$Host::ClassicAdminLogPath = "logs/Admin/Admin.log"; $Host::ClassicAllowConsoleAccess = 0; $Host::ClassicAntiTurtleTime = 5; $Host::ClassicAutoPWEnabled = 0; @@ -21,10 +29,11 @@ $Host::ClassicAutoRestartServer = 0; $Host::ClassicBadWordFilter = 0; $Host::ClassicBalancedBots = 0; $Host::ClassicCanKickBots = 0; -$Host::ClassicConnectLog = 0; -$Host::ClassicConnLogPath = "prefs"; +$Host::ClassicConnectLog = 1; +$Host::ClassicConnLogPath = "logs/Connect/Connect.log"; $Host::ClassicCycleMisTypes = 0; $Host::ClassicEchoChat = 0; +$Host::ClassicEvoStats = 1; $Host::ClassicFairTeams = 1; $Host::ClassicLimitArmors = 0; $Host::ClassicLoadBlasterChanges = 0; @@ -39,6 +48,9 @@ $Host::ClassicLoadTR2Gametype = 0; $Host::ClassicLoadVRamChanges = 0; $Host::ClassicLogEchoEnabled = 0; $Host::ClassicMaxTelepads = 3; +$Host::ClassicMOTD = "Discord PUB\nServer Hosted/Provided by Branzone/Ravin\nGet Mappacks at https://playt2.com/"; +$Host::ClassicMOTDLines = 3; +$Host::ClassicMOTDTime = 6; $Host::ClassicNoNullVoiceSpam = 0; $Host::ClassicPacketRateToClient = 32; $Host::ClassicPacketSize = 450; @@ -46,6 +58,9 @@ $Host::ClassicRandomizeTeams = 1; $Host::ClassicRandomMissions = 1; $Host::ClassicRandomMisTypes = 0; $Host::ClassicRestartTime = 12; +$Host::ClassicRotationCustom = 1; +$Host::ClassicRotationFile = "prefs/mapRotation.cs"; +$Host::ClassicStatsType = 2; $Host::ClassicSuperAdminPassword = "changeme"; $Host::ClassicTelnet = 1; $Host::ClassicTelnetListenPass = "changeme"; @@ -55,121 +70,20 @@ $Host::ClassicTkLimit = 0; $Host::ClassicUseHighPerformanceCounter = 0; $Host::CRCTextures = 0; $Host::Dedicated = 1; -$Host::DefenseTurret::Active = 0; -$Host::DefenseTurret::MaxWptHeight = 10; -$Host::DefenseTurret::Optional = 0; -$Host::DefenseTurret::RequiredInTourney = 0; $Host::DMSLOnlyMode = 0; $Host::EmptyServerReset = 1; $Host::EmptyServerResetTime = 120; $Host::EnableAutobalance = 1; -$Host::EnableLakUnlimitedDJ = 1; -$Host::EnableMapRepetitionChecker = 1; $Host::EnableMortarTurret = 0; -$Host::EnableNoBaseRapeNotify = 1; $Host::EnableNetTourneyClient = 0; -$Host::EnableSetNextMission = 1; +$Host::EnableNoBaseRapeNotify = 1; $Host::EnableTeamBalanceNotify = 1; $Host::EnableTurretPlayerCount = 10; $Host::EnableVoteSound = 1; -$Host::EvoAdminAdmin = 0; -$Host::EvoAdminBan = 0; -$Host::EvoAdminClanLock = 0; -$Host::EvoAdminClearServer = 0; -$Host::EvoAdminCRCCheck = 0; -$Host::EvoAdminLogging = 1; -$Host::EvoAdminMaxPlayers = 20; -$Host::EvoAdminMinPlayers = 20; -$Host::EvoAdminPassVote = 0; -$Host::EvoAdminReset = 0; -$Host::EvoAdminServerPW = 0; -$Host::EvoAdminStopVotes = 1; -$Host::EvoAdminSwitchTeams = 1; -$Host::EvoAdminWhois = 0; -$Host::EvoAllowAdminVoteGameType = 1; -$Host::EvoAllowPlayerVoteChangeMission = 1; -$Host::EvoAllowPlayerVoteGameType = 1; -$Host::EvoAllowPlayerVoteTeamDamage = 0; -$Host::EvoAllowPlayerVoteTimeLimit = 1; -$Host::EvoAllowPlayerVoteTournamentMode = 0; -$Host::EvoAutoPWEnabled = 0; -$Host::EvoAutoPWPassword = "pickup"; -$Host::EvoAutoPWPlayerCount = 0; -$Host::EvoAutoPWTourneyNoRemove = 1; -$Host::EvoAveragePings = 1; -$Host::EvoBanListFile = "prefs/evo_BanList.cs"; -$Host::EvoBlockSuperAdminWhois = 0; -$Host::EvoCannedChatLogging = 0; -$Host::EvoCannedSpamAllowed = 1; -$Host::EvoChatConsole = 1; -$Host::EvoChatLogging = 0; -$Host::EvoConnectLogging = 1; -$Host::EvoCustomMapLimitsFile = "prefs/SetMapLimits.cs"; -$Host::EvoCustomMapRotation = 1; -$Host::EvoCustomMapRotationFile = "prefs/evo_mapRotation.cs"; -$Host::EvoDailyHour = "00:00"; -$Host::EvoDailyLogs = 0; -$Host::EvoDebugHTTP = 0; -$Host::EvoDefaultLeaseLevel = 1; -$Host::EvoDefaultsLoaded = 1; -$Host::EvoDefaultTimeLimit = 1; -$Host::EvoFairTeams = 1; -$Host::EvoForcedVotes = 1; -$Host::EvoFullServerPWAddAllowed = 0; -$Host::EvoFullServerPWEnabled = 0; -$Host::EvoFullServerPWPassword = "pickup"; -$Host::EvoGameFixes = 1; -$Host::EvoKickObservers = 1200; -$Host::EvoLeaseInterval = 0; -$Host::EvoLeaseLocation = "prefs/leasedSA.txt"; -$Host::EvoMOTD = "Discord PUB\nServer Hosted/Provided by Branzone/Ravin\nGet Mappacks at https://playt2.tk"; -$Host::EvoMOTDlines = 3; -$Host::EvoMOTDtime = 5; -$Host::EvoMuteSpamFX = 0; -$Host::EvoNoBaseRapeClassicPlayerCount = 14; -$Host::EvoNoBaseRapeEnabled = 1; -$Host::EvoNoBaseRapePlayerCount = 14; -$Host::EvoObserveFlag = 1; -$Host::EvoOneMapOnly = 0; -$Host::EvoPreMatchCannedSpamAllowed = 1; -$Host::EvoPreMatchSpamAllowed = 1; -$Host::EvoRandomMissions = 1; -$Host::EvoRandomTeams = 1; -$Host::EvoRelaxedFairTeams = 0; -$Host::EvoServerRules1 = "\c2if\c4(\c3%client.fun == \c5true \c4&& \c3%client.Llama_Grabs \c4< \c51\c4)"; -$Host::EvoServerRules2 = " \c1Be_Courteous\c4(\c2%client, %game\c4);"; -$Host::EvoServerRules3 = "\c2else if\c4(\c3%client.attitude \c4!$ = \c5%client.fun\c4)"; -$Host::EvoServerRules4 = " \c1Try_2_Have_Fun\c4(\c2%client, %attitude\c4);"; -$Host::EvoShowStats = 1; -$Host::EvoSkipMission = 0; -$Host::EvoSpamAllowed = 1; -$Host::EvoStats = 1; -$Host::EvoStatsPosition = 1; -$Host::EvoStatsTourney = 1; -$Host::EvoStatsType = 2; -$Host::EvoSuperAdminClanLock = 0; -$Host::EvoSuperAdminCRCCheck = 1; -$Host::EvoSuperAdminReset = 1; -$Host::EvoSuperAdminSuper = 1; -$Host::EvoSuperAdminWhois = 1; -$Host::EvoSuperClearServer = 1; -$Host::EvoSuperPassVote = 1; -$Host::EvoTCCannedMessages = 1; -$Host::EvoTCMessages = 1; -$Host::EvoTeamCannedSpam = 1; -$Host::EvoTeamMeMsg = 1; -$Host::EvoTeamSpam = 1; -$Host::EvoTimeLimitList = "90 120 150 180 240 360 480 999"; -$Host::EvoTKLogging = 0; -$Host::EvoTKMax = 12; -$Host::EvoTKVote = 5; -$Host::EvoTKWarn1 = 3; -$Host::EvoTKWarn2 = 6; -$Host::EvoTourneySameMap = 1; -$Host::EvoUseHighPerformanceCounter = 0; $Host::FloodProtectionEnabled = 1; $Host::GameName = "Tribes 2 Test"; -$Host::HiVisibility = "1"; +$Host::GuidCheck = 0; +$Host::HiVisibility = "0"; $Host::holoName1 = "Storm"; $Host::holoName2 = "Inferno"; $Host::holoName3 = "Starwolf"; @@ -178,707 +92,60 @@ $Host::holoName5 = "BloodEagle"; $Host::holoName6 = "Harbinger"; $Host::Info = " "; $Host::KickBanTime = 600; +$Host::KickObserverTimeout = 1200; $Host::LakRabbitDuelMode = 0; -$Host::LakRabbitNoSplashDamage = "1"; +$Host::LakRabbitNoSplashDamage = 1; $Host::LakRabbitPubPro = 0; +$Host::LakRabbitShowFlagIcon = 1; +$Host::LakRabbitShowFlagTask = 0; +$Host::LakRabbitUnlimitedDJ = 1; $Host::LoadingScreenUseDebrief = 1; $Host::LoadScreenColor1 = "05edad"; $Host::LoadScreenColor2 = "29DEE7"; $Host::LoadScreenColor3 = "33CCCC"; $Host::LoadScreenLine1 = "Join Discord:"; -$Host::LoadScreenLine1_Msg = "https://discord.me/tribes2"; +$Host::LoadScreenLine1_Msg = "playt2.com/discord"; $Host::LoadScreenLine2 = "Game Modes:"; -$Host::LoadScreenLine2_Msg = "LakRabbit, Capture the Flag, DeathMatch, (Light Only) Capture the Flag"; -$Host::LoadScreenLine3 = "Required Mappacks:"; -$Host::LoadScreenLine3_Msg = "S5, S8, TWL, TWL2"; +$Host::LoadScreenLine2_Msg = "LakRabbit, Capture the Flag, DeathMatch, (Light Only) Capture the Flag, Siege"; +$Host::LoadScreenLine3 = "Get Mappacks:"; +$Host::LoadScreenLine3_Msg = "playt2.com/mappacks"; $Host::LoadScreenLine4 = "Server Provided by:"; -$Host::LoadScreenLine4_Msg = "Ravin"; +$Host::LoadScreenLine4_Msg = "Ravin and Choco"; $Host::LoadScreenLine5 = "Server Hosted by:"; $Host::LoadScreenLine5_Msg = "Branzone"; $Host::LoadScreenLine6 = "Server Github:"; -$Host::LoadScreenLine6_Msg = "https://github.com/ChocoTaco1/TacoServer"; -$Host::LoadScreenMOTD1 = "Blaster is here to stay!"; -$Host::LoadScreenMOTD2 = "Come play Arena on Wednesday Nights!"; -$Host::LoadScreenMOTD3 = "Lak crowd early evenings after work during the week."; -$Host::LoadScreenMOTD4 = "Big CTF games Fridays, Saturdays, and Sundays!"; +$Host::LoadScreenLine6_Msg = "github.com/ChocoTaco1/TacoServer"; +$Host::LoadScreenMOTD1 = "Lak crowd early evenings after work during the week."; +$Host::LoadScreenMOTD2 = "Big CTF games Fridays, Saturdays, and Sundays!"; +$Host::LoadScreenMOTD3 = "Please make an effort to keep teams balanced!"; +$Host::LoadScreenMOTD4 = " "; +$Host::LogIntentionalQuit = 1; $Host::Map = "VaubanLak"; -$Host::MapCycleAcidRain_CTF = "0"; -$Host::MapCycleArchipelago_CTF = "0"; -$Host::MapCycleArenaDome_CTF = "0"; -$Host::MapCycleArenaDome_sctf = "1"; -$Host::MapCycleArenaDomeDM_DM = "1"; -$Host::MapCycleArrakis_LakRabbit = "0"; -$Host::MapCycleBastardForgeLT_sctf = "1"; -$Host::MapCycleBeggarsRun_CTF = "1"; -$Host::MapCycleBeggarsRunLT_sctf = "0"; -$Host::MapCycleberlard_CTF = "1"; -$Host::MapCycleberlard_sctf = "1"; -$Host::MapCycleBerylBasin_CTF = "1"; -$Host::MapCycleBlastside_nef_CTF = "0"; -$Host::MapCycleBlink_CTF = "1"; -$Host::MapCycleBlink_sctf = "1"; -$Host::MapCycleBoxLak_LakRabbit = "1"; -$Host::MapCycleBulwark_CTF = "1"; -$Host::MapCycleBulwark_sctf = "1"; -$Host::MapCycleCankerLak_LakRabbit = "1"; -$Host::MapCycleChoke_CTF = "0"; -$Host::MapCycleCircleofstones_CTF = "1"; -$Host::MapCycleCirclesEdge_CTF = "1"; -$Host::MapCycleCirclesEdgeLT_sctf = "1"; -$Host::MapCycleConfusco_CTF = "0"; -$Host::MapCycleConstructionYard_CTF = "0"; -$Host::MapCycleCoppersky_CTF = "0"; -$Host::MapCycleCrater71Lak_LakRabbit = "0"; -$Host::MapCycleCrossfiredLak_LakRabbit = "1"; -$Host::MapCycleDangerousCrossing_nef_CTF = "1"; -$Host::MapCycleDangerousCrossingLT_sctf = "1"; -$Host::MapCycleDesertofDeathLak_LakRabbit = "1"; -$Host::MapCycleDire_CTF = "1"; -$Host::MapCycleDireLT_sctf = "1"; -$Host::MapCycleDiscord_CTF = "1"; -$Host::MapCycleDiscord_sctf = "1"; -$Host::MapCycleDisjointed_CTF = "1"; -$Host::MapCycleDustRunLak_LakRabbit = "1"; -$Host::MapCycleEntombedDM_DM = "1"; -$Host::MapCycleEquinoxLak_LakRabbit = "0"; -$Host::MapCycleFallout_CTF = "0"; -$Host::MapCycleFenix_CTF = "0"; -$Host::MapCycleFilteredDust_CTF = "0"; -$Host::MapCycleFirestorm_CTF = "1"; -$Host::MapCycleFirestormLT_sctf = "1"; -$Host::MapCycleFourSquareDM_DM = "1"; -$Host::MapCycleFrozenFuryLak_LakRabbit = "0"; -$Host::MapCycleFullCircle_CTF = "0"; -$Host::MapCycleGlade_CTF = "0"; -$Host::MapCycleGodsRiftLak_LakRabbit = "0"; -$Host::MapCycleHarvestDance_CTF = "1"; -$Host::MapCycleHavenLak_LakRabbit = "1"; -$Host::MapCycleHeadstone_CTF = "1"; -$Host::MapCycleHeadstone_sctf = "0"; -$Host::MapCycleHighAnxiety_CTF = "1"; -$Host::MapCycleHighOctane_CTF = "1"; -$Host::MapCycleHillside_CTF = "0"; -$Host::MapCycleHillTopHop_sctf = "1"; -$Host::MapCycleHoofToeDM_DM = "1"; -$Host::MapCycleHostileLoch_CTF = "1"; -$Host::MapCycleIceDomeDM_DM = "1"; -$Host::MapCycleIceRidge_nef_CTF = "1"; -$Host::MapCycleInfernus_CTF = "0"; -$Host::MapCycleInfernusLak_LakRabbit = "1"; -$Host::MapCycleIsland_CTF = "1"; -$Host::MapCycleJadeValley_CTF = "0"; -$Host::MapCycleJadeValley_sctf = "1"; -$Host::MapCycleks_braistv_CTF = "0"; -$Host::MapCycleLakefront_CTF = "0"; -$Host::MapCycleLandingParty_CTF = "1"; -$Host::MapCycleLiveBaitDM_DM = "1"; -$Host::MapCycleLogans_Run_CTF = "1"; -$Host::MapCycleLushLak_LakRabbit = "1"; -$Host::MapCycleMac_FlagArena_CTF = "1"; -$Host::MapCycleMachineeggs_CTF = "1"; -$Host::MapCycleMiniSunDried_LakRabbit = "1"; -$Host::MapCycleMinotaur_CTF = "1"; -$Host::MapCycleMirage_CTF = "1"; -$Host::MapCycleMirage_sctf = "0"; -$Host::MapCycleMoonDance_CTF = "1"; -$Host::MapCycleNatureMagic_CTF = "0"; -$Host::MapCycleNightdance_CTF = "0"; -$Host::MapCycleoasisintensity_CTF = "1"; -$Host::MapCycleoasisintensity_sctf = "1"; -$Host::MapCyclePantheon_CTF = "0"; -$Host::MapCyclePariah_CTF = "1"; -$Host::MapCyclePhasmaDustLak_LakRabbit = "0"; -$Host::MapCyclePrismatic_CTF = "1"; -$Host::MapCycleRaindance_nef_CTF = "1"; -$Host::MapCycleRaindance_nefLak_LakRabbit = "1"; -$Host::MapCycleRaindanceLT_sctf = "1"; -$Host::MapCycleRamparts_CTF = "0"; -$Host::MapCycleRampartsDM_DM = "1"; -$Host::MapCycleRaspDM_DM = "1"; -$Host::MapCycleRollercoaster_nef_CTF = "1"; -$Host::MapCycleRoundTheMountain_CTF = "1"; -$Host::MapCycleRoundTheMountainLT_sctf = "1"; -$Host::MapCycleS5_Centaur_CTF = "1"; -$Host::MapCycleS5_Damnation_CTF = "1"; -$Host::MapCycleS5_DamnationLT_sctf = "1"; -$Host::MapCycleS5_Drache_CTF = "0"; -$Host::MapCycleS5_HawkingHeat_CTF = "0"; -$Host::MapCycleS5_HawkingHeat_sctf = "0"; -$Host::MapCycleS5_Icedance_CTF = "1"; -$Host::MapCycleS5_Icedance_sctf = "1"; -$Host::MapCycleS5_Massive_CTF = "1"; -$Host::MapCycleS5_MassiveLT_sctf = "1"; -$Host::MapCycleS5_Mimicry_CTF = "1"; -$Host::MapCycleS5_Mimicry_sctf = "0"; -$Host::MapCycleS5_Mordacity_CTF = "1"; -$Host::MapCycleS5_Mordacity_sctf = "1"; -$Host::MapCycleS5_Reynard_CTF = "0"; -$Host::MapCycleS5_Sherman_CTF = "0"; -$Host::MapCycleS5_Silenus_CTF = "0"; -$Host::MapCycleS5_SilenusLT_sctf = "1"; -$Host::MapCycleS5_Woodymyrk_CTF = "1"; -$Host::MapCycleS5_Woodymyrk_sctf = "0"; -$Host::MapCycleS8_Cardiac_CTF = "1"; -$Host::MapCycleS8_Cardiac_sctf = "0"; -$Host::MapCycleS8_Geothermal_CTF = "0"; -$Host::MapCycleS8_GeothermalLak_LakRabbit = "1"; -$Host::MapCycleS8_Opus_CTF = "1"; -$Host::MapCycleS8_Opus_sctf = "0"; -$Host::MapCycleSaddiesHill_LakRabbit = "1"; -$Host::MapCycleSandOcean_CTF = "0"; -$Host::MapCycleSangre_de_Grado_CTF = "0"; -$Host::MapCycleShockRidge_CTF = "0"; -$Host::MapCycleShortFall_CTF = "1"; -$Host::MapCycleShrineDM_DM = "1"; -$Host::MapCycleSignal_CTF = "1"; -$Host::MapCycleSignalLT_sctf = "1"; -$Host::MapCycleSkinnyDipLak_LakRabbit = "1"; -$Host::MapCycleSlapdash_CTF = "0"; -$Host::MapCycleSmallCrossing_CTF = "1"; -$Host::MapCycleSmallCrossingLT_sctf = "1"; -$Host::MapCycleSmallMelee_CTF = "0"; -$Host::MapCycleSmallTimeCTF_CTF = "1"; -$Host::MapCycleSmallTimeLT_sctf = "1"; -$Host::MapCycleSnowcone_CTF = "0"; -$Host::MapCycleSolsDescentLak_LakRabbit = "0"; -$Host::MapCycleSoylentGreen_CTF = "0"; -$Host::MapCycleStarFallLT_sctf = "1"; -$Host::MapCycleStarIce_CTF = "0"; -$Host::MapCycleSubZeroV_CTF = "1"; -$Host::MapCycleSulfide_LakRabbit = "0"; -$Host::MapCycleSundance_LakRabbit = "1"; -$Host::MapCycleSunDriedLak_LakRabbit = "1"; -$Host::MapCycleSuperHappyBouncyFunTime_CTF = "1"; -$Host::MapCycleSurreal_CTF = "0"; -$Host::MapCycleSurro_CTF = "1"; -$Host::MapCycleTenebrousCTF_CTF = "1"; -$Host::MapCycleTenebrousCTF_sctf = "1"; -$Host::MapCycleTheClocktower_CTF = "0"; -$Host::MapCycleTheFray_CTF = "1"; -$Host::MapCycleTheFray_sctf = "1"; -$Host::MapCycleTibbawLak_LakRabbit = "1"; -$Host::MapCycleTitaniaLak_LakRabbit = "1"; -$Host::MapCycleTitanV_CTF = "1"; -$Host::MapCycleTitForTat_CTF = "0"; -$Host::MapCycleTreasureIslandLak_LakRabbit = "0"; -$Host::MapCycleTWL2_Bleed_CTF = "0"; -$Host::MapCycleTWL2_BlueMoon_CTF = "0"; -$Host::MapCycleTWL2_CanyonCrusadeDeluxe_CTF = "1"; -$Host::MapCycleTWL2_CanyonCrusadeDeluxeLT_sctf = "1"; -$Host::MapCycleTWL2_Celerity_CTF = "0"; -$Host::MapCycleTWL2_Celerity_sctf = "0"; -$Host::MapCycleTWL2_Crevice_CTF = "0"; -$Host::MapCycleTWL2_Crevice_sctf = "0"; -$Host::MapCycleTWL2_FrozenGlory_CTF = "1"; -$Host::MapCycleTWL2_FrozenHope_CTF = "0"; -$Host::MapCycleTWL2_FrozenHopeLT_sctf = "1"; -$Host::MapCycleTWL2_Hildebrand_CTF = "1"; -$Host::MapCycleTWL2_HildebrandLT_sctf = "1"; -$Host::MapCycleTWL2_IceDagger_CTF = "0"; -$Host::MapCycleTWL2_JaggedClaw_CTF = "1"; -$Host::MapCycleTWL2_JaggedClawLT_sctf = "1"; -$Host::MapCycleTWL2_Magnum_CTF = "1"; -$Host::MapCycleTWL2_MidnightMayhemDeluxe_CTF = "0"; -$Host::MapCycleTWL2_MidnightMayhemDeluxe_sctf = "0"; -$Host::MapCycleTWL2_MuddySwamp_CTF = "1"; -$Host::MapCycleTWL2_Ocular_CTF = "1"; -$Host::MapCycleTWL2_Ocular_sctf = "0"; -$Host::MapCycleTWL2_RoughLand_CTF = "0"; -$Host::MapCycleTWL2_Ruined_CTF = "0"; -$Host::MapCycleTWL2_Skylight_CTF = "1"; -$Host::MapCycleTWL2_SkylightLT_sctf = "1"; -$Host::MapCycleTWL_BeachBlitz_CTF = "1"; -$Host::MapCycleTWL_BeachBlitzLak_LakRabbit = "1"; -$Host::MapCycleTWL_BeachBlitzLT_sctf = "1"; -$Host::MapCycleTWL_Chokepoint_CTF = "0"; -$Host::MapCycleTWL_Cinereous_CTF = "0"; -$Host::MapCycleTWL_Cinereous_sctf = "0"; -$Host::MapCycleTWL_Crossfire_CTF = "1"; -$Host::MapCycleTWL_Damnation_CTF = "0"; -$Host::MapCycleTWL_Damnation_sctf = "0"; -$Host::MapCycleTWL_DangerousCrossing_CTF = "0"; -$Host::MapCycleTWL_DangerousCrossing_sctf = "0"; -$Host::MapCycleTWL_DeadlyBirdsSong_CTF = "0"; -$Host::MapCycleTWL_Deserted_sctf = "0"; -$Host::MapCycleTWL_Feign_CTF = "1"; -$Host::MapCycleTWL_FeignLT_sctf = "1"; -$Host::MapCycleTWL_Frozen_CTF = "0"; -$Host::MapCycleTWL_Harvester_CTF = "0"; -$Host::MapCycleTWL_Katabatic_CTF = "0"; -$Host::MapCycleTWL_OsIris_CTF = "0"; -$Host::MapCycleTWL_OsIris_sctf = "0"; -$Host::MapCycleTWL_RollercoasterLT_sctf = "1"; -$Host::MapCycleTWL_Snowblind_CTF = "1"; -$Host::MapCycleTWL_Starfallen_CTF = "0"; -$Host::MapCycleTWL_Stonehenge_CTF = "1"; -$Host::MapCycleTWL_StonehengeLT_sctf = "1"; -$Host::MapCycleTWL_SubZero_CTF = "0"; -$Host::MapCycleTWL_Titan_CTF = "0"; -$Host::MapCycleTWL_Titan_sctf = "0"; -$Host::MapCycleTWL_WilderZone_CTF = "1"; -$Host::MapCycleTWL_WilderZoneLT_sctf = "1"; -$Host::MapCycleVauban_CTF = "1"; -$Host::MapCycleVaubanLak_LakRabbit = "1"; -$Host::MapCycleVulcansWrathDM_DM = "1"; -$Host::MapCycleWindyGap_CTF = "1"; -$Host::MapFFAAcidRain_CTF = "1"; -$Host::MapFFAArchipelago_CTF = "1"; -$Host::MapFFAArenaDome_CTF = "1"; -$Host::MapFFAArenaDome_sctf = "1"; -$Host::MapFFAArenaDomeDM_DM = "1"; -$Host::MapFFAArrakis_LakRabbit = "1"; -$Host::MapFFABastardForgeLT_sctf = "1"; -$Host::MapFFABeggarsRun_CTF = "1"; -$Host::MapFFABeggarsRunLT_sctf = "1"; -$Host::MapFFAberlard_CTF = "1"; -$Host::MapFFAberlard_sctf = "1"; -$Host::MapFFABerylBasin_CTF = "1"; -$Host::MapFFABlastside_nef_CTF = "1"; -$Host::MapFFABlink_CTF = "1"; -$Host::MapFFABlink_sctf = "1"; -$Host::MapFFABoxLak_LakRabbit = "1"; -$Host::MapFFABulwark_CTF = "1"; -$Host::MapFFABulwark_sctf = "1"; -$Host::MapFFACankerLak_LakRabbit = "1"; -$Host::MapFFAChoke_CTF = "1"; -$Host::MapFFACircleofstones_CTF = "1"; -$Host::MapFFACirclesEdge_CTF = "1"; -$Host::MapFFACirclesEdgeLT_sctf = "1"; -$Host::MapFFAConfusco_CTF = "1"; -$Host::MapFFAConstructionYard_CTF = "1"; -$Host::MapFFACoppersky_CTF = "1"; -$Host::MapFFACrater71Lak_LakRabbit = "1"; -$Host::MapFFACrossfiredLak_LakRabbit = "1"; -$Host::MapFFADangerousCrossing_nef_CTF = "1"; -$Host::MapFFADangerousCrossingLT_sctf = "1"; -$Host::MapFFADesertofDeathLak_LakRabbit = "1"; -$Host::MapFFADire_CTF = "1"; -$Host::MapFFADireLT_sctf = "1"; -$Host::MapFFADiscord_CTF = "1"; -$Host::MapFFADiscord_sctf = "1"; -$Host::MapFFADisjointed_CTF = "1"; -$Host::MapFFADustRunLak_LakRabbit = "1"; -$Host::MapFFAEntombedDM_DM = "1"; -$Host::MapFFAEquinoxLak_LakRabbit = "1"; -$Host::MapFFAFallout_CTF = "1"; -$Host::MapFFAFenix_CTF = "1"; -$Host::MapFFAFilteredDust_CTF = "1"; -$Host::MapFFAFirestorm_CTF = "1"; -$Host::MapFFAFirestormLT_sctf = "1"; -$Host::MapFFAFourSquareDM_DM = "1"; -$Host::MapFFAFrozenFuryLak_LakRabbit = "1"; -$Host::MapFFAFullCircle_CTF = "1"; -$Host::MapFFAGlade_CTF = "1"; -$Host::MapFFAGodsRiftLak_LakRabbit = "1"; -$Host::MapFFAHarvestDance_CTF = "1"; -$Host::MapFFAHavenLak_LakRabbit = "1"; -$Host::MapFFAHeadstone_CTF = "1"; -$Host::MapFFAHeadstone_sctf = "1"; -$Host::MapFFAHighAnxiety_CTF = "1"; -$Host::MapFFAHighOctane_CTF = "1"; -$Host::MapFFAHillside_CTF = "1"; -$Host::MapFFAHillTopHop_sctf = "1"; -$Host::MapFFAHoofToeDM_DM = "1"; -$Host::MapFFAHostileLoch_CTF = "1"; -$Host::MapFFAIceDomeDM_DM = "1"; -$Host::MapFFAIceRidge_nef_CTF = "1"; -$Host::MapFFAInfernus_CTF = "1"; -$Host::MapFFAInfernusLak_LakRabbit = "1"; -$Host::MapFFAIsland_CTF = "1"; -$Host::MapFFAJadeValley_CTF = "1"; -$Host::MapFFAJadeValley_sctf = "1"; -$Host::MapFFAks_braistv_CTF = "1"; -$Host::MapFFALakefront_CTF = "1"; -$Host::MapFFALandingParty_CTF = "1"; -$Host::MapFFALiveBaitDM_DM = "1"; -$Host::MapFFALogans_Run_CTF = "1"; -$Host::MapFFALushLak_LakRabbit = "1"; -$Host::MapFFAMac_FlagArena_CTF = "1"; -$Host::MapFFAMachineeggs_CTF = "1"; -$Host::MapFFAMiniSunDried_LakRabbit = "1"; -$Host::MapFFAMinotaur_CTF = "1"; -$Host::MapFFAMirage_CTF = "1"; -$Host::MapFFAMirage_sctf = "1"; -$Host::MapFFAMoonDance_CTF = "1"; -$Host::MapFFANatureMagic_CTF = "1"; -$Host::MapFFANightdance_CTF = "1"; -$Host::MapFFAoasisintensity_CTF = "1"; -$Host::MapFFAoasisintensity_sctf = "1"; -$Host::MapFFAPantheon_CTF = "1"; -$Host::MapFFAPariah_CTF = "1"; -$Host::MapFFAPhasmaDustLak_LakRabbit = "1"; -$Host::MapFFAPrismatic_CTF = "1"; -$Host::MapFFARaindance_nef_CTF = "1"; -$Host::MapFFARaindance_nefLak_LakRabbit = "1"; -$Host::MapFFARaindanceLT_sctf = "1"; -$Host::MapFFARamparts_CTF = "1"; -$Host::MapFFARampartsDM_DM = "1"; -$Host::MapFFARaspDM_DM = "1"; -$Host::MapFFARollercoaster_nef_CTF = "1"; -$Host::MapFFARoundTheMountain_CTF = "1"; -$Host::MapFFARoundTheMountainLT_sctf = "1"; -$Host::MapFFAS5_Centaur_CTF = "1"; -$Host::MapFFAS5_Damnation_CTF = "1"; -$Host::MapFFAS5_DamnationLT_sctf = "1"; -$Host::MapFFAS5_Drache_CTF = "1"; -$Host::MapFFAS5_HawkingHeat_CTF = "1"; -$Host::MapFFAS5_HawkingHeat_sctf = "1"; -$Host::MapFFAS5_Icedance_CTF = "1"; -$Host::MapFFAS5_Icedance_sctf = "1"; -$Host::MapFFAS5_Massive_CTF = "1"; -$Host::MapFFAS5_MassiveLT_sctf = "1"; -$Host::MapFFAS5_Mimicry_CTF = "1"; -$Host::MapFFAS5_Mimicry_sctf = "1"; -$Host::MapFFAS5_Mordacity_CTF = "1"; -$Host::MapFFAS5_Mordacity_sctf = "1"; -$Host::MapFFAS5_Reynard_CTF = "1"; -$Host::MapFFAS5_Sherman_CTF = "1"; -$Host::MapFFAS5_Silenus_CTF = "1"; -$Host::MapFFAS5_SilenusLT_sctf = "1"; -$Host::MapFFAS5_Woodymyrk_CTF = "1"; -$Host::MapFFAS5_Woodymyrk_sctf = "1"; -$Host::MapFFAS8_Cardiac_CTF = "1"; -$Host::MapFFAS8_Cardiac_sctf = "1"; -$Host::MapFFAS8_Geothermal_CTF = "1"; -$Host::MapFFAS8_GeothermalLak_LakRabbit = "1"; -$Host::MapFFAS8_Opus_CTF = "1"; -$Host::MapFFAS8_Opus_sctf = "1"; -$Host::MapFFASaddiesHill_LakRabbit = "1"; -$Host::MapFFASandOcean_CTF = "1"; -$Host::MapFFASangre_de_Grado_CTF = "1"; -$Host::MapFFAShockRidge_CTF = "1"; -$Host::MapFFAShortFall_CTF = "1"; -$Host::MapFFAShrineDM_DM = "1"; -$Host::MapFFASignal_CTF = "1"; -$Host::MapFFASignalLT_sctf = "1"; -$Host::MapFFASkinnyDipLak_LakRabbit = "1"; -$Host::MapFFASlapdash_CTF = "1"; -$Host::MapFFASmallCrossing_CTF = "1"; -$Host::MapFFASmallCrossingLT_sctf = "1"; -$Host::MapFFASmallMelee_CTF = "1"; -$Host::MapFFASmallTimeCTF_CTF = "1"; -$Host::MapFFASmallTimeLT_sctf = "1"; -$Host::MapFFASnowcone_CTF = "1"; -$Host::MapFFASolsDescentLak_LakRabbit = "1"; -$Host::MapFFASoylentGreen_CTF = "1"; -$Host::MapFFAStarFallLT_sctf = "1"; -$Host::MapFFAStarIce_CTF = "1"; -$Host::MapFFASubZeroV_CTF = "1"; -$Host::MapFFASulfide_LakRabbit = "1"; -$Host::MapFFASundance_LakRabbit = "1"; -$Host::MapFFASunDriedLak_LakRabbit = "1"; -$Host::MapFFASuperHappyBouncyFunTime_CTF = "1"; -$Host::MapFFASurreal_CTF = "1"; -$Host::MapFFASurro_CTF = "1"; -$Host::MapFFATenebrousCTF_CTF = "1"; -$Host::MapFFATenebrousCTF_sctf = "1"; -$Host::MapFFATheClocktower_CTF = "1"; -$Host::MapFFATheFray_CTF = "1"; -$Host::MapFFATheFray_sctf = "1"; -$Host::MapFFATibbawLak_LakRabbit = "1"; -$Host::MapFFATitaniaLak_LakRabbit = "1"; -$Host::MapFFATitanV_CTF = "1"; -$Host::MapFFATitForTat_CTF = "1"; -$Host::MapFFATreasureIslandLak_LakRabbit = "1"; -$Host::MapFFATWL2_Bleed_CTF = "1"; -$Host::MapFFATWL2_BlueMoon_CTF = "1"; -$Host::MapFFATWL2_CanyonCrusadeDeluxe_CTF = "1"; -$Host::MapFFATWL2_CanyonCrusadeDeluxeLT_sctf = "1"; -$Host::MapFFATWL2_Celerity_CTF = "1"; -$Host::MapFFATWL2_Celerity_sctf = "1"; -$Host::MapFFATWL2_Crevice_CTF = "1"; -$Host::MapFFATWL2_Crevice_sctf = "1"; -$Host::MapFFATWL2_FrozenGlory_CTF = "1"; -$Host::MapFFATWL2_FrozenHope_CTF = "1"; -$Host::MapFFATWL2_FrozenHopeLT_sctf = "1"; -$Host::MapFFATWL2_Hildebrand_CTF = "1"; -$Host::MapFFATWL2_HildebrandLT_sctf = "1"; -$Host::MapFFATWL2_IceDagger_CTF = "1"; -$Host::MapFFATWL2_JaggedClaw_CTF = "1"; -$Host::MapFFATWL2_JaggedClawLT_sctf = "1"; -$Host::MapFFATWL2_Magnum_CTF = "1"; -$Host::MapFFATWL2_MidnightMayhemDeluxe_CTF = "1"; -$Host::MapFFATWL2_MidnightMayhemDeluxe_sctf = "1"; -$Host::MapFFATWL2_MuddySwamp_CTF = "1"; -$Host::MapFFATWL2_Ocular_CTF = "1"; -$Host::MapFFATWL2_Ocular_sctf = "1"; -$Host::MapFFATWL2_RoughLand_CTF = "1"; -$Host::MapFFATWL2_Ruined_CTF = "1"; -$Host::MapFFATWL2_Skylight_CTF = "1"; -$Host::MapFFATWL2_SkylightLT_sctf = "1"; -$Host::MapFFATWL_BeachBlitz_CTF = "1"; -$Host::MapFFATWL_BeachBlitzLak_LakRabbit = "1"; -$Host::MapFFATWL_BeachBlitzLT_sctf = "1"; -$Host::MapFFATWL_Chokepoint_CTF = "1"; -$Host::MapFFATWL_Cinereous_CTF = "1"; -$Host::MapFFATWL_Cinereous_sctf = "1"; -$Host::MapFFATWL_Crossfire_CTF = "1"; -$Host::MapFFATWL_Damnation_CTF = "1"; -$Host::MapFFATWL_Damnation_sctf = "1"; -$Host::MapFFATWL_DangerousCrossing_CTF = "1"; -$Host::MapFFATWL_DangerousCrossing_sctf = "1"; -$Host::MapFFATWL_DeadlyBirdsSong_CTF = "1"; -$Host::MapFFATWL_Deserted_sctf = "1"; -$Host::MapFFATWL_Feign_CTF = "1"; -$Host::MapFFATWL_FeignLT_sctf = "1"; -$Host::MapFFATWL_Frozen_CTF = "1"; -$Host::MapFFATWL_Harvester_CTF = "1"; -$Host::MapFFATWL_Katabatic_CTF = "1"; -$Host::MapFFATWL_OsIris_CTF = "1"; -$Host::MapFFATWL_OsIris_sctf = "1"; -$Host::MapFFATWL_RollercoasterLT_sctf = "1"; -$Host::MapFFATWL_Snowblind_CTF = "1"; -$Host::MapFFATWL_Starfallen_CTF = "1"; -$Host::MapFFATWL_Stonehenge_CTF = "1"; -$Host::MapFFATWL_StonehengeLT_sctf = "1"; -$Host::MapFFATWL_SubZero_CTF = "1"; -$Host::MapFFATWL_Titan_CTF = "1"; -$Host::MapFFATWL_Titan_sctf = "1"; -$Host::MapFFATWL_WilderZone_CTF = "1"; -$Host::MapFFATWL_WilderZoneLT_sctf = "1"; -$Host::MapFFAVauban_CTF = "1"; -$Host::MapFFAVaubanLak_LakRabbit = "1"; -$Host::MapFFAVulcansWrathDM_DM = "1"; -$Host::MapFFAWindyGap_CTF = "1"; -$Host::MapPlayerLimitsAcidRain_CTF = "12 32"; -$Host::MapPlayerLimitsArchipelago_CTF = "14 32"; -$Host::MapPlayerLimitsArenaDome_CTF = "-1 10"; -$Host::MapPlayerLimitsArenaDome_sctf = "-1 32"; -$Host::MapPlayerLimitsArenaDomeDM_DM = "-1 32"; -$Host::MapPlayerLimitsArrakis_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsBastardForgeLT_sctf = "-1 32"; -$Host::MapPlayerLimitsBeggarsRun_CTF = "8 32"; -$Host::MapPlayerLimitsBeggarsRunLT_sctf = "-1 32"; -$Host::MapPlayerLimitsberlard_CTF = "8 32"; -$Host::MapPlayerLimitsberlard_sctf = "-1 32"; -$Host::MapPlayerLimitsBerylBasin_CTF = "14 32"; -$Host::MapPlayerLimitsBlastside_nef_CTF = "10 32"; -$Host::MapPlayerLimitsBlink_CTF = "8 32"; -$Host::MapPlayerLimitsBlink_sctf = "-1 32"; -$Host::MapPlayerLimitsBoxLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsBulwark_CTF = "8 32"; -$Host::MapPlayerLimitsBulwark_sctf = "-1 32"; -$Host::MapPlayerLimitsCankerLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsChoke_CTF = "12 32"; -$Host::MapPlayerLimitsCircleofstones_CTF = "14 32"; -$Host::MapPlayerLimitsCirclesEdge_CTF = "8 32"; -$Host::MapPlayerLimitsCirclesEdgeLT_sctf = "-1 32"; -$Host::MapPlayerLimitsConfusco_CTF = "10 32"; -$Host::MapPlayerLimitsConstructionYard_CTF = "12 32"; -$Host::MapPlayerLimitsCoppersky_CTF = "10 32"; -$Host::MapPlayerLimitsCrater71Lak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsCrossfiredLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsDangerousCrossing_nef_CTF = "8 32"; -$Host::MapPlayerLimitsDangerousCrossingLT_sctf = "-1 32"; -$Host::MapPlayerLimitsDesertofDeathLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsDire_CTF = "8 32"; -$Host::MapPlayerLimitsDireLT_sctf = "-1 32"; -$Host::MapPlayerLimitsDiscord_CTF = "8 32"; -$Host::MapPlayerLimitsDiscord_sctf = "-1 32"; -$Host::MapPlayerLimitsDisjointed_CTF = "8 32"; -$Host::MapPlayerLimitsDustRunLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsEntombedDM_DM = "-1 32"; -$Host::MapPlayerLimitsEquinoxLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsFallout_CTF = "10 32"; -$Host::MapPlayerLimitsFenix_CTF = "14 32"; -$Host::MapPlayerLimitsFilteredDust_CTF = "12 32"; -$Host::MapPlayerLimitsFirestorm_CTF = "-1 18"; -$Host::MapPlayerLimitsFirestormLT_sctf = "-1 32"; -$Host::MapPlayerLimitsFourSquareDM_DM = "-1 32"; -$Host::MapPlayerLimitsFrozenFuryLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsFullCircle_CTF = "12 32"; -$Host::MapPlayerLimitsGlade_CTF = "12 32"; -$Host::MapPlayerLimitsGodsRiftLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsHarvestDance_CTF = "12 32"; -$Host::MapPlayerLimitsHavenLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsHeadstone_CTF = "8 32"; -$Host::MapPlayerLimitsHeadstone_sctf = "-1 32"; -$Host::MapPlayerLimitsHighAnxiety_CTF = "8 32"; -$Host::MapPlayerLimitsHighOctane_CTF = "8 32"; -$Host::MapPlayerLimitsHillside_CTF = "14 32"; -$Host::MapPlayerLimitsHillTopHop_sctf = "-1 32"; -$Host::MapPlayerLimitsHoofToeDM_DM = "-1 32"; -$Host::MapPlayerLimitsHostileLoch_CTF = "12 32"; -$Host::MapPlayerLimitsIceDomeDM_DM = "-1 32"; -$Host::MapPlayerLimitsIceRidge_nef_CTF = "8 32"; -$Host::MapPlayerLimitsInfernus_CTF = "10 32"; -$Host::MapPlayerLimitsInfernusLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsIsland_CTF = "-1 18"; -$Host::MapPlayerLimitsJadeValley_CTF = "10 32"; -$Host::MapPlayerLimitsJadeValley_sctf = "-1 32"; -$Host::MapPlayerLimitsks_braistv_CTF = "12 32"; -$Host::MapPlayerLimitsLakefront_CTF = "12 32"; -$Host::MapPlayerLimitsLandingParty_CTF = "12 32"; -$Host::MapPlayerLimitsLiveBaitDM_DM = "-1 32"; -$Host::MapPlayerLimitsLogans_Run_CTF = "12 32"; -$Host::MapPlayerLimitsLushLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsMac_FlagArena_CTF = "-1 12"; -$Host::MapPlayerLimitsMachineeggs_CTF = "-1 10"; -$Host::MapPlayerLimitsMiniSunDried_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsMinotaur_CTF = "-1 18"; -$Host::MapPlayerLimitsMirage_CTF = "8 32"; -$Host::MapPlayerLimitsMirage_sctf = "-1 32"; -$Host::MapPlayerLimitsMoonDance_CTF = "12 32"; -$Host::MapPlayerLimitsNatureMagic_CTF = "10 32"; -$Host::MapPlayerLimitsNightdance_CTF = "10 32"; -$Host::MapPlayerLimitsoasisintensity_CTF = "-1 12"; -$Host::MapPlayerLimitsoasisintensity_sctf = "-1 32"; -$Host::MapPlayerLimitsPantheon_CTF = "14 32"; -$Host::MapPlayerLimitsPariah_CTF = "8 32"; -$Host::MapPlayerLimitsPhasmaDustLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsPrismatic_CTF = "8 32"; -$Host::MapPlayerLimitsRaindance_nef_CTF = "12 32"; -$Host::MapPlayerLimitsRaindance_nefLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsRaindanceLT_sctf = "-1 32"; -$Host::MapPlayerLimitsRamparts_CTF = "10 32"; -$Host::MapPlayerLimitsRampartsDM_DM = "-1 32"; -$Host::MapPlayerLimitsRaspDM_DM = "-1 32"; -$Host::MapPlayerLimitsRollercoaster_nef_CTF = "12 32"; -$Host::MapPlayerLimitsRoundTheMountain_CTF = "-1 18"; -$Host::MapPlayerLimitsRoundTheMountainLT_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Centaur_CTF = "8 32"; -$Host::MapPlayerLimitsS5_Damnation_CTF = "8 32"; -$Host::MapPlayerLimitsS5_DamnationLT_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Drache_CTF = "10 32"; -$Host::MapPlayerLimitsS5_HawkingHeat_CTF = "10 32"; -$Host::MapPlayerLimitsS5_HawkingHeat_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Icedance_CTF = "8 32"; -$Host::MapPlayerLimitsS5_Icedance_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Massive_CTF = "8 32"; -$Host::MapPlayerLimitsS5_MassiveLT_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Mimicry_CTF = "8 32"; -$Host::MapPlayerLimitsS5_Mimicry_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Mordacity_CTF = "8 32"; -$Host::MapPlayerLimitsS5_Mordacity_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Reynard_CTF = "10 32"; -$Host::MapPlayerLimitsS5_Sherman_CTF = "10 32"; -$Host::MapPlayerLimitsS5_Silenus_CTF = "10 32"; -$Host::MapPlayerLimitsS5_SilenusLT_sctf = "-1 32"; -$Host::MapPlayerLimitsS5_Woodymyrk_CTF = "8 32"; -$Host::MapPlayerLimitsS5_Woodymyrk_sctf = "-1 32"; -$Host::MapPlayerLimitsS8_Cardiac_CTF = "8 32"; -$Host::MapPlayerLimitsS8_Cardiac_sctf = "-1 32"; -$Host::MapPlayerLimitsS8_Geothermal_CTF = "12 32"; -$Host::MapPlayerLimitsS8_GeothermalLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsS8_Opus_CTF = "8 32"; -$Host::MapPlayerLimitsS8_Opus_sctf = "-1 32"; -$Host::MapPlayerLimitsSaddiesHill_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsSandOcean_CTF = "12 32"; -$Host::MapPlayerLimitsSangre_de_Grado_CTF = "14 32"; -$Host::MapPlayerLimitsShockRidge_CTF = "12 32"; -$Host::MapPlayerLimitsShortFall_CTF = "8 32"; -$Host::MapPlayerLimitsShrineDM_DM = "-1 32"; -$Host::MapPlayerLimitsSignal_CTF = "8 32"; -$Host::MapPlayerLimitsSignalLT_sctf = "-1 32"; -$Host::MapPlayerLimitsSkinnyDipLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsSlapdash_CTF = "14 32"; -$Host::MapPlayerLimitsSmallCrossing_CTF = "-1 18"; -$Host::MapPlayerLimitsSmallCrossingLT_sctf = "-1 32"; -$Host::MapPlayerLimitsSmallMelee_CTF = "-1 12"; -$Host::MapPlayerLimitsSmallTimeCTF_CTF = "-1 18"; -$Host::MapPlayerLimitsSmallTimeLT_sctf = "-1 32"; -$Host::MapPlayerLimitsSnowcone_CTF = "10 32"; -$Host::MapPlayerLimitsSolsDescentLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsSoylentGreen_CTF = "10 32"; -$Host::MapPlayerLimitsStarFallLT_sctf = "-1 32"; -$Host::MapPlayerLimitsStarIce_CTF = "12 32"; -$Host::MapPlayerLimitsSubZeroV_CTF = "12 32"; -$Host::MapPlayerLimitsSulfide_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsSundance_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsSunDriedLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsSuperHappyBouncyFunTime_CTF = "-1 10"; -$Host::MapPlayerLimitsSurreal_CTF = "10 32"; -$Host::MapPlayerLimitsSurro_CTF = "12 32"; -$Host::MapPlayerLimitsTenebrousCTF_CTF = "8 32"; -$Host::MapPlayerLimitsTenebrousCTF_sctf = "-1 32"; -$Host::MapPlayerLimitsTheClocktower_CTF = "10 32"; -$Host::MapPlayerLimitsTheFray_CTF = "8 32"; -$Host::MapPlayerLimitsTheFray_sctf = "-1 32"; -$Host::MapPlayerLimitsTibbawLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsTitaniaLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsTitanV_CTF = "12 32"; -$Host::MapPlayerLimitsTitForTat_CTF = "-1 18"; -$Host::MapPlayerLimitsTreasureIslandLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsTWL2_Bleed_CTF = "14 32"; -$Host::MapPlayerLimitsTWL2_BlueMoon_CTF = "12 32"; -$Host::MapPlayerLimitsTWL2_CanyonCrusadeDeluxe_CTF = "-1 18"; -$Host::MapPlayerLimitsTWL2_CanyonCrusadeDeluxeLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_Celerity_CTF = "10 32"; -$Host::MapPlayerLimitsTWL2_Celerity_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_Crevice_CTF = "10 32"; -$Host::MapPlayerLimitsTWL2_Crevice_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_FrozenGlory_CTF = "12 32"; -$Host::MapPlayerLimitsTWL2_FrozenHope_CTF = "10 32"; -$Host::MapPlayerLimitsTWL2_FrozenHopeLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_Hildebrand_CTF = "-1 18"; -$Host::MapPlayerLimitsTWL2_HildebrandLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_IceDagger_CTF = "10 32"; -$Host::MapPlayerLimitsTWL2_JaggedClaw_CTF = "8 32"; -$Host::MapPlayerLimitsTWL2_JaggedClawLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_Magnum_CTF = "12 32"; -$Host::MapPlayerLimitsTWL2_MidnightMayhemDeluxe_CTF = "10 32"; -$Host::MapPlayerLimitsTWL2_MidnightMayhemDeluxe_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_MuddySwamp_CTF = "8 32"; -$Host::MapPlayerLimitsTWL2_Ocular_CTF = "8 32"; -$Host::MapPlayerLimitsTWL2_Ocular_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL2_RoughLand_CTF = "12 32"; -$Host::MapPlayerLimitsTWL2_Ruined_CTF = "12 32"; -$Host::MapPlayerLimitsTWL2_Skylight_CTF = "8 32"; -$Host::MapPlayerLimitsTWL2_SkylightLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_BeachBlitz_CTF = "12 32"; -$Host::MapPlayerLimitsTWL_BeachBlitzLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsTWL_BeachBlitzLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_Chokepoint_CTF = "12 32"; -$Host::MapPlayerLimitsTWL_Cinereous_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_Cinereous_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_Crossfire_CTF = "12 32"; -$Host::MapPlayerLimitsTWL_Damnation_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_Damnation_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_DangerousCrossing_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_DangerousCrossing_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_DeadlyBirdsSong_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_Deserted_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_Feign_CTF = "8 32"; -$Host::MapPlayerLimitsTWL_FeignLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_Frozen_CTF = "14 32"; -$Host::MapPlayerLimitsTWL_Harvester_CTF = "14 32"; -$Host::MapPlayerLimitsTWL_Katabatic_CTF = "12 32"; -$Host::MapPlayerLimitsTWL_Magamatic_CTF = "12 32"; -$Host::MapPlayerLimitsTWL_OsIris_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_OsIris_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_RollercoasterLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_Snowblind_CTF = "8 32"; -$Host::MapPlayerLimitsTWL_Starfallen_CTF = "12 32"; -$Host::MapPlayerLimitsTWL_Stonehenge_CTF = "8 32"; -$Host::MapPlayerLimitsTWL_StonehengeLT_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_SubZero_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_Titan_CTF = "10 32"; -$Host::MapPlayerLimitsTWL_Titan_sctf = "-1 32"; -$Host::MapPlayerLimitsTWL_WilderZone_CTF = "8 32"; -$Host::MapPlayerLimitsTWL_WilderZoneLT_sctf = "-1 32"; -$Host::MapPlayerLimitsVauban_CTF = "12 32"; -$Host::MapPlayerLimitsVaubanLak_LakRabbit = "-1 32"; -$Host::MapPlayerLimitsVulcansWrathDM_DM = "-1 32"; -$Host::MapPlayerLimitsWindyGap_CTF = "12 32"; $Host::MarkDnDObjectives = 1; -$Host::MaxBotDifficulty = 0.75; +$Host::MaxBotDifficulty = 0; $Host::MaxMessageLen = 120; -$Host::MaxPlayers = 24; -$Host::MinBotDifficulty = 0.5; +$Host::MaxPlayers = 30; +$Host::MinBotDifficulty = 0; +$Host::MinFlagRecordPlayerCount = 6; $Host::MissionType = "LakRabbit"; +$Host::NoBaseRapeEnabled = 1; +$Host::NoBaseRapePlayerCount = 14; $Host::NoSmurfs = 0; -$Host::Password = "pickup"; $Host::PlayerRespawnTimeout = 60; -$Host::Port = 28000; +$Host::Port = "28000"; $Host::PUGautoPassword = 0; $Host::PUGPassword = "pickup"; $Host::PUGpasswordAlwaysOn = 0; $Host::PureServer = 0; $Host::SCtFProMode = 0; +$Host::ServerRules1 = "\c2if\c4(\c3%client.fun == \c5true \c4&& \c3%client.Llama_Grabs \c4< \c51\c4)"; +$Host::ServerRules2 = " \c1Be_Courteous\c4(\c2%client, %game\c4);"; +$Host::ServerRules3 = "\c2else if\c4(\c3%client.attitude \c4!$ = \c5%client.fun\c4)"; +$Host::ServerRules4 = " \c1Try_2_Have_Fun\c4(\c2%client, %attitude\c4);"; $Host::ShowEndingPlayerScores = 1; $Host::ShowIngamePlayerScores = 1; $Host::Siege::Halftime = 20000; -$Host::TeamDamageOn = 1; +$Host::TeamDamageOn = "1"; $Host::TeamName0 = "Unassigned"; $Host::TeamName1 = "Storm"; $Host::TeamName2 = "Inferno"; @@ -900,5 +167,5 @@ $Host::TournamentMode = 0; $Host::useCustomSkins = 1; $Host::VotePassPercent = 60; $Host::VoteSpread = 20; -$Host::VoteTime = 45; -$Host::warmupTime = 15; +$Host::VoteTime = "45"; +$Host::warmupTime = "15"; diff --git a/Classic/scripts/CTFGame.cs b/Classic/scripts/CTFGame.cs index 69c68f6..552986c 100644 --- a/Classic/scripts/CTFGame.cs +++ b/Classic/scripts/CTFGame.cs @@ -448,6 +448,23 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag) %client = %player.client; %player.holdingFlag = %flag; //%player has this flag %flag.carrier = %player; //this %flag is carried by %player + + // attach the camera to the flag.carrier + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + if(%cl.team <= 0 && %cl.observingFlag && %cl.flagObsTeam == %flag.team) + observeFlag(%cl, %player.client, 2, %flag.team); + } + %player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%flag.team)); + %game.playerGotFlagTarget(%player); + + //only cancel the return timer if the player is in bounds... + if(!%client.outOfBounds) + { + cancel($FlagReturnTimer[%flag]); + $FlagReturnTimer[%flag] = ""; + } %player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%flag.team)); @@ -473,7 +490,32 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag) if (%startStalemate) %game.stalemateSchedule = %game.schedule(%game.stalemateTimeMS, beginStalemate); + + if($Host::ClassicEvoStats && !$Host::TournamentMode) + { + $stats::grabs[%client]++; + if($stats::grabs[%client] > $stats::grabs_counter) + { + $stats::grabs_counter = $stats::grabs[%client]; + $stats::grabs_client = getTaggedString(%client.name); + } + } + + if($Host::ClassicEvoStats) + %game.totalFlagHeldTime[%flag] = getSimTime(); } + + if($Host::ClassicEvoStats && !%player.flagStatsWait && !$Host::TournamentMode) + { + %grabspeed = mFloor(VectorLen(setWord(%player.getVelocity(), 2, 0)) * 3.6); + + if(%grabspeed > $stats::MaxGrabSpeed || ($stats::MaxGrabSpeed $= "")) + { + $stats::MaxGrabSpeed = %grabspeed; + $stats::Grabber = getTaggedString(%client.name); + } + } + %flag.hide(true); %flag.startFade(0, 0, false); %flag.isHome = false; @@ -486,7 +528,7 @@ function CTFGame::playerTouchEnemyFlag(%game, %player, %flag) messageTeam(%flag.team, 'MsgCTFFlagTaken', '\c2Your flag has been taken by %1!~wfx/misc/flag_taken.wav',%client.name, 0, %flag.team, %client.nameBase); messageTeam(0, 'MsgCTFFlagTaken', '\c2%1 took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase); messageClient(%client, 'MsgCTFFlagTaken', '\c2You took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase); - logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") took team "@%flag.team@" flag"); + logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") took team "@%flag.team@" flag ("@%grabspeed@")"); // MP: 6/15/2011 added grabspeed. //call the AI function %game.AIplayerTouchEnemyFlag(%player, %flag); @@ -531,13 +573,23 @@ function CTFGame::playerDroppedFlag(%game, %player) %held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag? %game.playerLostFlagTarget(%player); + + if($Host::ClassicEvoStats) + %game.totalFlagHeldTime[%flag] = 0; %player.holdingFlag = ""; //player isn't holding a flag anymore %flag.carrier = ""; //flag isn't held anymore $flagStatus[%flag.team] = ""; + // attach the camera again to the flag + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + if(%cl.team <= 0 && %cl.observingFlag && %cl.flagObsTeam == %flag.team) + observeFlag(%cl, $TeamFlag[%flag.team], 1, %flag.team); + } %player.unMountImage($FlagSlot); - %flag.hide(false); //Does the throwItem function handle this? + %flag.hide(false); //Does the throwItem function handle this? %teamName = %game.getTeamName(%flag.team); messageTeamExcept(%client, 'MsgCTFFlagDropped', '\c2Teammate %1 dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held @@ -563,8 +615,74 @@ function CTFGame::flagCap(%game, %player) %flag.carrier = ""; %held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag? - + %game.playerLostFlagTarget(%player); + + if($Host::ClassicEvoStats) + { + %held2 = getSimTime() - %game.totalFlagHeldTime[%flag]; + %realtime = %game.formatTime(%held2, true); + %record = false; + if(%game.totalFlagHeldTime[%flag]) + { + if(%client.team == 1) + { + if((%held2 < $flagstats::heldTeam1) || $flagstats::heldTeam1 == 0) + { + if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + { + $flagstats::heldTeam1 = %held2; + $flagstats::realTeam1 = %realTime; + $flagstats::nickTeam1 = %client.nameBase; + } + %record = true; + } + } + else if(%client.team == 2) + { + if((%held2 < $flagstats::heldTeam2) || $flagstats::heldTeam2 == 0) + { + if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + { + $flagstats::heldTeam2 = %held2; + $flagstats::realTeam2 = %realTime; + $flagstats::nickTeam2 = %client.nameBase; + } + %record = true; + } + } + + if(%record == true) + { + if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + { + %fileOut = "stats/maps/classic/" @ $CurrentMissionType @ "/" @ $CurrentMission @ ".txt"; + export("$flagstats::*", %fileOut, false); + schedule(4000, 0, "messageAll", 'MsgCTFNewRecord', "\c2It's a new record! Time: \c3"@%realtime@"\c2.~wfx/misc/hunters_horde.wav"); + } + else + schedule(4000, 0, "messageClient", %client, '', "\c2Minimum of" SPC $Host::MinFlagRecordPlayerCount SPC "Players to set a new flag record."); + } + } + + if(!$Host::TournamentMode) + bottomprint(%client, "You captured the flag in " @ %realTime @ " seconds", 3); + + $stats::caps[%client]++; + if($stats::caps[%client] > $stats::caps_counter) + { + $stats::caps_counter = $stats::caps[%client]; + $stats::caps_client = getTaggedString(%client.name); + } + + if(%held2 < $stats::fastestCap || !$stats::fastestCap) + { + $stats::fastestCap = %held2; + $stats::fastcap_time = %realTime; + $stats::fastcap_client = getTaggedString(%client.name); + } + } + //award points to player and team %teamName = %game.getTeamName(%flag.team); messageTeamExcept(%client, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); @@ -572,7 +690,7 @@ function CTFGame::flagCap(%game, %player) messageTeam(0, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); messageClient(%client, 'MsgCTFFlagCapped', '\c2You captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); // Yogi, 8/18/02. 3rd param changed 0 -> %client.name - logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") capped team "@%client.team@" flag"@" (Held: "@%held@")"); + logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") capped team "@%client.team@" flag"@" (Held: "@%held@")"); // MP: 6/14/2011 The team is wrong, but the stats program auto-corrects it, so just leave as is %player.holdingFlag = ""; //no longer holding it. %player.unMountImage($FlagSlot); %game.awardScoreFlagCap(%client, %flag); @@ -581,21 +699,42 @@ function CTFGame::flagCap(%game, %player) //call the AI function %game.AIflagCap(%player, %flag); - //if this cap didn't end the game, play the announcer... - if ($missionRunning) + //Determine score status + %caplimit = MissionGroup.CTF_scoreLimit; + %otherteam = ( %client.team == 1 ) ? 2 : 1; + //Find out caps from score + %clientteamcaps = mFloor($TeamScore[%client.team] / %game.SCORE_PER_TEAM_FLAG_CAP); + %otherteamcaps = mFloor($TeamScore[%otherteam] / %game.SCORE_PER_TEAM_FLAG_CAP); + + //Determine Gamepoint + if(%clientteamcaps >= (%caplimit - 1)) { - if (%game.getTeamName(%client.team) $= 'Inferno') - messageAll("", '~wvoice/announcer/ann.infscores.wav'); - else if (%game.getTeamName(%client.team) $= 'Storm') - messageAll("", '~wvoice/announcer/ann.stoscores.wav'); - else if (%game.getTeamName(%client.team) $= 'Phoenix') - messageAll("", '~wvoice/announcer/ann.pxscore.wav'); - else if (%game.getTeamName(%client.team) $= 'Blood Eagle') - messageAll("", '~wvoice/announcer/ann.bescore.wav'); - else if (%game.getTeamName(%client.team) $= 'Diamond Sword') - messageAll("", '~wvoice/announcer/ann.dsscore.wav'); - else if (%game.getTeamName(%client.team) $= 'Starwolf') - messageAll("", '~wvoice/announcer/ann.swscore.wav'); + if(%clientteamcaps == %otherteamcaps) + %scorestatus = "tied"; + else + %scorestatus = "gamepoint"; + } + else + %scorestatus = "normal"; + + //if this cap didn't end the game, play the announcer... + if($missionRunning) + { + switch$(%scorestatus) + { + case normal: + //classic uses only storm/inferno + if(%game.getTeamName(%client.team) $= 'Inferno') + messageAll("", '~wvoice/announcer/ann.infscores.wav'); + else if(%game.getTeamName(%client.team) $= 'Storm') + messageAll("", '~wvoice/announcer/ann.stoscores.wav'); + case tied: + //Announce tied message + messageAll("", '~wvoice/announcer/ann.closegame_03.wav'); + case gamepoint: + //Announce gamepoint + messageAll("", '~wvoice/announcer/ann.gamepoint_imminent.wav'); + } } } @@ -619,6 +758,23 @@ function CTFGame::flagReturn(%game, %flag, %player) else %otherTeam = 1; %teamName = %game.getTeamName(%flag.team); + + // when the flag return, stop observing the flag, and go in observerFly mode + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + if(%cl.team <= 0 && %cl.observingFlag && %cl.flagObsTeam == %flag.team) + { + %cl.camera.mode = "observerFly"; + %cl.camera.setFlyMode(); + updateObserverFlyHud(%cl); + + %cl.observingFlag = false; + %cl.flagObserved = ""; + %cl.flagObsTeam = ""; + } + } + if (%player !$= "") { //a player returned it @@ -710,8 +866,9 @@ function CTFGame::beginStalemate(%game) // z0dd - ZOD, 5/27/03. Added anti-turtling, return flags after x minutes if(!$Host::TournamentMode) { - messageAll( 'MsgStalemate', '\c3Anti turtle initialized. Flags will be returned to bases in %1 minutes.', $Host::ClassicAntiTurtleTime); - %game.turtleSchedule = %game.schedule($Host::ClassicAntiTurtleTime * 60000, 'antiTurtle'); + messageAll( 'MsgStalemate', "\c3Anti turtle initialized. Flags will be returned to bases in " @ $Host::ClassicAntiTurtleTime @ " minutes."); + %game.turtleSchedule = %game.schedule($Host::ClassicAntiTurtleTime * 60000, "antiTurtle"); + error(formatTimeString("HH:nn:ss") SPC "Anti-Turtle thread beginning now - ID:" SPC %game.turtleSchedule); } } @@ -720,19 +877,28 @@ function CTFGame::endStalemate(%game) %game.stalemate = false; %game.hideStalemateTargets(); cancel(%game.stalemateSchedule); + cancel(%game.turtleSchedule); } -// z0dd - ZOD, 5/27/03. Anti-turtle function function CTFGame::antiTurtle(%game) { if(isEventPending(%game.turtleSchedule)) - cancel(%game.turtleSchedule); + cancel(%game.turtleSchedule); - for (%i = 1; %i <= 2; %i++) - { + if(%game.turtleSchedule > 0) + %game.turtleSchedule = 0; + + if(isEventPending(%game.stalemateSchedule)) + cancel(%game.stalemateSchedule); + + if(%game.stalemateSchedule > 0) + %game.stalemateSchedule = 0; + + for (%i = 1; %i <= Game.numTeams; %i++) Game.flagReturn($TeamFlag[%i]); - messageAll( 'MsgCTFFlagReturned', '\c3Both flags returned to bases to break stalemate.~wfx/misc/flag_return.wav', 0, 0, %i); - } + + messageAll( "", "\c3Both flags returned to bases to break stalemate.~wfx/misc/flag_return.wav"); + error(formatTimeString("HH:nn:ss") SPC "Anti-Turtle thread ended"); } function CTFGame::flagReset(%game, %flag) @@ -740,7 +906,7 @@ function CTFGame::flagReset(%game, %flag) cancel(%game.updateFlagThread[%flag]); // z0dd - ZOD, 8/4/02. Cancel this flag's thread to KineticPoet's flag updater //any time a flag is reset, kill the stalemate schedule - %game.endStalemate(); + %game.endStalemate(%game); //make sure if there's a player carrying it (probably one out of bounds...), it is stripped first if (isObject(%flag.carrier)) @@ -1623,6 +1789,9 @@ function CTFGame::boundaryLoseFlag(%game, %player) %flag.setCollisionTimeout(%player); %held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag? + + if($Host::ClassicEvoStats) + %game.totalFlagHeldTime[%flag] = 0; %game.playerDroppedFlag(%player); diff --git a/Classic/scripts/GameGui.cs b/Classic/scripts/GameGui.cs new file mode 100644 index 0000000..bb7daf0 --- /dev/null +++ b/Classic/scripts/GameGui.cs @@ -0,0 +1,2181 @@ +//------------------------------------------------------------------------------ +// +// GameGui.cs +// +//------------------------------------------------------------------------------ + +// z0dd - ZOD: Execute the mission and game type skip lists so that +// arrays are put into memory for function buildMissionList. +exec("prefs/MissionSkip.cs", true); +exec("prefs/GameTypeSkip.cs", true); + +//------------------------------------------------------------------------------ +function LaunchGame( %pane ) +{ + if ( %pane !$= "" ) + GameGui.pane = %pane; + + LaunchTabView.viewTab( "GAME", GameGui, 0 ); +} + +//------------------------------------------------------------------------------ +function GameGui::onWake( %this ) +{ + Canvas.pushDialog( LaunchToolbarDlg ); + + if ( $PlayingOnline ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + GM_Frame.setTitle( "GAME" ); + else + GM_Frame.setTitle( "LAN GAME" ); + + // This is essentially an "isInitialized" flag... + if ( GM_TabView.tabCount() == 0 ) + { + // --------------------------------------------------- + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + GM_TabView.addTab( 1, "JOIN" ); + GM_TabView.addTab( 2, "HOST" ); + GM_TabView.addTab( 3, "WARRIOR SETUP", 1 ); + queryMasterGameTypes(); + // --------------------------------------------------- + } + + switch$ ( %this.pane ) + { + case "Join": + GM_TabView.setSelected( 1 ); + case "Host": + GM_TabView.setSelected( 2 ); + default: // "Warrior" + GM_TabView.setSelected( 3 ); + } +} + +//------------------------------------------------------------------------------ +function GameGui::onSleep( %this ) +{ + %ctrl = "GM_" @ %this.pane @ "Pane"; + if ( isObject( %ctrl ) ) + %ctrl.onDeactivate(); + +// if( isObject( $dummySeq ) ) +// { +// $dummySeq.delete(); +// } + + Canvas.popDialog(LaunchToolbarDlg); +} + +//------------------------------------------------------------------------------ +function GameGui::setKey( %this, %key ) +{ + // To avoid console error +} + +//------------------------------------------------------------------------------ +function GameGui::onClose( %this, %key ) +{ + // To avoid console error +} + +//------------------------------------------------------------------------------ +function GM_TabView::onAdd( %this ) +{ + %this.addSet( 1, "gui/shll_horztabbuttonB", "5 5 5", "50 50 0", "5 5 5" ); +} + +//------------------------------------------------------------------------------ +function GM_TabView::onSelect( %this, %id, %text ) +{ + GM_JoinPane.setVisible( %id == 1 ); + GM_HostPane.setVisible( %id == 2 ); + GM_WarriorPane.setVisible( %id == 3 ); + GM_TabFrame.setAltColor( %this.getTabSet( %id ) != 0 ); + + %ctrl = "GM_" @ GameGui.pane @ "Pane"; + if ( isObject( %ctrl ) ) + %ctrl.onDeactivate(); + + switch ( %id ) + { + case 1: // Join + GM_JoinPane.onActivate(); + case 2: // Host + GM_HostPane.onActivate(); + case 3: // Warrior Setup + GM_WarriorPane.onActivate(); + } +} + +//------------------------------------------------------------------------------ +// Join Game pane: +//------------------------------------------------------------------------------ +function GM_JoinPane::onActivate( %this ) +{ + GameGui.pane = "Join"; + + if ( %this.onceOnly $= "" ) + { + GM_VersionText.setText( "Version" SPC getT2VersionNumber() ); + GMJ_StopBtn.setActive( false ); + + %this.onceOnly = 1; + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + GMJ_Browser.lastQuery = $PlayingOnline ? "Master" : "LanServers"; + GMJ_Browser.runQuery(); + } + + if ( isObject( BrowserMap ) ) + { + BrowserMap.pop(); + BrowserMap.delete(); + } + new ActionMap( BrowserMap ); + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + BrowserMap.bindCmd( keyboard, insert, "GMJ_Browser.insertIPAddress();", "" ); + BrowserMap.bindCmd( keyboard, "ctrl f", "Canvas.pushDialog( FindServerDlg );", "" ); + BrowserMap.bindCmd( keyboard, F3, "GMJ_Browser.findNextServer();", "" ); + BrowserMap.push(); + + GM_VersionText.setVisible( true ); // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + + if ( $pref::ServerBrowser::InfoWindowOpen ) + Canvas.pushDialog( ServerInfoDlg ); +} + +//------------------------------------------------------------------------------ +function GM_JoinPane::onDeactivate( %this ) +{ + if ( isObject( BrowserMap ) ) + { + BrowserMap.pop(); + BrowserMap.delete(); + } + + GM_VersionText.setVisible( false ); + + $pref::ServerBrowser::InfoWindowOpen = GMJ_Browser.infoWindowOpen; + if ( GMJ_Browser.infoWindowOpen ) + Canvas.popDialog( ServerInfoDlg ); +} + +//------------------------------------------------------------------------------ +$BrowserColumnCount = 0; +$BrowserColumnName[0] = "Server Name"; +$BrowserColumnRange[0] = "25 300"; +$BrowserColumnCount++; +$BrowserColumnName[1] = "Status"; +$BrowserColumnRange[1] = "25 75"; +$BrowserColumnCount++; +$BrowserColumnName[2] = "Favorite"; +$BrowserColumnRange[2] = "25 75"; +$BrowserColumnCount++; +$BrowserColumnName[3] = "Ping"; +$BrowserColumnRange[3] = "25 120"; +$BrowserColumnCount++; +$BrowserColumnName[4] = "Game Type"; +$BrowserColumnRange[4] = "25 200"; +$BrowserColumnCount++; +$BrowserColumnName[5] = "Mission Name"; +$BrowserColumnRange[5] = "25 300"; +$BrowserColumnCount++; +// --------------------------------------------------- +// z0dd - ZOD, 9/29/02. Removed T2 demo code from here +$BrowserColumnName[6] = "Rules Set"; +$BrowserColumnRange[6] = "25 300"; +$BrowserColumnCount++; +// --------------------------------------------------- +$BrowserColumnName[7] = "# Players (Bots)"; +$BrowserColumnRange[7] = "25 150"; +$BrowserColumnCount++; +$BrowserColumnName[8] = "CPU"; +$BrowserColumnRange[8] = "25 120"; +$BrowserColumnCount++; +$BrowserColumnName[9] = "IP Address"; +$BrowserColumnRange[9] = "25 200"; +$BrowserColumnCount++; +// --------------------------------------------------- +// z0dd - ZOD, 9/29/02. Removed T2 demo code from here +$BrowserColumnName[10] = "Version"; +$BrowserColumnRange[10] = "25 200"; +$BrowserColumnCount++; +// --------------------------------------------------- +$BrowserColumnName[11] = "Visibility"; +$BrowserColumnRange[11] = "25 120"; +$BrowserColumnCount++; + +//------------------------------------------------------------------------------ +function GMJ_Browser::onAdd( %this ) +{ + // Add the Server Browser columns based on the prefs: + for ( %i = 0; %i < $BrowserColumnCount; %i++ ) + { + %key = firstWord( $pref::ServerBrowser::Column[%i] ); + if ( $BrowserColumnName[%key] !$= "" && $BrowserColumnRange[%key] !$= "" ) + { + %width = getWord( $pref::ServerBrowser::Column[%i], 1 ); + %this.addColumn( %key, $BrowserColumnName[%key], %width, firstWord( $BrowserColumnRange[%key] ), getWord( $BrowserColumnRange[%key], 1 ) ); + } + } + %this.setSortColumn( $pref::ServerBrowser::SortColumnKey ); + %this.setSortIncreasing( $pref::ServerBrowser::SortInc ); +} + +//------------------------------------------------------------------------------ +function updateServerBrowser() +{ + GMJ_Browser.sort(); + if ( GMJ_Browser.infoWindowOpen ) + ServerInfoDlg.update(); +} + +//------------------------------------------------------------------------------ +function updateServerBrowserStatus( %text, %percentage ) +{ + GMJ_StatusText.setValue( %text ); + if ( %percentage >= 0 && %percentage <= 1 ) + { + GMJ_ProgressBar.setValue( %percentage ); + if ( %percentage == 0 ) // Query is over. + GMJ_StopBtn.setActive( false ); + } +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::runQuery( %this ) +{ + GMJ_ProgressBar.setValue( 0 ); + $JoinGameAddress = ""; + GMJ_JoinBtn.setActive( false ); + GMJ_RefreshServerBtn.setActive( false ); + %this.clearList(); + + // Clear the Server Info dialog: + SI_InfoWindow.setText( "No server selected." ); + SI_ContentWindow.setText( "" ); + + if ( %this.lastQuery $= "LanServers" ) + { + GMJ_StatusText.setValue( "Querying LAN servers..." ); + GMJ_FilterBtn.setActive( false ); + GMJ_FilterBtn.setVisible( false ); + GMJ_FilterText.setText( "LAN Servers" ); + queryLanServers( $JoinGamePort ); + GMJ_StopBtn.setActive( true ); + } + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + else + { + GMJ_FilterBtn.setActive( true ); + GMJ_FilterBtn.setVisible( true ); + + if ( $pref::ServerBrowser::activeFilter == 0 ) + { + GMJ_StatusText.setValue( "Querying the master server..." ); + GMJ_FilterText.setText( "All servers" ); + queryMasterServer( $JoinGamePort ); + GMJ_StopBtn.setActive( true ); + } + else if ( $pref::ServerBrowser::activeFilter == 1 ) + { + // Buddy list query: + GMJ_StatusText.setValue( "Fetching buddy list..." ); + GMJ_FilterText.setText( "Buddies" ); + %this.key = LaunchGui.key++; + DatabaseQueryArray( 5, 0, "", %this, %this.key ); + } + else if ( $pref::ServerBrowser::activeFilter == 2 ) + { + // Favorites only: + GMJ_FilterText.setText( "Favorites" ); + if ( $pref::ServerBrowser::FavoriteCount <= 0 || $pref::ServerBrowser::Favorite[0] $= "" ) + { + GMJ_StatusText.setValue( "No favorites found." ); + MessageBoxOK( "INVALID FILTER", "You haven't marked any servers as favorites. Click the Favorites column to mark a server as a favorite." ); + } + else + { + GMJ_StatusText.setValue( "Querying favorites..." ); + queryFavoriteServers(); + GMJ_StopBtn.setActive( true ); + } + } + else + { + GMJ_StatusText.setValue( "Querying the master server..." ); + %filterIndex = $pref::ServerBrowser::activeFilter - 3; + if ( $pref::ServerBrowser::Filter[%filterIndex] !$= "" ) + { + %filter = $pref::ServerBrowser::Filter[%filterIndex]; + GMJ_FilterText.setText( getField( %filter, 0 ) ); + %rulesSet = getField( %filter, 1 ); + if ( %rulesSet $= "" ) + %rulesSet = "any"; + %missionType = getField( %filter, 2 ); + if ( %missionType $= "" ) + %missionType = "any"; + %maxPlayers = getField( %filter, 4 ); + if ( %maxPlayers $= "" ) + %maxPlayers = 255; + %maxBots = getField( %filter, 7 ); + if ( %maxBots $= "" ) + %maxBots = 32; + %regionMask = getField( %filter, 5 ); + if ( %regionMask $= "" ) + %regionMask = 4294967295; + + queryMasterServer( + $JoinGamePort, + 0, // Flags + %rulesSet, // Rules Set + %missionType, // Mission Type + getField( %filter, 3 ), // Min Players + %maxPlayers, // Max Players + %maxBots, // Max Bots + %regionMask, // Region Mask + getField( %filter, 6 ), // Max Ping + getField( %filter, 8 ), // Min CPU Speed + getField( %filter, 9 ) ); // Filter flags + GMJ_StopBtn.setActive( true ); + } + else + { + // Filter is invalid, so fall back to the default: + $pref::ServerBrowser::activeFilter = 0; + GMJ_FilterText.setText( "All servers" ); + queryMasterServer( $JoinGamePort ); + GMJ_StopBtn.setActive( true ); + } + } + } +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::onDatabaseQueryResult( %this, %status, %resultString, %key ) +{ + if ( %this.key != %key ) + return; + + if ( getField( %resultString, 0 ) <= 0 ) + { + GMJ_StatusText.setValue( "No buddies found." ); + MessageBoxOK( "INVALID FILTER", "You have no buddies in your buddy list!" ); + } + else // Prepare for the incoming buddy list: + %this.buddyList = ""; +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::onDatabaseRow( %this, %row, %isLastRow, %key ) +{ + if ( %this.key != %key ) + return; + + %buddyName = getField( %row, 0 ); + %buddyGuid = getField( %row, 3 ); + echo( "Got buddy: \c9\"" @ %buddyName @ "\": " @ %buddyGuid ); + %this.buddyList = %this.buddyList $= "" ? %buddyGuid : %this.buddyList TAB %buddyGuid; + + if ( %isLastRow ) + { + GMJ_StatusText.setValue( "Querying the master server..." ); + queryMasterServer( + $JoinGamePort, // Port + 0, // Flags + "Any", // Rules Set + "Any", // Mission Type + 0, // Min Players + 255, // Max Players + 32, // Max Bots + 0xFFFFFFFF, // Region Mask + 0, // Max Ping + 0, // Min CPU Speed + 0, // Filter flags + %this.buddyList ); + GMJ_StopBtn.setActive( true ); + %this.buddyList = ""; + } +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::onSelect( %this, %address ) +{ + GMJ_JoinBtn.setActive( true ); + if ( !isServerQueryActive() ) + GMJ_RefreshServerBtn.setActive( true ); + $JoinGamePassword = ""; + $JoinGameAddress = %address; + + if ( %this.infoWindowOpen ) + ServerInfoDlg.update(); +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::refreshSelectedServer( %this ) +{ + querySingleServer( $JoinGameAddress ); + if ( %this.infoWindowOpen ) + ServerInfoDlg.update(); +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::onSetSortKey( %this, %sortKey, %isIncreasing ) +{ + $pref::ServerBrowser::SortColumnKey = %sortKey; + $pref::ServerBrowser::SortInc = %isIncreasing; +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::onColumnResize( %this, %column, %newSize, %key ) +{ + $pref::ServerBrowser::Column[%column] = %key SPC %newSize; +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::onColumnRepositioned( %this, %oldColumn, %newColumn ) +{ + // Puke em all... + %count = %this.getNumColumns(); + for ( %col = 0; %col < %count; %col++ ) + $pref::ServerBrowser::Column[%col] = %this.getColumnKey( %col ) SPC %this.getColumnWidth( %col ); +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::addFavorite( %this, %name, %address ) +{ + //error( "** addFavorite( \"" @ %name @ "\", " @ %address @ " ) **" ); + $pref::ServerBrowser::Favorite[$pref::ServerBrowser::FavoriteCount] = %name TAB %address; + $pref::ServerBrowser::FavoriteCount++; +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::removeFavorite( %this, %address ) +{ + //error( "** removeFavorite( " @ %address @ " ) **" ); + %foundIt = false; + for ( %i = 0; %i < $pref::ServerBrowser::FavoriteCount; %i++ ) + { + if ( !%foundIt ) + { + if ( getField( $pref::ServerBrowser::Favorite[%i], 1 ) $= %address ) + %foundIt = true; + } + + if ( %foundIt ) + $pref::ServerBrowser::Favorite[%i] = $pref::ServerBrowser::Favorite[%i + 1]; + } + + if ( %foundIt ) + $pref::ServerBrowser::FavoriteCount--; +} + +//------------------------------------------------------------------------------ +function GMJ_Browser::insertIPAddress( %this ) +{ + if ( isServerQueryActive() ) + { + BrowserMap.pop(); + MessageBoxOK( "ERROR", "Can't insert addresses while a query is running!", "BrowserMap.push();" ); + alxPlay( InputDeniedSound, 0, 0, 0 ); + return; + } + + IPEntry.setText( "IP:" ); + Canvas.pushDialog( EnterIPDlg ); +} + +//------------------------------------------------------------------------------ +function EnterIPDlg::onDone( %this ) +{ + Canvas.popDialog( EnterIPDlg ); + %address = IPEntry.getValue(); + if ( getSubStr( %address, 0, 3 ) !$= "IP:" ) + %address = "IP:" @ %address; + if ( strpos( %address, ":", 3 ) == -1 ) + %address = %address @ ":28000"; + + echo( "Starting ping to server " @ %address @ "..." ); + pushServerAddress( %address ); + GMJ_Browser.selectRowByAddress( %address, true ); +} + +//------------------------------------------------------------------------------ +function FindServerDlg::onWake( %this ) +{ + FS_SearchPattern.validate(); + FS_SearchPattern.selectAll(); +} + +//------------------------------------------------------------------------------ +function FindServerDlg::onGo( %this ) +{ + %pattern = FS_SearchPattern.getValue(); + if ( %pattern !$= "" ) + { + Canvas.popDialog( FindServerDlg ); + if ( !GMJ_Browser.findServer( %pattern ) ) + MessageBoxOK( "NOT FOUND", "No servers with \"" @ %pattern @ "\" in their name were found." ); + } + else + alxPlay( InputDeniedSound, 0, 0, 0 ); +} + +//------------------------------------------------------------------------------ +function FS_SearchPattern::validate( %this ) +{ + FS_GoBtn.setActive( %this.getValue() !$= "" ); +} + +//------------------------------------------------------------------------------ +function ServerInfoDlg::onAdd( %this ) +{ + %this.headerStyle = ""; +} + +//------------------------------------------------------------------------------ +function ServerInfoDlg::onWake( %this ) +{ + GMJ_Browser.infoWindowOpen = true; + + // Get the position and size from the prefs: + %res = getResolution(); + %resW = firstWord( %res ); + %resH = getWord( %res, 1 ); + %w = firstWord( $pref::ServerBrowser::InfoWindowExtent ); + if ( %w > %resW ) + %w = %resW; + %h = getWord( $pref::ServerBrowser::InfoWindowExtent, 1 ); + if ( %h > %resH ) + %h = %resH; + %x = firstWord( $pref::ServerBrowser::InfoWindowPos ); + if ( %x > %resW - %w ) + %x = %resW - %w; + %y = getWord( $pref::ServerBrowser::InfoWindowPos, 1 ); + if ( %y > %resH - %h ) + %y = %resH - %h; + SI_Window.resize( %x, %y, %w, %h ); + + GMJ_InfoBtn.setActive( false ); + SI_RefreshBtn.setActive( false ); + %this.update(); +} + +//------------------------------------------------------------------------------ +function ServerInfoDlg::update( %this ) +{ + %status = GMJ_Browser.getServerStatus(); + if ( %status $= "invalid" ) + { + SI_InfoWindow.setText( "No server selected." ); + return; + } + + %info = GMJ_Browser.getServerInfoString(); + %infoText = "" @ %this.headerStyle @ "NAME:" TAB getRecord( %info, 0 ) + NL "" @ %this.headerStyle @ "ADDRESS:" TAB getRecord( %info, 1 ) @ ""; + + %refreshable = false; + if ( %status $= "responded" ) + { + %temp = getRecord( %info, 2 ); + if ( %temp !$= "" ) + %infoText = %infoText NL "" @ %this.headerStyle @ "RULES SET:" TAB %temp @ ""; + %temp = getRecord( %info, 3 ); + if ( %temp $= "" ) + %temp = "None"; + %infoText = %infoText NL "" @ %this.headerStyle @ "FLAGS:" TAB %temp @ ""; + %temp = getRecord( %info, 4 ); + if ( %temp !$= "" ) + %infoText = %infoText NL "" @ %this.headerStyle @ "GAME TYPE:" TAB %temp @ ""; + %temp = getRecord( %info, 5 ); + if ( %temp !$= "" ) + %infoText = %infoText NL "" @ %this.headerStyle @ "MAP NAME:" TAB %temp @ ""; + %temp = getRecords( %info, 6, 10 ); + if ( %temp !$= "" ) + %infoText = %infoText NL "" @ %this.headerStyle @ "SERVER INFO:" TAB %temp @ ""; + + // Fill in the content window: + %content = GMJ_Browser.getServerContentString(); + SI_ContentWindow.fill( %content ); + %refreshable = !isServerQueryActive(); + } + else + { + switch$ ( %status ) + { + case "new": + %temp = "Not queried yet."; + SI_ContentWindow.setText( "Not available." ); + case "querying": + %temp = "Querying..."; + SI_ContentWindow.setText( "Not available." ); + case "updating": + %temp = "Updating..."; + case "timedOut": + %temp = "Timed out."; + SI_ContentWindow.setText( "Not available." ); + %refreshable = !isServerQueryActive(); + } + %infoText = %infoText NL "" @ %this.headerStyle @ "STATUS: " TAB %temp; + } + + SI_InfoWindow.setText( %infoText ); + SI_InfoScroll.scrollToTop(); + SI_ContentScroll.scrollToTop(); + SI_RefreshBtn.setActive( %refreshable ); +} + +//------------------------------------------------------------------------------ +function SI_ContentWindow::fill( %this, %content ) +{ + if ( getRecordCount( %content ) == 1 ) + { + %this.setText( "" ); + return; + } + + %record = 0; + %teamCount = getRecord( %content, %record ); + %record++; + if ( %teamCount > 1 ) + { + %string = "" @ ServerInfoDlg.headerStyle @ "TEAMSSCORE"; + for ( %i = 0; %i < %teamCount; %i++ ) + { + %teamEntry = getRecord( %content, %record ); + %string = %string NL "" SPC getField( %teamEntry, 0 ) @ "" SPC getField( %teamEntry, 1 ); + %record++; + } + + %playerCount = getRecord( %content, %record ); + %record++; + %string = %string NL "\n" @ ServerInfoDlg.headerStyle @ "PLAYERSTEAMSCORE"; + for ( %i = 0; %i < %playerCount; %i++ ) + { + %playerEntry = getRecord( %content, %record ); + %string = %string NL "" SPC getField( %playerEntry, 0 ) @ "" + SPC getField( %playerEntry, 1 ) @ "" SPC getField( %playerEntry, 2 ) @ ""; + %record++; + } + } + else + { + %record++; + %playerCount = getRecord( %content, %record ); + %record++; + %string = "" @ ServerInfoDlg.headerStyle @ "PLAYERSSCORE"; + for ( %i = 0; %i < %playerCount; %i++ ) + { + %playerEntry = getRecord( %content, %record ); + %string = %string NL "" SPC getField( %playerEntry, 0 ) @ "" SPC getField( %playerEntry, 2 ); + %record++; + } + } + + %this.setText( %string ); +} + +//------------------------------------------------------------------------------ +function ServerInfoDlg::onSleep( %this ) +{ + GMJ_Browser.infoWindowOpen = false; + + // Save off the Server Info Window prefs: + $pref::ServerBrowser::InfoWindowPos = SI_Window.getPosition(); + $pref::ServerBrowser::InfoWindowExtent = SI_Window.getExtent(); + $pref::ServerBrowser::InfoWindowBarPos = getWord( SI_InfoScroll.getExtent(), 1 ); + + GMJ_InfoBtn.setActive( true ); +} + +//------------------------------------------------------------------------------ +function PasswordDlg::onWake( %this ) +{ + $JoinGamePassword = ""; +} + +//------------------------------------------------------------------------------ +function PasswordDlg::accept( %this ) +{ + Canvas.popDialog( PasswordDlg ); + JoinSelectedGame(); +} + +//------------------------------------------------------------------------------ +function JoinSelectedGame() +{ + $ServerInfo = GMJ_Browser.getServerInfoString(); + + JoinGame($JoinGameAddress); +} + +//------------------------------------------------------------------------------ +function JoinGame(%address) +{ + MessagePopup( "JOINING SERVER", "CONNECTING" ); + cancelServerQuery(); + echo("Joining Server " @ %address); + %playerPref = $pref::Player[$pref::Player::Current]; + %playerName = getField( %playerPref, 0 ); + %playerRaceGender = getField( %playerPref, 1 ); + %playerSkin = getField( %playerPref, 2 ); + %playerVoice = getField( %playerPref, 3 ); + %playerVoicePitch = getField( %playerPref, 4 ); + LoadingGui.gotLoadInfo = ""; + connect( %address, $JoinGamePassword, %playerName, %playerRaceGender, %playerSkin, %playerVoice, %playerVoicePitch ); +} + +//------------------------------------------------------------------------------ +// Host Game pane: +//------------------------------------------------------------------------------ +function GM_HostPane::onActivate( %this ) +{ + GameGui.pane = "Host"; + + $HostGameType = $PlayingOnline ? "Online" : "LAN"; + + buildMissionTypePopup( GMH_MissionType ); + // --------------------------------------------------- + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + GMH_BotMinSlider.setValue( $Host::MinBotDifficulty ); + GMH_BotMaxSlider.setValue( $Host::MaxBotDifficulty ); + GMH_BotsEnabledTgl.setValue( $Host::BotsEnabled ); + GMH_BotsEnabledTgl.onAction(); + + //clamp and set the bot count slider + setBotCountSlider(); + // --------------------------------------------------- + + // Select the saved-off prefs: + if ( $Host::MissionType !$= "" ) + { + // Find the last selected type: + for ( %type = 0; %type < $HostTypeCount; %type++ ) + { + if ( $HostTypeName[%type] $= $Host::MissionType ) + break; + } + + if ( %type != $HostTypeCount ) + { + GMH_MissionType.setSelected( %type ); + GMH_MissionType.onSelect( %type, "" ); + if ( $Host::Map !$= "" ) + { + // Find the last selected mission: + for ( %index = 0; %index < $HostMissionCount[%type]; %index++ ) + { + if ( $HostMissionFile[$HostMission[%type, %index]] $= $Host::Map ) + break; + } + + if ( %index != $HostMissionCount[%type] ) + GMH_MissionList.setSelectedById( $HostMission[%type, %index] ); + } + } + } + else + { + GMH_MissionType.setSelected( 0 ); + GMH_MissionType.onSelect( 0, "" ); + } + + GMH_StartGameBtn.makeFirstResponder( 1 ); +} + +//------------------------------------------------------------------------------ +function GM_HostPane::onDeactivate( %this ) +{ +} + +//------------------------------------------------------------------------------ +function buildMissionTypePopup( %popup ) +{ + %popup.clear(); + for( %type = 0; %type < $HostTypeCount; %type++ ) + %popup.add( $HostTypeDisplayName[%type], %type ); + %popup.sort( true ); +} + +//------------------------------------------------------------------------------ +function getMissionTypeDisplayNames() +{ + %file = new FileObject(); + for ( %type = 0; %type < $HostTypeCount; %type++ ) + { + $HostTypeDisplayName[%type] = $HostTypeName[%type]; + if ( %file.openForRead( "scripts/" @ $HostTypeName[%type] @ "Game.cs" ) ) + { + while ( !%file.isEOF() ) + { + %line = %file.readLine(); + if ( getSubStr( %line, 0, 17 ) $= "// DisplayName = " ) + { + $HostTypeDisplayName[%type] = getSubStr( %line, 17, 1000 ); + break; + } + } + } + } + + %file.delete(); +} + +//------------------------------------------------------------------------------ +// Eolk - New rotation code +function buildMissionList() +{ + if(isFile($Host::ClassicRotationFile) && $Host::ClassicRotationCustom) + { + deleteVariables("$HostMission*"); + deleteVariables("$HostType*"); + + exec($Host::ClassicRotationFile); + } + else + { + %search = "missions/*.mis"; + %ct = 0; + $HostTypeCount = 0; + $HostMissionCount = 0; + %fobject = new FileObject(); + for( %file = findFirstFile( %search ); %file !$= ""; %file = findNextFile( %search ) ) + { + %name = fileBase( %file ); // get the name + // Eolk - Remove map skip code + %idx = $HostMissionCount; + $HostMissionCount++; + $HostMissionFile[%idx] = %name; + $HostMissionName[%idx] = %name; + + if ( !%fobject.openForRead( %file ) ) + continue; + + %typeList = "None"; + while ( !%fobject.isEOF() ) + { + %line = %fobject.readLine(); + if ( getSubStr( %line, 0, 17 ) $= "// DisplayName = " ) + { + // Override the mission name: + $HostMissionName[%idx] = getSubStr( %line, 17, 1000 ); + } + else if ( getSubStr( %line, 0, 18 ) $= "// MissionTypes = " ) + { + %typeList = getSubStr( %line, 18, 1000 ); + break; + } + } + %fobject.close(); + + // Don't include single player missions: + if ( strstr( %typeList, "SinglePlayer" ) != -1 ) + continue; + + // Test to see if the mission is bot-enabled: + %navFile = "terrains/" @ %name @ ".nav"; + $BotEnabled[%idx] = isFile( %navFile ); + + for( %word = 0; ( %misType = getWord( %typeList, %word ) ) !$= ""; %word++ ) + { + // Eolk - remove gametype skip code + // ------------------------------------------------------------------- + // z0dd - ZOD, 01/02/03. Don't include TR2 gametype if it's turned off + if(("TR2" $= %misType) && (!$Host::ClassicLoadTR2Gametype)) + { + continue; + } + // ------------------------------------------------------------------- + + for ( %i = 0; %i < $HostTypeCount; %i++ ) + if ( $HostTypeName[%i] $= %misType ) + break; + if ( %i == $HostTypeCount ) + { + $HostTypeCount++; + $HostTypeName[%i] = %misType; + $HostMissionCount[%i] = 0; + $MapCycleCount[%i] = 0; + } + // add the mission to the type + %ct = $HostMissionCount[%i]; + $HostMission[%i, $HostMissionCount[%i]] = %idx; + $HostMissionCount[%i]++; + + $HostFFAMap[%name, %i] = 1; + $MapCycleList[%i, $MapCycleCount[%i]] = %idx; + $MapCycleMaxPlayers[%misType, %name] = $Host::MaxPlayers; + $MapCycleMinPlayers[%misType, %name] = 0; + $ReverseMapCycle[%name] = 1; + $MapCycleCount[%i]++; + } + } + %fobject.delete(); + ClassicExportRotation(); + } + getMissionTypeDisplayNames(); +} + +function ClassicExportRotation() +{ + %temp = new FileObject(); + %temp.openForWrite($Host::ClassicRotationFile); + + for(%i = 0; %i < $HostTypeCount; %i++) + { + %temp.writeLine("// " @ $HostTypeDisplayName[%i]); + %type = $HostTypeName[%i]; + + for (%m = 0; %m < $HostMissionCount[%i]; %m++) + { + %idx = $HostMission[%i, %m]; + %mis = $HostMissionFile[%idx]; + + %temp.writeLine("addRotationMap(\"" @ %mis @ "\", \"" @ %type @ "\", true, true);"); + } + %temp.writeLine(""); + %temp.writeLine(""); + } + + %temp.close(); + %temp.delete(); +} + +function addRotationMap(%missionFile, %gameType, %freeForAll, %cycle, %minPlayers, %maxPlayers) +{ + if(!isFile("missions/"@ %missionFile @".mis")) + return; + + if(%minPlayers $= "") + %minPlayers = 0; + + if(%maxPlayers $= "") + %maxPlayers = $Host::MaxPlayers; + + // Classic: + if (%gameType $= "TR2" && !$Host::ClassicLoadTR2Gametype) + return; + + // Check if the map has already been added once + %found = false; + for (%mis = 0; %mis < $HostMissionCount; %mis++) + if ($HostMissionFile[%mis] $= %missionFile) + { + %found = true; + break; + } + + // Not found, add to mission list + if (!%found) + { + $HostMissionCount++; + $HostMissionFile[%mis] = %missionFile; + $HostMissionName[%mis] = %missionFile; + $BotEnabled[%mis] = isFile("terrains/" @ %missionFile @".nav"); + + + // Load custom display name + %f = new FileObject(); + if (%f.openForRead("missions/"@ %missionFile @".mis")) + { + while (!%f.isEOF()) + if (getsubstr(%line = trim(%f.readLine()), 0,17) $= "// DisplayName = ") + { + $HostMissionName[%mis] = getsubstr(%line, 17, 999); + break; + } + %f.close(); + } + %f.delete(); + } + + // Check if gametype has already been loaded + %found = false; + for (%type = 0; %type < $HostTypeCount; %type++) + if ($HostTypeName[%type] $= %gameType) + { + %found = true; + break; + } + + // Not found, add to gametype list + if (!%found) + { + $HostTypeCount++; + $HostTypeName[%type] = %gameType; + $MapCycleCount[%type] = 0; + $HostMissionCount[%type] = 0; + } + + // Add the mission to the gametype + $HostMission[%type, $HostMissionCount[%type]] = %mis; + $HostMissionCount[%type]++; + + $HostFFAMap[%file, %type] = %freeForAll; + if(%cycle) + { + $MapCycleList[%type, $MapCycleCount[%type]] = %mis; + $MapCycleMaxPlayers[%gameType, %missionFile] = %maxPlayers; + $MapCycleMinPlayers[%gameType, %missionFile] = %minPlayers; + //$Host::MapPlayerLimits[%missionFile, %gametype] = %minPlayers SPC %minPlayers; + $ReverseMapCycle[%missionFile] = 1; + $MapCycleCount[%type]++; + if($BotEnabled[%mis]){ + $BotMissionCount[%type]++; + } + } +} + +// One time only function call: +buildMissionList(); + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// z0dd - ZOD - Founder(founder@mechina.com): +// Functions to add and remove missions from $SkipMission::name (MissionSkip.cs). + +// commandToServer('AddMap', MapFilename); +function serverCmdAddMap(%client, %map) +{ + %map = detag(%map); + if(%client.isSuperAdmin) + AddMapToList(%map, %client); + else + messageClient(%client, 'MsgNotSuperAdmin', '\c2Only Super Admins can use this command.'); +} +// AddMapToList(MapFilename); +function AddMapToList(%map, %client) +{ + if(%map $="") + return; + + %found = 0; + for( %i = 0; $SkipMission::name[%i] !$= ""; %i++ ) { + if($SkipMission::name[%i] $= %map) { + %found = 1; + break; + } + } + if(%found) + { + error( "Mission " @ %map @ " allready exists in skip list!" ); + return; + } + if($MissionSkip::count $= "") + $MissionSkip::count = 0; + + $SkipMission::name[$MissionSkip::count] = %map; + $MissionSkip::count++; + + %val = 'removal from'; + writeMissionSkipList(%map, %val, %client); +} + +// commandToServer('RemoveMap', MapFilename); +function serverCmdRemoveMap(%client, %map) +{ + %map = detag(%map); + if(%client.isSuperAdmin) + RemoveMapFromList(%map, %client); + else + messageClient(%client, 'MsgNotSuperAdmin', '\c2Only Super Admins can use this command.'); +} + +// RemoveMapFromList(MapFilename); +function RemoveMapFromList(%map, %client) +{ + if(%map $="") + return; + + %count = 0; + for( %i = 0; %i < $MissionSkip::count; %i++ ) + { + if($SkipMission::name[%i] !$= %map) + { + %Temp[%count] = $SkipMission::name[%i]; + %count++; + } + } + for( %j = 0; %j < %count; %j++ ) + $SkipMission::name[%j] = %Temp[%j]; + + $MissionSkip::count = %count; + //$MissionSkip::count --; + + %val = 'restoration to'; + writeMissionSkipList(%map, %val, %client); +} + +function writeMissionSkipList(%name, %val, %client) +{ + %newfile = "prefs/MissionSkip.cs"; + if(isFile(%newfile)) + { + deleteFile(%newfile); + if(isFile("prefs/MissionSkip.cs.dso")) + deleteFile("prefs/MissionSkip.cs.dso"); + } + + %listfile = new fileObject(); + %listfile.openForWrite(%newfile); + %listfile.writeLine("// ------------------------- Mission Skip List -------------------------"); + %listfile.writeLine("// ----- Mission file names without file extension. Ex: BeggarsRun -----"); + %listfile.writeLine("// ------------ Missions on list are excluded from rotation ------------"); + %listfile.writeLine(""); + for( %k = 0; %k < $MissionSkip::count; %k++ ) { + %listfile.writeLine("$SkipMission::name[" @ %k @ "] = \"" @ $SkipMission::name[%k] @ "\";"); + } + %listfile.writeLine("$MissionSkip::count = " @ $MissionSkip::count @ ";"); + %listfile.close(); + %listfile.delete(); + + if(%client !$= "") + messageClient(%client, 'MsgAdmin', '\c3\"%1\"\c2 %2 mission rotation successful.', %name, %val); + + echo( "Mission " @ %name @ " " @ %val @ " mission rotation successful." ); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// z0dd - ZOD - Founder(founder@mechina.com): +// Functions to add and remove mission types from $SkipType::name (GameTypeSkip.cs). + +// commandToServer('AddType', Typename); +function serverCmdAddType(%client, %type) +{ + %type = detag(%type); + if(%client.isSuperAdmin) + AddTypeToList(%type, %client); + else + messageClient(%client, 'MsgNotSuperAdmin', '\c2Only Super Admins can use this command.'); +} + +// AddTypeToList(Typename); +function AddTypeToList(%type, %client) +{ + if(%type $="") + return; + + %found = 0; + for( %i = 0; $SkipType::name[%i] !$= ""; %i++ ) { + if($SkipType::name[%i] $= %type) { + %found = 1; + break; + } + } + if(%found) + { + error( "Game type " @ %type @ " allready exists in skip list!" ); + return; + } + if($TypeSkip::count $= "") + $TypeSkip::Count = 0; + + $SkipType::name[$TypeSkip::count] = %type; + $TypeSkip::count++; + + %val = 'removed'; + writeTypeSkipList(%type, %val, %client); +} + +// commandToServer('RemoveType', Typename); +function serverCmdRemoveType(%client, %type) +{ + %type = detag(%type); + if(%client.isSuperAdmin) + RemoveTypeFromList(%type, %client); + else + messageClient(%client, 'MsgNotSuperAdmin', '\c2Only Super Admins can use this command.'); +} + +// RemoveTypeFromList(Typename); +function RemoveTypeFromList(%type, %client) +{ + if(%type $="") + return; + + %count = 0; + for( %i = 0; %i < $TypeSkip::count; %i++ ) + { + if($SkipType::name[%i] !$= %type) + { + %Temp[%count] = $SkipType::name[%i]; + %count++; + } + } + for( %j = 0; %j < %count; %j++ ) + $SkipType::name[%j] = %Temp[%j]; + + $TypeSkip::count = %count; + //$TypeSkip::count --; + + %val = 'restored'; + writeTypeSkipList(%type, %val, %client); +} + +function writeTypeSkipList(%name, %val, %client) +{ + %newfile = "prefs/GameTypeSkip.cs"; + if(isFile(%newfile)) + { + deleteFile(%newfile); + if(isFile("prefs/GameTypeSkip.cs.dso")) + deleteFile("prefs/GameTypeSkip.cs.dso"); + } + %listfile = new fileObject(); + %listfile.openForWrite(%newfile); + %listfile.writeLine("// ------------------------- Game Type Skip List -------------------------"); + %listfile.writeLine("// ----------------------- Game type names. Ex: CnH ----------------------"); + %listfile.writeLine("// ------------ Game types on list are excluded from rotation ------------"); + %listfile.writeLine(""); + for( %k = 0; %k < $TypeSkip::count; %k++ ) { + %listfile.writeLine("$SkipType::name[" @ %k @ "] = \"" @ $SkipType::name[%k] @ "\";"); + } + %listfile.writeLine("$TypeSkip::count = " @ $TypeSkip::count @ ";"); + %listfile.close(); + %listfile.delete(); + + if(%client !$= "") + messageClient(%client, 'MsgAdmin', '\c2Game type \c3\"%1\"\c2 %2 successfully.', %name, %val); + + echo( "Game type " @ %name @ " " @ %val @ " successfully." ); +} + +//------------------------------------------------------------------------------ +function validateMissionAndType(%misName, %misType) +{ + for ( %mis = 0; %mis < $HostMissionCount; %mis++ ) + if( $HostMissionFile[%mis] $= %misName ) + break; + if ( %mis == $HostMissionCount ) + return false; + for ( %type = 0; %type < $HostTypeCount; %type++ ) + if ( $HostTypeName[%type] $= %misType ) + break; + if(%type == $hostTypeCount) + return false; + $Host::Map = $HostMissionFile[%mis]; + $Host::MissionType = $HostTypeName[%type]; + + return true; +} + +//------------------------------------------------------------------------------ +// This function returns the index of the next mission in the mission list. +//------------------------------------------------------------------------------ +function getNextMission(%missionName, %gameType) +{ + // Find the gametype index + for (%type = 0; %type < $HostTypeCount; %type++) + { + if ($HostTypeName[%type] $= %gameType) + break; + } + + // Didn't find a valid type, display error + if (%type == $HostTypeCount) + { + error("getNextMission(): " @ %missionName @ " does not support " @ %gameType); + return -1; + } + + if($MapPlayedCount == $MapCycleCount[%type]) + deleteVariables("$MapPlayed*"); + if($Host::botsEnabled && $BotMissionCount[%type] >= $MapPlayedCount) + deleteVariables("$MapPlayed*"); + + %length = 0; + %index = -1; + // Build array of missions + for (%i = 0; %i < $MapCycleCount[%type]; %i++) + { + %idx = $MapCycleList[%type, %i]; + %misFile = $HostMissionFile[%idx]; + // If we have bots and this map doesn't, skip... + if ($Host::botsEnabled && !$BotEnabled[%idx]) + continue; + // Don't add the current mission to our temp list + if (%missionName $= %misFile) + // Note the index of the current mission + %index = %length; + else if (!$MapPlayed[%misFile]) { + %list[%length++] = %idx; + //error(%list[%length] @": "@ %misFile); + } + } + + // If we didn't find any maps, stop... + if (!%length){ + error("getNextMission(): No valid maps found in rotation..."); + return -1; + } + + // Randomize if set by pref or if the mission played was not on the cycle + // TODO: Actually make it go on to the next mission in the list instead of randomize when a mission not in the cycle is played? +// error("LENGTH: "@%length); + if ($Host::ClassicRandomMissions || !%list[%index])// { + %index = getRandom(1, %length);// error("INDEX: "@%index); } + // Otherwise, on to the next mission + else + %index++; + + if (%index > %length) + %index -= %length; +// error("INDEX2: "@%index); + + return %list[%index]; +} +//------------------------------------------------------------------------------ +function GMH_MissionType::onSelect( %this, %id, %text ) +{ + // Fill the mission list: + GMH_MissionList.clear(); + %lastAdded = 0; + for ( %i = 0; %i < $HostMissionCount[%id];%i++ ) + { + %misId = $HostMission[%id,%i]; + GMH_MissionList.addRow( %misId, $HostMissionName[%misId] ); + %lastAdded = %misId; + } + GMH_MissionList.sort( 0 ); + + // Select the last mission added: + GMH_MissionList.setSelectedById( %lastAdded ); + $Host::MissionType = $HostTypeName[%id]; + + // --------------------------------------------------- + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + + // Disable all non bot-enabled maps if bots are enabled: + if ( GMH_BotsEnabledTgl.getValue() ) + GMH_BotsEnabledTgl.onAction(); + // --------------------------------------------------- +} + +//------------------------------------------------------------------------------ +function GMH_MissionList::onSelect( %this, %id, %text ) +{ + if ( GMH_BotsEnabledTgl.getValue() ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + GMH_StartGameBtn.setActive( $BotEnabled[%id] ); +} + + +//------------------------------------------------------------------------------ +function GMH_MissionList::onSelect( %this, %id, %text ) +{ + if ( GMH_BotsEnabledTgl.getValue() ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + GMH_StartGameBtn.setActive( $BotEnabled[%id] ); +} + +//------------------------------------------------------------------------------ +function tryToStartHostedGame() +{ + if ( GMH_BotsEnabledTgl.getValue() ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + { + %selId = GMH_MissionList.getSelectedId(); + if ( !$BotEnabled[%selId] ) + return; + } + + StartHostedGame(); +} + +//------------------------------------------------------------------------------ +function StartHostedGame() +{ + %selId = GMH_MissionList.getSelectedId(); + %misFile = $HostMissionFile[%selId]; + + if ( $Host::BotsEnabled ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + { + validateMaxPlayers(); + $HostGameBotCount = $Host::BotCount; + } + else + $HostGameBotCount = 0; + + $ServerName = $Host::GameName; + $Host::Map = %misFile; + + echo( "exporting server prefs..." ); + export( "$Host::*", $serverprefs, false ); + + if ( $Host::Dedicated ) + { + MessageBoxYesNo( "WARNING", + "You are about to launch a dedicated server and quit Tribes 2. Do you want to continue?", + "tryToLaunchDedicatedServer(" @ $Host::PureServer @ ");" ); + return; + } + + //IRCClient::onJoinGame("", ""); + + MessagePopup( "STARTING SERVER", "Initializing..." ); + Canvas.repaint(); + + cancelServerQuery(); + setNetPort( $Host::Port ); + CreateServer( $Host::Map, $Host::MissionType ); + %playerPref = $pref::Player[$pref::Player::Current]; + %playerName = getField( %playerPref, 0 ); + %playerRaceGender = getField( %playerPref, 1 ); + %playerSkin = getField( %playerPref, 2 ); + %playerVoice = getField( %playerPref, 3 ); + %playerVoicePitch = getField( %playerPref, 4 ); + localConnect( %playerName, %playerRaceGender, %playerSkin, %playerVoice, %playerVoicePitch ); + if(!$RecordDemo) + { + // demos are incompatible with local simulated net params + ServerConnection.setSimulatedNetParams($pref::Net::simPacketLoss, $pref::net::simPing * 0.5); + LocalClientConnection.setSimulatedNetParams($pref::Net::simPacketLoss, $pref::net::simPing * 0.5); + } +} + +//------------------------------------------------------------------------------ +function tryToLaunchDedicatedServer( %pure ) +{ + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + %numBots = $Host::BotsEnabled ? $Host::BotCount : 0; + if ( launchDedicatedServer( $Host::MissionType, $Host::Map, %numBots, %pure ) ) + quit(); + else + { + error( "Failed to launch the dedicated server." ); + schedule( 0, 0, MessageBoxOK, "FAILED", "Tribes 2 failed to launch the dedicated server." ); + } +} + +//------------------------------------------------------------------------------ +function GMH_BotsEnabledTgl::onAction( %this ) +{ + %count = GMH_MissionList.rowCount(); + if ( %this.getValue() ) + { + for ( %i = 0; %i < %count; %i++ ) + { + %id = GMH_MissionList.getRowId( %i ); + GMH_MissionList.setRowActive( %id, $BotEnabled[%id] ); + } + + GMH_EnableBotsGroup.setVisible(true); + %misId = GMH_MissionList.getSelectedId(); + GMH_StartGameBtn.setActive( $BotEnabled[%misId] ); + } + else + { + for ( %i = 0; %i < %count; %i++ ) + { + %id = GMH_MissionList.getRowId( %i ); + GMH_MissionList.setRowActive( %id, true ); + } + + GMH_EnableBotsGroup.setVisible( false ); + GMH_StartGameBtn.setActive( true ); + } +} + +//------------------------------------------------------------------------------ +function updateMinBotDifficulty() +{ + %min = GMH_BotMinSlider.getValue(); + $Host::MinBotDifficulty = %min; + if ( GMH_BotMaxSlider.getValue() < %min ) + GMH_BotMaxSlider.setValue( %min ); +} + +//------------------------------------------------------------------------------ +function updateMaxBotDifficulty() +{ + %max = GMH_BotMaxSlider.getValue(); + $Host::MaxBotDifficulty = %max; + if ( GMH_BotMinSlider.getValue() > %max ) + GMH_BotMinSlider.setValue( %max ); +} + +//------------------------------------------------------------------------------ +function GMH_BotsEnabledTgl::onAction( %this ) +{ + %count = GMH_MissionList.rowCount(); + if ( %this.getValue() ) + { + for ( %i = 0; %i < %count; %i++ ) + { + %id = GMH_MissionList.getRowId( %i ); + GMH_MissionList.setRowActive( %id, $BotEnabled[%id] ); + } + + GMH_EnableBotsGroup.setVisible(true); + %misId = GMH_MissionList.getSelectedId(); + GMH_StartGameBtn.setActive( $BotEnabled[%misId] ); + } + else + { + for ( %i = 0; %i < %count; %i++ ) + { + %id = GMH_MissionList.getRowId( %i ); + GMH_MissionList.setRowActive( %id, true ); + } + + GMH_EnableBotsGroup.setVisible(false); + GMH_StartGameBtn.setActive( true ); + } +} + +//------------------------------------------------------------------------------ +function validateMaxPlayers() +{ + %maxPlayers = GMH_MaxPlayersTE.getValue(); + if (%maxPlayers < 1) + %maxPlayers = 1; + + if (%maxPlayers > 64) + %maxPlayers = 64; + + //reset the value back into the TE + GMH_MaxPlayersTE.setValue(%maxPlayers); + + // --------------------------------------------------- + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + + //and make sure the bot sliders reflect the changes.. + setBotCountSlider(); + // --------------------------------------------------- +} + +function setBotCountSlider() +{ + %maxBots = 31; + if (%maxBots > $Host::MaxPlayers - 2) + %maxBots = $Host::MaxPlayers - 2; + if ($Host::BotCount > %maxBots + 1) + $Host::BotCount = %maxBots + 1; + + if (%maxBots <= 1) + %sliderValue = 0.0; + else + %sliderValue = ($Host::BotCount - 0.95) / %maxBots; + + GMH_MinCombatantSlider.setValue(%sliderValue); +} + +function setMinCombatants() +{ + %maxBots = 32; + if (%maxBots > $Host::MaxPlayers - 1) + %maxBots = $Host::MaxPlayers - 1; + if (%maxBots <= 0) + $Host::BotCount = 0; + else + $Host::BotCount = mFloor( GMH_MinCombatantSlider.getValue() * (%maxBots - 1)) + 1; + GMH_BotCountText.setValue( "(" @ $Host::BotCount @ ")" ); +} + +//------------------------------------------------------------------------------ +function AdvancedHostDlg::onWake( %this ) +{ + // Set all of the controls to the current pref states: + AH_HostPort.setText( $Host::Port ); + if ( $Host::HiVisibility ) + AH_HiVisibilityRdo.setValue( true ); + else + AH_HiFPSRdo.setValue( true ); + AH_DedicatedTgl.setValue( $Host::Dedicated ); + AH_DedicatedTgl.onAction(); + AH_TeamDamageTgl.setValue( $Host::TeamDamageOn ); + AH_TournamentTgl.setValue( $Host::TournamentMode ); + AH_AdminVoteTgl.setValue( $Host::allowAdminPlayerVotes ); + AH_AllowSmurfTgl.setValue( !$Host::NoSmurfs ); + AH_TimeLimit.setText( $Host::TimeLimit ); + AH_AdminPassword.setText( $Host::AdminPassword ); + AH_ServerInfo.setText( $Host::Info ); + AH_VotePassSlider.setValue( $Host::VotePassPercent ); + AH_VoteTimeSlider.setValue( $Host::VoteTime ); + AH_RespawnSlider.setValue( $Host::PlayerRespawnTimeout ); + AH_WarmupSlider.setValue( $Host::WarmupTime ); +} + +//------------------------------------------------------------------------------ +function AdvancedHostDlg::accept( %this ) +{ + // Apply all of the changes: + $Host::Port = AH_HostPort.getValue(); + $Host::HiVisibility = AH_HiVisibilityRdo.getValue(); + $Host::Dedicated = AH_DedicatedTgl.getValue(); + if ( $Host::Dedicated ) + $Host::PureServer = AH_PureServerTgl.getValue(); + $Host::TeamDamageOn = AH_TeamDamageTgl.getValue(); + $Host::TournamentMode = AH_TournamentTgl.getValue(); + $Host::allowAdminPlayerVotes = AH_AdminVoteTgl.getValue(); + $Host::NoSmurfs = !AH_AllowSmurfTgl.getValue(); + $Host::TimeLimit = AH_TimeLimit.getValue(); + $Host::AdminPassword = AH_AdminPassword.getValue(); + $Host::Info = AH_ServerInfo.getText(); + $Host::VotePassPercent = mFloor( AH_VotePassSlider.getValue() ); + $Host::VoteTime = mFloor( AH_VoteTimeSlider.getValue() ); + $Host::PlayerRespawnTimeout = mFloor( AH_RespawnSlider.getValue() ); + $Host::WarmupTime = mFloor( AH_WarmupSlider.getValue() ); + + // Save off the new prefs: + export( "$Host::*", $serverprefs, false ); + + Canvas.popDialog( AdvancedHostDlg ); +} + +//------------------------------------------------------------------------------ +function AH_DedicatedTgl::onAction( %this ) +{ + if ( %this.getValue() ) + { + AH_PureServerTgl.setValue( $Host::PureServer ); + AH_PureServerTgl.setActive( true ); + } + else + { + AH_PureServerTgl.setValue( false ); + AH_PureServerTgl.setActive( false ); + } +} + +//------------------------------------------------------------------------------ +function AH_VotePassText::update( %this ) +{ + %this.setText( mFloor( AH_VotePassSlider.getValue() ) @ "%" ); +} + +//------------------------------------------------------------------------------ +function AH_VoteTimeText::update( %this ) +{ + %this.setText( mFloor( AH_VoteTimeSlider.getValue() ) SPC "seconds" ); +} + +//------------------------------------------------------------------------------ +function AH_RespawnText::update( %this ) +{ + %this.setText( mFloor( AH_RespawnSlider.getValue() ) SPC "seconds" ); +} + +//------------------------------------------------------------------------------ +function AH_WarmupText::update( %this ) +{ + %this.setText( mFloor( AH_WarmupSlider.getValue() ) SPC "seconds" ); +} + +//------------------------------------------------------------------------------ +// Warrior Setup pane: +//------------------------------------------------------------------------------ +function GM_WarriorPane::onActivate( %this ) +{ + GameGui.pane = "Warrior"; + if ( $pref::Player::Count == 0 ) + %this.createNewAlias(); + else + { + // Fill the warrior list: + GMW_WarriorPopup.clear(); + GMW_LightRdo.setValue( true ); + + // First add the warrior corresponding to the player nickname: + %this.warriorIndex = -1; + if ( $PlayingOnline ) + { + %warrior = getField( WONGetAuthInfo(), 0 ); + for ( %i = 0; %i < $pref::Player::Count; %i++ ) + { + %name = getField( $pref::Player[%i], 0 ); + if ( %name $= %warrior ) + { + %this.warriorIndex = %i; + GMW_WarriorPopup.add( %name, %i, 1 ); + break; + } + } + } + + // Add the rest of the aliases: + for ( %count = 0; %count < $pref::Player::Count; %count++ ) + { + if ( $pref::Player[%count] !$= "" && %count != %this.warriorIndex ) + { + %name = stripTrailingSpaces( strToPlayerName( getField( $pref::Player[%count], 0 ) ) ); + GMW_WarriorPopup.add( %name, %count ); + } + } + + // Fill the static menus: + GMW_RaceGenderPopup.fillList(); + GMW_SkinPrefPopup.fillList(); + + // Select the current player: + GMW_WarriorPopup.setSelected( $pref::Player::Current ); + GMW_WarriorPopup.onSelect( $pref::Player::Current, "" ); + + if ( $pref::Player::Count > 1 && $pref::Player::Current != %this.warriorIndex ) + GMW_DeleteWarriorBtn.setActive( true ); + else + GMW_DeleteWarriorBtn.setActive( false ); + + GMW_PlayerPageBtn.setVisible( $PlayingOnline ); + } +} + +//------------------------------------------------------------------------------ +function GM_WarriorPane::onDeactivate( %this ) +{ +} + +//------------------------------------------------------------------------------ +function GM_WarriorPane::createNewAlias( %this ) +{ + NW_NameEdit.setValue( "" ); + NW_DoneBtn.setActive( false ); + NW_CancelBtn.setVisible( $pref::Player::Count > 0 ); + Canvas.pushDialog( NewWarriorDlg ); +} + +//------------------------------------------------------------------------------ +function GM_WarriorPane::deleteWarrior( %this ) +{ + MessageBoxYesNo( "CONFIRM", "Are you sure you want to delete this alias?", "doDeleteWarrior();", "" ); +} + +//------------------------------------------------------------------------------ +function doDeleteWarrior() +{ + // Make sure we aren't trying to delete the default warrior (should never get this): + if ( $pref::Player::Current == GM_WarriorPane.warriorIndex ) + return; + + for ( %i = $pref::Player::Current; %i < $pref::Player::Count - 1; %i++ ) + $pref::Player[%i] = $pref::Player[%i + 1]; + $pref::Player[%i] = ""; + + if ( GM_WarriorPane.warriorIndex > $pref::Player::Current ) + GM_WarriorPane.warriorIndex--; + + $pref::Player::Count--; + if ( GM_WarriorPane.warriorIndex != -1 ) + $pref::Player::Current = GM_WarriorPane.warriorIndex; + else + $pref::Player::Current = 0; + + // Update the interface: + GM_WarriorPane::onActivate(); +} + +//------------------------------------------------------------------------------ +function GM_WarriorPane::gotoPlayerPage( %this ) +{ + %warrior = getField( WONGetAuthInfo(), 0 ); + LaunchBrowser( %warrior, "Warrior" ); +} + +//------------------------------------------------------------------------------ +function GMW_PlayerModel::update( %this ) +{ + // Get the shape names: + if ( GMW_HeavyRdo.getValue() ) + %armor = "heavy"; + else if ( GMW_MediumRdo.getValue() ) + %armor = "medium"; + else + %armor = "light"; + + switch ( GMW_RaceGenderPopup.getSelected() ) + { + case 1: + if ( %armor $= "heavy" ) + %shape = %armor @ "_male"; + else + %shape = %armor @ "_female"; + case 2: %shape = "bioderm_" @ %armor; + default: %shape = %armor @ "_male"; + } + + %skin = getField( $pref::Player[$pref::Player::Current], 2 ); + +// if( isObject( $dummySeq ) ) +// { +// $dummySeq.delete(); +// } +// +// $dummySeq = new TSShapeConstructor() +// { +// baseShape = %shape @ ".dts"; +// sequence0 = %shape @ "_forward.dsq dummyRun"; +// }; + + %this.setModel( %shape, %skin ); +} + +//------------------------------------------------------------------------------ +function GMW_WarriorPopup::onAdd( %this ) +{ + %this.addScheme( 1, "255 255 0", "255 255 128", "128 128 0" ); +} + +//------------------------------------------------------------------------------ +function GMW_WarriorPopup::onSelect( %this, %id, %text ) +{ + // Set this as the currently selected player: + $pref::Player::Current = %id; + + // Select the race/gender: + %raceGender = getField( $pref::Player[%id], 1 ); + %selId = GMW_RaceGenderPopup.findText( %raceGender ); + if ( %selId == -1 ) + %selId = 0; + + GMW_RaceGenderPopup.setSelected( %selId ); + GMW_VoicePopup.fillList( %selId ); + + // Select the skin: + %skin = getField( $pref::Player[%id], 2 ); + %baseSkin = isDynamixSkin( %skin ); + GMW_SkinPrefPopup.setSelected( !%baseSkin ); + GMW_SkinPopup.fillList( %selId ); + + %selId = -1; + for ( %i = 0; %i < GMW_SkinPopup.size(); %i++ ) + { + if ( GMW_SkinPopup.realSkin[%i] !$= "" ) + { + if ( %skin $= GMW_SkinPopup.realSkin[%i] ) + { + %selId = %i; + break; + } + } + else if ( %skin $= GMW_SkinPopup.getTextById( %i ) ) + { + %selId = %i; + break; + } + } + if ( %selId == -1 ) + %selId = 0; + GMW_SkinPopup.setSelected( %selId ); + GMW_SkinPopup.onSelect( %selId, GMW_SkinPopup.getTextById( %selId ) ); + + // Select the voice: + %voice = getField( $pref::Player[%id], 3 ); + %voiceId = getSubStr( %voice, strlen( %voice ) -1, 1000 ) - 1; + GMW_VoicePopup.setSelected( %voiceId ); + GMW_VoicePopup.voiceIndex = 0; + + GMW_DeleteWarriorBtn.setActive( $pref::Player::Count > 1 && %id != GM_WarriorPane.warriorIndex ); +} + +//------------------------------------------------------------------------------ +function GMW_RaceGenderPopup::fillList( %this ) +{ + if ( %this.size() ) + return; + + %this.add( "Human Male", 0 ); + %this.add( "Human Female", 1 ); + %this.add( "Bioderm", 2 ); +} + +//------------------------------------------------------------------------------ +function GMW_RaceGenderPopup::onSelect( %this, %id, %text ) +{ + // Update the player pref: + $pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 1, %this.getText() ); + + // Fill the skin list: + %prevSkin = GMW_SkinPopup.getText(); + GMW_SkinPopup.fillList( %id ); + %selId = GMW_SkinPopup.findText( %prevSkin ); + if ( %selId == -1 ) + %selId = 0; + GMW_SkinPopup.setSelected( %selId ); + GMW_SkinPopup.onSelect( %selId, GMW_SkinPopup.getTextById( %selId ) ); + + // Fill the voice list: + %prevVoice = GMW_VoicePopup.getText(); + GMW_VoicePopup.fillList( %id ); + %selId = GMW_VoicePopup.findText( %prevVoice ); + if ( %selId == -1 ) + %selId = 0; + + GMW_VoicePopup.setSelected( %selId ); + GMW_VoicePopup.onSelect( %selId, "" ); +} + +//------------------------------------------------------------------------------ +function GMW_SkinPrefPopup::fillList( %this ) +{ + if ( %this.size() ) + return; + + %this.add( "Dynamix Skins", 0 ); + %this.add( "Custom Skins", 1 ); +} + +//------------------------------------------------------------------------------ +function GMW_SkinPrefPopup::onSelect( %this, %id, %text ) +{ + %curSkin = GMW_SkinPopup.getText(); + GMW_SkinPopup.fillList( GMW_RaceGenderPopup.getSelected() ); + %selId = GMW_SkinPopup.findText( %curSkin ); + if ( %selId == -1 ) + %selId = 0; + + if ( GMW_SkinPopup.size() ) + { + GMW_SkinPopup.setSelected( %selId ); + GMW_SkinPopup.onSelect( %selId, GMW_SkinPopup.getTextById( %selId ) ); + } +} + +//------------------------------------------------------------------------------ +$SkinCount = 0; +$Skin[$SkinCount, name] = "Blood Eagle"; +$Skin[$SkinCount, code] = "beagle"; +$SkinCount++; +$Skin[$SkinCount, name] = "Diamond Sword"; +$Skin[$SkinCount, code] = "dsword"; +$SkinCount++; +$Skin[$SkinCount, name] = "Starwolf"; +$Skin[$SkinCount, code] = "swolf"; +$SkinCount++; +$Skin[$SkinCount, name] = "Phoenix"; +$Skin[$SkinCount, code] = "cotp"; +$SkinCount++; +$Skin[$SkinCount, name] = "Storm"; +$Skin[$SkinCount, code] = "base"; +$SkinCount++; +$Skin[$SkinCount, name] = "Inferno"; +$Skin[$SkinCount, code] = "baseb"; +$SkinCount++; +$Skin[$SkinCount, name] = "Horde"; +$Skin[$SkinCount, code] = "horde"; +$SkinCount++; + +//------------------------------------------------------------------------------ +function isDynamixSkin( %skin ) +{ + for ( %i = 0; %i < $SkinCount; %i++ ) + { + if ( %skin $= $Skin[%i, code] ) + return( true ); + } + + return( false ); +} + +//------------------------------------------------------------------------------ +function GMW_SkinPopup::fillList( %this, %raceGender ) +{ + for ( %i = 0; %i < %this.size(); %i++ ) + %this.realSkin[%i] = ""; + + %this.clear(); + %path = "textures/skins/"; + switch ( %raceGender ) + { + case 0: // Human Male + %pattern = ".lmale.png"; + case 1: // Human Female + %pattern = ".lfemale.png"; + case 2: // Bioderm + %pattern = ".lbioderm.png"; + } + + %customSkins = GMW_SkinPrefPopup.getSelected(); + %count = 0; + for ( %file = findFirstFile( %path @ "*" @ %pattern ); %file !$= ""; %file = findNextFile( %path @ "*" @ %pattern ) ) + { + %skin = getSubStr( %file, strlen( %path ), strlen( %file ) - strlen( %path ) - strlen( %pattern ) ); // strip off the path and postfix + + // Make sure this is not a bot skin: + if ( %skin !$= "basebot" && %skin !$= "basebbot" ) + { + // See if this skin has an alias: + %baseSkin = false; + for ( %i = 0; %i < $SkinCount; %i++ ) + { + if ( %skin $= $Skin[%i, code] ) + { + %baseSkin = true; + %skin = $Skin[%i, name]; + break; + } + } + + if ( %customSkins != %baseSkin ) + { + if ( %baseSkin ) + %this.realSkin[%count] = $Skin[%i, code]; + %this.add( %skin, %count ); + %count++; + } + } + } + + %this.sort( true ); +} + +//------------------------------------------------------------------------------ +function GMW_SkinPopup::onSelect( %this, %id, %text ) +{ + // Update the player pref: + if ( %this.realSkin[%id] !$= "" ) + $pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 2, %this.realSkin[%id] ); + else + $pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 2, %text ); + + // Update the player model: + GMW_PlayerModel.update(); +} + +//------------------------------------------------------------------------------ +// TRANSLATE these voice set display names: +$MaleVoiceCount = 0; +$MaleVoiceName[$MaleVoiceCount] = "Hero"; +$MaleVoiceCount++; +$MaleVoiceName[$MaleVoiceCount] = "Iceman"; +$MaleVoiceCount++; +$MaleVoiceName[$MaleVoiceCount] = "Rogue"; +$MaleVoiceCount++; +$MaleVoiceName[$MaleVoiceCount] = "Hardcase"; +$MaleVoiceCount++; +$MaleVoiceName[$MaleVoiceCount] = "Psycho"; +$MaleVoiceCount++; + +$FemaleVoiceCount = 0; +$FemaleVoiceName[$FemaleVoiceCount] = "Heroine"; +$FemaleVoiceCount++; +$FemaleVoiceName[$FemaleVoiceCount] = "Professional"; +$FemaleVoiceCount++; +$FemaleVoiceName[$FemaleVoiceCount] = "Cadet"; +$FemaleVoiceCount++; +$FemaleVoiceName[$FemaleVoiceCount] = "Veteran"; +$FemaleVoiceCount++; +$FemaleVoiceName[$FemaleVoiceCount] = "Amazon"; +$FemaleVoiceCount++; + +$DermVoiceCount = 0; +$DermVoiceName[$DermVoiceCount] = "Warrior"; +$DermVoiceCount++; +$DermVoiceName[$DermVoiceCount] = "Monster"; +$DermVoiceCount++; +$DermVoiceName[$DermVoiceCount] = "Predator"; +$DermVoiceCount++; + +//------------------------------------------------------------------------------ +function GMW_VoicePopup::fillList( %this, %raceGender ) +{ + %this.clear(); + + switch ( %raceGender ) + { + case 0: // Human Male + for ( %i = 0; %i < $MaleVoiceCount; %i++ ) + %this.add( $MaleVoiceName[%i], %i ); + + case 1: // Human Female + for ( %i = 0; %i < $FemaleVoiceCount; %i++ ) + %this.add( $FemaleVoiceName[%i], %i ); + + case 2: // Bioderm + for ( %i = 0; %i < $DermVoiceCount; %i++ ) + %this.add( $DermVoiceName[%i], %i ); + } +} + +//------------------------------------------------------------------------------ +function GMW_VoicePopup::onSelect( %this, %id, %text ) +{ + // Update the player pref: + switch ( GMW_RaceGenderPopup.getSelected() ) + { + case 0: %base = "Male"; + case 1: %base = "Fem"; + case 2: %base = "Derm"; + } + + $pref::Player[$pref::Player::Current] = setField( $pref::Player[$pref::Player::Current], 3, %base @ ( %id + 1 ) ); + + %this.voiceIndex = 0; +} + +//------------------------------------------------------------------------------ +function GMW_VoicePitchSlider::setPitch(%this) +{ +} + +function GMW_VoicePopup::test( %this ) +{ + switch ( %this.voiceIndex ) + { + case 0: %file = "gbl.hi"; + case 1: %file = "gbl.brag"; + case 2: %file = "gbl.woohoo"; + case 3: %file = "gbl.rock"; + case 4: %file = "gbl.obnoxious"; + case 5: %file = "gbl.shazbot"; + } + + switch ( GMW_RaceGenderPopup.getSelected() ) + { + case 0: %base = "Male"; + case 1: %base = "Fem"; + case 2: %base = "Derm"; + } + + GMW_VoiceTestBtn.setActive( false ); + %voiceId = %this.getSelected() + 1; + %wav = "voice/" @ %base @ %voiceId @ "/" @ %file @ ".wav"; + %handle = alxCreateSource( AudioGui, %wav ); + + //pitch the voice + //%pitchSliderVal = GMW_VoicePitchSlider.getValue(); + //%pitch = getValidVoicePitch(%voiceId, %pitchSliderVal); + //if (%pitch != 1.0) + // alxSourcef(%handle, "AL_PITCH", %pitch); + + alxPlay( %handle ); + + %delay = alxGetWaveLen( %wav ); + schedule( %delay, 0, "restoreVoiceTestButton" ); + + if ( %this.voiceIndex == 5 ) + %this.voiceIndex = 0; + else + %this.voiceIndex++; +} + +//------------------------------------------------------------------------------ +function restoreVoiceTestButton() +{ + GMW_VoiceTestBtn.setActive( true ); +} + +//------------------------------------------------------------------------------ +function NewWarriorDlg::createPlayer( %this ) +{ + %name = stripTrailingSpaces( NW_NameEdit.getValue() ); + $pref::Player[$pref::Player::Count] = %name @ "\tHuman Male\tbeagle\tMale1"; + $pref::Player::Current = $pref::Player::Count; + $pref::Player::Count++; + Canvas.popDialog( NewWarriorDlg ); + GM_WarriorPane.onActivate(); // Refresh the warrior gui +} + +//------------------------------------------------------------------------------ +function NW_NameEdit::checkValidPlayerName( %this ) +{ + %name = %this.getValue(); + %test = strToPlayerName( %name ); + if ( %name !$= %test ) + %this.setValue( %test ); + + NW_DoneBtn.setActive( strlen( stripTrailingSpaces( %test ) ) > 2 ); +} + +//------------------------------------------------------------------------------ +function NW_NameEdit::processEnter( %this ) +{ + %this.checkValidPlayerName(); + if ( NW_DoneBtn.isActive() ) + NewWarriorDlg.createPlayer(); +} diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index d46fd1e..1743c90 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -1,5 +1,5 @@ //------------------------------------------------------------------- -// Team Rabbit script +// Lak Rabbit script // ------------------------------------------------------------------- // DisplayName = LakRabbit @@ -19,6 +19,7 @@ // // v3.36 Dec 2019 // Boundary bounce speed limit +// Unified Lakrabbit Vars // // v3.35 April 2019 // Added Not enough players flag message delay @@ -124,7 +125,7 @@ // v1 - See game rules. // Vars: -// $Host::ShowFlagIcon +// $Host::LakRabbitShowFlagIcon // 0 - Don't show any // 1 - Show flag icon when flag dropped only // 2 - Show flag icon on rabbit @@ -138,14 +139,14 @@ // 1 - Enable Duel Mode // // $Host::LakRabbitNoSplashDamage -// 0 - Disable No Splash Dame +// 0 - Disable No Splash Damage // 1 - Enable No Splash Damage // -// $Host::ShowFlagTask +// $Host::LakRabbitShowFlagTask // 0 - Do not show flag task // 1 - Show the flag when dropped as a task // -// $Host::EnableLakUnlimitedDJ +// $Host::LakRabbitUnlimitedDJ // 0 - Players only get one DiscJump // 1 - Players get 999 or unlimited DiscJumps // @@ -162,7 +163,7 @@ function Flag::objectiveInit(%data, %flag) %flag.rotate = true; // ilys -- add the icon to the flag - if( $Host::ShowFlagIcon == 1 || $Host::ShowFlagIcon == 2 ) + if( $Host::LakRabbitShowFlagIcon == 1 || $Host::LakRabbitShowFlagIcon == 2 ) { %flag.scopeWhenSensorVisible(true); setTargetSensorGroup(%flag.getTarget(), $NonRabbitTeam); @@ -171,7 +172,7 @@ function Flag::objectiveInit(%data, %flag) } // create a waypoint to the flag's starting place - if( $Host::ShowFlagIcon == 0 ) + if( $Host::LakRabbitShowFlagIcon == 0 ) { %flagWaypoint = new WayPoint() { @@ -1468,7 +1469,7 @@ function LakRabbitGame::playerSpawned(%game, %player) //now set a waypoint just for that client... // ilys -- show client waypoint if not showing flag icon - if($Host::ShowFlagIcon == 0 && $Host::ShowFlagTask) + if($Host::LakRabbitShowFlagIcon == 0 && $Host::LakRabbitShowFlagTask) { cancel(%player.client.waypointSchedule); if (isObject(%clRabbit) && !%player.client.isAIControlled()) @@ -1498,7 +1499,7 @@ function LakRabbitGame::playerSpawned(%game, %player) %player.schedule(250,"selectWeaponSlot", 0); %player.setEnergyLevel(%player.getDatablock().maxEnergy); - if($Host::EnableLakUnlimitedDJ == 1) + if($Host::LakRabbitUnlimitedDJ == 1) %player.freeDJ = 999; // free diskjump else %player.freeDJ = 1; // free diskjump @@ -1655,7 +1656,7 @@ function LakRabbitGame::playerDroppedFlag(%game, %player) %player.unmountImage($FlagSlot); %flag.hide(false); // ilys -- remove flag icon from player - if($Host::ShowFlagIcon == 1 || $Host::ShowFlagIcon == 2) + if($Host::LakRabbitShowFlagIcon == 1 || $Host::LakRabbitShowFlagIcon == 2) { setTargetSensorGroup(%flag.getTarget(), $Observer); %player.scopeWhenSensorVisible(true); @@ -1665,9 +1666,9 @@ function LakRabbitGame::playerDroppedFlag(%game, %player) } //just always true - //if( $Host::ShowFlagIcon == 1 ) + //if( $Host::LakRabbitShowFlagIcon == 1 ) //%flag.scopeWhenSensorVisible(true); - //else if($Host::ShowFlagIcon == 2) + //else if($Host::LakRabbitShowFlagIcon == 2) //%flag.scopeWhenSensorVisible(false); // borlak -- throw the flag, don't just drop it like dead weight @@ -1691,7 +1692,7 @@ function LakRabbitGame::playerDroppedFlag(%game, %player) %flag.setCollisionTimeout(%player); // ilys -- hide waypoint if not showing flag icon - if($Host::ShowFlagIcon == 0 && $Host::ShowFlagTask) + if($Host::LakRabbitShowFlagIcon == 0 && $Host::LakRabbitShowFlagTask) { cancel(%game.waypointSchedule); %game.hideRabbitWaypoint(%player.client); @@ -1828,7 +1829,7 @@ function LakRabbitGame::playerTouchFlag(%game, %player, %flag) cancel(%flag.returnThread); %flag.hide(true); // ilys -- add flag icon to player - if( $Host::ShowFlagIcon == 2 ) + if( $Host::LakRabbitShowFlagIcon == 2 ) { setTargetSensorGroup(%flag.getTarget(), $RabbitTeam); %player.scopeWhenSensorVisible(true); @@ -1869,7 +1870,7 @@ function LakRabbitGame::playerTouchFlag(%game, %player, %flag) //show the rabbit waypoint %game.rabbitDamageTime = 0; // ilys -- waypoint if not showing flag icon - if($Host::ShowFlagIcon == 0 && $Host::ShowFlagTask) + if($Host::LakRabbitShowFlagIcon == 0 && $Host::LakRabbitShowFlagTask) { cancel(%game.waypointSchedule); %game.showRabbitWaypoint(%player.client); @@ -1922,7 +1923,7 @@ function LakRabbitGame::resetFlag(%game, %flag) %flag.hide(false); //so flag turns back green - if($Host::ShowFlagIcon == 1 || $Host::ShowFlagIcon == 2) + if($Host::LakRabbitShowFlagIcon == 1 || $Host::LakRabbitShowFlagIcon == 2) { setTargetSensorGroup(%flag.getTarget(), $NonRabbitTeam); } @@ -1978,13 +1979,13 @@ function LakRabbitGame::gameOver(%game) %client = ClientGroup.getObject(%i); %game.resetScore(%client); // ilys -- cancel waypoint if not showing flag icon - if($Host::ShowFlagIcon == 0 && $Host::ShowFlagTask) + if($Host::LakRabbitShowFlagIcon == 0 && $Host::LakRabbitShowFlagTask) cancel(%client.waypointSchedule); cancel(%client.duelTimer); } // ilys -- cancel waypoint if not showing flag icon - if($Host::ShowFlagIcon == 0 && $Host::ShowFlagTask) + if($Host::LakRabbitShowFlagIcon == 0 && $Host::LakRabbitShowFlagTask) cancel(%game.waypointSchedule); // borlak -- delete variables diff --git a/Classic/scripts/SCtFGame.cs b/Classic/scripts/SCtFGame.cs index 31b7a9f..ebbaf18 100644 --- a/Classic/scripts/SCtFGame.cs +++ b/Classic/scripts/SCtFGame.cs @@ -750,9 +750,16 @@ function SCtFGame::playerTouchEnemyFlag(%game, %player, %flag) %player.holdingFlag = %flag; //%player has this flag %flag.carrier = %player; //this %flag is carried by %player + // attach the camera to the flag.carrier + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + if(%cl.team <= 0 && %cl.observingFlag && %cl.flagObsTeam == %flag.team) + observeFlag(%cl, %player.client, 2, %flag.team); + } %player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%flag.team)); - %game.playerGotFlagTarget(%player); + //only cancel the return timer if the player is in bounds... if (!%client.outOfBounds) { @@ -774,8 +781,32 @@ function SCtFGame::playerTouchEnemyFlag(%game, %player, %flag) if (%startStalemate) %game.stalemateSchedule = %game.schedule(%game.stalemateTimeMS, beginStalemate); - + + if($Host::ClassicEvoStats && !$Host::TournamentMode) + { + $stats::grabs[%client]++; + if($stats::grabs[%client] > $stats::grabs_counter) + { + $stats::grabs_counter = $stats::grabs[%client]; + $stats::grabs_client = getTaggedString(%client.name); + } + } + + if($Host::ClassicEvoStats) + %game.totalFlagHeldTime[%flag] = getSimTime(); } + + if($Host::ClassicEvoStats && !%player.flagStatsWait && !$Host::TournamentMode) + { + %grabspeed = mFloor(VectorLen(setWord(%player.getVelocity(), 2, 0)) * 3.6); + + if(%grabspeed > $stats::MaxGrabSpeed || ($stats::MaxGrabSpeed $= "")) + { + $stats::MaxGrabSpeed = %grabspeed; + $stats::Grabber = getTaggedString(%client.name); + } + } + %flag.hide(true); %flag.startFade(0, 0, false); %flag.isHome = false; @@ -832,13 +863,23 @@ function SCtFGame::playerDroppedFlag(%game, %player) %held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag? %game.playerLostFlagTarget(%player); + + if($Host::ClassicEvoStats) + %game.totalFlagHeldTime[%flag] = 0; %player.holdingFlag = ""; //player isn't holding a flag anymore %flag.carrier = ""; //flag isn't held anymore $flagStatus[%flag.team] = ""; + // attach the camera again to the flag + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + if(%cl.team <= 0 && %cl.observingFlag && %cl.flagObsTeam == %flag.team) + observeFlag(%cl, $TeamFlag[%flag.team], 1, %flag.team); + } %player.unMountImage($FlagSlot); - %flag.hide(false); //Does the throwItem function handle this? + %flag.hide(false); //Does the throwItem function handle this? %teamName = %game.getTeamName(%flag.team); messageTeamExcept(%client, 'MsgCTFFlagDropped', '\c2Teammate %1 dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held @@ -866,6 +907,72 @@ function SCtFGame::flagCap(%game, %player) %held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag? %game.playerLostFlagTarget(%player); + + if($Host::ClassicEvoStats) + { + %held2 = getSimTime() - %game.totalFlagHeldTime[%flag]; + %realtime = %game.formatTime(%held2, true); + %record = false; + if(%game.totalFlagHeldTime[%flag]) + { + if(%client.team == 1) + { + if((%held2 < $flagstats::heldTeam1) || $flagstats::heldTeam1 == 0) + { + if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + { + $flagstats::heldTeam1 = %held2; + $flagstats::realTeam1 = %realTime; + $flagstats::nickTeam1 = %client.nameBase; + } + %record = true; + } + } + else if(%client.team == 2) + { + if((%held2 < $flagstats::heldTeam2) || $flagstats::heldTeam2 == 0) + { + if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + { + $flagstats::heldTeam2 = %held2; + $flagstats::realTeam2 = %realTime; + $flagstats::nickTeam2 = %client.nameBase; + } + %record = true; + } + } + + if(%record == true) + { + if($HostGamePlayerCount >= $Host::MinFlagRecordPlayerCount) + { + %fileOut = "stats/maps/classic/" @ $CurrentMissionType @ "/" @ $CurrentMission @ ".txt"; + export("$flagstats::*", %fileOut, false); + schedule(4000, 0, "messageAll", 'MsgCTFNewRecord', "\c2It's a new record! Time: \c3"@%realtime@"\c2.~wfx/misc/hunters_horde.wav"); + } + else + schedule(4000, 0, "messageClient", %client, '', "\c2Minimum of" SPC $Host::MinFlagRecordPlayerCount SPC "Players to set a new flag record."); + } + } + + if(!$Host::TournamentMode) + bottomprint(%client, "You captured the flag in " @ %realTime @ " seconds", 3); + + $stats::caps[%client]++; + if($stats::caps[%client] > $stats::caps_counter) + { + $stats::caps_counter = $stats::caps[%client]; + $stats::caps_client = getTaggedString(%client.name); + } + + if(%held2 < $stats::fastestCap || !$stats::fastestCap) + { + $stats::fastestCap = %held2; + $stats::fastcap_time = %realTime; + $stats::fastcap_client = getTaggedString(%client.name); + } + } + //award points to player and team %teamName = %game.getTeamName(%flag.team); messageTeamExcept(%client, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); @@ -916,6 +1023,23 @@ function SCtFGame::flagReturn(%game, %flag, %player) else %otherTeam = 1; %teamName = %game.getTeamName(%flag.team); + + // when the flag return, stop observing the flag, and go in observerFly mode + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + if(%cl.team <= 0 && %cl.observingFlag && %cl.flagObsTeam == %flag.team) + { + %cl.camera.mode = "observerFly"; + %cl.camera.setFlyMode(); + updateObserverFlyHud(%cl); + + %cl.observingFlag = false; + %cl.flagObserved = ""; + %cl.flagObsTeam = ""; + } + } + if (%player !$= "") { //a player returned it @@ -1814,7 +1938,10 @@ function SCtFGame::boundaryLoseFlag(%game, %player) %flag.setCollisionTimeout(%player); %held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag? - + + if($Host::ClassicEvoStats) + %game.totalFlagHeldTime[%flag] = 0; + %game.playerDroppedFlag(%player); // now for the tricky part -- throwing the flag back into the mission area diff --git a/Classic/scripts/admin.cs b/Classic/scripts/admin.cs index 1851688..2e65d55 100644 --- a/Classic/scripts/admin.cs +++ b/Classic/scripts/admin.cs @@ -23,7 +23,7 @@ $VoteMessage["VoteArmorLimits", 1] = "disable armor limiting"; $VoteMessage["VoteAntiTurtleTime"] = "change the anti turtle time to"; $VoteMessage["VoteArmorClass"] = "change the armor class to"; $VoteMessage["VoteClearServer"] = "clear server for match"; -$VoteMessage["VoteSkipMission"] = "skip the mission to"; +$VoteMessage["VoteSkipMission"] = "skip the mission"; function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote) { @@ -146,6 +146,9 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % %clientsVoting++; } } + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); } else { @@ -158,6 +161,9 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % %clientsVoting++; } } + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); } } else @@ -173,6 +179,21 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % } } } + else if ( %typeName $= "VoteSkipMission" ) + { + for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ ) + { + %cl = ClientGroup.getObject( %idx ); + if ( !%cl.isAIControlled() ) + { + messageClient( %cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg, %arg1.name); + %clientsVoting++; + } + } + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); + } else if ( %typeName $= "VoteChangeMission" ) { for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ ) @@ -184,6 +205,9 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % %clientsVoting++; } } + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); } else if (%arg1 !$= 0) { @@ -203,6 +227,9 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % %clientsVoting++; } } + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); } else { @@ -225,7 +252,10 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % } else { - for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ ) + if( %arg1 == 999 ) + %arg1 = "unlimited"; + + for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ ) { %cl = ClientGroup.getObject( %idx ); if ( !%cl.isAIControlled() ) @@ -234,6 +264,9 @@ function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, % %clientsVoting++; } } + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); } } else diff --git a/Classic/scripts/autoexec/AntiLouExploitFixes.cs b/Classic/scripts/autoexec/AntiLouExploitFixes.cs new file mode 100644 index 0000000..37a103e --- /dev/null +++ b/Classic/scripts/autoexec/AntiLouExploitFixes.cs @@ -0,0 +1,489 @@ +//Taco October 2018 +//removed alot of things that were already included in the classic code +//and checked if evo wasnt double overriding functions + +package AntiLouExploitFixes +{ + +// MPB INSTANT ENERGY FIX + +// VehicleData::onRemove(%this, %obj) +// Info: this is called after the MPB is destroyed. Reset the variable +function VehicleData::onRemove(%this, %obj) +{ + if(%obj.station.isDestroyed) + %obj.station.isDestroyed = 0; + + parent::onRemove(%this, %obj); +} + + +// stationTrigger::onEnterTrigger(%data, %obj, %colObj) +// Info: If the MPB is destroyed, don't allow players to use the inv +function stationTrigger::onEnterTrigger(%data, %obj, %colObj) +{ + //make sure it's a player object, and that that object is still alive + if(%colObj.getDataBlock().className !$= "Armor" || %colObj.getState() $= "Dead") + return; + + + // Part of hack to keep people from mounting vehicles in disallowed armors. + if(%obj.station.getDataBlock().getName() !$= "StationVehicle") + %colObj.client.inInv = true; + + %colObj.inStation = true; + commandToClient(%colObj.client,'setStationKeys', true); + + if(Game.stationOnEnterTrigger(%data, %obj, %colObj)) + { + //verify station.team is team associated and isn't on player's team + if((%obj.mainObj.team != %colObj.client.team) && (%obj.mainObj.team != 0)) + { + messageClient(%colObj.client, 'msgStationDenied', '\c2Access Denied -- Wrong team.~wfx/powered/station_denied.wav'); + } + else if(%obj.disableObj.isDisabled()) + { + messageClient(%colObj.client, 'msgStationDisabled', '\c2Station is disabled.'); + } + else if(!%obj.mainObj.isPowered()) + { + messageClient(%colObj.client, 'msgStationNoPower', '\c2Station is not powered.'); + } + else if(%obj.station.notDeployed) + { + messageClient(%colObj.client, 'msgStationNotDeployed', '\c2Station is not deployed.'); + } + else if(%obj.station.isDestroyed) + { + messageClient(%colObj.client, 'msgStationDestroyed', '\c2Station is destroyed.'); + } + else if(%obj.station.triggeredBy $= "") + { + if(%obj.station.getDataBlock().setPlayersPosition(%obj.station, %obj, %colObj)) + { + messageClient(%colObj.client, 'CloseHud', "", 'inventoryScreen'); + commandToClient(%colObj.client, 'TogglePlayHuds', true); + %obj.station.triggeredBy = %colObj; + %obj.station.getDataBlock().stationTriggered(%obj.station, 1); + %colObj.station = %obj.station; + %colObj.lastWeapon = ( %colObj.getMountedImage($WeaponSlot) == 0 ) ? "" : %colObj.getMountedImage($WeaponSlot).getName().item; + %colObj.unmountImage($WeaponSlot); + } + } + } +} + +// END MPB INSTANT ENERGY FIX + +// VEHICLE STATION SPAM FIX + +// serverCmdBuyVehicle(%client, %blockName) +// Info: Fix an exploit that makes the server lag. +function serverCmdBuyVehicle(%client, %blockName) +{ + // if the client has already created a vehicle, don't execute the function + if(%client.cantBuyVehicle) + return; + + %team = %client.getSensorGroup(); + if(vehicleCheck(%blockName, %team)) + { + %station = %client.player.station.pad; + if((%station.ready) && (%station.station.vehicle[%blockName])) + { + %trans = %station.getTransform(); + %pos = getWords(%trans, 0, 2); + %matrix = VectorOrthoBasis(getWords(%trans, 3, 6)); + %yrot = getWords(%matrix, 3, 5); + %p = vectorAdd(%pos,vectorScale(%yrot, -3)); + %p = getWords(%p, 0, 1) @ " " @ getWord(%p, 2) + 4; + %p = vectorAdd(%p, %blockName.spawnOffset); + %rot = getWords(%trans, 3, 5); + %angle = getWord(%trans, 6) + 3.14; + %mask = $TypeMasks::VehicleObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::StationObjectType | $TypeMasks::TurretObjectType; + InitContainerRadiusSearch(%p, %blockName.checkRadius, %mask); + + %clear = 1; + for(%x = 0; (%obj = containerSearchNext()) != 0; %x++) + { + if((%obj.getType() & $TypeMasks::VehicleObjectType) && (%obj.getDataBlock().checkIfPlayersMounted(%obj))) + { + %clear = 0; + break; + } + else + %removeObjects[%x] = %obj; + } + + if(%clear) + { + %fadeTime = 0; + for(%i = 0; %i < %x; %i++) + { + if(%removeObjects[%i].getType() & $TypeMasks::PlayerObjectType) + { + %pData = %removeObjects[%i].getDataBlock(); + %pData.damageObject(%removeObjects[%i], 0, "0 0 0", 1000, $DamageType::VehicleSpawn); + } + else + { + %removeObjects[%i].mountable = 0; + %removeObjects[%i].startFade(1000, 0, true); + %removeObjects[%i].schedule(1001, "delete"); + %fadeTime = 1500; + } + } + // client has buyed a vehicle + %client.cantBuyVehicle = 1; + schedule(%fadeTime, 0, "createVehicle", %client, %station, %blockName, %team , %p, %rot, %angle); + // wait 6,5 seconds (time a vehicle needs to be created) before buying another vehicle + schedule(6500, 0, "resetBuyVehicle", %client); + } + else + MessageClient(%client, "", 'Can\'t create vehicle. A player is on the creation pad.'); + } + + else + messageClient(%client, "", "~wfx/misc/misc.error.wav"); + } + + else + messageClient(%client, "", "~wfx/misc/misc.error.wav"); +} + +// resetBuyVehicle(%client) +// Info: delete the variable, so client can buy another vehicle +function resetBuyVehicle(%client) +{ + %client.cantBuyVehicle = ""; +} + +// END VEHICLE STATION SPAM FIX + + +// ShapeBase::throwObject(%this,%obj) +// Info: Delay on calculating flag stats +function ShapeBase::throwObject(%this,%obj) +{ + // z0dd - ZOD, 4/15/02. Allow respawn switching during tourney wait. + if(!$MatchStarted) + return; + + // z0dd - ZOD, 5/26/02. Remove anti-hover so flag can be thrown properly + if(%obj.getDataBlock().getName() $= "Flag") + { + %obj.static = false; + // z0dd - ZOD - SquirrelOfDeath, 10/02/02. Hack for flag collision bug. + if(Game.Class $= CTFGame || Game.Class $= PracticeCTFGame) + %obj.searchSchedule = Game.schedule(10, "startFlagCollisionSearch", %obj); + } + + %srcCorpse = (%this.getState() $= "Dead"); // z0dd - ZOD, 4/14/02. Flag tossed from corpse + + //if the object is being thrown by a corpse, use a random vector + if (%srcCorpse && %obj.getDataBlock().getName() !$= "Flag") // z0dd - ZOD, 4/14/02. Except for flags.. + { + %vec = (-1.0 + getRandom() * 2.0) SPC (-1.0 + getRandom() * 2.0) SPC getRandom(); + %vec = vectorScale(%vec, 10); + } + else // else Initial vel based on the dir the player is looking + { + %eye = %this.getEyeVector(); + %vec = vectorScale(%eye, 20); + } + + // Add a vertical component to give the item a better arc + %dot = vectorDot("0 0 1",%eye); + if (%dot < 0) + %dot = -%dot; + %vec = vectorAdd(%vec,vectorScale("0 0 12",1 - %dot)); // z0dd - ZOD, 9/10/02. 10 was 8 + + // Add player's velocity + %vec = vectorAdd(%vec,%this.getVelocity()); + %pos = getBoxCenter(%this.getWorldBox()); + + //since flags have a huge mass (so when you shoot them, they don't bounce too far) + //we need to up the %vec so that you can still throw them... + if (%obj.getDataBlock().getName() $= "Flag") + { + %vec = vectorScale(%vec, (%srcCorpse ? 40 : 75)); // z0dd - ZOD, 4/14/02. Throw flag force. Value was 40 + + // z0dd - ZOD, 9/27/02. Delay on grabbing flag after tossing it + %this.flagTossWait = true; + %this.schedule(1000, resetFlagTossWait); + + // Delay on calculating stats + %this.flagStatsWait = true; + %this.schedule(5000, resetFlagStatsWait); + } + + // + %obj.setTransform(%pos); + %obj.applyImpulse(%pos,%vec); + %obj.setCollisionTimeout(%this); + %data = %obj.getDatablock(); + + %data.onThrow(%obj, %this); + + //call the AI hook + AIThrowObject(%obj); +} + +// Player::resetFlagStatsWait(%this) +// Info: Delay on calculating the stats +function Player::resetFlagStatsWait(%this) +{ + %this.flagStatsWait = false; +} + + + +// Fix for observer vehicle bug, where observers are drawn to +// a vehicle no matter whether they are observing the client or not +// Thanks to MT for pointing out. +function resetObserveFollow( %client, %dismount ) +{ + if( %dismount ) + { + if( !isObject( %client.player ) ) + return; + + for( %i = 0; %i < %client.observeCount; %i++ ) + { + // Check if data in %client.observers[%i] is correct at all + if ( %client.observers[%i].clientObserve != %client ) + { + continue; + } + %client.observers[%i].camera.setOrbitMode( %client.player, %client.player.getTransform(), 0.5, 4.5, 4.5); + } + } + else + { + if( !%client.player.isMounted() ) + return; + + // grab the vehicle... + %mount = %client.player.getObjectMount(); + if( %mount.getDataBlock().observeParameters $= "" ) + %params = %client.player.getTransform(); + else + %params = %mount.getDataBlock().observeParameters; + + for( %i = 0; %i < %client.observeCount; %i++ ) + { + // Check if data in %client.observers[%i] is correct at all + if ( %client.observers[%i].clientObserve != %client ) + { + continue; + } + + %client.observers[%i].camera.setOrbitMode(%mount, %mount.getTransform(), getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 )); + } + } +} + +// ilys - Start checkSpeed schedule on MPB +function MobileBaseVehicle::onAdd(%this, %obj) +{ + Parent::onAdd(%this, %obj); + %obj.schedule(5000, "checkSpeed", %obj); +} + +// ilys - checkSpeed function. Kill the driver and MPB if going too fast. +function WheeledVehicle::checkSpeed(%data, %obj) +{ + if(VectorLen(%obj.getVelocity()) > 200) + { + if(%obj.getMountNodeObject(0)) %obj.getMountNodeObject(0).scriptKill(36); + %obj.setDamagelevel(4); + } + %obj.schedule(5000, "checkSpeed", %data, %obj); +} + +// ilys - No lava, please. +function StationVehiclePad::createStationVehicle(%data, %obj) +{ + %group = %obj.getGroup(); + %xform = %obj.getSlotTransform(0); + %position = getWords(%xform, 0, 2); + %rotation = getWords(%xform, 3, 5); + %angle = (getWord(%xform, 6) * 180) / 3.14159; + if(%obj.stationPos $= "" || %obj.stationRot $= "") + { + %pos = %position; + %rot = %rotation @ " " @ %angle; + } + else + { + %pos = %obj.stationPos; + %rot = %obj.stationRot; + } + %sv = new StaticShape() { + scale = "1 1 1"; + dataBlock = "StationVehicle"; + lockCount = "0"; + homingCount = "0"; + team = %obj.team; + position = %pos; + rotation = %rot; + }; + %group.add(%sv); + %sv.setPersistent(false); + %sv.getDataBlock().gainPower(%sv); + %sv.getDataBlock().createTrigger(%sv); + %sv.pad = %obj; + %obj.station = %sv; + %sv.trigger.mainObj = %obj; + %sv.trigger.disableObj = %sv; + if(%sv.getTarget() != -1) + setTargetSensorGroup(%sv.getTarget(), %obj.team); + if(%obj.scoutVehicle !$= "Removed") + %sv.vehicle[scoutvehicle] = true; + if(%obj.assaultVehicle !$= "Removed") + %sv.vehicle[assaultVehicle] = true; + if(%obj.mobileBaseVehicle !$= "Removed") + { + // ilys - Removed lava waterblock code from here + %sv.vehicle[mobileBasevehicle] = true; + %sv.getDataBlock().createTeleporter(%sv, %group); + } + if(%obj.scoutFlyer !$= "Removed") + %sv.vehicle[scoutFlyer] = true; + if(%obj.bomberFlyer !$= "Removed") + %sv.vehicle[bomberFlyer] = true; + if(%obj.hapcFlyer !$= "Removed") + %sv.vehicle[hapcFlyer] = true; +} + +// ilys - We dont do anything here now +function serverCmdClientTeamChange( %client ) +{ + // Don't do it, man. DON'T DO IT! +} + +// ilys - Only allow the client to force play when the match has started +function serverCmdClientJoinGame(%client) +{ + if(!$MatchStarted) return; + parent::serverCmdClientJoinGame(%client); +} + +function serverCmdPlayAnim(%client, %anim) +{ + // Not used in Classic +} + +// ilys - Do not allow animations inside a forcefield. +// ilys - Unmount the mortar and grenade launcher on animation. +function PlayAnim(%client, %anim) +{ + if( %anim $= "Death1" || %anim $= "Death2" || %anim $= "Death3" || %anim $= "Death4" || %anim $= "Death5" || + %anim $= "Death6" || %anim $= "Death7" || %anim $= "Death8" || %anim $= "Death9" || %anim $= "Death10" || + %anim $= "Death11" || %anim $= "sitting" || %anim $= "scoutRoot" || %anim $= "look" || %anim $= "lookms" || + %anim $= "looknw" || %anim $= "head" || %anim $= "headSide" || %anim $= "ski" || %anim $= "light_recoil") + return; + + %player = %client.player; + if(!isObject(%player)) + return; + if(%player.isMounted() || %player.isInForceField()) + return; + + %weapon = ( %player.getMountedImage($WeaponSlot) == 0 ) ? "" : %player.getMountedImage($WeaponSlot).getName().item; + if(%weapon $= "MissileLauncher" || %weapon $= "GrenadeLauncher" || %weapon $= "SniperRifle" || %weapon $= "Mortar") + { + %player.animResetWeapon = true; + %player.lastWeapon = %weapon; + %player.unmountImage($WeaponSlot); + %player.setArmThread(look); + } + %player.setActionThread(%anim); +} + +// ilys - Fix for the Standing Pilot bug +function Armor::onMount(%this,%obj,%vehicle,%node) +{ + if (%node == 0) + { + %obj.setTransform("0 0 0 0 0 1 0"); + %obj.setActionThread(%vehicle.getDatablock().mountPose[%node],true,true); + %obj.schedule(300,"setActionThread",%vehicle.getDatablock().mountPose[%node],true,true); + if(!%obj.inStation) %obj.lastWeapon = (%obj.getMountedImage($WeaponSlot) == 0 ) ? "" : %obj.getMountedImage($WeaponSlot).item; + %obj.unmountImage($WeaponSlot); + if(!%obj.client.isAIControlled()) + { + %obj.setControlObject(%vehicle); + %obj.client.setObjectActiveImage(%vehicle, 2); + } + if(%obj == %obj.lastVehicle.lastPilot && %obj.lastVehicle != %vehicle) + { + schedule(15000, %obj.lastVehicle,"vehicleAbandonTimeOut", %obj.lastVehicle); + %obj.lastVehicle.lastPilot = ""; + } + if(%vehicle.lastPilot !$= "" && %vehicle == %vehicle.lastPilot.lastVehicle) %vehicle.lastPilot.lastVehicle = ""; + %vehicle.abandon = false; + %vehicle.lastPilot = %obj; + %obj.lastVehicle = %vehicle; + if((%vehicle.getTarget() != -1) && %vehicle.getDatablock().cantTeamSwitch $= "") + { + setTargetSensorGroup(%vehicle.getTarget(), %obj.client.getSensorGroup()); + if( %vehicle.turretObject > 0 ) setTargetSensorGroup(%vehicle.turretObject.getTarget(), %obj.client.getSensorGroup()); + } + commandToClient( %obj.client, 'VehicleMount' ); + } + else + { + if(%vehicle.getDataBlock().mountPose[%node] !$= "") %obj.setActionThread(%vehicle.getDatablock().mountPose[%node]); + else %obj.setActionThread("root", true); + } + if(%vehicle.getDatablock().numMountPoints > 1) + { + %nodeName = findNodeName(%vehicle, %node); // function in vehicle.cs + for(%i = 0; %i < %vehicle.getDatablock().numMountPoints; %i++) + { + if (%vehicle.getMountNodeObject(%i) > 0) + { + if(%vehicle.getMountNodeObject(%i).client != %obj.client) + { + %team = (%obj.team == %vehicle.getMountNodeObject(%i).client.team ? 'Teammate' : 'Enemy'); + messageClient( %vehicle.getMountNodeObject(%i).client, 'MsgShowPassenger', '\c2%3: \c3%1\c2 has boarded in the \c3%2\c2 position.', %obj.client.name, %nodeName, %team ); + } + commandToClient( %vehicle.getMountNodeObject(%i).client, 'showPassenger', %node, true); + } + } + } + if ( %obj.getImageTrigger( $BackpackSlot ) ) %obj.setImageTrigger( $BackpackSlot, false ); + %obj.client.vehicleMounted = %vehicle; + AIVehicleMounted(%vehicle); + if(%obj.client.isAIControlled()) %this.AIonMount(%obj, %vehicle, %node); +} + +// TracerDX/ilys - Server crash exploit fix +function serverCmdTeamMessageSent(%client, %text) +{ + if((%client.voice $= "") && (strstr(%text, "~w") != -1) && (getSubStr(%text, (strlen(%text) - 4), 4) !$= ".wav")) return; + parent::serverCmdTeamMessageSent(%client, %text); +} + +function serverCmdMessageSent(%client, %text) +{ + if((%client.voice $= "") && (strstr(%text, "~w") != -1) && (getSubStr(%text, (strlen(%text) - 4), 4) !$= ".wav")) return; + parent::serverCmdMessageSent(%client, %text); +} + +// Fix a problem with the package system +// dropping the first package when a non-active +// package is deactivated +function DeactivatePackage(%this) +{ + if(!isActivePackage(%this)) return; + parent::DeactivatePackage(%this); +} + +}; + + +// Prevent package from being activated if it is already +if (!isActivePackage(AntiLouExploitFixes)) + activatePackage(AntiLouExploitFixes); diff --git a/Classic/scripts/autoexec/Autobalance.cs b/Classic/scripts/autoexec/Autobalance.cs index f55ca35..00165b4 100644 --- a/Classic/scripts/autoexec/Autobalance.cs +++ b/Classic/scripts/autoexec/Autobalance.cs @@ -27,26 +27,13 @@ function Autobalance( %game, %AutobalanceSafetynetTrys ) //Reset %lastclient1 = ""; %lastclient2 = ""; - - //Team Count code by Keen - $PlayerCount[0] = 0; - $PlayerCount[1] = 0; - $PlayerCount[2] = 0; - - for(%i = 0; %i < ClientGroup.getCount(); %i++) - { - %client = ClientGroup.getObject(%i); - - //if(!%client.isAIControlled()) - $PlayerCount[%client.team]++; - } //Difference Variables - %team1difference = $PlayerCount[1] - $PlayerCount[2]; - %team2difference = $PlayerCount[2] - $PlayerCount[1]; + %team1difference = $TeamRank[1, count] - $TeamRank[2, count]; + %team2difference = $TeamRank[2, count] - $TeamRank[1, count]; //If even, stop. - if( %team1difference == 1 || %team2difference == 1 || $PlayerCount[1] == $PlayerCount[2] ) + if( %team1difference == 1 || %team2difference == 1 || $TeamRank[1, count] == $TeamRank[2, count] ) { //Reset TBN ResetTBNStatus(); @@ -112,7 +99,8 @@ function Autobalance( %game, %AutobalanceSafetynetTrys ) // Fire Autobalance Game.clientChangeTeam( %client, %otherTeam, 0 ); - messageAll('MsgTeamBalanceNotify', '~wfx/powered/vehicle_screen_on.wav'); + messageClient(%client, 'MsgTeamBalanceNotify', "\c0You were switched to the other team for balancing.~wfx/powered/vehicle_screen_on.wav"); + messageAllExcept(%client, -1, 'MsgTeamBalanceNotify', "~wfx/powered/vehicle_screen_on.wav"); //Trigger GetCounts ResetGetCountsStatus(); diff --git a/Classic/scripts/autoexec/EnableLogs.cs b/Classic/scripts/autoexec/EnableLogs.cs new file mode 100644 index 0000000..8b48083 --- /dev/null +++ b/Classic/scripts/autoexec/EnableLogs.cs @@ -0,0 +1,61 @@ +$Host::ClassicAdminLog = 1; +$Host::ClassicConnectLog = 1; +//exec("scripts/autoexec/EnableLogs.cs"); + +//Enable Logs +setlogmode(1); + +// adminLog(%client, %msg) +// Info: Logs the admin events +function adminLog(%client, %msg) +{ + if(%client.isAdmin && $Host::ClassicAdminLog) + { + // get the client info + %authInfo = %client.getAuthInfo(); + %ip = getField(strreplace(%client.getAddress(),":","\t"),1); + + // this is the info that will be logged + $AdminLog = formatTimeString("M-d") SPC formatTimeString("[HH:nn]") SPC %client.nameBase @ " (" @ getField(%authInfo, 0) @ ", " @ %ip @ ", " @ %client.guid @ ", " @ %client.getAddress() @ ")" @ %msg SPC "[" @ $CurrentMission @ "]"; + + %logpath = $Host::ClassicAdminLogPath; + export("$AdminLog", %logpath, true); + logEcho($AdminLog); + echo($AdminLog); + } +} + +// connectLog(%client, %realname, %tag) +// Info: Logs the connections +function connectLog(%client, %isDisconnect) +{ + if($Host::ClassicConnectLog && !%client.isAIControlled()) + { + // get the client info + %authInfo = %client.getAuthInfo(); + %ip = getField(strreplace(%client.getAddress(),":","\t"),1); + + // net tournament client present? + if (!%client.t2csri_sentComCertDone) + %ntc = "N"; + else + %ntc = "Y"; + + if(%isDisconnect) + %inout = "[Drop]"; + else + %inout = "[Join]"; + + if(%client.isSmurf) + %name = stripChars( detag( getTaggedString( %client.name ) ), "\cp\co\c6\c7\c8\c9" ); + else + %name = %client.nameBase; + + $ConnectLog = %inout SPC "#P[" @ $HostGamePlayerCount @ "]" SPC formatTimeString("M-d") SPC formatTimeString("[HH:nn]") SPC %name SPC "(" @ getField(%authInfo, 0) @ "," SPC %client.guid @ "," SPC %ip @ ")" SPC "[" @ $CurrentMission @ "]" SPC "NTC[" @ %ntc @ "]"; + + %logpath = $Host::ClassicConnLogPath; + export("$ConnectLog", %logpath, true); + logEcho($ConnectLog); + echo($ConnectLog); + } +} \ No newline at end of file diff --git a/Classic/scripts/autoexec/EvoStats.cs b/Classic/scripts/autoexec/EvoStats.cs new file mode 100644 index 0000000..ae231f9 --- /dev/null +++ b/Classic/scripts/autoexec/EvoStats.cs @@ -0,0 +1,431 @@ +// Eolk - People like evo's stats a lot... so that's what we'll give them... +$weap_message[1] = "Blaster master"; +$weap_message[2] = "Plasma roaster"; +$weap_message[3] = "Chainwh0re"; +$weap_message[4] = "Disc-O-maniac"; +$weap_message[5] = "Grenade puppy"; +$weap_message[6] = "Laser turret"; +$weap_message[8] = "Mortar maniac"; +$weap_message[9] = "Missile lamer"; +$weap_message[10] = "Shocklance bee"; +$weap_message[11] = "Mine mayhem"; +$weap_message[13] = "Road killer"; +// Extra Stats +$weap_message[31] = "Demoman"; +$weap_message[21] = "Clamp Farmer"; +$weap_message[22] = "Spike Farmer"; +$weap_message[26] = "Shrike Gunner"; +$weap_message[27] = "Tailgunner"; +$weap_message[28] = "Bombardier"; +$weap_message[29] = "Tank Gunner (chain)"; +$weap_message[30] = "Tank Gunner (mortar)"; +$weap_message[31] = "Satchel Punk"; +$weap_message[50] = "Combo King (mine+disc)"; + +// Handlers +package EvoStatHandles +{ + +function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC) +{ + Parent::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC); + // call the function + if(!$Host::TournamentMode) + handleDamageStat(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC); +} + +function DefaultGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation) +{ + Parent::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation); + // call the function + if(!$Host::TournamentMode) + handleKillStat(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC); +} + +function ProjectileData::onCollision(%data, %projectile, %targetObject, %modifier, %position, %normal) +{ + if(isObject(%targetObject)) // Console spam fix. + { + // call the function + if(!$Host::TournamentMode) + handleMAStat(%data, %projectile, %targetObject, %modifier, %position, %normal); + } + Parent::onCollision( %data, %projectile, %targetObject, %modifier, %position, %normal ); +} + +}; + +// Prevent package from being activated if it is already +if (!isActivePackage(EvoStatHandles)) + activatePackage(EvoStatHandles); + +// handleDamageStat(%targetObject, %sourceObject, %position, %amount, %damageType) +// Info: Calcs: Damage and SnipeShot detection. +function handleDamageStat(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC) +{ + // Reject damage that is not player initiated. + if(%damageType == 7 || %damageType == 12 || %damageType == 14 || %damageType == 24 || %damageType == 25 || %damageType == 33 || %damageType == 35 || %damageType == 36 || %damageType == 98 || %damageType == 99) + return; + + // failsafe + if(!isObject(%sourceObject) || %sourceObject $= "" || !isObject(%targetObject) || %targetObject $= "") + return; + + // don't count damage done to vehicles + if(%targetObject.isMounted()) + return; + + // Vehicle Impacts. + if(%damageType == 13){ // run down by vehicle + if(!(%attacker = %sourceObject.getControllingClient()) > 0){ + return; + } + } + // Turrets. + else if(%sourceObject.getClassName() $= "Turret" || %sourceObject.getClassName() $= "VehicleTurret" || %sourceObject.getClassName() $= "FlyingVehicle" || %sourceObject.getClassName() $= "HoverVehicle"){ + // Controlled + %attacker = %sourceObject.getControllingClient(); //is turret being controlled? + if(%attacker == 0){ // Not controlled. + // Owned + if(isObject(%sourceObject.owner)){ + %attacker = %sourceObject.owner; + } + // Automated & no-owner. + else{ + return; + } + } + } else { // Pretty much anything else. + %attacker = %sourceObject.client; + } + + %victim = %targetObject.client; + + // failsafe + if(%attacker $= "" || %victim $= "" || %attacker $= %victim) + return; + + // check if it's a tk + if(Game.numTeams > 1 && %attacker.team $= %victim.team) + return; + + // store the damage + if($Host::ClassicStatsType == 2) + { + // Teratos: Going to add mine+disc as a category... + // Teratos: Tracking only gets the second batch of damage, but we add 85% of that to make up for the first batch of damage (just a dumb estimate so damage numbers look realistic in post-game). + if(%victim.mineDisc) { + //$stats::weapon_damage[%attacker, 50] += %amount + (%amount * (%damageType == 11 ? 0.87 : 1.41)); // Mine accounts for more than disc. + $stats::weapon_damage[%attacker, 50] += %amount + $stats::last_minedisc[%attacker]; + + if($stats::weapon_damage[%attacker, 50] > $stats::weap_table[50]) + { + $stats::weap_table[50] = $stats::weapon_damage[%attacker, 50]; + $stats::client_weap_table[50] = getTaggedString(%attacker.name); + } + } + $stats::last_minedisc[%attacker] = %amount; // Track the last amount of damage so we can add it to the mine+disc. + // Teratos: END Mine+Disc Support. + + $stats::weapon_damage[%attacker, %damageType] += %amount; + + if($stats::weapon_damage[%attacker, %damageType] > $stats::weap_table[%damageType]) + { + $stats::weap_table[%damageType] = $stats::weapon_damage[%attacker, %damageType]; + $stats::client_weap_table[%damageType] = getTaggedString(%attacker.name); + } + } + + // is it a laser damage? + if(%damageType == 6) + { + // i will consider only shots that have been fired with 60% of total energy + if(%sourceObject.getEnergyLevel() / %sourceObject.getDataBlock().maxEnergy < 0.6) + return; + + %distance = mFloor(VectorDist(%position, %sourceObject.getWorldBoxCenter())); + + // max distance for sniper (this is the only fix i could find) + // if(%distance > 1000) + // %distance = 1000; + + // is it an headshot? + if(%victim.headshot) + { + %attacker.hs++; + + if( ( %attacker.showMA $= "" ) || ( %attacker.showMA == 1 ) ) + bottomPrint(%attacker, "HEADSHOT (" @ %attacker.hs @ ")! Distance is " @ %distance @ " meters.", 3); + logEcho(%attacker.nameBase @" (pl "@%attacker.player@"/cl "@%attacker@") headshot ("@%distance@")"); + + if(%attacker.hs > $stats::snipe_counter) + { + $stats::snipe_counter = %attacker.hs; + $stats::snipe_client = getTaggedString(%attacker.name); + } + if(%distance > $stats::snipe_maxdistance) + { + $stats::snipe_maxdistance = %distance; + $stats::snipe_maxdistanceclient = getTaggedString(%attacker.name); + } + } + else // no + { + if(%attacker.showMA $= "" || %attacker.showMA) + bottomPrint(%attacker, "HIT! Distance is " @ %distance @ " meters.", 3); + + if(%distance > $stats::snipe_maxdistance) + { + $stats::snipe_maxdistance = %distance; + $stats::snipe_maxdistanceclient = getTaggedString(%attacker.name); + } + } + + // this callback will allow players to autoscreenshot the shot + messageClient(%attacker, 'MsgSnipeShot', "", %distance); + } +} + +// handleKillStat(%clVictim, %clKiller, %damageType, %implement) +// Info: Calcs: Kills, TeamKills, FC kills +function handleKillStat(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation) +{ + if(%damageType == 13) // is a roadkill + %clKiller = %implement.getControllingClient(); + + + if ( !isObject( %clVictim ) || !isObject( %clKiller ) ) + return; + + // failsafe + if(%clKiller $= "" || %clVictim $= "" || %clKiller $= %clVictim) + return; + + // is it a tk? + if(%game.numTeams > 1 && %clKiller.team $= %clVictim.team) + { + $stats::tk[%clKiller]++; + + if($stats::tk[%clKiller] > $stats::tk_counter) + { + $stats::tk_counter = $stats::tk[%clKiller]; + $stats::tk_client = getTaggedString(%clKiller.name); + } + } + else // no + { + if($Host::ClassicStatsType == 1) + { + $stats::weapon_kills[%clKiller, %damageType]++; + + if($stats::weapon_kills[%clKiller, %damageType] > $stats::weap_table[%damageType]) + { + $stats::weap_table[%damageType] = $stats::weapon_kills[%clKiller, %damageType]; + $stats::client_weap_table[%damageType] = getTaggedString(%clKiller.name); + } + } + + // was the victim a fc? + if(%clVictim.plyrDiedHoldingFlag) + { + $stats::fckiller[%clKiller]++; + + if($stats::fckiller[%clKiller] > $stats::fckiller_counter) + { + $stats::fckiller_counter = $stats::fckiller[%clKiller]; + $stats::fckiller_client = getTaggedString(%clKiller.name); + } + } + } +} + +// handleMAStat(%projectile, %targetObject, %position) +// Info: MA detection +function handleMAStat(%data, %projectile, %targetObject, %modifier, %position, %normal) +{ + // failsafe + if(!isObject(%targetObject) || %targetObject $= "") + return; + + // failsafe + if(!isObject(%projectile.sourceObject) || %projectile.sourceObject $= "") + return; + + %victim = %targetObject.client; + %killer = %projectile.sourceObject.client; + + // // Altair's method + // %distance = mFloor(VectorDist(%position, %projectile.sourceObject.getWorldBoxCenter())); + + // // Evolution Method + %distance = mFloor(VectorDist(%position, %projectile.initialPosition)); + + // failsafe + if(%victim $= "" || %killer $= "") + return; + + %projectileType = %data.getName() !$= "TR2DiscProjectile" ? %data.getName() : "DiscProjectile"; + + // only disc, plasma, or blaster + if(%projectileType !$= "DiscProjectile" && %projectileType !$= "PlasmaBolt" && %projectileType !$= "EnergyBolt") + return; + + // is it a tk? + if(Game.numTeams > 1 && %killer.team $= %victim.team) + return; + + // Eolk - changes to MA code + %position = %targetObject.getPosition(); + %raycast = containerRaycast(%position, vectorAdd(%position, "0 0 -10"), $TypeMasks::ForceFieldObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::StaticObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::VehicleObjectType, %targetObject); + if(!isObject(firstWord(%raycast))) // We've got something... + { + if(%projectileType $= "DiscProjectile") + { + %killer.midairs++; + + if( ( %killer.showMA $= "" ) || ( %killer.showMA == 1 ) ) + bottomPrint(%killer, "Midair Disk (" @ %killer.midairs @ ")! Distance is " @ %distance @ " meters.", 3); + + // this callback will allow players to autoscreenshot the MA + messageClient(%killer, 'MsgMidAir', "", %distance); + logEcho(%killer.nameBase @" (pl "@%killer.player@"/cl "@%killer@") hit a midair disc shot ("@%distance@")"); + + if(%killer.midairs > $stats::ma_counter) + { + $stats::ma_counter = %killer.midairs; + $stats::ma_client = getTaggedString(%killer.name); + } + + if(%distance > $stats::ma_maxdistance) + { + $stats::ma_maxdistance = %distance; + $stats::ma_maxdistanceclient = getTaggedString(%killer.name); + } + } + else if(%projectileType $= "PlasmaBolt") + { + %killer.PlaMA++; + + if ( ( %killer.showMA $= "" ) || ( %killer.showMA == 1 ) ) + bottomPrint(%killer, "Midair Plasma (" @ %killer.PlaMA @ ")! Distance is " @ %distance @ " meters.", 3); + + // this callback will allow players to autoscreenshot the MA + messageClient(%killer, 'MsgPlasmaMidAir', "", %distance); + logEcho(%killer.nameBase @" (pl "@%killer.player@"/cl "@%killer@") hit a midair plasma shot ("@%distance@")"); + + if(%killer.PlaMA > $stats::PlaMA_counter) + { + $stats::PlaMA_counter = %killer.PlaMA; + $stats::PlaMA_client = getTaggedString(%killer.name); + } + + if(%distance > $stats::PlaMA_maxdistance) + { + $stats::PlaMA_maxdistance = %distance; + $stats::PlaMA_maxdistanceclient = getTaggedString(%killer.name); + } + } + else if(%projectileType $= "EnergyBolt") + { + %killer.blaMA++; + + if( ( %killer.showMA $= "" ) || ( %killer.showMA == 1 ) ) + bottomPrint(%killer, "Midair Blaster (" @ %killer.blaMA @ ")! Distance is " @ %distance @ " meters.", 3); + + // this callback will allow players to autoscreenshot the MA + messageClient(%killer, 'MsgBlasterMidAir', "", %distance); + logEcho(%killer.nameBase @" (pl "@%killer.player@"/cl "@%killer@") hit a midair blaster shot ("@%distance@")"); + + if(%killer.blaMA > $stats::BlaMA_counter) + { + $stats::BlaMA_counter = %killer.BlaMA; + $stats::BlaMA_client = getTaggedString(%killer.name); + } + + if(%distance > $stats::BlaMA_maxdistance) + { + $stats::BlaMA_maxdistance = %distance; + $stats::BlaMA_maxdistanceclient = getTaggedString(%killer.name); + } + } + } +} + +// sendEvoDebriefing(%client) +// Info: Send Evo stats to the debriefing page +function sendEvoDebriefing(%client) +{ + // Eolk - Remove redundant checks + messageClient(%client, 'MsgDebriefAddLine', "", '\n%1 - %2', $MissionDisplayName, $MissionTypeDisplayName); + + if($stats::MaxGrabSpeed || $stats::grabs_counter || $stats::fckiller_counter || $stats::caps_counter || $stats::fastestCap) + { + messageClient(%client, 'MsgDebriefAddLine', "", '\nFLAG STATS'); + if($stats::fastestCap) + messageClient(%client, 'MsgDebriefAddLine', "", ' Fastest Cap %1 %2', $stats::fastcap_client, $stats::fastcap_time); + if($stats::MaxGrabSpeed) + messageClient(%client, 'MsgDebriefAddLine', "", ' Flaming Ass %1 %2 Kph!', $stats::Grabber, $stats::MaxGrabSpeed); + if($stats::caps_counter) + messageClient(%client, 'MsgDebriefAddLine', "", ' Cap Mastah %1 %2', $stats::caps_client, $stats::caps_counter); + if($stats::grabs_counter) + messageClient(%client, 'MsgDebriefAddLine', "", ' Grabz0r %1 %2', $stats::grabs_client, $stats::grabs_counter); + if($stats::fckiller_counter) + messageClient(%client, 'MsgDebriefAddLine', "", ' FC killer %1 %2', $stats::fckiller_client, $stats::fckiller_counter); + } + + if($stats::BlaMA_counter || $stats::ma_counter || $stats::PlaMA_counter) + { + messageClient(%client, 'MsgDebriefAddLine', "", '\nMID AIRCHAMPIONDISTANCE'); + + if($stats::ma_counter) + messageClient(%client, 'MsgDebriefAddLine', "", ' Disk %1 (%2) %3 (%4 mt)', $stats::ma_client, $stats::ma_counter, $stats::ma_maxdistanceclient, $stats::ma_maxdistance); + if($stats::PlaMA_counter) + messageClient(%client, 'MsgDebriefAddLine', "", ' Plasma %1 (%2) %3 (%4 mt)', $stats::PlaMA_client, $stats::PlaMA_counter, $stats::PlaMA_maxdistanceclient, $stats::PlaMA_maxdistance); + if($stats::BlaMA_counter) + messageClient(%client, 'MsgDebriefAddLine', "", ' Blaster %1 (%2) %3 (%4 mt)', $stats::BlaMA_client, $stats::BlaMA_counter, $stats::BlaMA_maxdistanceclient, $stats::BlaMA_maxdistance); + } + + if($stats::snipe_counter) + messageClient(%client, 'MsgDebriefAddLine', "", '\nHeadhunter %1 (%2)!', $stats::snipe_client, $stats::snipe_counter); + + if($stats::snipe_maxdistance) + { + %x = $stats::snipe_counter ? "" : "\n"; + messageClient(%client, 'MsgDebriefAddLine', "", '%3Longest Snipeshot is %1 meters by %2', $stats::snipe_maxdistance, $stats::snipe_maxdistanceclient, %x); + } + + for(%damageType = 1; %damageType < 51; %damageType++) + { + if(%damageType == 7 || %damageType == 12 || (%damageType > 13 && %damageType < 21) || %damageType == 23 || %damageType == 24 || %damageType == 25) { + continue; + } + if(%damageType > 31 && %damageType < 50) { + continue; + } + + if($stats::weap_table[%damageType] > 0) + { + if($Host::ClassicStatsType == 2) + { + if(!%message) + { + messageClient(%client, 'MsgDebriefAddLine', "", '\nTYPEPLAYERTOTAL DAMAGE'); + %message = 1; + } + messageClient(%client, 'MsgDebriefAddLine', "", ' %1 %2 %3', $weap_message[%damageType], $stats::client_weap_table[%damageType], mFormatFloat($stats::weap_table[%damageType], "%.2f")); + } + else if($Host::ClassicStatsType == 1) + { + if(!%message) + { + messageClient(%client, 'MsgDebriefAddLine', "", '\nTYPEPLAYERKILLS'); + %message = 1; + } + messageClient(%client, 'MsgDebriefAddLine', "", ' %1 %2 %3', $weap_message[%damageType], $stats::client_weap_table[%damageType], $stats::weap_table[%damageType]); + } + } + } + + if($stats::tk_counter) + messageClient(%client, 'MsgDebriefAddLine', "", '\nAnd the best teamkiller award goes to... %1 (%2)!', $stats::tk_client, $stats::tk_counter); +} diff --git a/Classic/scripts/autoexec/GetRandomMaps.cs b/Classic/scripts/autoexec/GetRandomMaps.cs deleted file mode 100644 index b6630e7..0000000 --- a/Classic/scripts/autoexec/GetRandomMaps.cs +++ /dev/null @@ -1,131 +0,0 @@ -// Get Random Maps Script -// -// Used by the Set Next Mission feature -// -// Random Set Next Mission maps -// Runs for SetNextMisssion (Random) and Map Repetition Checker -// Randomizes the maps available in the admin menu -// - -// This file is present -$GetRandomMapsLoaded = true; - -// getRandomMap - returns a random map without duplicates until all have been played. -// Script BY: DarkTiger -// set this to 1 to save rng list to continue where the server left off in case of server reset - -$rngListSave = 1; -$rngDebug = 1;//show echos for testing - -function getRandomMap(){ - // builds valid map list to pick from - for(%i = 0; %i < $HostMissionCount; %i++){ - %map = $HostMissionFile[%i]; - %FFA = $Host::MapFFA[%map, $CurrentMissionType]; - %Cycle =$Host::MapCycle[%map, $CurrentMissionType]; - %bot = $BotEnabled[%i]; - if(%FFA && %Cycle){ - if($Host::BotsEnabled){ - if(%bot) - %map[%c++] = %map; - } - else{ - %map[%c++] = %map; - } - } - } - %rng = getRSGN(1,%c,$CurrentMissionType); // use gameType as the id - if($rngDebug){error(%map[%rng] SPC %rng);} - return %map[%rng]; -} - -function getRSGN(%min,%max,%id){ - // This funciton is kind of like a random sequence generator but its done on the fly - // returns you a unique random number every time until max is reached - // id value is so it can be used in more then one place - // the id value can be function name that its used in or a number - // lastly it only for numbers between -1000 to 1000 see down below; - - if($rngListSave && isFile("rngLists/" @ %id @ ".cs") && !$rngIsLoaded[%id]){ - exec("rngLists/" @ %id @ ".cs"); - $rngIsLoaded[%id] = 1; - if($rngDebug){error("Loading Map RNG List =" SPC "rngLists/" @ %id @ ".cs");} - } - - if(%id $= ""){ - error("getRSG function call does not have an id value"); - return getRandom(%min,%max); - } - - %c = %min - 1; // skip counter - if(((%max - %min) - ($rng::Count[%id] - 1)) < 1) // reset if we cycled though all possable - { - $rng::Count[%id] = 1; // we dont reset to 0 becuae of the last number used - // change these numbers to expand range - for(%a = %min; %a <= %max; %a++) // this resets a wide range incase min max change for what ever reasion - { - $rng::List[%id,%a] = 0; // reset number list back to 0 - } - - $rng::List[%id,$rng::Last[%id]] = 1; // mark the last number used as in used after reset - } - - %rng = getRandom(%min,%max - $rng::Count[%id] ); // find random number - the total number we have done - - for(%i = %min; %i <= %max; %i++) // loop cycle though all possable numbers - { - if($rng::List[%id,%i]) // skip over ones that we have all ready used - { - continue; - } - %c++; // skip counter - - if(%rng == %c) // onces the skip counter matches the rng number we have landed on a valid number that we havent used yet - { - break; // kill the loop - } - } - - $rng::List[%id,%i] = 1;// this marks said number as used - $rng::Count[%id]++;// up are total used numbers - $rng::Last[%id] = %i; // for when the list resets it wont pick the same number twice - - if(%i > %max || %i < %min) - { // fail safe - return %max; - } - if($rngListSave){ - export( "$rng::*", "rngLists/" @ %id @ ".cs", false ); - } - return %i; // return the one we stoped on -} - -// Return random maps list for SetNextMission -// Primarily used in admin menus -function SetNextMapGetRandoms( %client ) -{ - %cyclecount = 1; - for(%i = 0; %i < 8; %i++) - { - $SetNextMissionMapSlot[%cyclecount] = getRandomMap(); - %cyclecount++; - } -} - -// Reset SetNextMission every map change -package ResetSetNextMission -{ - -function DefaultGame::gameOver(%game) -{ - Parent::gameOver(%game); - - //Reset SetNextMission Restore - $SetNextMissionRestore = ""; -} - -}; - -// Prevent package from being activated if it is already -if (!isActivePackage(ResetSetNextMission)) - activatePackage(ResetSetNextMission); \ No newline at end of file diff --git a/Classic/scripts/autoexec/MapRepetitionChecker.cs b/Classic/scripts/autoexec/MapRepetitionChecker.cs deleted file mode 100644 index e5cf0ec..0000000 --- a/Classic/scripts/autoexec/MapRepetitionChecker.cs +++ /dev/null @@ -1,119 +0,0 @@ -// Map Repetition Checker Script -// -// To help decrease the chances of a repeated map in the map rotation by correcting repeated maps thru script -// -// Runs at the beginning of every map change -// Keeps track of maps played (Last [$MRC::PastMapsDepth] Maps) -// If any are repeating it picks a new map -// -// $EvoCachedNextMission = "RoundTheMountain"; -// $EvoCachedNextMission = "Arrakis"; -// $EvoCachedNextMission = "RoundTheMountainLT"; -// $EvoCachedNextMission = "ArenaDomeDM"; - -// How many previous maps you want to compare TheNextCached Map to -$MRC::PastMapsDepth = 6; - -for(%x = 1; %x <= $MRC::PastMapsDepth; %x++) -{ - $MRC::PrevMap[%x] = ""; - //echo("PM" @ %x @ ": " @ $MRC::PrevMap[%x]); -} - -//Ran in MissionTypeOptions.cs -function MapRepetitionChecker( %game ) -{ - //Debug - //%MapRepetitionCheckerDebug = true; - - if(isEventPending($MapRepetitionSchedule)) - cancel($MapRepetitionSchedule); - - //Make sure GetRandomMaps.cs is present - if(!$GetRandomMapsLoaded) - return; - - if($EvoCachedNextMission $= "") - return; - - if(!$Host::TournamentMode && $Host::EnableMapRepetitionChecker) - { - //Do work - for(%x = 1; %x <= $MRC::PastMapsDepth; %x++) - { - if( $MRC::PrevMap[%x] !$= "" && $MRC::PrevMap[%x] $= $EvoCachedNextMission || $CurrentMission $= $EvoCachedNextMission ) - MapRepetitionCheckerFindRandom(); - } - - //Set vars - for(%x = $MRC::PastMapsDepth; %x >= 1; %x = %x - 1) - { - if(%x > 1) - { - if($MRC::PrevMap[%x - 1] !$= "") - $MRC::PrevMap[%x] = $MRC::PrevMap[%x - 1]; - } - else if(%x $= 1) - $MRC::PrevMap[%x] = $CurrentMission; - } - - //Debug - if(%MapRepetitionCheckerDebug) - { - for(%x = 1; %x <= $MRC::PastMapsDepth; %x++) - { - if( $MRC::PrevMap[%x] !$= "" ) - echo("PM" @ %x @ ": " @ $MRC::PrevMap[%x]); - } - } - } -} - -function MapRepetitionCheckerFindRandom(%redone) -{ - //Make sure GetRandomMaps.cs is present - if(!$GetRandomMapsLoaded) - return; - - //Backup - if(%redone $="") - $SetNextMissionRestore = $EvoCachedNextMission; - - //Do work - //getRandomMap() is in GetRandomMaps.cs - $EvoCachedNextMission = getRandomMap(); - - //Make sure new map still complies - %redo = 0; - for(%x = 1; %x <= $MRC::PastMapsDepth; %x++) - { - if($MRC::PrevMap[%x] !$= "" && $MRC::PrevMap[%x] $= $EvoCachedNextMission) - %redo = 1; - } - - //Make sure its within maplimits - %newmaplimits = $Host::MapPlayerLimits[$EvoCachedNextMission, $CurrentMissionType]; - %min = getWord(%newmaplimits,0); - %max = getWord(%newmaplimits,1); - if((%min > $AllPlayerCount || $AllPlayerCount > %max) && $AllPlayerCount > 2 ) - %redo = 1; - - if( %redo && %redone < 3 ) - { - %redone++; - MapRepetitionCheckerFindRandom(%redone); - } - else - { - error(formatTimeString("HH:nn:ss") SPC "Map Repetition Corrected from" SPC $SetNextMissionRestore SPC "to" SPC $EvoCachedNextMission @ "." ); - - //Admin Message Only - for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) - { - %cl = ClientGroup.getObject(%idx); - - if(%cl.isAdmin) - messageClient(%cl, 'MsgMapRepCorrection', '\crMap Repetition Corrected: Next mission set from %1 to %2.', $SetNextMissionRestore, $EvoCachedNextMission); - } - } -} \ No newline at end of file diff --git a/Classic/scripts/autoexec/MissionTypeOptions.cs b/Classic/scripts/autoexec/MissionTypeOptions.cs index c432067..0515b6c 100644 --- a/Classic/scripts/autoexec/MissionTypeOptions.cs +++ b/Classic/scripts/autoexec/MissionTypeOptions.cs @@ -43,21 +43,11 @@ function loadMissionStage2() $Host::HiVisibility = "0"; //always SPEED } - if(isEventPending($MapRepetitionSchedule)) - cancel($MapRepetitionSchedule); - - //Start MapRepetitionChecker - $MapRepetitionSchedule = schedule(20000, 0, "MapRepetitionChecker", %game); - //Siege NoBaseRape Fix if( $CurrentMissionType $= "Siege" ) - $Host::EvoNoBaseRapeEnabled = 0; + $Host::NoBaseRapeEnabled = 0; else - $Host::EvoNoBaseRapeEnabled = 1; - - //Fix for Lak to CTF transition (Uneven Teams) - if(Game.numTeams > 1 && ($TeamRank[1, count] > $TeamRank[2, count] + 2) && $previousMissionType $= "LakRabbit") - Game.setupClientTeams(); + $Host::NoBaseRapeEnabled = 1; parent::loadMissionStage2(); } diff --git a/Classic/scripts/autoexec/NoBaseRape.cs b/Classic/scripts/autoexec/NoBaseRape.cs new file mode 100644 index 0000000..36e672a --- /dev/null +++ b/Classic/scripts/autoexec/NoBaseRape.cs @@ -0,0 +1,42 @@ +package NoBaseRape +{ + +//From Evolution MOD +//Modified for our needs +function StaticShapeData::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType) +{ + //echo( %targetObject.getDataBlock().getClassName() ); + //echo( %targetObject.getDataBlock().getName() ); + + %targetname = %targetObject.getDataBlock().getName(); + + //Used on some maps to make invs invincible + if( $CurrentMission $= "SmallCrossing" || $CurrentMission $= "Bulwark") + { + if( %targetObject.invincible && %targetname $= "StationInventory" ) + { + //NBRAssetSound( %game, %sourceObject ); + return; + } + } + else if(!$Host::TournamentMode && $Host::NoBaseRapeEnabled && $Host::NoBaseRapePlayerCount > $TotalTeamPlayerCount) + { + if( %targetname $= "GeneratorLarge" || %targetname $= "StationInventory" || %targetname $= "SolarPanel" ) + { + //Notify only if asset is on other team + if( %targetObject.team !$= %sourceObject.team ) + { + NBRAssetSound( %game, %sourceObject ); + } + return; + } + } + + parent::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType); +} + +}; + +// Prevent package from being activated if it is already +if (!isActivePackage(NoBaseRape)) + activatePackage(NoBaseRape); \ No newline at end of file diff --git a/Classic/scripts/autoexec/NoBaseRapeNotify.cs b/Classic/scripts/autoexec/NoBaseRapeNotify.cs index 252efce..fc7542c 100644 --- a/Classic/scripts/autoexec/NoBaseRapeNotify.cs +++ b/Classic/scripts/autoexec/NoBaseRapeNotify.cs @@ -9,10 +9,10 @@ // Called in GetTeamCounts.cs function NBRStatusNotify( %game ) { - if( $CurrentMissionType $= "CTF" && $Host::EnableNoBaseRapeNotify && !$Host::TournamentMode && $Host::EvoNoBaseRapeEnabled ) + if( $CurrentMissionType $= "CTF" && $Host::EnableNoBaseRapeNotify && !$Host::TournamentMode && $Host::NoBaseRapeEnabled ) { //On - if( $Host::EvoNoBaseRapeClassicPlayerCount > $TotalTeamPlayerCount ) + if( $Host::NoBaseRapePlayerCount > $TotalTeamPlayerCount ) { if( $NBRStatus !$= "PLAYEDON" ) $NBRStatus = "ON"; @@ -64,9 +64,9 @@ if (!isActivePackage(ResetNBRNotify)) function NBRAssetSound( %game, %sourceObject ) { //Wont play again until the schedule is done - if(!isEventPending(%sourceObject.NBRAssetSoundSchedule) && $CurrentMissionType $= "CTF" && $Host::EnableNoBaseRapeNotify && !$Host::TournamentMode && $Host::EvoNoBaseRapeEnabled ) + if(!isEventPending(%sourceObject.NBRAssetSoundSchedule) && $CurrentMissionType $= "CTF" && $Host::EnableNoBaseRapeNotify && !$Host::TournamentMode && $Host::NoBaseRapeEnabled ) { - messageClient(%sourceObject.client, 'MsgNoBaseRapeNotify', '\c2No Base Rape is enabled until %1 players.', $Host::EvoNoBaseRapeClassicPlayerCount ); + messageClient(%sourceObject.client, 'MsgNoBaseRapeNotify', '\c2No Base Rape is enabled until %1 players.', $Host::NoBaseRapePlayerCount ); %sourceObject.NBRAssetSoundSchedule = schedule(10000, 0, "ResetNBRAssetSound", %sourceObject ); } } diff --git a/Classic/scripts/autoexec/ObserveFlag.cs b/Classic/scripts/autoexec/ObserveFlag.cs new file mode 100644 index 0000000..059b7da --- /dev/null +++ b/Classic/scripts/autoexec/ObserveFlag.cs @@ -0,0 +1,265 @@ +package PizzaThings +{ + +// function OptionsDlg::onWake(%this) +// { + // if(!$observeFlagBind) + // { + // $ObsRemapName[$ObsRemapCount] = "Obs First Flag"; + // $ObsRemapCmd[$ObsRemapCount] = "observeFirstFlag"; + // $ObsRemapCount++; + // $ObsRemapName[$ObsRemapCount] = "Obs Second Flag"; + // $ObsRemapCmd[$ObsRemapCount] = "observeSecondFlag"; + // $ObsRemapCount++; + + // $observeFlagBind = true; + // } + + // parent::onWake(%this); +// } + +// For Observe Flag +// From Evo +function Observer::onTrigger(%data, %obj, %trigger, %state) +{ + if (%state == 0 || %trigger > 5) + return; + + //first, give the game the opportunity to prevent the observer action + if (!Game.ObserverOnTrigger(%data, %obj, %trigger, %state)) + return; + + %client = %obj.getControllingClient(); + if (%client == 0) + return; + + switch$(%obj.mode) + { + case "followFlag": + if(!%client.observingFlag) + return; + + if(%trigger == 0) // press FIRE, switch to the other flag + { + if(%client.flagObserved == $TeamFlag[1]) + { + %otherFlag = $TeamFlag[2]; + %otherFlagTeam = 2; + } + else if(%client.flagObserved == $TeamFlag[2]) + { + %otherFlag = $TeamFlag[1]; + %otherFlagTeam = 1; + } + else + return; + + // the flag isn't carried + if(%otherFlag.carrier $= "") + observeFlag(%client, %otherFlag, 1, %otherFlagTeam); + else if(isObject(%otherFlag.carrier.client)) + observeFlag(%client, %otherFlag.carrier.client, 2, %otherFlagTeam); + } + else if(%trigger == 3) // press JET, switch to the other flag + { + if(%client.flagObserved == $TeamFlag[1]) + { + %otherFlag = $TeamFlag[2]; + %otherFlagTeam = 2; + } + else if(%client.flagObserved == $TeamFlag[2]) + { + %otherFlag = $TeamFlag[1]; + %otherFlagTeam = 1; + } + else + return; + + // the flag isn't carried + if(%otherFlag.carrier $= "") + observeFlag(%client, %otherFlag, 1, %otherFlagTeam); + else if(isObject(%otherFlag.carrier.client)) + observeFlag(%client, %otherFlag.carrier.client, 2, %otherFlagTeam); + } + else if(%trigger == 2) //press JUMP, stop observing flag + { + if(%client.observeClient != -1) + { + observerFollowUpdate(%client, -1, false); + messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name); + %client.observeClient = -1; + } + %obj.mode = "observerFly"; + %obj.setFlyMode(); + updateObserverFlyHud(%client); + %client.observingFlag = false; + %client.flagObserved = ""; + %client.flagObsTeam = ""; + } + + default: + Parent::onTrigger(%data, %obj, %trigger, %state); + } +} + +}; + +// Prevent package from being activated if it is already +if (!isActivePackage(PizzaThings)) + activatePackage(PizzaThings); + +function serverCmdObserveFirstFlag(%client) +{ + // works only for CTF + if(Game.class !$= CTFGame) + return; + + // client must be an observer + if(%client.team > 0) + return; + + // check if the flag is carried by someone + %player = $TeamFlag[1].carrier; + + if($TeamFlag[1].isHome || %player $= "") + observeFlag(%client, $TeamFlag[1], 1, 1); + else + observeFlag(%client, %player.client, 2, 1); +} + +function serverCmdObserveSecondFlag(%client) +{ + // works only for CTF + if(Game.class !$= CTFGame) + return; + + // client must be an observer + if(%client.team > 0) + return; + + // check if the flag is carried by someone + %player = $TeamFlag[2].carrier; + + if($TeamFlag[2].isHome || %player $= "") + observeFlag(%client, $TeamFlag[2], 1, 2); + else + observeFlag(%client, %player.client, 2, 2); +} + +function observeFlag(%client, %target, %type, %flagTeam) +{ + if(!isObject(%client) || !isObject(%target) || !isObject(%client.camera)) + return; + + if(Game.class !$= CTFGame) + return; + + if(%client.team > 0) + return; + + // cancel any scheduled update + if(isEventPending(%client.obsHudSchedule)) + cancel(%client.obsHudSchedule); + + // must be an observer when observing other clients + if(%client.getControlObject() != %client.camera) + return; + + //can't observer yourself + if(%client == %target) + return; + + %count = ClientGroup.getCount(); + + //can't go into observer mode if you're the only client + if(%count <= 1 && %type != 1) + return; + + if(%type == 1) // Flag + { + if(isObject(%client.player)) + %client.player.scriptKill(0); // the player is still playing (this shouldn't be happen) + + %client.camera.getDataBlock().setMode(%client.camera, "followFlag", $TeamFlag[%flagTeam]); + %client.setControlObject(%client.camera); + clearBottomPrint(%client); + + // was the client observing a player before? + if(%client.observeClient != -1) + { + observerFollowUpdate(%client, -1, false); + messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name); + %client.observeClient = -1; + } + } + else // Player + { + // make sure the target actually exists + if(%target > 0) + { + %found = false; + for(%i = 0; %i < %count; %i++) + { + if(ClientGroup.getObject(%i) == %target) + { + %found = true; + break; + } + } + if(!%found) + return; + } + + if(isObject(%client.player)) + %client.player.scriptKill(0); // the player is still playing (this shouldn't be happen) + + observerFollowUpdate(%client, %target, true); + displayObserverHud(%client, %target); + messageClient(%target, 'Observer', '\c1%1 is now observing you.', %client.name); + + // was the client observing a player before? + if(%client.observeClient != -1) + messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name); + %client.camera.getDataBlock().setMode(%client.camera, "observerFollow", %target.player); + %client.setControlObject(%client.camera); + %client.observeClient = %target; + } + + //clear the observer fly mode var... + %client.observeFlyClient = -1; + %client.observingFlag = true; + %client.flagObserved = $TeamFlag[%flagTeam]; + %client.flagObsTeam = %flagTeam; +} + +// function observeFirstFlag() +// { + // commandToServer('ObserveFirstFlag'); +// } + +// function observeSecondFlag() +// { + // commandToServer('ObserveSecondFlag'); +// } + +// function sendPizzaHudUpdate(%game, %client, %msg) +// { + // %pizzaOptMask = 0; + // if($RandomTeams == 1) %pizzaOptMask += 1; + // if($Host::ClassicFairTeams == 1) %pizzaOptMask += 2; + // if($Host::ClassicAutoPWEnabled == 1) %pizzaOptMask += 4; + // if($Host::EvoFullServerPWEnabled == 1) %pizzaOptMask += 8; + // if($Host::EvoNoBaseRapeEnabled == 1) %pizzaOptMask += 16; + // if($PizzaHudRestartVar == 1) %pizzaOptMask += 32; + // messageClient(%client, 'UpdatePizzaHud', %msg, %pizzaOptMask, %client.isAdmin + %client.isSuperAdmin); +// } + +// function serverCmdRegisterPizzaClient(%client) +// { + // if(!%client.pizza) + // { + // %client.pizza = true; + // %msg = "\c2Pizza Client registered."; + // sendPizzaHudUpdate(%game, %client, %msg); + // } +// } \ No newline at end of file diff --git a/Classic/scripts/autoexec/TacoOverrides.cs b/Classic/scripts/autoexec/TacoOverrides.cs index b480c24..31b3c3a 100644 --- a/Classic/scripts/autoexec/TacoOverrides.cs +++ b/Classic/scripts/autoexec/TacoOverrides.cs @@ -103,22 +103,6 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am Parent::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC); } -//Admin Next Mission Message at beginning of matches -function DefaultGame::startMatch(%game) -{ - Parent::startMatch(%game); - - for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) - { - %cl = ClientGroup.getObject(%idx); - - if(%cl.isAdmin) - { - messageClient( %cl, 'MsgNotifyEvoNextMission', '\crNext Mission: %1', $EvoCachedNextMission); - } - } -} - }; // Prevent package from being activated if it is already diff --git a/Classic/scripts/autoexec/TeamBalanceNotify.cs b/Classic/scripts/autoexec/TeamBalanceNotify.cs index e9ad516..01200f9 100644 --- a/Classic/scripts/autoexec/TeamBalanceNotify.cs +++ b/Classic/scripts/autoexec/TeamBalanceNotify.cs @@ -14,7 +14,7 @@ // Called in GetTeamCounts.cs function TeamBalanceNotify( %game, %team1difference, %team2difference ) { - if( ($CurrentMissionType $= "CTF" || $CurrentMissionType $= "sctf") && $TotalTeamPlayerCount !$= 0 && !$Host::TournamentMode ) + if( Game.numTeams > 1 && $TotalTeamPlayerCount !$= 0 && !$Host::TournamentMode ) { //echo ("%Team1Difference " @ %Team1Difference); //echo ("%Team2Difference " @ %Team2Difference); diff --git a/Classic/scripts/autoexec/VoteMenu.cs b/Classic/scripts/autoexec/VoteMenu.cs new file mode 100644 index 0000000..01182bc --- /dev/null +++ b/Classic/scripts/autoexec/VoteMenu.cs @@ -0,0 +1,1572 @@ +//$Host::AllowAdmin2Admin = 0; +//$Host::AllowAdminBan = 0; +//$Host::AllowAdminVotes = 1; +//$Host::AllowAdminStopVote = 1; +//$Host::AllowAdminPassVote = 1; +//$Host::AllowMapScript = "True"; +//$Host::AllowPlayerVoteChangeMission = 1; +//$Host::AllowPlayerVoteSkipMission = 1; +//$Host::AllowPlayerVoteTimeLimit = 1; +//$Host::AllowPlayerVoteTournamentMode = 1; + +$DefaultTimeLimit = $Host::TimeLimit; + +// These have been secured against all those wanna-be-hackers. +$VoteMessage["VoteAdminPlayer"] = "Admin Player"; +$VoteMessage["VoteKickPlayer"] = "Kick Player"; +$VoteMessage["BanPlayer"] = "Ban Player"; +$VoteMessage["VoteChangeMission"] = "change the mission to"; +$VoteMessage["VoteTeamDamage", 0] = "enable team damage"; +$VoteMessage["VoteTeamDamage", 1] = "disable team damage"; +$VoteMessage["VoteTournamentMode"] = "change the server to"; +$VoteMessage["VoteFFAMode"] = "change the server to"; +$VoteMessage["VoteChangeTimeLimit"] = "change the time limit to"; +$VoteMessage["VoteMatchStart"] = "start the match"; +$VoteMessage["VoteGreedMode", 0] = "enable Hoard Mode"; +$VoteMessage["VoteGreedMode", 1] = "disable Hoard Mode"; +$VoteMessage["VoteHoardMode", 0] = "enable Greed Mode"; +$VoteMessage["VoteHoardMode", 1] = "disable Greed Mode"; +// z0dd - ZOD, 5/13/03. Added vote Random, Fair teams and armor limiting +$VoteMessage["VoteRandomTeams", 0] = "enable random teams"; +$VoteMessage["VoteRandomTeams", 1] = "disable random teams"; +$VoteMessage["VoteFairTeams", 0] = "enable fair teams"; +$VoteMessage["VoteFairTeams", 1] = "disable fair teams"; +$VoteMessage["VoteArmorLimits", 0] = "enable armor limiting"; +$VoteMessage["VoteArmorLimits", 1] = "disable armor limiting"; +$VoteMessage["VoteAntiTurtleTime"] = "change the anti turtle time to"; +$VoteMessage["VoteArmorClass"] = "change the armor class to"; +$VoteMessage["VoteClearServer"] = "clear server for match"; +$VoteMessage["VoteSkipMission"] = "skip the mission"; +$VoteMessage["ForceVote"] = "Admin Subscreen"; +$VoteMessage["CancelMatchStart"] = "Cancel Match Start"; +$VoteMessage["passRunningVote"] = "Pass Running Vote"; +$VoteMessage["stopRunningVote"] = "Stop Running Vote"; +$VoteMessage["ToggleTourneyNetClient"] = "Toggle TourneyNetClient"; +$VoteMessage["TogglePUGpassword"] = "Toggle PUGpassword"; +$VoteMessage["showServerRules"] = "Show Server Rules"; +$VoteMessage["DMSLOnlyMode"] = "Shocklance Only Deathmatch"; + +package ExtraVoteMenu +{ + +function DefaultGame::evalVote(%game, %typeName, %admin, %arg1, %arg2, %arg3, %arg4) +{ + switch$(%typeName) + { + case "voteChangeMission": + %game.voteChangeMission(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteTeamDamage": + %game.voteTeamDamage(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteTournamentMode": + %game.voteTournamentMode(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteMatchStart": + %game.voteMatchStart(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteFFAMode": + %game.voteFFAMode(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteChangeTimeLimit": + %game.voteChangeTimeLimit(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteResetServer": + %game.voteResetServer(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteKickPlayer": + %game.voteKickPlayer(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteAdminPlayer": + %game.voteAdminPlayer(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteGreedMode": + %game.voteGreedMode(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteHoardMode": + %game.voteHoardMode(%admin, %arg1, %arg2, %arg3, %arg4); + + // z0dd - ZOD, 5/23/03. Added vote for Random, Fair teams and armor limiting + case "voteRandomTeams": + %game.voteRandomTeams(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteFairTeams": + %game.voteFairTeams(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteArmorLimits": + %game.voteArmorLimits(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteClearServer": + %game.voteClearServer(%admin, %arg1, %arg2, %arg3, %arg4); + + case "voteSkipMission": + %game.voteSkipMission(%admin, %arg1, %arg2, %arg3, %arg4); + + case "cancelMatchStart": + %game.cancelMatchStart(%admin, %arg1, %arg2, %arg3, %arg4); + + case "passRunningVote": + %game.passRunningVote(%admin, %arg1, %arg2, %arg3, %arg4); + + case "stopRunningVote": + %game.stopRunningVote(%admin, %arg1, %arg2, %arg3, %arg4); + + default: + Parent::evalVote(%game, %typeName, %admin, %arg1, %arg2, %arg3, %arg4); + } +} + +function playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting, %teamSpecific) +{ + if(!%teamSpecific) // isn't a team specific vote (kick) + { + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + messageClient(%cl, 'openVoteHud', "", %clientsVoting, ($Host::VotePassPercent / 100)); + } + } + else // is a team specific vote (kick) + { + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(%cl.team == %client.team && !%cl.isAIControlled()) + messageClient(%cl, 'openVoteHud', "", %clientsVoting, ($Host::VotePassPercent / 100)); + } + } + clearVotes(); + Game.voteType = %typeName; + Game.scheduleVote = schedule(($Host::VoteTime * 1000), 0, "calcVotes", %typeName, %arg1, %arg2, %arg3, %arg4); + Game.scheduleVoteArgs[typename] = %typename; + Game.scheduleVoteArgs[arg1] = %arg1; + Game.scheduleVoteArgs[arg2] = %arg2; + Game.scheduleVoteArgs[arg3] = %arg3; + Game.scheduleVoteArgs[arg4] = %arg4; + %client.vote = true; + messageAll('addYesVote', ""); + if(%client.team != 0) + clearBottomPrint(%client); + + %client.canVote = false; + %client.rescheduleVote = schedule(($Host::voteSpread * 1000) + ($Host::voteTime * 1000) , 0, "resetVotePrivs", %client); + + %VoteSoundRandom = getRandom(1,100); + $VoteSoundRandom = %VoteSoundRandom; + $VoteSoundSchedule = schedule(10000, 0, "VoteSound", %game, %typename, %arg1, %arg2, %VoteSoundRandom); +} + +function DefaultGame::sendGameVoteMenu(%game, %client, %key) +{ + %isAdmin = (%client.isAdmin || %client.isSuperAdmin); + %multipleTeams = %game.numTeams > 1; + + // ******************************************** + // Admin Vote For ... Submenu + // ******************************************** + if (!$Host::TournamentMode) + { + if (%client.ForceVote > 0) + %client.ForceVote = %client.ForceVote - 1; + + if (%client.ForceVote > 0) + { + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'change server to Tournament.', 'Vote Tournament Mode'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Vote to Change the Mission'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteSkipMission', 'skip the mission to', 'Vote to Skip Mission' ); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Vote to Change the Time Limit'); + messageClient(%client, 'MsgVoteItem',"", %key, 'ForceVote', 'Cancel Force Vote', "Cancel 'Vote To...'"); + return; // Display no further vote options + } + } + // TEAM OPTIONS + if(!$Host::TournamentMode) + { + if(%client.team != 0) // he isn't an observer + { + if(%multipleTeams) + messageClient(%client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Change your Team'); + + if($MatchStarted) + messageClient(%client, 'MsgVoteItem', "", %key, 'MakeObserver', "", 'Become an Observer'); + } + } + else if(%client.isAdmin) // only admins can change team during tournament mode + { + if(%client.team != 0) // he isn't an observer + { + if(%multipleTeams) + messageClient(%client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Change your Team'); + + messageClient(%client, 'MsgVoteItem', "", %key, 'MakeObserver', "", 'Become an Observer'); + } + } + if(!%client.canVote && !%isAdmin) + return; + + if(%game.scheduleVote $= "") + { + if(!%client.isAdmin) + { + if(!$Host::TournamentMode) + { + if($Host::AllowPlayerVoteChangeMission) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Vote to Change the Mission'); + if($Host::AllowPlayerVoteTournamentMode) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'Change server to Tournament.', 'Vote Tournament Mode'); + if($Host::AllowPlayerVoteTimeLimit) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Vote to Change the Time Limit'); + if($Host::AllowPlayerVoteSkipMission) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteSkipMission', 'skip the mission to', 'Vote to Skip Mission' ); + + //if(%multipleTeams && $Host::AllowPlayerVoteTeamDamage) + //{ + //if($teamDamage) + //messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage'); + //else + //messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Vote to Enable Team Damage'); + //} + //if($CurrentMissionType !$= TR2) // z0dd - ZOD, 5/23/03. Added vote for Random teams + //{ + //if ( $RandomTeams ) + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'disable random teams', 'Vote to Disable Random Teams' ); + //else + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'enable random teams', 'Vote to Enable Random Teams' ); + //} + } + else + { + if(!$MatchStarted && !$CountdownStarted) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteMatchStart', 'Start Match', 'Vote to Start the Match'); + + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Vote to Change the Mission'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Vote Free For All Mode'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Vote to Change the Time Limit'); + + if(%multipleTeams) + { + if($teamDamage) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage'); + else + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Vote to Enable Team Damage'); + } + } + } + else + { + if(!$Host::TournamentMode) + { + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'Change server to Tournament.', 'Tournament Mode'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Change the Mission'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteSkipMission', 'skip the mission to', 'Skip the Mission' ); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Change the Time Limit'); + + if( $Host::AllowAdminVotes ) + messageClient(%client, 'MsgVoteItem', "", %key, 'ForceVote', 'Vote to ...', 'Vote to ...'); + } + else + { + if(!$MatchStarted && !$CountdownStarted) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteMatchStart', 'Start Match', 'Start Match'); + if(!$MatchStarted && $CountdownStarted) + messageClient(%client, 'MsgVoteItem', "", %key, 'cancelMatchStart', 'Cancel Match Start', 'Cancel Match Start'); + + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Change the Mission'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Free For All Mode'); + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Change the Time Limit'); + + if($Host::Password !$= "") + messageClient(%client, 'MsgVoteItem', "", %key, 'TogglePUGpassword', 'Disable PUG Password', 'Disable PUG Password'); + else + messageClient(%client, 'MsgVoteItem', "", %key, 'TogglePUGpassword', 'Enable PUG Password', 'Enable PUG Password'); + } + if(%multipleTeams) + { + if($teamDamage) + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Disable Team Damage'); + else + messageClient(%client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Enable Team Damage'); + + //if($CurrentMissionType !$= TR2) // z0dd - ZOD, 5/23/03. Added vote for Random teams + //{ + //if ( $RandomTeams ) + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'disable random teams', 'Disable Random Teams' ); + //else + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'enable random teams', 'Enable Random Teams' ); + //} + } + + //Toggle Tournament Net Client + if(%client.isAdmin && $Host::EnableNetTourneyClient) + messageClient( %client, 'MsgVoteItem', "", %key, 'ToggleTourneyNetClient', 'Disable Tournament Net Client', "Disable Tournament Net Client" ); + else if(%client.isAdmin) + messageClient( %client, 'MsgVoteItem', "", %key, 'ToggleTourneyNetClient', 'Enable Tournament Net Client', "Enable Tournament Net Client" ); + + } + + if ($Host::ServerRules[1] !$= "" ) + { + messageClient( %client, 'MsgVoteItem', "", %key, 'showServerRules', 'show server rules', "Show Server Rules" ); + } + + //messageClient( %client, 'MsgVoteItem', "", %key, 'showNextMission', 'show next mission', "Show Next Mission" ); + } + else + { + if(%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminStopVote)) // allow admins to stop votes + { + messageClient(%client, 'MsgVoteItem', "", %key, 'stopRunningVote', 'stop current vote', 'Stop the Vote'); + } + + if (%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminPassVote) ) + { + messageClient( %client, 'MsgVoteItem', "", %key, 'passRunningVote', 'pass current vote', 'Pass the Vote'); + } + } + // Admin only options: + if ( %client.isAdmin ) + { + //if ( $LimitArmors ) + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteArmorLimits', 'disable armor limiting', 'Disable armor limits' ); + //else + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteArmorLimits', 'enable armor limiting', 'Enable armor limits' ); + + // ----------------------------------------------------------------------------- + // z0dd - ZOD, 5/12/02. Add bot menu for admins + //%totalSlots = $Host::maxPlayers - ($HostGamePlayerCount + $HostGameBotCount); + //if( $HostGameBotCount > 0 && %totalSlots > 0) + //messageClient( %client, 'MsgVoteItem', "", %key, 'Addbot', "", 'Add a Bot' ); + // ----------------------------------------------------------------------------- + } +} + +function serverCmdStartNewVote(%client, %typeName, %arg1, %arg2, %arg3, %arg4, %playerVote) +{ + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + + %typePass = true; + + // if not a valid vote, turn back. + // z0dd - ZOD, 5/13/03. Added vote Random, Fair teams, armor limting, Anti-Turtle and Armor Class + if($VoteMessage[%typeName] $= "" && ( %typeName !$= "VoteTeamDamage" && %typeName !$= "VoteHoardMode" + && %typeName !$= "VoteGreedMode" && %typeName !$= "VoteRandomTeams" + && %typeName !$= "VoteFairTeams" && %typeName !$= "VoteArmorLimits" + && %typeName !$= "VoteAntiTurtleTime" && %typeName !$= "VoteArmorClass" + && %typeName !$= "VoteChangeMission" && %typeName !$= "VoteSkipMission" + && %typeName !$= "VoteKickPlayer" && %typeName !$= "BanPlayer" + && %typeName !$= "VoteFFAMode" && %typeName !$= "VoteTournamentMode" + && %typeName !$= "ForceVote" && %typeName !$= "VoteSkipMission" + && %typeName !$= "VoteClearServer")) { + + %typePass = false; + } + + if(( $VoteMessage[ %typeName, $TeamDamage ] $= "" && %typeName $= "VoteTeamDamage" )) + %typePass = false; + + if( !%typePass ) + return; // -> bye ;) + + %isAdmin = (%client.isAdmin || %client.isSuperAdmin); + if(!%client.canVote && !%isAdmin) + return; + + // Sinbinned players cannot take action + if ( %client.SinBinned ) + return; + + %clientsVoting = 0; + + // z0dd - ZOD, 5/19/03. Get the Admins client. + if(%isAdmin) + $AdminCl = %client; + + // Is this a tricon style call + if ( TriconWrapper( %client, %arg1, %typename ) ) + return; + + switch$(%typename) + { + case "VoteKickPlayer": + if(%isAdmin && %client != %arg1) // client is an admin and the player to kick isn't the player himself + { + if(!%client.isSuperAdmin && %arg1.isAdmin) // only super admins can kick admins + { + messageClient(%client, '', '\c2You can not kick %1, %2 is an Admin!', %arg1.name, %arg1.sex $= "Male" ? 'he' : 'she'); + return; + } + Game.kickClientName = %arg1.name; + kick(%arg1, %client, %arg1.guid); // kick the player without entering the vote process + %authInfo = %arg1.getAuthInfo(); + adminLog(%client, " kicked " @ %arg1.nameBase @ "( " @ getField(%authInfo, 0) @ ", " @ getField(%authInfo, 1) @ ", " @ %arg1.guid @ ", " @ %arg1.getAddress() @ ")"); + } + else // normal vote + { + if(%arg1.isAdmin) // don't let players to kick admins + { + messageClient(%client, '', '\c2You can not kick %1, %2 is an Admin!', %arg1.name, %arg1.sex $= "Male" ? 'he' : 'she'); + return; + } + if(%client.team != %arg1.team && %arg1.team != 0) // kick works only with teammates or observers + { + messageClient(%client, '', '\c2Kick votes must be team based.'); + return; + } + if(Game.scheduleVote !$= "") // a vote is already in progress + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + Game.kickClient = %arg1; + Game.kickClientName = %arg1.name; + Game.kickGuid = %arg1.guid; + Game.kickTeam = %arg1.team; + if(%arg1.team != 0 && Game.numTeams > 1) + { + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + + if (%cl.isAdmin == true || (%cl.team == %client.team && !%cl.isAIControlled())) + { + if(%cl.isAdmin == true && %cl.team !$= %client.team) + { + messageClient(%cl, 'AdminOtherTeamKickVoteStarted', '\c2%1 has initiated a vote to kick %2 on the other team.~wgui/objective_notification.wav', %client.name, %arg1.name); + } + else + messageClient( %cl, 'VoteStarted', '\c2%1 initiated a vote to %2 %3.', %client.name, "kick player", %arg1.name); + + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting, true); + } + else + { + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 %3.', %client.name, "kick player", %arg1.name); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + } + + case "BanPlayer": + if((%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminBan)) && %client != %arg1) // only admins can use ban + { + if(!%client.isSuperAdmin && %arg1.isAdmin) // only super admins can ban admins + { + messageClient(%client, '', '\c2You can not ban %1, %2 is an Admin!', %arg1.name, %arg1.sex $= "Male" ? 'he' : 'she'); + return; + } + ban(%arg1, %client); // ban the player without entering the vote process + %authInfo = %arg1.getAuthInfo(); + adminLog(%client, " banned " @ %arg1.nameBase @ "( " @ getField(%authInfo, 0) @ ", " @ getField(%authInfo, 1) @ ", " @ %arg1.guid @ ", " @ %arg1.getAddress() @ ")"); + } + + case "VoteAdminPlayer": + if((%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdmin2Admin)) && %client != %arg1) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " made " @ %arg1.nameBase @ " an Admin."); + } + else if($Host::allowAdminPlayerVotes) // normal vote + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 %3.', %client.name, "admin player", %arg1.name); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteChangeMission": + if(%isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " changed the mission to " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else if($Host::TournamentMode || (!$Host::TournamentMode && $Host::AllowPlayerVoteChangeMission)) + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %mission = $HostMissionFile[%arg3]; + %missionType = $HostTypeName[%arg4]; + if(!checkMapExist(%mission, %missionType)) + return; // map doesn't exist + + if(!$Host::TournamentMode && $Host::MapFFA[%mission, %missionType] !$= "" && $Host::MapFFA[%mission, %missionType] == 0) + return; // is FFA, but the map can't be played in FFA + + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 %3 (%4).', %client.name, "change the mission to", %arg1, %arg2); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteSkipMission": + if(%isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " skipped the mission."); + } + else if($Host::TournamentMode || (!$Host::TournamentMode && $Host::AllowPlayerVoteChangeMission)) + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, "skip the mission" ); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteFFAMode": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " changed the server to FFA Mode."); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 Free For All Mode.', %client.name, "change the server to"); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteTournamentMode": + if(%isAdmin && !%client.ForceVote) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " changed the server to Tournament Mode " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else if(!$Host::TournamentMode) + { + if(getAdmin() == 0) + { + messageClient(%client, 'clientMsg', 'There must be a server admin to play in Tournament Mode.'); + return; + } + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 Tournament Mode (%3).', %client.name, "change the server to", %arg1); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteMatchStart": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " started the match."); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, "start the match"); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "CancelMatchStart": + if(%isAdmin) // only admins can cancel match start + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " canceled match start."); + } + + case "VoteTeamDamage": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, (%arg1 $= "enable team damage" ? " ENABLED team damage." : " DISABLED team damage.")); + } + else if($Host::TournamentMode || (!$Host::TournamentMode && $Host::AllowPlayerVoteTeamDamage)) + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = $TeamDamage ? "disable team damage" : "enable team damage"; + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteChangeTimeLimit": + if(%isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " changed the time limit to " @ %arg1); + } + else if($Host::TournamentMode || (!$Host::TournamentMode && $Host::AllowPlayerVoteTimeLimit)) + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + if(%arg1 $= "999") %time = "unlimited"; else %time = %arg1; + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 %3.', %client.name, "change the time limit to", %time); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + StartVOTimeVote(%game); + } + + case "VoteGreedMode": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, (%arg1 $= "enable greed mode" ? " ENABLED Greed mode." : " DISABLED Greed mode.")); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = Game.greedMode ? "disable Greed mode" : "enable Greed mode"; + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "VoteHoardMode": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, (%arg1 $= "enable hoard mode" ? " ENABLED Hoard mode." : " DISABLED Hoard mode.")); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = Game.hoardMode ? "disable Hoard mode" : "enable Hoard mode"; + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + + case "passRunningVote": + if (%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminPassVote)) + { + adminStartNewVote( %client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " passed the vote in progress."); + } + + case "stopRunningVote": + if(%client.isSuperAdmin || (%client.isAdmin && $Host::AllowAdminStopVote)) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " stopped the vote in progress."); + } + + case "ForceVote": + if (%client.isAdmin && $Host::AllowAdminVotes) + { + if (%client.ForceVote) + { + %client.ForceVote = 0; + messageClient( %client, '', 'Vote to ... cancelled.' ); + } + else + { + %client.ForceVote = 2; + messageClient( %client, '', "Now select what to vote on, please." ); + } + } + case "ToggleTourneyNetClient": + if (%client.isAdmin) + { + if($Host::EnableNetTourneyClient) + { + $Host::EnableNetTourneyClient = 0; + + if(isActivePackage(checkver)) + deactivatePackage(checkver); + + messageClient( %client, '', "Tournament Net Client checking has been disabled.~wfx/powered/vehicle_screen_on.wav" ); + adminLog(%client, " has disabled Net Tourney Client checking."); + } + else + { + $Host::EnableNetTourneyClient = 1; + + if(!isActivePackage(checkver)) + activatePackage(checkver); + + //Boot Offenders into Obs + CheckVerObserver(%client); + + messageClient( %client, '', "Tournament Net Client checking has been enabled.~wfx/powered/vehicle_screen_on.wav" ); + ResetGetCountsStatus(); + adminLog(%client, " has enabled Net Tourney Client checking."); + } + } + case "TogglePUGpassword": + if (%client.isAdmin) + { + if($Host::Password !$= "") + { + $Host::Password = ""; + messageClient( %client, '', "PUG password been disabled.~wfx/powered/vehicle_screen_on.wav" ); + adminLog(%client, " has disabled pug password." ); + } + else + { + $Host::Password = $Host::PUGPassword; + messageClient( %client, '', "PUG password been enabled.~wfx/powered/vehicle_screen_on.wav" ); + adminLog(%client, " has enabled pug password." ); + } + } + case "cancelServerRestart": + if(%client.isSuperAdmin || (%client.isAdmin && $Host::EvoAdminCRCCheck)) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " canceled a server restart."); + } + + case "clearServerForMatch": + if ((%client.isSuperAdmin && $Host::EvoSuperClearServer) || (%client.isAdmin && $Host::EvoAdminClearServer)) + { + adminStartNewVote( %client, %typename, %arg1, %arg2, %arg3, %arg4 ); + adminLog(%client, " cleared server for match."); + } + case "showServerRules": + if (($Host::ServerRules[1] !$= "") && (!%client.CantView)) + { + for ( %i = 1; $Host::ServerRules[%i] !$= ""; %i++ ) + { + messageClient(%client, 'ServerRule', '\c2%1', $Host::ServerRules[%i] ); + } + %client.cantView = true; + %client.schedViewRules = schedule( 10000, %client, "resetViewSchedule", %client ); + } + case "showNextMission": + if ( !%client.CantView ) + { + %ShowNextMissionVar = $EvoCachedNextMission; + if($Host::EvoTourneySameMap && $Host::TournamentMode) %ShowNextMissionVar = $CurrentMission @ " (Same)"; + //MessageAll('MsgNotifyEvoNextMission', '\c2Next Mission: \c1%1', %ShowNextMissionVar); + messageClient(%client, 'MsgNotifyEvoNextMission', '\c2Next Mission: \c1%1', %ShowNextMissionVar); + + %client.cantView = true; + %client.schedViewRules = schedule( 10000, %client, "resetViewSchedule", %client ); + } + // + // sonic9k 11/6/2003 - Added support for LakRabbit DuelMode option + // + case "VoteDuelMode": + if( %isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = ($Host::LakRabbitDuelMode ? "disable Duel mode" : "enable Duel mode"); + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + // + // sonic9k 11/6/2003 - Added support for LakRabbit SplashDamage option + // + case "VoteSplashDamage": + if( %isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = ($Host::LakRabbitNoSplashDamage ? "enable SplashDamage" : "disable SplashDamage"); + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + // + // chocotaco 8/7/2018 - Added support for LakRabbit Pro option + // + case "VotePro": + if( %isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = ($Host::LakRabbitPubPro ? "disable Pro mode" : "enable Pro mode"); + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + case "SCtFProMode": + if( %isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = ($Host::SCtFProMode ? "disable Pro mode" : "enable Pro mode"); + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + case "DMSLOnlyMode": + if( %isAdmin && !%client.ForceVote ) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, " has toggled " @ %arg1 @ " (" @ %arg2 @ ")"); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + %actionMsg = ($Host::DMSLOnlyMode ? "disable Shocklance Only Mode" : "enable Shocklance Only Mode"); + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2.', %client.name, %actionMsg); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + //---------------------------- CLASSIC MOD + case "VoteArmorLimits": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, %arg3); + } + + case "VoteRandomTeams": + if(%isAdmin) + { + adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4); + adminLog(%client, %arg3); + } + else + { + if(Game.scheduleVote !$= "") + { + messageClient(%client, 'voteAlreadyRunning', '\c2A vote is already in progress.'); + return; + } + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + if(!%cl.isAIControlled()) + { + messageClient(%cl, 'VoteStarted', '\c2%1 initiated a vote to %2 %3.', %client.name, %arg3, %arg1); + %clientsVoting++; + } + } + playerStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4, %clientsVoting); + } + } +} + +function DefaultGame::cancelMatchStart(%game, %admin) +{ + if(%admin && $Host::TournamentMode && !$MatchStarted && $CountdownStarted) + { + CancelCountdown(); + for(%i = 0; %i < ClientGroup.getCount(); %i++) + { + %cl = ClientGroup.getObject(%i); + messageClient(%cl, 'MsgAdminForce', "\c2Match Start Canceled."); + messageClient(%cl, 'MsgSystemClock', "", 0, 0); + + %cl.notready = 1; + %cl.notReadyCount = ""; + centerprint(%cl, "\nPress FIRE when ready.", 0, 3); + } + } +} + +function DefaultGame::voteKickPlayer(%game, %admin, %client) +{ + %cause = ""; + + if(%admin) + { + kick(%client, %admin, %client.guid ); + %cause = "(admin)"; + } + else + { + %team = %client.team; + if(%team == 0) + { + %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; + if(%totalVotes > 0 && (%game.totalVotesFor / %totalVotes) > ($Host::VotePasspercent / 100)) + { + kick(%client, %admin, %game.kickGuid); + %cause = "(vote)"; + } + else + { + for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ ) + { + %cl = ClientGroup.getObject( %idx ); + + if (%cl.team == %game.kickTeam && !%cl.isAIControlled()) + messageClient( %cl, 'MsgVoteFailed', '\c2Kick player vote did not pass' ); + } + } + } + else + { + + %totalVotes = %game.votesFor[%game.kickTeam] + %game.votesAgainst[%game.kickTeam]; + if(%totalVotes > 0 && (%game.votesFor[%game.kickTeam] / %totalVotes) > ($Host::VotePasspercent / 100)) + { + kick(%client, %admin, %game.kickGuid); + %cause = "(vote)"; + } + else + { + for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ ) + { + %cl = ClientGroup.getObject( %idx ); + + if (%cl.team == %game.kickTeam && !%cl.isAIControlled()) + messageClient( %cl, 'MsgVoteFailed', '\c2Kick player vote did not pass' ); + } + } + } + } + + %game.kickTeam = ""; + %game.kickGuid = ""; + %game.kickClientName = ""; + + if(%cause !$= "") + logEcho($AdminCl.nameBase @ ": " @ %name @ " (cl " @ %game.kickClient @ ") kicked " @ %cause, 1); +} + +function DefaultGame::voteChangeMission(%game, %admin, %missionDisplayName, %typeDisplayName, %missionId, %missionTypeId) +{ + %mission = $HostMissionFile[%missionId]; + %missionType = $HostTypeName[%missionTypeId]; + if(!checkMapExist(%mission, %missionType)) + return; // map doesn't exist + + if(!$Host::TournamentMode && $Host::MapFFA[%mission, %missionType] !$= "" && $Host::MapFFA[%mission, %missionType] == 0) + return; // is FFA, but the map can't be played in FFA + + if(%admin) + { + messageAll('MsgAdminChangeMission', '\c2The Admin has changed the mission to %1 (%2).', %missionDisplayName, %typeDisplayName); + logEcho("mission changed to " @ %missionDisplayName @ "/" @ %typeDisplayName @ " (admin)"); + %game.gameOver(); + + // set a flag, so next map the skip mission vote won't start + $AdminChangedMission = 1; + loadMission(%mission, %missionType, false); + } + else + { + %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; + // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - ZOD + // Changed it back. Choco + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + { + messageAll('MsgVotePassed', '\c2The mission was changed to %1 (%2) by vote.', %missionDisplayName, %typeDisplayName); + logEcho("mission changed to " @ %missionDisplayName @ "/" @ %typeDisplayName @ " (vote)"); + %game.gameOver(); + + loadMission(%mission, %missionType, false); + } + else + { + messageAll('MsgVoteFailed', '\c2Change mission vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone) * 100)); + } + } +} + +function DefaultGame::voteTournamentMode( %game, %admin, %missionDisplayName, %typeDisplayName, %missionId, %missionTypeId ) +{ + %mission = $HostMissionFile[%missionId]; + if ( %mission $= "" ) + { + error( "Invalid mission index passed to DefaultGame::voteTournamentMode!" ); + return; + } + + %missionType = $HostTypeName[%missionTypeId]; + if ( %missionType $= "" ) + { + error( "Invalid mission type id passed to DefaultGame::voteTournamentMode!" ); + return; + } + + %cause = ""; + if (%admin) + { + messageAll( 'MsgAdminForce', '\c2The Admin %2 has switched the server to Tournament mode (%1).', %missionDisplayName, $AdminCl.name ); + setModeTournament( %mission, %missionType ); + %cause = "(admin)"; + } + else + { + %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; + // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - ZOD + // Changed it back. Choco + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + { + messageAll('MsgVotePassed', '\c2Server switched to Tournament mode by vote (%1): %2 percent.', %missionDisplayName, mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone) * 100)); + setModeTournament( %mission, %missionType ); + %cause = "(vote)"; + } + else + { + messageAll('MsgVoteFailed', '\c2Tournament mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone) * 100)); + } + } + if(%cause !$= "") + logEcho($AdminCl.nameBase @ ": tournament mode set "@%cause, 1); +} + +function DefaultGame::voteChangeTimeLimit(%game, %admin, %newLimit) +{ + if(%newLimit == 999) + %display = "unlimited"; + else + %display = %newLimit; + + %cause = ""; + if(%admin) + { + messageAll('MsgAdminForce', '\c2The Admin changed the mission time limit to %1 minutes.', %display); + $Host::TimeLimit = %newLimit; + %cause = "(admin)"; + + // reset the voted time limit when changing mission + $TimeLimitChanged = 1; + } + else if($Host::AllowPlayerVoteTimeLimit) + { + %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; + // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - ZOD + // Changed it back. Choco + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + { + ResetVOTimeChanged(%game); + messageAll('MsgVotePassed', '\c2The mission time limit was set to %1 minutes by vote.', %display); + $Host::TimeLimit = %newLimit; + %cause = "(vote)"; + + // reset the voted time limit when changing mission + $TimeLimitChanged = 1; + } + else + { + messageAll('MsgVoteFailed', '\c2The vote to change the mission time limit did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone) * 100)); + ResetVOall(%game); + //called so the game can end with a failed timevote for voteovertime + DefaultGame::checkTimeLimit(%game, %forced); + } + } + + //if the time limit was actually changed... + if(%cause !$= "") + { + logEcho("time limit set to " @ %display SPC %cause); + + //if the match has been started, reset the end of match countdown + if($matchStarted) + { + //schedule the end of match countdown + %elapsedTimeMS = getSimTime() - $missionStartTime; + %curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) - %elapsedTimeMS; + CancelEndCountdown(); + + if ( %newLimit != 999 ) + { + EndCountdown(%curTimeLeftMS); + cancel( %game.timeSync ); + %game.checkTimeLimit( true ); + } + else + { + cancel(%game.timeSync); + } + } + } +} + +function DefaultGame::sendGamePlayerPopupMenu( %game, %client, %targetClient, %key ) +{ + if( !%targetClient.matchStartReady ) + return; + + %isAdmin = ( %client.isAdmin || %client.isSuperAdmin ); + %isSuperAdmin = (%client.isSuperAdmin); + %isTargetSelf = ( %client == %targetClient ); + %isTargetAdmin = ( %targetClient.isAdmin || %targetClient.isSuperAdmin ); + %isTargetBot = %targetClient.isAIControlled(); + %isTargetObserver = ( %targetClient.team == 0 ); + %outrankTarget = false; + + if ( %client.isSuperAdmin ) // z0dd - ZOD, 7/11/03. Super admins should outrank even themseleves. + %outrankTarget = 1; //!%targetClient.isSuperAdmin; + else if ( %client.isAdmin ) + %outrankTarget = !%targetClient.isAdmin; + + if( %client.isSuperAdmin && %targetClient.guid != 0 ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "addAdmin", "", 'Add to Server Admin List', 10); + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "addSuperAdmin", "", 'Add to Server SuperAdmin List', 11); + } + + //mute options + if ( !%isTargetSelf ) + { + if ( %client.muted[%targetClient] ) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "MutePlayer", "", 'Unmute Text Chat', 1); + else + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "MutePlayer", "", 'Mute Text Chat', 1); + + if ( !%isTargetBot && %client.canListenTo( %targetClient ) ) + { + if ( %client.getListenState( %targetClient ) ) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ListenPlayer", "", 'Disable Voice Com', 9 ); + else + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ListenPlayer", "", 'Enable Voice Com', 9 ); + } + // ------------------------------------------ + // z0dd - ZOD 4/4/02. Observe a specific player + if (%client.team == 0 && !%isTargetObserver) + messageClient(%client, 'MsgPlayerPopupItem', "", %key, "ObservePlayer", "", 'Observe Player', 12); + } + if( !%client.canVote && !%isAdmin ) + return; + + // regular vote options on players + if ( %game.scheduleVote $= "" && !%isAdmin && !%isTargetAdmin ) + { + if ( $Host::allowAdminPlayerVotes && !%isTargetBot ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "AdminPlayer", "", 'Vote to Make Admin', 2 ); + + if ( !%isTargetSelf ) + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "KickPlayer", "", 'Vote to Kick', 3 ); + } + } + // Admin only options on players: + else if ( %isAdmin ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + { + if ( !%isTargetBot && !%isTargetAdmin ) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "AdminPlayer", "", 'Make Admin', 2 ); + + if ( !%isTargetSelf && %outrankTarget ) + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "KickPlayer", "", 'Kick', 3 ); + + if ( !%isTargetBot ) + { + // ------------------------------------------------------------------------------------------------------ + // z0dd - ZOD - Founder 7/13/03. Bunch of new admin features + messageClient(%client, 'MsgPlayerPopupItem', "", %key, "Warn", "", 'Warn player', 13); + if(%isTargetAdmin) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "StripAdmin", "", 'Strip admin', 14 ); + + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "SendMessage", "", 'Send Private Message', 15 ); + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "PrintClientInfo", "", 'Client Info', 16 ); // z0dd - ZOD - MeBad, 7/13/03. Send client information. + + if( %client.isSuperAdmin ) + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "BanPlayer", "", 'Ban', 4 ); + + if ( %targetClient.isGagged ) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "UnGagPlayer", "", 'UnGag Player', 17); + else + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "GagPlayer", "", 'Gag Player', 17); + + if ( %targetClient.isFroze ) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ThawPlayer", "", 'Thaw Player', 18); + else + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "FreezePlayer", "", 'Freeze Player', 18); + + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "BootPlayer", "", 'Boot to the Rear', 19); + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ExplodePlayer", "", 'Explode Player', 20); + } + if ( !%isTargetObserver ) + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ToObserver", "", 'Force observer', 5 ); + } + } + } + if ( %isTargetSelf || %outrankTarget ) + { + if(%isTargetAdmin) + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "StripAdmin", "", 'Strip admin', 14 ); + + if ( %game.numTeams > 1 ) + { + if ( %isTargetObserver ) + { + %action = %isTargetSelf ? "Join " : "Change to "; + %str1 = %action @ getTaggedString( %game.getTeamName(1) ); + %str2 = %action @ getTaggedString( %game.getTeamName(2) ); + + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ChangeTeam", "", %str1, 6 ); + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ChangeTeam", "", %str2, 7 ); + } + else if( %isSuperAdmin || ($Host::AllowAdminSwitchTeams && %isAdmin) ) + { + %changeTo = %targetClient.team == 1 ? 2 : 1; + %str = "Switch to " @ getTaggedString( %game.getTeamName(%changeTo) ); + %caseId = 5 + %changeTo; + + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ChangeTeam", "", %str, %caseId ); + + // z0dd - ZOD, 7/11/03. Allow Super admins to force themselves to obs. + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ToObserver", "", 'Force observer', 5 ); + } + } + else if ( %isTargetObserver ) + { + %str = %isTargetSelf ? 'Join the Game' : 'Add to Game'; + messageClient( %client, 'MsgPlayerPopupItem', "", %key, "JoinGame", "", %str, 8 ); + } + } + } +} + +function DefaultGame::passRunningVote(%game, %admin, %arg1, %arg2, %arg3, %arg4) +{ + if ( %admin && Game.scheduleVote !$= "" ) + { + passCurrentVote(); + messageAll('MsgAdminForce', '\c2The admin has passed the vote.' ); + } +} + +function DefaultGame::stopRunningVote(%game, %admin, %arg1, %arg2, %arg3, %arg4) +{ + if(%admin && Game.scheduleVote !$= "") + { + stopCurrentVote(); + messageAll('MsgAdminForce', '\c2The Admin stopped the vote.~wfx/misc/bounty_completed.wav'); + } +} + +function adminStartNewVote(%client, %typename, %arg1, %arg2, %arg3, %arg4) +{ + // this function handle only admin votes + if(%client.isAdmin && %client != %arg1) + { + if(Game.scheduleVote !$= "" && Game.voteType $= %typeName) + { + messageAll('closeVoteHud', ""); + cancel(Game.scheduleVote); + Game.scheduleVote = ""; + Game.scheduleVoteArgs = ""; + } + Game.evalVote(%typeName, true, %arg1, %arg2, %arg3, %arg4); + } +} + +}; + +function PizzaTriconPopup(%client, %key, %text, %function, %number) +{ + if ( %client.pizza ) + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, %function, "", %text, %number ); + return; + } + if ( %client.tricon ) + { + messageClient( %client, 'MsgPlayerPopupItem', "", %key, %function, "", %text, 10000+%number ); + return; + } +} + +function TriconWrapper(%client, %target, %function) +{ + switch(%function) + { + case 10016: + serverCmdWhois( %client, %target ); + return 1; + + case 10017: + serverCmdAddToBanList( %client, %target ); + return 1; + + case 10019: + serverCmdSuperAdminPlayer( %client, %target ); + return 1; + } + return 0; +} + +// checkMapExist(%missionName, %missionType) +// Info: check if a map exist in the mission type +function checkMapExist(%missionName, %missionType) +{ + // Find if the mission exists + for(%mis = 0; %mis < $HostMissionCount; %mis++) + if($HostMissionFile[%mis] $= %missionName) + break; + + // Now find if the mission type exists + for(%type = 0; %type < $HostTypeCount; %type++) + if($HostTypeName[%type] $= %missionType) + break; + + // Now find if the mission's index in the mission-type specific sub-list exists + for(%i = 0; %i < $HostMissionCount[%type]; %i++) + if($HostMission[%type, %i] == %mis) + break; + + if($HostMission[%type, %i] !$= "") + return true; // valid map + else + return false; // invalid map +} + +// passCurrentVote() +// Info: passes a vote that is running. +function passCurrentVote() // Edit GG +{ + cancel(Game.scheduleVote); + Game.totalVotesFor = ClientGroup.getCount() - $HostGameBotCount; + Game.totalVotesAgainst = 0; + Game.evalVote(Game.scheduleVoteArgs[typeName], false, Game.scheduleVoteArgs[arg1], Game.scheduleVoteArgs[arg2], Game.scheduleVoteArgs[arg3], Game.scheduleVoteArgs[arg4]); + Game.scheduleVote = ""; + Game.scheduleVoteArgs = ""; + Game.kickClient = ""; + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + messageClient(%cl, 'closeVoteHud', ""); + if(%cl.team != 0) + clearBottomPrint(%cl); + } + clearVotes(); +} + +// stopCurrentVote() +// Info: stop a vote that is still running +function stopCurrentVote() +{ + cancel(Game.scheduleVote); + Game.scheduleVote = ""; + Game.kickClient = ""; + Game.scheduleVoteArgs = ""; + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + messageClient(%cl, 'closeVoteHud', ""); + if(%cl.team != 0) + clearBottomPrint(%cl); + } + clearVotes(); +} + +// calcVotes(%typeName, %arg1, %arg2, %arg3, %arg4) +// Info: fixed a bug that doesn't close properly the vote hud +function calcVotes(%typeName, %arg1, %arg2, %arg3, %arg4) +{ + if(%typeName $= "voteMatchStart") + { + if(($MatchStarted || $countdownStarted) && Game.scheduleVote !$= "") + { + stopCurrentVote(); + return; + } + } + + for(%idx = 0; %idx < ClientGroup.getCount(); %idx++) + { + %cl = ClientGroup.getObject(%idx); + messageClient(%cl, 'closeVoteHud', ""); + + if(%cl.vote !$= "") + { + if(%cl.vote) + { + Game.votesFor[%cl.team]++; + Game.totalVotesFor++; + } + else + { + Game.votesAgainst[%cl.team]++; + Game.totalVotesAgainst++; + } + } + else + { + Game.votesNone[%cl.team]++; + Game.totalVotesNone++; + } + } + + Game.evalVote(%typeName, false, %arg1, %arg2, %arg3, %arg4); + Game.scheduleVote = ""; + Game.scheduleVoteArgs = ""; + Game.kickClient = ""; + clearVotes(); +} + +// Prevent package from being activated if it is already +if (!isActivePackage(ExtraVoteMenu)) + activatePackage(ExtraVoteMenu); \ No newline at end of file diff --git a/Classic/scripts/autoexec/VoteSound.cs b/Classic/scripts/autoexec/VoteSound.cs index 8bd44a2..6ecfcbd 100644 --- a/Classic/scripts/autoexec/VoteSound.cs +++ b/Classic/scripts/autoexec/VoteSound.cs @@ -20,8 +20,8 @@ function VoteSound( %game, %typename, %arg1, %arg2, %VoteSoundRandom ) messageAll('', '\c1Vote in Progress: \c0To change the mission to %1 (%2). %3~wgui/objective_notification.wav', %arg1, %arg2, %votemsg ); echo("Vote in Progress: To change the mission to" SPC %arg1 SPC "(" @ %arg2 @ ")."); case "VoteSkipMission": - messageAll('', '\c1Vote in Progress: \c0To skip the mission to %1. %2~wgui/objective_notification.wav', $EvoCachedNextMission, %votemsg ); - echo("Vote in Progress: To skip the mission to" SPC $EvoCachedNextMission @ "."); + messageAll('', '\c1Vote in Progress: \c0To skip the mission. %1~wgui/objective_notification.wav', %votemsg ); + echo("Vote in Progress: To skip the mission."); case "VoteChangeTimeLimit": if(%arg1 $= "999") %arg1 = "unlimited"; messageAll('', '\c1Vote in Progress: \c0To change the time limit to %1. %2~wgui/objective_notification.wav', %arg1, %votemsg ); @@ -47,11 +47,14 @@ function VoteSound( %game, %typename, %arg1, %arg2, %VoteSoundRandom ) } } else //Is observer - messageAll('', '\c1Vote in Progress: \c0To kick player %1. %3~wgui/objective_notification.wav', %arg1.name, %votemsg ); - echo("Vote in Progress: To kick player" SPC %arg1.name @ "."); + messageAll('', '\c1Vote in Progress: \c0To kick player %1. %2~wgui/objective_notification.wav', %arg1.nameBase, %votemsg ); + echo("Vote in Progress: To kick player" SPC %arg1.nameBase SPC "(" @ %arg1.guid @ ")."); case "VoteTournamentMode": messageAll('', '\c1Vote in Progress: \c0To change the mission to Tournament Mode (%1). %3~wgui/objective_notification.wav', %arg1, %arg2, %votemsg ); echo("Vote in Progress: To change the mission to Tournament Mode" SPC "(" @ %arg1 @ ")."); + default: + messageAll('', '\c1Vote in Progress: \c0To %1. %2~wgui/objective_notification.wav', %arg1, %votemsg ); + echo("Vote in Progress: To" SPC %arg1); } if(isEventPending($VoteSoundSchedule)) diff --git a/Classic/scripts/autoexec/zCheckVer.cs b/Classic/scripts/autoexec/zCheckVer.cs index 1baf797..939c837 100644 --- a/Classic/scripts/autoexec/zCheckVer.cs +++ b/Classic/scripts/autoexec/zCheckVer.cs @@ -28,7 +28,7 @@ function checkVer_showBanner(%client) { // customize me - commandToClient(%client, 'CenterPrint', "Version Check Failed!\nYou need the latest TribesNext patch and TourneyNetClient2 to play.\n Download it from t2discord.tk and drop it into your GameData/Base folder.", 10, 3); + commandToClient(%client, 'CenterPrint', "Version Check Failed!\nYou need the latest TribesNext patch and TourneyNetClient2 to play.\n Download it from playt2.com and drop it into your GameData/Base folder.", 10, 3); } package checkver diff --git a/Classic/scripts/autoexec/zDarkTigerStats.cs b/Classic/scripts/autoexec/zDarkTigerStats.cs index 74a8db6..d5e47bd 100644 --- a/Classic/scripts/autoexec/zDarkTigerStats.cs +++ b/Classic/scripts/autoexec/zDarkTigerStats.cs @@ -1236,7 +1236,7 @@ package dtStats{ parent::missionLoadDone(%game); //check to see if we are running evo or not, if not then lets just enable these if(!isFile("scripts/autoexec/evolution.cs")){ - $Host::EvoAveragePings = $Host::ShowIngamePlayerScores = 1; + $Host::AveragePings = $Host::ShowIngamePlayerScores = 1; } } function serverCmdShowHud(%client, %tag){ // to refresh screen when client opens it up @@ -2503,7 +2503,7 @@ function LakRabbitHud(%game, %client, %tag){ $TeamRank[2, count] = 0; } - if ( $Host::EvoAveragePings ) + if ( $Host::AveragePings ) { for ( %count = 0; %count <= Game.numteams; %count++ ) { diff --git a/Classic/scripts/autoexec/zDebriefLoadingScreen.cs b/Classic/scripts/autoexec/zDebriefLoadingScreen.cs index 558d11d..4b381f6 100644 --- a/Classic/scripts/autoexec/zDebriefLoadingScreen.cs +++ b/Classic/scripts/autoexec/zDebriefLoadingScreen.cs @@ -168,7 +168,7 @@ function ALTsendModInfoToClient(%client) if($Host::TimeLimit $= "999" || $Host::TimeLimit $= "unlimited") %timeloadingvar = "Unlimited"; else %timeloadingvar = $Host::TimeLimit; - if($Host::EvoKickObservers $= 0) %obskickvar = "Off"; else %obskickvar = ($Host::EvoKickObservers / 60) @ " Minutes"; + if($Host::KickObserverTimeout $= 0) %obskickvar = "Off"; else %obskickvar = ($Host::KickObserverTimeout / 60) @ " Minutes"; %time = "Time limit: " @ %timeloadingvar; %max = "Max players: " @ $Host::MaxPlayers; @@ -183,30 +183,14 @@ function ALTsendModInfoToClient(%client) //%crc = "CRC checking: " @ ($Host::CRCTextures ? "On" : "Off"); //%pure = "Pure server: " @ ($Host::PureServer ? "On" : "Off"); - if($Host::EvoNoBaseRapeEnabled) - %rapeppl = "Min No Base Rape: " @ $Host::EvoNoBaseRapeClassicPlayerCount; + if($Host::NoBaseRapeEnabled) + %rapeppl = "Min No Base Rape: " @ $Host::NoBaseRapePlayerCount; %turrets = "Min Turrets: " @ $Host::EnableTurretPlayerCount; - if($Host::EvoStats && (!$Host::TournamentMode || ($Host::TournamentMode && $Host::EvoStatsTourney)) && $Host::EvoStatsType != 0) - %stats = "Stats based on: " @ ($Host::EvoStatsType == 1 ? "Kills" : "Damage"); + if($Host::ClassicEvoStats && $Host::ClassicStatsType > 0) + %stats = "Stats based on: " @ ($Host::ClassicStatsType == 1 ? "Kills" : "Damage"); - if($Evo::ETMMode && $ETMmode::CurrentMap <= $ETMmode::Counter) - { - %nmis = "Next mission: " @ $ETMmode::MapDisplayName[$ETMmode::CurrentMap]; - } - else - { - %nmis = "Next mission: " @ findNextCycleMission(); - if ( $Host::ClassicRandomMissions ) - { - %nmis = %nmis SPC "(Random)"; - } - if($Host::EvoTourneySameMap && $Host::TournamentMode) - { - %nmis = "Next mission: " @ $CurrentMission @ " (Same)"; - } - } %currentmis = "Current mission: " @ $MissionDisplayName @ " (" @ $MissionTypeDisplayName @ ")"; @@ -300,7 +284,7 @@ function ALTsendModInfoToClient(%client) $dtLoadingScreen::LoadScreenMessage[$dmlP++] = "" @ %turrets; $dtLoadingScreen::LoadScreenMessage[$dmlP++] = "" @ %obskick; $dtLoadingScreen::LoadScreenMessage[$dmlP++] = "" @ %stats; - $dtLoadingScreen::LoadScreenMessage[$dmlP++] = "" @ %nmis; + $dtLoadingScreen::LoadScreenMessage[$dmlP++] = "" @ %currentmis; $dtLoadingScreen::LoadScreenMessage[$dmlP++] = " "; //$dtLoadingScreen::LoadScreenMessage[$dmlP++] = %rape; @@ -396,30 +380,30 @@ function NORMALsendModInfoToClient(%client) //%pure = "Pure server: " @ ($Host::PureServer ? "On" : "Off"); - if($Host::EvoNoBaseRapeEnabled) - %rapeppl = "Min No Base Rape: " @ $Host::EvoNoBaseRapeClassicPlayerCount; + if($Host::NoBaseRapeEnabled) + %rapeppl = "Min No Base Rape: " @ $Host::NoBaseRapePlayerCount; %turrets = "Min Turrets: " @ $Host::EnableTurretPlayerCount; - if($Host::EvoStats && (!$Host::TournamentMode || ($Host::TournamentMode && $Host::EvoStatsTourney)) && $Host::EvoStatsType != 0) - %stats = "Stats based on: " @ ($Host::EvoStatsType == 1 ? "Kills" : "Damage"); + if($Host::ClassicEvoStats && $Host::ClassicStatsType > 0) + %stats = "Stats based on: " @ ($Host::ClassicStatsType == 1 ? "Kills" : "Damage"); - if($Evo::ETMMode && $ETMmode::CurrentMap <= $ETMmode::Counter) - { - %nmis = "Next mission: " @ $ETMmode::MapDisplayName[$ETMmode::CurrentMap]; - } - else - { - %nmis = "Next mission: " @ findNextCycleMission(); - if ( $Host::ClassicRandomMissions ) - { - %nmis = %nmis SPC "(Random)"; - } - if($Host::EvoTourneySameMap && $Host::TournamentMode) - { - %nmis = "Next mission: " @ $CurrentMission @ " (Same)"; - } - } + //if($Evo::ETMMode && $ETMmode::CurrentMap <= $ETMmode::Counter) + //{ + // %nmis = "Next mission: " @ $ETMmode::MapDisplayName[$ETMmode::CurrentMap]; + //} + //else + //{ + //%nmis = "Next mission: " @ findNextCycleMission(); + //if ( $Host::ClassicRandomMissions ) + //{ + //%nmis = %nmis SPC "(Random)"; + //} + //if($Host::EvoTourneySameMap && $Host::TournamentMode) + //{ + //%nmis = "Next mission: " @ $CurrentMission @ " (Same)"; + //} + //} %currentmis = "Current mission: " @ $MissionDisplayName @ " (" @ $MissionTypeDisplayName @ ")"; @@ -449,7 +433,7 @@ function NORMALsendModInfoToClient(%client) %ServerTextLine[4] = %rapeppl; %ServerTextLine[5] = %turrets; %ServerTextLine[6] = %stats; - %ServerTextLine[7] = %nmis; + %ServerTextLine[7] = %currentmis; //%serverTextLine[2] = %td; //%serverTextLine[3] = %crc; diff --git a/Classic/scripts/autoexec/zMineDisc.cs b/Classic/scripts/autoexec/zMineDisc.cs new file mode 100644 index 0000000..e669308 --- /dev/null +++ b/Classic/scripts/autoexec/zMineDisc.cs @@ -0,0 +1,196 @@ +//********************************************************** +// CREDITS +// +// Eolks - I think he wrote most (probably all) of the mine+disc support. +//********************************************************** + +$DamageTypeText[50] = 'Mine+Disc'; // Teratos: Pseudo-damage type + +// Eolk - Mine disc messages // Teratos - betterized. +$DeathMessageMineDiscCount = 4; +$DeathMessageMineDisc[0] = '\c0%4 kills %1 with a mine+disc.'; +$DeathMessageMineDisc[1] = '\c0%4 unleashes a world of hurt on %1 with a mine+disc.'; +$DeathMessageMineDisc[2] = '\c0%4 shows %1 the power of a spinfusor+mine combo!'; +$DeathMessageMineDisc[3] = '\c0%1 never saw that mine+disc coming from %4.'; + +// Teratos: Guessing this was Eolk? +function resetMineDiscCheck(%cl) +{ + %cl.minediscCheck = 0; +} + +package StatsMineDisc +{ + function DefaultGame::displayDeathMessages(%game, %clVictim, %clKiller, %damageType, %implement) + { + // ---------------------------------------------------------------------------------- + // z0dd - ZOD, 6/18/02. From Panama Jack, send the damageTypeText as the last varible + // in each death message so client knows what weapon it was that killed them. + + %victimGender = (%clVictim.sex $= "Male" ? 'him' : 'her'); + %victimPoss = (%clVictim.sex $= "Male" ? 'his' : 'her'); + %killerGender = (%clKiller.sex $= "Male" ? 'him' : 'her'); + %killerPoss = (%clKiller.sex $= "Male" ? 'his' : 'her'); + %victimName = %clVictim.name; + %killerName = %clKiller.name; + //error("DamageType = " @ %damageType @ ", implement = " @ %implement @ ", implement class = " @ %implement.getClassName() @ ", is controlled = " @ %implement.getControllingClient()); + + if(%damageType == $DamageType::Explosion) + { + messageAll('msgExplosionKill', $DeathMessageExplosion[mFloor(getRandom() * $DeathMessageExplosionCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%damageType == $DamageType::Suicide) //player presses ctrl-k + { + messageAll('msgSuicide', $DeathMessageSuicide[mFloor(getRandom() * $DeathMessageSuicideCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%damageType == $DamageType::VehicleSpawn) + { + messageAll('msgVehicleSpawnKill', $DeathMessageVehPad[mFloor(getRandom() * $DeathMessageVehPadCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%damageType == $DamageType::ForceFieldPowerup) + { + messageAll('msgVehicleSpawnKill', $DeathMessageFFPowerup[mFloor(getRandom() * $DeathMessageFFPowerupCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%damageType == $DamageType::Crash) + { + messageAll('msgVehicleCrash', $DeathMessageVehicleCrash[%damageType, mFloor(getRandom() * $DeathMessageVehicleCrashCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%damageType == $DamageType::Impact) // run down by vehicle + { + if( ( %controller = %implement.getControllingClient() ) > 0) + { + %killerGender = (%controller.sex $= "Male" ? 'him' : 'her'); + %killerPoss = (%controller.sex $= "Male" ? 'his' : 'her'); + %killerName = %controller.name; + if(%controller.team != %clVictim.team) + { + messageAll('msgVehicleKill', $DeathMessageVehicle[mFloor(getRandom() * $DeathMessageVehicleCount)], %victimName, %victimGender, %victimPoss, %killerName ,%killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else + { + messageAll('msgTeamKill', $DeathMessageTeamKill[%damageType, mFloor(getRandom() * $DeathMessageTeamKillCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + } + else + { + messageAll('msgVehicleKill', $DeathMessageVehicleUnmanned[mFloor(getRandom() * $DeathMessageVehicleUnmannedCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + } + // --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + // z0dd - ZOD, 5/15/02. Added Hover Vehicle so we get proper + // death messages when killed with Wildcat chaingun + //else if (isObject(%implement) && (%implement.getClassName() $= "Turret" || %implement.getClassName() $= "VehicleTurret" || %implement.getClassName() $= "FlyingVehicle")) //player killed by a turret + else if (isObject(%implement) && (%implement.getClassName() $= "Turret" || %implement.getClassName() $= "VehicleTurret" || %implement.getClassName() $= "FlyingVehicle" || %implement.getClassName() $= "HoverVehicle")) + { + if (%implement.getControllingClient() != 0) //is turret being controlled? + { + %controller = %implement.getControllingClient(); + %killerGender = (%controller.sex $= "Male" ? 'him' : 'her'); + %killerPoss = (%controller.sex $= "Male" ? 'his' : 'her'); + %killerName = %controller.name; + + if (%controller == %clVictim) + { + messageAll('msgTurretSelfKill', $DeathMessageTurretSelfKill[mFloor(getRandom() * $DeathMessageTurretSelfKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if (%controller.team == %clVictim.team) //controller TK'd a friendly + { + messageAll('msgCTurretKill', $DeathMessageCTurretTeamKill[%damageType, mFloor(getRandom() * $DeathMessageCTurretTeamKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else //controller killed an enemy + { + messageAll('msgCTurretKill', $DeathMessageCTurretKill[%damageType, mFloor(getRandom() * $DeathMessageCTurretKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + } + // use the handle associated with the deployed object to verify valid owner + else if (isObject(%implement.owner)) + { + %owner = %implement.owner; + //error("Owner is " @ %owner @ " Handle is " @ %implement.ownerHandle); + //error("Turret is still owned"); + //turret is uncontrolled, but is owned - treat the same as controlled. + %killerGender = (%owner.sex $= "Male" ? 'him' : 'her'); + %killerPoss = (%owner.sex $= "Male" ? 'his' : 'her'); + %killerName = %owner.name; + + if (%owner.team == %clVictim.team) //player got in the way of a teammates deployed but uncontrolled turret. + { + messageAll('msgCTurretKill', $DeathMessageCTurretAccdtlKill[%damageType,mFloor(getRandom() * $DeathMessageCTurretAccdtlKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else //deployed, uncontrolled turret killed an enemy + { + messageAll('msgCTurretKill', $DeathMessageCTurretKill[%damageType,mFloor(getRandom() * $DeathMessageCTurretKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + } + else //turret is not a placed (owned) turret (or owner is no longer on it's team), and is not being controlled + { + if(%implement.team == %clVictim.team) // was it a teamkill? + { + messageAll('msgTurretKill', $DeathMessageCTurretAccdtlKill[%damageType,mFloor(getRandom() * $DeathMessageCTurretAccdtlKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else // it was not a teamkill + { + messageAll('msgTurretKill', $DeathMessageTurretKill[%damageType,mFloor(getRandom() * $DeathMessageTurretKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + } + } + // END TURRET MESSAGES + else if((%clKiller == %clVictim) || (%damageType == $DamageType::Ground)) //player killed himself or fell to death + { + messageAll('msgSelfKill', $DeathMessageSelfKill[%damageType,mFloor(getRandom() * $DeathMessageSelfKillCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if (%damageType == $DamageType::OutOfBounds) //killer died due to Out-of-Bounds damage + { + messageAll('msgOOBKill', $DeathMessageOOB[mFloor(getRandom() * $DeathMessageOOBCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if (%damageType == $DamageType::NexusCamping) //Victim died from camping near the nexus... + { + messageAll('msgCampKill', $DeathMessageCamping[mFloor(getRandom() * $DeathMessageCampingCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%clKiller.team == %clVictim.team) //was a TK + { + messageAll('msgTeamKill', $DeathMessageTeamKill[%damageType, mFloor(getRandom() * $DeathMessageTeamKillCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if (%damageType == $DamageType::Lava) //player died by falling in lava + { + messageAll('msgLavaKill', $DeathMessageLava[mFloor(getRandom() * $DeathMessageLavaCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if ( %damageType == $DamageType::Lightning ) // player was struck by lightning + { + messageAll('msgLightningKill', $DeathMessageLightning[mFloor(getRandom() * $DeathMessageLightningCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if ( %damageType == $DamageType::Mine && !isObject(%clKiller) ) + { + messageAll('MsgRogueMineKill', $DeathMessageRogueMine[%damageType, mFloor(getRandom() * $DeathMessageRogueMineCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else //was a legitimate enemy kill + { + if((%damageType == $DamageType::Mine || %damageType == $DamageType::Disc) && %clVictim.mineDisc) + { + // mine disc just occurred + messageAll('MsgMineDiscKill', $DeathMessageMineDisc[mFloor(getRandom() * $DeathMessageMineDiscCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + else if(%damageType == 6 && (%clVictim.headShot)) + { + // laser headshot just occurred + messageAll('MsgHeadshotKill', $DeathMessageHeadshot[%damageType, mFloor(getRandom() * $DeathMessageHeadshotCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + // ---------------------------------------------------- + // z0dd - ZOD, 8/25/02. Rear Lance hits + else if (%damageType == 10 && (%clVictim.rearshot)) + { + // shocklance rearshot just occurred + messageAll('MsgRearshotKill', $DeathMessageRearshot[%damageType, mFloor(getRandom() * $DeathMessageRearshotCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + // ---------------------------------------------------- + else + { + messageAll('MsgLegitKill', $DeathMessage[%damageType, mFloor(getRandom() * $DeathMessageCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]); + } + } + } +}; + +// Prevent package from being activated if it is already +if (!isActivePackage(StatsMineDisc)) + activatePackage(StatsMineDisc); \ No newline at end of file diff --git a/Classic/scripts/defaultGame.cs b/Classic/scripts/defaultGame.cs index 2117eea..ef227f2 100644 --- a/Classic/scripts/defaultGame.cs +++ b/Classic/scripts/defaultGame.cs @@ -574,6 +574,20 @@ function DefaultGame::startMatch(%game) function DefaultGame::gameOver( %game ) { + listPlayers(); // MP: 6/17/2011 - Prints score, team, status + + // Eolk - Prevent those annoying last-minute map changes that totally throw things off + if(%game.scheduleVote !$= "") + { + messageAll('closeVoteHud', ""); + cancel(Game.scheduleVote); + Game.scheduleVote = ""; + Game.kickClient = ""; + clearVotes(); + + messageAll('MsgVoteFailed', ""); + } + //set the bool $missionRunning = false; @@ -617,6 +631,14 @@ function DefaultGame::gameOver( %game ) // Default game does nothing... except lets the AI know the mission is over AIMissionEnd(); + // Eolk - reset vehicle maxes after each round. + $VehicleRespawnTime = 15000; + $Vehiclemax[ScoutVehicle] = 4; + $VehicleMax[AssaultVehicle] = 3; + $VehicleMax[MobileBaseVehicle] = 1; + $VehicleMax[ScoutFlyer] = 4; + $VehicleMax[BomberFlyer] = 2; + $VehicleMax[HAPCFlyer] = 2; } //------------------------------------------------------------------------------ @@ -710,7 +732,6 @@ function DefaultGame::sendDebriefing( %game, %client ) %score = %cl.score $= "" ? 0 : %cl.score; %kills = %cl.kills $= "" ? 0 : %cl.kills; messageClient( %client, 'MsgDebriefAddLine', "", ' %1 %2 %3 %4', %cl.name, %game.getTeamName(%cl.team), %score, %kills ); - %count[%highTeam]++; %notDone = false; for ( %team = 1; %team - 1 < %game.numTeams; %team++ ) @@ -744,8 +765,13 @@ function DefaultGame::sendDebriefing( %game, %client ) messageClient( %client, 'MsgDebriefAddLine', "", ' %1 %2', %cl.name, %score); } } + + if($Host::ClassicEvoStats) + sendEvoDebriefing(%client); } + + //------------------------------------------------------------ function DefaultGame::clearDeployableMaxes(%game) { @@ -1093,6 +1119,7 @@ function DefaultGame::forceObserver( %game, %client, %reason ) messageClient(%client, 'MsgClientJoinTeam', '\c2You have become an observer.', %client.name, %game.getTeamName(0), %client, 0 ); logEcho(%client.nameBase@" (cl "@%client@") entered observer mode"); %client.lastTeam = %client.team; + %scheduleAutoKick = true; case "AdminForce": %client.camera.getDataBlock().setMode( %client.camera, "observerFly" ); @@ -1124,6 +1151,18 @@ function DefaultGame::forceObserver( %game, %client, %reason ) logEcho(%client.nameBase@" (cl "@%client@") was placed in observer mode due to spawn delay"); // save the team the player was on - only if this was a delay in respawning %client.lastTeam = %client.team; + %scheduleAutoKick = true; + } + + if (%scheduleAutoKick && !%client.isAdmin && !$Host::TournamentMode && $Host::KickObserverTimeout ) + { + %minutes = $Host::KickObserverTimeout / 60; + messageClient(%client, 'MsgNoObservers', '\c2You have %1 minutes to join the game or you will be kicked.', %minutes); + + %key = mFloor(getRandom() * 1000); + %client.okkey = %key; + + schedule(($Host::KickObserverTimeout * 1000), 0, "cmdAutoKickObserver", %client, %key); } // switch client to team 0 (observer) @@ -1154,6 +1193,26 @@ function DefaultGame::forceObserver( %game, %client, %reason ) } +// cmdAutoKickObserver(%client) +// Info: Will kick the player if he/she is still in observer. +function cmdAutoKickObserver(%client, %key) // Edit GG +{ + if (($Host::TournamentMode) || (!$MissionRunning) || (%client.isAdmin) || (%client.team != 0) || (!%client.okkey) || (%client.okkey != %key)) + return; + + %client.okkey = ""; + if( isObject( %client.player ) ) + %client.player.scriptKill(0); + + if ( isObject( %client ) ) + { + messageAll('MsgAdminForce', '\c2%1 has left the game. (Observer Timeout)', %client.nameBase); + + %client.setDisconnectReason( "Observer Timeout" ); + %client.schedule(700, "delete"); + } +} + function DefaultGame::displayDeathMessages(%game, %clVictim, %clKiller, %damageType, %implement) { // ---------------------------------------------------------------------------------- @@ -1663,7 +1722,10 @@ function DefaultGame::clientMissionDropReady(%game, %client) commandToClient(%client, 'setHudMode', 'Observer'); %client.setControlObject( %client.camera ); //displayObserverHud( %client, 0 ); - updateObserverFlyHud(%client); + // Eolk - flag stats stuff + //updateObserverFlyHud(%client); + if($Host::ClassicEvoStats && $CurrentMissionType $= "CTF") + schedule(10000, %client, updateObserverFlyHud, %client); } if( !%observer ) @@ -1683,7 +1745,18 @@ function DefaultGame::clientMissionDropReady(%game, %client) commandToClient(%client, 'setHudMode', 'Standard'); // the game has already started %client.setControlObject( %client.player ); } - } + } + + if( $Host::ClassicEvoStats && ($CurrentMissionType $= "CTF" || $CurrentMissionType $= "SCtF") ) + { + %nickTeam1 = ($flagstats::heldTeam1 ? $flagstats::nickTeam1 : "N/A"); + %realTeam1 = ($flagstats::heldTeam1 ? $flagstats::realTeam1 : "N/A"); + + %nickTeam2 = ($flagstats::heldTeam2 ? $flagstats::nickTeam2 : "N/A"); + %realTeam2 = ($flagstats::heldTeam2 ? $flagstats::realTeam2 : "N/A"); + + BottomPrint(%client, "Best caps on " @ $CurrentMission @ ":\n" @ getTaggedString(%game.getTeamName(1)) @ ":" SPC %nickTeam1 @ " in " @ %realTeam1 @ " seconds\n" @ getTaggedString(%game.getTeamName(2)) @ ":" SPC %nickTeam2 @ " in " @ %realTeam2 @ " seconds", 10, 3); + } } else { @@ -1719,6 +1792,12 @@ function DefaultGame::clientMissionDropReady(%game, %client) echo("Client" SPC %client SPC "is ready."); // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + $stats::tk[%client] = ""; + %client.midairs = 0; + %client.PlaMA = 0; + %client.hs = ""; + for(%i = 1; %i <= 13; %i++) + $stats::weapon_damage[%client, %i] = ""; } function DefaultGame::sendClientTeamList(%game, %client) @@ -2759,40 +2838,41 @@ function DefaultGame::sendGameVoteMenu( %game, %client, %key ) { // Actual vote options: messageClient( %client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Vote to Change the Mission' ); + messageClient( %client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Vote to Change the Time Limit'); messageClient( %client, 'MsgVoteItem', "", %key, 'VoteSkipMission', 'skip the mission to', 'Vote to Skip Mission' ); - if( $Host::TournamentMode ) - { - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Vote Free For All Mode' ); - - if(!$MatchStarted && !$CountdownStarted) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteMatchStart', 'Start Match', 'Vote to Start the Match' ); - } - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'Change server to Tournament.', 'Vote Tournament Mode' ); + //if( $Host::TournamentMode ) + //{ + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Vote Free For All Mode' ); + // + // if(!$MatchStarted && !$CountdownStarted) + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteMatchStart', 'Start Match', 'Vote to Start the Match' ); + //} + //else + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'Change server to Tournament.', 'Vote Tournament Mode' ); if ( %multipleTeams ) { if(!$MatchStarted && !$Host::TournamentMode) messageClient( %client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Change your Team' ); - if ( $teamDamage ) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage' ); - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Vote to Enable Team Damage' ); + //if ( $teamDamage ) + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage' ); + //else + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Vote to Enable Team Damage' ); - if($CurrentMissionType !$= TR2) // z0dd - ZOD, 5/23/03. Added vote for Random and Fair teams - { - if ( $RandomTeams ) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'disable random teams', 'Vote to Disable Random Teams' ); - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'enable random teams', 'Vote to Enable Random Teams' ); + //if($CurrentMissionType !$= TR2) // z0dd - ZOD, 5/23/03. Added vote for Random and Fair teams + //{ + //if ( $RandomTeams ) + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'disable random teams', 'Vote to Disable Random Teams' ); + //else + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'enable random teams', 'Vote to Enable Random Teams' ); - if ( $FairTeams ) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'disable fair teams', 'Vote to Disable Fair Teams' ); - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'enable fair teams', 'Vote to Enable Fair Teams' ); - } + //if ( $FairTeams ) + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'disable fair teams', 'Vote to Disable Fair Teams' ); + //else + //messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'enable fair teams', 'Vote to Enable Fair Teams' ); + //} } } else @@ -2816,23 +2896,23 @@ function DefaultGame::sendGameVoteMenu( %game, %client, %key ) if(!$MatchStarted) messageClient( %client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Choose Team' ); - if ( $teamDamage ) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Disable Team Damage' ); - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Enable Team Damage' ); + //if ( $teamDamage ) + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Disable Team Damage' ); + //else + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Enable Team Damage' ); - if($CurrentMissionType !$= TR2) // z0dd - ZOD, 5/23/03. Added vote for Random and Fair teams - { - if ( $RandomTeams ) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'disable random teams', 'Disable Random Teams' ); - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'enable random teams', 'Enable Random Teams' ); + //if($CurrentMissionType !$= TR2) // z0dd - ZOD, 5/23/03. Added vote for Random and Fair teams + //{ + // if ( $RandomTeams ) + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'disable random teams', 'Disable Random Teams' ); + // else + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRandomTeams', 'enable random teams', 'Enable Random Teams' ); - if ( $FairTeams ) - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'disable fair teams', 'Disable Fair Teams' ); - else - messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'enable fair teams', 'Enable Fair Teams' ); - } + // if ( $FairTeams ) + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'disable fair teams', 'Disable Fair Teams' ); + // else + // messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFairTeams', 'enable fair teams', 'Enable Fair Teams' ); + //} } } } @@ -2969,7 +3049,7 @@ function DefaultGame::voteChangeMission(%game, %admin, %missionDisplayName, %typ else { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) { messageAll('MsgVotePassed', '\c2The mission was changed to %1 (%2) by vote.', %missionDisplayName, %typeDisplayName ); logEcho("mission changed to "@%missionDisplayName@"/"@%typeDisplayName@" (vote)"); @@ -3062,7 +3142,7 @@ function DefaultGame::voteTournamentMode( %game, %admin, %missionDisplayName, %t { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - z0dd - ZOD - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) { messageAll('MsgVotePassed', '\c2Server switched to Tournament mode by vote (%1): %2 percent.', %missionDisplayName, mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone) * 100)); setModeTournament( %mission, %missionType ); @@ -3106,8 +3186,8 @@ function DefaultGame::voteMatchStart( %game, %admin) { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - z0dd - ZOD - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) - { + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + { messageAll('MsgVotePassed', '\c2The match has been started by vote: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone) * 100)); startTourneyCountdown(); } @@ -3136,7 +3216,7 @@ function DefaultGame::voteFFAMode( %game, %admin, %client ) { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - z0dd - ZOD - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) { messageAll('MsgVotePassed', '\c2Server switched to Free For All mode by vote.', %client); setModeFFA($CurrentMission, $CurrentMissionType); @@ -3168,7 +3248,7 @@ function DefaultGame::voteChangeTimeLimit( %game, %admin, %newLimit ) { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - z0dd - ZOD - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) { messageAll('MsgVotePassed', '\c2The mission time limit was set to %1 minutes by vote.', %display); $Host::TimeLimit = %newLimit; @@ -3212,7 +3292,7 @@ function DefaultGame::voteResetServer( %game, %admin, %client ) { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - z0dd - ZOD - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) { messageAll('MsgVotePassed', '\c2The Server has been reset by vote.' ); resetServerDefaults(); @@ -3295,7 +3375,7 @@ function DefaultGame::voteAdminPlayer(%game, %admin, %client) { %totalVotes = %game.totalVotesFor + %game.totalVotesAgainst; // Added people who dont vote into the equation, now if you do not vote, it doesn't count as a no. - z0dd - ZOD - if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) + if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount - %game.totalVotesNone)) > ($Host::VotePasspercent / 100)) { messageAll('MsgAdminPlayer', '\c2%2 was made an admin by vote.', %client, %client.name); %client.isAdmin = 1; @@ -3751,9 +3831,6 @@ function notifyMatchEnd(%time) if (%seconds > 1) { MessageAll('MsgMissionEnd', '\c2Match ends in %1 seconds.~wfx/misc/hunters_%1.wav', %seconds); - if (%seconds == 60) { - MessageAll('MsgNotifyEvoNextMission', '\c2Next Mission: \c1%1', $EvoCachedNextMission); - } } else if (%seconds == 1) MessageAll('MsgMissionEnd', '\c2Match ends in 1 second.~wfx/misc/hunters_1.wav'); diff --git a/Classic/scripts/player.cs b/Classic/scripts/player.cs index b97077c..2f8e656 100644 --- a/Classic/scripts/player.cs +++ b/Classic/scripts/player.cs @@ -2831,7 +2831,7 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am %targetClient.lastDamagedBy = %damagingClient; %targetClient.lastDamaged = getSimTime(); - + //now call the "onKilled" function if the client was... you know... if(%targetObject.getState() $= "Dead") { diff --git a/Classic/scripts/server.cs b/Classic/scripts/server.cs index 4032b1f..01ad882 100644 --- a/Classic/scripts/server.cs +++ b/Classic/scripts/server.cs @@ -305,7 +305,7 @@ function getValidMap(%misType) function findNextCycleMission(%type) { - %numPlayers = ClientGroup.getCount(); + %numPlayers = 1; if($Host::ClassicCycleMisTypes || $Host::ClassicRandomMisTypes) { %tempMission = getValidMap(%type); @@ -323,6 +323,11 @@ function findNextCycleMission(%type) { %nextMissionIndex = getNextMission(%tempMission, %type); %nextPotentialMission = $HostMissionFile[%nextMissionIndex]; + // Eolk + $MapPlayed[%nextPotentialMission] = 1; + $MapPlayedCount++; +// error("SH: "@%type@", "@%nextPotentialMission); +// error("POT MAP: "@%nextPotentialMission); //just cycle to the next if we've gone all the way around... if (%nextPotentialMission $= $CurrentMission || %failsafe >= 1000) @@ -332,20 +337,18 @@ function findNextCycleMission(%type) return $HostMissionFile[%nextMissionIndex]; } - //get the player count limits for this mission - %limits = $Host::MapPlayerLimits[%nextPotentialMission, %type]; - if (%limits $= "") - return %nextPotentialMission; - else - { - %minPlayers = getWord(%limits, 0); - %maxPlayers = getWord(%limits, 1); + %numPlayers = ClientGroup.getCount(); + %minPlayers = $MapCycleMinPlayers[%type, %nextPotentialMission]; + %maxPlayers = $MapCycleMaxPlayers[%type, %nextPotentialMission]; +// error("MINPLAYERS: "@%minPlayers@", MAXPLAYERS: "@%maxPlayers); + if(%minPlayers $= "" || %maxPlayers $= "") + return; - if ((%minPlayers < 0 || %minPlayers == -1 || %numPlayers >= %minPlayers) && (%maxPlayers < 0 || %maxPlayers == -1 || %numPlayers <= %maxPlayers)) + if ((%minPlayers < 0 || %minPlayers == -1 || %numPlayers >= %minPlayers) && (%maxPlayers < 0 || %maxPlayers == -1 || %numPlayers <= %maxPlayers)) return %nextPotentialMission; - } //since we didn't return the mission, we must not have an acceptable number of players - check the next + error("SKIPPING MAP, player count unacceptable"); %tempMission = %nextPotentialMission; %failsafe++; } @@ -353,6 +356,9 @@ function findNextCycleMission(%type) function CycleMissions() { + if(Game.scheduleVote !$= "") // a vote is still running, stop it + stopCurrentVote(); + echo( "cycling mission. " @ ClientGroup.getCount() @ " clients in game." ); if($Host::ClassicCycleMisTypes && !$Host::ClassicRandomMisTypes) { @@ -899,22 +905,9 @@ function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, $HostGamePlayerCount++; // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + // Eolk - Fix logging. if( $Host::ClassicConnectLog ) - { - // z0dd - ZOD, 5/07/04. New logging method based on AurLogging by Aureole - %file = $Host::ClassicConnLogPath @"/"@ formatTimeString("mm.dd.yy") @ "Connect.csv"; - %conn = new FileObject(); - %conn.openForAppend(%file); - %conn.writeLine("\"" @ formatTimeString("mm.dd.yy - h:nn:ss A") @ "\"," @ %client.nameBase @ "\"," @ %client.guid @ "," @ getSubStr(%client.getAddress(), 3, strlen(%client.getAddress()))); - %conn.close(); - %conn.delete(); - echo( "exporting client info to connect.csv..." ); - - // z0dd - ZOD - Founder, 5/25/03. Connect log - //$conn::new[$ConnectCount++] = "Player: " @ %client.nameBase @ " Real Name: " @ %realName @ " Guid: " @ %client.guid @ " Connected from: " @ %client.getAddress(); - //%file = formatTimeString("mm.dd.yy") @ "Connect.log"; - //export("$conn::*", $Host::ClassicConnLogPath @"/"@ %file, true); - } + connectLog(%client, 0); // z0dd - ZOD 4/29/02. Activate the clients Classic Huds // and start off with 0 SAD access attempts. @@ -953,6 +946,84 @@ function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, } } } + if($Host::EmptyServerReset && isEventPending($EmptyServerResetSchedule)) + { + error(formatTimeString("HH:nn:ss") SPC "Previous Timed Server Reset schedule cancelled..." ); + cancel($EmptyServerResetSchedule); + } + + if($Host::GuidCheck) + { + // If we don't have a GUID try to find one somewhere. + if(! %client.guid || %client.guid $= "") + { + %client.guid = getField(%client.getAuthInfo(),3); + } + // If we don't have a name, try to get one. + if(!%name || %name $= "") + { + %name = getField(%client.getAuthInfo(),0); + %client.nameBase = %name; + } + // If we still don't have a GUID or name, time to boot the player (unless a local game). + if(getIPAddress(%client) !$= "Local" && (!%client.guid $= "" || %name $= "")) + { + //statEchoInfo("No name/GUID kick for CID (" @ %client @ ") with IP (" @ getIPAddress(%client) @ ")"); + KickByCID(%client, "You joined the server with a blank name and/or GUID. Try rejoining.",2); + return; + } + } +} + +// From Eolks +// Minor improvement by Teratos +function getIPAddress(%client) +{ + %port = nextToken(nextToken(%client.getAddress(), "ip", ":"), "addr", ":"); + if(%client.isAIControlled()) { + %addr = "bot"; + } + return (%addr $= "" ? "Local" : %addr); +} + +// From Eolks +// We are not an admin MOD but this comes in handy when name is missing on races. +function KickByCID(%client, %reason, %time) +{ + if(!isObject(%client)) + return; + + // AI handler + if(%client.isAIControlled()) + { + %client.drop(); + $HostGameBotCount--; + if($HostGameBotCount < 0) + $HostGameBotCount = 0; + return; + } + + if (%reason $= "") + %reason = "You have been kicked from the server."; + // Perhaps we don't want time done. + //if (%time < 0 || %time $= "") + // %time = $Host::KickBanTime; + + // Send proper messages + messageClient(%client, 'onClientKicked', ""); + messageAllExcept(%client, -1, 'MsgClientDrop', "", %client.name, %client); + + // Remove their player, if one exists + if (isObject(%client.player)) + %client.player.scriptKill(0); + + // Set reason, schedule removal + %client.setDisconnectReason(%reason); + %client.schedule(500, "delete"); + + // Keep them out + // if(%time != 0) + // BanList::add(%client.guid, %client.getAddress(), %time); } function GameConnection::onDrop(%client, %reason) @@ -960,6 +1031,10 @@ function GameConnection::onDrop(%client, %reason) if(isObject(Game)) Game.onClientLeaveGame(%client); + // Eolk - Fix logging. + if( $Host::ClassicConnectLog ) + connectLog(%client, 1); + // make sure that tagged string of player name is not used if ( $CurrentMissionType $= "SinglePlayer" ) messageAllExcept(%client, -1, 'MsgClientDrop', "", getTaggedString(%client.name), %client); @@ -981,6 +1056,8 @@ function GameConnection::onDrop(%client, %reason) echo("CDROP: " @ %client @ " " @ %client.getAddress()); $HostGamePlayerCount--; +// schedule(1000, 0, "updateAdminModHud"); // Have to delay this a bit so it actually updates correctly, since the client isn't deleted in this function. + // z0dd - ZOD, 5/05/04. Add a bot for every client drop if balanced bots are set if( $Host::BotsEnabled ) { @@ -1006,22 +1083,90 @@ function GameConnection::onDrop(%client, %reason) AutoPWServer(0); } // reset the server if everyone has left the game - //if( $HostGamePlayerCount - $HostGameBotCount == 0 && $Host::Dedicated && !$resettingServer && !$LoadingMission ) - // schedule(0, 0, "resetServerDefaults"); - - // ------------------------------------------------------------------------------------------------------------ - // z0dd - ZOD, 5/12/02. Reset the server if everyone has left the game and set this mission as startup mission. - // This helps with $Host::ClassicRandomMissions to keep the random more random. - if( $HostGamePlayerCount - $HostGameBotCount == 0 && $Host::Dedicated && !$resettingServer && !$LoadingMission ) - { - $Host::Map = $CurrentMission; - export("$Host::*", $serverprefs, false); - $Host::MissionType = $CurrentMissionType; - export("$Host::*", $serverprefs, false); - schedule(10, 0, "resetServerDefaults"); + if( $HostGamePlayerCount - $HostGameBotCount == 0 && $Host::EmptyServerReset && !$resettingServer && !$LoadingMission && $CurrentMissionType !$= $Host::MissionType ) + { + // Timed Server Reset: $Host::EmptyServerReset = 1; --- Time in Minutes $Host::EmptyServerResetTime = 120; + if(isEventPending($EmptyServerResetSchedule)) + { + error(formatTimeString("HH:nn:ss") SPC "Previous Timed Server Reset schedule cancelled..." ); + cancel($EmptyServerResetSchedule); + } + + %resettime = $Host::EmptyServerResetTime * 60000; + if(%resettime <= 0) %resettime = 1; + $EmptyServerResetSchedule = schedule(%resettime, 0, "ResetServerTimed"); + error(formatTimeString("HH:nn:ss") SPC "Timed Server Reset schedule started..." ); } - // ------------------------------------------------------------------------------------------------------------ +} +function ResetServerTimed() +{ + if( $HostGamePlayerCount - $HostGameBotCount == 0 && $Host::EmptyServerReset && !$resettingServer && !$LoadingMission ) + schedule(10, 0, "resetServerDefaults"); + // Instead of simply resetting the defaults, reinitialize the + // entire server... + // ReallyQuit(); + else + error(formatTimeString("HH:nn:ss") SPC "Timed Server Reset schedule cancelled (Someone on server)..." ); +} + +// resetServerDefaults() +// Info: Re-load the current server prefs and reset some variables +function resetServerDefaults() +{ + $resettingServer = true; + echo( "Resetting server defaults..." ); + + if( isObject( Game ) ) + Game.gameOver(); + + // Override server defaults with prefs: + exec( "scripts/ServerDefaults.cs" ); + exec( $serverprefs ); + + $MaxPlayers = $Host::MaxPlayers; + $BackupPassword = $Host::Password; + $Host::TimeLimit = $DefaultTimeLimit; + $NoBaseRape = 1; + $Host::TournamentMode = 0; + + // --------------------------------------------------- + // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + //convert the team skin and name vars to tags... + %index = 0; + while ($Host::TeamSkin[%index] !$= "") + { + $TeamSkin[%index] = addTaggedString($Host::TeamSkin[%index]); + %index++; + } + + %index = 0; + while ($Host::TeamName[%index] !$= "") + { + $TeamName[%index] = addTaggedString($Host::TeamName[%index]); + %index++; + } + + // Get the hologram names from the prefs... + %index = 1; + while ( $Host::holoName[%index] !$= "" ) + { + $holoName[%index] = $Host::holoName[%index]; + %index++; + } + // --------------------------------------------------- + + // kick all bots... + removeAllBots(); + + // add bots back if they were there before.. + if( $Host::botsEnabled ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here + initGameBots( $Host::Map, $Host::MissionType ); + + // load the missions + loadMission( $Host::Map, $Host::MissionType ); + $resettingServer = false; + echo( "Server reset complete." ); } function dismountPlayers() @@ -1044,10 +1189,10 @@ function loadMission( %missionName, %missionType, %firstMission ) if ($AutoRestart) // z0dd - ZOD, 3/26/02. Auto restart server after a specified time. { $AutoRestart = 0; - messageAll( 'MsgServerRestart', '\c2SERVER IS AUTO REBOOTING! COME BACK IN 5 MINUTES.~wfx/misc/red_alert.wav'); + messageAll( 'MsgServerRestart', '\c2SERVER IS NOW AUTO RESTARTING!.~wfx/misc/red_alert.wav'); logEcho("Auto server restart commencing."); //schedule(10000, 0, "CreateServer", %missionName, %missionType); // this wasn't working as a cure for servers with NULLs - schedule(10000, 0, quit ); + schedule(5000, 0, quit ); } // z0dd - ZOD, 9/29/02. Removed T2 demo code from here @@ -1088,6 +1233,47 @@ function loadMission( %missionName, %missionType, %firstMission ) sendLoadInfoToClient( %client ); } + if($Host::ClassicEvoStats) + { + deleteVariables("$*stats::*"); + if(%missionType $= "CTF" || %missionType $= "SCtF") + { + %fileIn = "stats/maps/classic/" @ %missionType @ "/" @ %missionName @ ".txt"; + + // Initialize the file if not exist + if(!isFile(%fileIn)) + { + $flagstats::heldTeam1 = 0; + $flagstats::realTeam1 = 0; + $flagstats::nickTeam1 = 0; + $flagstats::heldTeam2 = 0; + $flagstats::realTeam2 = 0; + $flagstats::nickTeam2 = 0; + + export("$flagstats::*", %fileIn, false); + } + + exec(%fileIn); + } + } + + // Eolk - Testing new stuff to make map rotation less stale. + if($CurrentMissionType !$= %missionType && !%firstMission) + deleteVariables("$MapPlayed*"); + + // reset the default time limit if changed + if($TimeLimitChanged) + { + $Host::TimeLimit = $DefaultTimeLimit; + $TimeLimitChanged = 0; + } + + if(!$MapPlayed[%missionName] && $ReverseMapCycle[%missionName]) + { + $MapPlayed[%missionName] = 1; + $MapPlayedCount++; + } + // allow load condition to exit out schedule(0,ServerGroup,loadMissionStage1,%missionName,%missionType,%firstMission); } @@ -1379,6 +1565,12 @@ function serverCmdMissionStartPhase3Done(%client, %seq) %client.isReady = true; Game.clientMissionDropReady(%client); + + if(!%client.seenMOTD && $Host::ClassicMOTD !$= "") + { + centerPrint(%client, $Host::ClassicMOTD, $Host::ClassicMOTDTime, $Host::ClassicMOTDLines); + %client.seenMOTD = true; + } } function serverSetClientTeamState( %client ) @@ -1556,7 +1748,7 @@ function serverCmdSAD(%client, %password) %client.isAdmin = true; %client.isSuperAdmin = true; MessageAll( 'MsgSuperAdminPlayer', '\c2%2 has become a Super Admin by force.', %client, %name); - logEcho(%client.nameBase @ " has become a Super Admin by force."); + ClassicAdminLog("SAD", %client.nameBase @ " has become a Super Admin by force."); } case $Host::AdminPassword: @@ -1570,7 +1762,7 @@ function serverCmdSAD(%client, %password) %client.isAdmin = true; %client.isSuperAdmin = false; MessageAll( 'MsgAdminForce', '\c2%2 has become a Admin by force.', %client, %name); - logEcho(%client.nameBase @ " has become an Admin by force."); + ClassicAdminLog("AD", %client.nameBase @ " has become an Admin by force."); } default: messageClient(%client, 'MsgPasswordFailed', '\c2Illegal SAD PW.'); @@ -1589,7 +1781,7 @@ function serverCmdSAD(%client, %password) %client.setDisconnectReason( 'For attempting to exploit SAD to gain unauthorized Admin by entering\ntoo many passwords, you are being Banned.' ); %client.schedule(700, "delete"); BanList::add(%client.guid, %client.getAddress(), $Host::BanTime); - logEcho(%client.nameBase @ " " @ %client.guid @ " has been banned for excessive use of SAD"); + ClassicAdminLog("BAN", %client.nameBase@" has been banned for attempting to exploit the SAD password."); } } } @@ -3185,4 +3377,4 @@ function serverCmdcanUpdateClanTag(%client, %tag) function GameConnection::ResetTagSwitchWait(%this) { %this.isTagWaiting = false; -} +} \ No newline at end of file diff --git a/Classic/scripts/serverDefaults.cs b/Classic/scripts/serverDefaults.cs index 13e0f67..1acdbc1 100644 --- a/Classic/scripts/serverDefaults.cs +++ b/Classic/scripts/serverDefaults.cs @@ -1,4 +1,4 @@ -$Host::useCustomSkins = 0; +$Host::useCustomSkins = 1; $Host::teamSkin[0] = "blank"; $Host::teamSkin[1] = "base"; @@ -26,10 +26,11 @@ $Host::holoName[6] = "Harbinger"; // ----------------------------------------- // z0dd - ZOD, 9/29/02. Removed T2 demo code -$Host::GameName = "Tribes 2 Classic Server"; -$Host::Info = "This is a Tribes 2 Classic Server."; -$Host::Map = "Katabatic"; -$Host::MaxPlayers = 64; +$Host::GameName = "Tribes 2 Test"; +$Host::Info = " "; +$Host::Map = "VaubanLak"; +$Host::MaxPlayers = 30; +$Host::MissionType = "LakRabbit"; // ----------------------------------------- // ------------------------------------------------ @@ -77,6 +78,7 @@ $Host::ClassicLoadBlasterChanges = 0; // Blaster shoots 6 projec $Host::ClassicLoadPlayerChanges = 0; // Load up new gameplay changes allowing players to be shot while in vehicles. $Host::ClassicLoadMineChanges = 0; // Enable/Disable mine disc. $Host::ClassicLoadVRamChanges = 0; // Vehicles take damage when ramming players. + // ------------------------------------------------ $Host::AdminList = ""; // all players that will be automatically an admin upon joining server @@ -84,15 +86,14 @@ $Host::SuperAdminList = ""; // all players that will be automatically a super a $Host::BindAddress = ""; // set to an ip address if the server wants to specify which NIC/IP to use $Host::Port = 28000; $Host::Password = ""; -$Host::PureServer = 1; +$Host::PureServer = 0; $Host::Dedicated = 0; -$Host::MissionType = "CTF"; -$Host::TimeLimit = 30; -$Host::BotCount = 2; +$Host::TimeLimit = 45; +$Host::BotCount = 0; $Host::BotsEnabled = 0; $Host::MinBotDifficulty = 0.5; $Host::MaxBotDifficulty = 0.75; -$Host::NoSmurfs = 0; +$Host::NoSmurfs = 1; $Host::VoteTime = 30; // amount of time before votes are calculated $Host::VotePassPercent = 60; // percent needed to pass a vote $Host::KickBanTime = 300; // specified in seconds @@ -100,11 +101,11 @@ $Host::BanTime = 1800; // specified in seconds $Host::PlayerRespawnTimeout = 60; // time before a dead player is forced into observer mode $Host::warmupTime = 20; $Host::TournamentMode = 0; -$Host::allowAdminPlayerVotes = 1; +$Host::allowAdminPlayerVotes = 0; $Host::FloodProtectionEnabled = 1; $Host::MaxMessageLen = 120; $Host::VoteSpread = 20; -$Host::TeamDamageOn = 0; +$Host::TeamDamageOn = 1; $Host::Siege::Halftime = 20000; $Host::CRCTextures = 0; @@ -119,11 +120,9 @@ $Audio::maxVoiceChannels = 2; $Host::EmptyServerReset = 1; //To control whether the server auto resets when empty $Host::EmptyServerResetTime = 120; //Time in Minutes to reset an empty server $Host::EnableAutobalance = 1; //Will autobalance when teams are uneven. -$Host::EnableMapRepetitionChecker = 1; //Enable or Disable the Map Repetition Checker $Host::EnableMortarTurret = 0; //Enable or Disable Mortar Turret -$Host::EnableNetTourneyClient = 1; //Enable or Disable Tourney Net Client checking +$Host::EnableNetTourneyClient = 0; //Enable or Disable Tourney Net Client checking $Host::EnableNoBaseRapeNotify = 1; //Get a base rape notification -$Host::EnableSetNextMission = 1; //Let admins set the next mission thru the vote menu $Host::EnableTeamBalanceNotify = 1; //Get a teambalance notification $Host::EnableTurretPlayerCount = 10; //How many to enable turrets $Host::EnableVoteSound = 1; //If you want a sound chime during voting @@ -132,10 +131,9 @@ $Host::AntiCloakPlayerCount = 6; //How many to enable Cloak $Host::PUGautoPassword = 0; //Auto enable a password in tournament mode $Host::PUGPassword = "pickup"; //PUG password, Auto or enable/disable thru admin menu $Host::PUGpasswordAlwaysOn = 0; //If you want the pug password Always on -$Host::EmptyServerReset = 1; //Whether or not you want the server to reset when its empty $Host::DMSLOnlyMode = 0; //Shocklance Only Mode for Deathmatch $Host::SCtFProMode = 0; //Pro mode for LCTF -$Host::LoadingScreenUseDebrief = 0; //Enable Debrief Style Loading screen; Gives you more lines and MOTD +$Host::LoadingScreenUseDebrief = 1; //Enable Debrief Style Loading screen; Gives you more lines and MOTD $Host::LoadScreenColor1 = "05edad"; //Loading Screen color; First Column $Host::LoadScreenColor2 = "29DEE7"; //Loading Screen color; Second Column $Host::LoadScreenColor3 = "33CCCC"; //Loading Screen color; Accents @@ -155,9 +153,38 @@ $Host::LoadScreenMOTD1 = "Blaster is here to stay!"; //MOTD or Events Lin $Host::LoadScreenMOTD2 = "Come play Arena on Wednesday Nights!"; //MOTD or Events Line 2 Message (Debrief LoadScreen Only) $Host::LoadScreenMOTD3 = "Lak crowd early evenings after work during the week."; //MOTD or Events Line 3 Message (Debrief LoadScreen Only) $Host::LoadScreenMOTD4 = "Big CTF games Fridays, Saturdays, and Sundays!"; //MOTD or Events Line 4 Message (Debrief LoadScreen Only) -$Host::EvoAdminSwitchTeams = 1; //Enable or Disable an admins ability to switch other players teams. -$Host::EvoCustomMapLimitsFile = "prefs/SetMapLimits.cs"; //Exec custom limits file +$Host::ClassicAdminLog = 1; +$Host::ClassicAdminLogPath = "logs/Admin/log.txt"; +$Host::ClassicConnectLog = 1; +$Host::ClassicConnLogPath = "logs/Connect/log.txt"; +$Host::ClassicMOTD = "Discord PUB\nServer Hosted/Provided by Branzone/Ravin\nGet Mappacks at https://playt2.com/"; +$Host::ClassicMOTDLines = 3; +$Host::ClassicMOTDTime = 6; +$Host::ClassicRotationCustom = 1; +$Host::ClassicRotationFile = "prefs/mapRotation.cs"; +$Host::ClassicEvoStats = 1; +$Host::ClassicStatsType = 2; +$Host::ServerRules1 = "\c2if\c4(\c3%client.fun == \c5true \c4&& \c3%client.Llama_Grabs \c4< \c51\c4)"; +$Host::ServerRules2 = " \c1Be_Courteous\c4(\c2%client, %game\c4);"; +$Host::ServerRules3 = "\c2else if\c4(\c3%client.attitude \c4!$ = \c5%client.fun\c4)"; +$Host::ServerRules4 = " \c1Try_2_Have_Fun\c4(\c2%client, %attitude\c4);"; +$Host::AnimateWithTransitions = 1; +$Host::AllowAdmin2Admin = 0; +$Host::AllowAdminBan = 0; +$Host::AllowAdminPassVote = 1; +$Host::AllowAdminStopVotes = 1; +$Host::AllowAdminVotes = 1; +$Host::AllowPlayerVoteChangeMission = 1; +$Host::AllowPlayerVoteSkipMission = 1; +$Host::AllowPlayerVoteTimeLimit = 1; +$Host::AllowPlayerVoteTournamentMode = 0; +$Host::NoBaseRapeEnabled = 1; +$Host::NoBaseRapePlayerCount = 14; +$Host::AveragePings = 1; +$Host::GuidCheck = 1; +$Host::MinFlagRecordPlayerCount = 6; + //LakRabbit -$Host::EnableLakUnlimitedDJ = 1; //Unlimited disc-jumps if enabled -$Host::LakRabbitNoSplashDamage = 0; //Splash Damage enabled or not -$Host::ShowFlagIcon = 1; //Show flag Icon in lak +$Host::LakRabbitUnlimitedDJ = 1; //Unlimited disc-jumps if enabled +$Host::LakRabbitNoSplashDamage = 1; //Splash Damage disabled or not +$Host::LakRabbitShowFlagIcon = 1; //Show flag Icon in lak diff --git a/Classic/zAdvancedStatsLogless.vl2 b/Classic/zAdvancedStatsLogless.vl2 deleted file mode 100644 index ede2d3b..0000000 Binary files a/Classic/zAdvancedStatsLogless.vl2 and /dev/null differ diff --git a/README.md b/README.md index 6c0736a..9c7a390 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ Discord: [Tribes 2 Discord](https://discord.gg/Y4muNvF) ### Features - - Improved NoBaseRape asset handling - - An independant team population counter + - Improved NoBaseRape Asset handling + - An Independant Team Population Counter - Team-balance notifys - NoBaseRape notifys - Team Autobalancing @@ -45,15 +45,12 @@ Discord: [Tribes 2 Discord](https://discord.gg/Y4muNvF) ### Prerequisites - Classic 1.5.2 - - Evolution Admin Mod Classic Version ### Setup - Meant to be installed on top of Classic 1.5.2 - If the file isnt on this github it is unmodified in Classic 1.5.2 - Place github server files in Classic folder - - Place github evo files in Evo admin mod .vl2 - - Place Evo .vl2 in Classic folder - Run once to create Serverprefs - Open Classic/Pref/Serverpref.cs and modify to your wishes - Run using Classic_dedicated_server.bat