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. SPECTATORS DISABLED DUE TO WORKSHOP BUG. By Puppetsquid. Code: 38SY3"
  • 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 Spectators: 0
  • 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
  • {
  • 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: [0]
  • 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
  • 15: customWaypoints
  • 14: O
  • 16: hasDummy
  • 17: allSpawned
  • 18: MaxHeroes
  • 19: DisableTorb
  • 20: DisableGenji
  • 21: VisIt
  • 22: zomboSelection
  • 23: X
  • 24: lockedHeroes
  • 25: allowedHeroes
  • 26: KILLFEED
  • 27: initialZombies
  • 28: singleZombie
  • player:
  • 0: possPos
  • 1: it
  • 2: objv
  • 3: target
  • 4: zombi
  • 5: FacingRand
  • 6: avoid
  • 7: nanoBoost
  • 8: mimic
  • 9: aimOffset
  • 11: lockedInplace
  • 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
  • 23: rezzingMercy
  • 24: latestLocs
  • 25: swapheroLocation
  • 26: closestPoints
  • 27: bonusHealth
  • }
  • subroutines
  • {
  • 0: updateObjective
  • 1: spawnpoint
  • 2: removeSpawnpoint
  • 3: makeWave
  • }
  • 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;
  • disabled Disable Built-In Game Mode Completion;
  • "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(Filtered Array(All Players(All Teams), Number Of Living Players(Team 2) == 1), All Living Players(Team 2), Skull,
  • Visible To and Position, Color(Red), True);
  • 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;
  • disabled Global.zombieList[Index Of Array Value(Global.zombieList, Hero(Echo))] = Hero(Doomfist);
  • disabled While(Workshop Setting Toggle(Custom String("Horde Settings"), Custom String("Swap Torb for Doomfist"), True, 0) && Array Contains(
  • Global.zombieList, Hero(Torbjörn)));
  • disabled Global.zombieList[Index Of Array Value(Global.zombieList, Hero(Torbjörn))] = Hero(Reaper);
  • disabled 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;
  • disabled Create Progress Bar HUD Text(Filtered Array(All Players(All Teams), Global.timeTillNextRound > 0), Global.timeTillNextRound,
  • Custom String("UNTIL NEXT ROUND"), Top, 2, Color(Red), Color(White), Visible To Values and Color, Default Visibility);
  • Create Progress Bar HUD Text(Filtered Array(All Players(All Teams), Global.pickupTimer > 0), Global.pickupTimer, String(
  • "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("{1} {0} {2} (workshop limit)", Global.MaxHeroes, String("Max"), 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);
  • 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(Filtered Array(All Players(All Teams), Global.allSpawned && Global.timeTillNextRound > 0),
  • 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("-- {2}: {0} {1} --", String("Selecting"), String("Heroes"), String("Waiting")), Top,
  • 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);
  • disabled Disable Kill Feed(All Players(All Teams));
  • }
  • }
  • rule("auto damage balance")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Start Damage Modification(All Players(Team 2), All Players(Team 1), 100 + Max(0, Number Of Living Players(Team 2)
  • - Number Of Living Players(Team 1)) * 2.500, Receivers Damagers and Damage Percent);
  • disabled Start Damage Modification(All Players(Team 1), All Players(Team 2), 100 + Number Of Living Players(Team 2) * -2.500,
  • Receivers Damagers and Damage Percent);
  • Start Damage Modification(All Players(Team 1), All Players(Team 2), 100 + Max(0, Number Of Living Players(Team 2)
  • - Number Of Living Players(Team 1)) * -2.500, Receivers Damagers and Damage Percent);
  • 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(Team 1) > 0 && Is True For All(All Players(Team 1), Has Spawned(Current Array Element));
  • 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(Team 2) == Number Of Players(Team 2);
  • 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, Count Of(All Players(Team 2)), 1);
  • Destroy Effect(Players In Slot(Global.VisIt, Team 2).VisFX);
  • 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(Team 1));
  • 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(Team 1), Has Spawned(Current Array Element));
  • 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);
  • End;
  • }
  • }
  • rule("spawn ai")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Game Mode(Team Deathmatch) == Current Game Mode;
  • Global.singleZombie == False;
  • Number Of Players(Team 2) < Global.maxZombos;
  • Number Of Living Players(Team 2) < 12;
  • 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);
  • disabled Global.hasDummy[Global.O] = -1 + (1 + Global.O) * !Entity Exists(Players In Slot(Global.O, Team 2));
  • Global.hasDummy[Global.O] = -1 + (1 + Global.O) * !Has Spawned(Players In Slot(Global.O, Team 2));
  • "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), Team 2, Random Value In Array(Global.hasDummy), Random Value In Array(Spawn Points(All Teams)),
  • 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));
  • disabled Wait(0.250, Ignore Condition);
  • Wait(Number Of Living Players(Team 2) * 0.500, Ignore Condition);
  • "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, Team 1, Off), Is Alive(Current Array Element))) > 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, Team 1, Off), Is Alive(Current Array Element))) > 0);
  • 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(Team 1));
  • Resurrect(All Dead Players(Color(Team 1)));
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Global.pickupPoint, 100);
  • disabled Create HUD Text(All Players(All Teams), Custom String("{1} {0} {2} {1}", String("Team"), Ability Icon String(Hero(Mercy), Button(
  • Ability 2)), String("Resurrected")), Null, Null, Right, 0, Color(Orange), Color(Team 1), Color(White), Visible To and String,
  • Default Visibility);
  • disabled Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • "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(Team 1) == 0;
  • Number Of Living Players(Color(Team 1)) == 0;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Set Slow Motion(25);
  • Wait(1.250, Ignore Condition);
  • Declare Team Victory(Team 2);
  • 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(Team 1) > 0;
  • Number Of Living Players(Color(Team 1)) > 0;
  • Event Player.MercyOveride == False;
  • Is True For Any(All Players(Team 1), Has Spawned(Event Player)) == True;
  • disabled Number Of Living Players(Team 1) > 0;
  • 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) == True);
  • 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;
  • disabled Event Player.walkables = Array Slice(Sorted Array(Event Player.walkables, Absolute Value(5 - Distance Between(Event Player,
  • Current Array Element))), 0, 3);
  • disabled Event Player.possPos = Eye Position(Event Player) + Direction Towards(Event Player, Event Player.objv) * 2;
  • "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
  • {
  • disabled Enable Inspector Recording;
  • "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(Team 2),
  • 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) + 0, 1);
  • 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) + 0, 1);
  • 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;
  • disabled Event Player.closestObjective = First Of(Sorted Array(Event Player.closestPoints, Distance Between(Current Array Element,
  • Event Player.closestObjective)));
  • disabled Event Player.closestObjective = First Of(Sorted Array(Event Player.closestPoints, Distance Between(Event Player.closestObjective,
  • Current Array Element) + Distance Between(Current Array Element, Event Player.multiPos) * 0.150));
  • "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);
  • disabled Event Player.objv = First Of(Sorted Array(Event Player.objv, Distance Between(Direction Towards(Event Player,
  • Event Player.walkables), Direction Towards(Event Player, Current Array Element))));
  • disabled Disable Inspector Recording;
  • disabled Event Player.closestObjective = First Of(Sorted Array(Event Player.closestPoints, 0 * (1 + !Is In View Angle(Event Player,
  • Current Array Element * 0.064, 45))));
  • }
  • }
  • 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(Team 1), Has Spawned(Event Player)) == True;
  • disabled Number Of Living Players(Team 1) > 0;
  • 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
  • {
  • disabled Modify Player Variable(Event Player, latestLocs, Append To Array, Event Player.objv);
  • disabled Skip If(Count Of(Event Player.latestLocs) < 3, 1);
  • disabled Modify Player Variable(Event Player, latestLocs, Remove From Array By Value, First Of(Event Player.latestLocs));
  • Event Player.latestLocs = Event Player.objv;
  • Call Subroutine(updateObjective);
  • Wait(Random Real(1, 2), Abort When False);
  • disabled Wait Until(Distance Between(Event Player.objv, Event Player) < 5, Random Real(1, 4));
  • disabled Wait(0.016, Ignore Condition);
  • "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) != True;
  • Has Status(Event Player, Knocked Down) == False;
  • }
  • actions
  • {
  • Set Aim Speed(Event Player, Random Integer(75, 100));
  • disabled Event Player.FacingRand = World Vector Of(Direction From Angles(Random Integer(-3, 3) * 45, Random Real(-10, 10)), Event Player,
  • Rotation);
  • "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) != True;
  • Is Alive(Player Closest To Reticle(Event Player, Team 1)) == True;
  • Is In View Angle(Event Player, Player Closest To Reticle(Event Player, Team 1), 90) == True;
  • (Hero Of(Player Closest To Reticle(Event Player, Team 1)) == Hero(Sombra) && Is Using Ability 1(Player Closest To Reticle(
  • Event Player, Team 1))) == False;
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Player Closest To Reticle(Event Player, Team 1)),
  • 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, Team 1);
  • disabled Event Player.target = Random Value In Array(Filtered Array(Players Within Radius(Eye Position(Event Player), 50, Team 1, Surfaces),
  • Is Alive(Current Array Element)));
  • 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;
  • disabled Event Player.target == False;
  • Has Status(Event Player, Knocked Down) != 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));
  • disabled Apply Impulse(Event Player, Forward, 5, To Player, Cancel Contrary Motion);
  • "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");
  • disabled Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player.target), All Players(All Teams), Event Player, True)
  • == Event Player.target;
  • "@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)) != 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) != True;
  • Is Button Held(Event Player, Button(Secondary Fire)) != True;
  • disabled (Ammo(Event Player, 0) != 0 && Max Ammo(Event Player, 0) != 0) == True;
  • 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");
  • disabled Ray Cast Hit Player(Eye Position(Event Player), Eye Position(Event Player.target), All Players(All Teams), Event Player, True)
  • == Event Player.target;
  • "@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) == Team 1;
  • 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("{1} {0}", Ability Icon String(Hero(Echo), Button(Ultimate)), Hero Of(
  • Event Player)));
  • 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);
  • disabled Skip If(Global.finalRound, 1);
  • disabled Event Player.avoid = World Vector Of(Vector(0, 0, -12), Event Player, Rotation And Translation);
  • disabled Chase Player Variable At Rate(Event Player, avoid, World Vector Of(Vector(0, 0, 2), Event Player, Rotation And Translation), 2,
  • Destination and Rate);
  • disabled Create Effect(All Players(All Teams), Sphere, Color(Black), Event Player.avoid, 3, Visible To Position and Radius);
  • disabled Create Beam Effect(All Players(All Teams), Good Beam, Eye Position(Event Player), Event Player.objv, Color(Orange),
  • Visible To Position and Radius);
  • disabled Create Beam Effect(All Players(All Teams), Good Beam, Eye Position(Event Player), Event Player.possPos, Color(Blue),
  • Visible To Position and Radius);
  • disabled Create Beam Effect(All Players(All Teams), Bad Beam, Eye Position(Event Player), Event Player.closestObjective, Color(Purple),
  • Visible To Position and Radius);
  • disabled Start Forcing Player Outlines(Event Player, All Players(All Teams), True, Color(Lime Green), Always);
  • }
  • }
  • rule("lose target")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != False;
  • Is Alive(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;
  • disabled Number Of Deaths(Event Player) > 0;
  • "@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)
  • || Current Array Element == Global.zombieList[Slot Of(Event Player)])) > 10, 1);
  • 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)]);
  • disabled Start Forcing Dummy Bot Name(Event Player, Custom String("Zombi"));
  • Start Forcing Dummy Bot Name(Event Player, Custom String("{1} {0}", Ability Icon String(Hero(Echo), Button(Ultimate)), Hero(
  • Echo)));
  • disabled Skip If(Slot Of(Event Player) >= Global.maxZombos - 2, 1);
  • "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);
  • disabled Modify Team Score(Team 1, 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 = Team 1;
  • 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, Team 2, Surfaces), Append To Array(
  • All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element) < 1)) > 0;
  • 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
  • {
  • disabled Event Player.target = Event Player.mercytarget;
  • "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;
  • disabled Stop Holding Button(Event Player, Button(Primary Fire));
  • "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,
  • 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));
  • 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);
  • disabled Skip If(Hero Of(Event Player) == Hero(Zenyatta), 1);
  • 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));
  • disabled Event Player.target = String("Find");
  • "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, Team 2, Surfaces), Append To Array(
  • All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element) < 1)) == 0;
  • 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(Team 2), !Array Contains(All Support Heroes, Hero Of(Current Array Element)))) < 2);
  • Event Player.teamFollow = Team 2;
  • 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 = Team 1;
  • 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) == True;
  • 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(Team 2) >= Min(Global.maxZombos, 12), 1);
  • Event Player.duplicateTarget = All Dead Players(Team 2);
  • 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(Team 2), Current Array Element.target == String(
  • "Find")), Distance Between(Current Array Element, Closest Player To(Current Array Element, Team 1)));
  • Skip If(Number Of Living Players(Team 2) >= Min(Global.maxZombos, 12), 1);
  • Modify Player Variable(Event Player, duplicateTarget, Append To Array, All Dead Players(Team 2));
  • 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(Team 2), Hero Of(Current Array Element) == Hero(
  • Echo)), Distance Between(Current Array Element, Closest Player To(Current Array Element, Team 1)));
  • Skip If(Number Of Living Players(Team 2) >= Min(Global.maxZombos, 12), 1);
  • Modify Player Variable(Event Player, duplicateTarget, Append To Array, All Dead Players(Team 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(Team 2), Current Array Element.target == String(
  • "Find")), Distance Between(Current Array Element, Closest Player To(Current Array Element, Team 1)));
  • disabled Event Player.duplicateTarget = Sorted Array(Filtered Array(All Players(Team 2), Current Array Element.target == String("Find")),
  • 1 * (1000 - Distance Between(Current Array Element, Closest Player To(Current Array Element, Team 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))));
  • 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));
  • disabled Play Effect(All Players(All Teams), Symmetra Teleporter Reappear Effect, Color(Red), Event Player.zombi, 1);
  • "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(Team 2), Current Array Element.zombi == Event Player)) > 0);
  • 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);
  • disabled Start Forcing Player Position(Event Player.zombi, Event Player, True);
  • While(Has Status(Event Player.zombi, Asleep) != True);
  • "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(Team 1, -1);
  • Modify Team Score(Color(Team 1), -1);
  • Event Player.zombi.target = String("Find");
  • Start Forcing Dummy Bot Name(Event Player.zombi, Custom String("{1} {0}", Ability Icon String(Hero(Echo), Button(Ultimate)),
  • Event Player, String Slice(Global.round, 0, 0)));
  • 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);
  • disabled If(Global.RETRIBUTION);
  • disabled Event Player.zombi.nanoBoost[0] = True;
  • disabled End;
  • "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);
  • }
  • }
  • disabled rule("Cheats - Fix Stuck Enemies")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • disabled Speed Of(Event Player) < 1;
  • Event Player.nanoBoost != True;
  • Is True For Any(Players Within Radius(Eye Position(Event Player), 30, Team 1, Off), Is Alive(Current Array Element)) != True;
  • Number Of Living Players(Team 1) > 0;
  • }
  • actions
  • {
  • Event Player.lockedInplace = Event Player * Vector(1, 0, 1);
  • Wait(10, Abort When False);
  • If(Distance Between(Event Player.lockedInplace, Event Player * Vector(1, 0, 1)) < 1.500);
  • Teleport(Event Player, Last Of(Sorted Array(Spawn Points(All Teams), Distance Between(Current Array Element, Closest Player To(
  • Current Array Element, Team 1)))));
  • Set Status(Event Player, Null, Stunned, 1.500);
  • Play Effect(All Players(All Teams), Sombra Translocator Reappear Effect, Color(White), Evaluate Once(Eye Position(Event Player)),
  • 1);
  • Event Player.target = String("Find");
  • End;
  • Call Subroutine(updateObjective);
  • Loop If Condition Is True;
  • }
  • }
  • 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(Team 1), Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
  • Barriers Do Not Block LOS)) == 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, Team 1);
  • 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;
  • disabled Create HUD Text(All Players(All Teams), Custom String("{1} {2} NANOBOOSTED {2} {1}", String("Boss"), Ability Icon String(Hero(Ana),
  • Button(Ultimate)), Hero Icon String(Hero Of(Event Player))), Null, Null, Right, 0, Color(Purple), Color(Team 1), Color(White),
  • Visible To and String, Default Visibility);
  • disabled Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • }
  • }
  • rule("Nanoboost - end effects")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.nanoBoost[0] == False;
  • 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(Team 2) == 1;
  • 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), Team 2), Event Player.target == Current Array Element.target),
  • 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(
  • Team 1), Event Player, True) == Event Player.target;
  • disabled Is In Line of Sight(Event Player, Event Player.target, Barriers Do Not Block LOS) == True;
  • disabled Is Using Ability 2(Event Player) == False;
  • 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) != True;
  • Has Status(Event Player, Asleep) != True;
  • Has Status(Event Player, Knocked Down) != True;
  • Has Status(Event Player, Frozen) != True;
  • Has Status(Event Player, Rooted) != True;
  • Has Status(Event Player, Stunned) != True;
  • 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
  • {
  • disabled Wait(Random Real(0, 6), Ignore Condition);
  • disabled Wait Until(Is In View Angle(Event Player, Event Player.objv, 15), 5);
  • "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
  • {
  • disabled Wait Until(Is In View Angle(Event Player, Event Player.objv, 15), 5);
  • "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, Team 1)) > 10;
  • 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(
  • Team 1), Event Player, True) == Event Player.target;
  • 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
  • {
  • disabled Wait Until(Is In View Angle(Event Player, Event Player.objv, 15), 5);
  • "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(Team 1), Event Player, True) == Event Player.target;
  • 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,
  • 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));
  • 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);
  • End;
  • }
  • }
  • rule("Dummy - Rein Shield")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • disabled Distance Between(Event Player, Closest Player To(Event Player, Team 1)) > 3;
  • }
  • 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, Team 1, Surfaces), Is Alive(
  • 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);
  • disabled Loop If Condition Is True;
  • }
  • }
  • 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, Team 1)) > 5;
  • 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(Team 1), Event Player, True) == Event Player.target;
  • 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, Team 2)) < 1;
  • Normalized Health(Player Closest To Reticle(Event Player, Team 2)) > 0;
  • Is In View Angle(Event Player, Player Closest To Reticle(Event Player, Team 2), 15) == 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));
  • }
  • }
  • disabled rule("Dummy - Brig Whip")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Brigitte;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • 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) * 10, All Players(
  • Team 1), Event Player, False) == Event Player.target;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1.500), Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • 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(
  • Team 1), Event Player, True) == Event Player.target;
  • 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;
  • disabled Distance Between(World Vector Of(Vector(0, 0, 7), Event Player, Rotation And Translation), First Of(Sorted Array(
  • Global.healthpacks, Distance Between(Event Player, Current Array Element)))) < 3;
  • "@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) != True;
  • 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;
  • disabled Distance Between(Vector(0, Y Component Of(Event Player), 0), Vector(0, Y Component Of(Event Player.target), 0)) > 3;
  • "@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;
  • disabled Is In Line of Sight(Eye Position(Event Player), Up + Event Player.objv, Barriers Do Not Block LOS) == 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);
  • disabled Wait Until(Is In View Angle(Event Player, Event Player.objv, 15), 5);
  • "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");
  • disabled Is On Ground(Event Player) == True;
  • "@Condition eventPlayer.isOnGround() == true"
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • disabled Distance Between(Event Player.objv, Event Player) < 35;
  • "@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");
  • disabled Is On Ground(Event Player) == True;
  • "@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, Team 1))) >= Global.MaxHeroes;
  • 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, Team 1));
  • Set Player Allowed Heroes(All Players(Team 1), Global.lockedHeroes);
  • 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, Team 1))) < Global.MaxHeroes;
  • 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, Team 1));
  • Set Player Allowed Heroes(All Players(Team 1), Global.allowedHeroes);
  • 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);
  • disabled Move Player to Team(Event Player, All Teams, -1);
  • disabled Move Player to Team(Event Player, Team 1, -1);
  • Start Forcing Player To Be Hero(Filtered Array(All Players(Team 2), Current Array Element.zombi == Event Player), Hero(Echo));
  • "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");
  • }
  • }
  • disabled rule("back Off Wall")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Array Contains(Array(Hero(Hanzo), Hero(Genji), Hero(Lúcio)), Hero Of(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) * 2.500, All Players(All Teams), Event Player, True)) < 2.500;
  • disabled Y Component Of(Event Player.objv) > Y Component Of(Event Player);
  • }
  • actions
  • {
  • Apply Impulse(Event Player, Vector(Random Real(-1, 1), 0, -1), 4, To Player, Incorporate Contrary Motion);
  • Event Player.FacingRand += Vector(0, 0, -1);
  • disabled Event Player.FacingRand *= 0.500;
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • disabled rule("Speedboost 1")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Number Of Living Players(Team 2) < 5;
  • Distance Between(Event Player, Closest Player To(Event Player, Team 1)) > 20;
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Closest Player To(Event Player, All Teams)),
  • Barriers Do Not Block LOS) != True;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, 150);
  • }
  • }
  • rule("Speedboost 2")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Distance Between(Event Player, Closest Player To(Event Player, Team 1)) <= 20;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, 100);
  • }
  • }
  • disabled rule("Speedboost 3")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is True For Any(All Living Players(Team 1), Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element),
  • Barriers Do Not Block LOS)) == True;
  • 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) != 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
  • {
  • disabled Wait Until(Normalized Health(Event Player) < Random Real(0.400, 0.600), 99999);
  • "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) != True;
  • 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, Team 1), Current Array Element)) == True;
  • 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(
  • Team 1), Event Player, False) == Event Player.target;
  • 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, Team 1)) * 0.025, Ignore Condition);
  • 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) != True;
  • 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, Team 1), Current Array Element)) == False;
  • 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(
  • Team 1), Event Player, True) == Event Player.target;
  • 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;
  • disabled Normalized Health(Event Player) < 5;
  • }
  • 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));
  • }
  • }
  • disabled rule("Tacticle reload")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.target != String("Find");
  • Is Using Ability 1(Event Player.target) == True;
  • }
  • actions
  • {
  • Wait(Random Real(0, 0.500), Ignore Condition);
  • Skip If(Random Integer(1, 6) != 1, 1);
  • Press Button(Event Player, Button(Reload));
  • }
  • }
  • 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(
  • Team 1), Event Player, True) == Event Player.target;
  • 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));
  • }
  • }
  • disabled rule("Rule 101")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • actions
  • {
  • Create HUD Text(All Players(All Teams), Custom String(""), Position Of(Event Player), Event Player.objv, Left, 0, Color(White),
  • Color(White), Color(White), Visible To and String, Default Visibility);
  • }
  • }
  • disabled rule("Map - Necro Hole Avoid")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Current Map == Map(Necropolis);
  • }
  • actions
  • {
  • Event Player.K = 20 - Distance Between(Event Player, Vector(0, 0, 0));
  • Event Player.K *= 0.100;
  • Modify Player Variable(Event Player, K, Min, 0.750);
  • Modify Player Variable(Event Player, K, Max, 0);
  • Wait(0.100, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • 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, Team 1)))));
  • 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);
  • }
  • }
  • disabled rule("Voicelines")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Wait(Random Real(3, 10), Ignore Condition);
  • Event Player.it = Random Integer(0, 5);
  • If(Event Player.it == 1);
  • Communicate(Event Player, Press the Attack);
  • Else If(Event Player.it == 2);
  • Communicate(Event Player, On My Way);
  • Else If(Event Player.it == 3);
  • Communicate(Event Player, Defending);
  • Else If(Event Player.it == 4);
  • Communicate(Event Player, Group Up);
  • Else If(Event Player.it == 5);
  • Communicate(Event Player, Going In);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Setup Waypoints")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.wayPoints = Empty Array;
  • For Global Variable(O, 0, Count Of(Spawn Points(All Teams)), 1);
  • disabled Create Effect(All Players(All Teams), Sphere, Color(Rose), Evaluate Once(Spawn Points(All Teams)[Global.O]), 2,
  • Visible To Position and Radius);
  • disabled Create Effect(All Players(All Teams), Sphere, Color(Green), Evaluate Once(Last Of(Global.wayPoints)), 1,
  • Visible To Position and Radius);
  • 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)));
  • End;
  • }
  • }
  • disabled rule("Add Waypoints")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Array(Map(Black Forest), Map(Black Forest Winter), Map(Castillo), Map(Necropolis), Map(Ecopoint: Antarctica), Map(
  • Ecopoint: Antarctica Winter)), Current Map) != True;
  • Number Of Players(Team 2) <= 7;
  • Is Alive(Event Player) == True;
  • Count Of(Filtered Array(Global.wayPoints, Is In Line of Sight(Eye Position(Event Player), Current Array Element,
  • Barriers Do Not Block LOS))) < 2;
  • Is On Ground(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.100, Abort When False);
  • Modify Global Variable(wayPoints, Append To Array, Eye Position(Event Player));
  • disabled Create Effect(All Players(All Teams), Sphere, Color(Green), Evaluate Once(Last Of(Global.wayPoints)), 1,
  • Visible To Position and Radius);
  • Loop If Condition Is True;
  • }
  • }
  • 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) != 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;
  • disabled Disable Built-In Game Mode Respawning(Event Player);
  • }
  • }
  • 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);
  • }
  • }
  • disabled rule("Add Waypoints")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player == First Of(All Living Players(Team 1));
  • Is Button Held(Event Player, Button(Interact)) == True;
  • }
  • actions
  • {
  • Wait(1, Abort When False);
  • Enable Inspector Recording;
  • Modify Global Variable(customWaypoints, Append To Array, Eye Position(Event Player));
  • Disable Inspector Recording;
  • Modify Global Variable(wayPoints, Append To Array, Eye Position(Event Player));
  • Create Effect(All Players(All Teams), Sphere, Color(Blue), Evaluate Once(Last Of(Global.wayPoints)), 1,
  • Visible To Position and Radius);
  • }
  • }
  • rule("Respawn endless")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.finalRound == True;
  • Number Of Players(Team 2) == Global.maxZombos;
  • Number Of Living Players(Team 2) <= 12;
  • 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(Team 2)));
  • Respawn(Random Value In Array(All Dead Players(Color(Team 2))));
  • Loop If Condition Is True;
  • }
  • }
  • disabled rule("AI - Pick Objective")
  • {
  • event
  • {
  • Subroutine;
  • updateObjective;
  • }
  • actions
  • {
  • For Player Variable(Event Player, it, 0, 9, 1);
  • Event Player.objv[Event Player.it] = Nearest Walkable Position(World Vector Of(Direction From Angles(Event Player.it * 36, 0) * 5,
  • Event Player, Rotation And Translation));
  • End;
  • Event Player.objv = Array Slice(Filtered Array(Event Player.objv, Absolute Value(4 - Distance Between(Event Player,
  • Current Array Element))), 0, 3);
  • }
  • }
  • rule("lock movement")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Number Of Living Players(Team 1) == 0;
  • 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(Team 1) > 0;
  • Number Of Living Players(Color(Team 1)) > 0;
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Clear Status(Event Player, Rooted);
  • }
  • }
  • disabled rule("keepalive")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Number Of Living Players(Team 1) == 0;
  • Is On Ground(Event Player) == True;
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Start Facing(Event Player, Direction From Angles(Random Real(-180, 180), Random Real(-20, 35)), 100, To World,
  • Direction and Turn Rate);
  • Wait(Random Real(0.250, 1.500), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • 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) == True;
  • Count Of(Filtered Array(Remove From Array(Players Within Radius(Eye Position(Event Player), 30, Team 2, Surfaces), Append To Array(
  • All Dead Players(All Teams), Event Player)), Normalized Health(Current Array Element) < 1)) > 0;
  • 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,
  • 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));
  • 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, Color(White),
  • Color(White), Color(White), Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Final Zomnic gets nanoboosted"), Null, Right, -9, Color(White), Color(
  • White), Color(White), 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, Color(White),
  • Color(White), Color(White), 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, Color(
  • White), Color(White), Color(White), Visible To and String, Default Visibility);
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.SURVIVAL), Null, Custom String(
  • "Hold Capture Point to Respawn Allies"), Null, Right, -6, Color(White), Color(White), Color(White), Visible To and String,
  • Default Visibility);
  • 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, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Custom String("Mode by Puppetsquid", Input Binding String(Button(Interact))), Null,
  • Right, 0, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
  • }
  • }
  • disabled rule("KillFeed handler 1")
  • {
  • event
  • {
  • Player Dealt Final Blow;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • If(Event Was Critical Hit);
  • Create HUD Text(All Players(All Teams), Custom String("{0} !{1}! {2}", Attacker, Ability Icon String(Hero Of(Attacker),
  • Event Ability), Custom String("{0} {1}", Ability Icon String(Hero(Echo), Button(Ultimate)), Victim)), Null, Null, Right, 0,
  • Color(Team 1), Color(Team 1), Color(White), Visible To and String, Default Visibility);
  • Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • Else;
  • Create HUD Text(All Players(All Teams), Custom String("{0} >{1}> {2}", Hero Icon String(Hero Of(Attacker)), Ability Icon String(
  • Hero Of(Attacker), Event Ability), Hero Icon String(Hero Of(Victim))), Null, Null, Right, 0, Color(Team 1), Color(Team 1),
  • Color(White), Visible To and String, Default Visibility);
  • Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • End;
  • }
  • }
  • disabled rule("KillFeed handler 2")
  • {
  • event
  • {
  • Player Dealt Final Blow;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Create HUD Text(All Players(All Teams), Custom String("{0} >{1}> {2}", Custom String("{0} {1}", Ability Icon String(Hero(Echo),
  • Button(Ultimate)), Attacker), Ability Icon String(Hero Of(Attacker), Event Ability), Victim), Null, Null, Right, 0, Color(
  • Team 2), Color(Team 1), Color(White), Visible To and String, Default Visibility);
  • Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • }
  • }
  • disabled rule("Rezzed feed")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Alive(Event Player) == True;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • If(Global.pickupTimer >= 100);
  • Else If(Array Contains(All Players(Team 1), Event Player.rezzingMercy));
  • Create HUD Text(All Players(All Teams), Custom String("{0} >{1}> {2}", Event Player.rezzingMercy, Ability Icon String(Hero(Mercy),
  • Button(Ability 2)), Event Player), Null, Null, Right, 0, Color(Orange), Color(Team 1), Color(White), Visible To and String,
  • Default Visibility);
  • Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • disabled Else;
  • disabled Create HUD Text(All Players(All Teams), Custom String("{1} {2} {1}", Null, Ability Icon String(Hero(Mercy), Button(Ability 2)),
  • Event Player), Null, Null, Left, 0, Color(Orange), Color(Team 1), Color(White), Visible To and String, Default Visibility);
  • disabled Modify Global Variable(KILLFEED, Append To Array, Last Created Entity);
  • End;
  • }
  • }
  • disabled rule("Mercy rezzing")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mercy;
  • }
  • conditions
  • {
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • First Of(Sorted Array(Filtered Array(All Dead Players(Team 1), Distance Between(Event Player, Current Array Element) < 5.100),
  • Distance Between(Event Player, Current Array Element) * Distance Between(Facing Direction Of(Event Player), Direction Towards(
  • Eye Position(Event Player), Eye Position(Current Array Element))))).rezzingMercy = Event Player;
  • Wait Until(!Is Using Ability 2(Event Player), 2);
  • Wait(0.500, Ignore Condition);
  • Filtered Array(All Players(Team 1), Event Player.rezzingMercy == Event Player).rezzingMercy = Null;
  • }
  • }
  • disabled rule("Slice Killfeed")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Count Of(Global.KILLFEED) > 5;
  • }
  • actions
  • {
  • Destroy Effect(First Of(Global.KILLFEED));
  • Global.KILLFEED = Array Slice(Global.KILLFEED, 2, 5);
  • Wait(0.016, Ignore Condition);
  • Loop If Condition Is True;
  • 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;
  • }
  • }
  • disabled rule("Rule 108")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • disabled rule("Rule 109")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is True For Any(Global.wayPoints, Distance Between(Current Array Element, Event Player) < 2) == True;
  • }
  • actions
  • {
  • disabled Event Player.latestLocs = First Of(Sorted Array(Global.wayPoints, Distance Between(Current Array Element, Event Player)));
  • Modify Player Variable(Event Player, latestLocs, Append To Array, First Of(Sorted Array(Global.wayPoints, Distance Between(
  • Current Array Element, Event Player))));
  • Skip If(Count Of(Event Player.latestLocs) < 3, 1);
  • Event Player.latestLocs = Array Slice(Event Player.latestLocs, 1, 3);
  • }
  • }
  • 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) != 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));
  • }
  • }
  • disabled rule("Dummy - Doom Slam")
  • {
  • 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;
  • Is On Ground(Event Player.target) == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) > 0;
  • Speed Of In Direction(Event Player, Down) > 0;
  • disabled Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • disabled Normalize(Y Component Of(Event Player) - Y Component Of(Event Player.target)) < 3;
  • Distance Between(Event Player, Event Player.target) < 7;
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), Barriers Do Not Block LOS) == True;
  • Is In View Angle(Event Player, Event Player.target, 45) == True;
  • }
  • actions
  • {
  • Wait(Random Real(0.100, 0.250), Ignore Condition);
  • Press Button(Event Player, Button(Ability 2));
  • Loop If Condition Is True;
  • }
  • }
  • 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;
  • disabled Normalize(Y Component Of(Event Player) - Y Component Of(Event Player.target)) < 1.500;
  • disabled Distance Between(Event Player, Event Player.target) < 7;
  • "@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");
  • disabled Distance Between(Event Player, Event Player.target) < 6;
  • "@Condition distance(eventPlayer, eventPlayer.target) < 6"
  • Is Firing Secondary(Event Player) == False;
  • }
  • actions
  • {
  • Wait(Random Real(0, 1), Abort When False);
  • disabled Abort If Condition Is 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) != True;
  • Is Firing Secondary(Event Player) == False;
  • Distance Between(Event Player, Event Player.target) < 5;
  • Has Status(Event Player, Asleep) != True;
  • Has Status(Event Player, Knocked Down) != True;
  • Has Status(Event Player, Frozen) != True;
  • Has Status(Event Player, Rooted) != True;
  • Has Status(Event Player, Stunned) != True;
  • Is Using Ability 2(Event Player) != True;
  • Is Using Ability 1(Event Player) != True;
  • 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;
  • }
  • }
  • disabled rule("Rule 120")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • 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)) != 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;
  • disabled Ability Cooldown(Event Player, Button(Ability 1)) > 0;
  • disabled Ability Cooldown(Event Player, Button(Ability 2)) == 0;
  • disabled Is In View Angle(Event Player, Event Player.target, 45) == True;
  • "@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);
  • disabled Small Message(All Players(All Teams), Custom String("boop"));
  • "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
  • {
  • disabled Game Mode(Team Deathmatch) == Current Game Mode;
  • "@Condition Gamemode.TDM == getCurrentGamemode()"
  • Global.singleZombie != False;
  • disabled Number Of Players(Team 2) < Global.maxZombos;
  • disabled Number Of Living Players(Team 2) < 12;
  • }
  • 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, Team 2, Random Value In Array(Global.hasDummy), Random Value In Array(Spawn Points(
  • 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;
  • disabled Global.roundSetupComplete = True;
  • "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;
  • }
  • }
  • disabled rule("Rule 109")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Count Of(Event Player.latestLocs) > 0;
  • }
  • actions
  • {
  • Wait(5, Abort When False);
  • Event Player.latestLocs = Array Slice(Event Player.latestLocs, 1, Count Of(Event Player.latestLocs));
  • Loop If Condition Is True;
  • }
  • }
  • rule("ATTN")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Communicating(Event Player, Hello) == True;
  • }
  • actions
  • {
  • Filtered Array(All Players(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;
  • 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(Team 1), Event Player, True) == Eye Position(Event Player) + Facing Direction Of(Event Player) * 25);
  • 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);
  • End;
  • }
  • }
  • 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;
  • disabled Is On Ground(Event Player) != True;
  • disabled Speed Of In Direction(Event Player, Down) < 0;
  • "@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
  • {
  • Filtered Array(All Living Players(Team 2), Event Player.target == String("Find")).target = Victim;
  • (Event Player.target == String("Find") ? All Living Players(Color(Team 2)) : Empty Array).target = Victim;
  • }
  • }
  • rule("LockHeroesAtMax_join")
  • {
  • event
  • {
  • Player Joined Match;
  • All;
  • All;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, Team 1))) >= Global.MaxHeroes;
  • 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, Team 1));
  • Set Player Allowed Heroes(All Players(Team 1), Global.lockedHeroes);
  • 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);
  • }
  • }
Join the Workshop.codes Discord