From facba6d9cd97f7234b93c027a2a8638cc7917a6e Mon Sep 17 00:00:00 2001 From: ChocoTaco Date: Mon, 23 Mar 2020 16:23:42 -0400 Subject: [PATCH] NoEvo Redo --- Classic/antiLouEDITED.vl2 | Bin 5643 -> 0 bytes Classic/evoClassicTaco.vl2 | Bin 71335 -> 0 bytes Classic/prefs/MapRotation.cs | 538 ++++ Classic/prefs/SctfPrefs.cs | 2 +- Classic/prefs/SetMapLimits.cs | 573 ----- Classic/prefs/evo_mapRotation.cs | 530 ---- Classic/prefs/serverPrefs.cs | 853 +------ Classic/scripts/CTFGame.cs | 223 +- Classic/scripts/GameGui.cs | 2181 +++++++++++++++++ Classic/scripts/LakRabbitGame.cs | 37 +- Classic/scripts/SCtFGame.cs | 135 +- Classic/scripts/admin.cs | 37 +- .../scripts/autoexec/AntiLouExploitFixes.cs | 489 ++++ Classic/scripts/autoexec/Autobalance.cs | 22 +- Classic/scripts/autoexec/EnableLogs.cs | 61 + Classic/scripts/autoexec/EvoStats.cs | 431 ++++ Classic/scripts/autoexec/GetRandomMaps.cs | 131 - .../scripts/autoexec/MapRepetitionChecker.cs | 119 - .../scripts/autoexec/MissionTypeOptions.cs | 14 +- Classic/scripts/autoexec/NoBaseRape.cs | 42 + Classic/scripts/autoexec/NoBaseRapeNotify.cs | 8 +- Classic/scripts/autoexec/ObserveFlag.cs | 265 ++ Classic/scripts/autoexec/TacoOverrides.cs | 16 - Classic/scripts/autoexec/TeamBalanceNotify.cs | 2 +- Classic/scripts/autoexec/VoteMenu.cs | 1572 ++++++++++++ Classic/scripts/autoexec/VoteSound.cs | 11 +- Classic/scripts/autoexec/zCheckVer.cs | 2 +- Classic/scripts/autoexec/zDarkTigerStats.cs | 4 +- .../scripts/autoexec/zDebriefLoadingScreen.cs | 70 +- Classic/scripts/autoexec/zMineDisc.cs | 196 ++ Classic/scripts/defaultGame.cs | 183 +- Classic/scripts/player.cs | 2 +- Classic/scripts/server.cs | 284 ++- Classic/scripts/serverDefaults.cs | 71 +- Classic/zAdvancedStatsLogless.vl2 | Bin 11070 -> 0 bytes README.md | 7 +- 36 files changed, 6686 insertions(+), 2425 deletions(-) delete mode 100644 Classic/antiLouEDITED.vl2 delete mode 100644 Classic/evoClassicTaco.vl2 create mode 100644 Classic/prefs/MapRotation.cs delete mode 100644 Classic/prefs/SetMapLimits.cs delete mode 100644 Classic/prefs/evo_mapRotation.cs create mode 100644 Classic/scripts/GameGui.cs create mode 100644 Classic/scripts/autoexec/AntiLouExploitFixes.cs create mode 100644 Classic/scripts/autoexec/EnableLogs.cs create mode 100644 Classic/scripts/autoexec/EvoStats.cs delete mode 100644 Classic/scripts/autoexec/GetRandomMaps.cs delete mode 100644 Classic/scripts/autoexec/MapRepetitionChecker.cs create mode 100644 Classic/scripts/autoexec/NoBaseRape.cs create mode 100644 Classic/scripts/autoexec/ObserveFlag.cs create mode 100644 Classic/scripts/autoexec/VoteMenu.cs create mode 100644 Classic/scripts/autoexec/zMineDisc.cs delete mode 100644 Classic/zAdvancedStatsLogless.vl2 diff --git a/Classic/antiLouEDITED.vl2 b/Classic/antiLouEDITED.vl2 deleted file mode 100644 index b8aed0e5548eead31c3a85f33657554ab8e17783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5643 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 diff --git a/Classic/evoClassicTaco.vl2 b/Classic/evoClassicTaco.vl2 deleted file mode 100644 index 66848420ab7f2108a9c3248edd19445e7cc540ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71335 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

^C96>!GSm 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 JZ3icJ;D6U~?i2t3 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 ede2d3b63dd30cc18aed0574e5b126c765eab5bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11070 zcmZ{K1CXXovUS_GZQHhO+xE0=cTd~X*0gQgm^RAu41}zR-D)*Vj%>+(dz`eCQuIEK0#U@0*jf z{%q*yRpahcQ-K=#jkv_EKMxjq)^gaVqNrq zS(2vm9NyCnE;Y411IutjF6F^j*#m{JtW-xM`e*q6~fDWjFW4v>fI zGv=*yaqC8Duo|#-J~Z`Yg%Vlwha~N$D!pqMRj}-!-cvFLRd2 z!Qw7(V0EvJ*7y!@bp0sok`?Ee~JTav{q`a8rkd)551_;gYAYaXQmWzA>)#6s>O1I^7fT=j273 z_A?=Giw7is!IZZ3*GdA9&#h>?rb3xtJuD~J1Xz530Y?cfj%s#;ugLFHpWakph^9i6 zHZ-?FpP-tTkNq4Qhn{I){$spmgk9GjAPYI$jv*S+zC3_@CdbKrm9e~`oiYwUVgp*L zydf81$84!S9NZ%74bhrqpGffHoZUg3#w~Udtoc-HqCbRI%O96NJw~(XokXsSj^?rz z@t2BwKYoqYZovN@FDM{@kC#Gc4_Vk75)e?191sw}e>yMThUOlQR*sIgf1R02JX_aw ziJL~&lrJZXeTe0Zz+6q|3$&Y#MEPI3fSyX}5_c z;H#&nC%?|BK}Led$A|G4%wlUj6-i5powA-)BKcc?uW?1L-kUKD>^ay)Y*egzi=Oe^ zV}jfFH7hZydbyoeENtb~e5O{IlYfM>{%W3YGjV$xx5$$my;!|`yEaQmUB_rHJB;k$ zaFy+hA#MdX3$QV$Lr?rkemEpPcaV8-7}A4W0BWOiP~zkWt{1Z*dWK^mu;~et?^?(~ zVeTg)FFC1Qr#i_{*M6?b=_#)7BI)NhK(~<1jme$(lkAEEX?h&7z+K3m$8M2{U*9O; z%}nMI7KnVQO%7{fkupDDKpS@&58poYotyQeL87lKUe6&#)PZ;mXP}y&cQ0?pD(B95 z^foi(X6X$Xqi_3BKh$Vdb+=qj2IgTyC5-Pr!)JW6Vp75YTyEwLYaR$^&o~>{wPLp4 z|NIg2@!G&{^~}9)>$8CSgfujwDK9H;r||^dwVQsy@JZ3hMMnP!C@I(+IN1 z{l@19%&&P=(~^ylQ!MrwRPHl8pf2zAu5&_qa~=o36K5jzm`#M1?#4q6 zg14eehCCf3XUE6f5~=` z5k`y)uw_abP|IFC&~HTwqrHdVhRUQdWF%FFBZk=~+Lwox$(*&foxZ`+n<^IR^oJa0 zr!@<~Z^Co2*oV`>b3a4lQJB%Zr>0uQgZD$v;?#y1#{uievcREvddm+w0W%nhlAez} zQ`b@_Irb0(9;^2kSYX0Zn^f6UiQ^ZrF_(IfiVZW~z_Ecr?O#;lGl_jcz8PkIhPrvX zSP(~n)TUzGAO^O$gL08FGJFhJ9wH(H{Sum|@=W1XVrjY|L$XsE^#TSX{-)02B$FDJFo$rA#3j>)Oak2Ey#YLRk_`}s@ z<${32scc!`jl4zD0M@=YWj*iY4lOGLel~=OS<>xZ!Lc@^dB5Ogckvc4q4ZTNN8Z&L zZMw`0WBN8VYm$hmEwh1}fY!2(X`Lp2_UUzP&Df_dR&`hwIFV@yJxJVCO3Uu5sH;4& z)2NxkfZxnnpH|K@5J*i^ii)6<0R&>5F#Yg-jS;P#z~_W%kkjnjfXTnGUn<^@RTEa*O&?M(S8QsRo5C? z@+qw|l*EsvKwm3~6jP5ID{?F_Hisyn};IK;uV?UnJx>r1W*Zr55s|BI7xW;0 zfHI|ahti3KhMp~Zwwnw4I=~7-29F6;SX=oycdV$5wZqGNWx~29Glkm&|DuiAD$0w1 z7Sl#mNsS48(Hx+G-ZURiatHM-4;xO)ae~_Khv{$HWk7;u9U9XYk7Vb6DQC2z6b)Z% zBPjAEJfRSa>8O@g&vO<8`%XYl&C}}w#_R$xasBB68)M`%Y#m}lPTkT15v!U1CWi;D z2YI^^agh1&h2Ii#_Lw2uvlJw1;HQG@$xGBC3tS%vv<=x>B<~TC6`bG_lhiK>GBoQI z;bzmTZMCZ9sg5AnhkcbREzS(tZw(zL4E;R~ zGP&~g-so5orRT5KV8!pFa1zwa7Eg&xR%(H3#)4ECoDLmWHmMTn8+?E^C-`KTs5WXy2oDif>jrW9nqeK2t?{(ksYC)QVJ=8v3nj5~rl7 z%$JHDK#W`30>?5l*1Yj*49eo`d{N;E3P~j=c~ubnVFh`#=xTK+N!9BRzXC;g>l*X<}PSBhG%5TOQFo_88`v zbt{DHr05CjqR(2*hJHrDWo(DWL`tidxsPRp6eeIdn7(vSgpfTKHkmqA$2)@ch)XXP zW(b(4PYpzHuZ11}(Zpl8SujrMESIjLCddCXx|( ze!bT@Ep%sqo;Q4H_YB%rapRh$Tk@ zq$TeG#}&&({JAA^PDbi^2>PYYj)+w>SP~RQ$G}0#R`f6>vv>-3w3=Ohto!8~5y_8{;%1(!FQ4faHqbPmZUV^^LYm`O=*S#vuq_y2Re)meO!5-kWTAFquTVvP1 z*_)r7z*^Lnb$Vk)>FPWOz;K>#dX<7fON8}8nCSY z#oa+I)?striT7UbXU;i)2F_6mu%T2{pv?qC^RG*gYl{6Mbt%(fIWLlZFvd**7(nTf zTrVd6@>T#2bBit(Rnte0Ma+}GO?pNW2--!vq*ie{fD@@c#2grpts15mBrK)mFhE#D z=Zs{!J8Tp6(}nQTRu0xHa6%#EHuyl91=KfQfnR}0I880tXQNugQ)XJcHa<-aA7kn- z-V1di(+A=Wzr#$fUz(}1q_F+QyiRu$EXF>35ODJ6_W}t-?wYMe4y_%=T`vW`VoNaN zOfSEsE)$E+Cn|}(V2AL%$~qWA6YxzkQLX}{0~A#{aziYR2a_%FthX4zzdta7Cl%Lt zYoT~M3QvgiGStOZCN z^1ZilCJ$y6E=7kDTentH2}KXfnpr{Z*K5fNJcL0iP8I>z4T?0zkzX9nxe>uYlZGKs zQr#3BKjT=W)(~<@G?K1tTvI2jCd17P9w`-0N~St?F%pub_U(k-OJ8C(@hc4iy2j>} z-ixK|p0uJ*RV!OTlP$+oVfa)QmyHh*hg^Xp!z!iLC^QwJ^9tFgZ<;}-r}C(F<79W8$v=$ z%kGiuQ#(srtrqQ1yQ(PQCPJZ2EgF}QC{_18I0hO19~eLv5{qVPlir#{l&AVKbxxG` zXn85r&)%Qe_cIL@u;6+>TE1qoXS&8ed2@9)?U!uA4XQ33cOB(9T8!frpN-d8)fYuB zgd#=-gxMm6IXMae{M_dY=cefhzg0(u9#4i2u`Ig!*jXD%^>wTn0u{<+HB2LK-#Kz6 z{GZGZpB#qvKKG}X8JQ{e@BN^{r>vHCt_X8E5&*NFscNYF0P=_Jn5FNbAkn8I5(fa4 ztnsAcP$24SgWcp0Am-|=sJX7%%ak~8j6-)5$~r1=6da9kN2TKER_>IZiv1-R*x#$- zkiEx)iK`D?qsaKL#yr}FG=hhIk&w1MN+kV&j@e#%t~&OG5}{v*&WC9j+G)3e&Av%u zCX-+_KP4Q>4|{E{1c}(jTTJM9n^o+D*}inhJeMef3j#zuh_8V?Wyw>fsT;KouIeop zf2qwUKg{rW%@sny8-d{O7WZvXPCNW`^-oK^6^2BZZG76BSX6}q*fP^AZ=D1ZzU-ptG>sOQO)G_#nnXp5~vN5x;RflYYc^K z0^Fl9zD93GLf6LXr*xBR-KHz;dn)yEmu&gS*qa^$tMCG5uqp{(2g&CbS@;vRZZ^HV zP#Kfb@AZkr8E%En&w0#c=Zaztv(N&RgNGoulQhSZrl&I!ub;9@u!>J?uY@2;n%6w^ zbsw@z@KxTA<@fOK*x#AMPp7or7<8lKbG_5zHJiuR`$rZe*{SPWQVPj~F8elY!lx1g!FsLo8aq;Q>^Mhk;r53>lS0x+w)| z+o?U`?Upq2i8rbm?{gpOlU}Qsr4PyzdG#`C`_zfLCIN$CL}!>R0!RxI?mlYCf|Idi zH3W`_xF#RHMv;PU3W~qKbazd4jF5lGZmeG}JPh}~Xu77Cl77jIAtjh}9T#7{&e6W` zs+mn;3s?p2=$pG{vS9)ja&MB?7HzJTE9QBz`fAJ>Cbw2e)!`@k@}KA%z3?SuTs z-&MSXdl+nai%N)2(gOOmX+kB=uKPdGn}Gal;d%JD+_9fBb&XSk536Ri;Z$EThg~GLLn) zbp1gnS^MN%luTR83JTZGYva%v)YyLO?g|QY(=LDT&6?4sIb_hcENNs4KZ%j)y1Xh= zqXKKtw{r0tLwp;gP9K-is9uY{c~)cn^|;a)E@!nQKA!)6t%HM)TqA~^Ed`|BhJ>#= zNgBhf!Klb983>`altBoh!O`>!O7so9=WS5x^%c(uIy{8`A$80rFwfYJ7m5fx0;G1E>a|EO@MPkR7Pf)N6p4gvmX{5%+#%W%mMd>y%I7#iGXhl z`f^=!a=>Uagegh8tJF655j!P0Bd2L=HYrca2v7&;^a||=Z|hmROcdRO5~bv#y7B1A z5NGRZ_fQVdx9Pg^_-@z;A9+#>uP|*~7qu_rspI~zN%xk@E=^&gmQzbg3!c)RNp>^k zyTX~Z;$i!yvVF}NqqE%s9@gM~FtUB@OoTQ<2p%1msv4EQ1siNZsumI(>SWzyM6+X& zdp-CeL?l%{O^fl3MC@`_eJ+a!;A1?Fu+-DP5E|ddzP;0-5Yh7Y;cc2`lC)5?At+*Y+4jKRrb_q}T=Frz^ z%Avh$2wtgzIry1ARRx?%&KJaW30pn=TL7^uy=gmYv?`>zH$SpGNK?WGgm~k7+k+lV zN?}%5`LAbxnO;C5`Zq-)n*>ok7n{b66lbu!46!CB-iF4Bc`@d>(95PXrC|dD=f0qg zI#CYk;VI1zF|(}>LG@SLo7t7mwf(%tW5AX|>#rZ&uzPOCHAXsCCZ|(0__cIo_L{kJ zj?@A4i=yY8JR18tEA1FFy%A8~FmJc*(;qeVy*-10-7NLWLms5c`<)x(Qot54uZdu3YWpINLaXX>@{(ZJQiZPTECWg zIyIReC^rZ;9+NqK^toa?z=p%A+Tdxokd=upYMwp`?5qu}HO^IU@?EBxbL!BI84KouBPR+z}%|> z!{_@Y8a#k;t-$>A-3+-Ue|T_RKZKqA*v+5{G*%^M-}@D%;y>%}vc6eZU)#6AQZ__cOT z@5xxcyEtcB;j&nIM+n=0vzQvMu6iw57Rt!9afnE`tY>3KBtrqj%^gNoPQNizbg4YEfDFlrU62^-wa-+UM|Y=W$0K!jVXw2bj)hbF3&T3z%E9 zaTQ#jVD6L+X?q&hf+K<%K_@Z~{f`Y!%tG6&0(TUlTlMuWb7*3uc_70nd^ype+b;|v ztd;=(Oiejc|K7x7j8ylIP2pGRi@B-mB`va#*`WE;Vo#GKs{IxcJKD~#4xfOIs2!hM zAn%`s-RtN5_uUT9+k@Q>w{G*>-P4TA);mo%C%1(|);{s9t%^epB~HumSPFje-_>9{ zwQKn{YIN>Yf5U`JudN)bm3ZZJVl9Pe5k6d_)&!a5!Krql~WZK|b^Pr`^071@vl)fYJzm~AGjyF)71X#;>n_LhQOHt%e z5(~KDVcnOUxJYyr9S42N!^U1i3ge+j8rP(HQdu4itg$;uMVO_cDsN?}WrUl$A4OId zYVB_rf>L^fehmIvJbmIt^nj$P)y=Q!r)7?uF7q@;&UOE^lPZht^&ozVD4255>w|ou z#jSoDv}UK%;#}S#)>avVOw3 z*N_$Dq+``t*Bm@hU3jcdW>y8ny|BA(B#Lq$PMsr!d05mBg#^fvFV)m_LKGyREU*YI z_T<9{r#fEF>E8|@emiDZs`X@8gKgGq8u1<>Nk3>2T3oGN27lO}iNz;psbb+Z`N0bl zt5#HDEw@lIk+IYo%^Y=|&uZb1Y7l+EI+b8f^y$W}#W{Bq@#!~OO8Bp`=-|&|5|v_O z?>P(*kO(0V5dMFDOmcO1a&mNW`%@J)WB*p%ka)4Ac?@{L=|3t*D$s4FuHFC%Wuu9W zHLEGL&O-Q|yjkbBoeLj_@%ikxv-O$@X|<>X`?U4!zw>&71X0*!zBh^4*}dzZ)1YQJ zf!!6NabDcxk$Z!+nt(I;qFJK7?~%A2mW;f4W5kEKm|De9N5rMZm;8*U0)47y1r??c zWUVy@$9BwwZVgG4MtvuDc z^uuOhH(^FJPNp7SR4wJU$6ivSzo1Dp4vmet<*$`#9>erjCNsYHQH{A5Ow09so?i2b zJGqtQQ0#^@A6D=XgDD`hai}$rzeXDa0~a&B8(1&Y4npPJz!xIU=?cffhA8|@~v~F7~j24j5r#2zc0b4&a;kvsPzW|n2eaBOY%Fb^lr1vLXDqQm`f?* zbhH3kn@3&LurL}vSWwBfFrAo!`p5>jAM>Nfj%=<+=eIhKPD>PhygTQCq8=5MQxS1W zRC@0cG4f_fmSxi|1HNh3K3mMRO6_{~BkO385M?MOIon2?Ppo@4o?MOb>bxlT9~nEd ztrO!C?Rja?Qg}rfx}zINR{#!MuwolZvZR`3gG4`bRPTW+S3UG1}_pq z#zNY1WRaC7+aR06u-Ab!c;0Rn5xE4|rY3HwI^`+SycC&%nQrvRy+Nui;$+!tE8Cnz zh)eHk&eS{x&-$5q!Q-^hN&ur$8VtN0i4QIkT6%eMq5am-=c|flarA4T_~t_Do-Q%O zF#M;XrgbMm;Iwr(AYtSLuy*6i{Q@3Pk|QpADLb6LA|iX8BhCezV%;auvey{`+IE`o z);)ex2Asqy5YVd9`CBj-(OdIla?eZmm15Chje+h94Q^av;DQg>a%n?ms?vWS&K(~@ z|0JMG;9CC?!cT|pc;K^}ZLBu=;=eS8*jQV&rLf}$ z-}kY!#RSxMG@L6+X*2+GN6D9MC4Q$`_uYGIe}g^7vB#kGWrapouqU=2#U!Er8cj#T z8XE!&ST?`JH~cuggj{%|ByMVl-oL;uvu-UGvKHntt&nRke{qK<_+vZ#_5`j7R<-@c zZKSTD2+*l-Z!Lg@_-@SXKgjeef`*3x_ld``v^11g{I1*s{IWOZ_tVLaRFqbUQ($TL z0L;gmp4ArsmeT5ncpAA!nTqM}0CSS4I@aa;`{{#7Yz%gaLj7{AI)DnlzO5A>0KYJWY(L&HgE#?vS0sQGj(;=tvca zk7I#2+o1j^jw^=EaB8q;$2UeZLV@545lOrw6G#2M9ks|K{9EiUDo!d*kZi@#Nt|Cr$wkR zE6zRz;}h#z$qUxVosdz3DNPT>zW6S$hzC+f6tI|MIsmSigl$6HkZn)Z2^`)$5U@S* zeYuC-s87WMN9L;*erK?s8LchjbA=Vm4l(eEN~)KS&g!ycZ8{=E%tn|zn6BeZHLd8o z_U^G^IB6Cb+-i+}2k{Ln65r2wkk0QuJUOZUb!5`yC$(s2CJ9aUf+6_Ce4tY(6jg=e z2}+Us_+eb$3_oT(VmMt3<<9SxDV}YXI`uB8XD+x-2Z&9gx?^R^0c>cE-@He_ z-9ce{*8rN`^Cw5%OTC$JzfHYlVQ2hW1e%MjMnII z4(!u9C<=`gI-7aRx(wN&FV8k(luYi~es9VAOkd(e$GdEZq3b8r*0Hg)I(RInpxVS-pIJ1DV>+jjUvnN^Q)S+xQW}b;=#%vHjA?ag~@lV3%(6hm7>VvdBF7; zgX^0esRFRNbIs+taQ9K5D>SZy19d`)F}r7Pcn?4l0Tz_`!$>XP9KPKwKPz+z_}?8OWU#a;IXxPWN@J39!FWNDW5; zhUVeXJFf2|5e{vls0Z}F(fDmj#e5#OsC%9JB5A7)aR}OeN5Awb5jFLEJI=+Mt1B~C zi45nyS4kQ2HFG+@z8kT~nKJ3ntLm_fU1ffq!ZD`V)gDKvdCl&gr6E0##oj1Elqg|* zj=GkHFTo7|m=#c@(SjU}jGA66$|DsFX*2Z7*l+T()gNB5H**F1&P_og1})#7uh znXXwDsQ&319$&@s1*9Yk41xyw-<6MlO65O>1av9<7ye5J`QM}dQbPXI{)(dbGyUJF zzv&`@K?H&RBK=RwNV5M4C;EfxfBt_9|39514A5UbKtRAiSU_cp+Scp~OTZaa|HL>L z^?$7YO7MTV{#{k}cdjtd|G@SCY0Uo47h!xy?6toHZ2I<;>i!4qdawS0f9L!6e(c}* zI{$3Izvbp___yxt-}zihVyH#Wmw+$)|A{9UVgFeFo$uc-I)CR|_;c_14}AZ+_WYfW oR}hNuuk`A1<~sgL4-IVUAE+b?4)NEPL;U%e{)ky$sQz00Kge5wyZ`_I 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