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 will respawn and take your form. By Puppetsquid. Code: F9PGY"
  • }
  • lobby
  • {
  • Allow Players Who Are In Queue: Yes
  • Map Rotation: After A Game
  • Max Team 2 Players: 0
  • Return To Lobby: Never
  • }
  • modes
  • {
  • Team Deathmatch
  • {
  • enabled maps
  • {
  • Black Forest
  • Castillo
  • Necropolis
  • }
  • }
  • General
  • {
  • Allow Hero Switching: Off
  • Game Mode Start: Immediately
  • Hero Limit: Off
  • Limit Roles: 2 Of Each Role Per Team
  • 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: [1]
  • }
  • 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
  • 16: hasDummy
  • 17: allSpawned
  • 18: MaxHeroes
  • 19: DisableTorb
  • 20: DisableGenji
  • 21: VisIt
  • 22: zomboSelection
  • 24: lockedHeroes
  • 25: allowedHeroes
  • 26: KILLFEED
  • player:
  • 0: possPos
  • 1: it
  • 2: objv
  • 3: target
  • 4: zombi
  • 5: FacingRand
  • 6: avoid
  • 7: nanoBoost
  • 8: mimic
  • 9: aimOffset
  • 11: lockedInplace
  • 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
  • 25: swapheroLocation
  • 26: closestPoints
  • }
  • 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;
  • Global.zombieList = Array(Hero(Echo), Hero(Reaper), Hero(Reaper));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Genji), Hero(Genji)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Moira), Hero(Moira)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Echo), Hero(Roadhog)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Torbjörn), Hero(Torbjörn)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Reaper), Hero(Genji)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Moira), Hero(Roadhog)));
  • Modify Global Variable(zombieList, Append To Array, Array(Hero(Echo), Hero(Echo), 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);
  • 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 Torbjorn (+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(Torbjörn)));
  • Global.zombieList[Index Of Array Value(Global.zombieList, Hero(Torbjörn))] = Hero(Reaper);
  • 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(
  • "Resurrecting"), Top, 2, Color(Orange), Color(White), Visible To Values and Color, Default Visibility);
  • Global.X = Custom String("gamemode by Puppetsquid.");
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.timeTillNextRound > 0), Input Binding String(Button(Interact)),
  • Custom String("Max {0} Player Heroes (workshop limit)", Global.MaxHeroes), Custom String("Press {0} to change hero", String(
  • "Interact")), 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),
  • Global.timeTillNextRound, Custom String("UNTIL NEXT ROUND"), Top, 2, Color(Team 1), Color(White), Visible To Values and Color,
  • Default Visibility);
  • Create Progress Bar HUD Text(Filtered Array(All Players(All Teams), !Global.allSpawned && Global.timeTillNextRound > 0),
  • Global.timeTillNextRound, Custom String("-- WAITING FOR HERO SELECT --"), 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"), 0,
  • Array(Custom String("Dead Only"), Custom String("Dead or Idle"), Custom String("Alive and Idle (no respawn)"), Custom String(
  • "Attacker")), 0);
  • 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("Damage Boost")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Start Damage Modification(All Players(Team 2), All Players(Team 1), 100 + Number Of Living Players(Team 2) * 5.555,
  • Start Damage Modification(All Players(Team 2), All Players(Team 1), 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 + Number Of Living Players(Team 2) * -2.500,
  • Receivers Damagers and Damage Percent);
  • }
  • }
  • 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;
  • 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;
  • }
  • actions
  • {
  • 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);
  • 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), 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;
  • 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(0.300, Ignore Condition);
  • Loop If Condition Is True;
  • Stop Forcing Throttle(Event Player);
  • }
  • }
  • 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));
  • If(Global.allSpawned);
  • Global.timeTillNextRound -= 0.500;
  • End;
  • End;
  • Global.maxZombos = Workshop Setting Integer(Custom String("Horde Settings"), Custom String("First wave size (+2 each round)"), 3,
  • 3, 6, 0);
  • 3, 18, 0);
  • 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);
  • 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);
  • End;
  • Destroy All Dummy Bots;
  • Call Subroutine(removeSpawnpoint);
  • Respawn(All Dead Players(Team 1));
  • 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));
  • If(Global.allSpawned);
  • Global.timeTillNextRound -= 0.750;
  • End;
  • End;
  • Call Subroutine(makeWave);
  • Unpause Match Time;
  • }
  • }
  • rule("Wave Begin")
  • {
  • event
  • {
  • Subroutine;
  • makeWave;
  • }
  • actions
  • {
  • Global.roundSetupComplete = False;
  • Global.round += 1;
  • If(Global.round * 2 > 19);
  • If(Global.maxZombos == 18);
  • Global.finalRound = True;
  • 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 * 2 + 1);
  • End;
  • }
  • }
  • rule("spawn ai")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Game Mode(Team Deathmatch) == Current Game Mode;
  • Number Of Players(Team 2) < Global.maxZombos;
  • Number Of Living Players(Team 2) < 12;
  • }
  • actions
  • {
  • For Global Variable(O, 0, Global.maxZombos, 1);
  • Global.hasDummy[Global.O] = -1 + (1 + Global.O) * !Entity Exists(Players In Slot(Global.O, Team 2));
  • End;
  • Create Dummy Bot(Hero(Echo), Team 2, Random Value In Array(Global.hasDummy), Random Value In Array(Spawn Points(All Teams)),
  • Vector(0, 0, 0));
  • Wait(Number Of Living Players(Team 2) * 0.500, Ignore Condition);
  • Loop If Condition Is True;
  • Global.roundSetupComplete = True;
  • disabled If(Global.finalRound);
  • disabled Create Dummy Bot(Hero(Echo), Team 2, -1, Random Value In Array(Spawn Points(All Teams)), Vector(0, 0, 0));
  • disabled Else;
  • disabled End;
  • }
  • }
  • 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;
  • Global.pickupTimer != 100;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • While(Global.pickupTimer <= 100);
  • If(Count Of(Filtered Array(Players Within Radius(Global.pickupPoint, 5, Team 1, Off), Is Alive(Current Array Element))) > 0);
  • Wait(0.100, Ignore Condition);
  • Global.pickupTimer += 0.200;
  • End;
  • End;
  • Resurrect(All Dead Players(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);
  • Wait(0.250, Ignore Condition);
  • Call Subroutine(removeSpawnpoint);
  • Global.pickupTimer = 0;
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Global.pickupPoint, 100);
  • }
  • }
  • 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;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Set Slow Motion(25);
  • Wait(1.250, Ignore Condition);
  • Declare Team Victory(Team 2);
  • }
  • }
  • 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;
  • }
  • actions
  • {
  • Call Subroutine(updateObjective);
  • Wait Until(Distance Between(Event Player.objv, Event Player) < 5, Random Real(2, 10));
  • Wait(0.016, Ignore Condition);
  • 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;
  • }
  • 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);
  • 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;
  • disabled Count Of(Filtered Array(Players Within Radius(Eye Position(Event Player), 50, Team 1, Surfaces), Current Array Element)) > 0;
  • Is Alive(Event Player) == True;
  • Is In View Angle(Event Player, Player Closest To Reticle(Event Player, Team 1), 90) == True;
  • Is In Line of Sight(Eye Position(Event Player), Eye Position(Player Closest To Reticle(Event Player, Team 1)),
  • Barriers Do Not Block LOS) == True;
  • Has Status(Event Player, Knocked Down) != True;
  • Is Alive(Player Closest To Reticle(Event Player, Team 1)) == 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;
  • }
  • 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)));
  • }
  • }
  • 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;
  • }
  • actions
  • {
  • If(Event Damage < 50);
  • 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, Abort When 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.025, 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);
  • Loop If Condition Is True;
  • }
  • }
  • rule("AI - shoot")
  • {
  • 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;
  • 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(Moira), Hero(Echo)), Hero Of(Event Player)) != True;
  • (Hero Of(Event Player) == Hero(Sombra) && Is Using Ability 1(Event Player) && Distance Between(Eye Position(Event Player),
  • Event Player.target) > 3) != True;
  • }
  • 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("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;
  • 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;
  • 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)));
  • 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;
  • }
  • 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;
  • }
  • actions
  • {
  • 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(Slot Of(Event Player) >= Global.maxZombos - 2, 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 Of(
  • Event Player)));
  • }
  • }
  • 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;
  • 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;
  • 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;
  • }
  • actions
  • {
  • disabled Event Player.target = Event Player.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));
  • 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));
  • 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");
  • 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;
  • }
  • 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;
  • Else;
  • Event Player.teamFollow = 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;
  • 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);
  • 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));
  • 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));
  • 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))));
  • Else If(Global.zomboSelection == 3);
  • Else If(Global.zomboSelection == 4);
  • Event Player.duplicateTarget = Attacker;
  • End;
  • disabled Play Effect(All Players(All Teams), Symmetra Teleporter Reappear Effect, Color(Red), Event Player.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(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, Knocked Down) != True);
  • 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, Knocked Down, 4);
  • Set Status(Event Player.zombi, Null, Invincible, 2);
  • 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);
  • 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)));
  • Event Player.zombi.zombi = Event Player;
  • Stop Facing(Event Player.zombi);
  • If(Global.RETRIBUTION);
  • disabled Event Player.zombi.nanoBoost[0] = True;
  • Clear Status(Event Player.zombi, Knocked Down);
  • End;
  • disabled If(Global.RETRIBUTION);
  • disabled Event Player.zombi.nanoBoost[0] = True;
  • disabled Clear Status(Event Player.zombi, Knocked Down);
  • disabled End;
  • Wait(4, Ignore Condition);
  • Abort If(Is Dead(Event Player.zombi));
  • Communicate(Event Player.zombi, Thanks);
  • Wait(Random Real(0.750, 1.500), Ignore Condition);
  • Communicate(Attacker, You are Welcome);
  • }
  • }
  • rule("Player Lives")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Set Invisible(Event Player, None);
  • Stop Camera(Event Player);
  • }
  • }
  • rule("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;
  • Entity Exists(Event Player.nanoBoost[1]) == False;
  • 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;
  • Global.roundSetupComplete == True;
  • }
  • actions
  • {
  • Destroy Effect(Event Player.nanoBoost[2]);
  • Small Message(All Players(All Teams), Custom String("Nano-boost Administered!"));
  • 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);
  • 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;
  • 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
  • {
  • Number Of Living Players(Team 2) == 1;
  • Global.roundSetupComplete == True;
  • Is Alive(Event Player) == True;
  • Number Of Living Players(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
  • {
  • Is Dummy Bot(Event Player) == True;
  • Global.roundSetupComplete == True;
  • Global.finalRound == True;
  • Event Was Critical Hit == 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
  • {
  • Is Dummy Bot(Event Player) == True;
  • Y Component Of(Event Player) >= Y Component Of(Event Player.target) + 1.500;
  • Is Using Ability 1(Event Player) == True;
  • 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");
  • Is True For Any(Players On Hero(Hero(Echo), All Teams), Event Player.target == Current Array Element.target && Is Using Ability 2(
  • Current Array Element)) == False;
  • Distance Between(Event Player, Event Player.target) < 16;
  • Is Alive(Event Player.target) == 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) * 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;
  • }
  • actions
  • {
  • 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
  • {
  • Is Dummy Bot(Event Player) == True;
  • Event Player.target != String("Find");
  • Is Using Ability 2(Event Player) != True;
  • Distance Between(Event Player, Event Player.target) < 3.500;
  • }
  • actions
  • {
  • Apply Impulse(Event Player, Vector(0, 0, 1), 10, To Player, Cancel Contrary Motion);
  • 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);
  • 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);
  • 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;
  • 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;
  • Distance Between(Eye Position(Event Player), Player Closest To Reticle(Event Player, Team 1)) > 10;
  • Distance Between(Event Player * Vector(1, 5, 1), Event Player.objv * Vector(1, 5, 1)) > 20;
  • }
  • 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;
  • 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(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • 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(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • 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);
  • 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;
  • 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 Players(
  • Team 1), Event Player, True) == Event Player.target;
  • Event Player.target != String("Find");
  • }
  • 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));
  • 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);
  • 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
  • {
  • 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(
  • 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 != False;
  • 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 Players(
  • Team 1), Event Player, True) == Event Player.target;
  • Distance Between(Eye Position(Event Player), Player Closest To Reticle(Event Player, Team 1)) > 5;
  • Y Component Of(Event Player) > Y Component Of(Event Player.target) + -1;
  • }
  • 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;
  • Is In View Angle(Event Player, Player Closest To Reticle(Event Player, 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;
  • 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;
  • Distance Between(Event Player, Event Player.target) > 15;
  • }
  • 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;
  • 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;
  • }
  • 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(6, 12), Abort When False);
  • Communicate(Event Player, Hello);
  • }
  • }
  • 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;
  • 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
  • {
  • 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);
  • 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;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • Distance Between(Event Player.objv, Event Player) < 35;
  • Distance Between(Event Player * Vector(1, 10, 1), Event Player.objv * Vector(1, 10, 1)) > 20;
  • Is In View Angle(Event Player, Event Player.objv, 10) == True;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Jump));
  • Start Facing(Event Player, Vector(0, -1, 0), 900, To Player, Direction and Turn Rate);
  • Wait(0.250, Ignore Condition);
  • 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;
  • 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;
  • Is Using Ability 1(Event Player) == True;
  • Normalized Health(Event Player) < 0.500;
  • Ability Cooldown(Event Player, Button(Ability 1)) == 0;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Disallow Button(Event Player, Button(Ability 1));
  • Wait Until(Normalized Health(Event Player) == 1, 4.250);
  • 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;
  • }
  • 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);
  • }
  • }
  • rule("UnlockHeroes")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Count Of(Filtered Array(Global.allowedHeroes, Is Hero Being Played(Current Array Element, 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);
  • }
  • }
  • 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));
  • Event Player.swapheroLocation = Position Of(Event Player);
  • Start Forcing Player Position(Event Player, Event Player.swapheroLocation, True);
  • Set Player Allowed Heroes(Event Player, Remove From Array(Global.allowedHeroes, Hero Of(Event Player)));
  • Wait(0.016, Ignore Condition);
  • Set Player Allowed Heroes(Event Player, Global.allowedHeroes);
  • Wait Until(Has Spawned(Event Player), 99999);
  • Wait(0.250, Ignore Condition);
  • Stop Forcing Player Position(Event Player);
  • }
  • }
  • rule("Forget Sombra")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Sombra;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(1, Ignore Condition);
  • Filtered Array(All Players(All Teams), Current Array Element.target == Event Player).target = String("Find");
  • }
  • }
  • rule("Forget Tracer")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Tracer;
  • }
  • conditions
  • {
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Filtered Array(All Players(All Teams), Current Array Element.target == Event Player).target = String("Find");
  • }
  • }
  • rule("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;
  • }
  • }
  • 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);
  • }
  • }
  • 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;
  • }
  • 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;
  • 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(Mei), Hero(McCree)), Hero Of(Event Player))
  • == True;
  • Array Contains(Array(Hero(Baptiste), Hero(Zarya), Hero(Orisa), Hero(Sigma), Hero(McCree)), Hero Of(Event Player)) == True;
  • Normalized Health(Event Player) > 0.750;
  • }
  • actions
  • {
  • Wait Until(Normalized Health(Event Player) < Random Real(0.400, 0.600), 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");
  • 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;
  • 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;
  • Is Using Ability 1(Event Player) != True;
  • }
  • 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);
  • 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");
  • 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) * 15, All Players(
  • Team 1), Event Player, True) == Event Player.target;
  • 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;
  • Normalized Health(Event Player) < 0.750;
  • Is Using Ability 1(Event Player) != True;
  • }
  • 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;
  • Normalized Health(Event Player) < 5;
  • }
  • actions
  • {
  • 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;
  • 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)))));
  • 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;
  • }
  • }
  • 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;
  • }
  • 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 > 0;
  • }
  • actions
  • {
  • Wait(30, Abort When False);
  • Big Message(All Players(All Teams), Custom String("{0} will time out in 10 seconds", Event Player));
  • Wait(10, 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("AI - Pick Objective")
  • {
  • event
  • {
  • Subroutine;
  • updateObjective;
  • }
  • actions
  • {
  • disabled Enable Inspector Recording;
  • 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),
  • 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);
  • 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);
  • For Player Variable(Event Player, it, 0, Count Of(Event Player.closestPoints) + 0, 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));
  • 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))));
  • 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("Respawn endless")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.finalRound == True;
  • Number Of Players(Team 2) == Global.maxZombos;
  • Number Of Living Players(Team 2) <= 12;
  • }
  • actions
  • {
  • Wait(Random Real(8, 12), Abort When False);
  • Respawn(Random Value In Array(All Dead Players(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;
  • 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;
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Clear Status(Event Player, Rooted);
  • }
  • }
  • 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(1, 3), Ignore Condition);
  • 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;
  • }
  • 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));
  • 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("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;
  • }
  • }
  • 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;
  • }
  • }
Join the Workshop.codes Discord