Create
Return to post

Comparing difference between and

View raw
  • settings
  • {
  • main
  • {
  • Description: "☆ Heat Street: TALENTS by LemonAid#11644\n★ [KFVAY] - Fight for survival against an overwhelming force. Your enemies are numerous and hunting you down. Can you survive all waves? The AI is able to play 25 different heroes, some of which have new abilities. PvE game mode suited for 1 to 5 players. \n☆ Version q.3.4.2 from the classic version, featuring a new enemies, abilities, and talents for every hero!\n★ Credits to: Shingen and SgtMoody\n☆ Join our Discord! discord.gg/WJr3gFC"
  • Mode Name: "Heat Street PvE: Talents"
  • }
  • lobby
  • {
  • Map Rotation: After A Game
  • Max Team 1 Players: 5
  • Max Team 2 Players: 0
  • Return To Lobby: Never
  • Use Experimental Update If Available: Yes
  • }
  • modes
  • {
  • Team Deathmatch
  • {
  • enabled maps
  • {
  • Necropolis
  • Château Guillard
  • Eichenwalde
  • Kanezaka
  • }
  • }
  • General
  • {
  • Game Mode Start: Immediately
  • Hero Limit: Off
  • Kill Cam: Off
  • Kill Feed: Off
  • Score To Win: 1
  • Spawn Health Packs: Enabled
  • }
  • }
  • heroes
  • {
  • Team 1
  • {
  • Ultimate Generation: 50%
  • Ultimate Generation - Combat: 90%
  • Baptiste
  • {
  • Ultimate Duration: 125%
  • }
  • Bastion
  • {
  • Damage Dealt: 70%
  • }
  • Brigitte
  • {
  • Damage Dealt: 115%
  • }
  • Doomfist
  • {
  • Ultimate Generation Meteor Strike: 45%
  • }
  • Hanzo
  • {
  • Projectile Gravity: 0%
  • }
  • Mei
  • {
  • Weapon Freeze Rate Scalar: 120%
  • }
  • Mercy
  • {
  • Damage Dealt: 115%
  • Ultimate Generation Valkyrie: 40%
  • }
  • Moira
  • {
  • Biotic Orb Cooldown Time: 125%
  • Biotic Orb Max Damage Scalar: 75%
  • Biotic Orb Max Healing Scalar: 75%
  • Ultimate Generation Coalescence: 40%
  • }
  • Sombra
  • {
  • Hack Cooldown Time: 125%
  • }
  • Wrecking Ball
  • {
  • Ultimate Generation Minefield: 50%
  • }
  • Widowmaker
  • {
  • Ultimate Duration: 120%
  • }
  • Winston
  • {
  • Damage Dealt: 110%
  • }
  • Zarya
  • {
  • Damage Dealt: 85%
  • Ultimate Generation Graviton Surge: 40%
  • }
  • }
  • Team 2
  • {
  • Ammunition Clip Size Scalar: 200%
  • Ana
  • {
  • Biotic Grenade Cooldown Time: 10%
  • Damage Dealt: 60%
  • Healing Dealt: 150%
  • Health: 150%
  • Sleep Dart Cooldown Time: 10%
  • }
  • Baptiste
  • {
  • Damage Dealt: 46%
  • Healing Dealt: 10%
  • Immortality Field Cooldown Time: 10%
  • Projectile Gravity: 500%
  • Projectile Speed: 0%
  • Regenerative Burst Cooldown Time: 10%
  • }
  • Bastion
  • {
  • Damage Dealt: 62%
  • Damage Received: 70%
  • Health: 500%
  • Infinite Ultimate Duration: On
  • }
  • Brigitte
  • {
  • Barrier Shield Recharge Rate: 200%
  • Damage Dealt: 31%
  • Health: 125%
  • Shield Bash: Off
  • Whip Shot Cooldown Time: 10%
  • }
  • Cassidy
  • {
  • Combat Roll Cooldown Time: 10%
  • Damage Dealt: 23%
  • Flashbang Cooldown Time: 10%
  • Health: 89%
  • }
  • D.Va
  • {
  • Boosters Cooldown Time: 10%
  • Defense Matrix Recharge Rate: 500%
  • Damage Dealt: 63%
  • Health: 90%
  • }
  • Echo
  • {
  • Damage Dealt: 29%
  • Flight Cooldown Time: 0%
  • Focusing Beam Cooldown Time: 10%
  • Sticky Bombs Cooldown Time: 10%
  • }
  • Genji
  • {
  • Damage Dealt: 91%
  • Deflect Cooldown Time: 10%
  • Health: 333%
  • Infinite Ultimate Duration: On
  • Swift Strike Cooldown Time: 10%
  • }
  • Hanzo
  • {
  • Damage Dealt: 75%
  • Health: 333%
  • Lunge Cooldown Time: 10%
  • Storm Arrows Cooldown Time: 10%
  • Storm Arrows Quantity: 12
  • }
  • Lúcio
  • {
  • Soundwave Cooldown Time: 125%
  • Amp It Up Cooldown Time: 125%
  • Soundwave Knockback Scalar: 85%
  • Damage Dealt: 35%
  • Healing Dealt: 167%
  • Healing Received: 25%
  • Health: 126%
  • Movement Speed: 110%
  • }
  • Mei
  • {
  • Cryo-Freeze Cooldown Time: 250%
  • Damage Dealt: 35%
  • Healing Received: 200%
  • Health: 222%
  • No Ammunition Requirement: On
  • Quick Melee: Off
  • Spawn With Ultimate Ready: On
  • Weapon Freeze Duration Scalar: 120%
  • }
  • Moira
  • {
  • Biotic Energy Maximum: 500%
  • Biotic Energy Recharge Rate: 500%
  • Biotic Orb Cooldown Time: 10%
  • Biotic Orb Max Damage Scalar: 500%
  • Biotic Orb Max Healing Scalar: 500%
  • Damage Dealt: 95%
  • Fade Cooldown Time: 10%
  • Healing Dealt: 150%
  • Healing Received: 10%
  • Health: 400%
  • Infinite Ultimate Duration: On
  • Projectile Speed: 30%
  • }
  • Orisa
  • {
  • Damage Dealt: 30%
  • Damage Received: 80%
  • Fortify Cooldown Time: 0%
  • Halt! Cooldown Time: 10%
  • Projectile Gravity: 500%
  • Protective Barrier Cooldown Time: 10%
  • }
  • Pharah
  • {
  • Concussive Blast Cooldown Time: 40%
  • Concussive Blast Knockback Scalar: 75%
  • Damage Dealt: 47%
  • Health: 111%
  • Hover Jets Recharge Rate: 300%
  • Hover Jets Vertical Speed Scalar: 81%
  • Jump Jet Acceleration Scalar: 60%
  • Jump Jet Cooldown Time: 100%
  • }
  • Reaper
  • {
  • Damage Dealt: 23%
  • Wraith Form Cooldown Time: 10%
  • }
  • Reinhardt
  • {
  • Charge Cooldown Time: 10%
  • Damage Dealt: 136%
  • Damage Received: 50%
  • Fire Strike Cooldown Time: 10%
  • Healing Received: 50%
  • Health: 333%
  • Projectile Speed: 150%
  • }
  • Roadhog
  • {
  • Chain Hook Cooldown Time: 10%
  • Damage Dealt: 75%
  • Damage Received: 80%
  • Health: 111%
  • Whole Hog Knockback Scalar: 150%
  • }
  • Sigma
  • {
  • Accretion Cooldown Time: 10%
  • Accretion Knockback Scalar: 125%
  • Damage Dealt: 63%
  • Health: 134%
  • Kinetic Grasp Cooldown Time: 10%
  • }
  • Soldier: 76
  • {
  • Biotic Field Cooldown Time: 10%
  • Damage Dealt: 84%
  • Healing Dealt: 125%
  • Health: 300%
  • Helix Rockets Cooldown Time: 0%
  • Helix Rockets Knockback Scalar: 80%
  • Projectile Speed: 150%
  • Ultimate Duration: 125%
  • }
  • Sombra
  • {
  • Damage Dealt: 42%
  • Projectile Gravity: 0%
  • Stealth Cooldown Time: 10%
  • Translocator Cooldown Time: 10%
  • }
  • Torbjörn
  • {
  • Damage Dealt: 75%
  • Damage Received: 40%
  • Deploy Turret Cooldown Time: 0%
  • Health: 500%
  • Infinite Ultimate Duration: On
  • No Ammunition Requirement: On
  • Overload Cooldown Time: 10%
  • Overload Duration Scalar: 500%
  • Projectile Gravity: 500%
  • Projectile Speed: 500%
  • Spawn With Ultimate Ready: On
  • }
  • Tracer
  • {
  • Blink Cooldown Time: 150%
  • Damage Dealt: 51%
  • Health: 150%
  • Projectile Gravity: 500%
  • Projectile Speed: 0%
  • }
  • Widowmaker
  • {
  • Damage Dealt: 75%
  • Grappling Hook Cooldown Time: 10%
  • Health: 125%
  • Ultimate Duration: 120%
  • Venom Mine Cooldown Time: 10%
  • }
  • Wrecking Ball
  • {
  • Damage Dealt: 89%
  • Health: 300%
  • Projectile Speed: 150%
  • Movement Speed: 50%
  • Infinite Ultimate Duration: On
  • Roll Always Active: On
  • }
  • Zarya
  • {
  • Damage Dealt: 37%
  • Health: 111%
  • Particle Barrier Cooldown Time: 10%
  • Projected Barrier Cooldown Time: 10%
  • Projectile Gravity: 40%
  • }
  • enabled heroes
  • {
  • Ashe
  • Doomfist
  • Junkrat
  • Mercy
  • Symmetra
  • Winston
  • Zenyatta
  • }
  • }
  • }
  • workshop
  • {
  • Difficulty: [1]
  • }
  • extensions
  • {
  • Buff Status Effects
  • Spawn More Dummy Bots
  • }
  • }
  • variables
  • {
  • global:
  • 1: gamemode
  • 2: is_hard_mode_enabled
  • 4: wave_number
  • 5: enable_normal_spawns
  • 6: special_spawns_count
  • 7: tier_4_spawns_block_end_t
  • 8: last_spawn_phase_end_t
  • 9: upgrade_count
  • 11: boss_list_1
  • 12: boss_list_2
  • 13: objective_phase_number
  • 14: objective_progress
  • 15: enable_objective_enemy_spawn
  • 16: iv_dom_objective_pos
  • 17: iv_dom_objective_all_pos_list
  • 18: hvt_dom_objective_killed_count
  • 19: hvt_call_reinforcements_end_t
  • 20: dom_point_A_contesters
  • 21: dom_point_B_contesters
  • 22: is_infrasight_on
  • 23: combatants
  • 24: combatants_count
  • 25: progress_bar_strings
  • 26: game_or_mutator_start_huds
  • 27: is_load_limit_reached
  • 28: is_waiting_to_remove_bot
  • 29: temp_1
  • 30: temp_2
  • 31: player_spawn_pos
  • 32: player_spawn_facing
  • 33: ability_shop_pos
  • 34: buy_menu_left_up_forward
  • 35: buy_menu_cam_pos
  • 36: buy_menu_base_pos
  • 37: spawn_pos_list
  • 38: spawn_nearest_node_idx_list
  • 39: nodes
  • 40: nodes_count
  • 41: edges
  • 42: distance_matrix
  • 43: elevator_nodes
  • 44: is_map_cg
  • 45: is_map_ew
  • 47: char_string
  • 48: aim_offset
  • 49: is_victory_declared
  • 52: is_mutator_activation_disabled
  • 53: is_mutator_mode_enabled
  • 54: money_amount
  • 55: money_mult
  • 56: diff_health_mult
  • 57: diff_damage_mult
  • 58: current_perks
  • 59: current_perks_huds_list
  • 60: mutators_list
  • 61: is_gmut_enabled
  • 62: gmut_storm_raging
  • 63: gmut_creeps
  • 64: gmut_adaptive_shield
  • 65: gmut_fortified
  • 66: mut_amped
  • 67: mut_hardwired
  • 68: mut_promotion
  • 69: mut_advanced_medkit
  • 71: mut_lock_n_load
  • 72: mut_emp_rounds
  • 73: mut_heartburn
  • 74: mut_deep_wounds
  • 75: mut_gear_upgrade
  • 76: mut_reinforcements
  • 77: mut_mutation
  • 78: mut_expendable
  • 79: mut_swan_song
  • 81: mut_fully_loaded
  • 82: mut_bulletproof
  • 83: gmut_list
  • 84: is_apocalyptic
  • 85: mut_count
  • 86: i
  • 87: mut_artful_dodger
  • 88: mut_the_calvary
  • 89: mut_signal_jammer
  • 90: gmut_sympathy_gains
  • 91: mut_low_blow
  • 92: gazed___
  • 93: length
  • player:
  • 0: ab_player
  • 1: ab_var_1
  • 2: ab_var_2
  • 3: ab_var_3
  • 4: ab_wraith_pos
  • 5: sombra_stealth_timer
  • 6: last_damage_taken_t
  • 7: is_combatant
  • 8: is_controller_player
  • 9: mercy_res_button
  • 10: downed_start_t
  • 11: revivers
  • 12: revive_timer
  • 13: is_revive_slow
  • 14: tased_end_t
  • 15: is_flying
  • 16: is_invisible
  • 17: spectated_player
  • 18: death_cam_target
  • 19: is_changing_heroes
  • 20: in_buy_menu_start_t
  • 21: is_showing_active_abilities
  • 22: can_use_drop_in_buy_menu
  • 23: money_spent_amount
  • 24: is_pathfinding_disabled
  • 25: is_using_combat_pathfinding
  • 26: combat_pathfinding_type
  • 27: nav_pos
  • 28: nav_idx
  • 29: best_nav_idx
  • 30: dom_nav_guard_idx
  • 31: is_nav_reachable_node
  • 32: last_nav_update_t
  • 33: last_time_at_node_t
  • 34: real_speed_pos_1
  • 35: real_speed_pos_2
  • 36: last_jump_t
  • 37: real_speed
  • 38: eye_offset
  • 39: facing_override_direction
  • 40: is_wraith
  • 41: is_ranged
  • 42: can_dodge
  • 43: can_stagger
  • 44: can_quick_melee
  • 45: recall_block_end_t
  • 46: is_target_in_los
  • 47: target
  • 48: target_last_seen_pos
  • 49: is_ignoring_other_targets
  • 50: base_tier
  • 51: real_tier
  • 52: is_alive
  • 53: is_living_boss
  • 54: iv_is_portal
  • 55: aggression_health_threshold
  • 56: is_using_boss_aggression
  • 57: is_aggressive
  • 58: is_fortified
  • 59: fear_end_t
  • 60: is_hardwired
  • 61: soldier_espionage
  • 62: is_mutated
  • 63: is_expendable
  • 64: gmut_var
  • 65: gmut_fortified_bypass_end_t
  • 66: gmut_adaptive_shield_health_pool
  • 67: last_hit_by_shatter_t
  • 68: active_ab_number
  • 69: active_ab_cooldown
  • 70: active_ab_var
  • 71: active_ab_is_cloaked
  • 72: active_ab_is_frenzied
  • 73: active_ab_is_smoked
  • 74: active_ab_effect_list
  • 75: ab_bought_abilities_string
  • 76: ab_headhunter
  • 77: ab_quick_fix
  • 78: current_quick_fix_speed_bonus
  • 79: ab_charged
  • 80: ab_heavy_impact
  • 81: ab_second_wind
  • 82: ab_triage
  • 83: ab_resilience
  • 84: ab_antigens
  • 85: ab_haste
  • 86: ab_priority
  • 87: ab_health_bonus
  • 88: ab_damage_bonus
  • 89: ab_healing_bonus
  • 90: perk_mystery_swap
  • 91: perk_bulletstorm
  • 92: perk_die_hard
  • 93: perk_brass_knuckles
  • 94: perk_vampiric
  • 95: perk_crash_n_dash
  • 96: perk_golden_hour
  • 97: perk_super_charge
  • 98: perk_nemesis
  • 99: nemesis_killer
  • 100: nemesis_beam_effect
  • 101: perk_special_operator
  • 102: perk_sharpshooter
  • 103: perk_shockproof
  • 104: health_percent
  • 105: Damage_Dealt
  • 106: healing_dealt_percent
  • 107: Move_Speed
  • 108: heal_mod
  • 109: special_operator_health_pool
  • 110: talent_text
  • 111: damage_mod
  • 112: Ability_Countdown
  • 113: Ability_Active
  • 114: Ability_Projectile1
  • 115: Ability_Available
  • 116: Ability_End
  • 117: Effects___
  • 118: i
  • 119: Smoked_Screen
  • 120: HUDs___
  • 121: Swapped_Talent_Array
  • 122: Talent2
  • 123: Talent1
  • 124: HP_Pool
  • 125: Chain_Reaction_Immune
  • 126: Chain_Reaction_On
  • 127: Damage_Received
  • }
  • subroutines
  • {
  • 0: update_combatants
  • 1: declare_victory
  • 2: play_incoming_sound_twice
  • 3: teleport_to_free_spawn
  • 4: nwp_teleport
  • 5: start_facing
  • 6: find_chase_target
  • 7: update_target_nav
  • 8: find_wp_near_nav
  • 9: check_drop
  • 10: upgrade_health_and_healing
  • 11: start_kill_remaining_phase
  • 12: set_random_perks
  • 13: iv_defend_portal
  • 14: mut_add_mutator
  • 15: disable_player
  • 16: enable_player
  • 17: open_buy_menu
  • 18: leave_buy_menu
  • 19: check_if_enough_money
  • 20: buy_active_ability
  • 21: remove_active_ability
  • 22: update_ab_string_and_play_sound
  • 23: play_purchase_confirmation_sound
  • 26: set_map_np
  • 28: set_map_cg
  • 29: set_map_ew
  • 31: set_map_kz
  • 32: call_reinforcements
  • 33: Cancel_Momentum
  • }
  • rule("Mod by LemonAid#11644, Original mode by Shingen#21859")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Disable Inspector Recording;
  • }
  • }
  • rule("Global (Init): Set Workshop Vars, Game Vars, Disable Game Components, Create Game Entities")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "Select and initialize Gamemode"
  • Global.gamemode = Empty Array;
  • If(Workshop Setting Toggle(Custom String("Enabled Game Modes"), Custom String("Invasion"), True, 0));
  • Modify Global Variable(gamemode, Append To Array, 0);
  • End;
  • If(Workshop Setting Toggle(Custom String("Enabled Game Modes"), Custom String("High Value Target"), True, 1));
  • Modify Global Variable(gamemode, Append To Array, 1);
  • End;
  • "Workaround: Need to reduce Slots because of spectator bug"
  • If(Workshop Setting Toggle(Custom String("Enabled Game Modes"), Custom String("Domination"), True, 2) && Number Of Slots(Color(
  • Team 1)) <= 7);
  • Modify Global Variable(gamemode, Append To Array, 2);
  • End;
  • If(Count Of(Global.gamemode));
  • Global.gamemode = Random Value In Array(Global.gamemode);
  • Else;
  • "Workaround: Need to reduce Slots because of spectator bug"
  • Global.gamemode = Random Integer(0, Number Of Slots(Color(Team 1)) <= 7 ? 2 : 1);
  • End;
  • If(Global.gamemode == 2);
  • Global.boss_list_1 = Array(Hero(Baptiste), Hero(Cassidy), Hero(Baptiste), Hero(Echo), Hero(Zarya), Hero(Lúcio), Hero(Widowmaker),
  • Hero(Ana), Hero(Orisa), Hero(Sigma), Hero(Tracer), Hero(Ana), Hero(Orisa), Hero(Hanzo), Hero(Bastion), Hero(Brigitte), Hero(
  • Widowmaker), Hero(Reaper), Hero(Moira), Hero(D.Va), Hero(Pharah), Hero(Reinhardt));
  • Global.boss_list_2 = Array(Hero(Brigitte), Hero(Sombra), Hero(Reaper), Hero(Pharah), Hero(Moira), Hero(Tracer), Hero(Roadhog),
  • Hero(Zarya), Hero(Lúcio), Hero(D.Va), Hero(Moira), Hero(Roadhog), Hero(D.Va), Hero(Genji), Hero(Reinhardt), Hero(Baptiste), Hero(
  • Cassidy), Hero(Sombra), Hero(Sigma), Hero(Echo), Hero(Brigitte), Hero(Bastion));
  • Else;
  • Global.boss_list_1 = Array(Hero(Cassidy), Hero(Baptiste), Hero(Lúcio), Hero(Pharah), Hero(Widowmaker), Hero(Sombra), Hero(Reaper),
  • Hero(Ana), Hero(Echo), Hero(Mei), Hero(Zarya), Hero(Tracer), Hero(Orisa), Hero(Moira), Hero(Reinhardt), Hero(Brigitte), Hero(
  • Hanzo), Hero(Genji), Hero(D.Va), Hero(Roadhog), Hero(Sigma), Hero(Bastion));
  • End;
  • Global.temp_1 = Workshop Setting Combo(Custom String("Settings"), Custom String("Difficulty"), 1, Array(Custom String("Easy"),
  • Custom String("Normal"), Custom String("Hard"), Custom String("Apocalypse")), 0);
  • Global.money_mult = Workshop Setting Integer(Custom String("Settings"), Custom String("Money Generation Scalar (in Percent)"), 100,
  • 100, 500, 1);
  • Global.length = Workshop Setting Combo(Custom String("Settings"), Custom String("Game Length"), 0, Array(Custom String("15 Waves"),
  • Custom String("22 Waves")), 2);
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("{0} Difficulty{1}", Array(Custom String("Easy"), Custom String(
  • "Normal"), Custom String("Hard"), Custom String("Apocalyptic"))[Global.temp_1], Global.money_mult == 100 ? Custom String("")
  • : Custom String(", +{0}% money", Global.money_mult - 100)), Right, -100, Null, Null, Color(Orange), Visible To,
  • Default Visibility);
  • Global.money_mult /= 100;
  • If(Global.temp_1 == 0);
  • Global.diff_health_mult = 0.6;
  • Global.diff_damage_mult = 0.6;
  • Else If(Global.temp_1 == 1);
  • Global.diff_health_mult = 0.8;
  • Global.diff_damage_mult = 0.8;
  • Else If(Global.temp_1 == 2);
  • Global.is_hard_mode_enabled = True;
  • Global.diff_health_mult = 1.150;
  • Global.diff_damage_mult = 1.150;
  • Global.mut_count = 5;
  • Else;
  • Global.is_apocalyptic = 1;
  • Global.money_mult *= 1.400;
  • Global.diff_health_mult = 1.500;
  • Global.diff_damage_mult = 1.250;
  • Global.mut_count = 5;
  • End;
  • Global.gazed___ = 1;
  • Global.is_mutator_activation_disabled = Workshop Setting Combo(Custom String("Settings"), Custom String("Enable Mutators"), 0,
  • Array(Custom String("Enabled"), Custom String("Disabled")), 2);
  • If(Global.is_mutator_activation_disabled == 0);
  • Global.is_mutator_mode_enabled = True;
  • Global.money_mult *= 2;
  • End;
  • Disable Built-In Game Mode Completion;
  • Disable Built-In Game Mode Scoring;
  • Disable Built-In Game Mode Announcer;
  • Global.progress_bar_strings = Array(Custom String("□□□□□"), Custom String("▣□□□□"), Custom String("■□□□□"), Custom String("■▣□□□"),
  • Custom String("■■□□□"), Custom String("■■▣□□"), Custom String("■■■□□"), Custom String("■■■▣□"), Custom String("■■■■□"),
  • Custom String("■■■■▣"), Custom String("■■■■■"));
  • Global.char_string = Custom String("0123456789!?#$%");
  • Global.aim_offset = 0.500 * Down;
  • Global.mutators_list[20] = Null;
  • Global.mutators_list = Mapped Array(Global.mutators_list, Current Array Index);
  • Global.gmut_list[4] = Null;
  • Global.gmut_list = Mapped Array(Global.gmut_list, Current Array Index);
  • If(Global.is_hard_mode_enabled || Global.is_apocalyptic);
  • For Global Variable(i, -1, 3, 1);
  • Wait(False, Ignore Condition);
  • Call Subroutine(mut_add_mutator);
  • End;
  • End;
  • "Initialize Map Specific Variables"
  • If(Current Map == Map(Château Guillard) || Current Map == Map(Château Guillard Halloween));
  • Call Subroutine(set_map_cg);
  • Global.is_map_cg = True;
  • Else If(Current Map == Map(Eichenwalde) || Current Map == Map(Eichenwalde Halloween));
  • Call Subroutine(set_map_ew);
  • Global.is_map_ew = True;
  • Else If(Current Map == Map(Kanezaka));
  • Call Subroutine(set_map_kz);
  • Else If(Current Map == Map(Necropolis));
  • Call Subroutine(set_map_np);
  • Else;
  • Create HUD Text(All Players(All Teams), Custom String(
  • " \n\n\n\n\n\n\n\n\n\n\n\n\n\n     This Map is not supported! Restart and choose a valid map.     \n\n\n\n\n\n\n\n\n\n\n\n\n\n"),
  • Null, Null, Top, -1000, Color(Yellow), Null, Null, Visible To, Default Visibility);
  • End;
  • Global.nodes_count = Count Of(Global.nodes);
  • Global.buy_menu_left_up_forward[1] = Direction From Angles(Horizontal Angle From Direction(Global.buy_menu_left_up_forward[2]),
  • Vertical Angle From Direction(Global.buy_menu_left_up_forward[2]) - 90);
  • Global.buy_menu_left_up_forward[0] = Cross Product(Global.buy_menu_left_up_forward[1], Global.buy_menu_left_up_forward[2]);
  • Global.buy_menu_base_pos = Global.buy_menu_cam_pos - 9 * Global.buy_menu_left_up_forward[1] + 142 * Global.buy_menu_left_up_forward[2];
  • "Workaround: Need to reduce Slots because of spectator bug"
  • If(Number Of Slots(Color(Team 1)) > 8);
  • Create HUD Text(All Players(All Teams), Custom String(
  • " \n\n\n\n\n\n\n\n\n\n\n\n\n\n     Too many player slots! Set Max Team 1 Players to 5 or lower and restart.     \n\n\n\n\n\n\n\n\n\n\n\n\n\n"),
  • Null, Null, Top, -1000, Color(Yellow), Null, Null, Visible To, Default Visibility);
  • End;
  • "Create HUDs"
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "H​e​a​t​ ​S​t​r​e​e​t​:​ ​S​u​r​v​i​v​a​l​ q.3.4.2​ ​(​C​R​6​7​F​ | KFVAY)​ ​-​ ​{0}{1}", Array(Custom String("Invasion"),
  • Custom String("High Value Target"), Custom String("Domination"))[Global.gamemode], Match Time ? Custom String(
  • " {0}{1}{2}", Match Time > 10 ? Custom String("0:") : Custom String(""), Round To Integer(Round To Integer(
  • 10 * Match Time, Up) / 10, Down), Match Time > 10 ? Custom String("") : Custom String(".{0}", Round To Integer(10 * Match Time,
  • Up) % 10)) : Custom String("")), Top, -100, Null, Null, Color(White), Visible To and String, Default Visibility);
  • If(Global.length == 0);
  • Create HUD Text(All Players(All Teams), Custom String(" Wave {0}/15 ", Global.wave_number), Null, Null, Top, -99, Color(White),
  • Null, Null, Visible To and String, Default Visibility);
  • Else If(Global.length == 1);
  • Create HUD Text(All Players(All Teams), Custom String(" Wave {0}/22 ", Global.wave_number), Null, Null, Top, -99, Color(White),
  • Null, Null, Visible To and String, Default Visibility);
  • End;
  • If(Global.gamemode == 2);
  • Create HUD Text(All Players(All Teams), Null, Global.objective_phase_number == 1 ? Custom String(" ") : Custom String(" \n\n\n"),
  • Null, Top, -98, Null, Color(White), Null, Visible To and String, Default Visibility);
  • Else;
  • Create HUD Text(All Players(All Teams), Null,
  • Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? Custom String(" ") : Custom String(" \n\n\n"), Null,
  • Top, -98, Null, Color(White), Null, Visible To and String, Default Visibility);
  • End;
  • Create HUD Text(Filtered Array(Global.combatants, Distance Between(Current Array Element, Global.ability_shop_pos) > 2),
  • Custom String(" \n{0}\n\n Press {1} to Start \n", Array(Custom String("   Invasion"), Custom String(" High Value Target"),
  • Custom String("   Domination"))[Global.gamemode], Input Binding String(Button(Interact))), Null, Null, Top, -92, Color(White),
  • Null, Null, Visible To and String, Default Visibility);
  • Global.game_or_mutator_start_huds[0] = Last Text ID;
  • Create HUD Text(Filtered Array(Global.combatants, Distance Between(Current Array Element, Global.ability_shop_pos) > 2), Null,
  • Null, Custom String("Change the Objective in the Workshop Settings"), Top, -91, Null, Null, Color(Green), Visible To,
  • Default Visibility);
  • Global.game_or_mutator_start_huds[1] = Last Text ID;
  • Create HUD Text(Filtered Array(Global.combatants, !Current Array Element.downed_start_t && (
  • Current Array Element.is_changing_heroes || (Global.objective_phase_number == False && !Current Array Element.in_buy_menu_start_t))),
  • Custom String(" \n\n\n  You can change Heroes now\n\n Hold {0} to open the Hero menu \n", Input Binding String(Button(
  • Reload))), Null, Null, Top, -90, Color(Yellow), Null, Null, Visible To and String, Default Visibility);
  • Create HUD Text(Filtered Array(Global.combatants, Current Array Element.downed_start_t), Null, Null, Custom String(
  • "Waiting for revival. Press {0} to spectate the next player.", Input Binding String(Button(Jump))), Top, -70, Null, Null,
  • Color(Yellow), Visible To and String, Default Visibility);
  • Create Progress Bar HUD Text((Local Player.downed_start_t ? Local Player.revive_timer : Is True For Any(Global.combatants,
  • Array Contains(Current Array Element.revivers, Local Player))) ? Local Player : Empty Array,
  • Local Player.downed_start_t ? Local Player.revive_timer : Last Of(Sorted Array(Filtered Array(Global.combatants,
  • Array Contains(Current Array Element.revivers, Local Player)), Current Array Element.revive_timer)).revive_timer,
  • Local Player.downed_start_t ? Custom String("You are being revived") : Custom String("Reviving {0}", Count Of(Filtered Array(
  • Global.combatants, Array Contains(Current Array Element.revivers, Local Player))) > 1 ? Custom String("{0} Teammates",
  • Count Of(Filtered Array(Global.combatants, Array Contains(Current Array Element.revivers, Local Player)))) : First Of(
  • Filtered Array(Global.combatants, Array Contains(Current Array Element.revivers, Local Player)))), Top, -60, (
  • Local Player.downed_start_t ? Local Player.is_revive_slow : Is True For All(Global.combatants, !Array Contains(
  • Current Array Element.revivers, Local Player) || Current Array Element.is_revive_slow)) ? Color(Orange) : Color(Sky Blue),
  • Color(White), Visible To Values and Color, Default Visibility);
  • Create HUD Text(Global.is_infrasight_on ? All Players(All Teams) : Empty Array, Custom String("{0} Enemies have improved aim!",
  • Ability Icon String(Hero(Widowmaker), Button(Ultimate))), Null, Null, Top, -50, Color(Violet), Null, Null, Visible To,
  • Default Visibility);
  • Create HUD Text(Is True For Any(Players On Hero(Hero(Soldier: 76), Color(Team 2)),
  • Current Array Element.ab_var_1 && Current Array Element.target == Local Player) ? Local Player : Empty Array, Custom String(
  • "{0} Locked on!", Ability Icon String(Hero(Soldier: 76), Button(Ultimate))), Null, Null, Top, -49, Custom Color(
  • 245 + 10 * Sine From Radians(4 * Total Time Elapsed), 205 + 50 * Sine From Radians(4 * Total Time Elapsed),
  • 200 * Sine From Radians(4 * Total Time Elapsed), 255), Null, Null, Visible To and Color, Default Visibility);
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • " \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"),
  • Top, -1, Null, Null, Color(White), Visible To, Default Visibility);
  • Create HUD Text(All Players(Team 2), Custom String("Server Load: {0}, Average: {1}, Peak: {2}", Server Load, Server Load Average,
  • Server Load Peak), Null, Null, Left, -110, Global.is_waiting_to_remove_bot ? Color(Yellow) : Color(White), Null, Null,
  • Visible To String and Color, Default Visibility);
  • Create HUD Text(Empty Array, Null, Custom String("Mod by Lemonaid"), Custom String("Credits to:\n Shingen\n SgtMoody\n"), Left, -1000,
  • Color(White), Color(Green), Color(Green), Visible To, Visible Always);
  • "Create Sombra Stealth Timer IWT"
  • Create Progress Bar In-World Text(Hero Of(Local Player) == Hero(Sombra) && Local Player.is_invisible ? Local Player : Empty Array,
  • Local Player.sombra_stealth_timer, Custom String("Invisible"), Update Every Frame(Eye Position(Local Player)
  • + 100 * Direction From Angles(Horizontal Facing Angle Of(Local Player), Vertical Facing Angle Of(Local Player) + 13.500)),
  • 1.200, Do Not Clip, Color(Purple), Color(White), Visible To Position and Values, Default Visibility);
  • "Sombra Malware Talent"
  • Start Damage Modification(Filtered Array(All Players(Team 2), Has Status(Current Array Element, Hacked)), Global.combatants,
  • Is True For Any(Players On Hero(Hero(Sombra), Team 1), Current Array Element.Talent1) ? 140 : 100,
  • Receivers Damagers and Damage Percent);
  • Global.money_amount = 1400;
  • Call Subroutine(set_random_perks);
  • "Priority A: Players to Bots Damage Increase"
  • Start Damage Modification(Filtered Array(All Players(Team 2),
  • Current Array Element.is_target_in_los && Current Array Element.target.ab_priority == 1), Global.combatants, 125,
  • Receivers and Damagers);
  • "Priority A: Bots to Players Damage Decrease"
  • Start Damage Modification(Global.combatants, Filtered Array(All Players(Team 2),
  • Current Array Element.is_target_in_los && Current Array Element.target.ab_priority == 1), 75, Receivers and Damagers);
  • "Priority C: Players to Players Healing Increase"
  • Start Healing Modification(Filtered Array(Global.combatants, Normalized Health(Current Array Element)
  • <= 0.500 && Current Array Element.last_damage_taken_t + 2.500 > Total Time Elapsed), Filtered Array(Global.combatants,
  • Current Array Element.ab_priority == 3), 140, Receivers Healers and Healing Percent);
  • "Nemesis: Your Nemesis IWT"
  • Create In-World Text(Local Player.nemesis_killer ? Local Player : Empty Array, Custom String("Your Nemesis"),
  • Local Player.nemesis_killer, 1.500, Do Not Clip, Visible To and Position, Color(Team 2), Default Visibility);
  • Create Effect(All Players(All Teams), Ring, Color(Sky Blue), Global.ability_shop_pos, 2, Visible To);
  • Create In-World Text(All Players(All Teams), Custom String("Ability Shop"), Global.ability_shop_pos, 1.500, Do Not Clip,
  • Visible To, Color(Sky Blue), Default Visibility);
  • Create HUD Text(
  • !Local Player.is_combatant || Local Player.downed_start_t || Local Player.in_buy_menu_start_t || Local Player.is_changing_heroes ? Empty Array : Local Player,
  • Distance Between(Local Player, Global.ability_shop_pos) <= 2 ? (Match Time ? Custom String("Press {0} to buy Abilities",
  • Input Binding String(Button(Interact))) : Custom String(" \n Press {0} to buy Abilities \n", Input Binding String(Button(
  • Interact)))) : (Local Player.can_use_drop_in_buy_menu || Match Time ? Custom String("Hold {0} to buy Abilities",
  • Input Binding String(Button(Interact))) : Custom String("")), Null, Null, Top, -80, Color(Green), Null, Null,
  • Visible To and String, Default Visibility);
  • "Create Buy Menu IWTs, on scale 2.5 1 space is 8.5 pixels"
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃"), Global.buy_menu_base_pos - 21 * Global.buy_menu_left_up_forward[1] + 90 * First Of(
  • Global.buy_menu_left_up_forward), 2.500, Do Not Clip, Visible To, Color(White), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃"), Global.buy_menu_base_pos - 21 * Global.buy_menu_left_up_forward[1] - 90 * First Of(
  • Global.buy_menu_left_up_forward), 2.500, Do Not Clip, Visible To, Color(White), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String("Refund"),
  • Global.buy_menu_base_pos + 45 * Global.buy_menu_left_up_forward[1] + 90 * First Of(Global.buy_menu_left_up_forward), 3,
  • Do Not Clip, Visible To, Color(Green), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String("[{0}] {1}",
  • Input Binding String(Button(Melee)), Local Player.is_showing_active_abilities ? Custom String("Show passive Abilities")
  • : Custom String("Show active Abilities")), Global.buy_menu_base_pos + 45 * Global.buy_menu_left_up_forward[1], 3, Do Not Clip,
  • Visible To and String, Color(Green), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String("[{0}] Leave",
  • Input Binding String(Button(Interact))), Global.buy_menu_base_pos + 45 * Global.buy_menu_left_up_forward[1] - 90 * First Of(
  • Global.buy_menu_left_up_forward), 3, Do Not Clip, Visible To and String, Color(Green), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.ab_priority ? Custom String("Priority A\n  Swap") : Custom String("Priority A\n 1200$"),
  • Global.buy_menu_base_pos + 20 * Global.buy_menu_left_up_forward[1] + 112.500 * First Of(Global.buy_menu_left_up_forward),
  • 2.500, Do Not Clip, Visible To String and Color, Local Player.ab_priority ? Color(Yellow) : Custom Color(0, 134, 171, 255), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.ab_priority ? Custom String("Priority B\n  Swap") : Custom String("Priority B\n 1200$"),
  • Global.buy_menu_base_pos - 2.500 * Global.buy_menu_left_up_forward[1] + 112.500 * First Of(Global.buy_menu_left_up_forward),
  • 2.500, Do Not Clip, Visible To String and Color, Local Player.ab_priority ? Color(Yellow) : Custom Color(0, 134, 171, 255), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.ab_priority ? Custom String("Priority C\n  Swap") : Custom String("Priority C\n 1200$"),
  • Global.buy_menu_base_pos - 25 * Global.buy_menu_left_up_forward[1] + 112.500 * First Of(Global.buy_menu_left_up_forward),
  • 2.500, Do Not Clip, Visible To String and Color, Local Player.ab_priority ? Color(Yellow) : Custom Color(0, 134, 171, 255), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Stim Infusion\n  Swap")
  • : Custom String("Stim Infusion\n  1200$")) : (Local Player.ab_headhunter ? Custom String("Headhunter II\n  800$")
  • : Custom String("Headhunter I\n  800$")),
  • Global.buy_menu_base_pos + 20 * Global.buy_menu_left_up_forward[1] + 67.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Color(
  • Yellow) : Color(Green)) : (Local Player.ab_headhunter < 2 ? Color(Green) : Color(Gray)), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Smoke Bomb\n  Swap")
  • : Custom String("Smoke Bomb\n  1200$")) : (Local Player.ab_antigens ? Custom String("Antigens II\n  600$") : Custom String(
  • "Antigens I\n  600$")), Global.buy_menu_base_pos - 2.500 * Global.buy_menu_left_up_forward[1] + 67.500 * First Of(
  • Global.buy_menu_left_up_forward), 2.500, Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (
  • Local Player.active_ab_number ? Color(Yellow) : Color(Green)) : (Local Player.ab_antigens < 2 ? Color(Green) : Color(Gray)),
  • Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? Custom String("") : (Local Player.ab_quick_fix ? Custom String(
  • "Quick Fix II\n  700$") : Custom String("Quick Fix I\n  700$")),
  • Global.buy_menu_base_pos - 25 * Global.buy_menu_left_up_forward[1] + 67.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.ab_quick_fix < 2 ? Color(Green) : Color(Gray), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Cloak\n Swap") : Custom String(
  • "Cloak\n1200$")) : (Local Player.ab_charged ? Custom String("Charged II\n  700$") : Custom String("Charged I\n  700$")),
  • Global.buy_menu_base_pos + 20 * Global.buy_menu_left_up_forward[1] + 22.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Color(
  • Yellow) : Color(Green)) : (Local Player.ab_charged < 2 ? Color(Green) : Color(Gray)), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Resurgence\n  Swap")
  • : Custom String("Resurgence\n  1200$")) : (Local Player.ab_haste ? Custom String("Haste II\n 800$") : Custom String(
  • "Haste I\n 800$")), Global.buy_menu_base_pos - 2.500 * Global.buy_menu_left_up_forward[1] + 22.500 * First Of(
  • Global.buy_menu_left_up_forward), 2.500, Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (
  • Local Player.active_ab_number ? Color(Yellow) : Color(Green)) : (Local Player.ab_haste < 2 ? Color(Green) : Color(Gray)),
  • Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? Custom String("") : (Local Player.ab_heavy_impact ? Custom String(
  • "Heavy Impact II\n  1000$") : Custom String("Heavy Impact I\n  1000$")),
  • Global.buy_menu_base_pos - 25 * Global.buy_menu_left_up_forward[1] + 22.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.ab_heavy_impact < 2 ? Color(Green) : Color(Gray), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Combustion\n  Swap")
  • : Custom String("Combustion\n  1200$")) : (Local Player.ab_second_wind ? Custom String("Second Wind II\n   1000$")
  • : Custom String("Second Wind I\n   1000$")),
  • Global.buy_menu_base_pos + 20 * Global.buy_menu_left_up_forward[1] - 22.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Color(
  • Yellow) : Color(Green)) : (Local Player.ab_second_wind < 2 ? Color(Green) : Color(Gray)), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Tear Gas\n Swap") : Custom String(
  • "Tear Gas\n 1200$")) : (Local Player.ab_triage ? Custom String("Triage II\n 700$") : Custom String("Triage I\n 700$")),
  • Global.buy_menu_base_pos - 2.500 * Global.buy_menu_left_up_forward[1] - 22.500 * First Of(Global.buy_menu_left_up_forward),
  • 2.500, Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (
  • Local Player.active_ab_number ? Color(Yellow) : Color(Green)) : (Local Player.ab_triage < 2 ? Color(Green) : Color(Gray)),
  • Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? Custom String("") : (Local Player.ab_resilience ? Custom String(
  • "Resilience II\n  800$") : Custom String("Resilience I\n  800$")),
  • Global.buy_menu_base_pos - 25 * Global.buy_menu_left_up_forward[1] - 22.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.ab_resilience < 2 ? Color(Green) : Color(Gray), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Frenzy\n Swap") : Custom String(
  • "Frenzy\n 1200$")) : Custom String("+5% Health\n  500$"),
  • Global.buy_menu_base_pos + 20 * Global.buy_menu_left_up_forward[1] - 67.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Color(
  • Yellow) : Color(Green)) : Color(Green), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? (Local Player.active_ab_number ? Custom String("Chain Hack\n  Swap")
  • : Custom String("Chain Hack\n  1200$")) : Custom String("+5% Damage\n  500$"),
  • Global.buy_menu_base_pos - 2.500 * Global.buy_menu_left_up_forward[1] - 67.500 * First Of(Global.buy_menu_left_up_forward),
  • 2.500, Do Not Clip, Visible To String and Color, Local Player.is_showing_active_abilities ? (
  • Local Player.active_ab_number ? Color(Yellow) : Color(Green)) : Color(Green), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t),
  • Local Player.is_showing_active_abilities ? Custom String("") : Custom String("+5% Healing\n  500$"),
  • Global.buy_menu_base_pos - 25 * Global.buy_menu_left_up_forward[1] - 67.500 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To and String, Color(Green), Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String("Limited offer!"),
  • Global.buy_menu_base_pos + 22.500 * Global.buy_menu_left_up_forward[1] - 112.500 * First Of(Global.buy_menu_left_up_forward),
  • 2.500, Do Not Clip, Visible To and String, Color(White), Default Visibility);
  • Create In-World Text(Local Player.in_buy_menu_start_t && Local Player.is_showing_active_abilities ? Local Player : Empty Array,
  • Custom String("Hold or double tap {0} to use your active ability\n", Input Binding String(Button(Melee))),
  • Global.buy_menu_base_pos - 25 * Global.buy_menu_left_up_forward[1], 2.500, Do Not Clip, Visible To and String, Color(White),
  • Default Visibility);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Press {0} to buy\n", Input Binding String(Button(Primary Fire))),
  • Global.buy_menu_base_pos - 74 * Global.buy_menu_left_up_forward[1] - 55 * First Of(Global.buy_menu_left_up_forward), 2.500,
  • Do Not Clip, Visible To and String, Color(White), Default Visibility);
  • "Create Ability Entities and Cursor"
  • Create In-World Text(Local Player.in_buy_menu_start_t ? Local Player : Empty Array, Custom String("{0}$\n", Round To Integer(
  • Global.money_mult * Global.money_amount - Local Player.money_spent_amount, Down)),
  • Global.buy_menu_base_pos - 74 * Global.buy_menu_left_up_forward[1], 2.500, Do Not Clip, Visible To and String, Color(White),
  • Default Visibility);
  • Create In-World Text(Local Player.in_buy_menu_start_t ? Local Player : Empty Array, Custom String("▲"), Update Every Frame(
  • Global.buy_menu_base_pos - (4 + Vertical Facing Angle Of(Local Player))
  • * Global.buy_menu_left_up_forward[1] + Horizontal Facing Angle Of(Local Player) * First Of(Global.buy_menu_left_up_forward)),
  • 4, Do Not Clip, Visible To Position and Color, Custom Color(245 + 10 * Sine From Radians(4 * Total Time Elapsed),
  • 205 + 50 * Sine From Radians(4 * Total Time Elapsed), 200 * Sine From Radians(4 * Total Time Elapsed), 255),
  • Default Visibility);
  • "Use Update Every Frame to avoid showing the String when the cursor is out of bounds, resulting in 0"
  • Create In-World Text(Update Every Frame(Local Player.in_buy_menu_start_t && Absolute Value(Horizontal Facing Angle Of(
  • Local Player)) < 135 && Absolute Value(Vertical Facing Angle Of(Local Player) + 11.250) < 45 ? Local Player : Empty Array),
  • Update Every Frame(Vertical Facing Angle Of(Local Player) < -33.750 ? Array(Custom String("Leave Buy Menu\n"),
  • Local Player.is_showing_active_abilities ? Custom String("Swap to the passive abilities page\n") : Custom String(
  • "Swap to the active abilities page\n"), Custom String("Refund your money\n"))[Round To Integer((Horizontal Facing Angle Of(
  • Local Player) + 135) / 90, Down)] : Array(Vertical Facing Angle Of(Local Player) < -11.250 ? Custom String(
  • "The limited offer changes every wave\n") : Array(Custom String(
  • "Mystery Swap: Periodically swap to a random hero with a free ult\n Health, damage and healing is increased by 20%"),
  • Custom String("Bulletstorm: Your weapon can hold unlimited ammo\n"), Custom String(
  • "Die Hard: Your health regeneration delay is halved\n"), Custom String(
  • "Brass Knuckles: While using quick melee you are immune to Cloakers' charge attack\n{0}", Custom String(
  • "   Your quick melee attack knocks enemies down (15 second cooldown)")), Custom String(
  • "Vampiric: Heal for 25% of all dealt damage\n"), Custom String(
  • "Crash N' Dash: Regenerate health while moving faster than 8 meters per second\n"), Custom String(
  • "Golden Hour: You can be revived twice as fast\n"), Custom String("Supercharge: Healing allies slowly charges their ultimate\n"),
  • Custom String("Nemesis: After going down automatically revive yourself when your killer dies\n"), Custom String(
  • "Spec Ops: Gain 50 armour and immunity to grenadier smokes\n"), Custom String(
  • "Sharpshooter: Deal 50% more damage to enemies that are further than 20 meters away\n"), Custom String(
  • "Shockproof: Gain +15% speed and pass through enemies. \nBecome immune and deflect Taser electrocution attempts"), Custom String(
  • "{0}: {1}", Local Player.talent_text[1], Local Player.talent_text[2]), Custom String("{0}: {1}", Local Player.talent_text[3],
  • Local Player.talent_text[4]))[Global.current_perks[Vertical Facing Angle Of(Local Player) >= 11.250]], (
  • Local Player.is_showing_active_abilities ? Array(Custom String("Frenzy: Become invincible and force enemies to target you\n"),
  • Custom String("          Chain Hack: Hack and electrocute an enemy\n{0}", Custom String(
  • "Can jump to nearby enemies up to 3 times with a shorter duration after each jump")), Custom String("")) : Array(Custom String(
  • "Increase your health by 5%\n"), Custom String("Increase your damage by 5%\n"), Custom String(
  • "Increase your healing by 5%\n")))[Round To Integer((Vertical Facing Angle Of(Local Player) + 33.750) / 22.500, Down)], (
  • Local Player.is_showing_active_abilities ? Array(Custom String(
  • " Combustion: Explode and damage nearby enemies\n Strength and cooldown speed increases the lower the health"),
  • Custom String(
  • "Tear Gas: Launch a grenade that releases lingering noxious gas\n       Enemies in the gas get stunned"),
  • Custom String("")) : Array(Local Player.ab_second_wind ? Custom String(
  • "Second Wind II: Revive yourself when downed. Can only happen once every 60 seconds") : Custom String(
  • "Second Wind I: Revive yourself when downed. Can only happen once every 90 seconds"), Local Player.ab_triage ? Custom String(
  • "Triage II: Heal 50% more to players under 50% health\n") : Custom String(
  • "Triage I: Heal 25% more to players under 50% health\n"), Local Player.ab_resilience ? Custom String(
  • " Resilience II: Receive 20% less damage\nReceive 60% less knockback and inflict 60% more") : Custom String(
  • " Resilience I: Receive 20% less damage\nReceive 30% less knockback and inflict 30% more")))[Round To Integer((Vertical Facing Angle Of(Local Player)
  • + 33.750) / 22.500, Down)], (Local Player.is_showing_active_abilities ? Array(Custom String(
  • "Cloak: Become invisible and freeze nearby enemies when you become visible again\n"), Custom String(
  • "  Resurgence: Heal yourself for 300 health per second\nIf you are at full health, heal a nearby injured ally instead"),
  • Custom String("")) : Array(Local Player.ab_charged ? Custom String("Charged II: Ultimates cost 30% less\n") : Custom String(
  • "Charged I: Ultimates cost 15% less\n"), Local Player.ab_haste ? Custom String(
  • " Haste II: Ability cooldown is reduced by 50%\nDoes not affect abilities with multiple charges") : Custom String(
  • " Haste I: Ability cooldown is reduced by 25%\nDoes not affect abilities with multiple charges"),
  • Local Player.ab_heavy_impact ? Custom String("Heavy Impact II: Every hit has a chance to stun the enemy for 2 seconds\n")
  • : Custom String("Heavy Impact I: Every hit has a chance to stun the enemy for 1 second\n")))[Round To Integer((
  • Vertical Facing Angle Of(Local Player) + 33.750) / 22.500, Down)], (Local Player.is_showing_active_abilities ? Array(
  • Custom String(" Stim Infusion: Instantly start health regeneration\nGain +100% damage, +100% healing and +50% speed"),
  • Custom String("      Smoke Bomb: Create a smoke screen\nEnemies are less accurate when targeting allies in the smoke"),
  • Custom String("")) : Array(Local Player.ab_headhunter ? Custom String("Headhunter II: Critical hits deal 60% more damage\n")
  • : Custom String("Headhunter I: Critical hits deal 30% more damage\n"), Local Player.ab_antigens ? Custom String(
  • "Antigens II: Receive 40% more healing and a natural overtime heal") : Custom String(
  • "Antigens I: Receive 20% more healing and a natural overtime heal"), Local Player.ab_quick_fix ? Custom String(
  • "Quick Fix II: Eliminations restore 100 HP and shortly increase speed by 30%\n") : Custom String(
  • "Quick Fix I: Eliminations restore 50 HP and shortly increase speed by 15%\n")))[Round To Integer((Vertical Facing Angle Of(
  • Local Player) + 33.750) / 22.500, Down)], Array(Custom String(
  • "    Priority A: Enemies are more likely to target you\nEnemies targeting you take 25% more and deal 25% less damage"),
  • Custom String("        Priority B: Enemies are less likely to target you\n{0}", Custom String(
  • "Gain +20% damage and speed if you did not take damage in the last 3 seconds")), Custom String(
  • "  Priority C: Enemies are much less likely to target you\n{0}", Custom String(
  • "Heal 40% more to allies in combat. Heal for 25% of dealt healing")))[Round To Integer((Vertical Facing Angle Of(Local Player)
  • + 33.750) / 22.500, Down)])[Round To Integer((Horizontal Facing Angle Of(Local Player) + 135) / 45, Down)]),
  • Global.buy_menu_base_pos - 55 * Global.buy_menu_left_up_forward[1], 2.500, Do Not Clip, Visible To and String, Color(White),
  • Default Visibility);
  • "Skip Assembling Heroes"
  • Set Match Time(3);
  • Wait Until(Is Game In Progress, 3.500);
  • Set Match Time(0);
  • "Workaround: Need to reduce Slots because of spectator bug"
  • If(Number Of Slots(Color(Team 1)) <= 8);
  • Create Dummy Bot(Hero(Ana), Color(Team 2), Global.gamemode, 1000 * Down, Forward);
  • If(Number Of Slots(Color(Team 1)) <= 8);
  • Create Dummy Bot(Hero(Roadhog), Color(Team 2), 3, 1000 * Down, Forward);
  • End;
  • If(Number Of Slots(Color(Team 1)) <= 5);
  • Create Dummy Bot(Hero(Cassidy), Color(Team 2), 4, 1000 * Down, Forward);
  • End;
  • If(Number Of Slots(Color(Team 1)) <= 6);
  • Create Dummy Bot(Hero(Cassidy), Color(Team 2), 5, 1000 * Down, Forward);
  • End;
  • If(Number Of Slots(Color(Team 1)) <= 7);
  • Create Dummy Bot(Hero(Cassidy), Color(Team 2), 6, 1000 * Down, Forward);
  • End;
  • Create Dummy Bot(Hero(Soldier: 76), Color(Team 2), 7, 1000 * Down, Forward);
  • Create Dummy Bot(Hero(Soldier: 76), Color(Team 2), 8, 1000 * Down, Forward);
  • Create Dummy Bot(Hero(Soldier: 76), Color(Team 2), 9, 1000 * Down, Forward);
  • Create Dummy Bot(Hero(Soldier: 76), Color(Team 2), 10, 1000 * Down, Forward);
  • End;
  • Global.is_gmut_enabled = True;
  • }
  • }
  • rule("Subroutine (Set Map NP): Set Spawns, Nodes, Edges, Distance Matrix, Ability Buy Location")
  • {
  • event
  • {
  • Subroutine;
  • set_map_np;
  • }
  • actions
  • {
  • Global.spawn_pos_list = Array(Vector(-13.025, -4, 0), Vector(7.504, -6, 0), Vector(1.167, 2.999, -20.927), Vector(1.167, 2.999,
  • 20.927), Vector(-2.157, 8.335, -20.834), Vector(-2.157, 8.335, 20.834), Vector(21.341, 6.043, -25.589), Vector(21.341, 6.043,
  • 25.589), Vector(-43.636, 3.964, 0), Vector(-26.573, 9, 0));
  • Global.spawn_nearest_node_idx_list = Array(32, 39, 11, 41, 7, 46, 3, 49, 21, 24);
  • Global.nodes = Array(Vector(6.532, 1.006, 0), Vector(19.347, 1, -11.887), Vector(30.683, 5.012, -21.798), Vector(23.682, 5.012,
  • -28.768), Vector(15.884, 8.298, -21.158), Vector(4.936, 10.021, -27.199), Vector(-5.682, 8.276, -27.339), Vector(-5.768, 8.345,
  • -15.438), Vector(-25.997, 4.753, -27.421), Vector(-28.301, 3.694, -22.857), Vector(-11.547, 3.007, -22.630), Vector(0.736, 3,
  • -23.561), Vector(9.057, 3, -22.043), Vector(-31.644, 3, -14.620), Vector(-14.838, 1, -14.683), Vector(0.617, 1.007, -11.683),
  • Vector(-9.119, 1.008, 0), Vector(-23.011, 3, 0), Vector(-22.302, 3, -6.074), Vector(-32.210, 2.001, -5.418), Vector(-31.767,
  • 2.001, 0), Vector(-47.704, 5, 0), Vector(-47.511, 6, -5.546), Vector(-35.414, 9, -6.603), Vector(-25.730, 9, -6.708), Vector(
  • -25.730, 9, 6.708), Vector(-35.414, 9, 6.603), Vector(-47.511, 6, 5.546), Vector(-22.302, 3, 6.074), Vector(-32.210, 2.001,
  • 5.418), Vector(-31.644, 3, 14.620), Vector(-14.838, 1, 14.683), Vector(-16.633, -4, 0), Vector(-3.313, -6, 0), Vector(0.617,
  • 1.007, 11.683), Vector(19.347, 1, 11.887), Vector(28.520, 1, 0), Vector(18.921, -2, 0), Vector(13.090, -3.806, 0), Vector(
  • 3.360, -6, 0), Vector(9.057, 3, 22.043), Vector(0.736, 3, 23.561), Vector(-11.547, 3.007, 22.630), Vector(-28.301, 3.694,
  • 22.857), Vector(-25.997, 4.753, 27.421), Vector(-5.682, 8.276, 27.339), Vector(-5.768, 8.345, 15.438), Vector(4.936, 10.021,
  • 27.199), Vector(15.884, 8.298, 21.158), Vector(23.682, 5.012, 28.768), Vector(30.683, 5.012, 21.798));
  • Global.edges = Array(Array(1, 15, 34, 35, 38, 39), Array(0, 2, 12, 15, 36, 37), Array(1, 3), Array(2, 4), Array(1, 3, 5), Array(0,
  • 4, 6), Array(5, 7, 8, 10), Array(6, 15), Array(6, 9), Array(8, 10, 13), Array(9, 11, 14), Array(10, 12), Array(1, 11), Array(9,
  • 14, 19), Array(10, 13, 15, 16, 32), Array(0, 1, 14, 16), Array(14, 15, 17, 31, 33, 34), Array(16, 18, 28), Array(17, 19),
  • Array(13, 18, 20), Array(19, 21, 29), Array(20, 22, 27), Array(21, 23), Array(13, 20, 22, 24, 26), Array(13, 16, 20, 23, 25),
  • Array(16, 20, 24, 26, 30), Array(20, 23, 25, 27, 30), Array(21, 26), Array(17, 29), Array(20, 28, 30), Array(29, 31, 43),
  • Array(16, 30, 32, 34, 42), Array(14, 31, 33), Array(32), Array(0, 16, 31, 35), Array(0, 34, 36, 37, 40, 50), Array(1, 35),
  • Array(1, 35, 38), Array(37, 39), Array(38), Array(35, 41), Array(40, 42), Array(31, 41, 43), Array(30, 42, 44), Array(43, 45),
  • Array(42, 44, 46, 47), Array(34, 45), Array(0, 45, 48), Array(35, 47, 49), Array(48, 50), Array(35, 49));
  • Global.distance_matrix = Array(Custom String(
  • "012345675433232123445678998744323311221123345675432101234565432132123445678998745433322112234456786543210123455543243234556789!!"),
  • Custom String(
  • "985654443322334556789765432101234454435434566789!??!9676555443344566789!8765212101233433243234556789!!98565444332233455678976541"),
  • Custom String(
  • "23210122323343234556789!!9855434422332234456786543234321011212332234545678998756543433443345567897654223432102323332123445678998"),
  • Custom String(
  • "7454333333333454567876543454321201234233454345678876656545445544566789!876544554323101231233432345677655454344555556656789987633"),
  • Custom String(
  • "4554342101221223434567887645432334444455456788765323455453210132334545678998756543444334456567898765212345564321043234556789!!98"),
  • Custom String(
  • "56544433223345567897654334554342123401223212345665443432334444455456788765223455453212310112323456776534321223333344345677654112"),
  • Custom String(
  • "34556432322101233456788763432222222223434567654322345656432332110123456788762321211233333323456654333456767543443221012345677651"),
  • Custom String(
  • "23232234444443456776544456765643455233210123456654234343345555554567887654456654532345123321012345543323434455555665456778765567"),
  • Custom String(
  • "76564345623443210123443221234545666665434566776667887675456734544321012332132345556777776545677887556776564345623434432101232243"),
  • Custom String(
  • "34444566666654567787644566545323451232332121012123223333455555543456676533456545323441221232122101233222322344444433456665433456"),
  • Custom String(
  • "65643344222123212321012321232234444443234556544456765643455233233212212101321233345555543234556655567876754566344344321223210432"),
  • Custom String(
  • "34445666665434566776445678786545543321232345665401234334555555434566765456787675456634432321234554310123434555554323455665345678"),
  • Custom String(
  • "78654554332343234566542101232344444321234455423456767543443221234345677653210121233333212345554333456656432342122343456788764321"),
  • Custom String(
  • "01234444432345666544456776754345323345456789987543210345555543456777651234566754343322123445678876332122012222232345654321234567"),
  • Custom String(
  • "86544343223455678998744323310112212345564321212345676543243234556789!!9855434421023323456675432212345676543243234556789!!9855434"),
  • Custom String(
  • "42120122345667543232345678765435434566789!??!9665455323101345677865434345678987654654567789!?##?!7765664342104567889765423456789"),
  • Custom String(
  • "7655454334566789!!98554344212233012345654323456788976565544345656789987543234323344101234555433456787865455433234545678876432123"),
  • Custom String(
  • "234444210123445544567898976566544345434567765321234345555321012334553456789!8766565445654567887643234534554443210122345234567897"),
  • Custom String(
  • "655454334565678998754323423443332121011234234567786545443323455678998744323312333333232102343123456786544343234556789!!985543442"),
  • Custom String(
  • "2332233232120123234567897655454334566789!!98554344212233233432310123456789!876656544567789!??!9665455323344344543421012345678976"),
  • Custom String("55454334566789!!9855434421223323455453210"));
  • Global.elevator_nodes = Empty Array;
  • If(Global.gamemode == 0);
  • Global.iv_dom_objective_all_pos_list = Array(Vector(-7.863, 3.009, 0), Vector(-22.704, 14.589, 0), Vector(-32.144, 4, 0), Vector(
  • 0.924, 5, -23.024), Vector(0.924, 5, 23.024), Vector(-4.510, 10.337, -21.480), Vector(-4.510, 10.337, 21.480), Vector(8.510,
  • 6.932, -7.918), Vector(8.510, 6.932, 7.918), Vector(9.795, -2.056, 0));
  • Else If(Global.gamemode == 2);
  • Global.iv_dom_objective_all_pos_list = Array(Array(Vector(8.165, 1.005, 0), Vector(-31.947, 2, 0), 0, 20), Array(Vector(-0.568,
  • 1.006, -11.307), Vector(0.925, 3, -24.216), 7, 11), Array(Vector(-0.568, 1.006, 11.307), Vector(0.925, 3, 24.216), 46, 41),
  • Array(Vector(19.394, 1, -10.739), Vector(4.544, 10.027, -25.586), 2, 5), Array(Vector(19.394, 1, 10.739), Vector(4.544, 10.027,
  • 25.586), 50, 47));
  • End;
  • Global.player_spawn_pos = Vector(-33.297, 9, 6.889);
  • Global.player_spawn_facing = Vector(0.765, 0, -0.644);
  • Global.ability_shop_pos = Vector(-27.150, 9, 0);
  • Global.buy_menu_left_up_forward[2] = Direction From Angles(-60, 0);
  • Global.buy_menu_cam_pos = 900 * Up;
  • }
  • }
  • rule("Subroutine (Set Map CG): Set Spawns, Nodes, Edges, Distance Matrix, Ability Buy Location")
  • {
  • event
  • {
  • Subroutine;
  • set_map_cg;
  • }
  • actions
  • {
  • Global.spawn_pos_list = Array(Vector(206.454, 0.001, 70.220), Vector(221.427, 8.692, 66.933), Vector(193.658, 0.998, 67.449),
  • Vector(229.543, 1.999, 85.875), Vector(224.599, 5.001, 110.683), Vector(199.902, 8.843, 109.823), Vector(176.589, 6.999,
  • 66.024), Vector(212.836, 9, 81.390), Vector(228.988, 12.998, 65.820), Vector(186.820, 0.999, 87.814));
  • Global.spawn_nearest_node_idx_list = Array(0, 24, 2, 40, 42, 35, 10, 25, 21, 7);
  • Global.nodes = Array(Vector(206.137, 0.041, 81.572), Vector(197.753, 1.002, 81.213), Vector(189.242, 0.998, 66.794), Vector(
  • 188.545, 3, 51.941), Vector(193.895, 16.500, 51.891), Vector(196.476, 16.501, 68.781), Vector(186.703, 0.999, 80.980), Vector(
  • 187.579, 0.999, 92.388), Vector(174.916, 5.001, 92.330), Vector(174.294, 5, 80.881), Vector(173.301, 6.999, 66.065), Vector(
  • 173.262, 6.998, 57.010), Vector(183.040, 7.999, 56.064), Vector(183.491, 7.999, 63.766), Vector(191.037, 7.999, 64.119),
  • Vector(199.061, 7.998, 49.104), Vector(201.742, 7.998, 60.913), Vector(209.518, 7.998, 60.774), Vector(208.498, 9, 44.680),
  • Vector(218.343, 12, 45.130), Vector(216.613, 14.001, 61.938), Vector(229.231, 13.001, 61.763), Vector(229.677, 9.187, 73.895),
  • Vector(220.985, 7.998, 81.140), Vector(221.330, 9.002, 61.664), Vector(206.100, 9, 81.084), Vector(206.313, 7.999, 70.046),
  • Vector(183.802, 5.998, 74.325), Vector(186.933, 6, 80.940), Vector(185.025, 6.001, 87.180), Vector(194.265, 8.001, 96.067),
  • Vector(205.974, 9.025, 95.640), Vector(216.192, 7.999, 95.441), Vector(180.423, 8.998, 104.206), Vector(205.974, 8.027,
  • 103.778), Vector(206.172, 7.998, 110.406), Vector(193.533, 9, 110.488), Vector(219.054, 5.998, 103.970), Vector(219.070, 1.998,
  • 90.657), Vector(235.431, 1.998, 90.539), Vector(229.409, 1.999, 90.044), Vector(237.966, 3.998, 104.629), Vector(226.962,
  • 4.284, 112.037), Vector(219.008, 0.998, 81.327), Vector(177.920, 0.002, 51.147), Vector(196.386, 16.500, 51.909), Vector(
  • 196.295, 16.500, 46.848), Vector(208.835, 16.500, 47.146));
  • Global.edges = Array(Array(1, 43), Array(0, 2, 6, 43), Array(1, 3), Array(2, 4, 44), Array(45), Array(14, 45), Array(1, 7), Array(
  • 6, 8), Array(7, 9), Array(8, 10, 27, 29), Array(9, 11), Array(10, 12), Array(3, 11, 13), Array(12, 14, 16, 27, 29), Array(1, 3,
  • 13, 15, 16), Array(14, 16), Array(13, 14, 15, 17, 18, 24, 26), Array(16, 18, 24, 26), Array(16, 17, 19), Array(18, 20), Array(
  • 17, 19, 21), Array(20, 22), Array(21, 23, 40), Array(22, 24, 25, 38), Array(16, 17, 23), Array(6, 23, 26), Array(16, 17, 25),
  • Array(9, 13, 28, 29), Array(1, 27, 29), Array(9, 13, 27, 28, 30), Array(29, 31, 33, 34, 36), Array(30, 32, 34), Array(31, 38),
  • Array(9, 30, 34), Array(30, 31, 33, 35, 37), Array(34, 36), Array(30, 35), Array(34, 38, 41), Array(37, 39, 40, 43), Array(38,
  • 40, 41), Array(38, 39), Array(37, 39, 42), Array(35, 41), Array(0, 1, 38), Array(3), Array(3, 5, 15, 16, 46), Array(45, 47),
  • Array(17, 19, 46));
  • Global.distance_matrix = Array(Custom String(
  • "012346234567877667789!9878767655654563233451456710123512345676655667898767656555654563233451345621012423456765544556787656567666"),
  • Custom String(
  • "76567434456223453210133456765443344567654545656787677545567312345432025665654332233456543434545676676656678531233232303454543212"),
  • Custom String(
  • "23345654343343456556554556733123212346012345656667789!98787454567656643445624567323457101234545656678987676343456556554556735678"),
  • Custom String(
  • "43456821012343454556787656523234544545566674678943445732101232343445676545412123433434566564567854434643210123454556787656523234"),
  • Custom String(
  • "54454567767545675432355432101234344567654543434565565667778534564321244543210123233456543432323454454556667423453232353432321012"),
  • Custom String(
  • "12234543232121234334344555633456212124234343210112234543232232345445443445622345323235345454321012234543232343456556554556733456"),
  • Custom String(
  • "32323534434321110112343212123234544544344563345643434634545432221012343212134345655654344564456743434645545432221101234323234345"),
  • Custom String(
  • "65565545567445675454575665654333221012343434545676676655467556785454574565654333212101232324545676676544356556785565684566765444"),
  • Custom String(
  • "32321012333565667656743324546789445568345676544433432101223565556545632213436789334457234565433322343210112454445434521223425678"),
  • Custom String(
  • "43434634545432221123432102234345654553233453456732345712345543332234432120145455654563233453567843434623445432221123443221034345"),
  • Custom String(
  • "65565434456445673233463321232123233456543430112343343445556345672123462332343234344567654541012343343434456245673233463321232123"),
  • Custom String(
  • "23345654343110123223234554534567434457443234323434456765454221012112123443445678445568554345434545567876565332101212222333436789"),
  • Custom String(
  • "33456845545654565667898767644321032332122342678954556843212343454556787656523212301222344344678944556854323443454556787656533211"),
  • Custom String(
  • "210121233233678955667965434554565667898767644322321012344344789!5455685543454345455678765653321232210345545567893345684543455456"),
  • Custom String(
  • "56678987676443223212301221226789223457345456656767789!9878755433432341011231567833456845656776787889!?!9898665445433421011226789"),
  • Custom String(
  • "33456845656776787889!?!9898665445434521102326789445679565456656767789!9878755433432231212013789!55678!665456656767789!9878755433"),
  • Custom String(
  • "43212232310489!?112346234567767667789!987876654454345212234045674321244567876554455678765656767898788656678403454321214554543221"),
  • Custom String(
  • "12234543232343456556554556742012543232566565433222323454343454567667665667853101544343456565433321212343232454567667654556754210"));
  • Global.elevator_nodes = Empty Array;
  • If(Global.gamemode == 0);
  • Global.iv_dom_objective_all_pos_list = Array(Vector(206.094, 2, 77.597), Vector(232.886, 4, 93.877), Vector(230.416, 6, 107.918),
  • Vector(193.307, 11, 113.551), Vector(180.089, 11, 101.823), Vector(205.915, 11.043, 93.960), Vector(168.798, 7, 81.112),
  • Vector(173.483, 9, 57.292), Vector(189.454, 5, 56.301), Vector(196.295, 18.500, 68.985), Vector(206.485, 10, 51.593), Vector(
  • 206.259, 10.999, 81.079), Vector(218.594, 10, 85.339), Vector(224.043, 3, 78.247), Vector(182.628, 3, 83.080));
  • Else If(Global.gamemode == 2);
  • Global.iv_dom_objective_all_pos_list = Array(Array(Vector(201.832, 8, 52.598), Vector(218.700, 8, 82.857), 47, 23), Array(Vector(
  • 188.463, 3, 54.695), Vector(173.555, 6.997, 65.855), 14, 10), Array(Vector(192.951, 9, 112.137), Vector(168.563, 5, 81.053),
  • 35, 9), Array(Vector(205.608, 0.039, 81.423), Vector(232.253, 2, 97.003), 28, 39), Array(Vector(206.304, 9, 81.776), Vector(
  • 185.063, 1, 82.814), 25, 7));
  • End;
  • Global.player_spawn_pos = Vector(181.974, 9, 96.862);
  • Global.player_spawn_facing = Forward;
  • Global.ability_shop_pos = Vector(182.587, 8.998, 105.229);
  • Global.buy_menu_left_up_forward[2] = Forward;
  • Global.buy_menu_cam_pos = 900 * Up;
  • }
  • }
  • rule("Subroutine (Set Map EW): Set Spawns, Nodes, Edges, Distance Matrix, Ability Buy Location")
  • {
  • event
  • {
  • Subroutine;
  • set_map_ew;
  • }
  • actions
  • {
  • Global.spawn_pos_list = Array(Vector(99.806, 12.723, -108.402), Vector(54.055, 10.723, -115.912), Vector(52.057, 17.723, -109.532),
  • Vector(51.713, 18.046, -82.890), Vector(52.493, 21.003, -69.445), Vector(36.679, 5.250, -52.802), Vector(30.215, 8, -85.795),
  • Vector(61.927, 4.723, -81.784), Vector(32.892, 14, -78.789), Vector(98.143, 12.666, -73.382));
  • Global.spawn_nearest_node_idx_list = Array(5, 11, 18, 29, 28, 42, 39, 32, 38, 2);
  • Global.nodes = Array(Vector(86.505, 12.672, -75.755), Vector(87.478, 12.653, -70.655), Vector(103.264, 12.673, -73.868), Vector(
  • 104.342, 12.723, -78.811), Vector(103.695, 9.688, -88.593), Vector(97.549, 12.723, -102.052), Vector(94.297, 12.723, -115.785),
  • Vector(75.208, 10.696, -109.414), Vector(79.130, 12.684, -98.634), Vector(90.447, 12.723, -102.776), Vector(73.245, 10.723,
  • -115.295), Vector(56.311, 10.723, -113.914), Vector(58.402, 10.723, -105.348), Vector(53.562, 10.723, -104.142), Vector(54.332,
  • 10.551, -97.113), Vector(63.862, 11.748, -96.187), Vector(38.177, 10.751, -98.237), Vector(36.836, 12.723, -105.563), Vector(
  • 55.695, 17.723, -110.496), Vector(58.013, 17.723, -103.980), Vector(60.460, 18.725, -93.254), Vector(61.935, 18.037, -86.564),
  • Vector(65.689, 12.723, -73.971), Vector(67.991, 12.723, -70.230), Vector(72.340, 12.660, -70.972), Vector(75.738, 12.658,
  • -66.101), Vector(67.835, 15.919, -62.500), Vector(67.050, 17.786, -68.322), Vector(56.104, 21.003, -65.845), Vector(54.848,
  • 18.046, -81.696), Vector(55.558, 6.723, -67.608), Vector(59.393, 6.723, -75.771), Vector(58.796, 4.723, -84.443), Vector(
  • 67.154, 4.723, -83.147), Vector(54.552, 6.723, -105.074), Vector(48.913, 5.890, -66.823), Vector(40.931, 7.889, -88.318),
  • Vector(33.021, 9.934, -92.812), Vector(30.337, 14, -81.804), Vector(30.135, 8, -80.081), Vector(39.580, 6.098, -72.036),
  • Vector(41.743, 5.009, -64.596), Vector(35.659, 5.250, -56.594), Vector(38.405, 5.250, -48.059), Vector(43.730, 5.238, -49.873),
  • Vector(58.180, 11.702, -59.105), Vector(56.272, 11.723, -73.617), Vector(54.887, 11.513, -87.055), Vector(58.454, 10.916,
  • -88.415), Vector(47.377, 11.621, -85.244), Vector(49.189, 11.493, -76.809));
  • Global.edges = Array(Array(1, 3, 8, 25), Array(0, 2, 25), Array(1, 3), Array(0, 2, 4), Array(3, 5), Array(4, 6, 9), Array(5, 7, 9),
  • Array(6, 8, 10, 34), Array(0, 7, 9, 15), Array(5, 6, 8), Array(7, 11), Array(10, 12), Array(11, 13), Array(12, 14), Array(13,
  • 15, 16, 36, 40, 48), Array(8, 14, 33, 36, 48), Array(14, 17, 34, 37), Array(16, 18), Array(17, 19), Array(7, 16, 18, 20),
  • Array(14, 15, 19, 21), Array(20, 22, 29), Array(21, 23, 46), Array(22, 24, 30), Array(23, 25, 33), Array(0, 1, 24, 26), Array(
  • 25, 27, 45), Array(26, 28, 29), Array(27, 41), Array(21, 27, 50), Array(23, 31, 35), Array(30, 32), Array(31, 33, 34), Array(
  • 32), Array(7, 16, 32), Array(30, 36, 40, 41), Array(14, 15, 35, 37, 38, 39, 40), Array(16, 36), Array(36), Array(36, 40),
  • Array(14, 35, 36, 39, 41), Array(35, 40, 42, 44), Array(41, 43), Array(42, 44), Array(41, 43, 45), Array(44, 46), Array(22, 45,
  • 47, 50), Array(14, 46, 48, 49), Array(14, 15, 47), Array(36, 47, 50), Array(40, 46, 49));
  • Global.distance_matrix = Array(Custom String(
  • "01212332123454324567654321234445433434444565434435510123443234565435677654321234445434545555565434546521012344345676546788765432"),
  • Custom String(
  • "34555654565666667654565761210123323456543567876543234555654454555567654554662321012332456654567887654345666655465666678765665773"),
  • Custom String(
  • "43210122134554345678876545677654435455556787665467344321012123454334567876545677543425445556787665467234332101212343223456765434"),
  • Custom String(
  • "56643231433444567655435612323221012343213456765432345544322323333456544324523432112103454324567876543456655433434444567655435634"),
  • Custom String(
  • "54432123012343345678765456775434254455567876654674565543234101234456788776567886545354555456767654675676654345210123345677667678"),
  • Custom String(
  • "98565444344434565654356456565543432101223456655656787454333233323454543245345454432343210112345544545676343222122212343432134234"),
  • Custom String(
  • "34332123432102345654443456633213212222345443213445655432343432120123455565678643231321332345454324556766543454543231012345676767"),
  • Custom String(
  • "55434243244345656543564565543234345433210123456565646544354355456766554653454432123234322121012345454535433243244345655443543454"),
  • Custom String(
  • "54322334321123210123444342443233233323454433243456565433445432234321012343231344344344434554323332445566544556543345432101234342"),
  • Custom String(
  • "23435345543454321233233445665456765445654321012345312324234443345432344322334554345676544565432101234423213345554455433455411223"),
  • Custom String(
  • "44323456543567654321012333432444555545432344542233455434566544566543332101224543545665434321234433344566545676544565432343210114"),
  • Custom String(
  • "55463455432343234532445567765676543445654344432102345552344321232345443445566544556543345432123432120455453344323454323421445566"),
  • Custom String(
  • "54455654334565432123456401233123332234343445455666543454565443456543234567510122234443345454556545655432343454342345654345678621"),
  • Custom String(
  • "01134355445656554665676654345456545345676545678973210245466556767665773454432123234323123456545456773212043244345656543564565655"),
  • Custom String(
  • "43455432234565432345675123340122211232344355345454432344321123456543445676233231011112343443245456565433445432212345654556787343"),
  • Custom String(
  • "32210222345455435645656554345543223456765455678734434212022345455435645656554345543223456765455678734434212201234345435645656554"),
  • Custom String(
  • "34543212234565434567862343311221012323432455676766545654323345665434567862344412332101212343546787877656765434456776545678973455"),
  • Custom String(
  • "52344321012345465789898876787654556776545678786456663455432101234554678787765676543445665434567675345552344321210123443667787765"),
  • Custom String(
  • "67654344565432345656445655345543232101233255667665456543233454321234545334544334432343210122145656554345432122345432345656445433"),
  • Custom String(
  • "32333234432101123454544323443211234554345456754432332333234543210234565655434554322345654345566753443421222234543212015676766545"),
  • Custom String("65432334554323456564345442233212343212310"));
  • Global.elevator_nodes = Empty Array;
  • If(Global.gamemode == 0);
  • Global.iv_dom_objective_all_pos_list = Array(Vector(101.732, 14.723, -109.329), Vector(83.669, 14.683, -86.756), Vector(55.788,
  • 12.723, -119.499), Vector(59.561, 20.723, -96.611), Vector(53.607, 20.046, -80.042), Vector(64.193, 17.784, -61.084), Vector(
  • 44.325, 7.404, -68.614), Vector(32.017, 15.824, -84.229), Vector(58.094, 6.723, -90.953), Vector(55.436, 12.271, -93.743));
  • Else If(Global.gamemode == 2);
  • Global.iv_dom_objective_all_pos_list = Array(Array(Vector(31.954, 14, -79.634), Vector(55.397, 11.723, -76.938), 38, 46), Array(
  • Vector(43.910, 5.515, -70.080), Vector(58.686, 4.723, -91.432), 50, 32), Array(Vector(68.828, 12.526, -98.144), Vector(97.736,
  • 12.723, -108.699), 20, 6), Array(Vector(86.472, 12.671, -75.781), Vector(58.357, 6.723, -73.623), False, 31), Array(Vector(
  • 54.140, 18.044, -81.604), Vector(56.736, 10.723, -115.180), 29, 11));
  • End;
  • Global.player_spawn_pos = Vector(59.081, 21.001, -65.527);
  • Global.player_spawn_facing = Vector(-0.746, False, -0.666);
  • Global.ability_shop_pos = Vector(54.290, 21.003, -69.853);
  • Global.buy_menu_left_up_forward[2] = Forward;
  • Global.buy_menu_cam_pos = 900 * Up;
  • Create Effect(All Players(All Teams), Ring, Color(Green), Vector(36.793, 8.083, -85.948), 1.500, Visible To);
  • Create Effect(All Players(All Teams), Sparkles, Color(Green), Vector(36.793, 8.083, -85.948), 1.500, Visible To);
  • }
  • }
  • rule("Subroutine (Set Map KZ): Set Spawns, Nodes, Edges, Distance Matrix, Ability Buy Location")
  • {
  • event
  • {
  • Subroutine;
  • set_map_kz;
  • }
  • actions
  • {
  • Global.spawn_pos_list = Array(Vector(-44.374, 13, -24.060), Vector(-18.848, 7.010, -51.298), Vector(9.570, 7, -30.631), Vector(
  • 13.187, 9, 1.367), Vector(-16.009, 6.003, 17.628), Vector(-10.628, 10, 35.953), Vector(-48.612, 9, -1.421), Vector(-28.339, 10,
  • -28.557), Vector(-17.588, 6, -32.870), Vector(-16.627, 10.500, 19.926));
  • Global.spawn_nearest_node_idx_list = Array(40, 8, 13, 16, 48, 24, 35, 58, 62, 84);
  • Global.nodes = Array(Vector(-57.745, 11, -23.567), Vector(-64.493, 12, -23.469), Vector(-64.793, 12, -28.813), Vector(-56.606, 11,
  • -35.530), Vector(-50.409, 11, -37.201), Vector(-48.527, 11, -42.566), Vector(-41.002, 9, -52.924), Vector(-31.274, 7, -48.636),
  • Vector(-15.430, 7.010, -52.978), Vector(-9.183, 7, -48.948), Vector(-0.679, 9, -46.717), Vector(6.245, 8, -42.850), Vector(
  • 14.043, 8, -35.507), Vector(9.824, 7, -27.191), Vector(10.297, 6, -14.229), Vector(3.864, 6, -9.125), Vector(10.943, 9, 1.543),
  • Vector(4.381, 6, 11.938), Vector(-2.392, 6, 7.376), Vector(-5.553, 5.840, 12.159), Vector(-1.449, 5.840, 16.740), Vector(1.975,
  • 7, 21.756), Vector(-9.348, 9.976, 26.746), Vector(-11.187, 10, 32.880), Vector(-11.105, 10, 38.915), Vector(-6.826, 10,
  • 33.262), Vector(-5.953, 8, 43.956), Vector(-15.581, 6, 43.905), Vector(-15.745, 6, 39.415), Vector(-31.815, 4, 40.056), Vector(
  • -32.350, 5.840, 32.238), Vector(-44.337, 6, 32.421), Vector(-52.857, 8, 32.452), Vector(-51.537, 8, 21.301), Vector(-54.296, 8,
  • 9.628), Vector(-49.831, 9.094, 1.211), Vector(-49.397, 9, -5.901), Vector(-52.609, 11, -13.299), Vector(-57.902, 11, -13.920),
  • Vector(-50.515, 13, -23.434), Vector(-44.526, 13, -22.963), Vector(-44.331, 11, -12.532), Vector(-29.495, 10.908, -9.049),
  • Vector(-17.983, 10, -9.776), Vector(-20.945, 10, -0.908), Vector(-28.498, 10, 2.547), Vector(-25.321, 8, 8.752), Vector(
  • -18.776, 5.846, 5.933), Vector(-16.009, 6.003, 17.952), Vector(-10.031, 5.841, 5.090), Vector(-3.238, 6, -8.550), Vector(
  • -2.163, 4.931, -31.039), Vector(2.845, 7, -36.798), Vector(4.657, 7, -24.850), Vector(-15.378, 4.937, -43.494), Vector(-31.746,
  • 7, -44.202), Vector(-37.194, 7, -38.181), Vector(-29.988, 8, -36.736), Vector(-35.582, 9.997, -28.202), Vector(-42.034, 10,
  • -31.379), Vector(-42.982, 11, -35.521), Vector(-24.017, 6.999, -34.551), Vector(-21.081, 6, -30.270), Vector(-12.755, 6,
  • -34.710), Vector(-6.027, 6, -28.599), Vector(-7.447, 6, -20.156), Vector(-13.566, 8, -25.324), Vector(-8.646, 10.046, -30.591),
  • Vector(-12.240, 10.011, -34.166), Vector(-20.360, 10, -27.022), Vector(-21.702, 10, -18.888), Vector(-37.613, 7.005, -21.887),
  • Vector(-24.508, 5.840, -11.737), Vector(-12.319, 6, -12.988), Vector(-33.022, 5.840, -3.182), Vector(-40.508, 7, -6.694),
  • Vector(-40.675, 5.842, 10.985), Vector(-48.897, 8, 9.746), Vector(-25.787, 5.842, 12.430), Vector(-26.369, 5.840, 26.954),
  • Vector(-16.398, 5.840, 26.966), Vector(-45.919, 5.998, 26.509), Vector(-45.327, 6, 21.514), Vector(-26.414, 10.002, 21.726),
  • Vector(-16.097, 11.152, 16.806), Vector(-21.545, 10.819, 13.520), Vector(-9.966, 10.484, 21.888));
  • Global.edges = Array(Array(1, 3, 38, 39), Array(0, 2), Array(1, 3), Array(0, 2, 4, 5), Array(3, 5, 39, 60), Array(3, 4, 6, 56),
  • Array(5, 7), Array(6, 8, 55, 56, 57), Array(7, 9), Array(8, 10, 54), Array(9, 11, 52, 68), Array(10, 12, 52), Array(11, 13),
  • Array(12, 14, 53), Array(13, 15, 50), Array(14, 16, 50, 51, 53), Array(15, 17), Array(16, 18), Array(17, 19), Array(18, 20, 48,
  • 49), Array(19, 21), Array(20, 22), Array(21, 23, 86), Array(22, 24, 25), Array(23, 28), Array(23, 26), Array(25, 27), Array(26,
  • 28), Array(27, 29, 80), Array(28, 30), Array(29, 31, 79, 80), Array(30, 32, 81), Array(31, 33), Array(32, 34, 77, 81, 82),
  • Array(33, 35), Array(34, 36, 77), Array(35, 37, 75), Array(36, 38, 41), Array(0, 37), Array(0, 4, 40), Array(39, 41), Array(36,
  • 37, 40, 42, 71, 75), Array(41, 43, 71, 72, 74), Array(42, 44, 72), Array(43, 45, 72), Array(44, 46), Array(45, 47, 78), Array(
  • 46, 48, 49, 78), Array(19, 47), Array(19, 47, 50, 78), Array(14, 15, 49, 51, 65), Array(15, 50, 52, 54, 64), Array(10, 11, 51,
  • 53), Array(13, 15, 51, 52, 64, 65), Array(7, 9, 51, 55, 61), Array(7, 54, 56, 57), Array(7, 55, 57, 71), Array(7, 55, 56, 58,
  • 61), Array(57, 59, 69, 71), Array(58, 60), Array(4, 59), Array(54, 57, 62), Array(61, 63), Array(62, 64), Array(51, 63, 65),
  • Array(50, 64, 66, 73), Array(65, 67), Array(51, 64, 66, 68), Array(10, 54, 61, 67, 69), Array(58, 68, 70), Array(69, 71, 72,
  • 73), Array(56, 70, 72, 75), Array(71, 73, 74), Array(65, 72), Array(72, 75, 76), Array(36, 71, 74, 76), Array(74, 75, 77, 78),
  • Array(33, 35, 76), Array(47, 49, 76, 79), Array(30, 78, 80, 81), Array(28, 30, 79), Array(31, 79, 82), Array(33, 81, 83),
  • Array(78, 79, 82, 84), Array(83, 85, 86), Array(47, 78, 84), Array(22, 84));
  • Global.distance_matrix = Array(Custom String(
  • "012122345678998789989!?#$#?!998876543211234567878776785434543567778876545654556787789!!101233456789!!989!!9!?#$%$#?!!99876543223"),
  • Custom String(
  • "4567898988789654565467888998765676566789889!??210122345678998789!9!?#$%$#?!!9!98765433456789989876785434543567778876545665677899"),
  • Custom String(
  • "9!?##121011234567887678989!?#$#?!99898765432234567887876567432343245666776543455456678889!??232101234567887678989!?#$#?!99898765"),
  • Custom String(
  • "443123456787876567432332145666765443455456678889!??2321101234567765678789!?#?!98878766544323456787676545632123323455566543234434"),
  • Custom String(
  • "55677789!!3432210123456765678789!?##?!99898776554345678987865456322234334556765443455456678889!??45433210123456545676789!??!9887"),
  • Custom String(
  • "876654554567898767543452111234234456543323443455677789!!56544321012345545676789!???!99898776566567899876754334222234534545543443"),
  • Custom String(
  • "455456678889!?!676554321012344345656789!!!988789887677678998765643223123345623434432344556567567789!?9787665432101234345656789!!"),
  • Custom String(
  • "!988789887678788998765643212234334523433321234445567567789!?9898776543210123345656789!!!988789898789899!987656432123454456344334"),
  • Custom String(
  • "32345546667567789!?99!9887654321012345656789!!!98878989889!9!!!98765643322456556745433443456546767567789!?9898776545432101234545"),
  • Custom String(
  • "6789998776787877898999876545322213455678443223445654356564566789!889877654544321012343456788876656767667889887654342123234556784"),
  • Custom String(
  • "54323456654355453455678977876654343333210123345678887665676766787888765434211212344567343223445654355453455678978987765454444321"),
  • Custom String(
  • "012345678898776787877898999876544322323455678454334556765466564566788979!98876565555432101234567788776787877899!9987654333343456"),
  • Custom String(
  • "6789565445667876566564566787869!!998767666654321012345667766567676678!98876543223454567789!6765456787665554534556767589988765655"),
  • Custom String(
  • "55433321012345566554565655679877654321123444566789565434567655444342344565649!!998767666654443210123445656567676678!988765432234"),
  • Custom String(
  • "55567789!67654567876655545345565453!??!!9878777765554321012334545677677789?!998765433456667889!?78765678987766656455654342!?#??!"),
  • Custom String(
  • "989888876665432101223434566567789?!99876544456777889!?#89876789987776656444543231?#$##?!9!99998777654321011232345667889!#?!!9876"),
  • Custom String(
  • "5556788899!?#$9!98789!!98887767543554342!?#?#?!9!999987787654321023212345677789?!9!987656567888989!?#9!98789!987786656432455453#"),
  • Custom String(
  • "$%$$#?!?!!!!988876543212012345677899!?$#??!98766678999!!?#$%!?!989!??!9998878654665453?#$#$#?!?!!!!9889876543231012345678889!#?!"),
  • Custom String(
  • "?!98767678999!9!?#$!?!989!?!98897767543566564!?#?#?!9!999987788766543421012345677789?!9!987656567888989!?#9!98789!98778665643245"),
  • Custom String(
  • "66759!?!?!989888876677656654532101234566678!9898765454567778789!?898767898766755453213456769!?!?!9898888766776567656432101234566"),
  • Custom String(
  • "78!9898765454567778789!?8987678987667554532234567789!9!9878777765566545676754321012345567987876543434566676789!78765678765564434"),
  • Custom String(
  • "21123456689!9!!98988887667765676786543210123456798788765454567778789!?8987678987667554332212345578989987899998778876776787654321"),
  • Custom String(
  • "0123456876788765656788876789!899878987655644324332234556787887678888766776566567765443210123457656776545456777656789788767876544"),
  • Custom String(
  • "53321323112344567677767889987788767767887655432101234654567765656788765678878987887654564332434223455456566656778876677656778998"),
  • Custom String(
  • "766543210123543456654545677654567767876776543453221345334566345455545667876677656789!9876655432101243234565454567754345665676566"),
  • Custom String(
  • "543234212234544567723434454566788778876789!?!98776654321013212345656566785434565567656654323432334565567881232334567789988998789"),
  • Custom String(
  • "!?#?!9887765432102323456767677896545654678767765434543445676678991232123456789987898789!?#?!988787654332012345676767678543443256"),
  • Custom String(
  • "7767765434543455677789!!23432344566788778876789!?!987767654322310123456565667854345435676566543234323445666789934543443455677667"),
  • Custom String(
  • "7656789!98766565432112210123454545567432345445654554321232123345556788456545434556765567656789!987665654432233210123445445664323"),
  • Custom String(
  • "4554554345432112122334555678856765654566776556776789!?!9877676554334432101234554566543456656543455432122334456667899678766545667"),
  • Custom String(
  • "765567656789!9876656656544554321012344456654345675654345543212233434556789978987765677776556654567898765545656555665432101233456"),
  • Custom String(
  • "66545678676545665432334342344567887898887676666544554345678765443454544567654321012234555656789676545676543433231233456777898876"),
  • Custom String(
  • "5655554334432345677654434545445687654321011234445567895654345665444332312334567689!998767666654443212345667655456565567987654321"),
  • Custom String(
  • "023455566789!6765456776555443423445667578877654544443223321234566654434545445687665432120123334556784543234565443332312334567578"),
  • Custom String(
  • "76654343333211233234567776554565655677877654323101222344567343212345543244342344567866765543232223321234345678887665676766776788"),
  • Custom String(
  • "76543421012123345623212343454435545345567897787665433211223234545678999877678787788789987654532101234445634322332345435656456678"),
  • Custom String(
  • "9!87876654343222121234456789998776787876787889876545321102344567332112334543245564566789!856544321212344323454567899987767877656"),
  • Custom String(
  • "65678876545321230122345123234434434454564566789!8565443212234554345656789!!!9887876654565667887656432341011234234345543323443455"),
  • Custom String(
  • "677789!956544321234566545676789!?!987767655434556567876565434521012342344455432123323445666789956544321234566545676789!??!988787"),
  • Custom String(
  • "6654565667898767543452110123123455432323443455677789!!56543432343456656776789!?!987767655434545567876565544532210122344443212123"),
  • Custom String(
  • "32344566678994543234345456776788789!?#?!9887876654553456788767665564332101345555432323443455677789!!343212345656788789989!?#$#?!"),
  • Custom String(
  • "99898776554234567887877667543321045666654343455456678889!??676554323234554345656789!!!988788776567677898765643234122123401234554"),
  • Custom String(
  • "343455456567789!?978766543434566545676789!???!998998876787889!987675434523323451012345545454656767889!?#!89877654544455434565678"),
  • Custom String(
  • "9!!!988789898789899!98765643234344345621012345565435667567789!?97876654343334432345456789998776787876787889876545321232344567321"),
  • Custom String(
  • "012345543245564566789!8898776545444432234434567888766567676567887876543421233344556743210123443213445345567897898776545434543345"),
  • Custom String(
  • "5456789998776787876788989876545322343454456343210123443245564566789!878766543432344323454567899987767878767878898765453212323433"),
  • Custom String(
  • "45232121012344355564566789!8676554323212344345656789!!!988788776567677898765643223123223412323210123334456567789!?96765454343234"),
  • Custom String(
  • "5545676789!??!9887876654565667898767543342332123234333210122233455677789!!677655434434554456656789!!9877676554345665678765643445"),
  • Custom String(
  • "332323434432332101112234456667899566554323445665567656789!9876656544323465456765454445632123453454344321012212334555678867766543"),
  • Custom String(
  • "4556654456656789!987665654543457656776545434554323456454323443210112233455567887887765455555433455456789998776765654568767876545"),
  • Custom String(
  • "32344443456754321234432102334456667898567676545667765566545678987655454343234654566543434566543456756543455432120112234445677456"),
  • Custom String(
  • "56543455676556654567898765545433212354345654343456643234564565455432123101223444567756767654566665445543456787654434323223465456"),
  • Custom String(
  • "54323234555434567566545654322311011233345665676776567777655665456678876554321212346545665434345666545678677656765433422102342234"),
  • Custom String(
  • "55678787656555543344323456765433234343345765654321212344454567856543456543342212012234566789898767666654455434566754322123344456"),
  • Custom String(
  • "87676543232345556567896765456765445332310112345589!9!9878777765566545665643212123455567987876543434566676789!7876567876556443421"),
  • Custom String(
  • "023456689!9!9878777765566545656765433212234567987876543434566676789!787656787655644332120123447898998787777655665455456665443221"),
  • Custom String(
  • "23456876776543434566676789!78765678765564432223101233789898767666654455434434555433233234456876765432323455565678967654567654453"),
  • Custom String(
  • "32311221012289!9!9878777765566544323445544344345567987765432334566676789!7876567876556443422332101178989876766665445543443455654"),
  • Custom String(
  • "43454544568766543212234555656789676545676544533231233321029!?!?!989888876676543212334545455456678!9887654344567778789!?898767898"),
  • Custom String("76675545334432120"));
  • Global.elevator_nodes = Empty Array;
  • If(Global.gamemode == 0);
  • Global.iv_dom_objective_all_pos_list = Array(Vector(-38.507, 13.076, -10.920), Vector(-28.974, 6, 43.453), Vector(-31.503, 7.840,
  • 26.739), Vector(-26.719, 12.002, 20.539), Vector(-6.265, 7.840, 11.249), Vector(-26.818, 7.842, 13.505), Vector(4.102, 9,
  • -27.173), Vector(-8.438, 12.338, -36.965), Vector(-19.188, 6.928, -44.688), Vector(-50.823, 15, -27.853), Vector(-10.496,
  • 12.485, 22.844), Vector(-35.699, 7.842, 1.479), Vector(-21.574, 12, 0.821));
  • Else If(Global.gamemode == 2);
  • Global.iv_dom_objective_all_pos_list = Array(Array(Vector(-30.544, 10.892, -9.511), Vector(-51.235, 9.001, 0.081), 42, 35), Array(
  • Vector(-29.119, 4, 42.148), Vector(-16.269, 11.152, 17.020), 24, 84), Array(Vector(-15.592, 5.858, 6.264), Vector(10.650, 6,
  • -16.284), 85, 14), Array(Vector(-7.217, 6, -16.764), Vector(-19.378, 6, -29.084), 67, 62), Array(Vector(-38.334, 7.005,
  • -22.510), Vector(-51.122, 13, -27.689), 58, 39));
  • End;
  • Global.player_spawn_pos = Vector(14.037, 9, 1.674);
  • Global.player_spawn_facing = Right;
  • Global.ability_shop_pos = Vector(7.110, 9, 1.632);
  • Global.buy_menu_left_up_forward[2] = Forward;
  • Global.buy_menu_cam_pos = 900 * Up;
  • }
  • }
  • rule("Team 1: Player Damage Automater (+-)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.Damage_Dealt[True] != Event Player.Damage_Dealt[False];
  • }
  • actions
  • {
  • Event Player.Damage_Dealt[True] = Event Player.Damage_Dealt[False];
  • Set Damage Dealt(Event Player, Event Player.Damage_Dealt[True]);
  • }
  • }
  • rule("Team 1: Player HP Automater (+-)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.health_percent[True] != Event Player.health_percent[False];
  • }
  • actions
  • {
  • Event Player.health_percent[True] = Event Player.health_percent[False];
  • Set Max Health(Event Player, Event Player.health_percent[True]);
  • }
  • }
  • rule("Team 1: Player Resistance Automater (+-)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.Damage_Received[True] != Event Player.Damage_Received[False];
  • }
  • actions
  • {
  • Event Player.Damage_Received[True] = Event Player.Damage_Received[False];
  • Set Damage Received(Event Player, Event Player.Damage_Received[True]);
  • }
  • }
  • rule("Team 1: Player Move Speed Automater (+-)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.Move_Speed[True] != Event Player.Move_Speed[False];
  • }
  • actions
  • {
  • Event Player.Move_Speed[True] = Event Player.Move_Speed[False];
  • Set Move Speed(Event Player, Event Player.Move_Speed[True]);
  • }
  • }
  • rule("Team 1: Protect from One-shots if health is over 50%")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Normalized Health(Event Player) >= 0.500;
  • }
  • actions
  • {
  • Set Status(Event Player, Null, Unkillable, 9999);
  • Wait Until(Normalized Health(Event Player) < 0.500, 99999);
  • Wait(0.400, Restart When True);
  • Loop If Condition Is True;
  • Clear Status(Event Player, Unkillable);
  • }
  • }
  • rule("Team 2 CG: Improve Air Movement near Jump Pad")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.is_map_cg == True;
  • (Event Player.nav_idx == 4 || Event Player.nav_idx == 45) == True;
  • Event Player.is_alive == True;
  • Is In Air(Event Player) == True;
  • Event Player.is_using_combat_pathfinding == False;
  • Horizontal Speed Of(Event Player) >= 5;
  • Distance Between(Event Player, Vector(X Component Of(Event Player.nav_pos), Y Component Of(Position Of(Event Player)),
  • Z Component Of(Event Player.nav_pos))) <= 0.500;
  • }
  • actions
  • {
  • Apply Impulse(Event Player, -1 * Direction From Angles(Horizontal Angle From Direction(Velocity Of(Event Player)), 0), 0.001,
  • To World, Cancel Contrary Motion XYZ);
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("All Teams EW: Jump Pad")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.is_map_ew == True;
  • Distance Between(Event Player, Vector(36.793, 8.083, -85.948)) <= 1.500;
  • Has Status(Event Player, Stunned) == False;
  • (Is Dummy Bot(Event Player) ? !Event Player.is_using_combat_pathfinding : Is Button Held(Event Player, Button(Jump))) == True;
  • }
  • actions
  • {
  • Abort If(Is Dead(Event Player));
  • Abort If(Is Dummy Bot(Event Player) && Event Player.nav_idx != 38);
  • Apply Impulse(Event Player, Up, 18, To World, Cancel Contrary Motion XYZ);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Vector(36.793, 8.083, -85.948), 135);
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Subroutine: Update Combatants")
  • {
  • event
  • {
  • Subroutine;
  • update_combatants;
  • }
  • actions
  • {
  • Global.combatants = Filtered Array(All Players(Team 1), Current Array Element.is_combatant);
  • Global.combatants_count = Count Of(Global.combatants);
  • }
  • }
  • rule("Subroutine: Declare Victory")
  • {
  • event
  • {
  • Subroutine;
  • declare_victory;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If(Global.is_victory_declared);
  • Global.is_victory_declared = True;
  • Declare Team Victory(Color(Team 1));
  • }
  • }
  • rule("Subroutine: Play Incoming Sound Twice")
  • {
  • event
  • {
  • Subroutine;
  • play_incoming_sound_twice;
  • }
  • actions
  • {
  • Modify Team Score(Color(Team 1), 1);
  • Wait(0.600, Ignore Condition);
  • Modify Team Score(Color(Team 1), 1);
  • }
  • }
  • rule("Subroutine: Cancel player momentum")
  • {
  • event
  • {
  • Subroutine;
  • Cancel_Momentum;
  • }
  • actions
  • {
  • Apply Impulse(Event Player, -1 * Direction From Angles(Horizontal Angle From Direction(Velocity Of(Event Player)), 0), 0.001,
  • To World, Cancel Contrary Motion XYZ);
  • }
  • }
  • rule("Global (First Wave): Create Mutator Start HUD, Scale Values, Set Level")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.wave_number == False;
  • Is True For Any(Global.combatants, Is Button Held(Current Array Element, Button(Interact)) && Distance Between(
  • Current Array Element, Global.ability_shop_pos) > 2) == True;
  • }
  • actions
  • {
  • Destroy HUD Text(First Of(Global.game_or_mutator_start_huds));
  • Destroy HUD Text(Global.game_or_mutator_start_huds[1]);
  • Enable Built-In Game Mode Music;
  • Global.wave_number = 1;
  • Set Ultimate Charge(Global.combatants, 0);
  • All Players(Team 2).base_tier = 1;
  • Global.enable_normal_spawns = True;
  • Modify Team Score(Color(Team 1), 1);
  • If(Global.gamemode == 2);
  • Global.enable_objective_enemy_spawn = 2;
  • Global.iv_dom_objective_pos = Random Value In Array(Global.iv_dom_objective_all_pos_list);
  • Global.objective_progress = Array(0, 0);
  • Else;
  • Global.enable_objective_enemy_spawn = True;
  • Players In Slot(Global.gamemode, Color(Team 2)).base_tier = -1;
  • }
  • }
  • rule("Global (Next Wave): Revive Players, Scale Values, Set Level, Set Mutators")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 3;
  • Number Of Living Players(Color(Team 2)) == False;
  • }
  • actions
  • {
  • If(Global.wave_number >= 15 && Global.length == 0);
  • Start Rule(declare_victory, Do Nothing);
  • Else If(Global.wave_number >= 22 && Global.length == 1);
  • Start Rule(declare_victory, Do Nothing);
  • End;
  • Global.objective_phase_number = False;
  • Filtered Array(Global.combatants,
  • Current Array Element.downed_start_t && Current Array Element.downed_start_t + 0.100 < Total Time Elapsed)
  • .downed_start_t = False;
  • Big Message(All Players(All Teams), Custom String("Wave cleared!"));
  • Global.money_amount += (Global.wave_number >= 2 ? 30 : 45) + 25 * Global.wave_number;
  • Call Subroutine(set_random_perks);
  • If((Global.is_mutator_mode_enabled && Global.wave_number % 2 == 1) || Global.is_apocalyptic);
  • Skip If(Global.is_hard_mode_enabled || Global.is_apocalyptic, 1);
  • Global.mut_count += 1;
  • Call Subroutine(mut_add_mutator);
  • Skip If(!(Global.is_hard_mode_enabled || Global.is_apocalyptic), 1);
  • Global.mut_count += 1;
  • End;
  • Disable Built-In Game Mode Music;
  • Set Match Time(20);
  • Wait(0.500, Ignore Condition);
  • Wait Until(!Match Time, 99999);
  • Enable Built-In Game Mode Music;
  • Global.wave_number += 1;
  • Global.enable_normal_spawns = True;
  • Modify Team Score(Color(Team 1), 1);
  • If(Global.gamemode == 2);
  • Global.enable_objective_enemy_spawn = 2;
  • Global.hvt_dom_objective_killed_count = False;
  • Global.iv_dom_objective_pos = Random Value In Array(Remove From Array(Global.iv_dom_objective_all_pos_list,
  • Global.iv_dom_objective_pos));
  • Global.objective_progress = Array(0, 0);
  • Else;
  • Global.enable_objective_enemy_spawn = True;
  • End;
  • If(Global.wave_number == 2);
  • Players In Slot(5, Color(Team 2)).base_tier = 2;
  • Players In Slot(6, Color(Team 2)).base_tier = 2;
  • Else If(Global.wave_number == 3);
  • Players In Slot(8, Color(Team 2)).base_tier = 2;
  • Else If(Global.wave_number == 4);
  • Players In Slot(2, Color(Team 2)).base_tier = 3;
  • Players In Slot(3, Color(Team 2)).base_tier = 3;
  • Else If(Global.wave_number == 5);
  • Players In Slot(7, Color(Team 2)).base_tier = 2;
  • Else If(Global.wave_number == 8);
  • Players In Slot(7, Color(Team 2)).base_tier = 3;
  • Else If(Global.wave_number == 9);
  • Players In Slot(4, Color(Team 2)).base_tier = 3;
  • End;
  • Abort If(!Global.mut_expendable);
  • Filtered Array(Players On Hero(Hero(Soldier: 76), Color(Team 2)), Current Array Element.base_tier <= 2).is_expendable = True;
  • }
  • }
  • rule("Global: Enable normal Spawns")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • (Global.objective_phase_number == 1 || Global.objective_phase_number == 2) == True;
  • Global.enable_normal_spawns == False;
  • Number Of Living Players(Color(Team 2)) < Number Of Players(Color(Team 2));
  • }
  • actions
  • {
  • Global.temp_1 = Filtered Array(All Living Players(Color(Team 2)), !Current Array Element.is_living_boss);
  • Global.temp_1 = 2 * Count Of(Filtered Array(Global.temp_1, Current Array Element.real_tier <= 2)) + 5 * Count Of(Filtered Array(
  • Global.temp_1, Current Array Element.real_tier == 3)) + 10 * Count Of(Filtered Array(Global.temp_1,
  • Current Array Element.real_tier == 4));
  • If(Global.temp_1 <= Max(5, Total Time Elapsed - Global.last_spawn_phase_end_t - 25 - 20 * (Count Of(Filtered Array(
  • Global.combatants, Current Array Element.downed_start_t)) / Global.combatants_count)));
  • Wait(((Global.gamemode == 1 && Global.objective_phase_number == 1) || (Global.gamemode == 2 && Is True For Any(All Living Players(
  • Color(Team 2)), Current Array Element.is_living_boss)) ? 11 : 6) - (Global.mut_reinforcements ? 3 : 0), Abort When False);
  • Abort If Condition Is False;
  • Global.enable_normal_spawns = True;
  • Modify Team Score(Color(Team 1), 1);
  • Else;
  • Wait(1, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Global: Disable normal Spawns")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • (Global.objective_phase_number == 1 || Global.objective_phase_number == 2) == True;
  • Global.enable_normal_spawns == True;
  • Number Of Living Players(Color(Team 2)) == Number Of Players(Color(Team 2));
  • }
  • actions
  • {
  • Global.enable_normal_spawns = False;
  • Global.last_spawn_phase_end_t = Total Time Elapsed;
  • }
  • }
  • rule("Global: Defeat")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.wave_number > False;
  • Is True For All(Global.combatants, Current Array Element.downed_start_t) == True;
  • }
  • actions
  • {
  • Wait(2, Abort When False);
  • Abort If(Global.is_victory_declared);
  • Global.is_victory_declared = True;
  • Declare Team Victory(Color(Team 2));
  • }
  • }
  • rule("Global: Anti-crash")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Number Of Players(Color(Team 2)) > 7;
  • Server Load Average >= 255;
  • }
  • actions
  • {
  • Global.is_load_limit_reached = True;
  • If(!Global.is_waiting_to_remove_bot && Global.wave_number);
  • Wait Until(Server Load Average < 255, 4);
  • If(Server Load Average >= 255);
  • Global.is_waiting_to_remove_bot = True;
  • Wait Until(Server Load Average < 255, 99999);
  • End;
  • Else;
  • Wait Until(Server Load Average < 255, 99999);
  • End;
  • Global.is_load_limit_reached = False;
  • }
  • }
  • rule("MUT Subroutine: Add Mutator")
  • {
  • event
  • {
  • Subroutine;
  • mut_add_mutator;
  • }
  • actions
  • {
  • Global.temp_2 = -50 - Count Of(Global.mutators_list);
  • If(Global.mut_count % 5 == 0 && Global.wave_number > False);
  • Big Message(All Players(All Teams), Custom String("Gamechanging Mutator added!"));
  • Global.is_gmut_enabled = True;
  • Global.temp_1 = Random Value In Array(Global.gmut_list);
  • Modify Global Variable(gmut_list, Remove From Array By Value, Global.temp_1);
  • If(Global.temp_1 == 0);
  • Global.gmut_storm_raging = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Storm Raging: Some enemies are enraged, killing them spreads the rage"), Right, Global.temp_2 - 0.500, Null, Null, Color(
  • Orange), Visible To, Default Visibility);
  • Start Damage Modification(Global.combatants, Filtered Array(All Players(Team 2), Current Array Element.gmut_var), 140,
  • Receivers and Damagers);
  • Else If(Global.temp_1 == 1);
  • Global.gmut_creeps = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Creeps: Enemies violently explode upon death, strength scaling by tier"), Right, Global.temp_2 - 0.500, Null, Null, Color(
  • Orange), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 2);
  • Global.gmut_adaptive_shield = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Adaptive Shield: Enemies below 50% HP gain shields for every nearby player"), Right, Global.temp_2 - 0.500, Null, Null, Color(
  • Orange), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 3);
  • Global.gmut_fortified = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Fortified: Enemies resist stuns, knockbacks, and gain extra armour"), Right, Global.temp_2 - 0.500, Null, Null, Color(Orange),
  • Visible To, Default Visibility);
  • Else If(Global.temp_1 == 4);
  • Global.gmut_sympathy_gains = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Sympathy Gains: Enemies heal themselves a small amount when they die"), Right, Global.temp_2 - 0.500, Null, Null, Color(
  • Orange), Visible To, Default Visibility);
  • End;
  • Else If(Count Of(Global.mutators_list));
  • Big Message(All Players(All Teams), Custom String("New Mutator added!"));
  • Global.temp_1 = Random Value In Array(Global.mutators_list);
  • Modify Global Variable(mutators_list, Remove From Array By Value, Global.temp_1);
  • If(Global.temp_1 == 0);
  • Global.mut_amped = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Stampede: Enemies move faster"), Right, Global.temp_2, Null,
  • Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 1);
  • Global.mut_hardwired = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Hardwired: Mechanical enemies gain shields and resist fear & electrocution"), Right, Global.temp_2, Null, Null, Color(Green),
  • Visible To, Default Visibility);
  • Else If(Global.temp_1 == 2);
  • Global.mut_promotion = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Promotion: Higher tier heroes spawn more frequently"), Right,
  • Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 3);
  • Global.mut_advanced_medkit = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Advanced Medkit: Medics can revive tier 4 enemies and have less cooldown"), Right, Global.temp_2, Null, Null, Color(Green),
  • Visible To, Default Visibility);
  • Else If(Global.temp_1 == 4);
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Berserk: Enemies below 50% health deal 25% more damage"), Right,
  • Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Start Damage Modification(Global.combatants, Filtered Array(All Players(Team 2), Normalized Health(Current Array Element)
  • <= 0.500), 125, Receivers and Damagers);
  • Else If(Global.temp_1 == 5);
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Regeneration: Enemies slowly regenerate health"), Right,
  • Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Start Heal Over Time(All Players(Team 2), Null, 9999, 10);
  • Else If(Global.temp_1 == 6);
  • Global.mut_signal_jammer = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Chaff: Grenadier smoke deals damage and disables player outlines and HUD"), Right, Global.temp_2, Null, Null, Color(Green),
  • Visible To, Default Visibility);
  • Else If(Global.temp_1 == 7);
  • Global.mut_emp_rounds = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "EMP Rounds: Enemies deal double damage to barriers and objects"), Right, Global.temp_2, Null, Null, Color(Green), Visible To,
  • Default Visibility);
  • Start Damage Modification(Global.combatants, All Players(Team 2), 50, Receivers and Damagers);
  • Else If(Global.temp_1 == 8);
  • Global.mut_heartburn = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Heartburn: Out-of-combat healing is reduced by 50%"), Right,
  • Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Start Healing Modification(Filtered Array(Global.combatants, (Current Array Element.last_damage_taken_t + (Current Array Element.perk_die_hard ? 0.500 : 1) * (Global.mut_deep_wounds ? 5 : 2.500)
  • < Total Time Elapsed)),
  • Global.combatants, 50, Receivers Healers and Healing Percent);
  • Else If(Global.temp_1 == 9);
  • Global.mut_deep_wounds = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Deep Wounds: Health regeneration delay is doubled"), Right,
  • Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 10);
  • Global.mut_gear_upgrade = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Gear Upgrade: All Troopers are replaced with Heavy Troopers"),
  • Right, Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 11);
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Last Men Standing: The final enemies take 25% less damage"),
  • Right, Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Start Damage Modification(All Players(Team 2), Global.combatants, Global.objective_phase_number == 3 ? 75 : 100, Receivers Damagers and Damage Percent);
  • Else If(Global.temp_1 == 12);
  • Global.mut_reinforcements = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Reinforcements: Enemy spawn rate is increased"), Right,
  • Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 13);
  • Global.mut_mutation = Total Time Elapsed;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Mutation: Some enemies spawn with increased strength and size"),
  • Right, Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 14);
  • Global.mut_expendable = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String("Expendable: Dead Troopers are replaced almost instantly"),
  • Right, Global.temp_2, Null, Null, Color(Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 15);
  • Global.mut_the_calvary = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "The Calvary: Playmakers spawn and drop Pulse Bombs more frequently"), Right, Global.temp_2, Null, Null, Color(Green),
  • Visible To, Default Visibility);
  • Else If(Global.temp_1 == 16);
  • Global.mut_swan_song = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Swan Song: Boss enemies continue fighting for 5 seconds before going down"), Right, Global.temp_2, Null, Null, Color(Green),
  • Visible To, Default Visibility);
  • Else If(Global.temp_1 == 17);
  • Global.mut_bulletproof = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Bulletproof: Tier 2 enemies gain an additional layer of overhealth"), Right, Global.temp_2, Null, Null, Color(Green), Visible To,
  • Default Visibility);
  • Else If(Global.temp_1 == 18);
  • Global.mut_fully_loaded = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Lock N' Load: Enemies can use additional abilities and have a higher clip size"), Right, Global.temp_2, Null, Null, Color(
  • Green), Visible To, Default Visibility);
  • Else If(Global.temp_1 == 19);
  • Global.mut_low_blow = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Low Blow: Enemy knockback attacks double in damage and knockback"), Right, Global.temp_2, Null, Null, Color(Green),
  • Visible To, Default Visibility);
  • Set Knockback Dealt(All Players(Team 2), 200);
  • Else If(Global.temp_1 == 20);
  • Global.mut_artful_dodger = True;
  • Create HUD Text(All Players(All Teams), Null, Null, Custom String(
  • "Artful Dodger: Enemies can dodge attacks more often and easily"), Right, Global.temp_2, Null, Null, Color(Green), Visible To,
  • Default Visibility);
  • End;
  • End;
  • }
  • }
  • rule("Subroutine: Set Random Perks")
  • {
  • event
  • {
  • Subroutine;
  • set_random_perks;
  • }
  • actions
  • {
  • If(Count Of(Global.current_perks_huds_list));
  • Destroy In-World Text(First Of(Global.current_perks_huds_list));
  • Destroy In-World Text(Global.current_perks_huds_list[1]);
  • End;
  • Global.current_perks_huds_list = Empty Array;
  • If(Global.wave_number % 4 == 1);
  • Global.current_perks = Array Slice(Randomized Array(Remove From Array(Array(12, 13), Global.current_perks)), 0, 2);
  • For Global Variable(temp_1, 0, 2, 1);
  • Global.temp_2 = Global.buy_menu_base_pos - (Global.temp_1 ? 25 : 2.500) * Global.buy_menu_left_up_forward[1] - 112.500 * First Of(
  • Global.buy_menu_left_up_forward);
  • If(Global.current_perks[Global.temp_1] == 12);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Hero Talent 1\n $1600"), Global.temp_2, 2.500, Do Not Clip, Visible To String and Color, Local Player.Talent1 ? Color(
  • Gray) : Color(Purple), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 13);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Hero Talent 2\n $1600"), Global.temp_2, 2.500, Do Not Clip, Visible To String and Color, Local Player.Talent2 ? Color(
  • Gray) : Color(Purple), Default Visibility);
  • End;
  • Modify Global Variable(current_perks_huds_list, Append To Array, Last Text ID);
  • End;
  • Else;
  • Global.current_perks = Array Slice(Randomized Array(Remove From Array(Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
  • Global.current_perks)), 0, 2);
  • For Global Variable(temp_1, 0, 2, 1);
  • Global.temp_2 = Global.buy_menu_base_pos - (Global.temp_1 ? 25 : 2.500) * Global.buy_menu_left_up_forward[1] - 112.500 * First Of(
  • Global.buy_menu_left_up_forward);
  • If(Global.current_perks[Global.temp_1] == 0);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Mystery Swap\n  500$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_mystery_swap ? Color(
  • Gray) : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 1);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Bulletstorm\n  1000$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_bulletstorm ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 2);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Die Hard\n 700$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_die_hard ? Color(Gray) : Color(
  • Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 3);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • " Brass Knuckles\n   700$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color,
  • Local Player.perk_brass_knuckles ? Color(Gray) : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 4);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Vampiric\n 1000$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_vampiric ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 5);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Crash N' Dash\n  700$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_crash_n_dash ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 6);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Golden Hour\n   1000$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_golden_hour ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 7);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Supercharge\n 700$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_super_charge ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 8);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Nemesis\n 800$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_nemesis ? Color(Gray) : Color(
  • Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 9);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Spec Ops\n 600$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_special_operator ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 10);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Sharpshooter\n   900$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_sharpshooter ? Color(Gray)
  • : Color(Lime Green), Default Visibility);
  • Else If(Global.current_perks[Global.temp_1] == 11);
  • Create In-World Text(Filtered Array(Global.combatants, Current Array Element.in_buy_menu_start_t), Custom String(
  • "Shockproof\n 700$"), Global.temp_2, 2.500, Do Not Clip, Visible To and Color, Local Player.perk_shockproof ? Color(Gray) : Color(
  • Lime Green), Default Visibility);
  • End;
  • Modify Global Variable(current_perks_huds_list, Append To Array, Last Text ID);
  • End;
  • End;
  • }
  • }
  • rule("Subroutine: Disable Player")
  • {
  • event
  • {
  • Subroutine;
  • disable_player;
  • }
  • actions
  • {
  • Start Forcing Throttle(Event Player, False, False, False, False, False, False);
  • Set Primary Fire Enabled(Event Player, False);
  • Set Secondary Fire Enabled(Event Player, False);
  • Set Ability 1 Enabled(Event Player, False);
  • Set Ability 2 Enabled(Event Player, False);
  • Set Melee Enabled(Event Player, False);
  • Set Jump Enabled(Event Player, False);
  • Set Crouch Enabled(Event Player, False);
  • Disallow Button(Event Player, Button(Ultimate));
  • }
  • }
  • rule("Subroutine: Enable Player")
  • {
  • event
  • {
  • Subroutine;
  • enable_player;
  • }
  • actions
  • {
  • Stop Forcing Throttle(Event Player);
  • Set Primary Fire Enabled(Event Player, True);
  • Set Secondary Fire Enabled(Event Player, True);
  • Set Ability 1 Enabled(Event Player, True);
  • Set Ability 2 Enabled(Event Player, True);
  • Set Melee Enabled(Event Player, True);
  • Set Jump Enabled(Event Player, True);
  • Set Crouch Enabled(Event Player, True);
  • Allow Button(Event Player, Button(Ultimate));
  • }
  • }
  • rule("Subroutine: Open Buy Menu, Last Facing (3)")
  • {
  • event
  • {
  • Subroutine;
  • open_buy_menu;
  • }
  • actions
  • {
  • Abort If(Event Player.downed_start_t || Normalized Health(Event Player) < 0.500 || Has Status(Event Player, Stunned)
  • || Event Player.tased_end_t >= Total Time Elapsed);
  • Apply Impulse(Event Player, -1 * Direction From Angles(Horizontal Angle From Direction(Velocity Of(Event Player)), False), 0.001,
  • To World, Cancel Contrary Motion XYZ);
  • Event Player.ab_var_3 = Facing Direction Of(Event Player);
  • Event Player.in_buy_menu_start_t = Total Time Elapsed;
  • Disable Hero HUD(Event Player);
  • Set Facing(Event Player, Forward, To World);
  • Start Camera(Event Player, Global.buy_menu_cam_pos, Global.buy_menu_cam_pos + Global.buy_menu_left_up_forward[2], 0);
  • Call Subroutine(disable_player);
  • Set Aim Speed(Event Player, 200);
  • }
  • }
  • rule("Subroutine: Leave Buy Menu")
  • {
  • event
  • {
  • Subroutine;
  • leave_buy_menu;
  • }
  • actions
  • {
  • Event Player.in_buy_menu_start_t = False;
  • Enable Hero HUD(Event Player);
  • Set Facing(Event Player, Event Player.ab_var_3, To World);
  • If(!Event Player.downed_start_t);
  • Stop Camera(Event Player);
  • Call Subroutine(enable_player);
  • End;
  • Set Aim Speed(Event Player, 100);
  • }
  • }
  • rule("Team 1 Button: Interact, Open / Leave Buy Menu")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Interact)) == True;
  • }
  • actions
  • {
  • If(Event Player.in_buy_menu_start_t);
  • Call Subroutine(leave_buy_menu);
  • Else If(Distance Between(Event Player, Global.ability_shop_pos) <= 2);
  • Call Subroutine(open_buy_menu);
  • Else If(Event Player.can_use_drop_in_buy_menu || Match Time);
  • Wait(0.400, Abort When False);
  • Call Subroutine(open_buy_menu);
  • End;
  • Wait(0.050, Ignore Condition);
  • }
  • }
  • rule("Team 1: Leave Buy Menu when downed, health low, stunned or tased")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.in_buy_menu_start_t == True;
  • (Event Player.downed_start_t || Normalized Health(Event Player) < 0.500 || Has Status(Event Player, Stunned)
  • || Event Player.tased_end_t >= Total Time Elapsed) == True;
  • }
  • actions
  • {
  • Call Subroutine(leave_buy_menu);
  • Abort If(Normalized Health(Event Player) > 0.400);
  • Set Player Health(Event Player, 0.400 * Max Health(Event Player));
  • }
  • }
  • rule("Team 1: Toggle Show active Ability")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.in_buy_menu_start_t == True;
  • Is Button Held(Event Player, Button(Melee)) == True;
  • }
  • actions
  • {
  • Abort If(Event Player.in_buy_menu_start_t + 0.100 >= Total Time Elapsed);
  • Event Player.is_showing_active_abilities = !Event Player.is_showing_active_abilities;
  • }
  • }
  • rule("Subroutine: Check if enough money")
  • {
  • event
  • {
  • Subroutine;
  • check_if_enough_money;
  • }
  • actions
  • {
  • If(Global.money_mult * Global.money_amount - Event Player.money_spent_amount >= Global.temp_2);
  • Event Player.money_spent_amount += Global.temp_2;
  • Small Message(Event Player, Custom String("Ability unlocked"));
  • Call Subroutine(play_purchase_confirmation_sound);
  • Else;
  • Global.temp_2 = False;
  • Small Message(Event Player, Custom String("Not enough money"));
  • End;
  • }
  • }
  • rule("Subroutine: Buy Active Ability")
  • {
  • event
  • {
  • Subroutine;
  • buy_active_ability;
  • }
  • actions
  • {
  • If(!Event Player.active_ab_number);
  • Global.temp_2 = 1200;
  • Call Subroutine(check_if_enough_money);
  • Abort If(!Global.temp_2);
  • Else If(Global.temp_1 == Event Player.active_ab_number);
  • Abort;
  • Else;
  • Small Message(Event Player, Custom String("Swapped Active Ability"));
  • End;
  • Call Subroutine(remove_active_ability);
  • Event Player.active_ab_number = Global.temp_1;
  • If(Global.temp_1 == 1);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Ana Nano Boosted Effect, Color(
  • Team 1), Event Player, 1, Visible To);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else If(Global.temp_1 == 2);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Reaper Wraith Form Effect, Color(
  • Team 1), Event Player, 1, Visible To);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else If(Global.temp_1 == 4);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array,
  • Baptiste Immortality Field Protected Effect, Color(Team 1), Event Player, 1, Visible To);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else If(Global.temp_1 == 5);
  • Event Player.active_ab_var = 1000 * Down;
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Cloud, Color(Sky Blue),
  • Event Player.active_ab_var + 2 * Up, 10, Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Cloud, Color(Sky Blue),
  • Event Player.active_ab_var + 2 * Down, 10, Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Ring, Color(Sky Blue),
  • Event Player.active_ab_var + Down, 10, Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else If(Global.temp_1 == 6);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Heal Target Active Effect, Color(
  • Team 1), Event Player, 1, Visible To);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else If(Global.temp_1 == 7);
  • Event Player.active_ab_var = 1000 * Down;
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Cloud, Color(Yellow),
  • Event Player.active_ab_var + Up, 8, Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Effect(Event Player.active_ab_cooldown < False ? All Players(All Teams) : Empty Array, Cloud, Color(Yellow),
  • Event Player.active_ab_var + Down, 8, Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else If(Global.temp_1 == 8);
  • Event Player.active_ab_var = Empty Array;
  • Create Beam Effect(Count Of(Event Player.active_ab_var) ? All Players(All Teams) : Empty Array, Bad Beam, Event Player, First Of(
  • Event Player.active_ab_var), Color(Purple), Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Beam Effect(Count Of(Event Player.active_ab_var) > 1 ? All Players(All Teams) : Empty Array, Bad Beam, First Of(
  • Event Player.active_ab_var), Event Player.active_ab_var[1], Color(Purple), Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Beam Effect(Count Of(Event Player.active_ab_var) > 2 ? All Players(All Teams) : Empty Array, Bad Beam,
  • Event Player.active_ab_var[1], Event Player.active_ab_var[2], Color(Purple), Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Beam Effect(Count Of(Event Player.active_ab_var) > 3 ? All Players(All Teams) : Empty Array, Bad Beam,
  • Event Player.active_ab_var[2], Event Player.active_ab_var[3], Color(Purple), Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • End;
  • Call Subroutine(play_purchase_confirmation_sound);
  • }
  • }
  • rule("Subroutine: Remove Active Ability")
  • {
  • event
  • {
  • Subroutine;
  • remove_active_ability;
  • }
  • actions
  • {
  • If(Event Player.active_ab_cooldown < 0);
  • Event Player.active_ab_cooldown = -0.100;
  • End;
  • Destroy Effect(Event Player.active_ab_effect_list);
  • Event Player.active_ab_effect_list = Empty Array;
  • Event Player.active_ab_number = False;
  • }
  • }
  • rule("Subroutine: Update Ability String and Play Sound")
  • {
  • event
  • {
  • Subroutine;
  • update_ab_string_and_play_sound;
  • }
  • actions
  • {
  • Event Player.ab_bought_abilities_string = String Slice(Custom String("{0}{1}{2}", Custom String("{0}{1}{2}", Custom String(
  • "{0}{1}{2}", Array(Custom String(""), Custom String("\nPriority A"), Custom String("\nPriority B"), Custom String(
  • "\nPriority C"))[Event Player.ab_priority], Array(Custom String(""), Custom String("\nHeadhunter I"), Custom String(
  • "\nHeadhunter II"))[Event Player.ab_headhunter], Array(Custom String(""), Custom String("\nAntigens I"), Custom String(
  • "\nAntigens II"))[Event Player.ab_antigens]), Custom String("{0}{1}{2}", Array(Custom String(""), Custom String(
  • "\nQuick Fix I"), Custom String("\nQuick Fix II"))[Event Player.ab_quick_fix], Array(Custom String(""), Custom String(
  • "\nCharged I"), Custom String("\nCharged II"))[Event Player.ab_charged], Array(Custom String(""), Custom String("\nHaste I"),
  • Custom String("\nHaste II"))[Event Player.ab_haste]), Custom String("{0}{1}{2}", Array(Custom String(""), Custom String(
  • "\nHeavy Impact I"), Custom String("\nHeavy Impact II"))[Event Player.ab_heavy_impact], Array(Custom String(""), Custom String(
  • "\nSecond Wind I"), Custom String("\nSecond Wind II"))[Event Player.ab_second_wind], Array(Custom String(""), Custom String(
  • "\nTriage I"), Custom String("\nTriage II"))[Event Player.ab_triage])), Custom String("{0}{1}{2}", Custom String("{0}{1}{2}",
  • Array(Custom String(""), Custom String("\nResilience I"), Custom String("\nResilience II"))[Event Player.ab_resilience],
  • Event Player.perk_mystery_swap ? Custom String("\nMystery Swap") : Custom String(""),
  • Event Player.perk_bulletstorm ? Custom String("\nBulletstorm") : Custom String("")), Custom String("{0}{1}{2}",
  • Event Player.perk_die_hard ? Custom String("\nDie Hard") : Custom String(""), Event Player.perk_brass_knuckles ? Custom String(
  • "\nBrass Knuckles") : Custom String(""), Event Player.perk_vampiric ? Custom String("\nVampiric") : Custom String("")),
  • Custom String("{0}{1}{2}", Event Player.perk_crash_n_dash ? Custom String("\nCrash N' Dash") : Custom String(""),
  • Event Player.perk_golden_hour ? Custom String("\nGolden Hour") : Custom String(""), Event Player.perk_super_charge ? Custom String(
  • "\nSupercharge") : Custom String(""))), Custom String("{0}{1}{2}", Custom String("{0}{1}{2}",
  • Event Player.perk_nemesis ? Custom String("\nNemesis") : Custom String(""), Event Player.perk_special_operator ? Custom String(
  • "\nSpec Ops") : Custom String(""), Event Player.perk_sharpshooter ? Custom String("\nSharpshooter") : Custom String("")),
  • Custom String("{0}{1}{2}", Event Player.perk_shockproof ? Custom String("\nShockproof") : Custom String(""), Custom String(
  • "{0}{1}{2}", Event Player.Talent1 ? Custom String("\n{0} {1}", Ability Icon String(Hero(Pharah), Button(Jump)),
  • Event Player.talent_text[1]) : Custom String(""), Event Player.Talent2 ? Custom String("\n{0} {1}", Ability Icon String(Hero(
  • Pharah), Button(Jump)), Event Player.talent_text[3]) : Custom String(""), Event Player.ab_health_bonus ? Custom String(
  • "\n+{0}% Health", Event Player.ab_health_bonus) : Custom String("")), Event Player.ab_damage_bonus ? Custom String(
  • "\n+{0}% Damage", Event Player.ab_damage_bonus) : Custom String("")), Event Player.ab_healing_bonus ? Custom String(
  • "\n+{0}% Healing", Event Player.ab_healing_bonus) : Custom String(""))), 1, 511);
  • }
  • }
  • rule("Subroutine: Play Purchase Confirmation Sound")
  • {
  • event
  • {
  • Subroutine;
  • play_purchase_confirmation_sound;
  • }
  • actions
  • {
  • Play Effect(Event Player, Buff Explosion Sound, Color(White), Global.buy_menu_cam_pos, 200);
  • }
  • }
  • rule("Team 1: Buy Ability")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.in_buy_menu_start_t == True;
  • Is Button Held(Event Player, Button(Primary Fire)) == True;
  • }
  • actions
  • {
  • Abort If(Event Player.in_buy_menu_start_t + 0.100 >= Total Time Elapsed || Absolute Value(Horizontal Facing Angle Of(Event Player))
  • >= 135 || Absolute Value(Vertical Facing Angle Of(Event Player) + 11.250)
  • >= 45 || Event Player.tased_end_t >= Total Time Elapsed);
  • "Grid coordinates of selected panel"
  • Global.temp_1 = Array(Round To Integer((Horizontal Facing Angle Of(Event Player) + 135) / 45, Down), Round To Integer((
  • Vertical Facing Angle Of(Event Player) + 56.250) / 22.500, Down));
  • If(Global.temp_1[1] == 0);
  • If(First Of(Global.temp_1) <= 1);
  • Call Subroutine(leave_buy_menu);
  • Else If(First Of(Global.temp_1) <= 3);
  • Event Player.is_showing_active_abilities = !Event Player.is_showing_active_abilities;
  • Else;
  • If(Event Player.money_spent_amount);
  • Call Subroutine(remove_active_ability);
  • Event Player.money_spent_amount = False;
  • Event Player.ab_headhunter = False;
  • Event Player.ab_quick_fix = False;
  • Event Player.ab_charged = False;
  • Event Player.ab_heavy_impact = False;
  • Event Player.ab_second_wind = False;
  • Event Player.ab_triage = False;
  • If(Event Player.ab_resilience);
  • Event Player.ab_resilience = False;
  • Event Player.Damage_Received += 20;
  • End;
  • Set Knockback Dealt(Event Player, 100);
  • Set Knockback Received(Event Player, 100);
  • Event Player.ab_antigens = False;
  • Stop Healing Modification(Event Player.heal_mod[1]);
  • Stop Heal Over Time(Event Player.heal_mod[2]);
  • Stop Damage Modification(Event Player.damage_mod[11]);
  • Stop Damage Modification(Event Player.damage_mod[12]);
  • Event Player.ab_haste = False;
  • Event Player.ab_priority = False;
  • Event Player.health_percent -= Event Player.ab_health_bonus;
  • Event Player.ab_health_bonus = False;
  • Event Player.Damage_Dealt -= Event Player.ab_damage_bonus;
  • Event Player.ab_damage_bonus = False;
  • Event Player.healing_dealt_percent -= Event Player.ab_healing_bonus;
  • Event Player.ab_healing_bonus = False;
  • Event Player.perk_bulletstorm = False;
  • Event Player.perk_die_hard = False;
  • Event Player.perk_brass_knuckles = False;
  • Event Player.perk_vampiric = False;
  • Event Player.perk_crash_n_dash = False;
  • Event Player.perk_golden_hour = False;
  • Event Player.perk_super_charge = False;
  • If(Event Player.perk_nemesis);
  • Destroy Effect(Event Player.nemesis_beam_effect);
  • Event Player.perk_nemesis = False;
  • End;
  • If(Event Player.perk_special_operator);
  • Remove Health Pool From Player(Event Player.HP_Pool[2]);
  • Event Player.perk_special_operator = False;
  • End;
  • Event Player.perk_sharpshooter = False;
  • Stop Damage Modification(Event Player.damage_mod[10]);
  • Event Player.Talent1 = False;
  • Event Player.Talent2 = False;
  • If(Event Player.perk_mystery_swap);
  • Event Player.health_percent -= 20;
  • Event Player.Damage_Dealt -= 20;
  • Event Player.healing_dealt_percent -= 20;
  • Stop Forcing Player To Be Hero(Event Player);
  • Event Player.perk_mystery_swap = False;
  • End;
  • If(Event Player.perk_shockproof);
  • Enable Movement Collision With Players(Event Player);
  • Event Player.Move_Speed -= 15;
  • Wait(0.016, Ignore Condition);
  • Event Player.perk_shockproof = False;
  • End;
  • Set Healing Dealt(Event Player, Event Player.healing_dealt_percent);
  • Small Message(Event Player, Custom String("Money Refunded"));
  • Call Subroutine(update_ab_string_and_play_sound);
  • Abort;
  • End;
  • End;
  • Else;
  • If(First Of(Global.temp_1) == 0);
  • If(Global.temp_1[1] >= 2);
  • Global.temp_2 = Global.current_perks[Global.temp_1[1] >= 3];
  • If(Global.temp_2 == 0);
  • If(!Event Player.perk_mystery_swap);
  • Global.temp_2 = 500;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.health_percent += 20;
  • Event Player.Damage_Dealt += 20;
  • Event Player.healing_dealt_percent += 20;
  • Set Healing Dealt(Event Player, Event Player.healing_dealt_percent);
  • Event Player.perk_mystery_swap = Total Time Elapsed + 75;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 1);
  • If(!Event Player.perk_bulletstorm);
  • Global.temp_2 = 1000;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_bulletstorm = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 2);
  • If(!Event Player.perk_die_hard);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_die_hard = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 3);
  • If(!Event Player.perk_brass_knuckles);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_brass_knuckles = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 4);
  • If(!Event Player.perk_vampiric);
  • Global.temp_2 = 1000;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_vampiric = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 5);
  • If(!Event Player.perk_crash_n_dash);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_crash_n_dash = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 6);
  • If(!Event Player.perk_golden_hour);
  • Global.temp_2 = 1000;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_golden_hour = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 7);
  • If(!Event Player.perk_super_charge);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_super_charge = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 8);
  • If(!Event Player.perk_nemesis);
  • Global.temp_2 = 800;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_nemesis = True;
  • Create Beam Effect(Event Player.nemesis_killer ? All Players(All Teams) : Empty Array, Bad Beam, Position Of(Event Player),
  • Event Player.nemesis_killer, Color(Black), Visible To Position and Radius);
  • Event Player.nemesis_beam_effect = Last Created Entity;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 9);
  • If(!Event Player.perk_special_operator);
  • Global.temp_2 = 600;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Add Health Pool To Player(Event Player, Armor, 50, True, True);
  • Event Player.HP_Pool[2] = Last Created Health Pool;
  • Event Player.perk_special_operator = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 10);
  • If(!Event Player.perk_sharpshooter);
  • Global.temp_2 = 900;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.perk_sharpshooter = True;
  • Start Damage Modification(Filtered Array(All Players(Team 2), Distance Between(Event Player, Current Array Element) > 20),
  • Event Player, 150, Receivers Damagers and Damage Percent);
  • Event Player.damage_mod[10] = Last Damage Modification ID;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 11);
  • If(!Event Player.perk_shockproof);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Disable Movement Collision With Players(Event Player);
  • Event Player.Move_Speed += 15;
  • Event Player.perk_shockproof = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 12);
  • If(!Event Player.Talent1);
  • Global.temp_2 = 1600;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.Talent1 = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_2 == 13);
  • If(!Event Player.Talent2);
  • Global.temp_2 = 1600;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.Talent2 = True;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • End;
  • End;
  • Else If(First Of(Global.temp_1) == 1);
  • If(Event Player.is_showing_active_abilities);
  • If(Global.temp_1[1] == 1);
  • Global.temp_1 = 4;
  • Call Subroutine(buy_active_ability);
  • Else If(Global.temp_1[1] == 2);
  • Global.temp_1 = 8;
  • Call Subroutine(buy_active_ability);
  • End;
  • Else;
  • Global.temp_2 = 500;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • If(Global.temp_1[1] == 1);
  • Event Player.ab_health_bonus += 5;
  • Event Player.health_percent += 5;
  • Else If(Global.temp_1[1] == 2);
  • Event Player.ab_damage_bonus += 5;
  • Event Player.Damage_Dealt += 5;
  • Set Damage Dealt(Event Player, Event Player.Damage_Dealt);
  • Else;
  • Event Player.ab_healing_bonus += 5;
  • Event Player.healing_dealt_percent += 5;
  • Set Healing Dealt(Event Player, Event Player.healing_dealt_percent);
  • End;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(First Of(Global.temp_1) == 2);
  • If(Event Player.is_showing_active_abilities);
  • If(Global.temp_1[1] == 1);
  • Global.temp_1 = 3;
  • Call Subroutine(buy_active_ability);
  • Else If(Global.temp_1[1] == 2);
  • Global.temp_1 = 7;
  • Call Subroutine(buy_active_ability);
  • End;
  • Else;
  • If(Global.temp_1[1] == 1);
  • If(Event Player.ab_second_wind < 2);
  • Global.temp_2 = 1000;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_second_wind = Event Player.ab_second_wind ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_1[1] == 2);
  • If(Event Player.ab_triage < 2);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_triage = Event Player.ab_triage ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else;
  • If(Event Player.ab_resilience < 2);
  • Global.temp_2 = 800;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_resilience = Event Player.ab_resilience ? 2 : 1;
  • Event Player.Damage_Received -= 20;
  • Set Knockback Dealt(Event Player, 100 + 30 * Event Player.ab_resilience);
  • Set Knockback Received(Event Player, 100 - 30 * Event Player.ab_resilience);
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • End;
  • End;
  • Else If(First Of(Global.temp_1) == 3);
  • If(Event Player.is_showing_active_abilities);
  • If(Global.temp_1[1] == 1);
  • Global.temp_1 = 2;
  • Call Subroutine(buy_active_ability);
  • Else If(Global.temp_1[1] == 2);
  • Global.temp_1 = 6;
  • Call Subroutine(buy_active_ability);
  • End;
  • Else;
  • If(Global.temp_1[1] == 1);
  • If(Event Player.ab_charged < 2);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_charged = Event Player.ab_charged ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_1[1] == 2);
  • If(Event Player.ab_haste < 2);
  • Global.temp_2 = 800;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_haste = Event Player.ab_haste ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else;
  • If(Event Player.ab_heavy_impact < 2);
  • Global.temp_2 = 1000;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_heavy_impact = Event Player.ab_heavy_impact ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • End;
  • End;
  • Else If(First Of(Global.temp_1) == 4);
  • If(Event Player.is_showing_active_abilities);
  • If(Global.temp_1[1] == 1);
  • Global.temp_1 = 1;
  • Call Subroutine(buy_active_ability);
  • Else If(Global.temp_1[1] == 2);
  • Global.temp_1 = 5;
  • Call Subroutine(buy_active_ability);
  • End;
  • Else;
  • If(Global.temp_1[1] == 1);
  • If(Event Player.ab_headhunter < 2);
  • Global.temp_2 = 800;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_headhunter = Event Player.ab_headhunter ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else If(Global.temp_1[1] == 2);
  • If(Event Player.ab_antigens < 2);
  • Global.temp_2 = 600;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Stop Healing Modification(Event Player.heal_mod[1]);
  • Stop Heal Over Time(Event Player.heal_mod[2]);
  • Event Player.ab_antigens = Event Player.ab_antigens ? 2 : 1;
  • Start Healing Modification(Event Player, All Players(All Teams), 100 + 20 * Event Player.ab_antigens,
  • Receivers Healers and Healing Percent);
  • Event Player.heal_mod[1] = Last Healing Modification ID;
  • Start Heal Over Time(Event Player, Null, 9999, Max Health(Event Player) * 0.010 * Event Player.ab_antigens);
  • Event Player.heal_mod[2] = Last Heal Over Time ID;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Else;
  • If(Event Player.ab_quick_fix < 2);
  • Global.temp_2 = 700;
  • Call Subroutine(check_if_enough_money);
  • If(Global.temp_2);
  • Event Player.ab_quick_fix = Event Player.ab_quick_fix ? 2 : 1;
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • End;
  • End;
  • Else;
  • If(!Event Player.ab_priority);
  • Global.temp_2 = 1200;
  • Call Subroutine(check_if_enough_money);
  • If(!Global.temp_2);
  • Wait(0.100, Ignore Condition);
  • Abort;
  • End;
  • Else If(Global.temp_1[1] == Event Player.ab_priority);
  • Wait(0.100, Ignore Condition);
  • Abort;
  • Else;
  • Small Message(Event Player, Custom String("Swapped Priority"));
  • End;
  • Event Player.ab_priority = Global.temp_1[1];
  • Call Subroutine(update_ab_string_and_play_sound);
  • End;
  • End;
  • Wait(0.100, Ignore Condition);
  • }
  • }
  • rule("All Teams: Player left Match, Scale Damage")
  • {
  • event
  • {
  • Player Left Match;
  • All;
  • All;
  • }
  • actions
  • {
  • Call Subroutine(update_combatants);
  • Global.temp_2 = (Global.mut_emp_rounds ? 2 : 1) * (20 + 8.250 * (Global.wave_number - 1 + Max(0, Global.wave_number - 9))) * (
  • 0.139 + 0.200 * Global.combatants_count) * (9 / Number Of Players(Color(Team 2)));
  • For Global Variable(temp_1, 0, Number Of Living Players(Color(Team 2)), 1);
  • Set Damage Dealt(All Living Players(Color(Team 2))[Global.temp_1], All Living Players(Color(Team 2))
  • [Global.temp_1].Damage_Dealt * Global.temp_2);
  • End;
  • }
  • }
  • rule("Subroutine: Nearest Walkable Position Teleport")
  • {
  • event
  • {
  • Subroutine;
  • nwp_teleport;
  • }
  • actions
  • {
  • If(Global.temp_1 == Empty Array);
  • Teleport(Event Player, First Of(Sorted Array(Global.nodes, Distance Between(Event Player, Current Array Element))));
  • Else;
  • Teleport(Event Player, Global.temp_1);
  • End;
  • }
  • }
  • rule("Team 1 (Spawn): Player Init, Create Effects, Set Is Combatant")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Has Spawned(Event Player) == True;
  • }
  • actions
  • {
  • "Fail-Safe if player somehow despawned (Like Echo duplicating D.Va)"
  • Abort If(Event Player.is_combatant);
  • Small Message(Event Player, Custom String("H​e​a​t​ ​S​t​r​e​e​t​ PvE: Talents​ | q.3.4.2​ ​b​y​ LemonAid"));
  • "Triage: Players to Players Healing Increase"
  • Start Healing Modification(Filtered Array(Global.combatants, Normalized Health(Current Array Element) <= 0.500), Event Player,
  • 100 + 25 * Event Player.ab_triage, Receivers Healers and Healing Percent);
  • Event Player.is_combatant = True;
  • Event Player.spectated_player = Event Player;
  • Event Player.ab_bought_abilities_string = Custom String("");
  • Event Player.health_percent = 100;
  • Event Player.healing_dealt_percent = 100;
  • Set Healing Received(Event Player, 80 + 2.500 * Global.upgrade_count);
  • Call Subroutine(update_combatants);
  • Create Effect(Event Player.downed_start_t ? All Players(All Teams) : Empty Array, Ring, Color(Yellow), Event Player, 3,
  • Visible To);
  • Create Icon(Event Player.downed_start_t ? Remove From Array(All Players(All Teams), Event Player) : Empty Array, Event Player,
  • Skull, Visible To, Color(Yellow), True);
  • "Workaround: Normalized Health sometimes doesn't reevaluate, so force with TTE"
  • Create HUD Text(All Players(Team 1), Custom String("{0}{1}", Hero Icon String(Hero Of(Event Player)),
  • Event Player.downed_start_t && Event Player.revive_timer ? Global.progress_bar_strings[Round To Integer(
  • Event Player.revive_timer / 10, Down)] : Custom String("")), Custom String("{0}{1}{2}", Event Player,
  • Event Player.ab_priority ? Array(Custom String(" (A)"), Custom String(" (B)"), Custom String(" (C)"))
  • [Event Player.ab_priority - 1] : Custom String(""), Event Player.in_buy_menu_start_t ? Custom String(" (In Shop)")
  • : Custom String("")), Custom String("{0}{1}", Event Player.downed_start_t ? (Event Player.revive_timer ? Custom String(
  • "Being Revived") : Custom String("Downed")) : (Event Player.is_changing_heroes ? Custom String("Changing Heroes")
  • : Custom String("{0} HP", Round To Integer(Health(Event Player), Up))), Custom String(", {0}$", Round To Integer(
  • Global.money_mult * Global.money_amount - Event Player.money_spent_amount, Down))), Left,
  • Local Player == Event Player ? -1 : Slot Of(Event Player), Event Player.downed_start_t ? Color(Red) : (
  • Event Player.is_changing_heroes || Normalized Health(Event Player) >= 0.500 ? (Local Player == Event Player ? Color(Green)
  • : Color(Sky Blue)) : Color(Orange)), Event Player.downed_start_t ? Color(Red) : (
  • Event Player.is_changing_heroes || Normalized Health(Event Player) >= 0.500 ? (Local Player == Event Player ? Color(Green)
  • : Color(Sky Blue)) : Color(Orange)), Event Player.downed_start_t ? Color(Red) : (
  • Event Player.is_changing_heroes || Normalized Health(Event Player) >= 0.500 ? (Local Player == Event Player ? Color(Green)
  • : Color(Sky Blue)) : Color(Orange)), Visible To Sort Order String and Color, Default Visibility);
  • "Stats"
  • Event Player.Damage_Received = 100;
  • Event Player.Damage_Dealt = 100;
  • Event Player.Move_Speed = 100;
  • "Ability lists"
  • Create HUD Text(Event Player.is_combatant ? Event Player : Empty Array, Null,
  • Event Player.spectated_player.ab_bought_abilities_string, Null, Left, 10, Null, Color(Green), Null, Visible To and String,
  • Default Visibility);
  • Create HUD Text(Event Player.spectated_player.Talent1 ? Event Player : Empty Array, Custom String(" "),
  • Event Player.spectated_player.talent_text[2], Custom String("{0}\n━━━━", Event Player.spectated_player.talent_text[1]), Left,
  • 11, Color(Blue), Color(White), Color(Sky Blue), Visible To and String, Default Visibility);
  • Create HUD Text(Event Player.spectated_player.Talent2 ? Event Player : Empty Array, Custom String(" "),
  • Event Player.spectated_player.talent_text[4], Custom String("{0}\n━━━━", Event Player.spectated_player.talent_text[3]), Left,
  • 12, Color(Blue), Color(White), Color(Sky Blue), Visible To and String, Default Visibility);
  • Create HUD Text(Event Player.spectated_player.active_ab_number ? Event Player : Empty Array, Ability Icon String(Array(Hero(Ana),
  • Hero(Sombra), Hero(Ashe), Hero(Reaper), Hero(Cassidy), Hero(Baptiste), Hero(Sigma), Hero(Sombra))
  • [Event Player.spectated_player.active_ab_number - 1], Array(Button(Ultimate), Button(Ability 1), Button(Ability 1), Button(
  • Ability 1), Button(Ability 2), Button(Ability 1), Button(Ultimate), Button(Secondary Fire))
  • [Event Player.spectated_player.active_ab_number - 1]), Custom String("Hold or double tap {0}", Input Binding String(Button(
  • Melee))), Custom String("{0}: {1}", Array(Custom String("Stim Infusion"), Custom String("Cloak"), Custom String("Combustion"),
  • Custom String("Frenzy"), Custom String("Smoke Bomb"), Custom String("Resurgence"), Custom String("Tear Gas"), Custom String(
  • "Chain Hack"))[Event Player.spectated_player.active_ab_number - 1],
  • Event Player.spectated_player.active_ab_cooldown ? Round To Integer(Magnitude Of(
  • Event Player.spectated_player.active_ab_cooldown), Up) : Custom String("Ready")), Left, 13,
  • Event Player.spectated_player.active_ab_cooldown < False ? Color(Green) : (Has Status(Event Player.spectated_player, Hacked)
  • || Has Status(Event Player.spectated_player, Stunned) ? Color(Red) : (Event Player.spectated_player.active_ab_cooldown ? Color(
  • Gray) : Color(Green))), Color(Orange), Event Player.spectated_player.active_ab_cooldown < 0 ? Color(Green) : (Has Status(
  • Event Player.spectated_player, Hacked) || Has Status(Event Player.spectated_player, Stunned) ? Color(Red) : (
  • Event Player.spectated_player.active_ab_cooldown ? Color(Gray) : Color(Green))), Visible To String and Color,
  • Default Visibility);
  • Create Effect(Event Player.Smoked_Screen && !Event Player.perk_special_operator ? Event Player : Empty Array, Sphere, Color(Black),
  • Event Player, 100, Visible To Position and Radius);
  • Create Effect(Has Status(Event Player, Invincible) ? All Players(All Teams) : Empty Array,
  • Baptiste Immortality Field Protected Effect, Color(Team 2), Event Player, 1, Visible To Position and Radius);
  • If(Global.wave_number);
  • Start Forcing Player Outlines(Filtered Array(All Players(Team 2), Current Array Element.is_living_boss), Event Player, True, Color(
  • Yellow), Always);
  • Event Player.can_use_drop_in_buy_menu = True;
  • Wait Until(!!Event Player.in_buy_menu_start_t, 15);
  • Event Player.can_use_drop_in_buy_menu = False;
  • If(Event Player.in_buy_menu_start_t);
  • Event Player.active_ab_is_cloaked = True;
  • Set Status(Event Player, Null, Phased Out, 30);
  • Wait Until(!Event Player.in_buy_menu_start_t, 30);
  • Event Player.active_ab_is_cloaked = False;
  • Clear Status(Event Player, Phased Out);
  • End;
  • Else;
  • Teleport(Event Player, Global.player_spawn_pos);
  • Wait(0.200, Ignore Condition);
  • Set Facing(Event Player, Global.player_spawn_facing, To World);
  • }
  • }
  • rule("Team 1: Detect Input Device")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Wait Until(Magnitude Of(Throttle Of(Event Player)) > False, 99999);
  • Global.temp_1 = Array(-1, False, 1);
  • Event Player.is_controller_player = !(Array Contains(Global.temp_1, X Component Of(Throttle Of(Event Player))) && Array Contains(
  • Global.temp_1, Z Component Of(Throttle Of(Event Player))));
  • Event Player.mercy_res_button = Event Player.is_controller_player ? Button(Secondary Fire) : Button(Ability 2);
  • }
  • }
  • rule("Team 1: Add Health Pool")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_combatant == True;
  • Global.upgrade_count > False;
  • }
  • actions
  • {
  • Add Health Pool To Player(Event Player, Health, Event Player.health_percent * 0.250 * Global.upgrade_count, True, True);
  • }
  • }
  • rule("Team 1 Button: Hold Reload, Change Hero, Set Last Position (1), Last Eye Position (2), Last Facing (3)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Reload)) == True;
  • }
  • actions
  • {
  • Wait(0.400, Abort When False);
  • Abort If(Global.objective_phase_number > 0 || Event Player.downed_start_t || Event Player.in_buy_menu_start_t);
  • If(Event Player.perk_mystery_swap);
  • Small Message(Event Player, Custom String("Mystery Swap prevents you from changing heroes"));
  • Abort;
  • End;
  • Event Player.is_changing_heroes = True;
  • Event Player.ab_var_1 = Position Of(Event Player);
  • Event Player.ab_var_2 = Eye Position(Event Player);
  • Event Player.ab_var_3 = Facing Direction Of(Event Player);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), Event Player.ab_var_1, 1);
  • Start Camera(Event Player, Ray Cast Hit Position(Event Player.ab_var_2, Event Player.ab_var_2 - 8.250 * Direction From Angles(
  • Horizontal Angle From Direction(Event Player.ab_var_3), 20), Null, Null, False) + 0.250 * Direction From Angles(
  • Horizontal Angle From Direction(Event Player.ab_var_3), 20), Event Player.ab_var_2, 0);
  • Clear Status(Event Player, Unkillable);
  • Kill(Event Player, Null);
  • "Lower values might cause the player to fall through the map when respawning"
  • Teleport(Event Player, 100 * Down);
  • Wait(0.100, Ignore Condition);
  • Event Player.is_invisible = 2;
  • Wait Until(Is Alive(Event Player), 99999);
  • Stop Camera(Event Player);
  • Teleport(Event Player, Event Player.ab_var_1);
  • Set Facing(Event Player, Event Player.ab_var_3, To World);
  • Event Player.is_changing_heroes = False;
  • Event Player.is_invisible = False;
  • Wait(0.500, Ignore Condition);
  • Call Subroutine(update_ab_string_and_play_sound);
  • }
  • }
  • rule("Team 1: Took Damage, Set Last Damage Taken")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Event Player.last_damage_taken_t = Total Time Elapsed;
  • }
  • }
  • rule("Team 1 (Death): Start Camera, Play Sounds, Set is Downed, Revive Timer, Knocked down, Phased out, Death Cam Target")
  • {
  • event
  • {
  • Player Died;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_changing_heroes == False;
  • }
  • actions
  • {
  • If(!Event Player.downed_start_t);
  • Disable Messages(Event Player);
  • Small Message(All Players(All Teams), Custom String("{0} was downed!", Event Player));
  • Event Player.death_cam_target = Eye Position(Event Player) + 1000 * Direction From Angles(Horizontal Facing Angle Of(Event Player),
  • 0);
  • Start Camera(Event Player, Ray Cast Hit Position(Eye Position(Event Player.spectated_player), Eye Position(
  • Event Player.spectated_player) - (Event Player.death_cam_target ? 6.250 * Direction Towards(Eye Position(
  • Event Player.spectated_player), Event Player.death_cam_target) : 8.250 * Direction From Angles(Horizontal Facing Angle Of(
  • Event Player.spectated_player), 20)), Null, Null, False) + 0.250 * (Event Player.death_cam_target ? Direction Towards(
  • Eye Position(Event Player.spectated_player), Event Player.death_cam_target) : Direction From Angles(Horizontal Facing Angle Of(
  • Event Player.spectated_player), 20)), Eye Position(Event Player.spectated_player), Event Player.death_cam_target ? 10 : 20);
  • For Global Variable(temp_1, 0, Global.combatants_count, 1);
  • Play Effect(Global.combatants[Global.temp_1], Ring Explosion Sound, Color(White), Global.combatants[Global.temp_1], 200);
  • Play Effect(Global.combatants[Global.temp_1], Ring Explosion Sound, Color(White), Global.combatants[Global.temp_1], 200);
  • End;
  • Event Player.downed_start_t = Total Time Elapsed;
  • Event Player.revive_timer = False;
  • If(Event Player.perk_nemesis && Attacker.is_alive && Team Of(Attacker) == Color(Team 2) && !Attacker.iv_is_portal && Slot Of(
  • Attacker) != 1);
  • Event Player.nemesis_killer = Attacker;
  • Else;
  • Event Player.nemesis_killer = Null;
  • End;
  • Call Subroutine(disable_player);
  • End;
  • If(Event Was Environment);
  • Global.temp_1 = Nearest Walkable Position(Event Player);
  • Call Subroutine(nwp_teleport);
  • End;
  • Resurrect(Event Player);
  • Clear Status(Event Player, Phased Out);
  • Set Status(Event Player, Null, Invincible, 9999);
  • Set Status(Event Player, Null, Knocked Down, 9999);
  • Wait(0.050, Restart When True);
  • Set Player Health(Event Player, 1);
  • Set Status(Event Player, Null, Phased Out, 9999);
  • If(Attacker != Event Player);
  • Event Player.death_cam_target = Attacker;
  • Wait(5, Restart When True);
  • End;
  • Event Player.death_cam_target = Null;
  • }
  • }
  • rule("Team 1: Player downed fallback")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.downed_start_t == True;
  • Has Status(Event Player, Stunned) == False;
  • }
  • actions
  • {
  • Wait(0.250, Abort When False);
  • Abort If Condition Is False;
  • While(Event Player.downed_start_t && !Has Status(Event Player, Stunned));
  • Clear Status(Event Player, Phased Out);
  • Cancel Primary Action(Event Player);
  • Set Status(Event Player, Null, Knocked Down, 9999);
  • Wait(0.250, Ignore Condition);
  • End;
  • If(Event Player.downed_start_t);
  • Set Status(Event Player, Null, Phased Out, 9999);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 1: Select Next Spectated Player")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.downed_start_t == True;
  • Is Button Held(Event Player, Button(Jump)) == True;
  • }
  • actions
  • {
  • Abort If(Event Player.downed_start_t + 0.500 >= Total Time Elapsed);
  • Event Player.death_cam_target = Null;
  • If(Event Player.nemesis_killer);
  • If(Event Player.spectated_player == Event Player);
  • Event Player.spectated_player = Event Player.nemesis_killer;
  • Else;
  • Event Player.spectated_player = Event Player;
  • End;
  • Else;
  • Event Player.spectated_player = Global.combatants[(Index Of Array Value(Global.combatants, Event Player.spectated_player) + 1)
  • % Global.combatants_count];
  • End;
  • Wait(0.250, Ignore Condition);
  • }
  • }
  • rule("Team 1: Spectated Player does not exist anymore")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Entity Exists(Event Player.spectated_player) == False;
  • }
  • actions
  • {
  • Event Player.spectated_player = Event Player;
  • }
  • }
  • rule("Team 1: Revive, Check Player in Radius, Unset Is Downed")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.downed_start_t == True;
  • Event Player.downed_start_t + 1 < Total Time Elapsed;
  • }
  • actions
  • {
  • Event Player.revivers = Filtered Array(Global.combatants, !Current Array Element.downed_start_t && !(
  • Current Array Element.is_invisible % 3) && Distance Between(Event Player, Vector(X Component Of(Position Of(
  • Current Array Element)), Y Component Of(Position Of(Event Player)), Z Component Of(Position Of(Current Array Element))))
  • <= 3 && Absolute Value(Y Component Of(Position Of(Event Player)) - Y Component Of(Position Of(Current Array Element)))
  • <= 3 && ((Hero Of(Current Array Element) == Hero(Mei) && Is Using Ability 1(Current Array Element)) || Is In Line of Sight(
  • Event Player, Current Array Element, Barriers Do Not Block LOS)));
  • If(Count Of(Event Player.revivers));
  • Event Player.is_revive_slow = Is True For All(Event Player.revivers, Current Array Element.active_ab_is_cloaked || Has Status(
  • Current Array Element, Invincible) || Has Status(Current Array Element, Phased Out));
  • Event Player.revive_timer += (Global.is_hard_mode_enabled || Global.is_apocalyptic ? 0.667 : 1) * (
  • Event Player.perk_golden_hour ? 2 : 1) * (Event Player.is_revive_slow ? 2.500 : 5);
  • If(Event Player.revive_timer >= 100);
  • Small Message(All Players(All Teams), Custom String("{0} has been revived!", Event Player));
  • Event Player.downed_start_t = False;
  • End;
  • Else;
  • Event Player.revive_timer = False;
  • End;
  • Wait(0.200, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 1: Teleport if Player died on Jumppad")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.downed_start_t == True;
  • Event Player.downed_start_t + 5 < Total Time Elapsed;
  • Event Player.is_flying == True;
  • }
  • actions
  • {
  • Global.temp_1 = Nearest Walkable Position(Position Of(Event Player) + 5 * Direction From Angles(Random Integer(-179, 180), False));
  • Call Subroutine(nwp_teleport);
  • }
  • }
  • rule("Team 1: Player gets up")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.downed_start_t == False;
  • }
  • actions
  • {
  • Abort If(!Event Player.is_combatant);
  • Enable Messages(Event Player);
  • Stop Camera(Event Player);
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Event Player, 200);
  • Set Player Health(Event Player, 100000);
  • Event Player.spectated_player = Event Player;
  • Event Player.revivers = Empty Array;
  • Event Player.nemesis_killer = Null;
  • Clear Status(Event Player, Knocked Down);
  • Clear Status(Event Player, Invincible);
  • Call Subroutine(enable_player);
  • Wait(2, Abort When False);
  • Abort If Condition Is False;
  • Clear Status(Event Player, Phased Out);
  • }
  • }
  • rule("Team 1: Heal after few sec")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.last_damage_taken_t + (Event Player.perk_die_hard ? 0.500 : 1) * (Global.mut_deep_wounds ? 5 : 2.500)
  • < Total Time Elapsed;
  • Normalized Health(Event Player) != 1;
  • Health(Event Player) != False;
  • }
  • actions
  • {
  • Heal(Event Player, Null, Max Health(Event Player) * 0.333);
  • Play Effect(Event Player, Buff Explosion Sound, Color(White), Event Player, 50);
  • While(True);
  • Wait(0.200, Abort When False);
  • Abort If Condition Is False;
  • Heal(Event Player, Null, 40);
  • End;
  • }
  • }
  • rule("Team 1: Set / Unset Is Flying")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is On Ground(Event Player) == False;
  • }
  • actions
  • {
  • Wait(1.500, Abort When False);
  • Event Player.is_flying = True;
  • Wait Until(Is On Ground(Event Player), 99999);
  • Event Player.is_flying = False;
  • }
  • }
  • rule("Team 1: Calculate Eye Offset")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_combatant == True;
  • }
  • actions
  • {
  • If(Hero Of(Event Player) == Hero(Mei) && Is Using Ability 1(Event Player));
  • Event Player.eye_offset = 1.200 * Up;
  • Else If(Has Status(Event Player, Knocked Down) || Has Status(Event Player, Asleep) || Is Communicating Any Emote(Event Player));
  • Event Player.eye_offset = Position Of(Event Player) + 0.250 * Up - Eye Position(Event Player);
  • Else;
  • Event Player.eye_offset = Global.aim_offset;
  • End;
  • If(Event Player.active_ab_is_smoked);
  • Event Player.active_ab_is_smoked = False;
  • Event Player.eye_offset += Random Real(0.500, 2) * Direction From Angles(Random Integer(-179, 180), Random Integer(0, 45));
  • End;
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 1 Button: Hold or double tap Melee, Use active Ability")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Melee)) == True;
  • }
  • actions
  • {
  • Wait Until(!Is Button Held(Event Player, Button(Melee)), 0.400);
  • If(!Is Button Held(Event Player, Button(Melee)));
  • Wait Until(Is Button Held(Event Player, Button(Melee)), 0.300);
  • Abort If(!Is Button Held(Event Player, Button(Melee)));
  • End;
  • Abort If(Is Dead(Event Player) || Event Player.downed_start_t || Has Status(Event Player, Hacked) || Has Status(Event Player,
  • Stunned) || !Event Player.active_ab_number || Event Player.in_buy_menu_start_t);
  • Play Effect(Event Player, Debuff Impact Sound, Color(White), Event Player, 200);
  • If(Event Player.active_ab_number == 1);
  • Event Player.last_damage_taken_t = False;
  • Set Status(Event Player, Null, Invincible, 0.100);
  • Event Player.Damage_Dealt += 100;
  • Event Player.healing_dealt_percent += 100;
  • Event Player.Move_Speed += 50;
  • Set Healing Dealt(Event Player, Event Player.healing_dealt_percent);
  • For Player Variable(Event Player, active_ab_cooldown, -6, 0, 1);
  • Wait(1, Ignore Condition);
  • End;
  • Event Player.Damage_Dealt -= 100;
  • Event Player.healing_dealt_percent -= 100;
  • Event Player.Move_Speed -= 50;
  • Set Healing Dealt(Event Player, Event Player.healing_dealt_percent);
  • Event Player.active_ab_cooldown = 30;
  • Else If(Event Player.active_ab_number == 2);
  • Event Player.active_ab_is_cloaked = True;
  • For Player Variable(Event Player, active_ab_cooldown, -8, 0, 1);
  • Wait(1, Ignore Condition);
  • End;
  • Event Player.active_ab_is_cloaked = False;
  • Damage(Players Within Radius(Eye Position(Event Player), 10, Color(Team 2), Surfaces), Event Player, 99);
  • Set Status(Players Within Radius(Eye Position(Event Player), 10, Color(Team 2), Surfaces), Event Player, Frozen, 4);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Eye Position(Event Player), 10);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • Event Player.active_ab_cooldown = 20;
  • Else If(Event Player.active_ab_number == 3);
  • Event Player.active_ab_cooldown = -1;
  • Global.temp_1 = Players Within Radius(Eye Position(Event Player), 12, Color(Team 2), Surfaces);
  • Damage(Global.temp_1, Event Player, Min(600, 1.500 * (80 / (Normalized Health(Event Player) + 0.100))));
  • Play Effect(All Players(All Teams), Good Explosion, Color(Yellow), Eye Position(Event Player), 12);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Orange), Eye Position(Event Player), 12);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • Event Player.active_ab_cooldown = Round To Integer(5 + Normalized Health(Event Player) * 12, Up);
  • Wait(1, Ignore Condition);
  • Else If(Event Player.active_ab_number == 4);
  • Event Player.active_ab_is_frenzied = True;
  • Set Status(Event Player, Null, Invincible, 5);
  • For Player Variable(Event Player, active_ab_cooldown, -5, 0, 1);
  • Event Player.last_damage_taken_t = Total Time Elapsed;
  • Wait(1, Ignore Condition);
  • End;
  • Event Player.active_ab_is_frenzied = False;
  • Event Player.active_ab_cooldown = 30;
  • Else If(Event Player.active_ab_number == 5);
  • Event Player.active_ab_var = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + 2 * Down, Null, Null,
  • False) + 2 * Up;
  • For Player Variable(Event Player, active_ab_cooldown, -10, 0, 0.500);
  • Filtered Array(Global.combatants, Distance Between(Eye Position(Current Array Element), Vector(X Component Of(
  • Event Player.active_ab_var), Y Component Of(Eye Position(Current Array Element)), Z Component Of(Event Player.active_ab_var)))
  • <= 10 && Absolute Value(Y Component Of(Eye Position(Current Array Element)) - Y Component Of(Event Player.active_ab_var)) <= 5)
  • .active_ab_is_smoked = True;
  • Wait(0.500, Ignore Condition);
  • End;
  • Event Player.active_ab_cooldown = 20;
  • Else If(Event Player.active_ab_number == 6);
  • For Player Variable(Event Player, active_ab_cooldown, -5, 0, 0.250);
  • If(Normalized Health(Event Player) != 1);
  • Heal(Event Player, Null, 75);
  • End;
  • If(Normalized Health(Event Player) == 1);
  • Heal(First Of(Sorted Array(Filtered Array(Players Within Radius(Event Player, 15, Color(Team 1), Off),
  • Current Array Element.is_combatant && !Current Array Element.downed_start_t && Normalized Health(Current Array Element) != 1),
  • Normalized Health(Current Array Element))), Null, 75);
  • End;
  • Wait(0.250, Ignore Condition);
  • End;
  • Event Player.active_ab_cooldown = 25;
  • Else If(Event Player.active_ab_number == 7);
  • Event Player.active_ab_var = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + 100 * Facing Direction Of(Event Player), All Players(Team 2), Null, True);
  • Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player.active_ab_var, 8);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player.active_ab_var, 200);
  • For Player Variable(Event Player, active_ab_cooldown, -6, 0, 1);
  • Global.temp_1 = Filtered Array(All Living Players(Color(Team 2)), !Has Status(Current Array Element, Phased Out) && !Has Status(
  • Current Array Element, Stunned) && Distance Between(Event Player.active_ab_var, Eye Position(Current Array Element)) <= 8);
  • Start Damage Over Time(Global.temp_1, Event Player, 2, 40);
  • For Global Variable(temp_2, 0, Count Of(Global.temp_1), 1);
  • Global.temp_1[Global.temp_2].gmut_fortified_bypass_end_t = Max(Total Time Elapsed,
  • Global.temp_1[Global.temp_2].gmut_fortified_bypass_end_t);
  • Set Status(Global.temp_1[Global.temp_2], Event Player, Stunned, Global.temp_1[Global.temp_2].is_fortified ? 0.500 : 1);
  • End;
  • Wait(2, Ignore Condition);
  • End;
  • Event Player.active_ab_cooldown = 35;
  • Else If(Event Player.active_ab_number == 8);
  • Global.temp_1 = Last Of(Sorted Array(Filtered Array(All Living Players(Color(Team 2)), !Has Status(Current Array Element,
  • Phased Out) && !Current Array Element.iv_is_portal && Is In View Angle(Event Player, Current Array Element, 45)
  • && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)),
  • Dot Product(Facing Direction Of(Event Player), Direction Towards(Eye Position(Event Player), Current Array Element))));
  • If(Global.temp_1);
  • Set Status(Global.temp_1, Event Player, Hacked, 5);
  • Modify Player Variable(Event Player, active_ab_var, Append To Array, Global.temp_1);
  • For Global Variable(temp_2, 4, 1, -1);
  • Global.temp_1 = First Of(Sorted Array(Filtered Array(Remove From Array(All Living Players(Color(Team 2)),
  • Event Player.active_ab_var), !Has Status(Current Array Element, Phased Out)
  • && !Current Array Element.iv_is_portal && Is In Line of Sight(Global.temp_1, Current Array Element,
  • Barriers Do Not Block LOS)), Distance Between(Global.temp_1, Current Array Element)));
  • If(Global.temp_1);
  • Set Status(Global.temp_1, Event Player, Hacked, Global.temp_2);
  • Modify Player Variable(Event Player, active_ab_var, Append To Array, Global.temp_1);
  • Else;
  • Break;
  • End;
  • End;
  • Damage(Event Player.active_ab_var, Event Player, 5);
  • Event Player.active_ab_cooldown = -0.800;
  • Wait(0.800, Ignore Condition);
  • Event Player.active_ab_var = Empty Array;
  • Event Player.active_ab_cooldown = 25;
  • Else;
  • Event Player.active_ab_cooldown = 1;
  • End;
  • End;
  • For Player Variable(Event Player, active_ab_cooldown, Event Player.active_ab_cooldown, 0, -1);
  • Wait(1, Ignore Condition);
  • End;
  • }
  • }
  • rule("Team 1 (Ability): Priority C")
  • {
  • event
  • {
  • Player Dealt Healing;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Abort If(!Event Player.ab_priority == 3);
  • Abort If(Healee == Event Player);
  • Abort If(!Event Healing);
  • Set Player Health(Event Player, Health(Event Player) + 0.400 * Event Healing);
  • }
  • }
  • rule("Team 1 (Ability): Charged")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_charged == True;
  • Ultimate Charge Percent(Event Player) < Event Player.ab_charged * 15;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, Event Player.ab_charged * 15);
  • "Workaround: Sets Ultimate Charge to a higher value for duplicating Echo"
  • If(Is Duplicating(Event Player));
  • Wait(0.016, Ignore Condition);
  • Set Ultimate Charge(Event Player, Event Player.ab_charged * 15);
  • }
  • }
  • rule("Team 1 (Ability): Haste Primary Fire")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_haste == True;
  • Ability Cooldown(Event Player, Button(Primary Fire)) > 0.100;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Primary Fire), (1 - 0.250 * Event Player.ab_haste) * Ability Cooldown(Event Player,
  • Button(Primary Fire)));
  • }
  • }
  • rule("Team 1 (Ability): Haste Secondary Fire")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_haste == True;
  • Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Secondary Fire), (1 - 0.250 * Event Player.ab_haste) * Ability Cooldown(Event Player,
  • Button(Secondary Fire)));
  • }
  • }
  • rule("Team 1 (Ability): Haste Ability 1")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_haste == True;
  • Ability Cooldown(Event Player, Button(Ability 1)) > 0.100;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Ability 1), (1 - 0.250 * Event Player.ab_haste) * Ability Cooldown(Event Player, Button(
  • Ability 1)));
  • }
  • }
  • rule("Team 1 (Ability): Haste Ability 2")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_haste == True;
  • Ability Cooldown(Event Player, Button(Ability 2)) > 0.100;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Ability 2), (1 - 0.250 * Event Player.ab_haste) * Ability Cooldown(Event Player, Button(
  • Ability 2)));
  • }
  • }
  • rule("Team 1 (Ability): Haste Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_haste == True;
  • Ability Cooldown(Event Player, Button(Jump)) > 0.100;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Jump), (1 - 0.250 * Event Player.ab_haste) * Ability Cooldown(Event Player, Button(
  • Jump)));
  • }
  • }
  • rule("Team 1 (Ability): Haste Crouch")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_haste == True;
  • Ability Cooldown(Event Player, Button(Crouch)) > 0.100;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Crouch), (1 - 0.250 * Event Player.ab_haste) * Ability Cooldown(Event Player, Button(
  • Crouch)));
  • }
  • }
  • rule("Team 1 (Ability): Headhunter")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Abort If(!Event Player.ab_headhunter);
  • Abort If(!Event Was Critical Hit);
  • Damage(Victim, Event Player, Event Player.ab_headhunter * 30 / Event Player.Damage_Dealt * Event Damage);
  • }
  • }
  • rule("Team 1 (Ability): Priority B")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_priority == 2;
  • Event Player.last_damage_taken_t + 3 < Total Time Elapsed;
  • }
  • actions
  • {
  • Event Player.Damage_Dealt += 20;
  • Event Player.Move_Speed += 20;
  • Wait Until(Event Player.last_damage_taken_t + 3 >= Total Time Elapsed || Event Player.perk_mystery_swap == Total Time Elapsed + 75, 99999);
  • Event Player.Damage_Dealt -= 20;
  • Event Player.Move_Speed -= 20;
  • }
  • }
  • rule("Team 1 (Ability): Quick Fix")
  • {
  • event
  • {
  • Player Earned Elimination;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_quick_fix == True;
  • }
  • actions
  • {
  • Heal(Event Player, Null, Event Player.ab_quick_fix * 50);
  • If(!Event Player.current_quick_fix_speed_bonus);
  • Event Player.current_quick_fix_speed_bonus = Event Player.ab_quick_fix * 15;
  • Event Player.Move_Speed += Event Player.current_quick_fix_speed_bonus;
  • End;
  • Wait(5, Restart When True);
  • Event Player.Move_Speed -= Event Player.current_quick_fix_speed_bonus;
  • Event Player.current_quick_fix_speed_bonus = False;
  • }
  • }
  • rule("Team 1 (Ability): Second Wind")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.ab_second_wind == True;
  • Event Player.downed_start_t == True;
  • Event Player.downed_start_t + 0.900 < Total Time Elapsed;
  • }
  • actions
  • {
  • Small Message(All Players(All Teams), Custom String("{0} received a second wind!", Event Player));
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Green), Event Player, 1);
  • Set Status(Event Player, Null, Phased Out, 3.500);
  • Event Player.downed_start_t = False;
  • Wait(120 - 30 * Event Player.ab_second_wind, Ignore Condition);
  • }
  • }
  • rule("Team 1 (Perk): Mystery Swap")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.perk_mystery_swap == True;
  • Event Player.perk_mystery_swap < Total Time Elapsed;
  • Event Player.downed_start_t == False;
  • }
  • actions
  • {
  • Wait(1, Abort When False);
  • Abort If Condition Is False;
  • If(Event Player.Talent1);
  • Event Player.Swapped_Talent_Array[1] = True;
  • Event Player.Talent1 = False;
  • End;
  • If(Event Player.Talent2);
  • Event Player.Swapped_Talent_Array[2] = True;
  • Event Player.Talent2 = False;
  • End;
  • Event Player.perk_mystery_swap = Total Time Elapsed + 75;
  • Wait(0.200, Ignore Condition);
  • Start Forcing Player To Be Hero(Event Player, Random Value In Array(Remove From Array(All Heroes, Hero Of(Event Player))));
  • Event Player.is_invisible = False;
  • Event Player.Move_Speed -= Event Player.current_quick_fix_speed_bonus;
  • Event Player.last_damage_taken_t = 0;
  • Wait(0.100, Ignore Condition);
  • If(Event Player.Swapped_Talent_Array[1]);
  • Event Player.Swapped_Talent_Array[1] = False;
  • Event Player.Talent1 = True;
  • End;
  • If(Event Player.Swapped_Talent_Array[2]);
  • Event Player.Swapped_Talent_Array[2] = False;
  • Event Player.Talent2 = True;
  • End;
  • Set Ultimate Charge(Event Player, 100);
  • Event Player.Damage_Dealt = 100;
  • Event Player.Move_Speed = Event Player.perk_shockproof ? 115 : 100;
  • Set Move Speed(Event Player, 100);
  • Set Damage Dealt(Event Player, 100);
  • Call Subroutine(update_ab_string_and_play_sound);
  • }
  • }
  • rule("Team 1 (Perk): Bulletstorm")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.perk_bulletstorm == True;
  • (Ammo(Event Player, False) < Max Ammo(Event Player, False) || Ammo(Event Player, 1) < Max Ammo(Event Player, 1)) == True;
  • }
  • actions
  • {
  • Set Ammo(Event Player, False, 1000);
  • Set Ammo(Event Player, 1, 1000);
  • }
  • }
  • rule("Team 1 (Perk): Nemesis")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Is Dead(Event Player.nemesis_killer) == True;
  • }
  • actions
  • {
  • Wait(0.200, Abort When False);
  • Abort If(!Event Player.downed_start_t);
  • Small Message(All Players(All Teams), Custom String("{0}'s Nemesis was killed!", Event Player));
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Green), Event Player, 1);
  • Event Player.downed_start_t = False;
  • }
  • }
  • rule("Team 1 (Perk): Brass Knuckles")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Abort If(!Event Player.perk_brass_knuckles);
  • Abort If(Event Ability != Button(Melee));
  • Abort If(Victim.iv_is_portal);
  • Abort If(Is Dead(Victim));
  • Victim.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 1.75, Victim.gmut_fortified_bypass_end_t);
  • Set Status(Victim, Event Player, Knocked Down, Victim.is_fortified ? 1.75 : 2.500);
  • Abort If(!Has Status(Victim, Stunned));
  • Wait(0.250, Restart When True);
  • Wait(15, Ignore Condition);
  • Small Message(Event Player, Custom String("Brass Knuckles Ready"));
  • }
  • }
  • rule("Team 1 (Perk): Crash N' Dash")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.perk_crash_n_dash == True;
  • Speed Of(Event Player) >= 8;
  • }
  • actions
  • {
  • Heal(Event Player, Null, 10);
  • Wait(0.200, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 1 (Perk): Vampiric Heal")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Abort If(!Event Player.perk_vampiric);
  • Heal(Event Player, Event Player, Event Damage * 0.25);
  • }
  • }
  • rule("Team 1 (Perk): Supercharge")
  • {
  • event
  • {
  • Player Dealt Healing;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Abort If(!Event Player.perk_super_charge);
  • Abort If(Healee == Event Player);
  • Abort If(!Event Healing);
  • Set Ultimate Charge(Healee, Ultimate Charge Percent(Healee) + 1 + Event Healing * 0.030);
  • Wait(0.750, Ignore Condition);
  • }
  • }
  • rule("Team 2 (Mutator): Artful Dodger")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.mut_artful_dodger == True;
  • Event Player.can_dodge == False;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.can_dodge = True;
  • }
  • }
  • rule("MUT Team 2 (Mutator): Swan Song")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.mut_swan_song == True;
  • Is Alive(Event Player) == True;
  • Event Player.is_living_boss == True;
  • }
  • actions
  • {
  • Set Status(Event Player, Null, Unkillable, 9999);
  • Wait Until(Health(Event Player) <= 1, 99999);
  • Create Effect(All Players(All Teams), Wrecking Ball Piledriver Fire Effect, Color(Violet), Event Player, 1, Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Violet), Event Player, 1);
  • Set Status(Event Player, Null, Stunned, 1);
  • Wait Until(Is Dead(Event Player), 5);
  • Clear Status(Event Player, Unkillable);
  • Kill(Event Player, Null);
  • Destroy Effect(Event Player.Effects___[1]);
  • }
  • }
  • rule("MUT Team 2 (Mutator): Low Blow")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Abort If(!Global.mut_low_blow);
  • Damage(Victim, Event Player, 0.500 * Event Damage);
  • }
  • }
  • rule("MUT Team 2 (Mutator) Cassidy: Fully Loaded, Flashbang")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Cassidy;
  • }
  • conditions
  • {
  • Global.mut_fully_loaded == True;
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 40);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 8);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(10, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("MUT Team 2 Echo (Mutator): Fully Loaded, Focusing Beam")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Global.mut_fully_loaded == True;
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Normalized Health(Event Player.target) > 0.500);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 15);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(10, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("MUT Team 2 (Mutator) Team 2 Ana: Fully Loaded, Sleep Dart")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Ana;
  • }
  • conditions
  • {
  • Global.mut_fully_loaded == True;
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 40);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 10);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(13, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("MUT Team 2 Orisa (Mutator): Fully Loaded, Protective Barrier")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Orisa;
  • }
  • conditions
  • {
  • Global.mut_fully_loaded == True;
  • Event Player.is_target_in_los == True;
  • Is In View Angle(Event Player, Event Player.target, 5) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • Wait(30, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("MUT Team 2 Pharah (Mutator): Fully Loaded, Concussive Blast")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Pharah;
  • }
  • conditions
  • {
  • Global.mut_fully_loaded == True;
  • Event Player.is_target_in_los == True;
  • Is Using Ability 1(Event Player) == False;
  • }
  • actions
  • {
  • Wait(1, Abort When False);
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Team 1 Doomfist: Meteor Strike (Invisibility 2, not detectable)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.is_invisible = 2;
  • Wait Until(!Is Using Ultimate(Event Player), 99999);
  • Event Player.is_invisible = False;
  • }
  • }
  • rule("Team 1 D.Va: Fill Ultimate Charge when downed")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.downed_start_t == True;
  • Ultimate Charge Percent(Event Player) != 100;
  • }
  • actions
  • {
  • Wait(0.050, Abort When False);
  • Set Ultimate Charge(Event Player, 100);
  • }
  • }
  • rule("Team 1 Echo: Stealth (Invisibility 1, detectable)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Echo;
  • }
  • conditions
  • {
  • Hero Being Duplicated(Event Player) == Hero(Sombra);
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.800, Abort When False);
  • Event Player.is_invisible = 1;
  • Wait Until(!Is Using Ability 1(Event Player), 99999);
  • Event Player.is_invisible = False;
  • }
  • }
  • rule("Team 1 Echo: Remove Stealth when Duplicate ends")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.is_invisible == 1;
  • Is Duplicating(Event Player) == False;
  • }
  • actions
  • {
  • Event Player.is_invisible = False;
  • }
  • }
  • rule("Team 1 Echo: Cancel Charge on Boss Enemies")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Echo;
  • }
  • actions
  • {
  • Abort If(Hero Being Duplicated(Event Player) != Hero(Reinhardt));
  • Abort If(Event Ability != Null);
  • Abort If(!Victim.is_living_boss);
  • Damage(Victim, Event Player, 150);
  • Cancel Primary Action(Event Player);
  • Victim.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 1.200, Victim.gmut_fortified_bypass_end_t);
  • Set Status(Victim, Event Player, Stunned, 1.200);
  • }
  • }
  • rule("Team 1 Echo: Cancel Chain Hook on Boss Enemies")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Echo;
  • }
  • actions
  • {
  • Abort If(Hero Being Duplicated(Event Player) != Hero(Roadhog));
  • Abort If(Event Ability != Button(Ability 1));
  • Abort If(!Victim.is_living_boss);
  • Abort If(!Is Using Ability 1(Event Player));
  • Cancel Primary Action(Event Player);
  • Wait(0.016, Ignore Condition);
  • Victim.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 1, Victim.gmut_fortified_bypass_end_t);
  • Set Status(Victim, Event Player, Stunned, 1);
  • }
  • }
  • rule("Team 1 Mercy: Revive Ability (Player)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Mercy;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Event Player.mercy_res_button) == True;
  • Ability Cooldown(Event Player, Button(Ability 2)) == False;
  • "Workaround: Check Cooldown for Controller Players"
  • Ability Cooldown(Event Player, Button(Secondary Fire)) == False;
  • Event Player.downed_start_t == False;
  • Has Status(Event Player, Hacked) == False;
  • Has Status(Event Player, Stunned) == False;
  • }
  • actions
  • {
  • Event Player.ab_player = Last Of(Sorted Array(Filtered Array(Players Within Radius(Event Player, 10, Color(Team 1), Off),
  • Current Array Element.is_combatant && Current Array Element.downed_start_t && Current Array Element.downed_start_t + 0.100 < Total Time Elapsed && Is In View Angle(
  • Event Player, Current Array Element, 45)), Dot Product(Facing Direction Of(Event Player), Direction Towards(Eye Position(
  • Event Player), Current Array Element))));
  • If(Event Player.ab_player);
  • Small Message(All Players(All Teams), Custom String("{0} has been resurrected by {1}!", Event Player.ab_player, Event Player));
  • Event Player.ab_player.downed_start_t = False;
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Sky Blue), Event Player.ab_player, 1);
  • Global.temp_1 = (Global.is_hard_mode_enabled || Global.is_apocalyptic ? 1.500 : 1) * Array(30, 33.333, 40)[Event Player.ab_haste];
  • Set Ability Cooldown(Event Player, Button(Ability 2), Global.temp_1);
  • "Workaround: Set Cooldown for Controller Players"
  • Set Ability Cooldown(Event Player, Button(Secondary Fire), Global.temp_1);
  • End;
  • Wait(0.050, Ignore Condition);
  • }
  • }
  • rule("IV Team 1 Moira: Biotic Grasp on Portal Simulation")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Moira;
  • }
  • conditions
  • {
  • Global.gamemode == False;
  • Global.objective_phase_number == 1;
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • If(Distance Between(Eye Position(Event Player), Global.iv_dom_objective_pos + 1.110 * Up) <= 20 && Is In Line of Sight(
  • Eye Position(Event Player), Global.iv_dom_objective_pos + 1.110 * Up, Barriers Do Not Block LOS));
  • "If Facing ray intersects sphere"
  • If(Distance Between(Global.iv_dom_objective_pos + 1.110 * Up, Eye Position(Event Player) + Max(0, Dot Product(Facing Direction Of(
  • Event Player), Vector Towards(Eye Position(Event Player), Global.iv_dom_objective_pos + 1.110 * Up))) * Facing Direction Of(
  • Event Player)) <= 0.850);
  • Damage(Players In Slot(0, Color(Team 2)), Event Player, 9.600);
  • End;
  • End;
  • Wait(0.192, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 1 Sombra: Stealth (Invisibility 1, detectable), end after 20 seconds")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Sombra;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.800, Abort When False);
  • Event Player.is_invisible = 1;
  • For Player Variable(Event Player, sombra_stealth_timer, 100, 0, -0.480);
  • Wait Until(!Is Using Ability 1(Event Player), 0.096);
  • If(!Is Using Ability 1(Event Player));
  • Break;
  • End;
  • End;
  • If(Is Using Ability 1(Event Player));
  • Press Button(Event Player, Button(Ability 1));
  • End;
  • Event Player.is_invisible = False;
  • }
  • }
  • rule("Team 1 Reinhardt: Cancel Charge on Boss Enemies")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Reinhardt;
  • }
  • actions
  • {
  • Abort If(Event Ability != Null);
  • Abort If(!Victim.is_living_boss);
  • Damage(Victim, Event Player, 250);
  • Cancel Primary Action(Event Player);
  • Victim.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 1.200, Victim.gmut_fortified_bypass_end_t);
  • Set Status(Victim, Event Player, Stunned, 1.200);
  • }
  • }
  • rule("Team 1 Roadhog: Cancel Chain Hook on Boss Enemies")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Roadhog;
  • }
  • actions
  • {
  • Abort If(Event Ability != Button(Ability 1));
  • Abort If(!Victim.is_living_boss);
  • Abort If(!Is Using Ability 1(Event Player));
  • Cancel Primary Action(Event Player);
  • Wait(0.016, Ignore Condition);
  • Victim.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 1, Victim.gmut_fortified_bypass_end_t);
  • Set Status(Victim, Event Player, Stunned, 1);
  • }
  • }
  • rule("Team 1 Tracer: Start Health Regeneration after Recall")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Tracer;
  • }
  • conditions
  • {
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.850, Ignore Condition);
  • Event Player.last_damage_taken_t = False;
  • }
  • }
  • rule("Team 1 Zenyatta: Harmony target is harder to hit")
  • {
  • event
  • {
  • Player Dealt Healing;
  • Team 1;
  • Zenyatta;
  • }
  • actions
  • {
  • Abort If(Event Ability != Button(Ability 1));
  • Healee.active_ab_is_smoked = True;
  • Wait(1, Ignore Condition);
  • }
  • }
  • rule("Subroutine: Spawn Reinforcements")
  • {
  • event
  • {
  • Subroutine;
  • call_reinforcements;
  • }
  • actions
  • {
  • Global.special_spawns_count += Global.is_apocalyptic + (Global.wave_number >= 5 ? 2 : 1);
  • }
  • }
  • rule("Subroutine: Teleport to free Spawn")
  • {
  • event
  • {
  • Subroutine;
  • teleport_to_free_spawn;
  • }
  • actions
  • {
  • If(Global.gamemode == 0 && (Event Player.base_tier == -1 || Global.special_spawns_count > False) && !Event Player.is_alive);
  • Event Player.is_nav_reachable_node = False;
  • If(Event Player.base_tier == -1 && Global.objective_phase_number == False);
  • Teleport(Event Player, 100 * Up);
  • Else;
  • Teleport(Event Player, Global.iv_dom_objective_pos + Up);
  • End;
  • Else If(
  • Global.gamemode == 1 && Global.hvt_call_reinforcements_end_t >= Total Time Elapsed && Global.special_spawns_count > 0 && !Event Player.is_alive);
  • Event Player.is_nav_reachable_node = False;
  • Teleport(Event Player, Players In Slot(1, Color(Team 2)));
  • Else If(Global.gamemode == 2 && Global.objective_phase_number == False);
  • Event Player.nav_idx = Global.iv_dom_objective_pos[Slot Of(Event Player) == 2 ? 2 : 3];
  • Event Player.dom_nav_guard_idx = Event Player.nav_idx;
  • Event Player.nav_pos = Global.nodes[Event Player.nav_idx];
  • Event Player.is_nav_reachable_node = True;
  • Teleport(Event Player, Event Player.nav_pos + 0.100 * Direction From Angles(Horizontal Angle From Direction(Direction Towards(
  • Global.iv_dom_objective_pos[Slot Of(Event Player) == 2 ? 0 : 1], Event Player.nav_pos)), False));
  • Else;
  • Global.temp_2 = Mapped Array(Global.spawn_pos_list, False);
  • For Global Variable(temp_1, 0, Count Of(Global.spawn_pos_list), 1);
  • If(Is True For Any(Global.combatants, Is In Line of Sight(Global.spawn_pos_list[Global.temp_1] + Up, Eye Position(
  • Current Array Element), Barriers Do Not Block LOS)));
  • Global.temp_2[Global.temp_1] = 2;
  • Else If(Is True For Any(Global.combatants, Distance Between(Global.spawn_pos_list[Global.temp_1], Current Array Element) <= 10));
  • Global.temp_2[Global.temp_1] = 1;
  • End;
  • End;
  • Global.temp_1 = First Of(Sorted Array(Global.spawn_pos_list, Global.temp_2[Current Array Index] + Random Real(0, 0.500)));
  • Event Player.nav_idx = Global.spawn_nearest_node_idx_list[Index Of Array Value(Global.spawn_pos_list, Global.temp_1)];
  • Event Player.nav_pos = Global.nodes[Event Player.nav_idx];
  • Event Player.is_nav_reachable_node = True;
  • Teleport(Event Player, Global.temp_1);
  • End;
  • }
  • }
  • rule("Subroutine: Find WP near Nav (find a walkable position near the Nav and check if it's reachable)")
  • {
  • event
  • {
  • Subroutine;
  • find_wp_near_nav;
  • }
  • actions
  • {
  • Global.temp_1 = Nearest Walkable Position(Event Player.nav_pos);
  • "If NWP is valid and not too far from the original destination"
  • If(Global.temp_1 != Empty Array && Distance Between(Event Player.nav_pos, Global.temp_1) < 3);
  • Event Player.nav_pos = Global.temp_1;
  • Else;
  • "If original destination is not walkable"
  • If(Distance Between(Event Player.nav_pos + Up, Ray Cast Hit Position(Event Player.nav_pos + Up, Event Player.nav_pos + 2 * Down,
  • Null, Null, False)) >= 3);
  • "Ranged bots stand still"
  • If(Global.is_load_limit_reached || Event Player.is_ranged || Distance Between(Event Player, Event Player.target) < 2);
  • Event Player.nav_pos = Position Of(Event Player);
  • Abort;
  • Else;
  • Event Player.nav_pos = Position Of(Event Player) + Min(3.500, Distance Between(Event Player, Event Player.target) - 2)
  • * Direction Towards(Event Player, Event Player.target);
  • If(Is On Ground(Event Player));
  • "Check if destination is not walkable"
  • If(Distance Between(Event Player.nav_pos + Up, Ray Cast Hit Position(Event Player.nav_pos + Up, Event Player.nav_pos + 2 * Down,
  • Null, Null, False)) >= 3);
  • Event Player.nav_pos = Position Of(Event Player);
  • Event Player.is_using_combat_pathfinding -= 1;
  • Abort;
  • End;
  • End;
  • End;
  • End;
  • End;
  • "Check if the destination is reachable"
  • If(Is On Ground(Event Player));
  • Global.temp_1 = Position Of(Event Player) + 1.750 * Direction Towards(Event Player, Event Player.nav_pos) + Up;
  • "If bot is near a ledge"
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 3 * Down, Null, Null, False)) >= 3);
  • Event Player.nav_pos = Position Of(Event Player);
  • If(!Event Player.is_ranged);
  • Event Player.is_using_combat_pathfinding -= 1;
  • Abort;
  • End;
  • End;
  • End;
  • Event Player.is_using_combat_pathfinding = 3;
  • }
  • }
  • rule("Subroutine: Check Drop (Avoid dropping too low)")
  • {
  • event
  • {
  • Subroutine;
  • check_drop;
  • }
  • actions
  • {
  • If(Global.is_load_limit_reached);
  • Event Player.nav_pos = Position Of(Event Player);
  • Abort;
  • End;
  • Global.temp_1 = Position Of(Event Player) + 1.750 * Direction Towards(Event Player, Vector(X Component Of(Event Player.nav_pos),
  • Y Component Of(Position Of(Event Player)), Z Component Of(Event Player.nav_pos))) + Up;
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 30 * Down, Null, Null, False))
  • >= Y Component Of(Global.temp_1) - Y Component Of(Position Of(Event Player.target)) + 5);
  • Event Player.nav_pos = Position Of(Event Player);
  • Event Player.is_using_combat_pathfinding -= 1;
  • Abort;
  • End;
  • Global.temp_1 = Position Of(Event Player) + 3.500 * Direction Towards(Event Player, Vector(X Component Of(Event Player.nav_pos),
  • Y Component Of(Position Of(Event Player)), Z Component Of(Event Player.nav_pos))) + Up;
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 30 * Down, Null, Null, False))
  • >= Y Component Of(Global.temp_1) - Y Component Of(Position Of(Event Player.target)) + 5);
  • Event Player.nav_pos = Position Of(Event Player);
  • Event Player.is_using_combat_pathfinding -= 1;
  • Abort;
  • End;
  • Event Player.is_using_combat_pathfinding = 3;
  • }
  • }
  • rule("Subroutine: Start Facing")
  • {
  • event
  • {
  • Subroutine;
  • start_facing;
  • }
  • actions
  • {
  • If(Hero Of(Event Player) == Hero(Soldier: 76));
  • If(Event Player.real_tier == 4);
  • Start Facing(Event Player, (Event Player.is_target_in_los && (!Event Player.ab_var_1 || Event Player.is_using_combat_pathfinding)
  • ? Vector(False, False, False) : 1.500 * Direction Towards(Event Player, Event Player.nav_pos)) + (
  • Event Player.target.is_combatant ? Direction Towards(Eye Position(Event Player), Eye Position(Event Player.target)
  • + Event Player.target.eye_offset) : Vector(False, False, False)), Has Status(Event Player, Stunned) ? 0 : (
  • Event Player.ab_var_1 ? 1000 : 300), To World, Direction and Turn Rate);
  • Else;
  • Start Facing(Event Player, (Event Player.is_target_in_los ? Vector(False, False, False) : 1.500 * Direction Towards(Event Player,
  • Event Player.nav_pos)) + (Event Player.target.is_combatant ? Direction Towards(Eye Position(Event Player), Eye Position(
  • Event Player.target) + Event Player.target.eye_offset) : Vector(False, False, False)), Has Status(Event Player, Stunned)
  • ? 0 : 300, To World, Direction and Turn Rate);
  • End;
  • Else;
  • If(Hero Of(Event Player) == Hero(Widowmaker) || Hero Of(Event Player) == Hero(Hanzo));
  • Start Facing(Event Player, Event Player.facing_override_direction ? Event Player.facing_override_direction : (
  • Event Player.is_target_in_los ? Vector(False, False, False) : 1.500 * Direction Towards(Event Player, Event Player.nav_pos))
  • + (Event Player.target.is_combatant ? Direction Towards(Eye Position(Event Player), Eye Position(Event Player.target)
  • + Event Player.target.eye_offset) : Vector(False, False, False)), Has Status(Event Player, Stunned) ? 0 : 300, To World,
  • Direction and Turn Rate);
  • Event Player.facing_override_direction = False;
  • Else If(!Event Player.iv_is_portal);
  • Start Facing(Event Player, (Event Player.is_target_in_los ? Vector(False, False, False) : 1.500 * Direction Towards(Event Player,
  • Event Player.nav_pos)) + (Event Player.target.is_combatant ? Direction Towards(Eye Position(Event Player), Eye Position(
  • Event Player.target) + Event Player.target.eye_offset) : Vector(False, False, False)), Has Status(Event Player, Stunned)
  • ? 0 : 300, To World, Direction and Turn Rate);
  • End;
  • End;
  • }
  • }
  • rule("Subroutine: Find Chase Target")
  • {
  • event
  • {
  • Subroutine;
  • find_chase_target;
  • }
  • actions
  • {
  • Abort If(Event Player.is_ignoring_other_targets);
  • Event Player.target = First Of(Sorted Array(Filtered Array(Global.combatants,
  • !Current Array Element.downed_start_t && !Current Array Element.active_ab_is_cloaked && Current Array Element.is_invisible <= (
  • Distance Between(Event Player, Current Array Element) <= 2.400 || Global.is_infrasight_on)), Distance Between(Event Player,
  • Current Array Element)));
  • }
  • }
  • rule("Subroutine: Update Target Nav")
  • {
  • event
  • {
  • Subroutine;
  • update_target_nav;
  • }
  • actions
  • {
  • Event Player.target.last_nav_update_t = Total Time Elapsed;
  • Global.temp_1 = Eye Position(Event Player.target) + Event Player.target.eye_offset;
  • Event Player.target.best_nav_idx = Index Of Array Value(Global.nodes, First Of(Sorted Array(Filtered Array(Remove From Array(
  • Global.nodes, Global.elevator_nodes), Is In Line of Sight(Current Array Element + Vector(0, 1.500, False), Global.temp_1,
  • Barriers Do Not Block LOS)), Distance Between(Event Player.target, Current Array Element) + Absolute Value(Y Component Of(
  • Position Of(Event Player.target)) - Y Component Of(Current Array Element)))));
  • If(Event Player.target.best_nav_idx == -1);
  • Event Player.target.best_nav_idx = Index Of Array Value(Global.nodes, First Of(Sorted Array(Remove From Array(Global.nodes,
  • Global.elevator_nodes), Distance Between(Event Player.target, Current Array Element))));
  • End;
  • }
  • }
  • rule("Team 2: Bot Init")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Set Respawn Max Time(Event Player, 9999);
  • Event Player.ab_bought_abilities_string = Custom String("");
  • "Workaround: Create Boss Health Bars"
  • If(Slot Of(Event Player) == 0 || (Global.gamemode == 2 && Slot Of(Event Player) <= 3));
  • Create Progress Bar In-World Text(!Event Player.iv_is_portal && Event Player.is_living_boss ? All Players(All Teams) : Empty Array,
  • 100 * Normalized Health(Event Player) + False * Total Time Elapsed, String(""), Event Player, 0.500, Clip Against Surfaces, Color(
  • Red), Color(White), Visible To and Values, Default Visibility);
  • }
  • }
  • rule("Team 2 (Death): Field Resurrection")
  • {
  • event
  • {
  • Player Died;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Abort If(!Global.wave_number);
  • Event Player.fear_end_t = False;
  • Clear Status(Event Player, Hacked);
  • If(Slot Of(Event Player) == 1 && (Global.objective_phase_number == 1 || Global.objective_phase_number == 2));
  • If(Global.objective_phase_number == 1);
  • If(Global.hvt_dom_objective_killed_count);
  • Big Message(All Players(All Teams), Custom String("HVT subdued!"));
  • Else;
  • Big Message(All Players(All Teams), Custom String("HVT subdued! Gained bonus health"));
  • End;
  • Global.hvt_dom_objective_killed_count += 1;
  • Global.objective_phase_number = 2;
  • Event Player.revive_timer = False;
  • Event Player.downed_start_t = 2;
  • Event Player.gmut_fortified_bypass_end_t = 100000;
  • End;
  • If(Event Was Environment);
  • Global.temp_1 = Nearest Walkable Position(Event Player);
  • Call Subroutine(nwp_teleport);
  • End;
  • Resurrect(Event Player);
  • Clear Status(Event Player, Phased Out);
  • Set Status(Event Player, Null, Invincible, 9999);
  • Set Status(Event Player, Null, Knocked Down, 9999);
  • Wait(0.050, Restart When True);
  • Set Status(Event Player, Null, Phased Out, 9999);
  • Abort;
  • End;
  • If(!Event Was Environment && Hero Of(Event Player) != Hero(Baptiste)
  • && !Event Player.is_living_boss && !Event Player.is_mutated && (Global.mut_advanced_medkit || Event Player.real_tier < 4));
  • Global.temp_1 = Random Value In Array(Filtered Array(Players On Hero(Hero(Baptiste), Color(Team 2)), Is Alive(
  • Current Array Element) && !(Has Status(Current Array Element, Hacked) || Has Status(Current Array Element, Stunned)
  • || Current Array Element.fear_end_t >= Total Time Elapsed) && Current Array Element.ab_var_2 + (
  • Global.mut_advanced_medkit ? 1 : 3) < Total Time Elapsed && Distance Between(Event Player, Current Array Element)
  • <= 10 && Is In Line of Sight(Event Player, Current Array Element, Barriers Do Not Block LOS)));
  • If(Global.temp_1);
  • Communicate(Global.temp_1, You are Welcome);
  • Global.temp_1.ab_var_2 = Total Time Elapsed;
  • Press Button(Global.temp_1, Button(Ability 1));
  • Resurrect(Event Player);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Green), Event Player, 1);
  • If(Hero Of(Event Player) == Hero(Orisa));
  • "Disable Fortify so that Orisa can be knocked down"
  • Set Ability Cooldown(Event Player, Button(Ability 1), 0.500);
  • End;
  • "Knocked Down Status is not applied when the bot is killed while stunned without a wait"
  • Wait(0.016, Restart When True);
  • Event Player.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 1.750, Event Player.gmut_fortified_bypass_end_t);
  • Set Status(Event Player, Null, Knocked Down, 1.750);
  • Abort;
  • End;
  • End;
  • If(Global.gmut_storm_raging && Event Player.gmut_var);
  • Global.temp_1 = Array Slice(Sorted Array(Filtered Array(Players Within Radius(Eye Position(Event Player), 8, Color(Team 2),
  • Surfaces), Current Array Element.is_alive && !Current Array Element.gmut_var && !Current Array Element.iv_is_portal),
  • Distance Between(Event Player, Current Array Element)), 0, 2);
  • Global.temp_1.gmut_var = True;
  • For Global Variable(temp_2, 0, Count Of(Global.temp_1), 1);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Red), Global.temp_1[Global.temp_2], 1);
  • End;
  • Event Player.gmut_var = False;
  • End;
  • If(Global.gamemode == 2 && Event Player.is_living_boss);
  • Global.money_amount += 40;
  • If(Global.hvt_dom_objective_killed_count);
  • Big Message(All Players(All Teams), Custom String("Killed both guards! Gained bonus health"));
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Call Subroutine(upgrade_health_and_healing);
  • Else;
  • Big Message(All Players(All Teams), Custom String("Killed a guard!"));
  • End;
  • Global.hvt_dom_objective_killed_count += 1;
  • End;
  • Stop Forcing Player Outlines(Event Player, All Players(All Teams));
  • Stop Facing(Event Player);
  • Stop Throttle In Direction(Event Player);
  • Event Player.is_living_boss = False;
  • Event Player.is_using_boss_aggression = False;
  • Event Player.is_target_in_los = False;
  • Event Player.is_alive = False;
  • }
  • }
  • rule("Team 2 (Respawn): Reset Dummy, Change Hero")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == False;
  • (
  • Event Player.base_tier == -1 ? Global.enable_objective_enemy_spawn : Global.special_spawns_count > 0 || Global.enable_normal_spawns || Event Player.is_expendable) == True;
  • }
  • actions
  • {
  • If(!(Event Player.base_tier == -1 || (Global.gamemode == 2 && Global.objective_phase_number == 0 && Slot Of(Event Player) <= 3)));
  • Wait(0.500 + 0.100 * Max(0, Slot Of(Event Player) - 2), Abort When False);
  • End;
  • Stop All Damage Over Time(Event Player);
  • Clear Status(Event Player, Burning);
  • Clear Status(Event Player, Rooted);
  • Abort If Condition Is False;
  • If(Event Player.is_mutated);
  • Stop Scaling Player(Event Player);
  • Stop Modifying Hero Voice Lines(Event Player);
  • Event Player.is_mutated = False;
  • Global.mut_mutation = Total Time Elapsed + 30;
  • End;
  • If(Global.is_waiting_to_remove_bot && Slot Of(Event Player) >= 9);
  • Global.is_waiting_to_remove_bot = False;
  • Destroy Dummy Bot(Color(Team 2), Slot Of(Event Player));
  • Abort;
  • End;
  • Destroy Effect(Event Player.active_ab_effect_list);
  • Event Player.active_ab_effect_list = Empty Array;
  • If(Event Player.is_hardwired);
  • Remove Health Pool From Player(Event Player.HP_Pool[4]);
  • End;
  • If(Global.mut_bulletproof);
  • Remove Health Pool From Player(Event Player.HP_Pool[5]);
  • End;
  • Call Subroutine(teleport_to_free_spawn);
  • If(Hero Of(Event Player) == Hero(Soldier: 76));
  • "Select Soldier Variant"
  • If(Global.special_spawns_count > False);
  • Global.special_spawns_count -= 1;
  • If(Global.tier_4_spawns_block_end_t >= Total Time Elapsed || Global.wave_number < 5);
  • Event Player.real_tier = 3;
  • Else;
  • Global.tier_4_spawns_block_end_t = Total Time Elapsed + 10;
  • Event Player.real_tier = 4;
  • End;
  • Else;
  • Global.temp_1 = Event Player.base_tier + (Global.mut_promotion && Random Integer(1, 100) <= 20);
  • If(Global.temp_1 == 1);
  • Event Player.real_tier = Global.mut_gear_upgrade ? 2 : 1;
  • Else If(Global.temp_1 == 2);
  • Event Player.real_tier = 2;
  • Else;
  • Event Player.real_tier = Is True For Any(All Living Players(Color(Team 2)),
  • !Current Array Element.is_living_boss && Current Array Element.real_tier == 4) || Random Integer(1, 100) <= 80 ? 3 : 4;
  • End;
  • End;
  • Resurrect(Event Player);
  • If(Event Player.real_tier == 1);
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Trooper"));
  • Event Player.combat_pathfinding_type = False;
  • Event Player.ab_var_3 = True;
  • Event Player.is_ranged = True;
  • Event Player.can_dodge = False;
  • Event Player.Damage_Dealt = 0.500;
  • Event Player.health_percent = 0.333;
  • Else If(Event Player.real_tier == 2);
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Heavy Trooper"));
  • Event Player.combat_pathfinding_type = 8;
  • Event Player.ab_var_3 = False;
  • Event Player.is_ranged = False;
  • Event Player.can_dodge = False;
  • Event Player.Damage_Dealt = 0.450;
  • Event Player.health_percent = 0.417;
  • Else If(Event Player.real_tier == 3);
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Grenadier"));
  • Event Player.combat_pathfinding_type = 4;
  • Event Player.ab_var_3 = False;
  • Event Player.is_ranged = True;
  • Event Player.can_dodge = True;
  • Event Player.Damage_Dealt = 0.550;
  • Event Player.health_percent = 0.500;
  • Else;
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Cloaker"));
  • Create Effect(All Players(All Teams), Echo Cloning Effect, Evaluate Once(Total Time Elapsed + 0.500)
  • >= Total Time Elapsed || Event Player.ab_var_1 || Event Player.ab_var_2 ? Color(Team 1) : Color(Team 2), Event Player, 1,
  • Visible To and Color);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Event Player.combat_pathfinding_type = 9;
  • Event Player.ab_var_3 = True;
  • Event Player.is_ranged = False;
  • Event Player.can_dodge = False;
  • Event Player.Damage_Dealt = 1;
  • Event Player.health_percent = 1.100;
  • End;
  • If(!Global.mut_lock_n_load);
  • Global.temp_1 = Array(30, 40, 1, 60)[Event Player.real_tier - 1];
  • Set Max Ammo(Event Player, False, Global.temp_1);
  • Set Ammo(Event Player, False, Global.temp_1);
  • End;
  • Event Player.is_fortified = Global.gmut_fortified;
  • Event Player.can_stagger = !Event Player.is_fortified && Event Player.real_tier != 4;
  • Event Player.can_quick_melee = Event Player.real_tier != 4;
  • Else;
  • "Select Hero"
  • If(Event Player.base_tier == -1);
  • Event Player.is_living_boss = True;
  • Global.enable_objective_enemy_spawn = False;
  • If(Global.gamemode == False);
  • If(Global.objective_phase_number);
  • Start Forcing Player To Be Hero(Event Player, Global.boss_list_1[Global.wave_number - 1]);
  • Event Player.iv_is_portal = False;
  • Event Player.is_pathfinding_disabled = False;
  • Else;
  • Start Forcing Player To Be Hero(Event Player, Hero(Torbjörn));
  • Event Player.iv_is_portal = True;
  • Event Player.is_pathfinding_disabled = True;
  • Global.objective_phase_number = 1;
  • Big Message(All Players(All Teams), Custom String("Portal Opened!"));
  • End;
  • Else;
  • Start Forcing Player To Be Hero(Event Player, Global.boss_list_1[Global.wave_number - 1]);
  • Global.objective_phase_number = 1;
  • Global.hvt_dom_objective_killed_count = False;
  • Event Player.is_using_boss_aggression = True;
  • Event Player.gmut_fortified_bypass_end_t = False;
  • Big Message(All Players(All Teams), Custom String("High Value Target located!"));
  • End;
  • Else If(Global.gamemode == 2 && Global.objective_phase_number == False);
  • Event Player.is_living_boss = True;
  • Event Player.is_using_boss_aggression = True;
  • Global.enable_objective_enemy_spawn -= 1;
  • If(Slot Of(Event Player) == 2);
  • Start Forcing Player To Be Hero(Event Player, Global.boss_list_1[Global.wave_number - 1]);
  • Else;
  • Start Forcing Player To Be Hero(Event Player, Global.boss_list_2[Global.wave_number - 1]);
  • End;
  • If(Global.enable_objective_enemy_spawn <= False);
  • Global.objective_phase_number = 1;
  • Big Message(All Players(All Teams), Custom String("Control Points located!"));
  • End;
  • Else If(Global.special_spawns_count > False);
  • Global.special_spawns_count -= 1;
  • If(Global.tier_4_spawns_block_end_t >= Total Time Elapsed || Global.wave_number < 5);
  • Start Forcing Player To Be Hero(Event Player, First Of(Sorted Array(Filtered Array(Array(Hero(Roadhog), Global.wave_number >= 2 ? Hero(Sigma) : False,
  • Global.wave_number >= 2 ? Hero(Orisa) : False, Global.wave_number >= 3 ? Hero(D.Va) : False, Global.wave_number >= 3 ? Hero(Tracer) : False, Global.wave_number >= 4 ? Hero(
  • Ana) : False, Global.wave_number >= 4 ? Hero(Mei) : False, Global.wave_number >= 6 ? Hero(Wrecking Ball) : False), Current Array Element), Random Real(0, 0.500)
  • + Is Hero Being Played(Current Array Element, Color(Team 2)))));
  • Else;
  • Global.tier_4_spawns_block_end_t = Total Time Elapsed + 10;
  • Start Forcing Player To Be Hero(Event Player, First Of(Sorted Array(Filtered Array(Array(Hero(Hanzo), Hero(Genji), Hero(Moira),
  • Global.wave_number >= 10 ? Hero(Reinhardt) : False, Global.wave_number >= 11 ? Hero(Bastion) : False), Current Array Element),
  • Random Real(0, 0.500) + Number Of Heroes(Current Array Element, Color(Team 2)))));
  • End;
  • Else;
  • Global.temp_1 = Event Player.base_tier + (Global.mut_promotion && Random Integer(1, 100) <= 20);
  • If(Global.temp_1 == 1);
  • Start Forcing Player To Be Hero(Event Player, First Of(Sorted Array(Filtered Array(Array(Hero(Cassidy),
  • Global.wave_number >= 3 ? Hero(Brigitte) : False), Current Array Element), Random Real(0, 0.500) + Is Hero Being Played(
  • Current Array Element, Color(Team 2)))));
  • Else If(Global.temp_1 == 2);
  • Start Forcing Player To Be Hero(Event Player, First Of(Sorted Array(Filtered Array(Array(Hero(Widowmaker), Hero(Baptiste), Hero(
  • Zarya), Hero(Pharah), Global.wave_number >= 5 ? Hero(Echo) : False, Global.wave_number >= 7 ? Hero(Sombra) : False,
  • Global.wave_number >= 11 ? Hero(Reaper) : False, Global.mut_the_calvary ? Hero(Tracer) : False, Global.wave_number >= 8 ? Hero(
  • Lúcio) : False), Current Array Element), Random Real(0, 0.500) + Is Hero Being Played(Current Array Element, Color(Team 2)))));
  • Else;
  • Start Forcing Player To Be Hero(Event Player, First Of(Sorted Array(Filtered Array(Array(Hero(Roadhog), Hero(Wrecking Ball), Hero(
  • Mei), Global.wave_number >= 6 ? Hero(Orisa) : False, Global.wave_number >= 4 ? Hero(Sigma) : False,
  • Global.wave_number >= 8 ? Hero(Tracer) : False, Global.wave_number >= 9 ? Hero(Ana) : False, Global.wave_number >= 9 ? Hero(
  • D.Va) : False), Current Array Element), Random Real(0, 0.500) + Is Hero Being Played(Current Array Element, Color(Team 2)))));
  • End;
  • End;
  • "Selected Hero is the same as current Hero"
  • If(Is Dead(Event Player));
  • Resurrect(Event Player);
  • Set Ammo(Event Player, False, Max Ammo(Event Player, False));
  • "D.Va is resurrected without mech, so remech"
  • If(Hero Of(Event Player) == Hero(D.Va));
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • End;
  • End;
  • If(Hero Of(Event Player) == Hero(Cassidy) || Hero Of(Event Player) == Hero(Baptiste));
  • Event Player.combat_pathfinding_type = False;
  • Event Player.is_ranged = True;
  • Event Player.can_dodge = False;
  • Else If(Hero Of(Event Player) == Hero(Brigitte) || Hero Of(Event Player) == Hero(Reinhardt) || Hero Of(Event Player) == Hero(
  • Wrecking Ball));
  • Event Player.combat_pathfinding_type = 1;
  • Event Player.is_ranged = False;
  • Event Player.can_dodge = False;
  • Else If(Hero Of(Event Player) == Hero(Orisa));
  • Event Player.combat_pathfinding_type = 2;
  • Event Player.is_ranged = True;
  • Event Player.can_dodge = False;
  • Else If(Hero Of(Event Player) == Hero(Sombra) || Hero Of(Event Player) == Hero(D.Va) || Hero Of(Event Player) == Hero(Bastion)
  • || Hero Of(Event Player) == Hero(Moira));
  • Event Player.combat_pathfinding_type = 3;
  • Event Player.is_ranged = False;
  • Event Player.can_dodge = False;
  • If(Hero Of(Event Player) == Hero(Sombra));
  • Create Effect(Event Player.ab_player ? All Players(All Teams) : Empty Array, Energy Sound, Color(White), Event Player.ab_player,
  • 200, Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Create Beam Effect(Event Player.ab_player ? All Players(All Teams) : Empty Array, Bad Beam, Event Player, Event Player.ab_player,
  • Color(Red), Visible To Position and Radius);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • End;
  • Else If(Hero Of(Event Player) == Hero(Widowmaker) || Hero Of(Event Player) == Hero(Ana) || Hero Of(Event Player) == Hero(Pharah));
  • Event Player.combat_pathfinding_type = 4;
  • Event Player.is_ranged = True;
  • Event Player.can_dodge = True;
  • Else If(Hero Of(Event Player) == Hero(Roadhog) || Hero Of(Event Player) == Hero(Reaper) || Hero Of(Event Player) == Hero(Sigma)
  • || Hero Of(Event Player) == Hero(Mei) || Hero Of(Event Player) == Hero(Zarya));
  • Event Player.combat_pathfinding_type = 5;
  • Event Player.is_ranged = False;
  • Event Player.can_dodge = True;
  • Else If(Hero Of(Event Player) == Hero(Tracer) || Hero Of(Event Player) == Hero(Genji) || Hero Of(Event Player) == Hero(Lúcio));
  • Event Player.combat_pathfinding_type = 6;
  • Event Player.is_ranged = False;
  • Event Player.can_dodge = False;
  • If(Hero Of(Event Player) == Hero(Tracer));
  • Event Player.recall_block_end_t = Total Time Elapsed + 4;
  • End;
  • Else If(Hero Of(Event Player) == Hero(Echo) || Hero Of(Event Player) == Hero(Hanzo));
  • Event Player.combat_pathfinding_type = 7;
  • Event Player.is_ranged = True;
  • Event Player.can_dodge = False;
  • Else If(Event Player.iv_is_portal);
  • Event Player.can_dodge = False;
  • End;
  • If(Hero Of(Event Player) == Hero(Brigitte) || Hero Of(Event Player) == Hero(Cassidy));
  • Event Player.real_tier = 1;
  • Else If(Hero Of(Event Player) == Hero(Echo) || Hero Of(Event Player) == Hero(Baptiste) || Hero Of(Event Player) == Hero(Reaper)
  • || Hero Of(Event Player) == Hero(Sombra) || Hero Of(Event Player) == Hero(Widowmaker) || Hero Of(Event Player) == Hero(Pharah)
  • || Hero Of(Event Player) == Hero(Lúcio) || Hero Of(Event Player) == Hero(Zarya));
  • Event Player.real_tier = 2;
  • If(Global.mut_bulletproof == True);
  • Add Health Pool To Player(Event Player, Health, 0.9 * Event Player.health_percent, False, False);
  • Event Player.HP_Pool[5] = Last Created Health Pool;
  • End;
  • Else If(Hero Of(Event Player) == Hero(D.Va) || Hero Of(Event Player) == Hero(Orisa) || Hero Of(Event Player) == Hero(Roadhog)
  • || Hero Of(Event Player) == Hero(Ana) || Hero Of(Event Player) == Hero(Tracer) || Hero Of(Event Player) == Hero(Mei)
  • || Hero Of(Event Player) == Hero(Wrecking Ball) || Hero Of(Event Player) == Hero(Sigma));
  • Event Player.real_tier = 3;
  • Else;
  • Event Player.real_tier = 4;
  • End;
  • Event Player.is_fortified = Global.gmut_fortified || Event Player.is_living_boss;
  • Event Player.can_stagger = !Event Player.is_fortified && (Hero Of(Event Player) == Hero(Cassidy) || Hero Of(Event Player) == Hero(
  • Baptiste) || Hero Of(Event Player) == Hero(Pharah) || Hero Of(Event Player) == Hero(Widowmaker));
  • Event Player.can_quick_melee = Hero Of(Event Player) != Hero(Brigitte) && Hero Of(Event Player) != Hero(Widowmaker) && Hero Of(
  • Event Player) != Hero(Roadhog) && Hero Of(Event Player) != Hero(Orisa) && Hero Of(Event Player) != Hero(Wrecking Ball)
  • && Hero Of(Event Player) != Hero(Reinhardt) && !Event Player.iv_is_portal;
  • If(Event Player.is_living_boss);
  • Event Player.health_percent = (Global.is_mutator_mode_enabled ? 1.200 : 1) * (Global.length == 0 ? 1.250 : 1.500) * Array(4, 2.250,
  • 2.250, 1)[Event Player.real_tier - 1];
  • Event Player.Damage_Dealt = (Global.is_mutator_mode_enabled ? 1.200 : 1) * ((Global.gamemode == 0 ? 1.500 : 1.300)
  • + Global.wave_number / 35) * Array(3.500, 2.250, 1.700, 1.050)[Event Player.real_tier - 1];
  • Else;
  • If(Global.mut_mutation && Global.mut_mutation < Total Time Elapsed && Random Integer(1, 100) <= 15 && Event Player.real_tier < 4);
  • Start Scaling Player(Event Player, 1.300, False);
  • Start Modifying Hero Voice Lines(Event Player, 0.500, False);
  • Global.mut_mutation = 100000;
  • Event Player.is_mutated = True;
  • Event Player.health_percent = 2.500;
  • Event Player.Damage_Dealt = 1.300;
  • Create Effect(All Players(All Teams), Winston Primal Rage Effect, Color(Team 2), Event Player, 1, Visible To);
  • Modify Player Variable(Event Player, active_ab_effect_list, Append To Array, Last Created Entity);
  • Else;
  • Event Player.health_percent = 1;
  • Event Player.Damage_Dealt = 1;
  • End;
  • End;
  • If(Global.mut_hardwired);
  • If(Hero Of(Event Player) == Hero(Echo) || Hero Of(Event Player) == Hero(Orisa) || Hero Of(Event Player) == Hero(D.Va) || Hero Of(
  • Event Player) == Hero(Bastion) || Hero Of(Event Player) == Hero(Genji) || Hero Of(Event Player) == Hero(Wrecking Ball));
  • Event Player.is_hardwired = True;
  • If(Hero Of(Event Player) == Hero(D.Va));
  • Add Health Pool To Player(Event Player, Shields, Is In Alternate Form(Event Player) ? 0 : 0.750 * Event Player.health_percent,
  • True, True);
  • Else;
  • Add Health Pool To Player(Event Player, Shields, 0.750 * Event Player.health_percent, True, True);
  • End;
  • Event Player.HP_Pool[4] = Last Created Health Pool;
  • Else;
  • Event Player.is_hardwired = False;
  • End;
  • End;
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Set Damage Received(Event Player, Event Player.is_living_boss ? 50 : 100);
  • End;
  • Call Subroutine(start_facing);
  • If(Slot Of(Event Player) == 1);
  • Start Throttle In Direction(Event Player, Vector Towards(Event Player, Event Player.nav_pos), Distance Between(Event Player,
  • Vector(X Component Of(Event Player.nav_pos), Y Component Of(Position Of(Event Player)), Z Component Of(Event Player.nav_pos)))
  • >= 0.500 ? (Event Player.is_aggressive ? 1 : 0.900) : 0, To World, Replace existing throttle, Direction and Magnitude);
  • Else If(!Event Player.iv_is_portal);
  • Start Throttle In Direction(Event Player, Vector Towards(Event Player, Event Player.nav_pos), Distance Between(Event Player,
  • Vector(X Component Of(Event Player.nav_pos), Y Component Of(Position Of(Event Player)), Z Component Of(Event Player.nav_pos)))
  • >= 0.500, To World, Replace existing throttle, Direction and Magnitude);
  • End;
  • "health_percent value in percent, health does not scale during a bot's live"
  • Event Player.health_percent *= Global.diff_health_mult * (Global.is_mutator_mode_enabled ? 1.100 : 1) * (100 + 5 * (
  • Global.wave_number - 1 + Max(0, Global.wave_number - 9))) * (0.111 + 0.222 * Global.combatants_count);
  • Set Max Health(Event Player, Event Player.health_percent);
  • "Damage_Dealt value as a factor, damage can scale during a bot's live"
  • Event Player.Damage_Dealt *= Global.diff_damage_mult;
  • Set Damage Dealt(Event Player, Event Player.Damage_Dealt * (Global.mut_emp_rounds ? 2 : 1) * (20 + 9.250 * (
  • Global.wave_number - 1 + Max(0, Global.wave_number - 9))) * (0.111 + 0.222 * Global.combatants_count) * (9 / Number Of Players(
  • Color(Team 2))));
  • Set Healing Received(Event Player, Event Player.iv_is_portal ? 0 : Global.diff_health_mult * (
  • Event Player.is_living_boss ? 0.500 : 1) * (Global.is_mutator_mode_enabled ? 1.100 : 1) * (100 + 4 * (
  • Global.wave_number - 1 + Max(0, Global.wave_number - 9))) * (0.111 + 0.222 * Global.combatants_count));
  • Set Knockback Received(Event Player, Event Player.is_fortified ? 35 : 100);
  • Set Status(Event Player, Null, Rooted, 1);
  • If(Event Player.combat_pathfinding_type == 9);
  • Set Move Speed(Event Player, (Global.mut_amped ? 161 : 140) / Global.gazed___);
  • Else;
  • Set Move Speed(Event Player, (Global.mut_amped ? 115 : 100) / Global.gazed___);
  • End;
  • If(Global.mut_lock_n_load);
  • Set Max Ammo(Event Player, False, 600);
  • Set Ammo(Event Player, False, 600);
  • End;
  • Call Subroutine(find_chase_target);
  • Event Player.ab_player = Null;
  • Event Player.ab_var_1 = False;
  • Event Player.ab_var_2 = False;
  • Event Player.fear_end_t = Event Player.iv_is_portal ? 100000 : (
  • Global.gamemode == 2 && Event Player.is_living_boss ? Total Time Elapsed + 3 : False);
  • Event Player.is_aggressive = !Event Player.is_using_boss_aggression;
  • If(Global.gmut_storm_raging);
  • Event Player.gmut_var = !Event Player.is_living_boss && Event Player.real_tier < 3 && Random Integer(1, 3) > Count Of(
  • Filtered Array(All Living Players(Color(Team 2)), Current Array Element.gmut_var));
  • Else If(Global.gmut_adaptive_shield);
  • Event Player.gmut_var = False;
  • End;
  • If(!Event Player.iv_is_portal);
  • Set Player Health(Event Player, 100000);
  • End;
  • Event Player.is_alive = True;
  • Abort If(!Event Player.is_living_boss);
  • Start Forcing Player Outlines(Event Player, All Players(All Teams), True, Color(Yellow), Always);
  • Wait(0.500, Ignore Condition);
  • If(Event Player.is_alive);
  • "Workaround: Sometimes outlines don't appear when set too early"
  • Start Forcing Player Outlines(Event Player, All Players(All Teams), True, Color(Yellow), Always);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Enable Combat Pathfinding")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.is_load_limit_reached == False;
  • Event Player.is_pathfinding_disabled == False;
  • Event Player.is_using_combat_pathfinding == False;
  • Event Player.is_target_in_los >= 5;
  • Event Player.is_aggressive == True;
  • Is On Ground(Event Player) == True;
  • (Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) <= 2 || Y Component Of(
  • Global.nodes[Event Player.target.best_nav_idx]) - Y Component Of(Position Of(Event Player)) <= 1) == True;
  • (Event Player.is_ranged || Distance Between(Event Player, Event Player.target) <= 1 + Distance Between(Event Player.target,
  • Global.nodes[Event Player.target.best_nav_idx])) == True;
  • }
  • actions
  • {
  • If(Event Player.target.last_nav_update_t + Global.combatants_count * 0.400 < Total Time Elapsed);
  • Call Subroutine(update_target_nav);
  • Abort If Condition Is False;
  • End;
  • If(Is True For Any(Global.elevator_nodes, Distance Between(Event Player, Vector(X Component Of(Current Array Element),
  • Y Component Of(Position Of(Event Player)), Z Component Of(Current Array Element))) < 1.500));
  • Wait(1, Ignore Condition);
  • Abort If Condition Is False;
  • End;
  • Event Player.is_using_combat_pathfinding = 3;
  • Event Player.target_last_seen_pos = Position Of(Event Player.target);
  • Event Player.is_nav_reachable_node = False;
  • Wait(0.016, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Disable Combat Pathfinding")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_using_combat_pathfinding == True;
  • (Event Player.is_aggressive && Event Player.is_target_in_los) == False;
  • }
  • actions
  • {
  • Event Player.is_using_combat_pathfinding = False;
  • }
  • }
  • rule("Team 2: Set Nav (Not in Combat), Get Back to Node, Set Nav is Node")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Event Player.is_using_combat_pathfinding == False;
  • Event Player.is_nav_reachable_node == False;
  • }
  • actions
  • {
  • If(!(Global.is_load_limit_reached || Event Player.is_pathfinding_disabled));
  • If(Event Player.combat_pathfinding_type == False);
  • Set Move Speed(Event Player, (Global.mut_amped ? 115 : 100) / Global.gazed___);
  • End;
  • Event Player.nav_pos = First Of(Sorted Array(Filtered Array(Global.nodes, Is In Line of Sight(Event Player, Current Array Element,
  • Barriers Do Not Block LOS)), Distance Between(Event Player, Current Array Element)));
  • If(Event Player.nav_pos == False);
  • Event Player.nav_pos = First Of(Sorted Array(Global.nodes, Distance Between(Event Player, Current Array Element)));
  • End;
  • Event Player.nav_idx = Index Of Array Value(Global.nodes, Event Player.nav_pos);
  • Event Player.is_nav_reachable_node = True;
  • End;
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Set Nav (Not in Combat), Select Next Node, Set Last Time at Node")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Event Player.is_using_combat_pathfinding == False;
  • Event Player.is_nav_reachable_node == True;
  • Distance Between(Event Player, Event Player.nav_pos) <= 1;
  • }
  • actions
  • {
  • Event Player.last_time_at_node_t = Total Time Elapsed;
  • If(!(Global.is_load_limit_reached || Event Player.is_pathfinding_disabled));
  • If(Global.gamemode == 2 && Event Player.is_living_boss && !Event Player.is_aggressive);
  • If(Event Player.nav_idx == Event Player.dom_nav_guard_idx);
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • Else;
  • Event Player.nav_idx = First Of(Sorted Array(Global.edges[Event Player.nav_idx], Random Real(0, 0.500) + Index Of String Char(
  • Global.char_string, Char In String(Global.distance_matrix[Round To Integer((
  • Current Array Element * Global.nodes_count + Event Player.dom_nav_guard_idx) / 128, Down)], (
  • Current Array Element * Global.nodes_count + Event Player.dom_nav_guard_idx) % 128))));
  • Event Player.nav_pos = Global.nodes[Event Player.nav_idx];
  • End;
  • Else If(Event Player.target.is_combatant);
  • If(Event Player.target.last_nav_update_t + Global.combatants_count * 0.400 < Total Time Elapsed);
  • Call Subroutine(update_target_nav);
  • End;
  • If(
  • Event Player.nav_idx == Event Player.target.best_nav_idx && Event Player.is_aggressive && Event Player.fear_end_t < Total Time Elapsed);
  • Event Player.is_target_in_los = 5;
  • Event Player.is_using_combat_pathfinding = 3;
  • Event Player.target_last_seen_pos = Position Of(Event Player.target);
  • Event Player.is_nav_reachable_node = False;
  • Else;
  • Event Player.nav_idx = First Of(Sorted Array(Global.edges[Event Player.nav_idx], (
  • Event Player.is_aggressive && Event Player.fear_end_t < Total Time Elapsed ? 1 : -1) * (Random Real(0, 0.500)
  • + Index Of String Char(Global.char_string, Char In String(Global.distance_matrix[Round To Integer((
  • Current Array Element * Global.nodes_count + Event Player.target.best_nav_idx) / 128, Down)], (
  • Current Array Element * Global.nodes_count + Event Player.target.best_nav_idx) % 128)))));
  • Event Player.nav_pos = Global.nodes[Event Player.nav_idx];
  • End;
  • Else;
  • Event Player.nav_idx = Random Value In Array(Global.edges[Event Player.nav_idx]);
  • Event Player.nav_pos = Global.nodes[Event Player.nav_idx];
  • End;
  • End;
  • Wait(0.500, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Set Nav (in Combat)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_using_combat_pathfinding == True;
  • }
  • actions
  • {
  • If(!(Global.is_load_limit_reached || Event Player.is_pathfinding_disabled || Has Status(Event Player, Rooted) || Has Status(
  • Event Player, Stunned)));
  • If(Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target) + Event Player.target.eye_offset,
  • Barriers Do Not Block LOS));
  • Event Player.target_last_seen_pos = Position Of(Event Player.target);
  • If(Event Player.is_flying);
  • Event Player.nav_pos = Ray Cast Hit Position(Eye Position(Event Player.target), Eye Position(Event Player.target)
  • + 12 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target) + (Random Integer(0, 1) ? -45 : 45), -60), Null,
  • Null, False);
  • Wait(0.500, Ignore Condition);
  • Else If(Event Player.target.is_flying && Event Player.combat_pathfinding_type != 4);
  • "Roam"
  • Event Player.nav_pos = Position Of(Event Player) + 3.500 * Direction From Angles(Random Integer(-179, 180), False);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • "Long Range, roam randomly, slow"
  • If(Event Player.combat_pathfinding_type == False);
  • If(Distance Between(Event Player, Event Player.target) <= (Hero Of(Event Player) == Hero(Baptiste) ? 20 : 15));
  • Event Player.nav_pos = Position Of(Event Player) + 2.500 * Direction From Angles(Random Integer(-179, 180), False);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player) + 2.500 * Direction From Angles(Horizontal Angle From Direction(Direction Towards(
  • Event Player, Event Player.target)) + Random Value In Array(Array(-45, 0, 45)), False);
  • End;
  • Call Subroutine(find_wp_near_nav);
  • Else If(Event Player.combat_pathfinding_type == 1);
  • If(Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > -2);
  • Event Player.nav_pos = Position Of(Event Player) + Min(3.500, Distance Between(Event Player, Event Player.target) - 2)
  • * Direction Towards(Event Player, Event Player.target);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player.target) + 2 * Direction Towards(Event Player.target, Event Player);
  • Call Subroutine(check_drop);
  • End;
  • Else If(Event Player.combat_pathfinding_type == 2);
  • Event Player.nav_pos = Position Of(Event Player) + Min(1.500, Distance Between(Event Player, Event Player.target) - 2)
  • * Direction Towards(Event Player, Event Player.target);
  • Call Subroutine(find_wp_near_nav);
  • Else If(Event Player.combat_pathfinding_type == 3);
  • Event Player.nav_pos = Position Of(Event Player.target) + 5 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target)
  • + Random Value In Array(Array(-45, 45)), False);
  • If(Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > -2);
  • Event Player.nav_pos = Position Of(Event Player) + Min(3.500, Distance Between(Event Player, Event Player.nav_pos))
  • * Direction Towards(Event Player, Event Player.nav_pos);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Call Subroutine(check_drop);
  • End;
  • Else If(Event Player.combat_pathfinding_type == 4);
  • If(Distance Between(Event Player, Event Player.target) <= 12);
  • Event Player.nav_pos = Position Of(Event Player) + 3.500 * Direction From Angles(Horizontal Angle From Direction(Direction Towards(
  • Event Player.target, Event Player)) + (Distance Between(Event Player, Event Player.target)
  • <= 8 && Event Player.real_speed <= 1 ? Random Value In Array(Array(-135, 135)) : False), False);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player);
  • End;
  • Else If(Event Player.combat_pathfinding_type == 5);
  • Event Player.nav_pos = Position Of(Event Player.target) + 3 * Direction From Angles(Horizontal Facing Angle Of(
  • Event Player.target), False);
  • If(Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > -2);
  • Event Player.nav_pos = Position Of(Event Player) + Min(3.500, Distance Between(Event Player, Event Player.nav_pos))
  • * Direction Towards(Event Player, Event Player.nav_pos);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Call Subroutine(check_drop);
  • End;
  • Else If(Event Player.combat_pathfinding_type == 6);
  • Event Player.nav_pos = Position Of(Event Player.target) + 1.500 * Direction From Angles(Horizontal Facing Angle Of(
  • Event Player.target) + (Horizontal Angle Towards(Event Player.target, Event Player) > 0 ? 90 : -90), False);
  • If(Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > -2);
  • Event Player.nav_pos = Position Of(Event Player) + Min(3.500, Distance Between(Event Player, Event Player.nav_pos))
  • * Direction Towards(Event Player, Event Player.nav_pos);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Call Subroutine(check_drop);
  • End;
  • Else If(Event Player.combat_pathfinding_type == 7);
  • If(Distance Between(Event Player, Event Player.target) <= 17);
  • Event Player.nav_pos = Position Of(Event Player) + 3.500 * Direction From Angles(Random Integer(-179, 180), False);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player) + 3.500 * Direction From Angles(Horizontal Angle From Direction(Direction Towards(
  • Event Player, Event Player.target)) + Random Value In Array(Array(-45, 0, 45)), False);
  • End;
  • Call Subroutine(find_wp_near_nav);
  • Else If(Event Player.combat_pathfinding_type == 8);
  • Global.temp_1 = Remove From Array(Filtered Array(Players Within Radius(Event Player, 3, Color(Team 2), Off),
  • Current Array Element.is_alive), Event Player);
  • If(Count Of(Global.temp_1));
  • Event Player.nav_pos = Position Of(Event Player) + 3.500 * Direction Towards(First Of(Sorted Array(Global.temp_1, Distance Between(
  • Event Player, Current Array Element))), Event Player);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player);
  • End;
  • Else If(Event Player.combat_pathfinding_type == 9);
  • If(Event Player.ab_var_1);
  • If(Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > -2);
  • Event Player.nav_pos = Position Of(Event Player) + 6 * Direction Towards(Event Player, Event Player.target);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player.target);
  • Call Subroutine(check_drop);
  • End;
  • Else;
  • If(Event Player.ab_var_2);
  • Event Player.nav_pos = Position Of(Event Player.target) + 3 * Direction From Angles(Horizontal Facing Angle Of(
  • Event Player.target), False);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player.target) + 5 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target)
  • + Random Value In Array(Array(-45, 45)), False);
  • End;
  • If(Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > -2);
  • Event Player.nav_pos = Position Of(Event Player) + Min(4, Distance Between(Event Player, Event Player.nav_pos))
  • * Direction Towards(Event Player, Event Player.nav_pos);
  • Call Subroutine(find_wp_near_nav);
  • Else;
  • Call Subroutine(check_drop);
  • End;
  • End;
  • End;
  • End;
  • If(Event Player.combat_pathfinding_type == False);
  • Set Move Speed(Event Player, (Global.mut_amped ? 75.500 : 65) / Global.gazed___);
  • End;
  • Else;
  • If(Distance Between(Event Player, Vector(X Component Of(Event Player.target_last_seen_pos), Y Component Of(Position Of(
  • Event Player)), Z Component Of(Event Player.target_last_seen_pos))) < 0.500);
  • Event Player.target_last_seen_pos = Position Of(Event Player.target);
  • End;
  • If(Event Player.is_flying);
  • Event Player.nav_pos = Event Player.target_last_seen_pos;
  • Else;
  • Event Player.nav_pos = Position Of(Event Player) + Min(3.500, Distance Between(Event Player, Event Player.target_last_seen_pos))
  • * Direction Towards(Event Player, Event Player.target_last_seen_pos);
  • Call Subroutine(find_wp_near_nav);
  • End;
  • If(Event Player.combat_pathfinding_type == False);
  • Set Move Speed(Event Player, (Global.mut_amped ? 115 : 100) / Global.gazed___);
  • End;
  • End;
  • End;
  • Wait(Global.is_load_limit_reached ? 1 : 0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Find Target")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • }
  • actions
  • {
  • If(!(Event Player.fear_end_t >= Total Time Elapsed || Event Player.is_wraith || (Hero Of(Event Player) == Hero(Sombra)
  • && Event Player.ab_player)));
  • If(Event Player.is_ignoring_other_targets);
  • Global.temp_1 = Event Player.target.is_combatant && !Event Player.target.downed_start_t && !Event Player.target.active_ab_is_cloaked && Event Player.target.is_invisible <= (
  • Distance Between(Event Player, Event Player.target) <= 2.400 || Global.is_infrasight_on) && Is In Line of Sight(Eye Position(
  • Event Player), Eye Position(Event Player.target) + Event Player.target.eye_offset, Barriers Do Not Block LOS)
  • ? Event Player.target : Null;
  • Else;
  • Global.temp_1 = First Of(Sorted Array(Filtered Array(Global.combatants,
  • !Current Array Element.downed_start_t && !Current Array Element.active_ab_is_cloaked && Current Array Element.is_invisible <= (
  • Distance Between(Event Player, Current Array Element) <= 2.400 || Global.is_infrasight_on) && Is In Line of Sight(Eye Position(
  • Event Player), Eye Position(Current Array Element) + Current Array Element.eye_offset, Barriers Do Not Block LOS)), Array(1,
  • 0.250, 2, 4)[Current Array Element.ab_priority] * (Current Array Element == Event Player.target ? 0.250 : 1)
  • * Distance Between(Event Player, Current Array Element) + (
  • !Event Player.is_ranged && Current Array Element.is_flying ? 500 : False) + (Has Status(Current Array Element, Asleep)
  • ? 1000 : False) + (Has Status(Current Array Element, Invincible) || Has Status(Current Array Element, Phased Out)
  • ? 2000 : False) + (Current Array Element.active_ab_is_frenzied ? -5000 : False)));
  • End;
  • If(Global.temp_1);
  • Event Player.is_target_in_los = 5;
  • Event Player.target = Global.temp_1;
  • Event Player.target_last_seen_pos = Position Of(Event Player.target);
  • Else;
  • If(
  • Event Player.target.downed_start_t || !Event Player.target.is_combatant || Event Player.target.active_ab_is_cloaked || Event Player.target.is_invisible > (
  • Distance Between(Event Player, Event Player.target) <= 2.400 || Global.is_infrasight_on));
  • Call Subroutine(find_chase_target);
  • Event Player.is_target_in_los = False;
  • Else If(Event Player.is_target_in_los);
  • If(!Event Player.is_flying && Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) > 2);
  • Event Player.is_using_combat_pathfinding = False;
  • End;
  • Event Player.is_target_in_los -= 1;
  • End;
  • If(!Event Player.is_target_in_los && Ammo(Event Player, False) < 0.500 * Max Ammo(Event Player, False));
  • Press Button(Event Player, Button(Reload));
  • End;
  • End;
  • End;
  • Wait(Global.is_load_limit_reached ? 1 : 0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Calculate Real Speed")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • }
  • actions
  • {
  • If(Global.is_load_limit_reached || Event Player.is_pathfinding_disabled);
  • "Larger than 1.5 to not trigger stuck rules"
  • Event Player.real_speed = 1.600;
  • Wait(0.500, Abort When False);
  • Else;
  • Event Player.real_speed_pos_1 = Position Of(Event Player);
  • If(Is Jumping(Event Player));
  • Event Player.last_jump_t = Total Time Elapsed;
  • End;
  • If(Event Player.last_jump_t + 0.150 >= Total Time Elapsed);
  • Event Player.real_speed = Distance Between(Vector(X Component Of(Event Player.real_speed_pos_1), Y Component Of(
  • Event Player.real_speed_pos_2), Z Component Of(Event Player.real_speed_pos_1)), Event Player.real_speed_pos_2) / 0.112;
  • Else;
  • Event Player.real_speed = Distance Between(Event Player.real_speed_pos_1, Event Player.real_speed_pos_2) / 0.112;
  • End;
  • Wait(0.112, Abort When False);
  • Event Player.real_speed_pos_2 = Position Of(Event Player);
  • If(Is Jumping(Event Player));
  • Event Player.last_jump_t = Total Time Elapsed;
  • End;
  • If(Event Player.last_jump_t + 0.150 >= Total Time Elapsed);
  • Event Player.real_speed = Distance Between(Vector(X Component Of(Event Player.real_speed_pos_1), Y Component Of(
  • Event Player.real_speed_pos_2), Z Component Of(Event Player.real_speed_pos_1)), Event Player.real_speed_pos_2) / 0.112;
  • Else;
  • Event Player.real_speed = Distance Between(Event Player.real_speed_pos_1, Event Player.real_speed_pos_2) / 0.112;
  • End;
  • Wait(0.112, Abort When False);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Bot is stuck")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Event Player.real_speed <= 1.500;
  • Event Player.is_flying == False;
  • Has Status(Event Player, Rooted) == False;
  • Has Status(Event Player, Stunned) == False;
  • Distance Between(Event Player, Vector(X Component Of(Event Player.nav_pos), Y Component Of(
  • Event Player.is_using_combat_pathfinding ? Position Of(Event Player) : Event Player.nav_pos), Z Component Of(
  • Event Player.nav_pos))) >= 0.500;
  • }
  • actions
  • {
  • Wait(0.500, Abort When False);
  • Loop If(Hero Of(Event Player) == Hero(Reinhardt) && Is Using Ultimate(Event Player));
  • If(Is True For Any(Global.elevator_nodes, Distance Between(Event Player, Vector(X Component Of(Current Array Element),
  • Y Component Of(Position Of(Event Player)), Z Component Of(Current Array Element))) < 1.500));
  • Wait(1.500, Abort When False);
  • End;
  • Abort If Condition Is False;
  • If(Event Player.is_using_combat_pathfinding);
  • If(Absolute Value(Horizontal Angle From Direction(Throttle Of(Event Player))) <= 45);
  • Press Button(Event Player, Button(Jump));
  • End;
  • Else;
  • Press Button(Event Player, Button(Jump));
  • If(!(Event Player.is_target_in_los || Event Player.fear_end_t >= Total Time Elapsed));
  • Disable Movement Collision With Players(Event Player);
  • Wait(0.500, Ignore Condition);
  • Enable Movement Collision With Players(Event Player);
  • End;
  • Wait(0.500, Abort When False);
  • Event Player.is_nav_reachable_node = False;
  • End;
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Teleport if Target not in LOS and hasn't reached Node for 8 seconds")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Has Status(Event Player, Rooted) == False;
  • Has Status(Event Player, Stunned) == False;
  • Event Player.is_pathfinding_disabled == False;
  • Event Player.is_target_in_los == False;
  • Event Player.fear_end_t < Total Time Elapsed;
  • Event Player.last_time_at_node_t < Total Time Elapsed;
  • }
  • actions
  • {
  • Wait(8, Abort When False);
  • Loop If(Global.is_load_limit_reached);
  • Call Subroutine(teleport_to_free_spawn);
  • }
  • }
  • rule("Team 2: Bot took damage, Dodge")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Abort If(Global.is_load_limit_reached);
  • Abort If(Global.gazed___);
  • Abort If(Event Player.is_pathfinding_disabled);
  • Abort If(!Event Player.can_dodge);
  • Abort If(!Event Player.is_using_combat_pathfinding);
  • If(!(Global.is_load_limit_reached || Has Status(Event Player, Rooted) || Has Status(Event Player, Stunned)));
  • If(Event Player.combat_pathfinding_type == 4);
  • Event Player.nav_pos = Position Of(Event Player) - Global.mut_artful_dodger ? 7 : 3.500 * Direction From Angles(
  • Horizontal Angle From Direction(Vector Towards(Event Player, Event Player.target)) + Random Integer(-90, 90), False);
  • Else;
  • Event Player.nav_pos = Position Of(Event Player) + Global.mut_artful_dodger ? 7 : 3.500 * Direction From Angles(
  • Horizontal Angle From Direction(Vector Towards(Event Player, Event Player.target)) + Random Integer(-90, 90), False);
  • End;
  • Call Subroutine(find_wp_near_nav);
  • End;
  • Wait(Global.mut_artful_dodger ? 0.600 : 1.200, Ignore Condition);
  • }
  • }
  • rule("Team 2: Is Hacked, Tase Bot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Has Status(Event Player, Hacked) == True;
  • }
  • actions
  • {
  • Abort If(Event Player.is_living_boss);
  • Abort If(Event Player.is_hardwired);
  • Set Reload Enabled(Event Player, False);
  • Set Status(Event Player, Null, Burning, 9999);
  • Set Status(Event Player, Null, Rooted, 9999);
  • Start Facing(Event Player, Direction From Angles(Evaluate Once(Horizontal Facing Angle Of(Event Player)) + Random Integer(-75,
  • -15), Random Integer(35, 55) + Max(-90, (Evaluate Once(Total Time Elapsed) - Total Time Elapsed) * 18)), Has Status(
  • Event Player, Stunned) ? 0 : (Evaluate Once(Total Time Elapsed) - Total Time Elapsed > -0.200 ? 1000 : 100), To World,
  • Direction and Turn Rate);
  • Wait Until(!Has Status(Event Player, Hacked), 99999);
  • Set Reload Enabled(Event Player, True);
  • Clear Status(Event Player, Burning);
  • Clear Status(Event Player, Rooted);
  • Abort If(!Event Player.is_alive);
  • Call Subroutine(start_facing);
  • }
  • }
  • rule("Team 2: Quick Melee")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.can_quick_melee == True;
  • Event Player.is_target_in_los == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Is Reloading(Event Player));
  • Loop If(Has Status(Event Player, Hacked));
  • Loop If(Distance Between(Event Player, Event Player.target) >= 3);
  • Press Button(Event Player, Button(Melee));
  • Wait(10, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2: Bot is feared")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.fear_end_t >= Total Time Elapsed;
  • }
  • actions
  • {
  • Event Player.is_target_in_los = False;
  • If(Event Player.is_living_boss);
  • Start Forcing Player Outlines(Event Player, All Players(All Teams), True, Color(Violet), Always);
  • Else;
  • Start Forcing Player Outlines(Event Player, All Players(All Teams), True, Color(Violet), Default);
  • End;
  • Wait Until(Event Player.fear_end_t < Total Time Elapsed, 99999);
  • If(Event Player.is_living_boss);
  • Start Forcing Player Outlines(Event Player, All Players(All Teams), True, Color(Yellow), Always);
  • Else;
  • Stop Forcing Player Outlines(Event Player, All Players(All Teams));
  • }
  • }
  • rule("MUT Team 2 (Gamechanging Mutator): Gamechanging Mutator was enabled")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.is_gmut_enabled == True;
  • }
  • actions
  • {
  • Wait(0.500, Ignore Condition);
  • If(Global.gmut_storm_raging);
  • Create Effect(Event Player.gmut_var ? All Players(All Teams) : Empty Array, Ana Nano Boosted Effect, Color(Team 2), Event Player,
  • 1, Visible To);
  • End;
  • If(Global.gmut_adaptive_shield);
  • Create Effect(Event Player.gmut_var == 1 ? All Players(All Teams) : Empty Array, Wrecking Ball Adaptive Shield Target Effect,
  • Color(Team 2), Event Player, 1, Visible To);
  • End;
  • If(Global.gmut_fortified);
  • Add Health Pool To Player(Event Player, Armor, 0.400 * Event Player.health_percent, True, True);
  • End;
  • Global.is_gmut_enabled = False;
  • }
  • }
  • rule("MUT Team 2 (Gamechanging Mutator): Adaptive Shield")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.gmut_adaptive_shield == True;
  • Is Alive(Event Player) == True;
  • Event Player.gmut_var == False;
  • Normalized Health(Event Player) <= 0.500;
  • }
  • actions
  • {
  • Abort If(Event Player.iv_is_portal);
  • If(Slot Of(Event Player) == 1);
  • "Set Player Health converts the shield into regular HP, so wait until after"
  • Wait(0.016, Abort When False);
  • Abort If Condition Is False;
  • End;
  • Global.temp_1 = Count Of(Filtered Array(Global.combatants, Distance Between(Event Player, Current Array Element)
  • <= 8 && Is In Line of Sight(Event Player, Current Array Element, Enemy Barriers Block LOS)));
  • If(Global.temp_1);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Blue), Event Player, 1);
  • Add Health Pool To Player(Event Player, Shields, 0.750 * (Global.temp_1 / Global.combatants_count) * Max Health(Event Player),
  • False, False);
  • Event Player.HP_Pool[3] = Last Created Health Pool;
  • Event Player.gmut_var = 1;
  • Wait Until(!Health Of Type(Event Player, Shields), 7);
  • Remove Health Pool From Player(Event Player.HP_Pool[3]);
  • Event Player.gmut_var = 2;
  • Else;
  • Event Player.gmut_var = 2;
  • }
  • }
  • rule("MUT Team 2 (Gamechanging Mutator): Creeps")
  • {
  • event
  • {
  • Player Died;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.gmut_creeps == True;
  • Event Player.iv_is_portal == False;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Black), Event Player, 1);
  • Wait(0.500, Abort When False);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Red), Event Player, Event Player.real_tier * 1.5 + 1);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Black), Event Player, Event Player.real_tier * 1.5);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Violet), Event Player, Event Player.real_tier * 1.5 + 1);
  • Damage(Players Within Radius(Event Player, Event Player.real_tier * 1.5 + 1, Team 1, Surfaces And All Barriers), Event Player,
  • Event Player.real_tier * 80);
  • }
  • }
  • rule("MUT Team 2 (Gamechanging Mutator): Fortified")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_fortified == True;
  • Has Status(Event Player, Stunned) == True;
  • Event Player.gmut_fortified_bypass_end_t < Total Time Elapsed;
  • }
  • actions
  • {
  • If(Has Status(Event Player, Knocked Down));
  • Clear Status(Event Player, Knocked Down);
  • Wait(1, Ignore Condition);
  • Else If(Has Status(Event Player, Asleep));
  • Wait Until(!Has Status(Event Player, Asleep), 2);
  • If(Has Status(Event Player, Asleep));
  • Clear Status(Event Player, Asleep);
  • Wait(0.500, Ignore Condition);
  • End;
  • Else If(Has Status(Event Player, Frozen));
  • Wait Until(!Has Status(Event Player, Frozen), 0.800);
  • Clear Status(Event Player, Frozen);
  • Else;
  • Wait Until(!Has Status(Event Player, Stunned), 0.500);
  • Clear Status(Event Player, Stunned);
  • End;
  • Wait(0.250, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("MUT Team 2 (Gamechanging Mutator): Sympathy Gains")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Global.gmut_sympathy_gains == True;
  • Is Alive(Event Player) == True;
  • Event Player.is_living_boss == False;
  • }
  • actions
  • {
  • Set Status(Event Player, Null, Unkillable, 9999);
  • Wait Until(Health(Event Player) <= 1, 99999);
  • Set Status(Event Player, Null, Stunned, 1.333);
  • Set Status(Event Player, Null, Invincible, 0.100);
  • Heal(Event Player, Null, Max Health(Event Player) * 0.050);
  • Clear Status(Event Player, Unkillable);
  • }
  • }
  • rule("Team 2 (Ability): Heavy Impact / Damage Stagger")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Abort If(!(Event Player.can_stagger || Attacker.ab_heavy_impact));
  • "the lower the minimum, the higher the chance"
  • Abort If(Random Real(-0.005, 0.800) > Event Damage / Max Health(Event Player));
  • Event Player.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 0.500 * Max(0.800, Attacker.ab_heavy_impact),
  • Event Player.gmut_fortified_bypass_end_t);
  • Set Status(Event Player, Attacker, Stunned, (Event Player.is_fortified ? 0.500 : 1) * Max(0.800, Attacker.ab_heavy_impact));
  • Wait(5, Ignore Condition);
  • }
  • }
  • rule("Team 2 Brigitte: Hold / Drop Shield if Target and Distance to Target >= 6m")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Brigitte;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Distance Between(Event Player, Event Player.target) >= 6;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait Until(!(Event Player.is_target_in_los && Distance Between(Event Player, Event Player.target) >= 6), 99999);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Team 2 Brigitte: Start / Stop Attacking if Distance to Target < 6m")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Brigitte;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Distance Between(Event Player, Event Player.target) < 6;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait Until(!(Event Player.is_target_in_los && Distance Between(Event Player, Event Player.target) < 6), 99999);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Team 2 Brigitte: Increase / Normalize Move Speed while holding Shield")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Brigitte;
  • }
  • conditions
  • {
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, Global.mut_amped ? 164.286 : 142.857);
  • Wait Until(!Is Firing Secondary(Event Player), 99999);
  • Set Move Speed(Event Player, Global.mut_amped ? 115 : 100);
  • }
  • }
  • rule("Team 2 Brigitte: Whip Shot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Brigitte;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > (Event Player.target.is_flying ? 100 : 50));
  • Loop If(Distance Between(Event Player, Event Player.target) <= 6 || Distance Between(Event Player, Event Player.target) >= 20);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(3, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Zarya: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • If(Distance Between(Event Player, Event Player.target) > 10);
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(1.500, Ignore Condition);
  • Else;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(3, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(0.500, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Zarya: Self Bubble")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(10, Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Zarya: Team Bubble")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Ability Cooldown(Event Player, Button(Ability 2)) <= False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • Wait(5, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Zarya: Grav")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Is Using Ability 1(Event Player) == False;
  • (Global.wave_number >= 12 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Set Projectile Speed(Event Player, 30);
  • Set Projectile Gravity(Event Player, 60);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.100, Ignore Condition);
  • Set Projectile Speed(Event Player, 100);
  • Set Projectile Gravity(Event Player, 100);
  • Wait(Random Real(60, 80), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Lucio: Swap to heal and shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Lúcio;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Press Button(Event Player, Button(Ability 1));
  • If(Distance Between(Event Player, First Of(Sorted Array(Filtered Array(All Living Players(Team 1), Is In View Angle(Event Player,
  • Current Array Element, 45)), Current Array Element))) <= 4);
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(0.700, Ignore Condition);
  • Else;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(2, Ignore Condition);
  • End;
  • Press Button(Event Player, Button(Ability 2));
  • Loop If Condition Is True;
  • Press Button(Event Player, Button(Ability 1));
  • }
  • }
  • rule("Team 2 Lucio: Ultimate")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Lúcio;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Using Ability 1(Event Player) == False;
  • (Global.wave_number >= 12 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Abort If Condition Is False;
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(Random Real(40, 45), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Moira: Start grasp and don't stop")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Moira;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Using Ability 2(Event Player) == False;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Team 2 Moira: Fade")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Moira;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Event Player.is_target_in_los >= 4;
  • Distance Between(Event Player, Event Player.target) <= 40;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • If(Is Using Ability 1(Event Player) && Event Player.is_target_in_los);
  • Teleport(Event Player, Ray Cast Hit Position(Eye Position(Event Player.target), Position Of(Event Player.target)
  • - 2.500 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target), False), Null, Null, False)
  • + 0.500 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target), False));
  • Event Player.is_nav_reachable_node = False;
  • Wait(4, Ignore Condition);
  • End;
  • Wait(4, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Moira: Biotic Orb")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Moira;
  • }
  • conditions
  • {
  • Distance Between(Event Player, Event Player.target) <= 40;
  • Event Player.is_target_in_los >= 3;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.300, Ignore Condition);
  • Press Button(Event Player, Random Integer(1, 2) == 1 ? Button(Primary Fire) : Button(Secondary Fire));
  • Wait(5, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Moira: Ultimate")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Moira;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Normalized Health(Event Player) <= 0.400;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Wrecking Ball: Explode")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Wrecking Ball;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Distance Between(Event Player, Event Player.target) <= 4;
  • }
  • actions
  • {
  • Wait(0.35, Abort When False);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Event Player, 1);
  • Set Ultimate Charge(Event Player, 100);
  • Wait(0.016, Ignore Condition);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.500, Ignore Condition);
  • Set Status(Event Player, Null, Rooted, 9999);
  • Set Status(Event Player, Null, Stunned, 9999);
  • Start Damage Over Time(Event Player, Null, 9999, Max Health(Event Player) * 0.1);
  • While(Is Alive(Event Player));
  • Start Damage Over Time(Players Within Radius(Event Player, 5, Team 1, Surfaces And All Barriers), Event Player, 1.5, 50);
  • Set Status(Players Within Radius(Event Player, 5, Color(Team 1), Surfaces And All Barriers), Null, Burning, 1.5);
  • Wait(1, Ignore Condition);
  • End;
  • Kill(Event Player, Null);
  • }
  • }
  • rule("Team 2 Cassidy: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Cassidy;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • If(Global.mut_lock_n_load || Distance Between(Event Player, Event Player.target) > 5);
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.600, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Else;
  • Press Button(Event Player, Button(Secondary Fire));
  • End;
  • Wait(Random Real(0.800, 1.200), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Cassidy: Combat Roll")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Cassidy;
  • }
  • actions
  • {
  • Abort If(Global.is_load_limit_reached);
  • Abort If(!Event Player.is_using_combat_pathfinding);
  • Abort If(Random Integer(1, 100) > 30);
  • Global.temp_1 = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + 6 * World Vector Of(Throttle Of(
  • Event Player) == Vector(False, False, False) ? Forward : Throttle Of(Event Player), Event Player, Rotation), Null, Null,
  • False);
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 5 * Down, Null, Null, False)) < 5);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(10, Ignore Condition);
  • Else;
  • Wait(2, Ignore Condition);
  • }
  • }
  • rule("Team 2 Soldier: Shoot, Is Charging (1), Protecting Charge Target (2), Has Used Ability (3)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.ab_var_1 == False;
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • If(Event Player.real_tier == 3);
  • Press Button(Event Player, Button(Secondary Fire));
  • If(Global.mut_lock_n_load);
  • Wait(0.500, Ignore Condition);
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(1, Ignore Condition);
  • Else;
  • If(Is Firing Secondary(Event Player));
  • Wait(0.500, Ignore Condition);
  • Press Button(Event Player, Button(Secondary Fire));
  • Set Ammo(Event Player, 0, False);
  • Else;
  • Wait(0.500, Ignore Condition);
  • Press Button(Event Player, Button(Secondary Fire));
  • If(Is Firing Secondary(Event Player));
  • Set Ammo(Event Player, 0, False);
  • End;
  • End;
  • Wait(2, Ignore Condition);
  • End;
  • Else If(Event Player.real_tier == 4);
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(1.600, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • If(Ammo(Event Player, False) <= 4);
  • Press Button(Event Player, Button(Reload));
  • End;
  • Wait(Event Player.ab_var_2 ? 0.200 : Random Real(1.200, 1.600), Ignore Condition);
  • Else;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.500, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • If(Ammo(Event Player, False) <= 2);
  • Press Button(Event Player, Button(Reload));
  • End;
  • Wait(Event Player.real_tier == 1 ? Random Real(1.200, 1.800) : Random Real(0.500, 0.900), Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Soldier: Biotic Field (Heavy Trooper), Emit Smoke (Grenadier)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.ab_var_3 == False;
  • Normalized Health(Event Player) <= 0.500;
  • }
  • actions
  • {
  • Event Player.ab_var_3 = True;
  • If(Event Player.real_tier == 3);
  • Players Within Radius(Eye Position(Event Player), 9, Color(Team 1), Surfaces).Smoked_Screen = True;
  • Play Effect(All Players(All Teams), Bad Explosion, Color(White), Event Player, 9);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Gray), Event Player, 9);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • Else;
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Team 1: Smoke Screen (Mutator: Chaff)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.Smoked_Screen == True;
  • Event Player.downed_start_t == False;
  • }
  • actions
  • {
  • If(Global.mut_signal_jammer);
  • Start Damage Over Time(Event Player, Null, 5, Max Health(Event Player) * 0.225);
  • Disable Hero HUD(Event Player);
  • Disable Text Chat(Event Player);
  • Start Forcing Player Outlines(All Players(All Teams), Event Player, False, Color(White), Default);
  • Create HUD Text(Event Player, Null, Null, Custom String(
  • " \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"),
  • Left, -500, Null, Null, Null, Visible To and String, Default Visibility);
  • Event Player.HUDs___[1] = Last Text ID;
  • End;
  • Wait Until(Is Dead(Event Player), 5);
  • Enable Hero HUD(Event Player);
  • Enable Text Chat(Event Player);
  • Stop Forcing Player Outlines(All Players(All Teams), Event Player);
  • Event Player.Smoked_Screen = False;
  • Destroy HUD Text(Event Player.HUDs___[1]);
  • Start Forcing Player Outlines(Filtered Array(All Players(Team 2), Current Array Element.is_living_boss), Event Player, True, Color(
  • Yellow), Always);
  • }
  • }
  • rule("Team 2 Soldier (Cloaker): Tactical Visor")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.real_tier == 4;
  • Event Player.is_target_in_los >= 5;
  • Event Player.target.is_flying == False;
  • Distance Between(Event Player, Event Player.target) <= 40;
  • }
  • actions
  • {
  • Wait(0.500, Ignore Condition);
  • If(Count Of(Filtered Array(Global.combatants, Current Array Element.downed_start_t)) <= (Global.combatants_count >= 4)
  • && Random Integer(1, 100) > 50);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • If(Is Using Ultimate(Event Player));
  • Disable Movement Collision With Players(Event Player);
  • Global.temp_1 = Distance Between(Event Player, Event Player.target) <= 10 ? 2 : 1.500;
  • Set Status(Event Player, Null, Rooted, Global.temp_1);
  • Event Player.is_ignoring_other_targets = True;
  • Event Player.ab_var_1 = 1;
  • Wait Until(
  • Event Player.target.downed_start_t || !Event Player.target.is_combatant || Event Player.target.active_ab_is_cloaked || Event Player.target.is_invisible > (
  • Distance Between(Event Player, Event Player.target) <= 2.400 || Global.is_infrasight_on)
  • || !Event Player.ab_var_1 || !Is Using Ultimate(Event Player) || Has Status(Event Player, Stunned)
  • || Event Player.fear_end_t >= Total Time Elapsed, Global.temp_1 + 0.050);
  • Event Player.ab_var_1 = 2;
  • Wait Until(
  • Event Player.target.downed_start_t || !Event Player.target.is_combatant || Event Player.target.active_ab_is_cloaked || Event Player.target.is_invisible > (
  • Distance Between(Event Player, Event Player.target) <= 2.400 || Global.is_infrasight_on)
  • || !Event Player.ab_var_1 || !Is Using Ultimate(Event Player) || Has Status(Event Player, Stunned)
  • || Event Player.fear_end_t >= Total Time Elapsed, 99999);
  • Event Player.is_ignoring_other_targets = False;
  • Event Player.ab_var_1 = False;
  • Enable Movement Collision With Players(Event Player);
  • Wait Until(!Is Using Ultimate(Event Player), 99999);
  • Wait(8, Ignore Condition);
  • End;
  • Else;
  • Wait(3, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Soldier (Cloaker): Stuck while charging")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.ab_var_1 == 2;
  • (Event Player.real_speed <= 1.500 || Event Player.target.is_flying) == True;
  • }
  • actions
  • {
  • Wait(2, Abort When False);
  • Event Player.ab_var_1 = False;
  • }
  • }
  • rule("Team 2 Soldier (Cloaker): Sprint")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.ab_var_1 == 2;
  • Is Using Ability 1(Event Player) == False;
  • Magnitude Of(Throttle Of(Event Player)) > False;
  • Absolute Value(Horizontal Angle From Direction(Throttle Of(Event Player))) <= 60;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Wait(0.500, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Soldier (Cloaker): Quick Melee")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.ab_var_1 == 2;
  • Distance Between(Event Player, Event Player.target) <= 3;
  • }
  • actions
  • {
  • Event Player.nav_pos = Position Of(Event Player.target) + 2.500 * Direction Towards(Event Player, Event Player.target);
  • Event Player.ab_var_1 = False;
  • Press Button(Event Player, Button(Melee));
  • }
  • }
  • rule("Team 2 Soldier (Cloaker): Quick Melee, apply Stun")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 2;
  • Soldier: 76;
  • }
  • actions
  • {
  • Abort If(Event Ability != Button(Melee));
  • Abort If(Event Player.real_tier != 4);
  • Abort If(Event Player.target != Victim);
  • If(Victim.perk_brass_knuckles && Is Meleeing(Victim));
  • Wait(2, Ignore Condition);
  • Else If(Hero Of(Victim) == Hero(Reinhardt) && Is Using Ability 1(Victim) && Absolute Value(Horizontal Angle Towards(Victim,
  • Event Player)) <= 60);
  • Event Player.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 2, Event Player.gmut_fortified_bypass_end_t);
  • Set Status(Event Player, Victim, Knocked Down, 2);
  • Set Status(Victim, Event Player, Knocked Down, 2);
  • Wait(1, Ignore Condition);
  • Else;
  • Damage(Victim, Event Player, 150);
  • "Stun Sound"
  • Set Status(Victim, Event Player, Stunned, 3.500);
  • Wait(0.050, Ignore Condition);
  • Set Status(Victim, Event Player, Knocked Down, 3.500);
  • Event Player.ab_var_2 = True;
  • Start Holding Button(Event Player, Button(Crouch));
  • Wait(1, Ignore Condition);
  • Wait Until(!(Event Player.is_target_in_los && Event Player.target == Victim && Has Status(Victim, Knocked Down)), 2);
  • Event Player.ab_var_2 = False;
  • Stop Holding Button(Event Player, Button(Crouch));
  • }
  • }
  • rule("Team 2 Baptiste: Shoot, Has Used Immortality Field (1), Revive last time used (2)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Baptiste;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(Random Real(0.700, 1.100), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Baptiste: Immortality Field")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Baptiste;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Event Player.ab_var_1 == False;
  • Normalized Health(Event Player) <= 0.250;
  • (Global.wave_number >= 10 || Event Player.is_living_boss) == True;
  • Has Status(Event Player, Hacked) == False;
  • Has Status(Event Player, Stunned) == False;
  • }
  • actions
  • {
  • Event Player.ab_var_1 = True;
  • Abort If(!Event Player.is_living_boss && Random Integer(1, 100) > 40);
  • Press Button(Event Player, Button(Ability 2));
  • }
  • }
  • rule("Team 2 Echo: Shoot, Is Landing (1)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(1.100, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Wait(Random Real(0.400, 0.600), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Echo: Sticky Bombs")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 50);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 20);
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(6, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Echo: Flight")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.is_aggressive == True;
  • Distance Between(Event Player, Event Player.target) <= 40;
  • }
  • actions
  • {
  • Event Player.is_using_combat_pathfinding = 3;
  • Event Player.is_nav_reachable_node = False;
  • Press Button(Event Player, Button(Jump));
  • Press Button(Event Player, Button(Ability 1));
  • If(Is Using Ability 1(Event Player));
  • Event Player.is_flying = True;
  • Wait Until(!Is Using Ability 1(Event Player), 99999);
  • If(Event Player.is_living_boss);
  • "Without a wait the second flight is silent"
  • Wait(0.016, Ignore Condition);
  • Press Button(Event Player, Button(Jump));
  • Press Button(Event Player, Button(Ability 1));
  • Wait Until(!Is Using Ability 1(Event Player), 99999);
  • End;
  • Event Player.nav_pos = First Of(Sorted Array(Filtered Array(Global.nodes, Is In Line of Sight(Event Player, Current Array Element,
  • Barriers Do Not Block LOS)), 2 * Distance Between(Event Player, Current Array Element) - Vertical Angle Towards(Event Player,
  • Current Array Element)));
  • If(Event Player.nav_pos == False);
  • Event Player.nav_pos = First Of(Sorted Array(Global.nodes, Distance Between(Event Player, Current Array Element)));
  • End;
  • Event Player.is_flying = False;
  • Event Player.ab_var_1 = True;
  • Event Player.is_pathfinding_disabled = True;
  • Wait Until(Is On Ground(Event Player) || !Event Player.is_alive, 99999);
  • Event Player.ab_var_1 = False;
  • Event Player.is_pathfinding_disabled = False;
  • Wait(4, Ignore Condition);
  • Else;
  • Wait(2, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Echo: Ascend / Descend")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.is_flying == True;
  • Absolute Value(Y Component Of(Position Of(Event Player)) - Y Component Of(Event Player.nav_pos)) >= 1;
  • }
  • actions
  • {
  • If(Y Component Of(Position Of(Event Player)) < Y Component Of(Event Player.nav_pos));
  • Start Holding Button(Event Player, Button(Jump));
  • Wait Until(!(Event Player.is_flying && Y Component Of(Event Player.nav_pos) - Y Component Of(Position Of(Event Player)) >= 1),
  • 99999);
  • Stop Holding Button(Event Player, Button(Jump));
  • Else;
  • Start Holding Button(Event Player, Button(Crouch));
  • Wait Until(!(Event Player.is_flying && Y Component Of(Position Of(Event Player)) - Y Component Of(Event Player.nav_pos) >= 1),
  • 99999);
  • Stop Holding Button(Event Player, Button(Crouch));
  • }
  • }
  • rule("Team 2 Echo: Glide")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.ab_var_1 == True;
  • }
  • actions
  • {
  • Wait(0.250, Abort When False);
  • Start Holding Button(Event Player, Button(Jump));
  • Wait Until(!Event Player.ab_var_1, 2.500);
  • Stop Holding Button(Event Player, Button(Jump));
  • }
  • }
  • rule("Team 2 Mei: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Mei;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Using Ability 1(Event Player) == False;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • If(Distance Between(Event Player, Event Player.target) > 8);
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(1.500, Ignore Condition);
  • Else;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(2.468, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(0.500, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Mei: Ice Block + Wall")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Mei;
  • }
  • conditions
  • {
  • Normalized Health(Event Player) <= 0.499;
  • Is Using Ability 1(Event Player) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Random Integer(1, 4) <= 3 ? Button(Ability 2) : Button(Ability 1));
  • If(Is Using Ability 2(Event Player));
  • Wait(0.050, Ignore Condition);
  • Press Button(Event Player, Button(Primary Fire));
  • End;
  • Wait(0.500, Ignore Condition);
  • If(Is Using Ability 1(Event Player));
  • Heal(Event Player, Null, Max Health(Event Player) * 0.250);
  • End;
  • Wait(7, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Mei: Ult")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Mei;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Distance Between(Event Player, Event Player.target) <= 25;
  • Is Using Ability 1(Event Player) == False;
  • (Global.wave_number >= 12 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Abort If Condition Is False;
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(Random Real(18, 40), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sombra: Shoot, Tase Target (Player), Just used Translocater (1), Took Damage (2), Tase / EMP Start Health (3)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Event Player.ab_player == Null;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.700, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • If(Ammo(Event Player, False) <= 7);
  • Press Button(Event Player, Button(Reload));
  • End;
  • Wait(Random Real(0.800, 1.200), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sombra: Translocator")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.is_aggressive == True;
  • Event Player.target.is_flying == False;
  • Distance Between(Event Player, Event Player.target) >= 7.500;
  • Distance Between(Event Player, Event Player.target) <= 25;
  • Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) >= 3;
  • Is In View Angle(Event Player, Event Player.target, 5) == True;
  • }
  • actions
  • {
  • If(Is Using Ability 2(Event Player));
  • Press Button(Event Player, Button(Interact));
  • Wait(0.050, Ignore Condition);
  • End;
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.200 + Distance Between(Event Player, Event Player.target) / 25, Ignore Condition);
  • Abort If(!Is Using Ability 2(Event Player));
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.100, Ignore Condition);
  • Abort If(!Has Status(Event Player, Phased Out));
  • Event Player.ab_var_1 = True;
  • Event Player.is_nav_reachable_node = False;
  • Wait(2, Ignore Condition);
  • Event Player.ab_var_1 = False;
  • Wait(8, Ignore Condition);
  • }
  • }
  • rule("Team 2 Sombra: EMP")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • (Global.wave_number >= 13 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > (Event Player.ab_var_1 ? 60 : 30));
  • Loop If(Has Status(Event Player, Hacked) || Has Status(Event Player, Stunned));
  • Loop If(Distance Between(Event Player, Event Player.target) >= 12);
  • Loop If(!Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), Barriers Do Not Block LOS));
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Purple), Event Player, 1);
  • Wait(0.500, Ignore Condition);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Event Player.ab_var_2 = False;
  • Event Player.ab_var_3 = Health(Event Player);
  • Wait Until(Ultimate Charge Percent(Event Player) != 100 && (Event Player.ab_var_2 || Health(Event Player) < Event Player.ab_var_3),
  • 0.300);
  • If(Ultimate Charge Percent(Event Player) != 100 && (Event Player.ab_var_2 || Health(Event Player) < Event Player.ab_var_3));
  • Event Player.gmut_fortified_bypass_end_t = Max(Total Time Elapsed + 0.500, Event Player.gmut_fortified_bypass_end_t);
  • Set Status(Event Player, Null, Stunned, 0.500);
  • Wait(8, Ignore Condition);
  • Else;
  • Wait(14, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sombra: Tase")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > (Event Player.target.is_flying ? 80 : 40));
  • Loop If(Has Status(Event Player, Hacked) || Has Status(Event Player, Stunned));
  • Loop If(Is Dead(Event Player));
  • Loop If(Event Player.target.tased_end_t >= Total Time Elapsed);
  • Loop If(Has Status(Event Player.target, Invincible) || Has Status(Event Player.target, Phased Out) || Is Using Ultimate(
  • Event Player.target));
  • Loop If(Distance Between(Event Player, Event Player.target) >= 12);
  • Loop If(!Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.target), All Barriers Block LOS));
  • Event Player.ab_player = Event Player.target;
  • Event Player.ab_var_2 = False;
  • Event Player.ab_var_3 = Health(Event Player);
  • Event Player.ab_player.tased_end_t = Total Time Elapsed + 6;
  • Set Status(Event Player, Null, Rooted, 6);
  • If(!Event Player.ab_player.perk_shockproof);
  • Small Message(Event Player.ab_player, Custom String("A Taser is stunning you! Shoot her to break free!"));
  • End;
  • Wait(10, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sombra: Tase times out / Lost Health / Target is downed / Target left / Is CCd / Distance too High / LOS lost")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sombra;
  • }
  • conditions
  • {
  • Event Player.ab_player != Null;
  • (Event Player.ab_player.tased_end_t < Total Time Elapsed || Event Player.ab_var_2 || Health(Event Player)
  • < Event Player.ab_var_3 || Event Player.ab_player.downed_start_t || !Event Player.ab_player.is_combatant || Has Status(
  • Event Player, Hacked) || Has Status(Event Player, Stunned) || Distance Between(Event Player, Event Player.ab_player)
  • >= 11 || !Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.ab_player), All Barriers Block LOS))
  • == True;
  • }
  • actions
  • {
  • If(Event Player.ab_player.perk_shockproof);
  • Damage(Event Player, Event Player.ab_player, 50);
  • Set Status(Filtered Array(Players Within Radius(Eye Position(Event Player), 10, Color(Team 2), Surfaces), !Has Status(
  • Current Array Element, Phased Out)), Null, Hacked, 2);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Purple), Event Player, 10);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • End;
  • Event Player.ab_player.tased_end_t = False;
  • Event Player.ab_player = Null;
  • Abort If(Has Status(Event Player, Hacked));
  • Clear Status(Event Player, Rooted);
  • }
  • }
  • rule("Team 2 Sombra: Took Damage")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Sombra;
  • }
  • actions
  • {
  • Event Player.ab_var_2 = True;
  • }
  • }
  • rule("Team 1: Is Tased, Disable Abilities, Movement, Shake Facing, Set Aimspeed, Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.tased_end_t >= Total Time Elapsed;
  • }
  • actions
  • {
  • Abort If(Event Player.perk_shockproof);
  • Set Status(Event Player, Null, Burning, 10);
  • Set Status(Event Player, Null, Hacked, 10);
  • Set Status(Event Player, Null, Rooted, 10);
  • Start Facing(Event Player, Direction From Angles(Horizontal Facing Angle Of(Event Player) + Random Integer(-100, 20),
  • Vertical Facing Angle Of(Event Player) + Random Integer(-100, 80)), 100, To World, Direction and Turn Rate);
  • Press Button(Event Player, Hero Of(Event Player) == Hero(Moira) ? Button(Secondary Fire) : Button(Primary Fire));
  • Wait(0.300, Ignore Condition);
  • Stop Facing(Event Player);
  • While(Event Player.tased_end_t >= Total Time Elapsed);
  • Set Aim Speed(Event Player, 50);
  • Press Button(Event Player, Hero Of(Event Player) == Hero(Moira) ? Button(Secondary Fire) : Button(Primary Fire));
  • Wait Until(Event Player.tased_end_t < Total Time Elapsed, Random Real(0.100, 0.300));
  • Set Aim Speed(Event Player, 200);
  • Press Button(Event Player, Hero Of(Event Player) == Hero(Moira) ? Button(Secondary Fire) : Button(Primary Fire));
  • Wait Until(Event Player.tased_end_t < Total Time Elapsed, Random Real(0.100, 0.300));
  • End;
  • Set Aim Speed(Event Player, 100);
  • Clear Status(Event Player, Burning);
  • Clear Status(Event Player, Hacked);
  • Clear Status(Event Player, Rooted);
  • }
  • }
  • rule("Team 2 Widowmaker: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Widowmaker;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • If(Distance Between(Event Player, Event Player.target) < 8 || (!Event Player.is_living_boss && Has Status(Event Player, Hacked)));
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.250, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • If(Ammo(Event Player, False) <= 1);
  • Press Button(Event Player, Button(Reload));
  • End;
  • Else;
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Event Player.is_ignoring_other_targets = True;
  • Wait Until(!(Is Firing Secondary(Event Player) && Event Player.is_target_in_los), 1.300);
  • Event Player.is_ignoring_other_targets = False;
  • If(Is Firing Secondary(Event Player) && Event Player.is_target_in_los >= 4);
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(0.016, Ignore Condition);
  • End;
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • End;
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Widowmaker: Grappling Hook")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Widowmaker;
  • }
  • conditions
  • {
  • Event Player.is_using_combat_pathfinding == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > (Event Player.real_speed <= 1 ? 100 : 25));
  • Loop If(Is Firing Secondary(Event Player));
  • Loop If(Distance Between(Event Player, Event Player.target) >= 8);
  • Press Button(Event Player, Button(Ability 1));
  • If(Is Using Ability 1(Event Player));
  • Event Player.facing_override_direction = Direction From Angles(Horizontal Facing Angle Of(Event Player) + (Random Integer(0, 1)
  • ? -45 : 45), -5);
  • Wait(0.160, Ignore Condition);
  • Event Player.facing_override_direction = False;
  • Wait Until(!Is Using Ability 1(Event Player), 99999);
  • Event Player.nav_pos = Position Of(Event Player);
  • Wait(8, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Widowmaker: Infra-Sight")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Widowmaker;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Global.is_infrasight_on == False;
  • (Global.wave_number >= 10 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 20);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(38, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Widowmaker: Infra-Sight if Sombra is stealthed")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Widowmaker;
  • }
  • conditions
  • {
  • Event Player.target == False;
  • Global.is_infrasight_on == False;
  • Is True For Any(Global.combatants, Current Array Element.is_invisible == 1) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 40);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • }
  • }
  • rule("Global: Set / Unset Is Infrasight on (Bots)")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • conditions
  • {
  • Global.is_infrasight_on != Is True For Any(Players On Hero(Hero(Widowmaker), Color(Team 2)), Is Using Ultimate(
  • Current Array Element));
  • }
  • actions
  • {
  • Global.is_infrasight_on = !Global.is_infrasight_on;
  • Global.aim_offset = (Global.is_infrasight_on ? 0 : 0.500) * Down;
  • Wait(0.016, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Pharah: Flight")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Pharah;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Start Holding Button(Event Player, Button(Jump));
  • Wait(Random Real(0.777, 1.111), Abort When False);
  • Stop Holding Button(Event Player, Button(Jump));
  • Wait(Random Real(0.222, 0.555), Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Pharah: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Pharah;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(Random Real(0.600, 1.300), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Reaper: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Using Ability 1(Event Player) == False;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(0.600, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Reaper: Wraith Form, Force Position")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Event Player.is_aggressive == True;
  • Event Player.fear_end_t < Total Time Elapsed;
  • Has Status(Event Player, Hacked) == False;
  • Has Status(Event Player, Rooted) == False;
  • Has Status(Event Player, Stunned) == False;
  • Distance Between(Event Player, Event Player.target) >= 10;
  • Distance Between(Event Player, Event Player.target) <= 40;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • If(Is Using Ability 1(Event Player));
  • Event Player.ab_wraith_pos = Position Of(Event Player);
  • Chase Player Variable At Rate(Event Player, ab_wraith_pos, Position Of(Event Player.target) + 0.500 * Up, 15,
  • Destination and Rate);
  • Start Forcing Player Position(Event Player, Event Player.ab_wraith_pos, True);
  • Disable Movement Collision With Environment(Event Player, True);
  • Event Player.is_wraith = True;
  • Event Player.is_pathfinding_disabled = True;
  • Event Player.is_target_in_los = 5;
  • Wait(8, Ignore Condition);
  • Else;
  • Wait(1, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Reaper: Cancel Wraith Form, Stop Forcing Position")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Event Player.is_wraith == True;
  • Is Using Ability 1(Event Player) == True;
  • Distance Between(Event Player, Event Player.target) <= 3;
  • Is In Line of Sight(Event Player.target, Position Of(Event Player), Barriers Do Not Block LOS) == True;
  • }
  • actions
  • {
  • If(Distance Between(Event Player, Ray Cast Hit Position(Event Player, Event Player + 5 * Down, Null, Null, False)) >= 5);
  • Wait(0.150, Ignore Condition);
  • Abort If(!Event Player.is_wraith);
  • End;
  • Press Button(Event Player, Button(Ability 1));
  • Stop Chasing Player Variable(Event Player, ab_wraith_pos);
  • Stop Forcing Player Position(Event Player);
  • Enable Movement Collision With Environment(Event Player);
  • Event Player.is_wraith = False;
  • Event Player.is_pathfinding_disabled = False;
  • Event Player.nav_pos = Position Of(Event Player.target);
  • Event Player.is_nav_reachable_node = False;
  • }
  • }
  • rule("Team 2 Reaper: Wraith Form Timed out / Target left / Target is invisible, Stop Forcing Position")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Event Player.is_wraith == True;
  • (!Is Using Ability 1(Event Player)
  • || !Event Player.target.is_combatant || Event Player.target.active_ab_is_cloaked || Event Player.target.is_invisible > (
  • Distance Between(Event Player, Event Player.target) <= 2.400 || Global.is_infrasight_on)) == True;
  • }
  • actions
  • {
  • Stop Chasing Player Variable(Event Player, ab_wraith_pos);
  • Stop Forcing Player Position(Event Player);
  • Enable Movement Collision With Environment(Event Player);
  • Event Player.is_wraith = False;
  • Event Player.is_pathfinding_disabled = False;
  • Event Player.is_nav_reachable_node = False;
  • }
  • }
  • rule("Team 2 Reaper: Death Blossom")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reaper;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Is Using Ability 1(Event Player) == False;
  • (Global.wave_number >= 12 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 20);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 7);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(28, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Ana: Shoot, Has Used Nano Boost (1)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Ana;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • If(Distance Between(Event Player, Event Player.target) < 8 || (!Event Player.is_living_boss && Has Status(Event Player, Hacked)));
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Else;
  • If(!Is Firing Secondary(Event Player));
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(0.500, Ignore Condition);
  • End;
  • End;
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Team 2 Ana: Biotic Grenade")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Ana;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(1.75, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 40);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 15);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(9, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Ana: Nano Boost")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Ana;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Event Player.ab_var_1 == False;
  • Normalized Health(Event Player) <= 0.750;
  • (Global.wave_number >= 13 || Event Player.is_living_boss) == True;
  • Has Status(Event Player, Hacked) == False;
  • Has Status(Event Player, Stunned) == False;
  • }
  • actions
  • {
  • Event Player.ab_var_1 = True;
  • Abort If(!Event Player.is_living_boss && Random Integer(1, 100) > 50);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • }
  • }
  • rule("Team 2 D.Va: Start / Stop Shooting, Has Used Self-Destruct (1), Can remech (2)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 3;
  • (Distance Between(Event Player, Event Player.target) <= 10 || Is Using Ability 1(Event Player) || Is Standing(Event Player)
  • || Is In Alternate Form(Event Player)) == True;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait Until(!(Event Player.is_target_in_los >= 3 && (Distance Between(Event Player, Event Player.target)
  • <= 15 || Is Using Ability 1(Event Player) || Is Standing(Event Player) || Is In Alternate Form(Event Player))), Random Integer(4, 8));
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait Until(Ability Resource(Event Player, Button(Secondary Fire)) <= 1, 2);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 D.Va: Boosters")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.is_aggressive == True;
  • Is In Alternate Form(Event Player) == False;
  • Distance Between(Event Player, Event Player.target) >= 7.500;
  • Distance Between(Event Player, Event Player.target) <= 25;
  • Is In View Angle(Event Player, Event Player.target, 5) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Event Player.is_pathfinding_disabled = True;
  • Wait Until(!Is Using Ability 1(Event Player) || Distance Between(Event Player, Event Player.target) < 1, 3);
  • Press Button(Event Player, Button(Ability 1));
  • Event Player.is_pathfinding_disabled = False;
  • Event Player.is_nav_reachable_node = False;
  • Wait(5, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 D.Va: Self-Destruct")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.ab_var_1 == False;
  • Global.wave_number >= 15;
  • Is In Alternate Form(Event Player) == False;
  • Normalized Health(Event Player) <= 0.800;
  • Health(Event Player) > 1;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 30);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 15);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • If(Is Using Ultimate(Event Player));
  • Event Player.ab_var_1 = True;
  • Wait(3.500, Ignore Condition);
  • Event Player.ab_var_2 = True;
  • Else;
  • Loop;
  • }
  • }
  • rule("Team 2 D.Va: Boss Self-Destruct")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_living_boss == True;
  • Event Player.ab_var_1 == False;
  • Is In Alternate Form(Event Player) == False;
  • Health(Event Player) < 1;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Abort If(!Is Using Ultimate(Event Player));
  • Event Player.ab_var_1 = True;
  • Wait(3.500, Ignore Condition);
  • Event Player.ab_var_2 = True;
  • }
  • }
  • rule("Team 2 D.Va: Allow Call Mech")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Is In Alternate Form(Event Player) == True;
  • Event Player.ab_var_2 == False;
  • }
  • actions
  • {
  • Wait(Event Player.is_living_boss ? 20 : 10, Abort When False);
  • Abort If Condition Is False;
  • Event Player.ab_var_2 = True;
  • }
  • }
  • rule("Team 2 D.Va: Call Mech")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Is In Alternate Form(Event Player) == True;
  • Event Player.ab_var_2 == True;
  • Has Status(Event Player, Hacked) == False;
  • Has Status(Event Player, Stunned) == False;
  • Is On Ground(Event Player) == True;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Event Player.ab_var_2 = False;
  • }
  • }
  • rule("Team 2 D.Va: Set / Unset Is aggressive")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • D.Va;
  • }
  • conditions
  • {
  • Event Player.is_using_boss_aggression == False;
  • (Event Player.is_alive && Is In Alternate Form(Event Player)) == Event Player.is_aggressive;
  • }
  • actions
  • {
  • Event Player.is_aggressive = !Event Player.is_aggressive;
  • Wait(0.016, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Orisa: Start / Stop Shooting")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Orisa;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 3;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait Until(Event Player.is_target_in_los < 3, 99999);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Team 2 Orisa: Decrease / Normalize Move Speed while shooting on ground")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Orisa;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Primary Fire)) == True;
  • Is On Ground(Event Player) == True;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, Global.mut_amped ? 57.500 : 50);
  • Wait Until(!(Is Button Held(Event Player, Button(Primary Fire)) && Is On Ground(Event Player)), 99999);
  • Set Move Speed(Event Player, Global.mut_amped ? 115 : 100);
  • }
  • }
  • rule("Team 2 Orisa: Halt!")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Orisa;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.target.is_flying == True;
  • Distance Between(Event Player, Event Player.target) >= 10;
  • Is In View Angle(Event Player, Event Player.target, 5) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(0.100 + Distance Between(Event Player, Event Player.target) / 25, Ignore Condition);
  • Press Button(Event Player, Button(Secondary Fire));
  • Wait(15, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Orisa: Fortify")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Orisa;
  • }
  • conditions
  • {
  • (Slot Of(Event Player) != 1 || Global.objective_phase_number == 1) == True;
  • Is Using Ability 1(Event Player) == False;
  • Normalized Health(Event Player) > (Global.gmut_fortified ? 0.400 : 0.600);
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Wait(0.500, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Orisa: Supercharger")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Orisa;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • (Global.wave_number >= 10 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 20);
  • If(Event Player.is_living_boss);
  • Press Button(Event Player, Button(Ability 2));
  • End;
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(20, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Roadhog: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Roadhog;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Using Ability 1(Event Player) == False;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • If(Distance Between(Event Player, Event Player.target) > 9);
  • Press Button(Event Player, Button(Secondary Fire));
  • Else;
  • Press Button(Event Player, Button(Primary Fire));
  • End;
  • Wait Until(Is Using Ability 1(Event Player), Random Real(2, 2.400));
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Roadhog: Chain Hook")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Roadhog;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > (Event Player.target.is_flying ? 80 : 40));
  • Loop If(!Ammo(Event Player, False));
  • Loop If(Distance Between(Event Player, Event Player.target) >= 20);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(8, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Roadhog: Whole Hog")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Roadhog;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • (Global.wave_number >= 11 || Event Player.is_living_boss) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 20);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 5);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(28, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Tracer: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Tracer;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.450, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • If(Ammo(Event Player, False) <= 5);
  • Press Button(Event Player, Button(Reload));
  • End;
  • Wait(Random Real(0.400, 0.600), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Tracer: Blink")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Tracer;
  • }
  • conditions
  • {
  • Event Player.is_aggressive == True;
  • Event Player.is_target_in_los >= 4;
  • Distance Between(Event Player, Event Player.target) <= 5;
  • Absolute Value(Horizontal Angle Towards(Event Player.target, Event Player)) <= 45;
  • }
  • actions
  • {
  • If(!Global.is_load_limit_reached && Ability Charge(Event Player, Button(Ability 1)));
  • Global.temp_1 = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + 7.500 * World Vector Of(Throttle Of(
  • Event Player) == Vector(False, False, False) ? Forward : Throttle Of(Event Player), Event Player, Rotation), Null, Null,
  • False);
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 5 * Down, Null, Null, False)) < 5);
  • Press Button(Event Player, Button(Ability 1));
  • End;
  • End;
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Tracer: Recall to enemy on high ground")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Tracer;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Event Player.is_aggressive == True;
  • Event Player.recall_block_end_t < Total Time Elapsed;
  • Event Player.target.is_flying == False;
  • Distance Between(Event Player, Event Player.target) <= 20;
  • Y Component Of(Position Of(Event Player.target)) - Y Component Of(Position Of(Event Player)) >= 3;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Ability 2), False);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.800, Ignore Condition);
  • If(Is Using Ability 2(Event Player) && Event Player.is_target_in_los);
  • Teleport(Event Player, Ray Cast Hit Position(Eye Position(Event Player.target), Position Of(Event Player.target)
  • - 2.500 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target), False), Null, Null, False)
  • + 0.500 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target), False));
  • Event Player.is_nav_reachable_node = False;
  • Wait(15, Ignore Condition);
  • End;
  • Wait(5, Ignore Condition);
  • }
  • }
  • rule("Team 2 Tracer: Pulse Bomb, Has Used Pulse Bomb (1)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Tracer;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Event Player.is_aggressive == True;
  • Event Player.ab_var_1 == False;
  • Normalized Health(Event Player) <= 0.400;
  • Has Status(Event Player, Hacked) == False;
  • Has Status(Event Player, Stunned) == False;
  • }
  • actions
  • {
  • Skip If(Global.mut_the_calvary, 1);
  • Event Player.ab_var_1 = True;
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.160, Ignore Condition);
  • Cancel Primary Action(Event Player);
  • If(Event Player.is_living_boss);
  • Set Ability Charge(Event Player, Button(Ability 1), 3);
  • Press Button(Event Player, Button(Ability 1));
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.192, Ignore Condition);
  • Cancel Primary Action(Event Player);
  • Press Button(Event Player, Button(Ability 1));
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.160, Ignore Condition);
  • Cancel Primary Action(Event Player);
  • End;
  • Abort If(Event Player.recall_block_end_t >= Total Time Elapsed);
  • Set Ability Cooldown(Event Player, Button(Ability 2), False);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.800, Ignore Condition);
  • Abort If(!(Is Using Ability 2(Event Player) && Event Player.is_target_in_los));
  • Teleport(Event Player, Ray Cast Hit Position(Eye Position(Event Player.target), Position Of(Event Player.target)
  • - 2.500 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target), False), Null, Null, False)
  • + 0.500 * Direction From Angles(Horizontal Facing Angle Of(Event Player.target), False));
  • Event Player.is_nav_reachable_node = False;
  • Wait(2.8, Ignore Condition);
  • }
  • }
  • rule("Team 2 Genji: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • (Is Using Ultimate(Event Player) && Distance Between(Event Player, Event Player.target) > 5) == False;
  • }
  • actions
  • {
  • If(Distance Between(Event Player, Event Player.target) > 4 || Is Using Ultimate(Event Player));
  • Press Button(Event Player, Button(Primary Fire));
  • Else;
  • Press Button(Event Player, Button(Secondary Fire));
  • End;
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Genji: Jump")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Event Player.is_using_combat_pathfinding == True;
  • Event Player.target.is_flying == False;
  • Is On Ground(Event Player) == True;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Jump));
  • Wait(0.500, Ignore Condition);
  • Press Button(Event Player, Button(Jump));
  • Wait(Random Real(0.800, 1.200), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Genji: Swift Strike")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Event Player.is_aggressive == True;
  • Distance Between(Event Player, Event Player.target) <= 15;
  • Absolute Value(Horizontal Angle Towards(Event Player, Event Player.target)) <= 5;
  • Is Using Ability 2(Event Player) == False;
  • }
  • actions
  • {
  • If(!Global.is_load_limit_reached);
  • Global.temp_1 = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + 15 * Facing Direction Of(
  • Event Player), Null, Null, False);
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 20 * Down, Null, Null, False)) < 20);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(2, Ignore Condition);
  • End;
  • End;
  • Wait(2, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Genji: Deflect")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Genji;
  • }
  • actions
  • {
  • Abort If(Is Using Ultimate(Event Player));
  • Abort If(Random Integer(1, 100) > 30);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(8, Ignore Condition);
  • }
  • }
  • rule("Team 2 Genji: Dragonblade")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Genji;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Normalized Health(Event Player) <= 0.500;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Hanzo: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.800, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.300, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Hanzo: Lunge")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 2;
  • Hanzo;
  • }
  • actions
  • {
  • Abort If(Global.is_load_limit_reached);
  • Abort If(!Event Player.is_using_combat_pathfinding);
  • Abort If(Random Integer(1, 100) > 50);
  • Press Button(Event Player, Button(Jump));
  • Wait(0.400, Ignore Condition);
  • Global.temp_1 = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + 7.850 * World Vector Of(Throttle Of(
  • Event Player) == Vector(False, False, False) ? Forward : Throttle Of(Event Player), Event Player, Rotation), Null, Null,
  • False);
  • If(Distance Between(Global.temp_1, Ray Cast Hit Position(Global.temp_1, Global.temp_1 + 5 * Down, Null, Null, False)) < 5);
  • Press Button(Event Player, Button(Jump));
  • Wait(5.500, Ignore Condition);
  • Else;
  • Wait(2, Ignore Condition);
  • }
  • }
  • rule("Team 2 Hanzo: Storm Arrows")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Normalized Health(Event Player) <= 0.500;
  • Is Using Ability 2(Event Player) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Hanzo: Dragonstrike")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Event Player.is_target_in_los == False;
  • Event Player.fear_end_t < Total Time Elapsed;
  • Distance Between(Event Player, Event Player.target) >= 15;
  • }
  • actions
  • {
  • Wait(1, Abort When False);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Event Player.facing_override_direction = Vector Towards(Event Player, Event Player.target);
  • Wait(0.600, Ignore Condition);
  • Event Player.facing_override_direction = Vector Towards(Event Player, Event Player.target);
  • Wait(0.400, Ignore Condition);
  • Event Player.facing_override_direction = False;
  • Wait(35, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Bastion: Shoot, Use Sentry Mode (1)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Bastion;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 3;
  • }
  • actions
  • {
  • If(Is Using Ultimate(Event Player));
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(1.100, Ignore Condition);
  • Else;
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(2, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • If(Ammo(Event Player, False) <= 2 || Ammo(Event Player, 1) <= 30);
  • Press Button(Event Player, Button(Reload));
  • End;
  • Wait(Random Real(0.400, 0.600), Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Bastion: Set / Unset Use Sentry Mode")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Bastion;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 3;
  • Event Player.is_aggressive == True;
  • Is Using Ultimate(Event Player) == False;
  • Distance Between(Event Player, Event Player.target) <= 20;
  • }
  • actions
  • {
  • Wait(2, Abort When False);
  • Event Player.ab_var_1 = True;
  • Wait Until(Event Player.is_target_in_los < 3, 10);
  • Event Player.ab_var_1 = False;
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Bastion: Reconfigure")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Bastion;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • If(Event Player.ab_var_1 != Is In Alternate Form(Event Player));
  • Press Button(Event Player, Button(Ability 1));
  • End;
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Bastion: Configuration: Tank")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Bastion;
  • }
  • conditions
  • {
  • Event Player.is_alive == True;
  • Normalized Health(Event Player) <= 0.500;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.500, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Reinhardt: Disable Barrier Field after breaking")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Ability Cooldown(Event Player, Button(Secondary Fire)) > False;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Secondary Fire), 1000);
  • }
  • }
  • rule("Team 2 Reinhardt: Hold / Drop Shield if Target and Distance to Target >= 5m")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Distance Between(Event Player, Event Player.target) >= 5;
  • "Reinhardt won't automatically raise his shield again after charging or being hacked"
  • Is Using Ability 1(Event Player) == False;
  • Has Status(Event Player, Hacked) == False;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait Until(!(Event Player.is_target_in_los && Distance Between(Event Player, Event Player.target) >= 5 && !Is Using Ability 1(
  • Event Player) && !Has Status(Event Player, Hacked)), 99999);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Team 2 Reinhardt: Start / Stop Attacking if Distance to Target < 5m")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • Distance Between(Event Player, Event Player.target) < 5;
  • }
  • actions
  • {
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait Until(!(Event Player.is_target_in_los && Distance Between(Event Player, Event Player.target) < 5), 99999);
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • }
  • }
  • rule("Team 2 Reinhardt: Fire Strike")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 75);
  • Loop If(Distance Between(Event Player, Event Player.target) <= 5 || Distance Between(Event Player, Event Player.target) >= 25);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(5, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Reinhardt: Charge")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.is_aggressive == True;
  • Event Player.target.last_hit_by_shatter_t + 1 >= Total Time Elapsed;
  • Event Player.target.last_hit_by_shatter_t + 0.400 < Total Time Elapsed;
  • Absolute Value(Horizontal Angle Towards(Event Player, Event Player.target)) <= 5;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 1));
  • Wait(6, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Reinhardt: Earthshatter")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Reinhardt;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 5;
  • Event Player.target.is_flying == False;
  • Is Firing Secondary(Event Player) == False;
  • }
  • actions
  • {
  • Wait(1, Abort When False);
  • Loop If(Random Integer(1, 100) <= 100 * Normalized Health(Event Player));
  • Loop If(Distance Between(Event Player, Event Player.target) >= 18 || Absolute Value(Horizontal Angle Towards(Event Player,
  • Event Player.target)) >= 30);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(7, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 1: Is Shattered, Start Accelerating")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 1;
  • All;
  • }
  • actions
  • {
  • Abort If(!Has Status(Event Player, Stunned));
  • Abort If(Hero Of(Attacker) != Hero(Reinhardt));
  • Abort If(Event Ability != Button(Ultimate));
  • Set Status(Event Player, Attacker, Stunned, 5);
  • Event Player.last_hit_by_shatter_t = Total Time Elapsed;
  • Apply Impulse(Event Player, Direction From Angles(Horizontal Angle From Direction(Event Direction), 30), 15, To World,
  • Cancel Contrary Motion XYZ);
  • Start Accelerating(Event Player, Direction From Angles(Horizontal Angle From Direction(Event Direction), 30), Is In Air(
  • Event Player) ? 100 : (1 - (Total Time Elapsed - Event Player.last_hit_by_shatter_t)) * 500, 15, To World,
  • Direction Rate and Max Speed);
  • Wait(1, Ignore Condition);
  • Clear Status(Event Player, Stunned);
  • Stop Accelerating(Event Player);
  • }
  • }
  • rule("Team 2 Sigma: Flux")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los == True;
  • (Event Player.is_living_boss || Global.wave_number >= 10) == True;
  • }
  • actions
  • {
  • Wait(2, Ignore Condition);
  • Abort If Condition Is False;
  • Loop If(Random Integer(1, 100) > 30);
  • Loop If(Distance Between(Event Player, Event Player.target) >= 25);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(1.75, Abort When False);
  • While(Is Using Ultimate(Event Player));
  • Wait(0.500, Abort When False);
  • Press Button(Event Player, Button(Primary Fire));
  • End;
  • Wait(28, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sigma: Shoot")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Firing Secondary(Event Player) == False;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • Wait(Angle Between Vectors(Facing Direction Of(Event Player), Vector Towards(Event Player, Event Player.target)) / 300,
  • Ignore Condition);
  • Abort If Condition Is False;
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(Random Real(0.900, 1.500), Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sigma: Barrier")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Using Ability 1(Event Player) == False;
  • Is Using Ability 2(Event Player) == False;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • If(Distance Between(Event Player.target, Event Player) <= 30);
  • Start Holding Button(Event Player, Button(Secondary Fire));
  • Wait(Random Real(0.200, 2), Ignore Condition);
  • Stop Holding Button(Event Player, Button(Secondary Fire));
  • End;
  • Wait(4, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sigma: Grasp")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Event Player.is_target_in_los >= 4;
  • Is Firing Secondary(Event Player) == False;
  • Is Using Ability 2(Event Player) == False;
  • }
  • actions
  • {
  • Wait(10, Ignore Condition);
  • Press Button(Event Player, Button(Ability 1));
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Sigma: Rock")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Sigma;
  • }
  • conditions
  • {
  • Global.mut_lock_n_load == True;
  • Event Player.is_target_in_los >= 4;
  • Is Firing Secondary(Event Player) == False;
  • Is Using Ability 1(Event Player) == False;
  • }
  • actions
  • {
  • Press Button(Event Player, Button(Ability 2));
  • Wait(10, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Subroutine: Upgrade Health and Healing")
  • {
  • event
  • {
  • Subroutine;
  • upgrade_health_and_healing;
  • }
  • actions
  • {
  • Global.upgrade_count += 1;
  • Set Healing Received(All Players(Team 1), 80 + 2.500 * Global.upgrade_count);
  • Start Heal Over Time(All Players(Team 1), Null, 1, 100000);
  • }
  • }
  • rule("Subroutine: Start Kill remaining Phase")
  • {
  • event
  • {
  • Subroutine;
  • start_kill_remaining_phase;
  • }
  • actions
  • {
  • Big Message(All Players(All Teams), Custom String("Kill the remaining enemies!"));
  • Global.enable_normal_spawns = False;
  • All Players(Team 2).is_expendable = False;
  • Global.special_spawns_count = False;
  • Global.objective_phase_number = 3;
  • Communicate(Random Value In Array(Global.combatants), Press the Attack);
  • }
  • }
  • rule("Team 2 Boss Aggro: Set / Unset Is aggressive")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_using_boss_aggression == True;
  • Event Player.is_aggressive != (Event Player.is_target_in_los == 5);
  • }
  • actions
  • {
  • Wait(3, Abort When False);
  • Abort If Condition Is False;
  • Event Player.is_aggressive = !Event Player.is_aggressive;
  • Wait(0.016, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Team 2 Boss Aggro: Set Is aggressive after losing 20% health since Boss last time aggressive")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.is_using_boss_aggression == True;
  • Event Player.is_alive == True;
  • Event Player.is_aggressive == False;
  • }
  • actions
  • {
  • Event Player.aggression_health_threshold = Normalized Health(Event Player) - 0.200;
  • Wait Until(Normalized Health(Event Player)
  • < Event Player.aggression_health_threshold || Event Player.is_aggressive || !Event Player.is_living_boss, 99999);
  • Abort If(Event Player.is_aggressive || !Event Player.is_living_boss);
  • Event Player.is_using_boss_aggression = False;
  • Event Player.is_aggressive = True;
  • Wait Until(Event Player.is_target_in_los || !Event Player.is_living_boss, 99999);
  • Abort If(!Event Player.is_living_boss);
  • Event Player.is_using_boss_aggression = True;
  • }
  • }
  • rule("Team 2 Boss Aggro: Disengage after killing Player")
  • {
  • event
  • {
  • Player Earned Elimination;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Abort If(!Event Player.is_using_boss_aggression);
  • Event Player.is_aggressive = False;
  • }
  • }
  • rule("IV Team 2 Slot 0: Create Portal Entities")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 0;
  • }
  • actions
  • {
  • Create Progress Bar HUD Text(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams)
  • : Empty Array, Global.objective_phase_number == 1 ? 200 * Normalized Health(Event Player) : Global.objective_progress,
  • Global.objective_phase_number == 1 ? Custom String("Destroy the Portal") : Custom String("Portal closing"), Top, -97,
  • Global.objective_phase_number == 1 ? (Global.special_spawns_count > 0 ? Color(White) : Custom Color(Max(200, 255 - (
  • Total Time Elapsed - Event Player.ab_var_2) * 165), Max(0, 255 - (Total Time Elapsed - Event Player.ab_var_2) * 765), Max(19,
  • 255 - (Total Time Elapsed - Event Player.ab_var_2) * 708), 255)) : Color(Yellow), Color(White), Visible To Values and Color,
  • Default Visibility);
  • Create Icon(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array,
  • Global.iv_dom_objective_pos + 2 * Up, Exclamation Mark, Visible To and Position, Color(Yellow), True);
  • Create In-World Text(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams)
  • : Empty Array, Global.objective_phase_number == 1 ? Custom String("Destroy the Portal") : Custom String("Portal closing"),
  • Global.iv_dom_objective_pos + 1.700 * Up, 1.500, Do Not Clip, Visible To Position and String, Color(Yellow),
  • Default Visibility);
  • Create Effect(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array,
  • Sphere, Global.objective_phase_number == 1 ? Color(Red) : Color(Yellow), Global.iv_dom_objective_pos + 1.110 * Up, 0.850 + (
  • Global.objective_phase_number == 1 ? 0 : 0.300 * Sine From Radians(6 * Total Time Elapsed)),
  • Visible To Position Radius and Color);
  • Create Effect(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array,
  • Bad Aura, Color(Red), Global.iv_dom_objective_pos + 1.110 * Up, 1, Visible To Position and Radius);
  • Create Effect(Global.objective_phase_number == 1 && (
  • Event Player.ab_var_2 >= Total Time Elapsed || Global.special_spawns_count > False) ? All Players(All Teams) : Empty Array,
  • Light Shaft, Color(White), Global.iv_dom_objective_pos - 2 * Up, 1, Visible To Position and Radius);
  • }
  • }
  • rule("IV Team 2 Torbjörn: Start Portal Mode, Open (Phase 1), Breakpoint End Time (2), Set Health to half to remove armour")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Torbjörn;
  • }
  • actions
  • {
  • Global.iv_dom_objective_pos = Random Value In Array(Remove From Array(Global.iv_dom_objective_all_pos_list,
  • Global.iv_dom_objective_pos));
  • Start Forcing Player Position(Event Player, Global.iv_dom_objective_pos, False);
  • Disable Movement Collision With Environment(Event Player, True);
  • Set Invisible(Event Player, All);
  • Set Status(Event Player, Null, Unkillable, 9999);
  • Set Player Health(Event Player, 0.500 * Max Health(Event Player));
  • }
  • }
  • rule("IV Team 2: Force portal to shoot lava")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Torbjörn;
  • }
  • conditions
  • {
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Vector(Random Integer(-500, 500), Random Integer(-500, 500),
  • Random Integer(-500, 500))), To World);
  • Press Button(Event Player, Button(Primary Fire));
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("IV Subroutine: Defend Portal")
  • {
  • event
  • {
  • Subroutine;
  • iv_defend_portal;
  • }
  • actions
  • {
  • Global.money_amount += 95;
  • If(Global.objective_phase_number == 1);
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Event Player.ab_var_2 = Total Time Elapsed + 10;
  • End;
  • Global.temp_2 = Filtered Array(Players Within Radius(Global.iv_dom_objective_pos, 15, Color(Team 1), Surfaces),
  • Current Array Element.is_combatant && !Has Status(Current Array Element, Phased Out) && Is In Line of Sight(Event Player,
  • Current Array Element, Enemy Barriers Block LOS));
  • For Global Variable(temp_1, 0, Count Of(Global.temp_2), 1);
  • Apply Impulse(Global.temp_2[Global.temp_1], Direction From Angles(Horizontal Angle From Direction(Vector Towards(
  • Global.iv_dom_objective_pos, Global.temp_2[Global.temp_1])), -20), 25, To World, Cancel Contrary Motion XYZ);
  • End;
  • Global.temp_1 = Random Integer(0, 5);
  • If(Global.temp_1 == 5 && Global.wave_number >= 7);
  • Global.temp_2.tased_end_t = Total Time Elapsed + 3;
  • Else If(Global.temp_1 <= 1 && Global.wave_number >= 4);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Else If(Global.temp_1 == 3 && Global.wave_number >= 4);
  • Press Button(Event Player, Button(Ability 1));
  • End;
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • Play Effect(All Players(All Teams), Bad Explosion, Global.temp_1 == 5 && Global.wave_number >= 7 ? Color(Purple) : Color(Red), Global.iv_dom_objective_pos + 1.110 * Up, 10);
  • }
  • }
  • rule("IV Team 2 Torbjörn: Health reaches Breakpoint, Is Dead -> Portal Closing (Phase 2)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Torbjörn;
  • }
  • conditions
  • {
  • Normalized Health(Event Player) <= 0.333;
  • }
  • actions
  • {
  • Set Player Health(Event Player, 0.333 * Max Health(Event Player));
  • Call Subroutine(iv_defend_portal);
  • Wait Until(Normalized Health(Event Player) <= 0.166, 99999);
  • Set Player Health(Event Player, 0.166 * Max Health(Event Player));
  • Call Subroutine(iv_defend_portal);
  • Clear Status(Event Player, Unkillable);
  • Wait Until(Is Dead(Event Player), 99999);
  • Global.objective_phase_number = 2;
  • Call Subroutine(iv_defend_portal);
  • Call Subroutine(upgrade_health_and_healing);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Red), Global.iv_dom_objective_pos + 1.110 * Up, 10);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • Big Message(All Players(All Teams), Custom String("Portal is closing! Gained bonus health"));
  • Stop Forcing Player Position(Event Player);
  • Enable Movement Collision With Environment(Event Player);
  • Wait(0.250, Ignore Condition);
  • Teleport(Event Player, 1000 * Down);
  • Set Invisible(Event Player, None);
  • }
  • }
  • rule("IV Team 2 Slot 0: Portal Closing (Phase 2) -> Kill remaining (Phase 3)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 0;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 2;
  • }
  • actions
  • {
  • For Global Variable(objective_progress, 100, 25, -1);
  • Wait(0.096, Ignore Condition);
  • End;
  • Global.enable_normal_spawns = True;
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • For Global Variable(objective_progress, 25, 10, -1);
  • Wait(0.096, Ignore Condition);
  • End;
  • Global.enable_objective_enemy_spawn = True;
  • For Global Variable(objective_progress, 10, 0, -1);
  • Wait(0.096, Ignore Condition);
  • End;
  • Call Subroutine(start_kill_remaining_phase);
  • }
  • }
  • rule("IV Team 2 Torbjörn: Set Breakpoint Damage Reduction")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Torbjörn;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 1;
  • (Event Player.ab_var_2 >= Total Time Elapsed || Global.special_spawns_count > False) == True;
  • }
  • actions
  • {
  • Set Damage Received(Event Player, 5);
  • Wait Until(!(Global.objective_phase_number == 1 && (
  • Event Player.ab_var_2 >= Total Time Elapsed || Global.special_spawns_count > False)), 99999);
  • Set Damage Received(Event Player, 50);
  • }
  • }
  • rule("HVT Team 2 Slot 1: Create HVT Entities")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 1;
  • }
  • actions
  • {
  • Create Progress Bar HUD Text(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams)
  • : Empty Array, Global.objective_phase_number == 1 ? 100 * Normalized Health(Event Player) : (
  • Event Player.downed_start_t ? Global.objective_progress : Event Player.revive_timer) / 1.500,
  • Global.objective_phase_number == 1 ? Custom String("Subdue the High Value Target") : (Event Player.downed_start_t ? (
  • Array Contains(Event Player.revivers, Local Player) ? Custom String("Capturing...") : Custom String(
  • "Capture the High Value Target")) : Custom String("High Value Target is being revived")), Top, -97,
  • Global.objective_phase_number == 1 ? Custom Color(Max(200, 255 - (Total Time Elapsed - Global.hvt_call_reinforcements_end_t)
  • * 165), Max(0, 255 - (Total Time Elapsed - Global.hvt_call_reinforcements_end_t) * 765), Max(19, 255 - (
  • Total Time Elapsed - Global.hvt_call_reinforcements_end_t) * 708), 255) : (Event Player.downed_start_t ? (
  • Event Player.downed_start_t == 2 ? Color(Green) : Color(White)) : Color(Red)), Global.objective_phase_number == 1 ? Color(
  • White) : (Event Player.downed_start_t ? Color(White) : Color(Yellow)), Visible To Values and Color, Default Visibility);
  • Create Icon(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array,
  • Event Player, Exclamation Mark, Visible To, Color(Yellow), True);
  • Create In-World Text(Global.objective_phase_number == 1 || Global.objective_phase_number == 2 ? All Players(All Teams)
  • : Empty Array, Global.hvt_call_reinforcements_end_t >= Total Time Elapsed ? Custom String("Calling Reinforcements") : (
  • Global.objective_phase_number == 1 ? Custom String("Subdue Target") : Custom String("Capture Target")), Event Player, 1.500,
  • Do Not Clip, Visible To and String, Color(Yellow), Default Visibility);
  • Create Effect(Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array, Ring, Event Player.downed_start_t ? (
  • Event Player.downed_start_t == 2 ? Color(Green) : Color(White)) : Color(Red), Position Of(Event Player) + 0.650 * Up, 10,
  • Visible To Position Radius and Color);
  • Create Effect(Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array, Ring, Event Player.downed_start_t ? (
  • Event Player.downed_start_t == 2 ? Color(Green) : Color(White)) : Color(Red), Position Of(Event Player) + 0.650 * Down, 10,
  • Visible To Position Radius and Color);
  • Create Effect(Global.objective_phase_number == 2 ? All Players(All Teams) : Empty Array, Ring, Event Player.downed_start_t ? (
  • Event Player.downed_start_t == 2 ? Color(Green) : Color(White)) : Color(Red), Position Of(Event Player), (
  • Total Time Elapsed % 1.333 < 0.666) * (15 * Total Time Elapsed % 10), Visible To Position Radius and Color);
  • Create Effect(Global.hvt_call_reinforcements_end_t >= Total Time Elapsed ? All Players(All Teams) : Empty Array, Light Shaft,
  • Color(White), Update Every Frame(Position Of(Event Player)), 1, Visible To Position and Radius);
  • }
  • }
  • rule("HVT Team 2 Slot 1: HVT subdued fallback")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 1;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 2;
  • Has Status(Event Player, Stunned) == False;
  • }
  • actions
  • {
  • Wait(0.250, Abort When False);
  • Abort If Condition Is False;
  • While(Global.objective_phase_number == 2 && !Has Status(Event Player, Stunned));
  • Clear Status(Event Player, Phased Out);
  • Cancel Primary Action(Event Player);
  • Set Status(Event Player, Null, Knocked Down, 9999);
  • Wait(0.250, Ignore Condition);
  • End;
  • If(Global.objective_phase_number == 2);
  • Set Status(Event Player, Null, Phased Out, 9999);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("HVT Team 2 Slot 1: Subdued, check Player in Radius")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 1;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 2;
  • }
  • actions
  • {
  • Event Player.revivers = Filtered Array(Global.combatants, !Current Array Element.downed_start_t && !(
  • Current Array Element.is_invisible % 3) && Distance Between(Event Player, Vector(X Component Of(Position Of(
  • Current Array Element)), Y Component Of(Position Of(Event Player)), Z Component Of(Position Of(Current Array Element))))
  • <= 10 && Absolute Value(Y Component Of(Position Of(Event Player)) - Y Component Of(Position Of(Current Array Element)))
  • <= 5 && Is In Line of Sight(Event Player, Current Array Element, Barriers Do Not Block LOS));
  • If(Count Of(Event Player.revivers));
  • Event Player.downed_start_t = 2;
  • Global.objective_progress += 1.5;
  • Else If(Global.hvt_dom_objective_killed_count >= 3);
  • Event Player.downed_start_t = 1;
  • Global.objective_progress += 0.600;
  • Else If(Event Player.downed_start_t > False);
  • Event Player.downed_start_t -= 0.200;
  • Else;
  • Event Player.revive_timer += Global.hvt_dom_objective_killed_count == 1 ? 3 : 2;
  • End;
  • If(Global.objective_progress >= 150);
  • Clear Status(Event Player, Knocked Down);
  • Clear Status(Event Player, Phased Out);
  • Clear Status(Event Player, Invincible);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), Position Of(Event Player), 1);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Position Of(Event Player), 200);
  • Teleport(Event Player, 1000 * Down);
  • Call Subroutine(start_kill_remaining_phase);
  • Global.objective_progress = False;
  • Else If(Event Player.revive_timer >= 150);
  • Global.objective_phase_number = 1;
  • Global.objective_progress = False;
  • Event Player.gmut_fortified_bypass_end_t = False;
  • Big Message(All Players(All Teams), Custom String("The HVT has been revived!"));
  • Set Player Health(Event Player, 0.600 * Max Health(Event Player));
  • Clear Status(Event Player, Knocked Down);
  • Clear Status(Event Player, Phased Out);
  • Clear Status(Event Player, Invincible);
  • End;
  • Wait(0.200, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("HVT Team 2 Slot 1: Call Reinforcements")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 1;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 1;
  • Normalized Health(Event Player) > 0.500;
  • }
  • actions
  • {
  • Wait Until(Normalized Health(Event Player) <= 0.500 || Global.objective_phase_number == 2, 99999);
  • If(Global.objective_phase_number == 2);
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Else;
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Red), Event Player, 1);
  • Global.hvt_call_reinforcements_end_t = Total Time Elapsed + 10;
  • Set Damage Received(Event Player, 5);
  • Set Player Health(Event Player, 0.500 * Max Health(Event Player));
  • Wait(1, Ignore Condition);
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Wait(4, Ignore Condition);
  • Set Damage Received(Event Player, 50);
  • End;
  • Wait Until(Global.objective_phase_number == 3, 99999);
  • }
  • }
  • rule("HVT Team 2 Slot 1: Capture Breakpoints")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 1;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 2;
  • }
  • actions
  • {
  • Call Subroutine(upgrade_health_and_healing);
  • Global.money_amount += 105;
  • Wait Until(Global.objective_progress >= 140, 99999);
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Wait Until(Global.objective_phase_number == 3, 99999);
  • Global.money_amount += 105;
  • }
  • }
  • rule("DOM Team 2 Slot 2: Create Guard and Control Point Entities")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 2;
  • }
  • actions
  • {
  • Create Progress Bar HUD Text(Global.objective_phase_number == 1 ? All Players(All Teams) : Empty Array, Array Contains(
  • Global.dom_point_A_contesters, Local Player) ? First Of(Global.objective_progress) : (Array Contains(
  • Global.dom_point_B_contesters, Local Player) ? Global.objective_progress[1] : 0.250 * (100 * ((Players In Slot(2, Color(
  • Team 2)).is_living_boss ? 1 - Normalized Health(Players In Slot(2, Color(Team 2))) : 1) + (Players In Slot(3, Color(Team 2))
  • .is_living_boss ? 1 - Normalized Health(Players In Slot(3, Color(Team 2))) : 1)) + First Of(Global.objective_progress)
  • + Global.objective_progress[1])), Array Contains(Global.dom_point_A_contesters, Local Player) ? (Players In Slot(2, Color(
  • Team 2)).is_living_boss ? Custom String("Kill the Guard to unlock this point") : Custom String("Capturing...")) : (
  • Array Contains(Global.dom_point_B_contesters, Local Player) ? (Players In Slot(3, Color(Team 2))
  • .is_living_boss ? Custom String("Kill the Guard to unlock the point") : Custom String("Capturing...")) : (Is True For Any(
  • All Players(Team 2), Current Array Element.is_living_boss) ? Custom String("Kill the guards and capture the points")
  • : Custom String("Capture the points"))), Top, -97, Array Contains(Global.dom_point_A_contesters, Local Player)
  • || Array Contains(Global.dom_point_B_contesters, Local Player) ? Color(Green) : Color(White), (Array Contains(
  • Global.dom_point_A_contesters, Local Player) && Players In Slot(2, Color(Team 2)).is_living_boss) || (Array Contains(
  • Global.dom_point_B_contesters, Local Player) && Players In Slot(3, Color(Team 2)).is_living_boss) ? Color(Yellow) : Color(
  • White), Visible To Values and Color, Default Visibility);
  • Create Effect(Global.objective_phase_number == 1 && First Of(Global.objective_progress) < 100 ? All Players(All Teams)
  • : Empty Array, Ring, Players In Slot(2, Color(Team 2)).is_living_boss ? Color(Red) : (Count Of(Global.dom_point_A_contesters)
  • ? Color(Green) : Color(White)), First Of(Global.iv_dom_objective_pos), 3, Visible To Position Radius and Color);
  • Create Effect(Global.objective_phase_number == 1 && Global.objective_progress[1] < 100 ? All Players(All Teams) : Empty Array,
  • Ring, Players In Slot(3, Color(Team 2)).is_living_boss ? Color(Red) : (Count Of(Global.dom_point_B_contesters) ? Color(Green)
  • : Color(White)), Global.iv_dom_objective_pos[1], 3, Visible To Position Radius and Color);
  • Create Icon(Global.objective_phase_number == 1 && First Of(Global.objective_progress) < 100 ? All Players(All Teams) : Empty Array,
  • First Of(Global.iv_dom_objective_pos) + 2 * Up, Exclamation Mark, Visible To Position and Color, Players In Slot(2, Color(
  • Team 2)).is_living_boss ? Color(Orange) : Color(Yellow), True);
  • Create Icon(Global.objective_phase_number == 1 && Global.objective_progress[1] < 100 ? All Players(All Teams) : Empty Array,
  • Global.iv_dom_objective_pos[1] + 2 * Up, Exclamation Mark, Visible To Position and Color, Players In Slot(3, Color(Team 2))
  • .is_living_boss ? Color(Orange) : Color(Yellow), True);
  • Create In-World Text(Global.objective_phase_number == 1 && First Of(Global.objective_progress) < 100 ? All Players(All Teams)
  • : Empty Array, Players In Slot(2, Color(Team 2)).is_living_boss ? Custom String("Kill Guard") : Custom String("Capture point"),
  • Players In Slot(2, Color(Team 2)).is_living_boss ? Players In Slot(2, Color(Team 2)) : First Of(Global.iv_dom_objective_pos)
  • + 1.700 * Up, 1.500, Do Not Clip, Visible To Position and String, Color(Yellow), Default Visibility);
  • Create In-World Text(Global.objective_phase_number == 1 && Global.objective_progress[1] < 100 ? All Players(All Teams)
  • : Empty Array, Players In Slot(3, Color(Team 2)).is_living_boss ? Custom String("Kill Guard") : Custom String("Capture point"),
  • Players In Slot(3, Color(Team 2)).is_living_boss ? Players In Slot(3, Color(Team 2))
  • : Global.iv_dom_objective_pos[1] + 1.700 * Up, 1.500, Do Not Clip, Visible To Position and String, Color(Yellow),
  • Default Visibility);
  • }
  • }
  • rule("DOM Team 2 Slot 2: Contest Control Point A")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 2;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 1;
  • First Of(Global.objective_progress) < 100;
  • }
  • actions
  • {
  • Global.dom_point_A_contesters = Filtered Array(Global.combatants, !Current Array Element.downed_start_t && !(
  • Current Array Element.is_invisible % 3) && Distance Between(First Of(Global.iv_dom_objective_pos), Vector(X Component Of(
  • Position Of(Current Array Element)), Y Component Of(First Of(Global.iv_dom_objective_pos)), Z Component Of(Position Of(
  • Current Array Element)))) <= 3 && Absolute Value(Y Component Of(Position Of(First Of(Global.iv_dom_objective_pos)))
  • - Y Component Of(Position Of(Current Array Element))) <= 3 && Is In Line of Sight(First Of(Global.iv_dom_objective_pos) + Up,
  • Current Array Element, Barriers Do Not Block LOS));
  • If(!Players In Slot(2, Color(Team 2)).is_living_boss && Count Of(Global.dom_point_A_contesters));
  • Global.objective_progress[0] += 2;
  • Wait(0.250, Ignore Condition);
  • Global.objective_progress[0] += 2;
  • If(First Of(Global.objective_progress) >= 100);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), First Of(Global.iv_dom_objective_pos), 3);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), First Of(Global.iv_dom_objective_pos), 200);
  • Global.dom_point_A_contesters = Empty Array;
  • Global.money_amount += 70;
  • If(Global.objective_progress[1] >= 100);
  • Global.objective_phase_number = 2;
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Wait(2, Ignore Condition);
  • Call Subroutine(start_kill_remaining_phase);
  • End;
  • End;
  • Wait(0.250, Ignore Condition);
  • Else;
  • Wait(0.500, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("DOM Team 2 Slot 2: Contest Control Point B")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • Slot 2;
  • }
  • conditions
  • {
  • Global.objective_phase_number == 1;
  • Global.objective_progress[1] < 100;
  • }
  • actions
  • {
  • Global.dom_point_B_contesters = Filtered Array(Global.combatants, !Current Array Element.downed_start_t && !(
  • Current Array Element.is_invisible % 3) && Distance Between(Global.iv_dom_objective_pos[1], Vector(X Component Of(Position Of(
  • Current Array Element)), Y Component Of(Global.iv_dom_objective_pos[1]), Z Component Of(Position Of(Current Array Element))))
  • <= 3 && Absolute Value(Y Component Of(Position Of(Global.iv_dom_objective_pos[1])) - Y Component Of(Position Of(
  • Current Array Element))) <= 3 && Is In Line of Sight(Global.iv_dom_objective_pos[1] + Up, Current Array Element,
  • Barriers Do Not Block LOS));
  • If(!Players In Slot(3, Color(Team 2)).is_living_boss && Count Of(Global.dom_point_B_contesters));
  • Global.objective_progress[1] += 2;
  • Wait(0.250, Ignore Condition);
  • Global.objective_progress[1] += 2;
  • If(Global.objective_progress[1] >= 100);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), Global.iv_dom_objective_pos[1], 3);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Global.iv_dom_objective_pos[1], 200);
  • Global.dom_point_B_contesters = Empty Array;
  • Global.money_amount += 70;
  • If(First Of(Global.objective_progress) >= 100);
  • Global.objective_phase_number = 2;
  • Global.enable_normal_spawns = True;
  • Call Subroutine(call_reinforcements);
  • Start Rule(play_incoming_sound_twice, Do Nothing);
  • Wait(2, Ignore Condition);
  • Call Subroutine(start_kill_remaining_phase);
  • End;
  • End;
  • Wait(0.250, Ignore Condition);
  • Else;
  • Wait(0.500, Ignore Condition);
  • End;
  • Loop If Condition Is True;
  • }
  • }
  • rule("[Info] Ana")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Ana;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("multinade");
  • Event Player.talent_text[2] = Custom String("throw 3 biotic grenades instead of 1");
  • "T2"
  • Event Player.talent_text[3] = Custom String("sleep paralysis");
  • Event Player.talent_text[4] = Custom String("enemies slept by sleep dart receive large damage when they wake up");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Shrike"));
  • }
  • }
  • rule("[Info] Ashe")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Ashe;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("black gunpowder");
  • Event Player.talent_text[2] = Custom String("coach gun stuns and sets enemies on fire");
  • "T2"
  • Event Player.talent_text[3] = Custom String("dancing flames");
  • Event Player.talent_text[4] = Custom String("eliminated enemies exlpode and burn others nearby");
  • }
  • }
  • rule("[Info] Baptiste")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Baptiste;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("corrode");
  • Event Player.talent_text[2] = Custom String(
  • "regenerative burst inflicts poison damage to enemies and instantly starts health regen");
  • "T2"
  • Event Player.talent_text[3] = Custom String("bullettime");
  • Event Player.talent_text[4] = Custom String("weapon becomes a fast firing minigun during amplification matrix");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Medic"));
  • }
  • }
  • rule("[Info] Bastion")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Bastion;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("treads");
  • Event Player.talent_text[2] = Custom String("sentry form enables movement with increased resistance");
  • "T2"
  • Event Player.talent_text[3] = Custom String("bomblets");
  • Event Player.talent_text[4] = Custom String("sentry bullets are explosive");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Configurator"));
  • }
  • }
  • rule("[Info] Brigitte")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Brigitte;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("endeavor");
  • Event Player.talent_text[2] = Custom String("gain a boost in damage, armour and speed when your barrier breaks");
  • "T2"
  • Event Player.talent_text[3] = Custom String("whiplash");
  • Event Player.talent_text[4] = Custom String("endpoint of whip shot generates a stunning shockwave");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Shield"));
  • }
  • }
  • rule("[Info] DVa")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • D.Va;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("voltage grid");
  • Event Player.talent_text[2] = Custom String("defense matrix damages and roots enemies");
  • "T2"
  • Event Player.talent_text[3] = Custom String("shooting star");
  • Event Player.talent_text[4] = Custom String("boosters set enemies on fire");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Aeronaut"));
  • }
  • }
  • rule("[Info] Doomfist")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Doomfist;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("phase shifter");
  • Event Player.talent_text[2] = Custom String("immune to damage while an ability is active");
  • "T2"
  • Event Player.talent_text[3] = Custom String("fissure");
  • Event Player.talent_text[4] = Custom String("meteor strike leaves a large fire pool behind");
  • }
  • }
  • rule("[Info] Echo")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Echo;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("silver lining");
  • Event Player.talent_text[2] = Custom String("fire many more sticky bombs");
  • "T2"
  • Event Player.talent_text[3] = Custom String("focusing optics");
  • Event Player.talent_text[4] = Custom String("focusing beam boost starts at 90% hp instead of 50%");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Hoverbird"));
  • }
  • }
  • rule("[Info] Genji")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Genji;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("venomous strike");
  • Event Player.talent_text[2] = Custom String("swift strike deals bleed damage; heal for bleed damage");
  • "T2"
  • Event Player.talent_text[3] = Custom String("dragon's breath");
  • Event Player.talent_text[4] = Custom String("dragonblade fires explosive spirit charges with every swing");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Shinobi"));
  • }
  • }
  • rule("[Info] Hanzo")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Hanzo;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("firebolt");
  • Event Player.talent_text[2] = Custom String("charging an arrow for more than 2s turns it into an explosive bolt");
  • "T2"
  • Event Player.talent_text[3] = Custom String("stormbreak");
  • Event Player.talent_text[4] = Custom String("storm arrows have no cooldown for a short duration when earning a kill");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Bowmaster"));
  • }
  • }
  • rule("[Info] Junkrat")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Junkrat;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("pyromania");
  • Event Player.talent_text[2] = Custom String("all explosive attacks inflict fire damage");
  • "T2"
  • Event Player.talent_text[3] = Custom String("satchel charge");
  • Event Player.talent_text[4] = Custom String("gain +1 concussion mine every 5s; hold up to 4 max");
  • }
  • }
  • rule("[Info] Lucio")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Lúcio;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("power skating");
  • Event Player.talent_text[2] = Custom String("soundwave deals more damage and knockback based on movement speed");
  • "T2"
  • Event Player.talent_text[3] = Custom String("healing wave");
  • Event Player.talent_text[4] = Custom String("soundwave heals allies for 30% of their max health");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Gunrunner"));
  • }
  • }
  • rule("[Info] Cassidy")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Cassidy;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("standoff");
  • Event Player.talent_text[2] = Custom String("enemies cannot move once their skull is locked during deadeye");
  • "T2"
  • Event Player.talent_text[3] = Custom String("flashpoint");
  • Event Player.talent_text[4] = Custom String("flashbang breaks into 3 more clusters after exploding");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Gunslinger"));
  • }
  • }
  • rule("[Info] Mei")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("cold snap");
  • Event Player.talent_text[2] = Custom String("instantly freeze nearby enemies once cryo-freeze breaks");
  • "T2"
  • Event Player.talent_text[3] = Custom String("polar vortex");
  • Event Player.talent_text[4] = Custom String("mei throws 3 blizzard drones instead of 1 at increased damage");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Subzero"));
  • }
  • }
  • rule("[Info] Mercy")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mercy;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("wings of grand");
  • Event Player.talent_text[2] = Custom String("guardian angel damages and knocks enemies down in its path");
  • "T2"
  • Event Player.talent_text[3] = Custom String("holy light missiles");
  • Event Player.talent_text[4] = Custom String("launch powerful light charges during valkyrie");
  • }
  • }
  • rule("[Info] Moira")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Moira;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("flourish");
  • Event Player.talent_text[2] = Custom String("fading through allies heals and through enemies damages them");
  • "T2"
  • Event Player.talent_text[3] = Custom String("mitosis");
  • Event Player.talent_text[4] = Custom String("many, many orbs");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Wraith"));
  • }
  • }
  • rule("[Info] Orisa")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Orisa;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("immovable object");
  • Event Player.talent_text[2] = Custom String("become invincible during fortify, but greatly reduce received healing while active");
  • "T2"
  • Event Player.talent_text[3] = Custom String("unstoppable force");
  • Event Player.talent_text[4] = Custom String("halt! explodes violently and stuns enemies when triggered");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Bulldozer"));
  • }
  • }
  • rule("[Info] Pharah")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Pharah;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("head trauma");
  • Event Player.talent_text[2] = Custom String("concussive blast deals damage and tazes enemies below half health");
  • "T2"
  • Event Player.talent_text[3] = Custom String("weaponized storm");
  • Event Player.talent_text[4] = Custom String("every 6th rocket flies faster and detonates several clusters");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Skirmisher"));
  • }
  • }
  • rule("[Info] Reaper")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Reaper;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("wraith wrath");
  • Event Player.talent_text[2] = Custom String("shooting is enabled during wraith form with increased damage");
  • "T2"
  • Event Player.talent_text[3] = Custom String("loom");
  • Event Player.talent_text[4] = Custom String("wraith form instantly tazes all enemies in sight");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Spook"));
  • }
  • }
  • rule("[Info] Reinhardt")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Reinhardt;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("fire blast");
  • Event Player.talent_text[2] = Custom String("fire strike explodes as it deals damage, igniting enemies");
  • "T2"
  • Event Player.talent_text[3] = Custom String("epicenter");
  • Event Player.talent_text[4] = Custom String("earthshatter travels in all directions");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Crusader"));
  • }
  • }
  • rule("[Info] Roadhog")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Roadhog;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("stench");
  • Event Player.talent_text[2] = Custom String("constantly inflict toxic damage to nearby enemeis");
  • "T2"
  • Event Player.talent_text[3] = Custom String("chainsnap");
  • Event Player.talent_text[4] = Custom String("chain hook deals 4x more damage; resets upon eliminations");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Juggernaut"));
  • }
  • }
  • rule("[Info] Sigma")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Sigma;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("accretion disk");
  • Event Player.talent_text[2] = Custom String("accretion flies straight and has increased damage and stun");
  • "T2"
  • Event Player.talent_text[3] = Custom String("string theory");
  • Event Player.talent_text[4] = Custom String(
  • "when kinetic grasp ends, fire a blast that scales based on the amount of damage collected");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Graviton"));
  • }
  • }
  • rule("[Info] Soldier: 76")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Soldier: 76;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("triple threat");
  • Event Player.talent_text[2] = Custom String("helix rockets fires two adjacent mini rockets");
  • "T2"
  • Event Player.talent_text[3] = Custom String("Espionage");
  • Event Player.talent_text[4] = Custom String("allies in biotic field revive faster and become harder to hit");
  • }
  • }
  • rule("[Info] Sombra")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Sombra;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("malware");
  • Event Player.talent_text[2] = Custom String("hacked enemies receive 40% more damage from all sources");
  • "T2"
  • Event Player.talent_text[3] = Custom String("VPN");
  • Event Player.talent_text[4] = Custom String("manually decloaking is instant and grants invincibility");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Taser"));
  • }
  • }
  • rule("[Info] Symmetra")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Symmetra;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("sentry paragon");
  • Event Player.talent_text[2] = Custom String("each sentry turret deals 50% more damage");
  • "T2"
  • Event Player.talent_text[3] = Custom String("shield generator");
  • Event Player.talent_text[4] = Custom String("gain increased damage and speed, and grant all players shields with kills");
  • }
  • }
  • rule("[Info] Torbjorn")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Torbjörn;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("heatwaves");
  • Event Player.talent_text[2] = Custom String("unleash waves of fire when overload or molten core is active");
  • "T2"
  • Event Player.talent_text[3] = Custom String("melting point");
  • Event Player.talent_text[4] = Custom String("every turret kill boosts its damage to 200% for a short duration");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Portal"));
  • }
  • }
  • rule("[Info] Tracer")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Tracer;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("vortex");
  • Event Player.talent_text[2] = Custom String("recall drags and roots nearby enemies to its activation point");
  • "T2"
  • Event Player.talent_text[3] = Custom String("chain reaction");
  • Event Player.talent_text[4] = Custom String("pulse bomb explosions can chain onto other enemies");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Playmaker"));
  • }
  • }
  • rule("[Info] Widowmaker")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Widowmaker;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("baiser de soie");
  • Event Player.talent_text[2] = Custom String("scoped critical hits instantly kill enemies below 30% hp");
  • "T2"
  • Event Player.talent_text[3] = Custom String("widow's gaze");
  • Event Player.talent_text[4] = Custom String("infra-sight forces enemies in sight to deal much less damage and receive much more");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Sniper"));
  • }
  • }
  • rule("[Info] Winston")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Winston;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("next generation");
  • Event Player.talent_text[2] = Custom String("each elimination during primal rage adds +10% to its next use");
  • "T2"
  • Event Player.talent_text[3] = Custom String("quake");
  • Event Player.talent_text[4] = Custom String("jump pack landing force is much more powerful and stuns enemies");
  • }
  • }
  • rule("[Info] Wrecking Ball")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Wrecking Ball;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("mirror ball");
  • Event Player.talent_text[2] = Custom String("reflect 100% of received damage to nearby enemies");
  • "T2"
  • Event Player.talent_text[3] = Custom String("distortion");
  • Event Player.talent_text[4] = Custom String("adaptive shields triggers explosions and tazes nearby enemies");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Detonator"));
  • }
  • }
  • rule("[Info] Zarya")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Zarya;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("combusta-bubble");
  • Event Player.talent_text[2] = Custom String("barriers explode when they expire");
  • "T2"
  • Event Player.talent_text[3] = Custom String("power surge");
  • Event Player.talent_text[4] = Custom String("personal barrier grants energy upon activation");
  • Start Forcing Dummy Bot Name(Event Player, Custom String("Amazon"));
  • }
  • }
  • rule("[Info] Zenyatta")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Zenyatta;
  • }
  • actions
  • {
  • "T1"
  • Event Player.talent_text[1] = Custom String("spirit salvo");
  • Event Player.talent_text[2] = Custom String("fully charged orb volleys add more shots to its attack");
  • "T2"
  • Event Player.talent_text[3] = Custom String("perfect balance");
  • Event Player.talent_text[4] = Custom String("transcendence damages enemies in the area of effect");
  • }
  • }
  • rule("Ana: Multinade")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Ana;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • For Player Variable(Event Player, i, 0, 4, 1);
  • Wait(0.030, Ignore Condition);
  • Set Ability Cooldown(Event Player, Button(Ability 2), False);
  • Cancel Primary Action(Event Player);
  • Wait(0.050, Ignore Condition);
  • Press Button(Event Player, Button(Ability 2));
  • End;
  • Wait(2, Ignore Condition);
  • }
  • }
  • rule("Ana: Sleep Paralysis")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Ana;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent2);
  • Abort If(Event Ability != Button(Ability 1));
  • Play Effect(All Players(All Teams), Good Explosion, Color(Black), Victim, 2);
  • Wait(0.500, Ignore Condition);
  • Wait Until(!Has Status(Victim, Asleep), 5);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(Black), Eye Position(Victim), 150);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Black), Victim, 6);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Black), Victim, 12);
  • Damage(Players Within Radius(Victim, 6, Team 2, Surfaces), Event Player, 150);
  • Set Status(Players Within Radius(Eye Position(Victim), 6, Color(Team 2), Surfaces), Null, Hacked, 1.5);
  • }
  • }
  • rule("Zenyatta: Spirit Salvo")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Zenyatta;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • Wait(2.5, Abort When False);
  • Wait Until(!Is Firing Secondary(Event Player), 99999);
  • For Player Variable(Event Player, i, 0, 4, 1);
  • Set Projectile Speed(Event Player, 100);
  • Wait(0.150, Ignore Condition);
  • End;
  • }
  • }
  • rule("Zenyatta: Perfect Balance")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Zenyatta;
  • }
  • conditions
  • {
  • Is Using Ultimate(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Start Damage Over Time(Players Within Radius(Event Player, 12, Team 2, Surfaces), Event Player, 1, 100);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Event Player, 24);
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Orisa: Immovable Object")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Orisa;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Set Status(Event Player, Null, Invincible, 4);
  • Start Healing Modification(Event Player, Global.combatants, 0, Receivers and Healers);
  • Event Player.damage_mod[1] = Last Healing Modification ID;
  • While(Is Using Ability 1(Event Player));
  • Event Player.last_damage_taken_t = Total Time Elapsed;
  • Wait(1, Ignore Condition);
  • End;
  • Stop Healing Modification(Event Player.damage_mod[1]);
  • }
  • }
  • rule("Orisa: Unstoppable Force")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Orisa;
  • }
  • conditions
  • {
  • Is Firing Secondary(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Event Player.Ability_Projectile1 = Eye Position(Event Player) + Facing Direction Of(Event Player) * 0.500;
  • Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 100, Null, All Players(All Teams), False);
  • Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 25, Destination and Rate);
  • Wait(0.250, Ignore Condition);
  • Wait Until((!Event Player.Ability_Available && Is Button Held(Event Player, Button(Secondary Fire)))
  • || !Event Player.Talent2 || Event Player.Ability_Projectile1 == Event Player.Ability_End, 99999);
  • Stop Chasing Player Variable(Event Player, Ability_Projectile1);
  • Wait(0.500, Ignore Condition);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 5, Team 2, Off), Event Player, 100);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Lime Green), Event Player.Ability_Projectile1, 5);
  • Set Status(Players Within Radius(Event Player.Ability_Projectile1, 5, Team 2, Off), Event Player, Stunned, 1.500);
  • }
  • }
  • rule("Orisa: Availability for Halt!")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Orisa;
  • }
  • conditions
  • {
  • Is Firing Secondary(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Event Player.Ability_Available = True;
  • Wait Until(!Is Button Held(Event Player, Button(Secondary Fire)), 99999);
  • Event Player.Ability_Available = False;
  • }
  • }
  • rule("Sigma: Accretion Disk")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Sigma;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Set Projectile Speed(Event Player, 150);
  • Set Projectile Gravity(Event Player, 0);
  • Wait Until(!Event Player.Talent1 || !Is Using Ability 2(Event Player), 5);
  • Set Projectile Speed(Event Player, 100);
  • Set Projectile Gravity(Event Player, 100);
  • }
  • }
  • rule("Sigma: Accretion Disk")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Sigma;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent1);
  • Abort If(Event Ability != Button(Ability 2));
  • Abort If(Victim == Event Player);
  • Set Status(Victim, Event Player, Knocked Down, 1.500);
  • Damage(Victim, Event Player, Event Damage * 0.750);
  • }
  • }
  • rule("Sigma: String Theory")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Sigma;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(1.800, Abort When False);
  • Event Player.Ability_Projectile1 = Eye Position(Event Player);
  • Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 50, All Players(Team 2), Event Player, True);
  • Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 40, Destination and Rate);
  • Create Effect(All Players(All Teams), Sphere, Color(Violet), Event Player.Ability_Projectile1, 0.600,
  • Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Create Effect(All Players(All Teams), Good Aura, Color(Violet), Event Player.Ability_Projectile1, 0.600,
  • Visible To Position and Radius);
  • Event Player.Effects___[2] = Last Created Entity;
  • Wait(0.250, Ignore Condition);
  • Event Player.Ability_Countdown = Health Of Type(Event Player, Shields);
  • Wait Until(!Event Player.Talent2 || Event Player.Ability_Projectile1 == Event Player.Ability_End, 5);
  • Stop Chasing Player Variable(Event Player, Ability_Projectile1);
  • Destroy Effect(Event Player.Effects___[1]);
  • Destroy Effect(Event Player.Effects___[2]);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, Min(10, 1.500 + Event Player.Ability_Countdown * 0.017), Team 2,
  • Off), Event Player, Min(200, 100 + Event Player.Ability_Countdown / 5));
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(Violet), Event Player.Ability_Projectile1, 150);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Violet), Event Player.Ability_Projectile1, Min(10,
  • 1.500 + Event Player.Ability_Countdown * 0.017));
  • Play Effect(All Players(All Teams), Good Explosion, Color(Purple), Event Player.Ability_Projectile1, Min(10,
  • 1.500 + Event Player.Ability_Countdown * 0.017));
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Violet), Event Player.Ability_Projectile1, Min(20,
  • 3 + Event Player.Ability_Countdown * 0.017));
  • }
  • }
  • rule("Ashe: Black Gunpowder")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Ashe;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Event Ability == Button(Ability 1);
  • Victim != Event Player;
  • }
  • actions
  • {
  • Start Damage Over Time(Victim, Event Player, 3, Event Damage * 2.500);
  • Set Status(Victim, Null, Burning, 3);
  • }
  • }
  • rule("Ashe: Dancing Flames")
  • {
  • event
  • {
  • Player Earned Elimination;
  • Team 1;
  • Ashe;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Eye Position(Victim), 120);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Victim, 5);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Yellow), Victim, 5);
  • Start Damage Over Time(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, 3, 15);
  • Set Status(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, Burning, 3);
  • Damage(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, 30);
  • }
  • }
  • rule("Widowmaker: Widowmaker Ult")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Widowmaker);
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Global.gazed___ = 2;
  • Wait(1, Ignore Condition);
  • Loop If Condition Is True;
  • Global.gazed___ = 1;
  • }
  • }
  • rule("Widowmaker: Baiser De Soie")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Widowmaker;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent1);
  • Abort If(Event Ability != Button(Primary Fire));
  • Abort If(!Is Firing Secondary(Event Player));
  • Abort If(!Event Was Critical Hit);
  • Abort If(Normalized Health(Victim) > 0.300);
  • Abort If(Victim.is_living_boss);
  • Abort If(Victim.iv_is_portal);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Violet), Victim, 3);
  • Damage(Victim, Event Player, 10000);
  • Damage(Players Within Radius(Victim, 3, Team 2, Surfaces), Event Player, Event Damage);
  • }
  • }
  • rule("Widowmaker: Widow's Gaze")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Widowmaker;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Start Damage Modification(Filtered Array(All Living Players(Team 2), Is In View Angle(Event Player, Current Array Element, 90)
  • && Is In Line of Sight(Event Player, Current Array Element, Enemy Barriers Block LOS)), All Players(Team 1), 190,
  • Receivers Damagers and Damage Percent);
  • Event Player.damage_mod[1] = Last Damage Modification ID;
  • Start Damage Modification(All Players(Team 1), Filtered Array(All Living Players(Team 2), Is In View Angle(Event Player,
  • Current Array Element, 90) && Is In Line of Sight(Event Player, Current Array Element, Enemy Barriers Block LOS)), 10,
  • Receivers Damagers and Damage Percent);
  • Event Player.damage_mod[2] = Last Damage Modification ID;
  • Wait Until(!Is Using Ultimate(Event Player) || !Event Player.Talent2, 99999);
  • Stop Damage Modification(Event Player.damage_mod[1]);
  • Stop Damage Modification(Event Player.damage_mod[2]);
  • }
  • }
  • rule("Torbjorn: Heatwave")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Torbjörn;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • (Is Using Ability 2(Event Player) || Is Using Ultimate(Event Player)) == True;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 11);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 12);
  • Start Damage Over Time(Remove From Array(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player), Event Player, 3,
  • 20);
  • Set Status(Remove From Array(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player), Event Player, Burning, 3);
  • Damage(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player, 15);
  • Wait(0.750, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Torbjorn: Melting Point")
  • {
  • event
  • {
  • Player Earned Elimination;
  • Team 1;
  • Torbjörn;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Event Ability == Button(Ability 1);
  • }
  • actions
  • {
  • Event Player.Ability_Countdown += 6;
  • Chase Player Variable At Rate(Event Player, Ability_Countdown, 0, 1, Destination and Rate);
  • }
  • }
  • rule("Torbjorn: Melting Point - Boost")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Torbjörn;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Event Player.Ability_Countdown > False;
  • }
  • actions
  • {
  • Start Damage Modification(All Players(Team 2), Event Player, 33, Receivers Damagers and Damage Percent);
  • Event Player.damage_mod[1] = Last Damage Modification ID;
  • Event Player.Damage_Dealt += 300;
  • Wait Until(Is Dead(Event Player) || !Event Player.Ability_Countdown || !Event Player.Talent2, 99999);
  • Event Player.Ability_Countdown = False;
  • Stop Damage Modification(Event Player.damage_mod[1]);
  • Event Player.Damage_Dealt -= 300;
  • Stop Chasing Player Variable(Event Player, Ability_Countdown);
  • }
  • }
  • rule("Reinhardt: Fire Blast")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Reinhardt;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent1);
  • Abort If(Event Ability != Button(Ability 2));
  • Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Victim, 5);
  • Start Damage Over Time(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, 5, Event Damage * 0.2);
  • Set Status(Players Within Radius(Victim, 5, Team 2, Surfaces), Event Player, Burning, 5);
  • }
  • }
  • rule("Reinhardt: Epicenter")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Reinhardt;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ultimate(Event Player) == True;
  • Is On Ground(Event Player) == True;
  • }
  • actions
  • {
  • Set Status(Players Within Radius(Event Player, 20, Team 2, Surfaces), Event Player, Knocked Down, 2.500);
  • For Player Variable(Event Player, i, 0, 3, 1);
  • Wait(0.032, Ignore Condition);
  • Damage(Players Within Radius(Event Player, Event Player.i * 10, Team 2, Surfaces), Event Player, 50);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), Event Player.i * 20);
  • End;
  • Wait(5, Ignore Condition);
  • }
  • }
  • rule("Brigitte: Endeavor")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Brigitte;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Ability Cooldown(Event Player, Button(Secondary Fire)) >= 0.100;
  • }
  • actions
  • {
  • Create Effect(All Players(All Teams), Echo Cloning Effect, Color(Team 1), Event Player, 0.400, Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Eye Position(Event Player), 15);
  • Heal(Players Within Radius(Event Player, 15, Team 1, Off), Event Player, 200);
  • Event Player.Damage_Dealt += 150;
  • Event Player.Move_Speed += 75;
  • Add Health Pool To Player(Event Player, Armor, Max Health(Event Player) / 3, False, True);
  • Event Player.HP_Pool[1] = Last Created Health Pool;
  • Wait Until(!Event Player.Talent1 || Is Dead(Event Player), 6);
  • Event Player.Damage_Dealt -= 150;
  • Event Player.Move_Speed -= 75;
  • Remove Health Pool From Player(Event Player.HP_Pool[1]);
  • Destroy Effect(Event Player.Effects___[1]);
  • }
  • }
  • rule("Brigitte: Whiplash")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Brigitte;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Green), Victim, 100);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Orange), Victim, 2.500);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Victim, 2.500);
  • Damage(Players Within Radius(Victim, 2.500, Team 2, Surfaces), Event Player, 100);
  • Set Status(Players Within Radius(Victim, 2.500, Team 2, Surfaces), Event Player, Stunned, 1.500);
  • }
  • }
  • rule("Genji: Venomous Strike")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Genji;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent1);
  • Abort If(Event Ability != Button(Ability 1));
  • Start Heal Over Time(Event Player, Event Player, 3, 15);
  • Start Damage Over Time(Victim, Event Player, 3, 15);
  • Heal(Event Player, Event Player, 5);
  • Wait(0.250, Restart When True);
  • Wait(2, Ignore Condition);
  • }
  • }
  • rule("Genji: Dragon's Breath")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Genji;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ultimate(Event Player) == True;
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • Create Effect(All Players(All Teams), Good Aura, Color(Lime Green), Event Player.Ability_Projectile1, 1,
  • Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Event Player.Ability_Projectile1 = Eye Position(Event Player);
  • Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 80, Destination and Rate);
  • Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 60, All Living Players(Team 2), All Players(Team 1), True);
  • Wait Until(!Event Player.Talent2 || Event Player.Ability_End == Event Player.Ability_Projectile1, 1);
  • Destroy Effect(Event Player.Effects___[1]);
  • Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Green), Event Player.Ability_Projectile1, 100);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Lime Green), Event Player.Ability_Projectile1, 5);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Green), Event Player.Ability_Projectile1, 5);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 5, Team 2, Surfaces), Event Player, 150);
  • Stop Chasing Player Variable(Event Player, Ability_Countdown);
  • }
  • }
  • rule("Mercy: Wings of Grand")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Mercy;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Alive(Event Player) == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • If(Speed Of(Event Player) > 10);
  • Damage(Filtered Array(Players Within Radius(Event Player, 4, Team 2, Surfaces), !Has Status(Current Array Element, Knocked Down)),
  • Event Player, 35);
  • Set Status(Players Within Radius(Event Player, 4, Team 2, Surfaces), Event Player, Knocked Down, 0.800);
  • Apply Impulse(Players Within Radius(Event Player, 4, Team 2, Surfaces), Normalize(Velocity Of(Event Player)) + Direction Towards(
  • Event Player, Throttle Of(Event Player)) + Up * 1.100, 7.500, To World, Cancel Contrary Motion);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Yellow), Position Of(Event Player), 0.150);
  • End;
  • Wait(0.250, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Mercy: Holy Light Missiles")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Mercy;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Create Effect(All Players(All Teams), Orb, Color(Yellow), Event Player.Ability_Projectile1, 1,
  • Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Event Player.Ability_Projectile1 = Eye Position(Event Player);
  • Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 100, Destination and Rate);
  • Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 60, All Living Players(Team 2), All Players(Team 1), True);
  • Wait Until(!Event Player.Talent2 || Event Player.Ability_End == Event Player.Ability_Projectile1, 1);
  • Destroy Effect(Event Player.Effects___[1]);
  • Stop Chasing Player Variable(Event Player, Ability_Countdown);
  • Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Green), Event Player.Ability_Projectile1, 100);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Yellow), Event Player.Ability_Projectile1, 6);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Event Player.Ability_Projectile1, 6);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 6, Team 2, Surfaces), Event Player, 150);
  • Heal(Players Within Radius(Event Player.Ability_Projectile1, 6, Team 1, Surfaces), Event Player, 150);
  • Wait(1.5, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Tracer: Vortex")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Tracer;
  • }
  • conditions
  • {
  • Is Using Ability 2(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Heal(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 1);
  • Damage(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 25);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Red), Position Of(Event Player), 20);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Yellow), Position Of(Event Player), 18);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Green), Position Of(Event Player), 16);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Position Of(Event Player), 14);
  • Set Environment Credit Player(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player);
  • }
  • }
  • rule("Tracer: Vortex 2")
  • {
  • event
  • {
  • Player Received Healing;
  • Team 2;
  • All;
  • }
  • actions
  • {
  • Abort If(!Healer.Talent1);
  • Abort If(Event Player.is_living_boss);
  • Abort If(!Is Using Ability 2(Healer));
  • Disable Movement Collision With Players(Event Player);
  • Apply Impulse(Event Player, Up, 3, To World, Cancel Contrary Motion);
  • Set Gravity(Event Player, False);
  • Wait(0.050, Ignore Condition);
  • Apply Impulse(Event Player, Direction Towards(Event Player, Healer), Distance Between(Event Player, Healer) * 3.400, To World,
  • Cancel Contrary Motion);
  • Set Status(Event Player, Null, Rooted, 1);
  • Wait(0.230, Ignore Condition);
  • Set Gravity(Event Player, 100);
  • Enable Movement Collision With Players(Event Player);
  • Call Subroutine(Cancel_Momentum);
  • }
  • }
  • rule("Tracer: Chain Reaction")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Is True For Any(Filtered Array(All Living Players(Team 2), Current Array Element.Chain_Reaction_On), Distance Between(Event Player,
  • Current Array Element) <= 7) == True;
  • Event Player.Chain_Reaction_Immune == False;
  • Event Player.Chain_Reaction_On == False;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.250, Ignore Condition);
  • Event Player.Chain_Reaction_On = True;
  • }
  • }
  • rule("Tracer: Chain Reaction 2")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 2;
  • All;
  • }
  • conditions
  • {
  • Event Player.Chain_Reaction_On == True;
  • }
  • actions
  • {
  • Wait(0.100, Ignore Condition);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Event Player, 3);
  • Damage(Event Player, Players On Hero(Hero(Tracer), Team 1), 200);
  • Wait(0.500, Ignore Condition);
  • Event Player.Chain_Reaction_Immune = True;
  • Event Player.Chain_Reaction_On = False;
  • Wait(2, Ignore Condition);
  • Event Player.Chain_Reaction_Immune = False;
  • }
  • }
  • rule("Tracer: Chain Reaction 3")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Tracer;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent2);
  • Abort If(Event Ability != Button(Ultimate));
  • Abort If(Event Damage <= 20);
  • Victim.Chain_Reaction_On = True;
  • }
  • }
  • rule("Symmetra: Sentry Paragon")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Symmetra;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.500, Abort When False);
  • Start Damage Modification(All Players(Team 2), Event Player, 66.667, Receivers Damagers and Damage Percent);
  • Event Player.damage_mod[1] = Last Damage Modification ID;
  • Event Player.Damage_Dealt += 50;
  • Wait Until(!Event Player.Talent1 || Is Dead(Event Player), 99999);
  • Event Player.Damage_Dealt -= 50;
  • Stop Damage Modification(Event Player.damage_mod[1]);
  • Wait(0.100, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Symmetra: Shield Generator")
  • {
  • event
  • {
  • Player Dealt Final Blow;
  • Team 1;
  • Symmetra;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Event Player.Damage_Dealt += 30;
  • Event Player.Move_Speed += 30;
  • Add Health Pool To Player(All Players(Team 1), Shields, Min(200, Max Health(Event Player) * 0.250), False, False);
  • Event Player.HP_Pool[6] = Last Created Health Pool;
  • Create Effect(All Players(All Teams), Ana Nano Boosted Effect, Color(Team 1), Event Player, 1, Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Wait Until(!Event Player.Talent2 || Is Dead(Event Player), 10);
  • Destroy Effect(Event Player.Effects___[1]);
  • Remove Health Pool From Player(Event Player.HP_Pool[6]);
  • Event Player.Damage_Dealt -= 30;
  • Event Player.Move_Speed -= 30;
  • }
  • }
  • rule("Hanzo- Firebolt")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • For Player Variable(Event Player, i, 0, 1, 1);
  • Wait(1, Abort When False);
  • Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 100);
  • End;
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Sky Blue), Eye Position(Event Player) + Vector(0, -0.250, False)
  • + Facing Direction Of(Event Player), 1);
  • Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Team 1), Event Player, 100);
  • While(Is Firing Primary(Event Player));
  • Wait(0.100, Ignore Condition);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Eye Position(Event Player) + Vector(0, -0.250, False)
  • + Facing Direction Of(Event Player) * 0.700, 0.001);
  • End;
  • Abort If(Has Status(Event Player, Stunned) || Is Dead(Event Player) || Is Button Held(Event Player, Button(Secondary Fire))
  • || Has Status(Event Player, Asleep));
  • Event Player.Ability_Projectile1 = Eye Position(Event Player) + Facing Direction Of(Event Player) * Vector(False, False, 2);
  • Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 200, All Living Players(All Teams), Event Player, False);
  • Set Projectile Speed(Event Player, 150);
  • Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 165, Destination and Rate);
  • While(Event Player.Ability_Projectile1 != Event Player.Ability_End);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Event Player.Ability_Projectile1, 3.500);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(Team 1), Event Player.Ability_Projectile1, 35);
  • Wait(0.072, Ignore Condition);
  • End;
  • Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Event Player.Ability_Projectile1, 4);
  • Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Team 1), Event Player.Ability_Projectile1, 150);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 4, Team 2, Surfaces), Event Player, 175);
  • Set Projectile Speed(Event Player, 100);
  • Stop Chasing Player Variable(Event Player, Ability_Projectile1);
  • }
  • }
  • rule("Hanzo: Stormbreak")
  • {
  • event
  • {
  • Player Dealt Final Blow;
  • Team 1;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Event Player.Ability_Countdown = 4;
  • Chase Player Variable At Rate(Event Player, Ability_Countdown, 0, 1, Destination and Rate);
  • }
  • }
  • rule("Hanzo: Stormbreak - Boost")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Event Player.Ability_Countdown > False;
  • }
  • actions
  • {
  • Create Effect(All Players(All Teams), Winston Primal Rage Effect, Color(Team 1), Event Player, 1, Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Wait Until(Is Dead(Event Player) || !Event Player.Ability_Countdown || !Event Player.Talent2, 99999);
  • Event Player.Ability_Countdown = False;
  • Destroy Effect(Event Player.Effects___[1]);
  • Stop Chasing Player Variable(Event Player, Ability_Countdown);
  • }
  • }
  • rule("Hanzo: Stormbreak - Reset Cooldowns For Storm Arrows")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Hanzo;
  • }
  • conditions
  • {
  • Event Player.Ability_Countdown > False;
  • Ability Cooldown(Event Player, Button(Ability 2)) > False;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Button(Ability 2), False);
  • }
  • }
  • rule("Echo: Silver Lining")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Echo;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Firing Secondary(Event Player) == True;
  • Is Duplicating(Event Player) == False;
  • }
  • actions
  • {
  • For Player Variable(Event Player, i, 0, 3, 1);
  • Set Projectile Speed(Event Player, 100);
  • Wait(0.150, Ignore Condition);
  • End;
  • }
  • }
  • rule("Echo: Focusing Optics")
  • {
  • event
  • {
  • Player Dealt Damage;
  • Team 1;
  • Echo;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent2);
  • Abort If(Event Ability != Button(Ability 2));
  • Abort If(Is Duplicating(Event Player));
  • Abort If(Normalized Health(Victim) <= 0.500);
  • Abort If(Normalized Health(Victim) > 0.900);
  • Damage(Victim, Event Player, Event Damage * 3);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Violet), Victim, 0.500);
  • }
  • }
  • rule("[Lucio] Power Skating - Damage")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Lúcio;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Event Ability == Button(Secondary Fire);
  • }
  • actions
  • {
  • Damage(Victim, Event Player, Speed Of(Event Player) * 5);
  • Apply Impulse(Victim, Facing Direction Of(Event Player), Speed Of(Event Player) * 1.500, To World, Cancel Contrary Motion);
  • Apply Impulse(Victim, Up, 4, To World, Incorporate Contrary Motion);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Green), Victim, 0.010);
  • }
  • }
  • rule("Lucio: Healing Wave")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Lúcio;
  • }
  • conditions
  • {
  • Is Firing Secondary(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Good Explosion, Color(Green), Eye Position(Event Player) + Facing Direction Of(Event Player)
  • * 4, 4);
  • Heal(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 4, 4, Team 1, Surfaces), Event Player,
  • Max Health(Filtered Array(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 4, 4, Team 1,
  • Surfaces), Is Alive(Current Array Element))) * 0.300);
  • }
  • }
  • rule("Bastion: Treads")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Bastion;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is In Alternate Form(Event Player) == True;
  • Is Using Ultimate(Event Player) == False;
  • }
  • actions
  • {
  • Wait(1, Ignore Condition);
  • Event Player.Damage_Received -= 40;
  • Start Accelerating(Event Player, Throttle Of(Event Player), 100, 9 * (Throttle Of(Event Player) == True), To Player,
  • Direction Rate and Max Speed);
  • Wait Until(!Is In Alternate Form(Event Player) || Is Using Ultimate(Event Player) || !Event Player.Talent1, 99999);
  • Stop Accelerating(Event Player);
  • Event Player.Damage_Received += 40;
  • }
  • }
  • rule("Bastion: Bomblets")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Bastion;
  • }
  • conditions
  • {
  • Is Firing Primary(Event Player) == True;
  • Is In Alternate Form(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Wait(0.100, Ignore Condition);
  • Abort If Condition Is False;
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Ray Cast Hit Position(Eye Position(Event Player),
  • Eye Position(Event Player) + Facing Direction Of(Event Player) * 60, All Living Players(Team 2), All Players(Team 1), True),
  • 2);
  • Damage(Players Within Radius(Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 60, All Living Players(All Teams), Event Player, True), 1.300, Team 2, Surfaces), Event Player, 9);
  • Loop If Condition Is True;
  • }
  • }
  • rule("D.Va: Voltage Grid")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • D.Va;
  • }
  • conditions
  • {
  • Is Firing Secondary(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
  • * 2, 0.150);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
  • * 5, 0.150);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
  • * 8, 0.150);
  • Wait(0.300, Ignore Condition);
  • Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 2, 2.500, Team 2, Off), Event Player,
  • 20);
  • Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 5, 2.500, Team 2, Off), Event Player,
  • 20);
  • Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 8, 2.500, Team 2, Off), Event Player,
  • 20);
  • Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 2, 2.500, Team 2, Off),
  • Event Player, Rooted, 0.400);
  • Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 5, 2.500, Team 2, Off),
  • Event Player, Rooted, 0.400);
  • Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 8, 2.500, Team 2, Off),
  • Event Player, Rooted, 0.400);
  • Loop If Condition Is True;
  • }
  • }
  • rule("D.Va: Shooting Star")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • D.Va;
  • }
  • conditions
  • {
  • Event Ability == Button(Ability 1);
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Damage(Victim, Event Player, 30);
  • Set Status(Victim, Null, Burning, 3);
  • Start Damage Over Time(Victim, Event Player, 3, 35);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(Red), Victim, 1);
  • }
  • }
  • rule("Zarya- Combusta-bubble - Detect Barrier Target")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.025, Ignore Condition);
  • Event Player.Ability_End = First Of(Filtered Array(Players Within Radius(Event Player, 30, Team 1, Surfaces), Has Status(
  • Current Array Element, Invincible) && Is Alive(Current Array Element) && Is In View Angle(Event Player, Current Array Element,
  • 103)));
  • Wait Until(!Is Using Ability 2(Event Player), 2);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Event Player.Ability_End, 120);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Eye Position(Event Player.Ability_End), 6);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Yellow), Eye Position(Event Player.Ability_End), 6);
  • Damage(Players Within Radius(Eye Position(Event Player.Ability_End), 6, Team 2, Surfaces), Event Player.Ability_End, 100);
  • }
  • }
  • rule("Zarya- Combusta-Bubble - Self bubble")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.1, Abort When False);
  • Wait Until(!Is Using Ability 1(Event Player), 2);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Event Player, 120);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Eye Position(Event Player), 6);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Yellow), Eye Position(Event Player), 6);
  • Damage(Players Within Radius(Event Player, 6, Team 2, Surfaces), Event Player, 100);
  • }
  • }
  • rule("Zarya- Power Surge")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Zarya;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Abort If(!Has Status(Event Player, Invincible));
  • Damage(Event Player, Null, 10000);
  • Wait(0.1, Ignore Condition);
  • Set Ability Cooldown(Event Player, Button(Ability 1), False);
  • Press Button(Event Player, Button(Ability 1));
  • Wait(3, Ignore Condition);
  • }
  • }
  • rule("Pharah: Head Trauma")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Pharah;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Event Ability == Button(Ability 2);
  • Victim.iv_is_portal == False;
  • Victim != Event Player;
  • }
  • actions
  • {
  • Damage(Victim, Event Player, 60);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Gray), Victim, 1);
  • Abort If(Normalized Health(Victim) > 0.5);
  • Set Status(Victim, Null, Hacked, 1);
  • }
  • }
  • rule("[Pharah] Weaponized Storm")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Pharah;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Firing Primary(Event Player) == True;
  • Ammo(Event Player, False) % 6 == False;
  • }
  • actions
  • {
  • Set Projectile Speed(Event Player, 125);
  • Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
  • Event Player) * 100, All Living Players(All Teams), Event Player, True);
  • Event Player.Ability_Projectile1 = Eye Position(Event Player);
  • Create Effect(All Players(All Teams), Bad Aura, Color(Orange), Event Player.Ability_Projectile1, 1,
  • Visible To Position and Radius);
  • Event Player.Effects___[7] = Last Created Entity;
  • Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 35, Destination and Rate);
  • Wait Until(!Event Player.Talent2 || Event Player.Ability_Projectile1 == Event Player.Ability_End, 99999);
  • Destroy Effect(Event Player.Effects___[7]);
  • For Player Variable(Event Player, i, 0, 6, 1);
  • Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Event Player.Ability_Projectile1 + Vector(Random Real(-1.500,
  • 1.500), Random Real(-0.500, 0.500), Random Real(-1.500, 1.500)), 1);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(Team 1), Event Player.Ability_Projectile1, 25);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 4, Team 2, Surfaces), Event Player, 20);
  • Wait(0.100, Ignore Condition);
  • End;
  • Set Projectile Speed(Event Player, 100);
  • Stop Chasing Player Variable(Event Player, Ability_Projectile1);
  • }
  • }
  • rule("Junkrat: Pyromania")
  • {
  • event
  • {
  • Player Dealt Knockback;
  • Team 1;
  • Junkrat;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent1);
  • Abort If(Event Ability == Button(Melee));
  • Abort If(Victim == Event Player);
  • Start Damage Over Time(Victim, Event Player, 2, 20);
  • Set Status(Victim, Null, Burning, 2);
  • }
  • }
  • rule("Junkrat: Satchel Charge")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Junkrat;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Ability Charge(Event Player, Button(Ability 1)) < 5;
  • }
  • actions
  • {
  • Wait(4, Abort When False);
  • Set Ability Charge(Event Player, Button(Ability 1), Ability Charge(Event Player, Button(Ability 1)) + 1);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Roadhog: Stench")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Roadhog;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Create Effect(All Players(All Teams), Ring, Color(Violet), Event Player, 8, Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Wait Until(!Event Player.Talent1 || Is Dead(Event Player), 99999);
  • Destroy Effect(Event Player.Effects___[1]);
  • Wait(0.100, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Roadhog: Stench effect")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Roadhog;
  • }
  • conditions
  • {
  • Distance Between(Event Player, Closest Player To(Event Player, Team 2)) <= 8;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Damage(Players Within Radius(Event Player, 8, Team 2, Surfaces), Event Player, 9);
  • Wait(0.400, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Roadhog: Chainsnap")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Roadhog;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Start Damage Modification(Is Using Ability 1(Event Player) ? All Players(Team 2) : Empty Array, Event Player, 400,
  • Receivers Damagers and Damage Percent);
  • Event Player.damage_mod[1] = Last Damage Modification ID;
  • Wait Until(!Event Player.Talent2 || Is Dead(Event Player), 99999);
  • Stop Damage Modification(Event Player.damage_mod[1]);
  • Wait(0.100, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Roadhog: Chainsnap - Reset cooldown")
  • {
  • event
  • {
  • Player Earned Elimination;
  • Team 1;
  • Roadhog;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Wait Until(!Is Using Ability 1(Event Player), 3);
  • Set Ability Cooldown(Event Player, Button(Ability 1), False);
  • }
  • }
  • rule("Moira: Flourish")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Moira;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Start Damage Over Time(Players Within Radius(Event Player, 3, Team 2, Surfaces), Event Player, 2, 25);
  • Start Heal Over Time(Players Within Radius(Event Player, 3, Team 1, Surfaces), Event Player, 2, 40);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Black), Position Of(Event Player), 6);
  • Wait(0.200, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("[Moira] Mitosis - Fire more orbs (morbs?)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Moira;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 2(Event Player) == True;
  • (Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player, Button(Secondary Fire))) == True;
  • }
  • actions
  • {
  • Wait(0.05, Ignore Condition);
  • For Player Variable(Event Player, i, 0, 4, 1);
  • Cancel Primary Action(Event Player);
  • Set Ability Cooldown(Event Player, Button(Ability 2), 0);
  • Wait(0.016, Ignore Condition);
  • Press Button(Event Player, Button(Ability 2));
  • Wait(0.1, Ignore Condition);
  • Press Button(Event Player, Random Integer(0, 1) == 0 ? Button(Primary Fire) : Button(Secondary Fire));
  • Wait(0.032, Ignore Condition);
  • End;
  • Wait(3, Ignore Condition);
  • }
  • }
  • rule("Mei: Cold Snap")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Mei;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.500, Abort When False);
  • Wait Until(!Is Using Ability 1(Event Player), 99999);
  • Damage(Players Within Radius(Eye Position(Event Player), 10, Team 2, Surfaces), Event Player, 35);
  • Set Status(Players Within Radius(Eye Position(Event Player), 10, Team 2, Surfaces), Event Player, Frozen, 2);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Sky Blue), Position Of(Event Player), 20);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Position Of(Event Player) + Vector(0, 1, False), 20);
  • }
  • }
  • rule("[Mei] Polar Vortex")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ultimate(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.Damage_Dealt += 75;
  • For Player Variable(Event Player, i, 0, 3, 1);
  • Wait(0.016, Ignore Condition);
  • Set Ultimate Charge(Event Player, 100);
  • Press Button(Event Player, Button(Ultimate));
  • Wait(0.510, Ignore Condition);
  • End;
  • Event Player.Damage_Dealt -= 75;
  • Set Ultimate Charge(Event Player, 0);
  • Wait(1, Ignore Condition);
  • }
  • }
  • rule("Winston: Next Generation")
  • {
  • event
  • {
  • Player Earned Elimination;
  • Team 1;
  • Winston;
  • }
  • conditions
  • {
  • Ultimate Charge Percent(Event Player) <= 80;
  • Is Using Ultimate(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 10);
  • }
  • }
  • rule("[Winston] Quake")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Winston;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.250, Ignore Condition);
  • Wait Until(Is On Ground(Event Player), 99999);
  • Abort If(Is Dead(Event Player));
  • Damage(Players Within Radius(Event Player, 7.500, Team 2, Surfaces And All Barriers), Event Player, 30);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(White), Position Of(Event Player), 15);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Gray), Position Of(Event Player), 14);
  • Set Status(Players Within Radius(Event Player, 7.500, Team 2, Surfaces And All Barriers), Event Player, Stunned, 1);
  • }
  • }
  • rule("Reaper: Wraith Wrath")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Reaper;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Wait(0.100, Abort When False);
  • Cancel Primary Action(Event Player);
  • Create Effect(All Players(All Teams), Reaper Wraith Form Effect, Color(Team 1), Event Player, True,
  • Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Event Player.Damage_Dealt += 30;
  • Event Player.Move_Speed += 50;
  • Disallow Button(Event Player, Button(Ability 1));
  • Set Status(Event Player, Null, Phased Out, 3);
  • Wait Until(Is Dead(Event Player) || !Event Player.Talent1, 3);
  • Allow Button(Event Player, Button(Ability 1));
  • Set Ability Cooldown(Event Player, Button(Ability 1), 8);
  • Event Player.Damage_Dealt -= 30;
  • Event Player.Move_Speed -= 50;
  • Destroy Effect(Event Player.Effects___[1]);
  • }
  • }
  • rule("Reaper: Loom")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Reaper;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Set Status(Filtered Array(Players in View Angle(Event Player, Team 2, 45), Is In Line of Sight(Event Player, Current Array Element,
  • Barriers Do Not Block LOS)), Event Player, Hacked, 2);
  • Damage(Filtered Array(Players in View Angle(Event Player, Team 2, 45), Is In Line of Sight(Current Array Element, Event Player,
  • Barriers Do Not Block LOS)), Event Player, 35);
  • }
  • }
  • rule("Soldier76: Triple Threat")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • Is Firing Secondary(Event Player) == True;
  • }
  • actions
  • {
  • Event Player.Ability_Countdown = Ray Cast Hit Position(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(
  • Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 60, All Living Players(Team 2), Null, False)
  • + World Vector Of(Vector(-2, False, False), Event Player, Rotation), All Living Players(Team 2), Null, False);
  • Event Player.Ability_Projectile1 = Ray Cast Hit Position(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(
  • Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 60, All Living Players(Team 2), Null, False)
  • + World Vector Of(Vector(2, False, False), Event Player, Rotation), All Living Players(Team 2), Null, False);
  • Event Player.Ability_Available = Eye Position(Event Player) + World Vector Of(Vector(False,
  • -0.250, False), Event Player, Rotation);
  • Event Player.Ability_End = Eye Position(Event Player) + World Vector Of(Vector(False, -0.250,
  • False), Event Player, Rotation);
  • Chase Player Variable At Rate(Event Player, Ability_Available, Event Player.Ability_Projectile1, 60, Destination and Rate);
  • Chase Player Variable At Rate(Event Player, Ability_End, Event Player.Ability_Countdown, 60, Destination and Rate);
  • }
  • }
  • rule("Soldier76: Triple Threat - First Rocket")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.Ability_Projectile1 != Event Player.Ability_Available;
  • Event Player.Talent1 == True;
  • Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Event Player.Ability_Available, 0.400);
  • Wait(0.064, Ignore Condition);
  • Loop If Condition Is True;
  • Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.Ability_Available, 2.500);
  • Stop Chasing Player Variable(Event Player, Ability_Available);
  • Wait(0.016, Ignore Condition);
  • Damage(Players Within Radius(Event Player.Ability_Available, 2.500, Team 2, Surfaces), Event Player, 80);
  • Stop Chasing Player Variable(Event Player, Ability_Available);
  • Event Player.Ability_Available = False;
  • Event Player.Ability_Projectile1 = False;
  • Wait(0.016, Ignore Condition);
  • }
  • }
  • rule("Soldier76: Triple Threat - Second Rocket")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.Ability_Countdown != Event Player.Ability_End;
  • Event Player.Talent1 == True;
  • Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Good Explosion, Color(Aqua), Event Player.Ability_End, 0.400);
  • Wait(0.064, Ignore Condition);
  • Loop If Condition Is True;
  • Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.Ability_End, 2.500);
  • Stop Chasing Player Variable(Event Player, Ability_End);
  • Damage(Players Within Radius(Event Player.Ability_End, 2.500, Team 2, Surfaces), Event Player, 80);
  • Event Player.Ability_End = False;
  • Event Player.Ability_Countdown = False;
  • }
  • }
  • rule("Soldier76: Triple Threat - Init rocket")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Soldier: 76;
  • }
  • conditions
  • {
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Event Player.Ability_Projectile1 = Event Player.Ability_Available;
  • Event Player.Ability_Countdown = Event Player.Ability_End;
  • }
  • }
  • rule("Soldier76: Espionage")
  • {
  • event
  • {
  • Player Dealt Healing;
  • Team 1;
  • Soldier: 76;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent2);
  • Abort If(Event Ability != Button(Ability 2));
  • If(!Healee.soldier_espionage);
  • Healee.soldier_espionage = True;
  • End;
  • }
  • }
  • rule("Soldier76: Espionage - Allies effect")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • All;
  • }
  • conditions
  • {
  • Event Player.soldier_espionage == True;
  • }
  • actions
  • {
  • Event Player.soldier_espionage = False;
  • If(Event Player.downed_start_t && Count Of(Event Player.revivers) > False);
  • Event Player.revive_timer += 20;
  • End;
  • Event Player.active_ab_is_smoked = True;
  • Wait(0.4, Ignore Condition);
  • }
  • }
  • rule("Baptiste: Corrode")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Baptiste;
  • }
  • conditions
  • {
  • Is Using Ability 1(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • For Player Variable(Event Player, i, 0, 3, 1);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Position Of(Event Player), 20);
  • Damage(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 25);
  • Start Damage Over Time(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 5, 30);
  • Wait(0.200, Ignore Condition);
  • End;
  • Players Within Radius(Event Player, 10, Team 1, Surfaces).last_damage_taken_t = False;
  • }
  • }
  • rule("Baptiste: Bullettime")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Baptiste;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ultimate(Event Player) == True;
  • Is Firing Primary(Event Player) == True;
  • }
  • actions
  • {
  • While(Is Using Ultimate(Event Player) && Is Button Held(Event Player, Button(Primary Fire)));
  • Set Projectile Speed(Event Player, 100);
  • Wait(0.100, Ignore Condition);
  • End;
  • }
  • }
  • rule("[Sombra] VPN")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Sombra;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 1(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.25, Abort When False);
  • Set Status(Event Player, Event Player, Invincible, 3);
  • Wait(0.55, Ignore Condition);
  • Clear Status(Event Player, Invincible);
  • Abort If Condition Is False;
  • Wait Until(!Is Using Ability 1(Event Player) || Is Button Held(Event Player, Button(Primary Fire)) || Is Button Held(Event Player,
  • Button(Ability 1)) || Is Button Held(Event Player, Button(Secondary Fire)) || Is Button Held(Event Player, Button(Ultimate))
  • || Is Button Held(Event Player, Button(Melee)), 99999);
  • Cancel Primary Action(Event Player);
  • Set Status(Event Player, Event Player, Invincible, 3);
  • Event Player.Damage_Dealt += 15;
  • Event Player.last_damage_taken_t = False;
  • Wait(3, Ignore Condition);
  • Event Player.Damage_Dealt -= 15;
  • }
  • }
  • rule("Doomfist: Phase Shifter")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Doomfist;
  • }
  • conditions
  • {
  • (Is Firing Secondary(Event Player) || Is Using Ability 1(Event Player) || Is Using Ability 2(Event Player)) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Set Status(Event Player, Null, Invincible, 0.700);
  • Wait(0.700, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Doomfist: Fissure")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Doomfist;
  • }
  • conditions
  • {
  • Is Using Ultimate(Event Player) == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Wait Until(!Is Using Ultimate(Event Player), 99999);
  • Event Player.Ability_Projectile1 = Position Of(Event Player);
  • Event Player.Ability_Active = True;
  • Wait Until(Is Dead(Event Player), 8);
  • Event Player.Ability_Active = False;
  • }
  • }
  • rule("Doomfist: Fissure")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Doomfist;
  • }
  • conditions
  • {
  • Event Player.Ability_Active == True;
  • Event Player.Talent2 == True;
  • }
  • actions
  • {
  • Create Effect(All Players(All Teams), Ring, Color(Orange), Event Player.Ability_Projectile1, 8, Visible To Position and Radius);
  • Event Player.Effects___[1] = Last Created Entity;
  • Create Effect(All Players(All Teams), Cloud, Color(Orange), Event Player.Ability_Projectile1, 8, Visible To Position and Radius);
  • Event Player.Effects___[2] = Last Created Entity;
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Event Player.Ability_Projectile1, 16);
  • While(Event Player.Ability_Active && Event Player.Talent2);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 8, Team 2, Off), Event Player, 34);
  • Wait(0.235, Ignore Condition);
  • End;
  • Destroy Effect(Event Player.Effects___[1]);
  • Destroy Effect(Event Player.Effects___[2]);
  • }
  • }
  • rule("Cassidy: Standoff")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Cassidy;
  • }
  • conditions
  • {
  • Is Using Ultimate(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Wait(0.200, Ignore Condition);
  • Event Player.Ability_Countdown = False;
  • Chase Player Variable At Rate(Event Player, Ability_Countdown, 9999, 100, Destination and Rate);
  • Wait(0.500, Ignore Condition);
  • Chase Player Variable At Rate(Event Player, Ability_Countdown, 9999, 275, Destination and Rate);
  • Wait(0.500, Ignore Condition);
  • Chase Player Variable At Rate(Event Player, Ability_Countdown, 9999, 550, Destination and Rate);
  • }
  • }
  • rule("Cassidy: Standoff - Set root")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Cassidy;
  • }
  • conditions
  • {
  • Is Using Ultimate(Event Player) == True;
  • Event Player.Talent1 == True;
  • }
  • actions
  • {
  • Wait(0.200, Ignore Condition);
  • For Player Variable(Event Player, i, 0, 5, 1);
  • Wait(1, Abort When False);
  • Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 15);
  • Set Status(Filtered Array(Players in View Angle(Event Player, Team 2, 103), Health(Current Array Element)
  • <= Event Player.Ability_Countdown && Is In Line of Sight(Event Player, Current Array Element, Barriers Do Not Block LOS)),
  • Event Player, Rooted, 2);
  • End;
  • Stop Chasing Player Variable(Event Player, Ability_Countdown);
  • }
  • }
  • rule("Cassidy: Flashpoint")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Cassidy;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • Wait(0.350, Ignore Condition);
  • Event Player.Ability_Projectile1 = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * 7, All Living Players(All Teams), Event Player, False);
  • Wait(0.200, Ignore Condition);
  • Damage(Players Within Radius(Event Player.Ability_Projectile1, 9, Team 2, Surfaces), Event Player, 35);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Yellow), Event Player.Ability_Projectile1 + World Vector Of(Vector(2.500,
  • False, -2.500), Event Player, Rotation), 3.500);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Yellow), Event Player.Ability_Projectile1 + World Vector Of(Vector(False,
  • False, 2.500), Event Player, Rotation), 3.500);
  • Play Effect(All Players(All Teams), Good Explosion, Color(Yellow), Event Player.Ability_Projectile1 + World Vector Of(Vector(
  • -2.500, False, -2.500), Event Player, Rotation), 3.500);
  • Set Status(Players Within Radius(Event Player.Ability_Projectile1, 9, Team 2, Surfaces), Event Player, Stunned, 1);
  • }
  • }
  • rule("Wrecking Ball: Mirror Ball")
  • {
  • event
  • {
  • Player Took Damage;
  • Team 1;
  • Wrecking Ball;
  • }
  • actions
  • {
  • Abort If(!Event Player.Talent1);
  • Damage(Players Within Radius(Event Player, 4, Team 2, Surfaces), Event Player, Event Damage * 0.600);
  • }
  • }
  • rule("Wrecking Ball: Distort")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • Team 1;
  • Wrecking Ball;
  • }
  • conditions
  • {
  • Event Player.Talent2 == True;
  • Is Using Ability 2(Event Player) == True;
  • }
  • actions
  • {
  • For Player Variable(Event Player, i, False, 4, 1);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Position Of(Event Player), 20);
  • Damage(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, 25);
  • Set Status(Players Within Radius(Event Player, 10, Team 2, Surfaces), Event Player, Hacked, 2);
  • Wait(0.100, Ignore Condition);
  • End;
  • }
  • }
Join the Workshop.codes Discord