Create
Return to post

Comparing difference between and

View raw
  • settings
  • {
  • main
  • {
  • Description: "Zombie Hunter. A TDM zombie horde mode where you have to kill as many enemy bots as possible. Bots spawn as Echo and shift into Reaper, Genji, Torb, Moira and Roadhog as rounds progress. If a Bot kills you, another might respawn and take your form. By Puppetsquid. Code: 38SY3"
  • }
  • lobby
  • {
  • Allow Players Who Are In Queue: Yes
  • Map Rotation: After A Game
  • Max Team 2 Players: 0
  • Return To Lobby: Never
  • }
  • modes
  • {
  • Team Deathmatch
  • {
  • enabled maps
  • {
  • Black Forest
  • Castillo
  • }
  • }
  • General
  • {
  • Allow Hero Switching: Off
  • Game Length In Minutes: 15
  • Game Mode Start: Immediately
  • Hero Limit: Off
  • Mercy Resurrect Counteracts Kills: Off
  • Score To Win: 200
  • Self Initiated Respawn: Off
  • Skins: Off
  • }
  • }
  • heroes
  • {
  • Team 2
  • {
  • Ultimate Generation: 200%
  • Ultimate Generation - Combat: 200%
  • Ultimate Generation - Passive: 200%
  • }
  • General
  • {
  • disabled heroes
  • {
  • Bastion
  • D.Va
  • Doomfist
  • Echo
  • Genji
  • Moira
  • Orisa
  • Pharah
  • Reaper
  • Roadhog
  • Symmetra
  • Torbjörn
  • Widowmaker
  • Winston
  • Wrecking Ball
  • }
  • }
  • }
  • workshop
  • {
  • Duplication Target Selection: [1]
  • Show Server Load: On
  • Testing Zombie: Doomfist
  • }
  • extensions
  • {
  • Buff Status Effects
  • Energy Explosion Effects
  • Spawn More Dummy Bots
  • }
  • }
  • variables
  • {
  • global:
  • 0: round
  • 1: maxZombos
  • 2: zombieList
  • 3: roundSetupComplete
  • 4: finalRound
  • 5: timeTillNextRound
  • 6: SURVIVAL
  • 7: RETRIBUTION
  • 8: pickupPoint
  • 9: pickupEffects
  • 10: pickupTimer
  • 11: max1Clone
  • 12: healthpacks
  • 13: wayPoints
  • 14: O
  • 16: hasDummy
  • 17: allSpawned
  • 18: MaxHeroes
  • 19: DisableTorb
  • 20: DisableGenji
  • 21: VisIt
  • 22: zomboSelection
  • 23: X
  • 24: lockedHeroes
  • 25: allowedHeroes
  • 26: doUltimate
  • 27: initialZombies
  • 28: singleZombie
  • player:
  • 0: possPos
  • 1: it
  • 2: objv
  • 3: target
  • 4: zombi
  • 5: FacingRand
  • 7: nanoBoost
  • 8: mimic
  • 9: aimOffset
  • 10: K
  • 12: MercyOveride
  • 13: mercytarget
  • 14: mercyoffset
  • 15: teamFollow
  • 16: LastHero_UltCharge
  • 17: closestObjective
  • 18: multiPos
  • 19: objLOS
  • 20: walkables
  • 21: VisFX
  • 22: duplicateTarget
  • 24: latestLocs
  • 25: swapheroLocation
  • 26: closestPoints
  • 27: bonusHealth
  • }
  • subroutines
  • {
  • 0: updateObjective
  • 1: spawnpoint
  • 2: removeSpawnpoint
  • 3: makeWave
  • 4: goToHeroSelect
  • }
  • rule("Get Hero List")
  • {
  • event
  • {
  • Player Joined Match;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Global.allowedHeroes == Empty Array;
  • }
  • actions
  • {
  • Global.allowedHeroes = Allowed Heroes(Event Player);
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Init setup")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Disable Inspector Recording;
  • Global.healthpacks = Empty Array;
  • "disableGamemodeCompletion()"
  • Global.zombieList = Array(Hero(Echo), Hero(Genji), Hero(Genji));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Reaper), Hero(Reaper)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Echo), Hero(Roadhog)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Doomfist), Hero(Genji)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Moira), Hero(Moira)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Reaper), Hero(Doomfist)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Moira), Hero(Roadhog)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Doomfist), Hero(Doomfist), Hero(Roadhog)));
  • Create Icon(Number Of Living Players(Color(Team 2)) == 1 ? All Players(All Teams) : Empty Array, All Living Players(Color(Team 2)),
  • Skull, Visible To and Position, Color(Red), True);
  • Global.SURVIVAL = Workshop Setting Toggle(Custom String("Game Settings"), Custom String(
  • "Survival (requires capture point to respawn)"), False, 0);
  • Global.RETRIBUTION = Workshop Setting Toggle(Custom String("Game Settings"), Custom String(
  • "Retribution (eliminating a player's zombie respawns the player)"), True, 0);
  • Global.allowedHeroes = Empty Array;
  • Global.DisableTorb = Workshop Setting Toggle(Custom String("Horde Settings"), Custom String(
  • "Disable Doomfist (+1 Max Player Heroes)"), False, 0);
  • Global.DisableGenji = Workshop Setting Toggle(Custom String("Horde Settings"), Custom String(
  • "Disable Gengi (+1 Max Player Heroes)"), False, 0);
  • While(Global.DisableTorb && Array Contains(Global.zombieList, Hero(Doomfist)));
  • Global.zombieList[Index Of Array Value(Global.zombieList, Hero(Doomfist))] = Hero(Reaper);
  • End;
  • "zombieList[zombieList.index(Hero.ECHO)] = Hero.DOOMFIST\nwhile createWorkshopSetting(bool, \"Horde Settings\", \"Swap Torb for Doomfist\", true, 0) and Hero.TORBJORN in zombieList:\nzombieList[zombieList.index(Hero.TORBJORN)] = Hero.REAPER\n__end__()"
  • While(Global.DisableGenji && Array Contains(Global.zombieList, Hero(Genji)));
  • Global.zombieList[Index Of Array Value(Global.zombieList, Hero(Genji))] = Hero(Echo);
  • End;
  • Global.MaxHeroes = 4 + Global.DisableTorb + Global.DisableGenji;
  • "progressBarHud([player for player in getAllPlayers() if timeTillNextRound > 0], timeTillNextRound, \"UNTIL NEXT ROUND\", HudPosition.TOP, 2, Color.RED, Color.WHITE, ProgressHudReeval.VISIBILITY_VALUES_AND_COLOR, SpecVisibility.DEFAULT)"
  • Create Progress Bar HUD Text(Global.pickupTimer > 0 ? All Players(All Teams) : Empty Array, Global.pickupTimer, String(
  • "Resurrecting"), Top, 2, Color(Orange), Color(White), Visible To Values and Color, Default Visibility);
  • Global.X = Custom String("gamemode by Puppetsquid.");
  • Create HUD Text(Global.timeTillNextRound > 0 ? All Players(All Teams) : Empty Array, Input Binding String(Button(Interact)),
  • Custom String("{0} {1} {2} (workshop limit)", String("Max"), Global.MaxHeroes, Custom String("{0} {1}", String("Player"),
  • String("Heroes"))), Custom String("{0} to {1} {2}", String("Interact"), String("Select"), String("Hero")), Top, 3, Color(
  • Orange), Color(White), Color(White), Visible To and String, Default Visibility);
  • Global.max1Clone = Workshop Setting Toggle(Custom String("Horde Settings"), Custom String(
  • "Max One Clone Per Player (spawned on death)"), True, 0);
  • Start Damage Modification(Filtered Array(All Players(All Teams), Current Array Element.nanoBoost), All Players(All Teams), 50,
  • Receivers Damagers and Damage Percent);
  • Start Damage Modification(All Players(All Teams), Filtered Array(All Players(All Teams), Current Array Element.nanoBoost), 150,
  • Receivers Damagers and Damage Percent);
  • Create Progress Bar HUD Text(Global.allSpawned && Global.timeTillNextRound > 0 ? All Players(All Teams) : Empty Array,
  • Global.timeTillNextRound, Custom String("{0} {1}", String("Next Round"), String("Incoming")), Top, 2, Color(Team 1), Color(
  • White), Visible To Values and Color, Default Visibility);
  • Create Progress Bar HUD Text(!Global.allSpawned && Global.timeTillNextRound > 0 ? All Players(All Teams) : Empty Array,
  • Global.timeTillNextRound, Custom String("-- {0}: {1} {2} --", String("Waiting"), String("Selecting"), String("Heroes")), Top,
  • 2, Color(Orange), Color(White), Visible To Values and Color, Default Visibility);
  • Global.zomboSelection = Workshop Setting Combo(Custom String("Horde Settings"), Custom String("Duplication Target Selection"), 2,
  • Array(Custom String("Rez Dead"), Custom String("Dead or Idle"), Custom String("Dead or Echo"), Custom String("Alive and Idle"),
  • Custom String("Attacker")), 0);
  • Global.doUltimate = Workshop Setting Combo(Custom String("Horde Settings"), Custom String("Zombie Ultimates"), 2, Array(
  • Custom String("Off"), Custom String("self nanoboost"), Custom String("hero ultimate")), 0);
  • }
  • }
  • rule("auto damage balance")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Start Damage Modification(All Players(Color(Team 2)), All Players(Color(Team 1)), 100 + Max(0, Number Of Living Players(Color(
  • Team 2)) - Number Of Living Players(Color(Team 1))) * 2.500, Receivers Damagers and Damage Percent);
  • "startDamageModification(getPlayers(Color.TEAM_1), getPlayers(Color.TEAM_2), 100 + getNumberOfLivingPlayers(Color.TEAM_2) * -2.5, DamageReeval.RECEIVERS_DAMAGERS_AND_DMGPERCENT)"
  • Start Damage Modification(All Players(Color(Team 1)), All Players(Color(Team 2)), 100 + Max(0, Number Of Living Players(Color(
  • Team 2)) - Number Of Living Players(Color(Team 1))) * -2.500, Receivers Damagers and Damage Percent);
  • }
  • }
  • rule("Skip queues 1")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Is Assembling Heroes == True;
  • }
  • actions
  • {
  • Set Match Time(0);
  • Wait(0.016, Ignore Condition);
  • Pause Match Time;
  • Set Match Time(Match Time + 0.160);
  • }
  • }
  • rule("FIRST ROUND")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.round == 0;
  • }
  • actions
  • {
  • Global.round = 1;
  • Global.timeTillNextRound = 100;
  • While(Global.timeTillNextRound > 0);
  • Wait(0.050, Ignore Condition);
  • Global.allSpawned = Number Of Players(Color(Team 1)) > 0 && Is True For All(All Players(Color(Team 1)), Has Spawned(
  • Current Array Element));
  • If(Global.allSpawned);
  • Global.timeTillNextRound -= 0.500;
  • Else If(Global.timeTillNextRound != 100);
  • Global.timeTillNextRound -= 0.125;
  • End;
  • End;
  • Global.initialZombies = Workshop Setting Integer(Custom String("Wave Settings"), Custom String("First wave size (+2 each round)"),
  • 6, 3, 18, 0);
  • Global.maxZombos = Global.initialZombies;
  • Unpause Match Time;
  • Big Message(All Players(All Teams), Custom String("FIRST WAVE"));
  • }
  • }
  • rule("ROUND END")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Number Of Dead Players(Color(Team 2)) == Number Of Players(Color(Team 2));
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Pause Match Time;
  • Global.maxZombos = 0;
  • For Global Variable(VisIt, 0, Number Of Players(Color(Team 2)), 1);
  • Destroy Effect(Players In Slot(Global.VisIt, Color(Team 2)).VisFX);
  • End;
  • Call Subroutine(removeSpawnpoint);
  • Respawn(All Dead Players(Color(Team 1)));
  • Wait(1, Ignore Condition);
  • Destroy All Dummy Bots;
  • Global.timeTillNextRound = 100;
  • While(Global.timeTillNextRound > 0);
  • Wait(0.050, Ignore Condition);
  • Global.allSpawned = Is True For All(All Players(Color(Team 1)), Has Spawned(Current Array Element));
  • If(Global.allSpawned);
  • Global.timeTillNextRound -= 0.750;
  • Else;
  • Global.timeTillNextRound -= 0.250;
  • End;
  • End;
  • Call Subroutine(makeWave);
  • Unpause Match Time;
  • }
  • }
  • rule("Wave Begin")
  • {
  • event
  • {
  • Subroutine;
  • makeWave;
  • }
  • actions
  • {
  • Global.roundSetupComplete = False;
  • Global.round += 1;
  • If(Global.maxZombos == 18);
  • If(Workshop Setting Toggle(Custom String("Wave Settings"), Custom String("Infinite Final Wave"), True, 3));
  • Global.finalRound = True;
  • End;
  • End;
  • Wait(0.500, Ignore Condition);
  • If(Global.finalRound == True);
  • Big Message(All Players(All Teams), Custom String("ENDLESS WAVE"));
  • Wait(3, Ignore Condition);
  • Global.maxZombos = 18;
  • Else;
  • Big Message(All Players(All Teams), Custom String("WAVE {0}", Global.round));
  • Wait(3, Ignore Condition);
  • Global.maxZombos = Min(18, (Global.round - 1) * Workshop Setting Integer(Custom String("Wave Settings"), Custom String(
  • "Additional Zombies per Round"), 3, 2, 6, 0) + Global.initialZombies);
  • }
  • }
  • rule("spawn ai")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Game Mode(Team Deathmatch) == Current Game Mode;
  • Global.singleZombie == False;
  • Number Of Players(Color(Team 2)) < Global.maxZombos;
  • Number Of Living Players(Color(Team 2)) < 12;
  • }
  • actions
  • {
  • For Global Variable(O, 0, Global.maxZombos, 1);
  • "hasDummy[O] = -1 + ((1 + O) * (not entityExists(getPlayersInSlot(O, Color.TEAM_2))))"
  • Global.hasDummy[Global.O] = -1 + (1 + Global.O) * !Has Spawned(Players In Slot(Global.O, Color(Team 2)));
  • End;
  • Create Dummy Bot(Hero(Echo), Color(Team 2), Random Value In Array(Global.hasDummy), Random Value In Array(Spawn Points(All Teams)),
  • Vector(0, 0, 0));
  • "wait(0.25)"
  • Wait(Number Of Living Players(Color(Team 2)) * 0.500, Ignore Condition);
  • Loop If Condition Is True;
  • Global.roundSetupComplete = True;
  • }
  • }
  • rule("Survival - Setup")
  • {
  • event
  • {
  • Player Died;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Global.SURVIVAL == True;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Disable Built-In Game Mode Respawning(Event Player);
  • If(Global.pickupPoint == False);
  • Call Subroutine(spawnpoint);
  • End;
  • Wait(0.250, Ignore Condition);
  • Teleport(Event Player, Nearest Walkable Position(Global.pickupPoint + Vector(Random Real(-2, 2), 0, Random Real(-2, 2))));
  • }
  • }
  • rule("Survival - Make Cap Point")
  • {
  • event
  • {
  • Subroutine;
  • spawnpoint;
  • }
  • actions
  • {
  • Global.pickupPoint = Last Of(Sorted Array(Spawn Points(All Teams), Distance Between(Current Array Element, Closest Player To(
  • Current Array Element, All Teams))));
  • Create Effect(All Players(All Teams), Ring, Color(Orange), Global.pickupPoint, 5, Visible To Position and Radius);
  • Global.pickupEffects = Last Created Entity;
  • Create Beam Effect(All Players(All Teams), Good Beam, Global.pickupPoint, Global.pickupPoint + Up, Color(Orange),
  • Visible To Position and Radius);
  • Global.pickupEffects = Last Created Entity;
  • Create Effect(All Players(All Teams), Beacon Sound, Color(Yellow), Global.pickupPoint, 100, Visible To Position and Radius);
  • Modify Global Variable(pickupEffects, Append To Array, Last Created Entity);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Orange), Global.pickupPoint, 25);
  • Big Message(All Players(All Teams), Custom String("SPAWN POINT ACTIVE"));
  • Create Icon(All Players(All Teams), Global.pickupPoint, Plus, Visible To and Position, Color(Orange), True);
  • Modify Global Variable(pickupEffects, Append To Array, Last Created Entity);
  • }
  • }
  • rule("Survival - Respawn On Cap")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.SURVIVAL == True;
  • Global.pickupPoint != 0;
  • Count Of(Filtered Array(Players Within Radius(Global.pickupPoint, 5, Color(Team 1), Off), Is Alive(Current Array Element))) > 0;
  • Global.pickupTimer != 100;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • While(Global.pickupTimer <= 100);
  • Wait(0.100, Ignore Condition);
  • If(Count Of(Filtered Array(Players Within Radius(Global.pickupPoint, 5, Color(Team 1), Off), Is Alive(Current Array Element)))
  • > 0);
  • Global.pickupTimer += 2;
  • End;
  • End;
  • Resurrect(All Dead Players(Color(Team 1)));
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Global.pickupPoint, 100);
  • "KILLFEED.append(getLastCreatedEntity())"
  • Wait(0.250, Ignore Condition);
  • Call Subroutine(removeSpawnpoint);
  • Global.pickupTimer = 0;
  • }
  • }
  • rule("Survival - Remove Cap Point")
  • {
  • event
  • {
  • Subroutine;
  • removeSpawnpoint;
  • }
  • actions
  • {
  • Destroy Icon(Last Of(Global.pickupEffects));
  • Global.pickupEffects = Array Slice(Global.pickupEffects, 0, Count Of(Global.pickupEffects) - 1);
  • Destroy Effect(Last Of(Global.pickupEffects));
  • Global.pickupEffects = Array Slice(Global.pickupEffects, 0, Count Of(Global.pickupEffects) - 1);
  • Destroy Effect(Last Of(Global.pickupEffects));
  • Global.pickupEffects = Array Slice(Global.pickupEffects, 0, Count Of(Global.pickupEffects) - 1);
  • Destroy Effect(Last Of(Global.pickupEffects));
  • Global.pickupEffects = Array Slice(Global.pickupEffects, 0, Count Of(Global.pickupEffects) - 1);
  • Global.pickupPoint = 0;
  • }
  • }
  • rule("Survival - Game Loss")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.SURVIVAL == True;
  • Number Of Living Players(Color(Team 1)) == 0;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Set Slow Motion(25);
  • Wait(1.250, Ignore Condition);
  • Declare Team Victory(Color(Team 2));
  • }
  • }
  • rule("AI - basic Walk")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Number Of Living Players(Color(Team 1)) > 0;
  • Event Player.MercyOveride == False;
  • Is True For Any(All Players(Color(Team 1)), Has Spawned(Event Player)) == True;
  • }
  • actions
  • {
  • "@Condition getNumberOfLivingPlayers(Color.TEAM_1) > 0"
  • Stop Throttle In Direction(Event Player);
  • Stop Facing(Event Player);
  • If(Event Player.target != String("Find") && Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target),
  • Barriers Do Not Block LOS));
  • Event Player.objv = Position Of(Event Player.target);
  • Event Player.possPos = Nearest Walkable Position((Eye Position(Event Player) + Eye Position(Event Player.target) + World Vector Of(
  • Event Player.mercyoffset, Event Player.target, Rotation)) * 0.500);
  • Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.target)
  • + Event Player.aimOffset), Random Integer(100, 200), To World, Direction and Turn Rate);
  • Else;
  • For Player Variable(Event Player, it, 0, 4, 1);
  • Event Player.walkables[Event Player.it] = Nearest Walkable Position(World Vector Of(Direction From Angles(Event Player.it * 72, 0)
  • * 5, Event Player, Rotation And Translation));
  • End;
  • "eventPlayer.walkables = (sorted(eventPlayer.walkables, lambda player: abs(5 - distance(eventPlayer, player)))).slice(0, 3)\neventPlayer.possPos = eventPlayer.getEyePosition() + directionTowards(eventPlayer, eventPlayer.objv) * 2"
  • Event Player.possPos = First Of(Sorted Array(Event Player.walkables, Distance Between(Current Array Element, Event Player.objv) * (
  • 1 + (Distance Between(Current Array Element, Event Player) < 3) + !Is In Line of Sight(Eye Position(Event Player),
  • Current Array Element + Up, Barriers Do Not Block LOS))));
  • Start Facing(Event Player, Direction From Angles(Horizontal Angle Towards(Event Player, Event Player.possPos), 0)
  • + Event Player.FacingRand, 100, To Player, Direction and Turn Rate);
  • End;
  • Start Throttle In Direction(Event Player, Direction Towards(Event Player, Event Player.possPos) + Direction Towards(Vector(0, 0,
  • 0), Event Player) * Event Player.K, 1, To World, Replace existing throttle, Direction and Magnitude);
  • Wait(Random Real(0.300, 0.500), Ignore Condition);
  • Loop If Condition Is True;
  • Stop Forcing Throttle(Event Player);
  • }
  • }
  • rule("AI - Pick Objective")
  • {
  • event
  • {
  • Subroutine;
  • updateObjective;
  • }
  • actions
  • {
  • "enableInspector()"
  • Event Player.objv = Empty Array;
  • Event Player.objLOS = Empty Array;
  • Event Player.walkables = Empty Array;
  • Event Player.multiPos = Position Of(Event Player) * Vector(1, 15.625, 1);
  • Event Player.closestObjective = All Living Players(Event Player.teamFollow);
  • Modify Player Variable(Event Player, closestObjective, Remove From Array By Value, Filtered Array(All Players(Color(Team 2)),
  • Array Contains(All Support Heroes, Hero Of(Current Array Element))));
  • If(Global.healthpacks != Empty Array);
  • If(Normalized Health(Event Player) < 1);
  • Modify Player Variable(Event Player, closestObjective, Append To Array, Global.healthpacks);
  • End;
  • End;
  • For Player Variable(Event Player, it, 0, Count Of(Event Player.closestObjective), 1);
  • Event Player.closestObjective[Event Player.it] *= Vector(1, 15.625, 1);
  • End;
  • Event Player.closestObjective = First Of(Sorted Array(Event Player.closestObjective, Distance Between(Event Player.multiPos,
  • Current Array Element)));
  • Event Player.closestPoints = Filtered Array(Append To Array(Global.wayPoints, Global.healthpacks), Is In Line of Sight(
  • Eye Position(Event Player), Current Array Element, Barriers Do Not Block LOS) && Distance Between(Eye Position(Event Player),
  • Current Array Element) > 5);
  • Modify Player Variable(Event Player, closestPoints, Remove From Array By Value, Event Player.latestLocs);
  • For Player Variable(Event Player, it, 0, Count Of(Event Player.closestPoints), 1);
  • Event Player.closestPoints[Event Player.it] *= Vector(1, 15.625, 1);
  • End;
  • "eventPlayer.closestObjective = (sorted(eventPlayer.closestPoints, lambda player: distance(eventPlayer.closestObjective, player) + distance(player, eventPlayer.multiPos) * 0.15))[0]"
  • Event Player.objv = First Of(Sorted Array(Event Player.closestPoints, (Distance Between(Current Array Element,
  • Event Player.closestObjective) + Distance Between(Current Array Element, Event Player.multiPos) * 0.150) * (
  • 1 + !Is In View Angle(Event Player, Current Array Element * Vector(1, 0.064, 1), 75))));
  • Event Player.objv *= Vector(1, 0.064, 1);
  • Event Player.closestObjective *= Vector(1, 0.064, 1);
  • }
  • }
  • rule("AI - update Objv if stationary")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Event Player.target == String("Find");
  • Is True For Any(All Players(Color(Team 1)), Has Spawned(Event Player)) == True;
  • "@Condition getNumberOfLivingPlayers(Color.TEAM_1) > 0"
  • Distance Between(Event Player, Event Player.objv) < 1.500;
  • }
  • actions
  • {
  • Event Player.latestLocs = Event Player.objv;
  • Call Subroutine(updateObjective);
  • Wait(Random Real(1, 2), Abort When False);
  • "waitUntil(distance(eventPlayer.objv, eventPlayer) < 5, random.uniform(1, 4))\nwait()"
  • Loop If Condition Is True;
  • }
  • }
  • rule("AI - random Facing and offsets")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Has Status(Event Player, Knocked Down) == False;
  • }
  • actions
  • {
  • Set Aim Speed(Event Player, Random Integer(75, 100));
  • "eventPlayer.FacingRand = worldVector(angleToDirection(random.randint(-3, 3) * 45, random.uniform(-10, 10)), eventPlayer, Transform.ROTATION)"
  • Event Player.FacingRand = Direction From Angles(Random Real(-45, 45), Random Real(-15, 25));
  • Event Player.mercyoffset = Direction From Angles(Random Real(0, 360), 0) * Random Real(1, 2.500);
  • Event Player.aimOffset = Vector(Random Real(-0.500, 0.500), Random Real(-1, 0.250), Random Real(-0.500, 0.500));
  • Wait(Random Real(0.250, 1), Ignore Condition);
  • Event Player.aimOffset = Vector(Random Real(-0.200, 0.200), Random Real(-1, 0.200), Random Real(-0.200, 0.200));
  • Wait(Random Real(0.500, 1.500), Ignore Condition);
  • Event Player.aimOffset = Vector(Random Real(-0.500, 0.500), Random Real(-1, 0.250), Random Real(-0.500, 0.500));
  • Wait(Random Real(0.250, 1), Ignore Condition);
  • Event Player.aimOffset = Vector(Random Real(-0.200, 0.200), Random Real(-1, 0.200), Random Real(-0.200, 0.200));
  • Wait(Random Real(0.500, 1.500), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("pick target by sight")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Has Status(Event Player, Knocked Down) == False;
  • Is Alive(Player Closest To Reticle(Event Player, Color(Team 1))) == True;
  • Is In View Angle(Event Player, Player Closest To Reticle(Event Player, Color(Team 1)), 90) == True;
  • (Hero Of(Player Closest To Reticle(Event Player, Color(Team 1))) == Hero(Sombra) && Is Using Ability 1(Player Closest To Reticle(
  • Event Player, Color(Team 1)))) == False;
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Player Closest To Reticle(Event Player, Color(Team 1))),
  • Barriers Do Not Block LOS) == True;
  • }
  • actions
  • {
  • Wait(Random Real(0.100, 0.500), Abort When False);
  • Event Player.target = Player Closest To Reticle(Event Player, Color(Team 1));
  • }
  • }
  • rule("pick target from damage")
  • {
  • event
  • {
  • Player Took Damage;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • "@Condition eventPlayer.target == false"
  • Has Status(Event Player, Knocked Down) == False;
  • }
  • actions
  • {
  • If(Event Damage < Random Integer(1, 10) * 5);
  • Abort If(Event Player.target != String("Find"));
  • End;
  • Wait(Random Real(0, 0.500), Abort When False);
  • Event Player.target = Attacker;
  • Event Player.objv = Position Of(Attacker);
  • Start Facing(Event Player, Direction Towards(Event Player, Attacker), 300, To World, Direction and Turn Rate);
  • }
  • }
  • rule("AI - lose target")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), Barriers Do Not Block LOS) == False;
  • }
  • actions
  • {
  • Wait(5, Ignore Condition);
  • Abort If Condition Is False;
  • Event Player.target = String("Find");
  • }
  • }
  • rule("jumping")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Speed Of(Event Player) < 1;
  • Is On Ground(Event Player) == True;
  • }
  • actions
  • {
  • Wait(Random Real(0.500, 1), Abort When False);
  • Set Jump Vertical Speed(Event Player, Random Integer(100, 150));
  • Press Button(Event Player, Button(Jump));
  • "eventPlayer.applyImpulse(Vector.FORWARD, 5, Relativity.TO_PLAYER, Impulse.CANCEL_CONTRARY_MOTION)"
  • Loop If Condition Is True;
  • }
  • }
  • rule("AI - shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.target != String("Find");
  • "@Condition raycast(eventPlayer.getEyePosition(), eventPlayer.target.getEyePosition(), getAllPlayers(), eventPlayer, true).getPlayerHit() == eventPlayer.target"
  • Is Alive(Event Player.target) == True;
  • Is In View Angle(Event Player, Event Player.target, 90) == True;
  • Is In Line of Sight(Eye Position(Event Player), Event Player.target, Barriers Do Not Block LOS) == True;
  • Array Contains(Array(Hero(Genji), Hero(Moira), Hero(Echo), Hero(Doomfist)), Hero Of(Event Player)) == False;
  • (Hero Of(Event Player) == Hero(Sombra) && Is Using Ability 1(Event Player) && Distance Between(Eye Position(Event Player),
  • Event Player.target) > 3) == False;
  • Is Button Held(Event Player, Button(Secondary Fire)) == False;
  • }
  • actions
  • {
  • "@Condition (eventPlayer.getAmmo(0) != 0 and eventPlayer.getMaxAmmo(0) != 0) == true"
  • Wait(Random Real(0.100, 0.500), Ignore Condition);
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(Random Real(0.100, 0.500), Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Loop If Condition Is True;
  • }
  • }
  • rule("AI - shoot 2ndry")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.target != String("Find");
  • "@Condition raycast(eventPlayer.getEyePosition(), eventPlayer.target.getEyePosition(), getAllPlayers(), eventPlayer, true).getPlayerHit() == eventPlayer.target"
  • Is Alive(Event Player.target) == True;
  • Is In View Angle(Event Player, Event Player.target, 90) == True;
  • Is In Line of Sight(Eye Position(Event Player), Event Player.target, Barriers Do Not Block LOS) == True;
  • Array Contains(Array(Hero(Genji), Hero(Torbjörn)), Hero Of(Event Player)) == True;
  • }
  • actions
  • {
  • Wait(Random Real(0.100, 0.500), Ignore Condition);
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(Random Real(0.100, 0.500), Ignore Condition);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Loop If Condition Is True;
  • }
  • }
  • rule("AI - shoot 2ndry (held)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Moira;
  • }
  • conditions
  • {
  • Event Player.target != String("Find");
  • Team Of(Event Player.target) == Color(Team 1);
  • Is Alive(Event Player.target) == True;
  • Is In View Angle(Event Player, Event Player.target, 90) == True;
  • Is In Line of Sight(Eye Position(Event Player), Event Player.target, Barriers Do Not Block LOS) == True;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("ai spawned")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Start Forcing Dummy Bot Name(Event Player, Custom String("{0} {1}", Hero Of(Event Player), Ability Icon String(Hero(Echo), Button(
  • Ultimate))));
  • Wait(0.250, Ignore Condition);
  • Disable Movement Collision With Players(Event Player);
  • Create Effect(All Players(All Teams), Echo Cloning Effect, Color(White), Event Player, 1, Visible To Position and Radius);
  • Event Player.VisFX = Last Created Entity;
  • Disable Built-In Game Mode Respawning(Event Player);
  • }
  • }
  • rule("lose target")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != False;
  • Is Dead(Event Player.target) == True;
  • }
  • actions
  • {
  • Wait(10, Abort When False);
  • Event Player.target = String("Find");
  • }
  • }
  • rule("AI - set default hero")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Event Player.mimic == False;
  • "@Condition eventPlayer.getNumberOfDeaths() > 0"
  • Global.singleZombie == False;
  • }
  • actions
  • {
  • disabled Skip If(Count Of(Filtered Array(All Heroes, Is Hero Being Played(Current Array Element, All Teams)
  • || Current Array Element == Global.zombieList[Slot Of(Event Player)])) > 10, 1);
  • Play Effect(All Players(All Teams), Sombra Translocating Material Effect, Color(White), Event Player, 1);
  • Set Invisible(Event Player, None);
  • Wait(0.250, Ignore Condition);
  • Skip If(Global.finalRound, 1);
  • Skip If(Slot Of(Event Player) > (Global.round - 1) * Workshop Setting Integer(Custom String("Wave Settings"), Custom String(
  • "Max New Forms Per Wave"), 2, 1, 6, 0), 2);
  • Skip If(Count Of(Filtered Array(All Heroes, Is Hero Being Played(Current Array Element, All Teams))) > 10 && !Is Hero Being Played(
  • Global.zombieList[Slot Of(Event Player)], All Teams), 1);
  • Start Forcing Player To Be Hero(Event Player, Global.zombieList[Slot Of(Event Player)]);
  • "eventPlayer.startForcingName(\"Zombi\")"
  • Start Forcing Dummy Bot Name(Event Player, Custom String("{0} {1}", Hero(Echo), Ability Icon String(Hero(Echo), Button(
  • Ultimate))));
  • }
  • }
  • rule("AI dies")
  • {
  • event
  • {
  • Player Died;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Set Invisible(Event Player, All);
  • If(Event Player.nanoBoost);
  • Play Effect(All Players(All Teams), DVa Self Destruct Explosion Effect, Color(White), Evaluate Once(Eye Position(Event Player)),
  • 1);
  • Else;
  • Play Effect(All Players(All Teams), Echo Sticky Bomb Explosion Effect, Color(White), Evaluate Once(Eye Position(Event Player)), 1);
  • End;
  • Event Player.nanoBoost[0] = False;
  • Event Player.mimic = False;
  • Event Player.target = String("Find");
  • If(Global.RETRIBUTION && Is Dead(Event Player.zombi));
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Team 1), Evaluate Once(Event Player), 4);
  • Respawn(Event Player.zombi);
  • End;
  • Stop Camera(Event Player.zombi);
  • Event Player.zombi = Null;
  • Start Forcing Player Position(Event Player, World Vector Of(Vector(0, 0, 200), Event Player, Rotation And Translation), False);
  • }
  • }
  • rule("Ai - is alive (general)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.teamFollow = Color(Team 1);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Stop Holding Button(Event Player, Button(Ability 1));
  • Stop Holding Button(Event Player, Button(Ability 2));
  • Stop Holding Button(Event Player, Button(Jump));
  • Event Player.zombi = Null;
  • Set Aim Speed(Event Player, 100);
  • Event Player.target = String("Find");
  • Allow Button(Event Player, Button(Ability 1));
  • Allow Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("AI - Healer Override")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Array Contains(Array(Hero(Mercy), Hero(Moira), Hero(Ana)), Hero Of(Event Player)) == True;
  • Count Of(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 30, Color(Team 2), Surfaces),
  • Append To Array(All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element) < 1)) > 0;
  • }
  • actions
  • {
  • "eventPlayer.target = eventPlayer.mercytarget"
  • Start Holding Button(Event Player, Button(Jump));
  • If(Hero Of(Event Player) == Hero(Mercy));
  • If(Ability Cooldown(Event Player, Button(Ability 1)) == 0);
  • Start Holding Button(Event Player, Button(Ability 1));
  • Else;
  • Stop Holding Button(Event Player, Button(Ability 1));
  • End;
  • End;
  • "eventPlayer.stopForcingButton(Button.PRIMARY_FIRE)"
  • Event Player.MercyOveride = True;
  • Event Player.mercytarget = Sorted Array(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 30,
  • Color(Team 2), Surfaces), Append To Array(All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element)
  • < 1), Distance Between(Event Player, Current Array Element));
  • Set Weapon(Event Player, 0);
  • Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.mercytarget)), 400, To World,
  • Direction and Turn Rate);
  • Start Throttle In Direction(Event Player, Direction Towards(Event Player, World Vector Of(Event Player.mercyoffset,
  • Event Player.mercytarget, Rotation And Translation)), 0.750, To World, Replace existing throttle, Direction and Magnitude);
  • Skip If(Hero Of(Event Player) == Hero(Zenyatta), 1);
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • Stop Holding Button(Event Player, Button(Jump));
  • Stop Holding Button(Event Player, Button(Ability 1));
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • "eventPlayer.target = l\"Find\""
  • Event Player.MercyOveride = False;
  • }
  • }
  • rule("AI - Healer Override End")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Array Contains(Array(Hero(Mercy), Hero(Moira), Hero(Ana), Hero(Zenyatta)), Hero Of(Event Player)) == True;
  • Count Of(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 15, Color(Team 2), Surfaces),
  • Append To Array(All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element) < 1)) == 0;
  • }
  • actions
  • {
  • If(Count Of(Filtered Array(All Living Players(Color(Team 2)), !Array Contains(All Support Heroes, Hero Of(Current Array Element))))
  • < 2);
  • Event Player.teamFollow = Color(Team 2);
  • Else;
  • Event Player.teamFollow = Color(Team 1);
  • End;
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Set Weapon(Event Player, 2);
  • Event Player.MercyOveride = False;
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • Event Player.mercyoffset = Direction From Angles(Random Real(0, 360), 0);
  • Event Player.mercyoffset *= Random Integer(1, 2);
  • }
  • }
  • rule("player dies")
  • {
  • event
  • {
  • Player Died;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Event Was Environment == False;
  • }
  • actions
  • {
  • Event Player.duplicateTarget = Empty Array;
  • If(Global.zomboSelection == 0);
  • Skip If(Number Of Living Players(Color(Team 2)) >= Min(Global.maxZombos, 12), 1);
  • Event Player.duplicateTarget = All Dead Players(Color(Team 2));
  • Else If(Global.zomboSelection == 1);
  • Event Player.duplicateTarget = Sorted Array(Filtered Array(All Living Players(Color(Team 2)),
  • Current Array Element.target == String("Find")), Distance Between(Current Array Element, Closest Player To(
  • Current Array Element, Color(Team 1))));
  • Skip If(Number Of Living Players(Color(Team 2)) >= Min(Global.maxZombos, 12), 1);
  • Modify Player Variable(Event Player, duplicateTarget, Append To Array, All Dead Players(Color(Team 2)));
  • Else If(Global.zomboSelection == 2);
  • Event Player.duplicateTarget = Sorted Array(Filtered Array(All Living Players(Color(Team 2)), Hero Of(Current Array Element)
  • == Hero(Echo)), Distance Between(Current Array Element, Closest Player To(Current Array Element, Color(Team 1))));
  • Skip If(Number Of Living Players(Color(Team 2)) >= Min(Global.maxZombos, 12), 1);
  • Modify Player Variable(Event Player, duplicateTarget, Append To Array, All Dead Players(Color(Team 2)));
  • Else If(Global.zomboSelection == 3);
  • Event Player.duplicateTarget = Sorted Array(Filtered Array(All Living Players(Color(Team 2)),
  • Current Array Element.target == String("Find")), Distance Between(Current Array Element, Closest Player To(
  • Current Array Element, Color(Team 1))));
  • Else If(Global.zomboSelection == 4);
  • Event Player.duplicateTarget = Attacker;
  • End;
  • Modify Player Variable(Event Player, duplicateTarget, Remove From Array By Value, Players On Hero(Hero(Doomfist), All Teams));
  • Modify Player Variable(Event Player, duplicateTarget, Remove From Array By Value, Players On Hero(Hero(Roadhog), All Teams));
  • "playEffect(getAllPlayers(), DynamicEffect.SYMMETRA_TELEPORTER_REAPPEAR, Color.RED, eventPlayer.zombi, 1)"
  • Filtered Array(All Players(All Teams), Current Array Element.target == Event Player).target = String("Find");
  • Abort If(Global.max1Clone && Count Of(Filtered Array(All Players(Color(Team 2)), Current Array Element.zombi == Event Player))
  • > 0);
  • Abort If(Event Player.duplicateTarget == Empty Array);
  • Event Player.zombi = Last Of(Event Player.duplicateTarget);
  • Set Invisible(Event Player, All);
  • Play Effect(All Players(All Teams), Moira Fade Reappear Effect, Color(Team 1), Event Player.zombi, 1);
  • Stop Forcing Player Position(Event Player.zombi);
  • Start Forcing Player Position(Event Player.zombi, Position Of(Event Player), False);
  • Event Player.zombi.mimic = True;
  • Play Effect(All Players(All Teams), Sombra Translocating Material Effect, Color(Team 2), Event Player.zombi, 1);
  • Respawn(Event Player.zombi);
  • Start Facing(Event Player.zombi, Facing Direction Of(Event Player), 500, To World, Direction and Turn Rate);
  • "eventPlayer.zombi.startForcingPosition(eventPlayer, true)"
  • While(!Has Status(Event Player.zombi, Asleep));
  • Start Forcing Player To Be Hero(Event Player.zombi, Hero Of(Event Player));
  • Wait(0.100, Ignore Condition);
  • Set Invisible(Event Player.zombi, None);
  • Set Status(Event Player.zombi, Null, Asleep, 4);
  • Set Status(Event Player.zombi, Null, Invincible, 1);
  • End;
  • Play Effect(All Players(All Teams), DVa Micro Missiles Explosion Effect, Color(Red), Event Player.zombi, 1);
  • Start Camera(Event Player, Ray Cast Hit Position(Eye Position(Event Player.zombi), Eye Position(Event Player.zombi)
  • + Facing Direction Of(Event Player) * -2, Null, Event Player, False), Eye Position(Event Player.zombi), 50);
  • Stop Forcing Player Position(Event Player.zombi);
  • Modify Team Score(Color(Team 1), -1);
  • Event Player.zombi.target = String("Find");
  • Start Forcing Dummy Bot Name(Event Player.zombi, Custom String("{0} {1}", Event Player, Ability Icon String(Hero(Echo), Button(
  • Ultimate))));
  • Event Player.zombi.zombi = Event Player;
  • Stop Facing(Event Player.zombi);
  • "if RETRIBUTION:\neventPlayer.zombi.nanoBoost[0] = true\n__end__()"
  • Wait(Random Real(0.500, 2.500), Ignore Condition);
  • Abort If(Is Dead(Event Player.zombi));
  • Clear Status(Event Player.zombi, Knocked Down);
  • Communicate(Event Player.zombi, Thanks);
  • Wait(Random Real(0.750, 1.500), Ignore Condition);
  • Communicate(Attacker, You are Welcome);
  • Clear Status(Event Player.zombi, Knocked Down);
  • }
  • }
  • rule("Player Lives")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Set Invisible(Event Player, None);
  • Stop Camera(Event Player);
  • }
  • }
  • rule("Nanoboost - apply effects")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.nanoBoost == True;
  • Event Player.nanoBoost[3] != True;
  • Is True For Any(All Living Players(Color(Team 1)), Is In Line of Sight(Eye Position(Event Player), Eye Position(
  • Current Array Element), Barriers Do Not Block LOS)) == True;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Destroy Effect(Event Player.nanoBoost[2]);
  • Big Message(All Players(All Teams), Custom String("NANOBOOST ADMINISTERED"));
  • Small Message(All Players(All Teams), Custom String("{0} {1} Nano-boosted! {1} {0}", Ability Icon String(Hero(Ana), Button(
  • Ultimate)), Hero Icon String(Hero Of(Event Player))));
  • Event Player.target = Closest Player To(Event Player, Color(Team 1));
  • Destroy Effect(Event Player.nanoBoost[1]);
  • Event Player.nanoBoost[1] = Last Created Entity;
  • Heal(Event Player, Null, 250);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Red), Event Player, 10);
  • Create Effect(All Players(All Teams), Ana Nano Boosted Effect, Color(White), Event Player, 1, Visible To Position and Radius);
  • Event Player.nanoBoost[2] = Last Created Entity;
  • Play Effect(All Players(All Teams), Ring Explosion Sound, Color(White), Event Player, 100);
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 100);
  • Play Effect(All Players(All Teams), Symmetra Teleporter Reappear Effect, Color(White), Eye Position(Event Player), 100);
  • Event Player.nanoBoost[3] = True;
  • }
  • }
  • rule("Nanoboost - end effects")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • First Of(Event Player.nanoBoost) == False;
  • Entity Exists(Event Player.nanoBoost[1]) == True;
  • }
  • actions
  • {
  • Destroy Effect(Event Player.nanoBoost[2]);
  • Destroy Effect(Event Player.nanoBoost[1]);
  • Event Player.nanoBoost = False;
  • }
  • }
  • rule("Nanoboost - apply to last standing")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.roundSetupComplete == True;
  • Is Alive(Event Player) == True;
  • Number Of Living Players(Color(Team 2)) == 1;
  • }
  • actions
  • {
  • Wait(0.020, Abort When False);
  • Event Player.nanoBoost[0] = True;
  • }
  • }
  • rule("Nanoboost - endless wave crit chance")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.finalRound == True;
  • Event Was Critical Hit == True;
  • Global.roundSetupComplete == True;
  • Is Dummy Bot(Event Player) == True;
  • Random Integer(0, 45) == 1;
  • }
  • actions
  • {
  • Event Player.nanoBoost[0] = True;
  • }
  • }
  • rule("Dummy - Echo Fly Start")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Echo);
  • Is Dummy Bot(Event Player) == True;
  • Is Using Ability 1(Event Player) == True;
  • Y Component Of(Event Player) >= Y Component Of(Event Player.target) + 1.500;
  • Distance Between(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(Event Player), Up * 5, Null, Event Player, True))
  • == 5;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Jump));
  • Apply Impulse(Event Player, Vector(0, 1, -0.500), 10, To Player, Incorporate Contrary Motion);
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • Stop Holding Button(Event Player, Button(Jump));
  • }
  • }
  • rule("Dummy - Echo Dash")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Distance Between(Event Player * Vector(1, 5, 1), Event Player.objv * Vector(1, 5, 1)) > 15;
  • }
  • actions
  • {
  • Wait(Random Real(1, 2), Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(0.250, Ignore Condition);
  • Set Ability Cooldown(Event Player, Button(Ability 1), 0);
  • }
  • }
  • rule("Dummy - Echo beam (one at a time for fair)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Distance Between(Event Player, Event Player.target) < 16;
  • Is Alive(Event Player.target) == True;
  • Is True For Any(Filtered Array(Players On Hero(Hero(Echo), Color(Team 2)), Event Player.target == Current Array Element.target),
  • Event Player.target == Current Array Element.target && Is Using Ability 2(Current Array Element)) == False;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 15, All Players(
  • Color(Team 1)), Event Player, True) == Event Player.target;
  • }
  • actions
  • {
  • "@Condition isInLoS(eventPlayer, eventPlayer.target, BarrierLos.PASS_THROUGH_BARRIERS) == true\n@Condition eventPlayer.isUsingAbility2() == false"
  • Wait(Random Real(0, 2), Abort When False);
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Dummy - Echo Melee")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Echo);
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Using Ability 2(Event Player) == False;
  • Has Status(Event Player, Asleep) == False;
  • Has Status(Event Player, Knocked Down) == False;
  • Has Status(Event Player, Frozen) == False;
  • Has Status(Event Player, Rooted) == False;
  • Has Status(Event Player, Stunned) == False;
  • Distance Between(Event Player, Event Player.target) < 5;
  • }
  • actions
  • {
  • Apply Impulse(Event Player, Vector(0, 0, 1), 10, To Player, Cancel Contrary Motion);
  • Wait(0.250, Ignore Condition);
  • Press Button(Event Player, Button(Melee));
  • Wait(0.250, Ignore Condition);
  • Apply Impulse(Event Player, Vector(0, 1, -1), 10, To Player, Cancel Contrary Motion);
  • Wait(Random Real(0.750, 1.500), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy - Reaper Teleport")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Distance Between(Event Player.objv, Event Player) < 35;
  • Distance Between(Event Player * Vector(1, 10, 1), Event Player.objv * Vector(1, 10, 1)) > 20;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • }
  • actions
  • {
  • "wait(random.uniform(0, 6))\nwaitUntil(eventPlayer.isInViewAngle(eventPlayer.objv, 15), 5)"
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.250, Ignore Condition);
  • Press Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Dummy - Reaper Wraith Form (one at a time for fair)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Ammo(Event Player, 0) == 0;
  • Is True For Any(Players On Hero(Hero(Reaper), All Teams), Is Using Ability 1(Current Array Element)) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Wait(3, Ignore Condition);
  • }
  • }
  • rule("Dummy- Torbj Powerup")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Torbjörn;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • }
  • actions
  • {
  • "waitUntil(eventPlayer.isInViewAngle(eventPlayer.objv, 15), 5)"
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.250, Ignore Condition);
  • Cancel Primary Action(Event Player);
  • }
  • }
  • rule("Dummy - Gengi Dash")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Alive(Event Player.target) == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Distance Between(Eye Position(Event Player), Player Closest To Reticle(Event Player, Color(Team 1))) > 10;
  • Distance Between(Event Player * Vector(1, 5, 1), Event Player.objv * Vector(1, 5, 1)) > 20;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 15, All Players(
  • Color(Team 1)), Event Player, True) == Event Player.target;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Dummy - Genji Wallclimb")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Y Component Of(Event Player.objv) > Y Component Of(Event Player);
  • Distance Between(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player), All Players(All Teams), Event Player, True)) < 1;
  • }
  • actions
  • {
  • Skip If(Is Button Held(Event Player, Button(Jump)), 1);
  • Start Holding Button(Event Player, Button(Jump));
  • Wait Until(!Is On Wall(Event Player), 20);
  • Stop Holding Button(Event Player, Button(Jump));
  • }
  • }
  • rule("Dummy - Hanzo Wallclimb")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Distance Between(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player), All Players(All Teams), Event Player, True)) < 1;
  • Y Component Of(Event Player.objv) > Y Component Of(Event Player);
  • }
  • actions
  • {
  • Skip If(Is Button Held(Event Player, Button(Jump)), 1);
  • Start Holding Button(Event Player, Button(Jump));
  • Wait Until(!Is On Wall(Event Player), 10);
  • Stop Holding Button(Event Player, Button(Jump));
  • }
  • }
  • rule("Dummy - Roadhog Breather")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Roadhog;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != False;
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Normalized Health(Event Player) < 0.400;
  • }
  • actions
  • {
  • "waitUntil(eventPlayer.isInViewAngle(eventPlayer.objv, 15), 5)"
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Dummy - Roadhog Hook")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Roadhog;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Alive(Event Player.target) == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 15,
  • All Living Players(Color(Team 1)), Event Player, True) == Event Player.target;
  • }
  • actions
  • {
  • Wait(Random Real(0.100, 1), Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Dummy - Moira Fade (Cheaty but cool)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Moira;
  • }
  • conditions
  • {
  • (Normalized Health(Event Player) < 0.500 || (Distance Between(Event Player, Event Player.objv) > 15 && Event Player.MercyOveride))
  • == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • }
  • actions
  • {
  • Event Player.mercytarget = Sorted Array(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 15,
  • Color(Team 2), Surfaces), Append To Array(All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element)
  • < 1), Distance Between(Event Player, Current Array Element));
  • Press Button(Event Player, Button(Ability 1));
  • If(Normalized Health(Event Player) < 0.500 && Is Alive(Event Player.mercytarget));
  • Abort If(Event Player.mercytarget == Empty Array);
  • Teleport(Event Player, Event Player.mercytarget);
  • Wait(0.250, Ignore Condition);
  • }
  • }
  • rule("Dummy - Rein Shield")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • }
  • actions
  • {
  • "@Condition distance(eventPlayer, getClosestPlayer(eventPlayer, Color.TEAM_1)) > 3"
  • Wait(Random Real(0, 1), Ignore Condition);
  • While(Count Of(Filtered Array(Players Within Radius(Eye Position(Event Player), 3.500, Color(Team 1), Surfaces), Is Alive(
  • Current Array Element))) == 0);
  • Set Aim Speed(Event Player, 50);
  • Skip If(Is Button Held(Event Player, Button(Secondary Fire)), 1);
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(1, Ignore Condition);
  • End;
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Set Aim Speed(Event Player, 100);
  • Wait(5, Ignore Condition);
  • }
  • }
  • rule("Dummy - Rein Charge")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Alive(Event Player.target) == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Distance Between(Eye Position(Event Player), Player Closest To Reticle(Event Player, Color(Team 1))) > 5;
  • Y Component Of(Event Player) > Y Component Of(Event Player.target) + -1;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 15,
  • All Living Players(Color(Team 1)), Event Player, True) == Event Player.target;
  • }
  • actions
  • {
  • Wait(Random Real(0, 0.500), Abort When False);
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Dummy - Brig Heal Pack")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Brigitte;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Normalized Health(Player Closest To Reticle(Event Player, Color(Team 2))) < 1;
  • Normalized Health(Player Closest To Reticle(Event Player, Color(Team 2))) > 0;
  • Is In View Angle(Event Player, Player Closest To Reticle(Event Player, Color(Team 2)), 15) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Dummy - Baps Blind Fire")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Baptiste;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Hero Of(Event Player) == Hero(Baptiste);
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(Random Real(0.750, 2), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy - Sombra Cloak out of vision")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target == String("Find");
  • Has Status(Event Player, Knocked Down) == False;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Dummy - Sombra Translocator (could be better)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Alive(Event Player.target) == True;
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Distance Between(Event Player, Event Player.target) > 15;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 30, All Players(
  • Color(Team 1)), Event Player, True) == Event Player.target;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Ignore Condition);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(1, Ignore Condition);
  • Wait Until(Normalized Health(Event Player) < 0.500 || !Is In Line of Sight(Event Player, Event Player.target,
  • Barriers Do Not Block LOS), 12);
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Dummy- Sombra Hack (maybe)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Firing Primary(Event Player) == False;
  • "@Condition distance(worldVector(vect(0, 0, 7), eventPlayer, Transform.ROTATION_AND_TRANSLATION), sorted(healthpacks, lambda player: distance(eventPlayer, player))[0]) < 3"
  • Distance Between(World Vector Of(Vector(0, 0, 7), Event Player, Rotation And Translation), Event Player.closestObjective) < 3;
  • Is In View Angle(Event Player.target, Eye Position(Event Player), 90) == False;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(7, Abort When False);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Dummy- Sombra Hints")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • Hero Of(Event Player) == Hero(Sombra);
  • }
  • actions
  • {
  • Wait(Random Real(4, 6), Abort When False);
  • Communicate(Event Player, Hello);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy - Tracer Recall")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Tracer;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Normalized Health(Event Player) < 0.500;
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Ignore Condition);
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Dummy - Tracer Blink")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Tracer;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Distance Between(Event Player, Event Player.objv) > 5;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Wait(Random Real(0, 3), Ignore Condition);
  • }
  • }
  • rule("Dummy - Junkrat Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Junkrat;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is On Ground(Event Player) == True;
  • "@Condition distance(vect(0, eventPlayer.y, 0), vect(0, eventPlayer.target.y, 0)) > 3"
  • Ability Charge(Event Player, Button(Ability 1)) > 0;
  • Distance Between(Event Player.objv, Event Player) < 35;
  • Distance Between(Event Player * Vector(1, 10, 1), Event Player.objv * Vector(1, 10, 1)) > 20;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • }
  • actions
  • {
  • "@Condition isInLoS(eventPlayer.getEyePosition(), Vector.UP + eventPlayer.objv, BarrierLos.PASS_THROUGH_BARRIERS) == true"
  • Start Facing(Event Player, Vector(0, -1, 0.100), 900, To Player, Direction and Turn Rate);
  • Wait(0.250, Ignore Condition);
  • "waitUntil(eventPlayer.isInViewAngle(eventPlayer.objv, 15), 5)"
  • Press Button(Event Player, Button(Ability 1));
  • Wait(Random Real(0.200, 0.250), Ignore Condition);
  • Press Button(Event Player, Button(Jump));
  • Wait(Random Real(0.100, 0.250), Ignore Condition);
  • Press Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Dummy - Ashe Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Ashe;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • "@Condition eventPlayer.isOnGround() == true"
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • "@Condition distance(eventPlayer.objv, eventPlayer) < 35"
  • Distance Between(Event Player * Vector(1, 5, 1), Event Player.objv * Vector(1, 5, 1)) > 20;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • Distance Between(Event Player * Vector(1, 0, 1), Event Player.objv * Vector(1, 0, 1)) < 7;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Jump));
  • Start Facing(Event Player, Vector(0, -1, 0), 900, To Player, Direction and Turn Rate);
  • Wait(Random Real(0.100, 0.250), Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Dummy - Mei Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Mei;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • "@Condition eventPlayer.isOnGround() == true"
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Distance Between(Event Player.objv, Event Player) < 35;
  • Distance Between(Event Player * Vector(1, 10, 1), Event Player.objv * Vector(1, 10, 1)) > 20;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • }
  • actions
  • {
  • Disallow Button(Event Player, Button(Primary Fire));
  • Start Facing(Event Player, Vector(0, -1, 0.100), 900, To Player, Direction and Turn Rate);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.100, Ignore Condition);
  • Start Facing(Event Player, Vector(0, -1, 0.100), 900, To Player, Direction and Turn Rate);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.250, Ignore Condition);
  • Allow Button(Event Player, Button(Primary Fire));
  • Press Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Dummy - Mei iceblock keep")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Mei;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Normalized Health(Event Player) < 0.500;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Disallow Button(Event Player, Button(Ability 1));
  • Wait Until(Normalized Health(Event Player) == 1, 3);
  • Wait(Random Real(0, 2), Ignore Condition);
  • Allow Button(Event Player, Button(Ability 1));
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("LockHeroesAtMax")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)))) >= Global.MaxHeroes;
  • }
  • actions
  • {
  • Global.lockedHeroes = Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)));
  • Set Player Allowed Heroes(All Players(Color(Team 1)), Global.lockedHeroes);
  • }
  • }
  • rule("UnlockHeroes")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)))) < Global.MaxHeroes;
  • }
  • actions
  • {
  • Global.lockedHeroes = Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)));
  • Set Player Allowed Heroes(All Players(Color(Team 1)), Global.allowedHeroes);
  • }
  • }
  • rule("Manual Change Hero")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Interact)) == True;
  • Global.timeTillNextRound > 0;
  • }
  • actions
  • {
  • Event Player.LastHero_UltCharge = Hero Of(Event Player);
  • Event Player.LastHero_UltCharge[1] = Ultimate Charge Percent(Event Player);
  • "moveToTeam(eventPlayer, Team.ALL, -1)\nmoveToTeam(eventPlayer, Color.TEAM_1, -1)"
  • Start Forcing Player To Be Hero(Filtered Array(All Players(Color(Team 2)), Current Array Element.zombi == Event Player), Hero(
  • Echo));
  • Event Player.swapheroLocation = Position Of(Event Player);
  • Start Forcing Player Position(Event Player, Event Player.swapheroLocation, True);
  • Set Player Allowed Heroes(Event Player, Remove From Array(Global.allowedHeroes, Hero Of(Event Player)));
  • Wait(0.016, Ignore Condition);
  • Set Player Allowed Heroes(Event Player, Global.allowedHeroes);
  • Wait Until(Has Spawned(Event Player), 99999);
  • Wait(0.250, Ignore Condition);
  • Stop Forcing Player Position(Event Player);
  • }
  • }
  • rule("Forget Sombra")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Sombra;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(1, Ignore Condition);
  • Filtered Array(All Players(All Teams), Current Array Element.target == Event Player).target = String("Find");
  • }
  • }
  • rule("Forget Tracer")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Tracer;
  • }
  • conditions
  • {
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Filtered Array(All Players(All Teams), Current Array Element.target == Event Player).target = String("Find");
  • }
  • }
  • rule("Speedboost 2")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Distance Between(Event Player, Closest Player To(Event Player, Color(Team 1))) <= 20;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, 100);
  • }
  • }
  • rule("Lucio Wall jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Lúcio;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is On Wall(Event Player) == False;
  • Event Player.target != String("Find");
  • }
  • actions
  • {
  • Stop Holding Button(Event Player, Button(Jump));
  • Wait(0.250, Ignore Condition);
  • Start Holding Button(Event Player, Button(Jump));
  • Wait(3, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Ability 1 on half health generic")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Array(Hero(Baptiste), Hero(Zarya), Hero(Orisa), Hero(Sigma), Hero(McCree)), Hero Of(Event Player)) == True;
  • Normalized Health(Event Player) < 0.500;
  • }
  • actions
  • {
  • "waitUntil(eventPlayer.getNormalizedHealth() < random.uniform(0.4, 0.6), 99999)"
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Sigma Shield")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Using Ability 1(Event Player) == False;
  • Is True For Any(Array(Button(Ultimate), Button(Primary Fire), Button(Secondary Fire)), Is Button Held(Player Closest To Reticle(
  • Event Player, Color(Team 1)), Current Array Element)) == True;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 50, All Players(
  • Color(Team 1)), Event Player, False) == Event Player.target;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Ignore Condition);
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(Distance Between(Event Player, Player Closest To Reticle(Event Player, Color(Team 1))) * 0.025, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Wait Until(Is In Line of Sight(Event Player, Event Player.target, All Barriers Block LOS), 15);
  • Skip If(!Is Firing Secondary(Event Player), 1);
  • Press Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("sigma stone")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Normalized Health(Event Player) < 0.750;
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Is Using Ability 1(Event Player) == False;
  • Is True For Any(Array(Button(Ultimate), Button(Ability 1), Button(Ability 2)), Is Button Held(Player Closest To Reticle(
  • Event Player, Color(Team 1)), Current Array Element)) == False;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 15, All Players(
  • Color(Team 1)), Event Player, True) == Event Player.target;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("lucio aura swap")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Lúcio;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • "@Condition eventPlayer.getNormalizedHealth() < 5"
  • Press Button(Event Player, Button(Ability 1));
  • Wait Until(Normalized Health(Event Player) == 1, 99999);
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Zarya bubble 2")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zarya;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 30, All Players(
  • Color(Team 1)), Event Player, True) == Event Player.target;
  • Event Player.target != String("Find");
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("healthpack locator")
  • {
  • event
  • {
  • Player Received Healing;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Was Health Pack == True;
  • Is True For Any(Global.healthpacks, Distance Between(Event Player, Current Array Element) < 3) == False;
  • }
  • actions
  • {
  • Modify Global Variable(healthpacks, Append To Array, Position Of(Event Player));
  • }
  • }
  • rule("Map - Necro Env Hazards Escape")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Current Map == Map(Necropolis);
  • Y Component Of(Position Of(Event Player)) < -6;
  • Distance Between(Event Player, Vector(0, 0, 0)) < 50;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Sombra Translocator Disappear Effect, Color(White), Evaluate Once(Eye Position(Event Player)),
  • 1);
  • Teleport(Event Player, Last Of(Sorted Array(Spawn Points(All Teams), Distance Between(Current Array Element, Closest Player To(
  • Current Array Element, Color(Team 1))))));
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • Set Status(Event Player, Null, Stunned, 1);
  • Play Effect(All Players(All Teams), Sombra Translocator Reappear Effect, Color(White), Evaluate Once(Eye Position(Event Player)),
  • 1);
  • Play Effect(All Players(All Teams), Moira Fade Reappear Effect, Color(White), Evaluate Once(Eye Position(Event Player)), 50);
  • Event Player.target = String("Find");
  • Call Subroutine(updateObjective);
  • }
  • }
  • rule("Setup Waypoints")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.wayPoints = Empty Array;
  • For Global Variable(O, 0, Count Of(Spawn Points(All Teams)), 1);
  • Modify Global Variable(wayPoints, Append To Array, Position Of(Spawn Points(All Teams)[Global.O]));
  • End;
  • If(Array Contains(Array(Map(Black Forest), Map(Black Forest Winter)), Current Map));
  • Modify Global Variable(wayPoints, Append To Array, Array(0, Vector(29.271, 13.970, 22.812), Vector(34.261, 16.550, 19.262), Vector(
  • 28.246, 18.300, 12.658), Vector(21.114, 12.432, 14.785), Vector(21.290, 10.730, 10.066), Vector(-4.833, 14.300, 27.196),
  • Vector(-4.128, 12.863, 32.795), Vector(-16.055, 14.278, 26.183), Vector(-5.008, 13.886, 30.950), Vector(-14.669, 15.054,
  • 32.730), Vector(-9.185, 17.772, 34.141), Vector(-15.333, 19.300, 26.831), Vector(-5.742, 19.300, 27.815), Vector(-6.890,
  • 18.806, 5.079), Vector(-12.138, 15.872, 4.641), Vector(-15.369, 14.995, 8.376), Vector(-13.956, 14.519, 2.329), Vector(-13.944,
  • 14.671, -5.340), Vector(-13.054, 14.742, 16.339), Vector(-16.143, 14.352, -16.225), Vector(-5.271, 14.364, -17.508), Vector(
  • -4.822, 13.530, -22.030), Vector(-15.137, 14.927, -22.841), Vector(-9.530, 17.739, -24.423), Vector(-6.284, 19.300, -18.047),
  • Vector(-15.298, 19.300, -17.436), Vector(4.087, 13.800, -3.839), Vector(1.392, 13.800, 5.470), Vector(4.027, 13.800, 13.305),
  • Vector(18.335, 10.300, 5.023), Vector(21.259, 10.468, 0.346), Vector(21.304, 12.456, -5.323), Vector(29.227, 13.947, -12.980),
  • Vector(34.127, 16.319, -9.740), Vector(34.255, 17.479, -7.409), Vector(27.955, 18.300, -2.613), Vector(10.267, 18.300,
  • 5.069)));
  • Else If(Current Map == Map(Necropolis));
  • Modify Global Variable(wayPoints, Append To Array, Array(0, Vector(13.305, 10.129, 22.974), Vector(16.368, 9.597, 21.595), Vector(
  • 23.513, 2.975, 14.447), Vector(14.385, 3.348, 16.864), Vector(-10.045, 4.299, 22.912), Vector(-20.881, 7.320, 27.521), Vector(
  • -25.821, 6.118, 27.693), Vector(-32.077, 4.300, 10.840), Vector(-34.946, 3.921, -0.076), Vector(-32.041, 4.300, -10.766),
  • Vector(-42.515, 4.706, 0.047), Vector(-47.868, 6.300, 0.093), Vector(-41.786, 9.553, 5.714), Vector(-41.612, 9.640, -5.771),
  • Vector(-26.762, 3.910, -19.521), Vector(-23.538, 5.592, -26.485), Vector(-24.197, 6.366, -28.793), Vector(0.438, 10.931,
  • -27.084), Vector(16.143, 9.597, -20.646), Vector(23.325, 2.908, -14.396), Vector(19.184, 1.911, 8.816), Vector(18.865, 1.910,
  • -8.330), Vector(12.811, -2.647, 0.055), Vector(-16.462, -2.700, -0.156), Vector(-16.399, 1.253, 9.615), Vector(-16.421, 1.291,
  • -9.691), Vector(-12.318, 2.934, -18.756), Vector(-9.586, 4.301, -22.927), Vector(-13.438, 4.312, -23.209), Vector(13.594,
  • 3.942, -17.756), Vector(-2.131, 2.307, 11.319), Vector(-0.881, 2.307, -11.522), Vector(-14.972, 2.674, -0.050), Vector(-19.743,
  • 4.288, 0.096), Vector(-23.060, 4.300, -0.072), Vector(-23.687, 4.300, 6.198), Vector(-23.278, 4.300, -6.262), Vector(-8.602,
  • 2.307, 0.098), Vector(16.667, 2.301, 14.496), Vector(16.987, 2.300, -14.318), Vector(-12.554, 2.952, 18.010), Vector(12.812,
  • 10.144, -22.505), Vector(-0.128, 11.321, 26.621)));
  • Modify Global Variable(wayPoints, Append To Array, Array(0, Vector(-49.305, 6.963, 3.029), Vector(-49.378, 6.895, -2.897), Vector(
  • -45.507, 7.695, -6.426), Vector(-45.263, 7.818, 6.621), Vector(-36.386, 9.910, 5.851), Vector(-36.270, 9.910, -5.787), Vector(
  • -27.045, 3.418, -5.939), Vector(-26.889, 3.503, 6.167), Vector(-13.745, 2.300, -13.416), Vector(-14.121, 2.300, 12.373),
  • Vector(7.862, 2.305, -0.462), Vector(4.844, 2.305, -8.182), Vector(4.329, 2.305, 8.051), Vector(-25.088, 4.912, -23.325),
  • Vector(-26.621, 5.130, 23.805), Vector(23.542, 2.301, -8.181), Vector(23.552, 2.301, 8.201)));
  • Else If(Current Map == Map(Castillo));
  • Modify Global Variable(wayPoints, Append To Array, Array(0, Vector(-85.105, 39.941, 59.229), Vector(-86.592, 39.941, 50.784),
  • Vector(-96.718, 40.850, 41.663), Vector(-114.640, 40.616, 46.482), Vector(-116.538, 39.874, 56.733), Vector(-114.893, 39.906,
  • 65.561), Vector(-122.002, 36.366, 67.043), Vector(-127.389, 38.856, 71.119), Vector(-123.497, 36.278, 57.958), Vector(-130.058,
  • 38.856, 56.071), Vector(-121.448, 35.953, 56.568), Vector(-119.086, 35.953, 67.282), Vector(-122.107, 35.680, 62.287), Vector(
  • -112.603, 39.856, 69.396), Vector(-109.583, 40.597, 73.734), Vector(-90.141, 40.574, 70.598), Vector(-83.315, 38.753, 66.993),
  • Vector(-88.805, 34.888, 73.981), Vector(-90.327, 33.818, 77.047), Vector(-83.189, 33.866, 58.320), Vector(-84.469, 33.864,
  • 51.029), Vector(-83.716, 33.864, 54.809), Vector(-90.692, 34.965, 55.963), Vector(-92.009, 34.856, 49.320), Vector(-85.165,
  • 33.856, 47.858), Vector(-82.412, 33.858, 61.258), Vector(-88.871, 34.858, 62.829), Vector(-96.896, 34.308, 72.749), Vector(
  • -103.734, 34.308, 74.063), Vector(-106.769, 33.970, 85.517), Vector(-111.553, 34.364, 80.157), Vector(-112.062, 35.263,
  • 67.876), Vector(-95.578, 33.963, 83.701), Vector(-114.633, 35.125, 52.883), Vector(-121.615, 35.970, 44.890), Vector(-116.594,
  • 33.970, 34.512), Vector(-105.893, 34.056, 32.285), Vector(-98.270, 33.856, 36.947), Vector(-96.378, 34.505, 38.075), Vector(
  • -88.684, 38.671, 43.390), Vector(-102.756, 34.211, 42.697), Vector(-109.607, 34.174, 43.954), Vector(-118.793, 34.224, 41.246),
  • Vector(-79.332, 33.860, 54.141), Vector(-115.188, 35.775, 77.984)));
  • If(Array Contains(Array(Map(Ecopoint: Antarctica), Map(Ecopoint: Antarctica Winter)), Current Map));
  • Modify Global Variable(wayPoints, Append To Array, Array(0, Vector(-8.619, 8.348, -25.144), Vector(-10.208, 8.917, -23.070),
  • Vector(-14.988, 11.300, -19.078), Vector(-15.019, 13.301, -8.672), Vector(-8.729, 13.333, -3.948), Vector(-8.650, 13.333,
  • -0.085), Vector(-8.641, 13.333, 3.611), Vector(-14.608, 13.301, 8.392), Vector(-15.212, 11.300, 18.771), Vector(-10.830, 9.159,
  • 23.011), Vector(-8.612, 8.331, 24.728), Vector(-6.224, 13.300, 12.216), Vector(-5.730, 13.300, -11.895), Vector(9.943, 13.300,
  • -12.410), Vector(11.180, 13.109, -17.414), Vector(6.503, 12.924, -21.816), Vector(16.519, 13.108, -22.544), Vector(17.575,
  • 11.074, -28.820), Vector(15.621, 9.287, -32.572), Vector(10.652, 8.187, -34.086), Vector(8.438, 8.859, -42.330), Vector(3.527,
  • 9.275, -53.266), Vector(10.538, 9.312, -51.169), Vector(-0.082, 9.047, -54.230), Vector(-12.819, 8.300, -44.761), Vector(
  • -8.139, 8.326, -40.559), Vector(2.227, 8.684, -29.833), Vector(-0.151, 8.684, -27.047), Vector(-3.082, 8.684, -24.516), Vector(
  • 5.918, 8.685, -20.470), Vector(15.044, 7.316, -18.102), Vector(18.032, 6.998, -11.111), Vector(18.023, 5.742, -8.601), Vector(
  • 17.761, 5.300, -0.342), Vector(18.073, 6.052, 9.220), Vector(18.169, 7.311, 13.336), Vector(23.068, 8.577, 11.731), Vector(
  • 22.936, 9.799, 9.288), Vector(22.510, 9.630, -9.624), Vector(23.147, 7.905, -13.076), Vector(17.748, 10.300, 6.518), Vector(
  • 17.727, 10.300, -6.451), Vector(20.867, 10.300, 0.117), Vector(17.912, 11.916, 9.950), Vector(17.506, 13.300, 15.092), Vector(
  • 13.991, 13.109, 19.584), Vector(17.808, 12.264, -10.645), Vector(17.028, 13.304, -16.025), Vector(13.503, 13.109, -19.281),
  • Vector(11.191, 13.109, 17.688), Vector(6.313, 12.932, 22.105), Vector(10.420, 13.300, 11.977), Vector(17.994, 12.207, 25.490),
  • Vector(17.180, 10.347, 30.798), Vector(13.330, 8.759, 32.479), Vector(8.243, 8.745, 42.112), Vector(10.470, 9.335, 51.226),
  • Vector(3.169, 9.299, 53.304), Vector(-0.636, 8.777, 54.452), Vector(-12.318, 8.300, 44.745), Vector(-8.445, 8.300, 40.933),
  • Vector(2.674, 8.511, 30.264), Vector(-3.616, 8.579, 24.151), Vector(6.220, 8.527, 20.653), Vector(-15.065, 8.239, 10.366),
  • Vector(-14.883, 8.327, -9.899), Vector(-7.533, 8.251, -3.581), Vector(-6.937, 8.045, 3.492), Vector(-24.227, 9.056, 5.927),
  • Vector(-24.573, 9.229, -5.965), Vector(-20.549, 8.300, -5.991), Vector(-20.929, 8.332, 6.007), Vector(-25.046, 11.420, -0.144),
  • Vector(-21.161, 13.322, -0.031), Vector(-32.400, 10.300, -0.022), Vector(0.130, 7.785, -12.712), Vector(0.879, 7.305, 11.175),
  • Vector(12.379, 5.341, -0.131), Vector(4.855, 8.024, -15.653), Vector(3.284, 7.857, 13.021), Vector(14.643, 7.309, 18.947),
  • Vector(23.626, 7.755, 13.377), Vector(1.378, 8.699, 25.238)));
  • }
  • }
  • rule("Team 2 Heroes Catchall")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • }
  • actions
  • {
  • Set Player Allowed Heroes(Event Player, Global.zombieList);
  • }
  • }
  • rule("Team 2 Heroes Catchall")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == False;
  • Is Alive(Event Player) == True;
  • Has Spawned(Event Player) == True;
  • Entity Exists(Event Player.VisFX) == False;
  • }
  • actions
  • {
  • Wait(0.250, Ignore Condition);
  • Create Effect(All Players(All Teams), Echo Cloning Effect, Color(Purple), Event Player, 1, Visible To Position and Radius);
  • Event Player.VisFX = Last Created Entity;
  • }
  • }
  • rule("Remove idlers in setup")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Has Spawned(Event Player) == False;
  • Is True For All(All Players(All Teams), !Has Spawned(Current Array Element)) == False;
  • Global.timeTillNextRound == 100;
  • }
  • actions
  • {
  • Wait(15, Abort When False);
  • Big Message(All Players(All Teams), Custom String("{0} will time out in 15 seconds", Event Player));
  • Wait(15, Abort When False);
  • Move Player to Team(Event Player, All Teams, -1);
  • }
  • }
  • rule("Respawn endless")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.finalRound == True;
  • Number Of Players(Color(Team 2)) == Global.maxZombos;
  • Number Of Living Players(Color(Team 2)) <= 12;
  • }
  • actions
  • {
  • Wait(Random Real(4, 12), Abort When False);
  • Respawn(Random Value In Array(All Dead Players(Color(Team 2))));
  • Loop If Condition Is True;
  • }
  • }
  • rule("lock movement")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Number Of Living Players(Color(Team 1)) == 0;
  • Is On Ground(Event Player) == True;
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Communicate(Event Player, Emote Up);
  • Skip If(Is Communicating Any Emote(Event Player), 1);
  • Set Status(Event Player, Null, Rooted, 9999);
  • }
  • }
  • rule("unlock movement")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Number Of Living Players(Color(Team 1)) > 0;
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Clear Status(Event Player, Rooted);
  • }
  • }
  • rule("Dummy - Zen Discord")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zenyatta;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • Wait(Random Real(1, 6), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy Zen - Healer Override")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zenyatta;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Using Ability 1(Event Player) == False;
  • Count Of(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 30, Color(Team 2), Surfaces),
  • Append To Array(All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element) < 1)) > 0;
  • }
  • actions
  • {
  • Event Player.MercyOveride = True;
  • Event Player.mercytarget = Sorted Array(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 30,
  • Color(Team 2), Surfaces), Append To Array(All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element)
  • < 1), Distance Between(Event Player, Current Array Element));
  • Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.mercytarget)), 400, To World,
  • Direction and Turn Rate);
  • Start Throttle In Direction(Event Player, Direction Towards(Event Player, World Vector Of(Event Player.mercyoffset,
  • Event Player.mercytarget, Rotation And Translation)), 0.750, To World, Replace existing throttle, Direction and Magnitude);
  • Wait(0.500, Ignore Condition);
  • Disallow Button(Event Player, Button(Primary Fire));
  • Press Button(Event Player, Button(Ability 1));
  • Loop If Condition Is True;
  • Event Player.MercyOveride = False;
  • Allow Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Rule 101")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Create HUD Text(All Players(All Teams), Null, Custom String("Eliminate waves of Zomnic Echos"), Null, Right, -10, Null, Color(
  • White), Null, Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Final Zomnic gets nanoboosted"), Null, Right, -9, Null, Color(White),
  • Null, Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Deaths respawn a Zomnic as your hero"), Null, Right, -8, Null, Color(
  • White), Null, Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Max {0} player heroes", Global.MaxHeroes), Null, Right, -7, Null,
  • Color(White), Null, Visible To and String, Default Visibility);
  • Create HUD Text(Global.SURVIVAL ? All Players(All Teams) : Empty Array, Null, Custom String(
  • "Hold Capture Point to Respawn Allies"), Null, Right, -6, Null, Color(White), Null, Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Change heroes inbetween rounds with {0}", Input Binding String(Button(
  • Interact))), Null, Right, -5, Null, Color(White), Null, Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Mode by Puppetsquid"), Null, Right, 0, Null, Color(White), Null,
  • Visible To and String, Default Visibility);
  • }
  • }
  • rule("retain ult charge")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Has Spawned(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.500, Ignore Condition);
  • If(Hero Of(Event Player) == First Of(Event Player.LastHero_UltCharge));
  • Set Ultimate Charge(Event Player, Event Player.LastHero_UltCharge[1]);
  • End;
  • Event Player.LastHero_UltCharge = Null;
  • }
  • }
  • rule("Dummy - Gengi Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player.target) == True;
  • Is On Ground(Event Player) == False;
  • Speed Of In Direction(Event Player, Down) > 0;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Ignore Condition);
  • Press Button(Event Player, Button(Jump));
  • Wait(5, Ignore Condition);
  • }
  • }
  • rule("Dummy - Doom Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Distance Between(Event Player * Vector(1, 5, 1), Event Player.objv * Vector(1, 5, 1)) > 20;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • Distance Between(Event Player * Vector(1, 0, 1), Event Player.objv * Vector(1, 0, 1)) < 10;
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), Barriers Do Not Block LOS) == True;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Jump));
  • Wait(Random Real(0.100, 0.250), Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • Stop Holding Button(Event Player, Button(Jump));
  • }
  • }
  • rule("Dummy - Doom Punch")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ammo(Event Player, 0) == 0;
  • Ability Cooldown(Event Player, Button(Secondary Fire)) == 0;
  • "@Condition normalize(eventPlayer.y - eventPlayer.target.y) < 1.5\n@Condition distance(eventPlayer, eventPlayer.target) < 7"
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), Barriers Do Not Block LOS) == True;
  • Absolute Value(Y Component Of(Event Player) - Y Component Of(Event Player.target)) < 2;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Disallow Button(Event Player, Button(Primary Fire));
  • Wait(0.250, Ignore Condition);
  • While(Is Firing Secondary(Event Player) || Ability Cooldown(Event Player, Button(Secondary Fire)) > 3);
  • Set Aim Speed(Event Player, 50);
  • Wait(0.025, Ignore Condition);
  • End;
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Wait(0.250, Ignore Condition);
  • Allow Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Dummy - Doomfist Bunny Hop")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is On Ground(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Event Player.target != String("Find");
  • "@Condition distance(eventPlayer, eventPlayer.target) < 6"
  • Is Firing Secondary(Event Player) == False;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Abort When False);
  • Start Holding Button(Event Player, Button(Jump));
  • Wait(1, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Jump));
  • Wait(Random Real(2, 3), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy - Doom Bonus health")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • Hero Of(Event Player) == Hero(Doomfist);
  • }
  • actions
  • {
  • Add Health Pool To Player(Event Player, Shields, (Hero Of(Event Player) == Hero(Doomfist)) * 150, False, True);
  • Event Player.bonusHealth = Last Created Health Pool;
  • Wait Until(Is Dead(Event Player), 99999);
  • Remove Health Pool From Player(Event Player.bonusHealth);
  • }
  • }
  • rule("Dummy - Doom Uppercut Simple")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • Distance Between(Event Player * Vector(1, 0, 1), Event Player.objv * Vector(1, 0, 1)) < 5;
  • Ammo(Event Player, 0) == 0;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Dummy - Lucio Boop")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Lúcio;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Secondary Fire)) == 0;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • Distance Between(Event Player, Event Player.target) < 5;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Ignore Condition);
  • Press Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Dummy - Doomy Melee")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is On Ground(Event Player) == True;
  • Ammo(Event Player, 0) == 0;
  • Is Firing Secondary(Event Player) == False;
  • Distance Between(Event Player, Event Player.target) < 5;
  • Has Status(Event Player, Asleep) == False;
  • Has Status(Event Player, Knocked Down) == False;
  • Has Status(Event Player, Frozen) == False;
  • Has Status(Event Player, Rooted) == False;
  • Has Status(Event Player, Stunned) == False;
  • Is Using Ability 2(Event Player) == False;
  • Is Using Ability 1(Event Player) == False;
  • Hero Of(Event Player) == Hero(Doomfist);
  • }
  • actions
  • {
  • Apply Impulse(Event Player, Vector(0, 0, 1), 3, To Player, Cancel Contrary Motion);
  • Press Button(Event Player, Button(Melee));
  • Wait(Random Real(0.750, 1.500), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy- Doom shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Event Player.target != String("Find");
  • Is Alive(Event Player.target) == True;
  • Is In View Angle(Event Player, Event Player.target, 25) == True;
  • Is In Line of Sight(Eye Position(Event Player), Event Player.target, Barriers Do Not Block LOS) == True;
  • Is Button Held(Event Player, Button(Secondary Fire)) == False;
  • Ammo(Event Player, 0) != 0;
  • }
  • actions
  • {
  • Wait(Random Real(0.100, 0.500), Ignore Condition);
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(Random Real(0.100, 0.500), Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Loop If Condition Is True;
  • }
  • }
  • rule("Dummy - Doom Slam - from above")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • Ammo(Event Player, 0) < 2;
  • Is On Ground(Event Player.target) == True;
  • Y Component Of(Position Of(Event Player)) > Y Component Of(Position Of(Event Player.target));
  • Speed Of In Direction(Event Player, Down) > 0;
  • Distance Between(Event Player, Event Player.target) < 7;
  • "@Condition eventPlayer.getAbilityCooldown(Button.ABILITY_1) > 0\n@Condition eventPlayer.getAbilityCooldown(Button.ABILITY_2) == 0\n@Condition eventPlayer.isInViewAngle(eventPlayer.target, 45) == true"
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), Barriers Do Not Block LOS) == True;
  • }
  • actions
  • {
  • Event Player.MercyOveride = True;
  • Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Position Of(Event Player.target)), 500, To World,
  • Direction and Turn Rate);
  • "smallMessage(getAllPlayers(), \"boop\")"
  • Start Holding Button(Event Player, Button(Ability 2));
  • Wait(0.200, Ignore Condition);
  • Loop If Condition Is True;
  • While(Is Using Ability 2(Event Player));
  • Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Event Player.target + World Vector Of(Vector(0, 0, -1),
  • Event Player, Rotation)), 150, To World, Direction and Turn Rate);
  • Wait(0.200, Ignore Condition);
  • End;
  • Event Player.MercyOveride = False;
  • Stop Holding Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("spawn test ai")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • "@Condition Gamemode.TDM == getCurrentGamemode()"
  • Global.singleZombie != False;
  • }
  • actions
  • {
  • "@Condition getNumberOfPlayers(Color.TEAM_2) < maxZombos\n@Condition getNumberOfLivingPlayers(Color.TEAM_2) < 12"
  • Skip If(Entity Exists(Global.singleZombie), 3);
  • Create Dummy Bot(Global.singleZombie, Color(Team 2), Random Value In Array(Global.hasDummy), Random Value In Array(Spawn Points(
  • All Teams)), Vector(0, 0, 0));
  • Set Status(Last Created Entity, Null, Unkillable, 9999);
  • Global.singleZombie = Last Created Entity;
  • "roundSetupComplete = true"
  • Wait(0.250, Ignore Condition);
  • Wait Until(Is Dead(Global.singleZombie), 99999);
  • While(Is Dead(Global.singleZombie));
  • Stop Forcing Player Position(Global.singleZombie);
  • Respawn(Global.singleZombie);
  • Wait(0.250, Ignore Condition);
  • End;
  • Loop;
  • }
  • }
  • rule("ATTN")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Communicating(Event Player, Hello) == True;
  • }
  • actions
  • {
  • Filtered Array(All Players(Color(Team 2)), Current Array Element.target == String("Find") && Is In Line of Sight(
  • Current Array Element, Event Player, Barriers Do Not Block LOS)).target = Event Player;
  • }
  • }
  • rule("Wave hello")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Communicating(Event Player.target, Hello) == True;
  • }
  • actions
  • {
  • Wait(Random Real(1, 3), Ignore Condition);
  • Communicate(Event Player, Hello);
  • }
  • }
  • rule("cancel primary if needed")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • Wait(1.750, Ignore Condition);
  • Abort If(Is In View Angle(Event Player, Event Player.target, 20));
  • If(Ray Cast Hit Position(Eye Position(Event Player), Facing Direction Of(Event Player) * 25 + Eye Position(Event Player),
  • All Players(Color(Team 1)), Event Player, True) == Eye Position(Event Player) + Facing Direction Of(Event Player) * 25);
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(0.250, Ignore Condition);
  • }
  • }
  • rule("devstuff")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.singleZombie = Workshop Setting Toggle(Custom String("0 - Dev Settings"), Custom String("Single test Zombie"), False, 0);
  • Skip If(!Global.singleZombie, 1);
  • Global.singleZombie = Workshop Setting Hero(Custom String("0 - Dev Settings"), Custom String("Testing Zombie"), Echo, 0);
  • }
  • }
  • rule("Dummy - Hanzo Spaam")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Normalized Health(Event Player) < 0.750;
  • Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Dummy - Hanzo Hop")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • "@Condition eventPlayer.isOnGround() != true\n@Condition eventPlayer.getSpeedInDirection(Vector.DOWN) < 0"
  • Ability Cooldown(Event Player, Button(Jump)) == 0;
  • Is Firing Primary(Event Player) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Jump));
  • Wait Until(Speed Of In Direction(Event Player, Down) > 0, 99999);
  • Start Throttle In Direction(Event Player, Vector(Random Real(-1, 1), 0, Random Real(-1, 1)), 1, To Player,
  • Replace existing throttle, Direction and Magnitude);
  • Press Button(Event Player, Button(Jump));
  • }
  • }
  • rule("Dummy - Hanzo sonic")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Is Firing Primary(Event Player) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Hanzo Sonic activate")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Ability == Button(Ability 1);
  • }
  • actions
  • {
  • (Event Player.target == String("Find") ? All Living Players(Color(Team 2)) : Empty Array).target = Victim;
  • }
  • }
  • rule("Manual Change Hero")
  • {
  • event
  • {
  • Subroutine;
  • goToHeroSelect;
  • }
  • actions
  • {
  • Event Player.LastHero_UltCharge = Hero Of(Event Player);
  • Event Player.LastHero_UltCharge[1] = Ultimate Charge Percent(Event Player);
  • "moveToTeam(eventPlayer, Team.ALL, -1)\nmoveToTeam(eventPlayer, Color.TEAM_1, -1)"
  • Start Forcing Player To Be Hero(Filtered Array(All Players(Color(Team 2)), Current Array Element.zombi == Event Player), Hero(
  • Echo));
  • Event Player.swapheroLocation = Position Of(Event Player);
  • Start Forcing Player Position(Event Player, Event Player.swapheroLocation, True);
  • Set Player Allowed Heroes(Event Player, Remove From Array(Global.allowedHeroes, Hero Of(Event Player)));
  • Wait(0.016, Ignore Condition);
  • If(Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Team 1))) < Global.MaxHeroes);
  • Set Player Allowed Heroes(Event Player, Global.allowedHeroes);
  • Else;
  • Set Player Allowed Heroes(All Players(Color(Team 1)), Global.lockedHeroes);
  • End;
  • Wait Until(Has Spawned(Event Player), 99999);
  • Wait(0.250, Ignore Condition);
  • Stop Forcing Player Position(Event Player);
  • }
  • }
  • rule("LockHeroesAtMax")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)))) >= Global.MaxHeroes;
  • }
  • actions
  • {
  • Global.lockedHeroes = Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)));
  • Set Player Allowed Heroes(All Players(Color(Team 1)), Global.lockedHeroes);
  • }
  • }
  • rule("UnlockHeroes")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)))) < Global.MaxHeroes;
  • }
  • actions
  • {
  • Global.lockedHeroes = Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)));
  • Set Player Allowed Heroes(All Players(Color(Team 1)), Global.allowedHeroes);
  • }
  • }
  • rule("LockHeroesAtMax_join")
  • {
  • event
  • {
  • Player Joined Match;
  • All;
  • All;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)))) >= Global.MaxHeroes;
  • }
  • actions
  • {
  • Global.lockedHeroes = Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)));
  • Set Player Allowed Heroes(All Players(Color(Team 1)), Global.lockedHeroes);
  • }
  • }
  • rule("Show Stats")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Host Player == Event Player;
  • Workshop Setting Toggle(Custom String("Dev Options"), Custom String("Show Server Load"), False, 0) == True;
  • }
  • actions
  • {
  • Create HUD Text(All Players(All Teams), Server Load, Custom String("{0} Server Peak", Server Load Peak), Custom String(
  • "{0} average", Server Load Average), Left, 0, Color(White), Color(White), Color(White), Visible To and String,
  • Default Visibility);
  • }
  • }
  • disabled rule("Rule 111")
  • {
  • event
  • {
  • Player Died;
  • All;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Global.zombieList, Hero Of(Event Player)) != True;
  • Is Dead(Event Player) == True;
  • }
  • actions
  • {
  • Wait(2, Abort When False);
  • Start Forcing Player To Be Hero(Event Player, Hero(Echo));
  • Wait(0.100, Ignore Condition);
  • Kill(Event Player, Null);
  • }
  • }
  • rule("back to select on max")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Has Spawned(Event Player) == True;
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Color(Team 1)))) > Global.MaxHeroes;
  • }
  • actions
  • {
  • Wait(0.250, Abort When False);
  • Call Subroutine(goToHeroSelect);
  • }
  • }
  • rule("manual enter hero select")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Interact)) == True;
  • Global.timeTillNextRound > 0;
  • }
  • actions
  • {
  • Call Subroutine(goToHeroSelect);
  • }
  • }
  • rule("do ult")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Ultimate Charge Percent(Event Player) == 100;
  • Event Player.target != String("Find");
  • }
  • actions
  • {
  • disabled Set Ultimate Charge(Event Player, 100);
  • If(Hero Of(Event Player) != Hero(Echo) && Global.doUltimate == 2);
  • Press Button(Event Player, Button(Ultimate));
  • Else If(Global.doUltimate == 2);
  • While(!Is Duplicating(Event Player));
  • Press Button(Event Player, Button(Ultimate));
  • Wait(2, Ignore Condition);
  • End;
  • Skip If(!Is Alive(Event Player), 1);
  • Start Forcing Player To Be Hero(Event Player, Hero Being Duplicated(Event Player));
  • Else If(Global.doUltimate > 0);
  • Event Player.nanoBoost[0] = True;
  • End;
  • }
  • }
Join the Workshop.codes Discord