Create
Return to post

Comparing difference between and

View raw
  • settings
  • {
  • main
  • {
  • Description: "A tool to visualise the size of many projectile and hitscan abilities. By Mitsiee. https://workshop.codes/EZRCJ"
  • }
  • lobby
  • {
  • Allow Players Who Are In Queue: Yes
  • Max Spectators: 0
  • Max Team 1 Players: 4
  • Max Team 2 Players: 0
  • }
  • modes
  • {
  • Skirmish
  • {
  • enabled maps
  • {
  • Workshop Chamber
  • }
  • }
  • General
  • {
  • Limit Roles: 2 Of Each Role Per Team
  • }
  • }
  • heroes
  • {
  • General
  • {
  • No Ammunition Requirement: On
  • Ultimate Generation: 10%
  • Ultimate Generation - Combat: 0%
  • Ultimate Generation - Passive: 0%
  • Ana
  • {
  • Biotic Grenade Cooldown Time: 10%
  • No Ammunition Requirement: On
  • Sleep Dart Cooldown Time: 10%
  • Ultimate Generation - Combat Nano Boost: 0%
  • Ultimate Generation - Passive Nano Boost: 0%
  • Ultimate Generation Nano Boost: 10%
  • }
  • Ashe
  • {
  • Coach Gun: Off
  • Dynamite: Off
  • No Ammunition Requirement: On
  • Ultimate Generation - Combat B.O.B.: 0%
  • Ultimate Generation - Passive B.O.B.: 0%
  • Ultimate Generation B.O.B.: 10%
  • }
  • Baptiste
  • {
  • Immortality Field: Off
  • No Ammunition Requirement: On
  • Regenerative Burst: Off
  • Secondary Fire: Off
  • Ultimate Generation - Combat Amplification Matrix: 0%
  • Ultimate Generation - Passive Amplification Matrix: 0%
  • Ultimate Generation Amplification Matrix: 10%
  • }
  • Bastion
  • {
  • Configuration: Tank Weapon Knockback Scalar: 0%
  • No Ammunition Requirement: On
  • Self-Repair: Off
  • Spawn With Ultimate Ready: On
  • Ultimate Generation - Combat Configuration: Tank: 500%
  • Ultimate Generation - Passive Configuration: Tank: 500%
  • Ultimate Generation Configuration: Tank: 500%
  • }
  • D.Va
  • {
  • Spawn Without Mech: On
  • }
  • Echo
  • {
  • Focusing Beam: Off
  • No Ammunition Requirement: On
  • Primary Fire: Off
  • Quick Melee: Off
  • Sticky Bombs Cooldown Time: 10%
  • Ultimate Generation - Combat Duplicate: 0%
  • Ultimate Generation - Passive Duplicate: 0%
  • Ultimate Generation Duplicate: 10%
  • }
  • Genji
  • {
  • Deflect: Off
  • No Ammunition Requirement: On
  • Secondary Fire: Off
  • Swift Strike: Off
  • Ultimate Generation - Combat Dragonblade: 0%
  • Ultimate Generation - Passive Dragonblade: 0%
  • Ultimate Generation Dragonblade: 10%
  • }
  • Junkrat
  • {
  • Frag Launcher Knockback Scalar: 0%
  • }
  • Lúcio
  • {
  • Soundwave Knockback Scalar: 0%
  • }
  • McCree
  • {
  • Combat Roll: Off
  • Flashbang: Off
  • No Ammunition Requirement: On
  • Secondary Fire: Off
  • Ultimate Generation - Combat Deadeye: 0%
  • Ultimate Generation - Passive Deadeye: 0%
  • Ultimate Generation Deadeye: 10%
  • }
  • Mei
  • {
  • Cryo-Freeze: Off
  • Ice Wall: Off
  • No Ammunition Requirement: On
  • Ultimate Generation - Combat Blizzard: 0%
  • Ultimate Generation - Passive Blizzard: 0%
  • Ultimate Generation Blizzard: 10%
  • }
  • Mercy
  • {
  • Guardian Angel: Off
  • No Ammunition Requirement: On
  • Resurrect: Off
  • Ultimate Generation - Combat Valkyrie: 0%
  • Ultimate Generation - Passive Valkyrie: 0%
  • Ultimate Generation Valkyrie: 10%
  • Weapons Enabled: Caduceus Blaster Only
  • }
  • Orisa
  • {
  • Fortify: Off
  • Halt!: Off
  • No Ammunition Requirement: On
  • Protective Barrier: Off
  • Ultimate Generation - Combat Supercharger: 0%
  • Ultimate Generation - Passive Supercharger: 0%
  • Ultimate Generation Supercharger: 10%
  • }
  • Pharah
  • {
  • Concussive Blast Cooldown Time: 10%
  • Rocket Launcher Knockback Scalar: 0%
  • }
  • Reinhardt
  • {
  • Fire Strike Cooldown Time: 10%
  • Rocket Hammer Knockback Scalar: 0%
  • }
  • Sigma
  • {
  • Accretion: Off
  • Experimental Barrier: Off
  • Kinetic Grasp: Off
  • Ultimate Ability Gravitic Flux: Off
  • }
  • Soldier: 76
  • {
  • Biotic Field: Off
  • Helix Rockets Cooldown Time: 10%
  • Helix Rockets Knockback Scalar: 0%
  • No Ammunition Requirement: On
  • Sprint: Off
  • Ultimate Generation - Combat Tactical Visor: 0%
  • Ultimate Generation - Passive Tactical Visor: 0%
  • Ultimate Generation Tactical Visor: 10%
  • }
  • Widowmaker
  • {
  • Grappling Hook: Off
  • No Ammunition Requirement: On
  • Quick Melee: Off
  • Ultimate Generation - Combat Infra-Sight: 0%
  • Ultimate Generation - Passive Infra-Sight: 0%
  • Ultimate Generation Infra-Sight: 10%
  • Venom Mine: Off
  • }
  • Wrecking Ball
  • {
  • Adaptive Shield: Off
  • Grappling Claw: Off
  • No Ammunition Requirement: On
  • Piledriver: Off
  • Roll: Off
  • Ultimate Generation - Combat Minefield: 0%
  • Ultimate Generation - Passive Minefield: 0%
  • Ultimate Generation Minefield: 10%
  • }
  • Zarya
  • {
  • Particle Cannon Secondary Knockback Scalar: 0%
  • }
  • Zenyatta
  • {
  • No Ammunition Requirement: On
  • Orb of Discord: Off
  • Orb of Harmony: Off
  • Secondary Fire: Off
  • Ultimate Generation - Combat Transcendence: 0%
  • Ultimate Generation - Passive Transcendence: 0%
  • Ultimate Generation Transcendence: 10%
  • }
  • disabled heroes
  • {
  • Brigitte
  • Doomfist
  • Moira
  • Reaper
  • Roadhog
  • Sombra
  • Symmetra
  • Tracer
  • Winston
  • }
  • }
  • }
  • }
  • variables
  • {
  • global:
  • 0: ProjectileHeroes
  • 1: EffectColorIndex
  • 2: EffectColorArray
  • 3: EffectColor
  • 4: MaxEffectsPerPlayer
  • 5: BotSpawnPositions
  • 6: BotArray
  • 7: HUDIsVisible
  • 8: SlowmotionActive
  • player:
  • 0: RaycastPrimaryFire
  • 1: ShootLoop
  • 2: CurrentCheckPosition
  • 3: RaycastDistance
  • 4: IsProjectileHero
  • 5: ProjectileSpeed
  • 6: ProjectileDelay
  • 7: ProjectileSize
  • 8: FacingDirection
  • 9: EyePositionWhenFired
  • 11: ProjectileTimeBetweenShots
  • 12: ProjectileRadiusPlayerHit
  • 13: ProjectileRadiusArray
  • 14: ProjectileRadiusArrayLoop
  • 15: ExplosionRadius
  • 16: CurrentEffectLoop
  • 17: ProjectileIsMoving
  • 18: NoDamageDealt
  • 19: ProjectilePathEffects
  • 20: ShowBeamEffects
  • 22: ProjectileMaxRange
  • 23: EffectsArray
  • }
  • subroutines
  • {
  • 0: ProjectileRadiusCheck
  • 1: TrackProjectileEffect
  • 2: ClearProjectileEffects
  • 3: ClearBeamEffects
  • 4: FiringWeapon
  • 5: CreateDummyBots
  • 6: CancelPrimary
  • 7: CreateEffect
  • }
  • disabled rule("--- HUD")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Current hero info HUD")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • actions
  • {
  • "HUD that holds server stats"
  • Create HUD Text(Event Player, Null, Custom String("Load: {0} | Average: {1} | Peak: {2}\n", Server Load, Server Load Average,
  • Server Load Peak), Null, Left, -3, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
  • "HUD that holds some hero projectile stats"
  • Create HUD Text(Event Player, Hero Icon String(Hero Of(Event Player)), Custom String(
  • "Projectile radius: {0}m | Projectile speed: {1}m/s", Event Player.ProjectileSize, Event Player.ProjectileSpeed),
  • Custom String("Explosion radius: {0}m | Projectile delay: {1}s", Event Player.ExplosionRadius, Event Player.ProjectileDelay),
  • Left, -2, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
  • }
  • }
  • rule("Controls HUD")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "Controls to toggle projectile path"
  • Create HUD Text(All Players(All Teams), Null, Custom String("{0} Controls with [Ultimate] + [Interact]\n",
  • Global.HUDIsVisible ? Custom String("Hide") : Custom String("Show")), Null, Right, -1, Color(White), Color(Turquoise), Color(
  • White), Visible To and String, Default Visibility);
  • "Controls to remove all effects"
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.HUDIsVisible), Null, Custom String(
  • "Remove all your effects with [Ability 1] + [Interact]"), Null, Right, 2, Color(White), Color(Sky Blue), Color(White),
  • Visible To and String, Default Visibility);
  • "Controls to change hero"
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.HUDIsVisible), Null, Custom String(
  • "Change hero with [Crouch] + [Reload] + [Jump]"), Null, Right, 3, Color(White), Color(Sky Blue), Color(White),
  • Visible To and String, Default Visibility);
  • "Controls to spawn dummy bot"
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.HUDIsVisible), Null, Custom String(
  • "Spawn a random dummy bot with [Crouch] + [Interact]"), Null, Right, 4, Color(White), Color(Sky Blue), Color(White),
  • Visible To and String, Default Visibility);
  • "Controls to toggle if player deals damage"
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.HUDIsVisible), Null, Custom String(
  • "Toggle damage dealt with [Crouch] + [Ultimate]"), Null, Right, 5, Color(White), Color(Sky Blue), Color(White),
  • Visible To and String, Default Visibility);
  • "Controls to toggle projectile path"
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.HUDIsVisible), Null, Custom String(
  • "Toggle path of latest projectile with [Ability 1] + [Ability 2]"), Null, Right, 6, Color(White), Color(Sky Blue), Color(
  • White), Visible To and String, Default Visibility);
  • "Controls to toggle slow motion"
  • Create HUD Text(Filtered Array(All Players(All Teams), Global.HUDIsVisible), Null, Custom String(
  • "Toggle slow motion [Reload] + [Interact]"), Null, Right, 7, Color(White), Color(Sky Blue), Color(White),
  • Visible To and String, Default Visibility);
  • }
  • }
  • rule("Per hero info HUD")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Create HUD Text(All Players(All Teams), Null, Custom String(" "), Null, Left, 1, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • "Lucio"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Lúcio)), Null, Custom String(
  • "Only one projectile is fired."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(White),
  • Visible To and String, Default Visibility);
  • "Genji"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Genji)), Null, Custom String(
  • "Only one projectile is fired.\nSecondary fire is disabled but projectile width is the same."), Null, Left, 2, Color(White),
  • Custom Color(250, 190, 190, 255), Color(White), Visible To and String, Default Visibility);
  • "Reinhardt"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Reinhardt)), Null, Custom String(
  • "Only Firestrike is simulated."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(White),
  • Visible To and String, Default Visibility);
  • "Junkrat"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Junkrat)), Null, Custom String(
  • "Gravity is disabled.\nBounces are not accounted for."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(
  • White), Visible To and String, Default Visibility);
  • "Hanzo"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Hanzo)), Null, Custom String(
  • "Gravity is disabled.\nAll projectiles have the same width."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255),
  • Color(White), Visible To and String, Default Visibility);
  • "Soldier"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Soldier: 76)), Null, Custom String(
  • "Fire rate is slowed down."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(White),
  • Visible To and String, Default Visibility);
  • "Pharah"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Pharah)), Null, Custom String(
  • "Firing while flying will result in incorrect measurements.\nConcussive blast and Primary fire have vastly different values."),
  • Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(White), Visible To and String, Default Visibility);
  • "Echo"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Echo)), Null, Custom String(
  • "Only Sticky Bombs is represented.\nOnly 1 Sticky Bomb is fired at a time."), Null, Left, 2, Color(White), Custom Color(250,
  • 190, 190, 255), Color(White), Visible To and String, Default Visibility);
  • "Torbjorn"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Torbjörn)), Null, Custom String(
  • "Primary fire is inaccurate. Gravity is disabled."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(
  • White), Visible To and String, Default Visibility);
  • "Sigma"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Sigma)), Null, Custom String(
  • "Primary fire does not account for bounces.\nOnly one orb is fired at a time."), Null, Left, 2, Color(White), Custom Color(250,
  • 190, 190, 255), Color(White), Visible To and String, Default Visibility);
  • "Ana"
  • Create HUD Text(Filtered Array(All Players(All Teams), Hero Of(Current Array Element) == Hero(Ana)), Null, Custom String(
  • "Scoped shots are buggy. Grenade has no gravity."), Null, Left, 2, Color(White), Custom Color(250, 190, 190, 255), Color(
  • White), Visible To and String, Default Visibility);
  • }
  • }
  • disabled rule("--- Initialise")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise settings")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "Let users choose the max number of effects that can be present at one time."
  • Global.EffectColorIndex = Workshop Setting Combo(Custom String("Config"), Custom String("Projectile effect color"), 0, Array(
  • Custom String("Sky Blue"), Custom String("White"), Custom String("Green"), Custom String("Orange"), Custom String("Black"),
  • Custom String("Purple")), 0);
  • "Create array of colors that will be used to pick a color through Workshop Settings"
  • Global.EffectColorArray = Array(Color(Sky Blue), Color(White), Color(Green), Color(Orange), Color(Black), Color(Purple));
  • "Set the effect color of projectile effects to the chosen color."
  • Global.EffectColor = Global.EffectColorArray[Global.EffectColorIndex];
  • "Change the maximum number of effects allowed to be present at one time."
  • Global.MaxEffectsPerPlayer = Workshop Setting Integer(Custom String("Config"), Custom String("Max projectile effects per player "),
  • 10, 1, 30, 1000);
  • "Positions where bots will be spawned"
  • Global.BotSpawnPositions = Array(Vector(-8, 0, 0), Vector(-8, 0, 8), Vector(-8, 0, -8));
  • "Set Controls HUD to be visible by default"
  • Global.HUDIsVisible = True;
  • }
  • }
  • rule("Initialise player")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Has Spawned(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.ProjectileIsMoving = True;
  • Set Projectile Gravity(Event Player, 0);
  • }
  • }
  • rule("Create Projectile Heroes array")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "All projectile heroes that are currently available"
  • Global.ProjectileHeroes = Array(Hero(Ana), Hero(Echo), Hero(Genji), Hero(Mei), Hero(Mercy), Hero(Orisa), Hero(Zenyatta), Hero(
  • Pharah), Hero(Reinhardt), Hero(D.Va), Hero(Junkrat), Hero(Torbjörn), Hero(Hanzo), Hero(Zarya), Hero(Lúcio), Hero(Sigma));
  • }
  • }
  • rule("Is Projectile Hero? Set projectile settings")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Global.ProjectileHeroes, Hero Of(Event Player)) == True;
  • }
  • actions
  • {
  • Event Player.IsProjectileHero = True;
  • "Set default values"
  • Event Player.ProjectileDelay = 0;
  • Event Player.ExplosionRadius = 0;
  • Event Player.ProjectileTimeBetweenShots = 0;
  • Event Player.ProjectileMaxRange = 0;
  • "Set values per hero"
  • If(Hero Of(Event Player) == Hero(Echo));
  • Event Player.ProjectileSpeed = 50;
  • Event Player.ProjectileSize = 0.150;
  • Event Player.ExplosionRadius = 2.100;
  • Else If(Hero Of(Event Player) == Hero(Mei));
  • Event Player.ProjectileSpeed = 115;
  • Event Player.ProjectileDelay = 0.400;
  • Event Player.ProjectileSize = 0.150;
  • Else If(Hero Of(Event Player) == Hero(Ana));
  • Event Player.ProjectileSpeed = 125;
  • Event Player.ProjectileSize = 0;
  • Else If(Hero Of(Event Player) == Hero(Genji));
  • Event Player.ProjectileSpeed = 60;
  • Event Player.ProjectileSize = 0.100;
  • Else If(Hero Of(Event Player) == Hero(Orisa));
  • Event Player.ProjectileSpeed = 90;
  • Event Player.ProjectileSize = 0.100;
  • Event Player.ProjectileTimeBetweenShots = 1 / 12;
  • Else If(Hero Of(Event Player) == Hero(Mercy));
  • Event Player.ProjectileSpeed = 50;
  • Event Player.ProjectileSize = 0.250;
  • Event Player.ProjectileTimeBetweenShots = 1 / 5;
  • Else If(Hero Of(Event Player) == Hero(Zenyatta));
  • Event Player.ProjectileSpeed = 90;
  • Event Player.ProjectileSize = 0.150;
  • Else If(Hero Of(Event Player) == Hero(Pharah));
  • Event Player.ProjectileSpeed = 35;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ExplosionRadius = 2.500;
  • Else If(Hero Of(Event Player) == Hero(Reinhardt));
  • Event Player.ProjectileSpeed = 25;
  • Event Player.ProjectileDelay = 0.480;
  • Event Player.ProjectileSize = 0.850;
  • Else If(Hero Of(Event Player) == Hero(D.Va));
  • Event Player.ProjectileSpeed = 50;
  • Event Player.ProjectileSize = 0.250;
  • Else If(Hero Of(Event Player) == Hero(Junkrat));
  • Event Player.ProjectileSpeed = 25;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ExplosionRadius = 2;
  • Else If(Hero Of(Event Player) == Hero(Torbjörn));
  • Event Player.ProjectileSpeed = 70;
  • Event Player.ProjectileSize = 0.100;
  • Else If(Hero Of(Event Player) == Hero(Hanzo));
  • Event Player.ProjectileSpeed = 110;
  • Event Player.ProjectileSize = 0.100;
  • Else If(Hero Of(Event Player) == Hero(Zarya));
  • Event Player.ProjectileSpeed = 25;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ExplosionRadius = 2.500;
  • Else If(Hero Of(Event Player) == Hero(Lúcio));
  • Event Player.ProjectileSpeed = 50;
  • Event Player.ProjectileSize = 0.150;
  • Else If(Hero Of(Event Player) == Hero(Sigma));
  • Event Player.ProjectileSpeed = 50;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ExplosionRadius = 3;
  • Event Player.ProjectileMaxRange = 22;
  • End;
  • }
  • }
  • rule("Is not projectile hero?")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Global.ProjectileHeroes, Hero Of(Event Player)) != True;
  • }
  • actions
  • {
  • Event Player.IsProjectileHero = False;
  • Event Player.ProjectileSize = 0;
  • Event Player.ProjectileDelay = 0;
  • Event Player.ProjectileSpeed = 0;
  • Event Player.ExplosionRadius = 0;
  • }
  • }
  • disabled rule("--- Dummy Bots")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Spawn initial bots")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Is Game In Progress == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Call Subroutine(CreateDummyBots);
  • "Create an effect on the position where player can shuffle bots"
  • Create Effect(All Players(All Teams), Ring, Color(Purple), Vector(12, 0, 12), 1.500, Visible To Position and Radius);
  • Create In-World Text(All Players(All Teams), Custom String("Crouch here to shuffle bots"), Vector(12, 1, 12), 1,
  • Clip Against Surfaces, Visible To Position and String, Color(White), Default Visibility);
  • }
  • }
  • rule("Re-shuffle dummy bots")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Crouch)) == True;
  • Distance Between(Vector(12, 0, 12), Position Of(Event Player)) < 2;
  • }
  • actions
  • {
  • Destroy All Dummy Bots;
  • Wait(1, Ignore Condition);
  • Call Subroutine(CreateDummyBots);
  • "Extra wait at the end to prevent spamming"
  • Wait(1, Ignore Condition);
  • }
  • }
  • rule("Subroutine [CreateDummyBots] - Create 3 dummy bots at specified location")
  • {
  • event
  • {
  • Subroutine;
  • CreateDummyBots;
  • }
  • actions
  • {
  • "Spawn 3 bots, facing towards the middle of the room. Save their ID in an array."
  • Create Dummy Bot(Random Value In Array(All Heroes), Team 2, -1, Global.BotSpawnPositions[0], Direction Towards(
  • Global.BotSpawnPositions[0], Vector(0, 1.500, 0)));
  • Global.BotArray[0] = Last Created Entity;
  • Create Dummy Bot(Random Value In Array(All Heroes), Team 2, -1, Global.BotSpawnPositions[1], Direction Towards(
  • Global.BotSpawnPositions[1], Vector(0, 1.500, 0)));
  • Global.BotArray[1] = Last Created Entity;
  • Create Dummy Bot(Random Value In Array(All Heroes), Team 2, -1, Global.BotSpawnPositions[2], Direction Towards(
  • Global.BotSpawnPositions[2], Vector(0, 1.500, 0)));
  • Global.BotArray[2] = Last Created Entity;
  • }
  • }
  • rule("Spawn bots at player with Crouch + Interact")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Crouch)) == True;
  • Is Button Held(Event Player, Button(Interact)) == True;
  • }
  • actions
  • {
  • "Spawn random dummy bot in front of the player, facing away from the player"
  • Create Dummy Bot(Random Value In Array(All Heroes), Opposite Team Of(Team Of(Event Player)), -1,
  • Event Player + Facing Direction Of(Event Player) * 0.500, Facing Direction Of(Event Player));
  • }
  • }
  • rule("Freeze and root bots")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • "Wait a little, just in case"
  • Wait(1.500, Ignore Condition);
  • Set Status(Event Player, Null, Frozen, 9999);
  • Set Status(Event Player, Null, Rooted, 9999);
  • }
  • }
  • rule("Resurrect Dummy Bot when they die")
  • {
  • event
  • {
  • Player Died;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Wait(1, Ignore Condition);
  • Resurrect(Event Player);
  • }
  • }
  • disabled rule("--- Special case value adjustments")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Ana in scope")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Ana);
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • "Projectile speed per second"
  • Event Player.ProjectileSpeed = 0;
  • Event Player.ProjectileSize = 0;
  • Event Player.ProjectileDelay = 0;
  • Event Player.ExplosionRadius = 0;
  • }
  • }
  • rule("Ana not in scope")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Ana);
  • Is Firing Secondary(Event Player) != True;
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • "Projectile speed per second"
  • Event Player.ProjectileSpeed = 125;
  • Event Player.ProjectileDelay = 0;
  • Event Player.ProjectileSize = 0;
  • Event Player.ExplosionRadius = 0;
  • }
  • }
  • rule("Ana sleepdart")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Ana);
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • "Projectile speed per second"
  • Event Player.ProjectileSpeed = 60;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ProjectileDelay = 0.300;
  • Event Player.ExplosionRadius = 0;
  • }
  • }
  • rule("Ana grenade")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Ana);
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • "Projectile speed per second"
  • Event Player.ProjectileSpeed = 30;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ProjectileDelay = 0;
  • Event Player.ExplosionRadius = 4;
  • }
  • }
  • rule("Bastion in ultimate")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Bastion);
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.IsProjectileHero = True;
  • Event Player.ProjectileSize = 0.300;
  • Event Player.ProjectileDelay = 0;
  • Event Player.ProjectileSpeed = 60;
  • Event Player.ExplosionRadius = 4;
  • Call Subroutine(ClearProjectileEffects);
  • }
  • }
  • rule("Bastion not in ultimate")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Bastion);
  • Is Using Ultimate(Event Player) != True;
  • }
  • actions
  • {
  • Event Player.IsProjectileHero = False;
  • Event Player.ProjectileSize = 0;
  • Event Player.ProjectileDelay = 0;
  • Event Player.ProjectileSpeed = 0;
  • Event Player.ExplosionRadius = 0;
  • Call Subroutine(ClearProjectileEffects);
  • Set Ultimate Charge(Event Player, 100);
  • }
  • }
  • rule("Soldier Helix Rocket")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Soldier: 76);
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.IsProjectileHero = True;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ProjectileSpeed = 50;
  • Event Player.ExplosionRadius = 3;
  • Call Subroutine(ClearProjectileEffects);
  • }
  • }
  • rule("Soldier Firing primary")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Soldier: 76);
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.IsProjectileHero = False;
  • Event Player.ProjectileSize = 0;
  • Event Player.ProjectileSpeed = 0;
  • Event Player.ExplosionRadius = 0;
  • }
  • }
  • rule("Pharah firing Concussive Blast")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Pharah);
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.ProjectileSize = 0;
  • Event Player.ProjectileSpeed = 60;
  • Event Player.ExplosionRadius = 8;
  • }
  • }
  • rule("Pharah Firing primary")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Pharah);
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.ProjectileSpeed = 35;
  • Event Player.ProjectileSize = 0.200;
  • Event Player.ExplosionRadius = 2.500;
  • }
  • }
  • disabled rule("--- Shooting")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Create Effects")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) != True;
  • }
  • actions
  • {
  • Event Player.EffectsArray = Empty Array;
  • "Projectile effect"
  • Create Effect(All Players(All Teams), Sphere, Global.EffectColor,
  • Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop] == 0 ? Vector(0, -1000, 0)
  • : Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop], Max(Event Player.ProjectileSize, 0.025),
  • Visible To Position and Radius);
  • "Explosion Radius Effect"
  • Create Effect(Filtered Array(All Players(All Teams), Event Player.ProjectileIsMoving == False && Event Player.ExplosionRadius > 0),
  • Sphere, Color(Red), Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop], Event Player.ExplosionRadius,
  • Visible To Position and Radius);
  • }
  • }
  • rule("Using Primary Fire on most heroes")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) != Hero(Mei);
  • Hero Of(Event Player) != Hero(Hanzo);
  • Hero Of(Event Player) != Hero(Reinhardt);
  • Hero Of(Event Player) != Hero(Zarya);
  • Hero Of(Event Player) != Hero(Echo);
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • "Cancel primary action in case of multi shot abilities (lucio, genji, baptiste primary fire for example)"
  • Cancel Primary Action(Event Player);
  • Start Rule(FiringWeapon, Do Nothing);
  • }
  • }
  • rule("Using Secondary fire with some heroes")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Array(Hero(Mei), Hero(Zarya), Hero(Soldier: 76), Hero(Echo)), Hero Of(Event Player)) == True;
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • "Cancel primary action for echo sticky bombs to send out only 1 bomb"
  • If(Hero Of(Event Player) == Hero(Echo));
  • Start Rule(CancelPrimary, Restart Rule);
  • End;
  • Start Rule(FiringWeapon, Do Nothing);
  • }
  • }
  • rule("Firing with Hanzo")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Hanzo);
  • Is Button Held(Event Player, Button(Primary Fire)) != True;
  • }
  • actions
  • {
  • Start Rule(FiringWeapon, Do Nothing);
  • }
  • }
  • rule("Ability 1 with some heroes")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Array(Hero(Ana)), Hero Of(Event Player)) == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Start Rule(FiringWeapon, Do Nothing);
  • }
  • }
  • rule("Ability 2 with some heroes")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Array Contains(Array(Hero(Reinhardt), Hero(Pharah), Hero(Ana)), Hero Of(Event Player)) == True;
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Start Rule(FiringWeapon, Do Nothing);
  • }
  • }
  • rule("Ultimate as Bastion")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Bastion);
  • Is In Alternate Form(Event Player) == True;
  • Is Button Held(Event Player, Button(Primary Fire)) == True;
  • }
  • actions
  • {
  • Start Rule(FiringWeapon, Do Nothing);
  • }
  • }
  • rule("Subroutine [Firing weapon]")
  • {
  • event
  • {
  • Subroutine;
  • FiringWeapon;
  • }
  • actions
  • {
  • Set Primary Fire Enabled(Event Player, False);
  • "Loop used to show multiple projectile effects at the same time"
  • Event Player.CurrentEffectLoop = Event Player.CurrentEffectLoop >= Global.MaxEffectsPerPlayer - 1 ? 0 : Event Player.CurrentEffectLoop + 1;
  • "Set facing direction where player fired"
  • Event Player.FacingDirection[Event Player.CurrentEffectLoop] = Facing Direction Of(Event Player);
  • "Wait with firing projectile effect and recalculate facing direction if projectile is fired with a delay (Mei secondary fire / Rein Firestrike)"
  • If(Event Player.ProjectileDelay > 0);
  • Wait(Event Player.ProjectileDelay, Ignore Condition);
  • "Re-set facing direction where player fired"
  • Event Player.FacingDirection[Event Player.CurrentEffectLoop] = Facing Direction Of(Event Player);
  • End;
  • "Set eye position where player fired "
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop] = Eye Position(Event Player);
  • "Ray cast from where the player fired to as far away as possible or to max projectile distance"
  • Event Player.RaycastPrimaryFire[Event Player.CurrentEffectLoop] = Ray Cast Hit Position(
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop],
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop] + Event Player.FacingDirection[Event Player.CurrentEffectLoop] * (
  • Event Player.ProjectileMaxRange > 0 ? Event Player.ProjectileMaxRange : 200), All Players(Opposite Team Of(Team Of(
  • Event Player))), Event Player, True);
  • "Get distance from eye position to end to ray cast"
  • Event Player.RaycastDistance[Event Player.CurrentEffectLoop] = Distance Between(
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop],
  • Event Player.RaycastPrimaryFire[Event Player.CurrentEffectLoop]);
  • "If Projectile has radius, send several raycasts to check if any players would get hit. If true, stop the effect"
  • Call Subroutine(ProjectileRadiusCheck);
  • If(Event Player.IsProjectileHero);
  • Event Player.ProjectileIsMoving = True;
  • "Track the projectile effect through the air"
  • Call Subroutine(TrackProjectileEffect);
  • Event Player.ProjectileIsMoving = False;
  • End;
  • "Set the final position of the effect to the nearest ray cast used to determine if the projectile hit a player or object"
  • Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop] = Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop] + Event Player.FacingDirection[Event Player.CurrentEffectLoop] * Event Player.RaycastDistance[Event Player.CurrentEffectLoop];
  • "Set effect at projectile position"
  • Call Subroutine(CreateEffect);
  • "Re-enable primary fire"
  • Set Primary Fire Enabled(Event Player, True);
  • }
  • }
  • rule("Subroutine [TrackProjectileEffect]")
  • {
  • event
  • {
  • Subroutine;
  • TrackProjectileEffect;
  • }
  • actions
  • {
  • Event Player.ShootLoop[Event Player.CurrentEffectLoop] = 0;
  • "Loop from player position to wall"
  • While(Event Player.RaycastDistance[Event Player.CurrentEffectLoop] > Event Player.ShootLoop[Event Player.CurrentEffectLoop]);
  • "Set current position in loop"
  • Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop] = Ray Cast Hit Position(
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop],
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop] + Event Player.FacingDirection[Event Player.CurrentEffectLoop] * Event Player.ShootLoop[Event Player.CurrentEffectLoop],
  • Null, Null, True);
  • Wait(0.016, Ignore Condition);
  • "Set the effect to the position it traveled in 1 frame (62.5 frames per second)"
  • Event Player.ShootLoop[Event Player.CurrentEffectLoop] = Event Player.ShootLoop[Event Player.CurrentEffectLoop] + Event Player.ProjectileSpeed / 62.500;
  • End;
  • }
  • }
  • rule("Subroutine [CancelPrimary] - Cancel primary on a small delay")
  • {
  • event
  • {
  • Subroutine;
  • CancelPrimary;
  • }
  • actions
  • {
  • Wait(0.050, Ignore Condition);
  • Cancel Primary Action(Event Player);
  • }
  • }
  • rule("Subroutine [ProjectileRadiusCheck] - Check if radius of projectile would hit player")
  • {
  • event
  • {
  • Subroutine;
  • ProjectileRadiusCheck;
  • }
  • actions
  • {
  • "If ShowBeamEffects is true destroy all previously created beam effects by this subroutine"
  • If(Event Player.ShowBeamEffects == True);
  • Call Subroutine(ClearBeamEffects);
  • End;
  • If(Event Player.ProjectileSize > 0);
  • "DO NOT OPEN ME, THE GAME WILL CRASH"
  • Event Player.ProjectileRadiusArray = Array(Vector(0, 0, 0) + Forward * Event Player.ProjectileSize,
  • Left * Event Player.ProjectileSize, Right * Event Player.ProjectileSize, Up * Event Player.ProjectileSize,
  • Down * Event Player.ProjectileSize, Left * Event Player.ProjectileSize * 0.702 + Up * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.702 + Down * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.702 + Up * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.702 + Down * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.924 + Up * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.924 + Down * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.924 + Up * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.924 + Down * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.386 + Up * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.386 + Down * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.386 + Up * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.386 + Down * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.500 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 + Forward * Event Player.ProjectileSize * 0.702,
  • Up * Event Player.ProjectileSize * 0.500 + Forward * Event Player.ProjectileSize * 0.702,
  • Down * Event Player.ProjectileSize * 0.500 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.500 * 0.702 + Up * Event Player.ProjectileSize * 0.500 * 0.702 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.500 * 0.702 + Down * Event Player.ProjectileSize * 0.500 * 0.702 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 * 0.702 + Up * Event Player.ProjectileSize * 0.500 * 0.702 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 * 0.702 + Down * Event Player.ProjectileSize * 0.500 * 0.702 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.500 * 0.924 + Up * Event Player.ProjectileSize * 0.500 * 0.386 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.500 * 0.924 + Down * Event Player.ProjectileSize * 0.500 * 0.386 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 * 0.924 + Up * Event Player.ProjectileSize * 0.500 * 0.386 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 * 0.924 + Down * Event Player.ProjectileSize * 0.500 * 0.386 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.500 * 0.386 + Up * Event Player.ProjectileSize * 0.500 * 0.924 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.500 * 0.386 + Down * Event Player.ProjectileSize * 0.500 * 0.924 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 * 0.386 + Up * Event Player.ProjectileSize * 0.500 * 0.924 + Forward * Event Player.ProjectileSize * 0.702,
  • Right * Event Player.ProjectileSize * 0.500 * 0.386 + Down * Event Player.ProjectileSize * 0.500 * 0.924 + Forward * Event Player.ProjectileSize * 0.702,
  • Left * Event Player.ProjectileSize * 0.750 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 + Forward * Event Player.ProjectileSize * 0.386,
  • Up * Event Player.ProjectileSize * 0.750 + Forward * Event Player.ProjectileSize * 0.386,
  • Down * Event Player.ProjectileSize * 0.750 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.750 * 0.702 + Up * Event Player.ProjectileSize * 0.750 * 0.702 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.750 * 0.702 + Down * Event Player.ProjectileSize * 0.750 * 0.702 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 * 0.702 + Up * Event Player.ProjectileSize * 0.750 * 0.702 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 * 0.702 + Down * Event Player.ProjectileSize * 0.750 * 0.702 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.750 * 0.924 + Up * Event Player.ProjectileSize * 0.750 * 0.386 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.750 * 0.924 + Down * Event Player.ProjectileSize * 0.750 * 0.386 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 * 0.924 + Up * Event Player.ProjectileSize * 0.750 * 0.386 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 * 0.924 + Down * Event Player.ProjectileSize * 0.750 * 0.386 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.750 * 0.386 + Up * Event Player.ProjectileSize * 0.750 * 0.924 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.750 * 0.386 + Down * Event Player.ProjectileSize * 0.750 * 0.924 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 * 0.386 + Up * Event Player.ProjectileSize * 0.750 * 0.924 + Forward * Event Player.ProjectileSize * 0.386,
  • Right * Event Player.ProjectileSize * 0.750 * 0.386 + Down * Event Player.ProjectileSize * 0.750 * 0.924 + Forward * Event Player.ProjectileSize * 0.386,
  • Left * Event Player.ProjectileSize * 0.250 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 + Forward * Event Player.ProjectileSize * 0.924,
  • Up * Event Player.ProjectileSize * 0.250 + Forward * Event Player.ProjectileSize * 0.924,
  • Down * Event Player.ProjectileSize * 0.250 + Forward * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.250 * 0.702 + Up * Event Player.ProjectileSize * 0.250 * 0.702 + Forward * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.250 * 0.702 + Down * Event Player.ProjectileSize * 0.250 * 0.702 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 * 0.702 + Up * Event Player.ProjectileSize * 0.250 * 0.702 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 * 0.702 + Down * Event Player.ProjectileSize * 0.250 * 0.702 + Forward * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.250 * 0.924 + Up * Event Player.ProjectileSize * 0.250 * 0.386 + Forward * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.250 * 0.924 + Down * Event Player.ProjectileSize * 0.250 * 0.386 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 * 0.924 + Up * Event Player.ProjectileSize * 0.250 * 0.386 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 * 0.924 + Down * Event Player.ProjectileSize * 0.250 * 0.386 + Forward * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.250 * 0.386 + Up * Event Player.ProjectileSize * 0.250 * 0.924 + Forward * Event Player.ProjectileSize * 0.924,
  • Left * Event Player.ProjectileSize * 0.250 * 0.386 + Down * Event Player.ProjectileSize * 0.250 * 0.924 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 * 0.386 + Up * Event Player.ProjectileSize * 0.250 * 0.924 + Forward * Event Player.ProjectileSize * 0.924,
  • Right * Event Player.ProjectileSize * 0.250 * 0.386 + Down * Event Player.ProjectileSize * 0.250 * 0.924 + Forward * Event Player.ProjectileSize * 0.924);
  • Else;
  • Event Player.ProjectileRadiusArray = Array(Vector(0, 0, 0));
  • End;
  • "Loop through a series of circle positions to see if projectile hits on any of it's sides"
  • For Player Variable(Event Player, ProjectileRadiusArrayLoop, 0, Count Of(Event Player.ProjectileRadiusArray), 1);
  • "The the position relative to the player"
  • Event Player.ProjectileRadiusPlayerHit = Vector(0, Y Component Of(
  • Event Player.EyePositionWhenFired[Event Player.CurrentEffectLoop]), 0) + World Vector Of(
  • Event Player.ProjectileRadiusArray[Event Player.ProjectileRadiusArrayLoop], Event Player, Rotation And Translation);
  • "Show a ton of beams to indicate the path of the projectile"
  • If(Event Player.ShowBeamEffects == True);
  • Create Beam Effect(All Players(All Teams), Grapple Beam, Event Player.ProjectileRadiusPlayerHit,
  • Event Player.ProjectileRadiusPlayerHit + Event Player.FacingDirection[Event Player.CurrentEffectLoop] * 100, Color(White),
  • None);
  • Event Player.ProjectilePathEffects = Append To Array(Event Player.ProjectilePathEffects, Last Created Entity);
  • End;
  • "Get distance using ray cast to see if it hits a player, or any other world object"
  • Event Player.ProjectileRadiusArray[Event Player.ProjectileRadiusArrayLoop] = Distance Between(
  • Event Player.ProjectileRadiusPlayerHit, Ray Cast Hit Position(Event Player.ProjectileRadiusPlayerHit,
  • Event Player.ProjectileRadiusPlayerHit + Event Player.FacingDirection[Event Player.CurrentEffectLoop] * (
  • Event Player.ProjectileMaxRange > 0 ? Event Player.ProjectileMaxRange : 100), All Players(Opposite Team Of(Team Of(
  • Event Player))), Event Player, True));
  • End;
  • "Sort array from lowest to higher distance"
  • Event Player.ProjectileRadiusArray = Sorted Array(Event Player.ProjectileRadiusArray, Current Array Element);
  • "Grab the first item from the array, it being the closest to the event player"
  • Event Player.RaycastDistance[Event Player.CurrentEffectLoop] = First Of(Event Player.ProjectileRadiusArray);
  • }
  • }
  • rule("Subroutine [ClearProjectileEffects] - Reset all projectile effects made by the event player")
  • {
  • event
  • {
  • Subroutine;
  • ClearProjectileEffects;
  • }
  • actions
  • {
  • Event Player.CurrentCheckPosition = Empty Array;
  • Event Player.ShootLoop = Empty Array;
  • Event Player.CurrentEffectLoop = 0;
  • Call Subroutine(ClearBeamEffects);
  • "Destroy effects at final position"
  • While(Count Of(Event Player.EffectsArray) > 0);
  • Destroy Effect(Last Of(Event Player.EffectsArray));
  • Event Player.EffectsArray = Remove From Array(Event Player.EffectsArray, Last Of(Event Player.EffectsArray));
  • Wait(0.016, Ignore Condition);
  • End;
  • }
  • }
  • rule("Subroutine [ClearBeamEffects] - Reset all beam effects associated with projectile paths")
  • {
  • event
  • {
  • Subroutine;
  • ClearBeamEffects;
  • }
  • actions
  • {
  • While(Count Of(Event Player.ProjectilePathEffects));
  • Destroy Effect(Last Of(Event Player.ProjectilePathEffects));
  • Event Player.ProjectilePathEffects = Remove From Array(Event Player.ProjectilePathEffects, Last Of(
  • Event Player.ProjectilePathEffects));
  • End;
  • Event Player.ProjectilePathEffects = Empty Array;
  • }
  • }
  • rule("Subroutine [CreateEffect] - Create effect at position")
  • {
  • event
  • {
  • Subroutine;
  • CreateEffect;
  • }
  • actions
  • {
  • "Destroy effect in current array loop (do nothing if it has not yet been created)"
  • Destroy Effect(Event Player.EffectsArray[Event Player.CurrentEffectLoop]);
  • Event Player.EffectsArray[Event Player.CurrentEffectLoop] = 0;
  • "Create effect at final position"
  • Create Effect(All Players(All Teams), Sphere, Global.EffectColor,
  • Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop] == 0 ? Vector(0, -1000, 0)
  • : Event Player.CurrentCheckPosition[Event Player.CurrentEffectLoop], Evaluate Once(Max(Event Player.ProjectileSize, 0.025)),
  • None);
  • "Add effect to array to be destroyed later"
  • Event Player.EffectsArray[Event Player.CurrentEffectLoop] = Last Created Entity;
  • }
  • }
  • disabled rule("--- Swap hero")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("In-world and effect")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "Create an effect on the position where player can change hero"
  • Create Effect(All Players(All Teams), Ring, Color(Green), Vector(12, 0, -12), 1.500, Visible To Position and Radius);
  • Create In-World Text(All Players(All Teams), Custom String("Crouch here to change hero"), Vector(12, 1, -12), 1,
  • Clip Against Surfaces, Visible To Position and String, Color(White), Default Visibility);
  • }
  • }
  • rule("Swap hero by crouching")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Crouch)) == True;
  • Distance Between(Vector(12, 0, -12), Position Of(Event Player)) < 2;
  • }
  • actions
  • {
  • Call Subroutine(ClearProjectileEffects);
  • Set Player Allowed Heroes(Event Player, Remove From Array(All Heroes, Hero Of(Event Player)));
  • Wait(0.250, Ignore Condition);
  • Reset Player Hero Availability(Event Player);
  • }
  • }
  • rule("Swap hero with key combo")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Crouch)) == True;
  • Is Button Held(Event Player, Button(Reload)) == True;
  • Is Button Held(Event Player, Button(Jump)) == True;
  • }
  • actions
  • {
  • Call Subroutine(ClearProjectileEffects);
  • Set Player Allowed Heroes(Event Player, Remove From Array(All Heroes, Hero Of(Event Player)));
  • Wait(0.250, Ignore Condition);
  • Reset Player Hero Availability(Event Player);
  • }
  • }
  • disabled rule("--- Other stuff")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Firing while in the air")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is In Air(Event Player) == True;
  • (Is Firing Primary(Event Player) || Is Firing Secondary(Event Player)) == True;
  • }
  • actions
  • {
  • Small Message(Event Player, Custom String("Firing while in the air messes with the results."));
  • }
  • }
  • rule("Clear current effects")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Ability 1)) == True;
  • Is Button Held(Event Player, Button(Interact)) == True;
  • }
  • actions
  • {
  • Call Subroutine(ClearProjectileEffects);
  • Small Message(Event Player, Custom String("Cleared all projectile effects"));
  • }
  • }
  • rule("Disable damage dealt")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Crouch)) == True;
  • Is Button Held(Event Player, Button(Ultimate)) == True;
  • }
  • actions
  • {
  • If(Event Player.NoDamageDealt == True);
  • Event Player.NoDamageDealt = False;
  • Set Damage Dealt(Event Player, 100);
  • Small Message(Event Player, Custom String("Enabling damage dealt"));
  • Else;
  • Event Player.NoDamageDealt = True;
  • Set Damage Dealt(Event Player, 1);
  • Small Message(Event Player, Custom String("Disabling damage dealt"));
  • End;
  • }
  • }
  • rule("Toggle projectile path")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Ability 1)) == True;
  • Is Button Held(Event Player, Button(Ability 2)) == True;
  • }
  • actions
  • {
  • If(Event Player.ShowBeamEffects == True);
  • Event Player.ShowBeamEffects = False;
  • Small Message(Event Player, Custom String("No longer showing beam effects for latest projectile"));
  • Else;
  • Event Player.ShowBeamEffects = True;
  • Small Message(Event Player, Custom String("Showing beam effects for latest projectile"));
  • End;
  • }
  • }
  • rule("Toggle slow motion")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Interact)) == True;
  • Is Button Held(Event Player, Button(Reload)) == All Living Players(All Teams);
  • }
  • actions
  • {
  • If(Global.SlowmotionActive != True);
  • Global.SlowmotionActive = True;
  • Set Slow Motion(25);
  • Small Message(All Players(All Teams), Custom String("Slow motion enabled"));
  • Else;
  • Global.SlowmotionActive = False;
  • Set Slow Motion(100);
  • Small Message(All Players(All Teams), Custom String("Slow motion disabled"));
  • End;
  • }
  • }
  • rule("Toggle HUD")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Ultimate)) == True;
  • Is Button Held(Event Player, Button(Interact)) == True;
  • }
  • actions
  • {
  • Global.HUDIsVisible = !Global.HUDIsVisible;
  • }
  • }
Join the Workshop.codes Discord