Create
Return to post

Comparing difference between and

View raw
  • settings
  • {
  • main
  • {
  • Description: "Mei rework using HOTS abilities, and more. Made by Mitsiee. More info at workshop.codes/mei-hots."
  • }
  • modes
  • {
  • Assault
  • {
  • enabled maps
  • {
  • }
  • }
  • Control
  • {
  • enabled maps
  • {
  • }
  • }
  • Deathmatch
  • {
  • enabled maps
  • {
  • }
  • }
  • Escort
  • {
  • enabled maps
  • {
  • }
  • }
  • Hybrid
  • {
  • enabled maps
  • {
  • }
  • }
  • Skirmish
  • {
  • enabled maps
  • {
  • }
  • }
  • Team Deathmatch
  • {
  • enabled maps
  • {
  • Workshop Chamber
  • }
  • }
  • General
  • {
  • Limit Roles: 2 Of Each Role Per Team
  • Respawn Time Scalar: 20%
  • }
  • }
  • heroes
  • {
  • General
  • {
  • Mei
  • {
  • Ammunition Clip Size Scalar: 117%
  • Ultimate Generation - Combat Blizzard: 500%
  • Ultimate Generation - Passive Blizzard: 300%
  • Ultimate Generation Blizzard: 300%
  • Weapon Freeze Duration Scalar: 115%
  • }
  • enabled heroes
  • {
  • Mei
  • }
  • }
  • }
  • workshop
  • {
  • Icing Cooldown: 3.000
  • Icing Duration: 2.000
  • Icing Cooldown: 6.000
  • Icing Duration: 5.000
  • What button should Icing overwrite?: [1]
  • }
  • }
  • variables
  • {
  • global:
  • 0: AvalancheRadius
  • 1: AvalancheDuration
  • 2: IcingMaxRange
  • 3: IcingSteps
  • 4: IcingRadius
  • 5: IcingDuration
  • 7: IsMeiTank
  • 8: IcingCooldown
  • 9: AvalancheMaxSpeed
  • 11: BlizzardFlySpeed
  • 12: BlizzardGravityStrength
  • 13: BlizzardCooldown
  • 14: BlizzardOverrideCryofreeze
  • 15: BlizzardEnabled
  • 16: BlizzardDamagePerSecond
  • 17: BlizzardRadius
  • 18: BlizzardMovementSlow
  • 19: BlizzardDuration
  • 20: MeiTankHealth
  • 21: SnowballFlySpeed
  • 22: SnowballGravityStrength
  • 24: SnowballDamage
  • 25: MaxIceArmor
  • 26: OverchargeRate
  • 27: IsWeaponOvercharge
  • 28: OverchargeDelay
  • 29: DoesOverchargeUseAmmo
  • 30: OverchargeMaxAmmo
  • 31: DischargeRate
  • 32: IsBlizzardAroundPlayer
  • 33: IcingOverwritesButton
  • 34: OverwriteButtonArray
  • 35: IcingMinSpeed
  • 36: IcingMaxSpeed
  • 37: AvalancheEnabled
  • 38: AvalancheDamagePerTick
  • 39: AvalancheDamageExplosion
  • 40: BlizzardOverwritesButton
  • 41: IcingDamageOnImpact
  • 43: IcingSlow
  • 44: IcingFreezeOnImpact
  • 45: IcingSpeedIncrease
  • 46: IcingType
  • player:
  • 0: IsUsingAvalanche
  • 1: AvalancheEffects
  • 2: AvalancheLoop
  • 3: AvalancheSpeed
  • 4: AvalancheCurrentRadius
  • 5: AvalancheFacingDirection
  • 6: AvalancheFinalPosition
  • 8: PlayersInAvalanche
  • 9: IcingEffects
  • 10: IcingCreateStep
  • 11: IcingEndPosition
  • 12: IcingStartPosition
  • 13: IcingStepPositions
  • 14: IcingCurrentSpeed
  • 15: IcingSnowballEffect
  • 16: BlizzardRaycastFire
  • 17: BlizzardShootLoop
  • 18: BlizzardCurrentCheckPosition
  • 19: BlizzardBallsFlying
  • 20: BlizzardActive
  • 21: BlizzardRaycastDistance
  • 22: BlizzardPreviousPosition
  • 23: EnemiesInBlizzard
  • 24: BlizzardFacingDirection
  • 25: BlizzardEyeLocationWhenFired
  • 26: BlizzardFinalPosition
  • 27: BlizzardIceArmor
  • 28: SnowballRaycastFire
  • 29: SnowballShootLoop
  • 30: SnowballCurrentCheckPosition
  • 31: SnowballBallsFlying
  • 32: SnowballActive
  • 33: SnowballRaycastDistance
  • 34: SnowballPreviousPosition
  • 35: SnowballFacingDirection
  • 36: SnowballEyeLocationWhenFired
  • 37: SnowballFinalPosition
  • 38: CurrentWeaponCharge
  • 39: WeaponIsOverheated
  • 40: AvalancheTimer
  • 41: IcingActiveCooldown
  • 42: BlizzardActiveCooldown
  • 43: IcingPlayersDamaged
  • 44: IcingPlayersToDamage
  • 45: InIcingOfPlayer
  • }
  • subroutines
  • {
  • 0: SetAvalancheCamera
  • 1: ChaseAvalancheSpeed
  • 2: ChaseAvalancheRadius
  • 3: ClearAvalanche
  • 4: ExplodeAvalanche
  • 5: ExplodePlayersInAvalanche
  • 6: ClearIcing
  • 7: ChaseIcingSpeed
  • 8: IcingFreezeAndDamageOnImpact
  • }
  • rule("Spawn bots - For debugging")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Is Button Held(Event Player, Button(Crouch)) == True;
  • Is Button Held(Event Player, Button(Interact)) == True;
  • }
  • actions
  • {
  • Create Dummy Bot(Hero(Mei), Opposite Team Of(Team Of(Event Player)), -1, Event Player + Facing Direction Of(Event Player) * 0.500,
  • Create Dummy Bot(Hero(Mei), Team Of(Event Player), -1, Event Player + Facing Direction Of(Event Player) * 0.500,
  • Facing Direction Of(Event Player));
  • Wait(1, Ignore Condition);
  • Press Button(Filtered Array(All Players(All Teams), Current Array Element != Event Player), Button(Interact));
  • }
  • }
  • rule("Mei bot using icing")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • conditions
  • {
  • Is Dummy Bot(Event Player) == True;
  • }
  • actions
  • {
  • Wait(3, Ignore Condition);
  • Set Ultimate Charge(Event Player, 100);
  • Wait(1, Ignore Condition);
  • Start Holding Button(Event Player, Button(Ultimate));
  • Start Holding Button(Event Player, Button(Primary Fire));
  • Wait(0.250, Ignore Condition);
  • Stop Holding Button(Event Player, Button(Ultimate));
  • Stop Holding Button(Event Player, Button(Primary Fire));
  • Loop;
  • }
  • }
  • rule("HUD")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Create HUD Text(All Players(All Teams), Null, Custom String("Press [Crouch] + [Interact] to Spawn a random bot"), Null, Right, 0,
  • Color(White), Color(Aqua), Color(White), Visible To and String, Default Visibility);
  • }
  • }
  • rule("Initial")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.OverwriteButtonArray = Array(Null, Button(Primary Fire), Button(Secondary Fire), Button(Ability 1), Button(Ability 2));
  • }
  • }
  • disabled rule("--- Avalanche")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise Avalanche")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.AvalancheEnabled = Workshop Setting Toggle(Custom String("Avalanche ability (Ultimate)"), Custom String(
  • "Enable Avalanche instead of regular Ultimate"), True, 0);
  • Global.AvalancheRadius = Workshop Setting Real(Custom String("Avalanche ability (Ultimate)"), Custom String("Avalanche Radius"), 2,
  • 1, 3, 1);
  • Global.AvalancheDuration = Workshop Setting Real(Custom String("Avalanche ability (Ultimate)"), Custom String(
  • "Avalanche Duration"), 3, 1, 5, 2);
  • Global.AvalancheMaxSpeed = Workshop Setting Integer(Custom String("Avalanche ability (Ultimate)"), Custom String(
  • "Avalanche max speed"), 200, 100, 400, 3);
  • Global.AvalancheDamagePerTick = Workshop Setting Real(Custom String("Avalanche ability (Ultimate)"), Custom String(
  • "Damage per tick while players are attached"), 1.500, 0, 10, 4);
  • Global.AvalancheDamageExplosion = Workshop Setting Real(Custom String("Avalanche ability (Ultimate)"), Custom String(
  • "Damage on explode"), 50, 0, 500, 5);
  • }
  • }
  • rule("Avalanche Progress Bar HUD element")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • conditions
  • {
  • Global.AvalancheEnabled == True;
  • }
  • actions
  • {
  • Create Progress Bar HUD Text(Filtered Array(Event Player, Event Player.IsUsingAvalanche),
  • 100 / Global.AvalancheDuration * Event Player.AvalancheTimer, Custom String(""), Top, 10, Color(Aqua), Color(Aqua),
  • Visible To Values and Color, Default Visibility);
  • "New lines to push the progress bar down"
  • Create HUD Text(Filtered Array(Event Player, Event Player.IsUsingAvalanche), Null, Custom String(
  • " \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"),
  • Null, Top, 9, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
  • }
  • }
  • rule("Disable original Ultimate")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • conditions
  • {
  • Global.AvalancheEnabled == True;
  • }
  • actions
  • {
  • Disallow Button(Event Player, Button(Ultimate));
  • }
  • }
  • rule("Player presses Ultimate")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • conditions
  • {
  • Global.AvalancheEnabled == True;
  • Ultimate Charge Percent(Event Player) == 100;
  • Is Button Held(Event Player, Button(Ultimate)) == True;
  • Is Using Ability 1(Event Player) != True;
  • Event Player.IsUsingAvalanche != True;
  • }
  • actions
  • {
  • Event Player.IsUsingAvalanche = True;
  • "Set timer and chase it down"
  • Event Player.AvalancheTimer = Global.AvalancheDuration;
  • Chase Player Variable Over Time(Event Player, AvalancheTimer, 0, Global.AvalancheDuration, Destination and Duration);
  • "Communicate, for fun"
  • Communicate(Event Player, Incoming);
  • Wait(Global.AvalancheDuration + 0.500, Ignore Condition);
  • Set Ultimate Charge(Event Player, 0);
  • }
  • }
  • rule("Player is using Avalanche")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.IsUsingAvalanche == True;
  • }
  • actions
  • {
  • "Set initial facing direction"
  • Event Player.AvalancheFacingDirection = Facing Direction Of(Event Player);
  • Event Player.PlayersInAvalanche = Empty Array;
  • "Set player to \"Phased Out\" so they don't collide with others and can't be hit, as well as clearing all debuffs"
  • Set Status(Event Player, Null, Phased Out, Global.AvalancheDuration);
  • "Call relevant rules"
  • Start Rule(ChaseAvalancheSpeed, Do Nothing);
  • Start Rule(ChaseAvalancheRadius, Do Nothing);
  • Call Subroutine(SetAvalancheCamera);
  • "Start forcing the player forwards"
  • Start Forcing Throttle(Event Player, 1, 1, 0, 0, 0, 0);
  • "Create a bunch of effects that make up the ability"
  • Event Player.AvalancheEffects = Empty Array;
  • "Spheres"
  • Create Effect(All Players(All Teams), Sphere, Color(White), Event Player, Event Player.AvalancheCurrentRadius,
  • Visible To Position and Radius);
  • Event Player.AvalancheEffects = Append To Array(Event Player.AvalancheEffects, Last Created Entity);
  • Create Effect(All Players(All Teams), Sphere, Team Of(Event Player), Event Player, Event Player.AvalancheCurrentRadius,
  • Visible To Position and Radius);
  • Event Player.AvalancheEffects = Append To Array(Event Player.AvalancheEffects, Last Created Entity);
  • "Sparkles"
  • Create Effect(All Players(All Teams), Sparkles, Color(White), Update Every Frame(Position Of(Event Player)),
  • Event Player.AvalancheCurrentRadius * 2, Visible To Position and Radius);
  • Event Player.AvalancheEffects = Append To Array(Event Player.AvalancheEffects, Last Created Entity);
  • Create Effect(All Players(All Teams), Sparkles, Team Of(Event Player), Update Every Frame(Position Of(Event Player)),
  • Event Player.AvalancheCurrentRadius * 2, Visible To Position and Radius);
  • Event Player.AvalancheEffects = Append To Array(Event Player.AvalancheEffects, Last Created Entity);
  • "Clouds"
  • Create Effect(All Players(All Teams), Cloud, Color(White), Update Every Frame(Position Of(Event Player)),
  • Event Player.AvalancheCurrentRadius * 2, Visible To Position and Radius);
  • Event Player.AvalancheEffects = Append To Array(Event Player.AvalancheEffects, Last Created Entity);
  • Create Effect(All Players(All Teams), Cloud, Team Of(Event Player), Update Every Frame(Position Of(Event Player)),
  • Event Player.AvalancheCurrentRadius * 2, Visible To Position and Radius);
  • Event Player.AvalancheEffects = Append To Array(Event Player.AvalancheEffects, Last Created Entity);
  • "Wait before clearing avalanche"
  • Wait(Global.AvalancheDuration, Abort When False);
  • Call Subroutine(ClearAvalanche);
  • }
  • }
  • rule("Subroutine - Set Avalanche camera")
  • {
  • event
  • {
  • Subroutine;
  • SetAvalancheCamera;
  • }
  • actions
  • {
  • "Force the player to third person"
  • Start Camera(Event Player, Ray Cast Hit Position(Eye Position(Event Player) + Up * 0.500, Eye Position(Event Player)
  • + Up * 0.500 + Event Player.AvalancheFacingDirection * -5, All Players(All Teams), Event Player, True), Ray Cast Hit Position(
  • Eye Position(Event Player), Eye Position(Event Player) + Event Player.AvalancheFacingDirection * 20, Null, Event Player,
  • False), 60);
  • }
  • }
  • rule("Subroutine - Chase Avalanche Speed")
  • {
  • event
  • {
  • Subroutine;
  • ChaseAvalancheSpeed;
  • }
  • actions
  • {
  • "Gradually increase the player speed"
  • For Player Variable(Event Player, AvalancheSpeed, 100, Global.AvalancheMaxSpeed, (Global.AvalancheMaxSpeed - 100) / 60);
  • Set Move Speed(Event Player, Event Player.AvalancheSpeed);
  • Wait(0.016, Ignore Condition);
  • End;
  • }
  • }
  • rule("Subroutine - Chase Avalanche Radius")
  • {
  • event
  • {
  • Subroutine;
  • ChaseAvalancheRadius;
  • }
  • actions
  • {
  • Event Player.AvalancheCurrentRadius = 0.750;
  • "Gradually increase the size of the snowball"
  • Chase Player Variable Over Time(Event Player, AvalancheCurrentRadius, Global.AvalancheRadius, Global.AvalancheDuration / 2,
  • Destination and Duration);
  • }
  • }
  • rule("Subroutine - Clear Avalanche")
  • {
  • event
  • {
  • Subroutine;
  • ClearAvalanche;
  • }
  • actions
  • {
  • "Root the player while the effect is clearing"
  • Set Status(Event Player, Null, Rooted, 1);
  • Chase Player Variable Over Time(Event Player, AvalancheCurrentRadius, 0, 0.750, Destination and Duration);
  • Event Player.AvalancheSpeed = 500;
  • Event Player.IsUsingAvalanche = False;
  • Event Player.AvalancheFinalPosition = Position Of(Event Player);
  • Stop Forcing Throttle(Event Player);
  • Set Move Speed(Event Player, 100);
  • Call Subroutine(ExplodeAvalanche);
  • "Destroy Effects"
  • For Player Variable(Event Player, AvalancheLoop, 0, Count Of(Event Player.AvalancheEffects), 1);
  • Destroy Effect(Event Player.AvalancheEffects[Event Player.AvalancheLoop]);
  • End;
  • "Clear statuses"
  • Clear Status(Event Player, Invincible);
  • Clear Status(Event Player, Rooted);
  • Clear Status(Event Player, Phased Out);
  • "Reset camera to normal"
  • Stop Camera(Event Player);
  • }
  • }
  • rule("Subroutine - Explode Avalanche")
  • {
  • event
  • {
  • Subroutine;
  • ExplodeAvalanche;
  • }
  • actions
  • {
  • Start Rule(ExplodePlayersInAvalanche, Do Nothing);
  • "Play a bunch of effects when the ability has come to a stop"
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 100);
  • Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player.AvalancheFinalPosition + Up,
  • Global.AvalancheRadius * 2);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(White), Event Player.AvalancheFinalPosition, Global.AvalancheRadius * 4);
  • Wait(0.050, Ignore Condition);
  • Play Effect(All Players(All Teams), Good Explosion, Team Of(Event Player), Event Player.AvalancheFinalPosition + Up,
  • Global.AvalancheRadius * 2);
  • Play Effect(All Players(All Teams), Ring Explosion, Team Of(Event Player), Event Player.AvalancheFinalPosition,
  • Global.AvalancheRadius * 4);
  • Wait(0.150, Ignore Condition);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(White), Event Player.AvalancheFinalPosition, Global.AvalancheRadius * 4);
  • Wait(0.050, Ignore Condition);
  • Play Effect(All Players(All Teams), Ring Explosion, Team Of(Event Player), Event Player.AvalancheFinalPosition,
  • Global.AvalancheRadius * 4);
  • Wait(0.150, Ignore Condition);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(White), Event Player.AvalancheFinalPosition, Global.AvalancheRadius * 4);
  • Wait(0.050, Ignore Condition);
  • Play Effect(All Players(All Teams), Ring Explosion, Team Of(Event Player), Event Player.AvalancheFinalPosition,
  • Global.AvalancheRadius * 4);
  • Wait(0.250, Ignore Condition);
  • }
  • }
  • rule("Subroutine - Explode Players in Avalanche")
  • {
  • event
  • {
  • Subroutine;
  • ExplodePlayersInAvalanche;
  • }
  • actions
  • {
  • Wait(0.250, Ignore Condition);
  • "Play explosion sound at position of player"
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 100);
  • "Communicate, for fun"
  • Communicate(Event Player, Sorry);
  • "Detach players"
  • While(Count Of(Event Player.PlayersInAvalanche) > 0);
  • "Detach victom from snowball"
  • Detach Players(First Of(Event Player.PlayersInAvalanche));
  • "Teleport the player just in case they ended up in a wall"
  • Teleport(First Of(Event Player.PlayersInAvalanche), Nearest Walkable Position(Position Of(First Of(
  • Event Player.PlayersInAvalanche))));
  • Wait(0.016, Ignore Condition);
  • "Damage affected players"
  • Damage(First Of(Event Player.PlayersInAvalanche), Event Player, Global.AvalancheDamageExplosion);
  • "Throw players in avalanche away from Mei"
  • Apply Impulse(First Of(Event Player.PlayersInAvalanche), Up, 5, To World, Cancel Contrary Motion);
  • Apply Impulse(First Of(Event Player.PlayersInAvalanche), Direction Towards(Position Of(Event Player), Position Of(First Of(
  • Event Player.PlayersInAvalanche))), 15, To World, Incorporate Contrary Motion);
  • "Clear frozen status"
  • Clear Status(First Of(Event Player.PlayersInAvalanche), Frozen);
  • Wait(0.016, Ignore Condition);
  • "Knock players down while in the air"
  • Set Status(First Of(Event Player.PlayersInAvalanche), Event Player, Knocked Down, 2);
  • Event Player.PlayersInAvalanche = Remove From Array(Event Player.PlayersInAvalanche, First Of(Event Player.PlayersInAvalanche));
  • End;
  • "Clear array, just in case"
  • Event Player.PlayersInAvalanche = Empty Array;
  • }
  • }
  • rule("Avalanche is active, set facing direction")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.IsUsingAvalanche == True;
  • }
  • actions
  • {
  • "Force facing direction of Mei in direction Avalanche was used"
  • Set Facing(Event Player, Event Player.AvalancheFacingDirection, To World);
  • Wait(0.016, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Avalanche is active, play sound")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.IsUsingAvalanche == True;
  • }
  • actions
  • {
  • "Play a constant sound while snowball is rolling"
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 50);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(White), Position Of(Event Player),
  • Event Player.AvalancheCurrentRadius * 2);
  • Wait(0.096, Abort When False);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Avalanche hit a wall")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.IsUsingAvalanche == True;
  • Speed Of(Event Player) < 5 * (Event Player.AvalancheSpeed / 100);
  • }
  • actions
  • {
  • Wait(0.100, Abort When False);
  • Call Subroutine(ClearAvalanche);
  • Set Facing(Event Player, Event Player.AvalancheFacingDirection * -1, To World);
  • }
  • }
  • rule("Enemy is inside Avalanche")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • "If any player is using avalanche"
  • Count Of(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Current Array Element.IsUsingAvalanche == True)) > 0;
  • "If event player is near anyone using avalanche"
  • Is True For Any(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Current Array Element.IsUsingAvalanche),
  • Distance Between(Position Of(Event Player), Position Of(Current Array Element))
  • < Current Array Element.AvalancheCurrentRadius * 1.250) == True;
  • }
  • actions
  • {
  • Closest Player To(Position Of(Event Player), Opposite Team Of(Team Of(Event Player))).PlayersInAvalanche = Append To Array(
  • Closest Player To(Position Of(Event Player), Opposite Team Of(Team Of(Event Player))).PlayersInAvalanche, Event Player);
  • Attach Players(Event Player, Closest Player To(Position Of(Event Player), Opposite Team Of(Team Of(Event Player))),
  • Local Vector Of(Position Of(Event Player), Closest Player To(Position Of(Event Player), Opposite Team Of(Team Of(
  • Event Player))), Rotation And Translation));
  • Set Status(Event Player, Null, Frozen, 5);
  • }
  • }
  • rule("Damage players inside of Avalanche")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.IsUsingAvalanche == True;
  • }
  • actions
  • {
  • Damage(Event Player.PlayersInAvalanche, Event Player, Global.AvalancheDamagePerTick);
  • Wait(0.050, Ignore Condition);
  • Loop If Condition Is True;
  • }
  • }
  • disabled rule("--- Icing")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise Icing")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "Workshop setting that determines what button icing will use, opening this action might be laggy."
  • Global.IcingOverwritesButton = Workshop Setting Combo(Custom String("Icing ability"), Custom String(
  • "What button should Icing overwrite?"), 0, Array(Custom String("None"), Custom String("Primary Fire"), Custom String(
  • "Secondary Fire"), Custom String("Ability 1 (Cryofreeze)"), Custom String("Ability 2 (Ice Wall)")), -10);
  • "Set the variable from the combo index to the actual button"
  • Global.IcingOverwritesButton = Global.OverwriteButtonArray[Global.IcingOverwritesButton];
  • "Max range"
  • Global.IcingMaxRange = Workshop Setting Real(Custom String("Icing ability"), Custom String("Icing max range"), 20, 5, 50, 3);
  • "Icing steps (more = more accurate, but more effects used)"
  • Global.IcingSteps = Workshop Setting Integer(Custom String("Icing ability"), Custom String(
  • "Steps (Higher = more circles on the ground)"), 20, 5, 50, 5);
  • "Width of icing"
  • Global.IcingRadius = Workshop Setting Real(Custom String("Icing ability"), Custom String("Icing radius (width)"), 1.500, 0.500, 5,
  • 4);
  • "Duration of icing"
  • Global.IcingDuration = Workshop Setting Real(Custom String("Icing ability"), Custom String("Icing Duration"), 8, 0, 20, 2);
  • "Cooldown of icing"
  • Global.IcingCooldown = Workshop Setting Real(Custom String("Icing ability"), Custom String("Icing Cooldown"), 10, 0, 100, 1);
  • "Icing min player speed"
  • Global.IcingMinSpeed = Workshop Setting Integer(Custom String("Icing ability"), Custom String(
  • "Minimum speed when standing on icing (Percentage relative to regular move speed)"), 200, 100, 400, 6);
  • "Icing max player speed"
  • Global.IcingMaxSpeed = Workshop Setting Integer(Custom String("Icing ability"), Custom String(
  • "Maximum speed when standing on icing (Percentage relative to regular move speed)"), 300, 200, 500, 7);
  • "Icing damage on impact"
  • Global.IcingDamageOnImpact = Workshop Setting Integer(Custom String("Icing ability"), Custom String(
  • "Damage on impact of initial Icing hit"), 0, 0, 200, 8);
  • "Icing freeze on impact"
  • Global.IcingFreezeOnImpact = Workshop Setting Real(Custom String("Icing ability"), Custom String(
  • "Freeze duration on impact of initial Icing hit"), 0, 0, 3, 9);
  • "Set how icing is used"
  • Global.IcingType = Workshop Setting Combo(Custom String("Icing ability"), Custom String("Icing type - How does Icing function?"),
  • 0, Array(Custom String("Create a straight path that \"slides\" teammates from point X to point Y"), Custom String(
  • "Create a straight path that grants a static movement speed buff to teammates")), -1);
  • "Icing slow"
  • Global.IcingSlow = Workshop Setting Integer(Custom String("Icing ability"), Custom String("Slow for enemies walking over icing"),
  • 0, 0, 100, 20);
  • "Movement increase for teammates walking on Icing (if Icing type is set to option 2)"
  • Global.IcingSpeedIncrease = Workshop Setting Integer(Custom String("Icing ability"), Custom String(
  • "Movement increase for teammates walking on Icing (if Icing type is set to option 2)"), 15, 0, 200, 21);
  • }
  • }
  • rule("Icing Cooldown HUD if icing is on Primary or Secondary fire")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • Mei;
  • }
  • conditions
  • {
  • Global.IcingOverwritesButton != Null;
  • (Global.IcingOverwritesButton == Button(Primary Fire) || Global.IcingOverwritesButton == Button(Secondary Fire)) == True;
  • }
  • actions
  • {
  • Create HUD Text(Filtered Array(Event Player, Hero Of(Event Player) == Hero(Mei) && True), Null, Custom String(
  • " \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"), Custom String(" \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"), Right, 99, Null, Color(White),
  • Color(White), Visible To String and Color, Default Visibility);
  • Create HUD Text(Filtered Array(Event Player, Hero Of(Event Player) == Hero(Mei) && True), Custom String("Icing: {0}",
  • Event Player.IcingActiveCooldown), Null, Null, Right, 100, Event Player.IcingActiveCooldown ? Color(Red) : Color(Aqua), Color(
  • White), Color(White), Visible To String and Color, Default Visibility);
  • }
  • }
  • rule("Disable original Ability")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IcingOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • }
  • actions
  • {
  • Disallow Button(Event Player, Global.IcingOverwritesButton);
  • }
  • }
  • rule("Presses Ability")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IcingOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • Is Button Held(Event Player, Global.IcingOverwritesButton) == True;
  • Ability Cooldown(Event Player, Global.IcingOverwritesButton) == 0;
  • Event Player.IcingActiveCooldown == 0;
  • Event Player.IsUsingAvalanche != True;
  • }
  • actions
  • {
  • "Set cooldown of button used for Icing"
  • Set Ability Cooldown(Event Player, Global.IcingOverwritesButton, Global.IcingCooldown);
  • Event Player.IcingActiveCooldown = Global.IcingCooldown;
  • Event Player.IcingPlayersDamaged = Empty Array;
  • Chase Player Variable Over Time(Event Player, IcingActiveCooldown, 0, Global.IcingCooldown, Destination and Duration);
  • "Communite, for extra flare"
  • Communicate(Event Player, Going In);
  • "Reset icing"
  • Event Player.IcingEffects = Empty Array;
  • Event Player.IcingStepPositions = Empty Array;
  • "set the start of icing right in front of the player"
  • Event Player.IcingStartPosition = Vector(X Component Of(Eye Position(Event Player) + Facing Direction Of(Event Player) * (
  • Global.IcingRadius + 1)), Y Component Of(Eye Position(Event Player)), Z Component Of(Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * (Global.IcingRadius + 1)));
  • "Set the end position, always at the same eye position as event player"
  • Event Player.IcingEndPosition = Ray Cast Hit Position(Eye Position(Event Player), Vector(X Component Of(Eye Position(Event Player)
  • + Facing Direction Of(Event Player) * Global.IcingMaxRange), Y Component Of(Eye Position(Event Player)), Z Component Of(
  • Eye Position(Event Player) + Facing Direction Of(Event Player) * Global.IcingMaxRange)), Null, Null, False);
  • "Snowball!"
  • Create Effect(All Players(All Teams), Good Aura, Color(Sky Blue), Last Of(Event Player.IcingStepPositions) + Up * 3, 0.250,
  • Create Effect(All Players(All Teams), Sphere, Color(Sky Blue), Last Of(Event Player.IcingStepPositions) + Up * 3, 0.250,
  • Visible To Position and Radius);
  • Event Player.IcingSnowballEffect = Last Created Entity;
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Event Player, 100);
  • "Loop to create effects and array for Icing location"
  • For Player Variable(Event Player, IcingCreateStep, 0, Global.IcingMaxRange, Global.IcingMaxRange / Global.IcingSteps);
  • "Set position of next icing circle"
  • Event Player.IcingStepPositions = Append To Array(Event Player.IcingStepPositions,
  • Event Player.IcingStartPosition + Direction Towards(Event Player.IcingStartPosition, Event Player.IcingEndPosition)
  • * Event Player.IcingCreateStep);
  • "Cast icing down in case we're going over slopes"
  • Event Player.IcingStepPositions[Index Of Array Value(Event Player.IcingStepPositions, Last Of(Event Player.IcingStepPositions))
  • ] = Ray Cast Hit Position(Last Of(Event Player.IcingStepPositions), Last Of(Event Player.IcingStepPositions) + Down * 10, Null,
  • Null, False);
  • "Slow enemies hit by the impact, if set by Workshop Setting"
  • Start Rule(IcingFreezeAndDamageOnImpact, Restart Rule);
  • "Create a bunch of cool effects at current position and save them to a variable"
  • Create Effect(All Players(All Teams), Ring, Team Of(Event Player), Last Of(Event Player.IcingStepPositions), Global.IcingRadius,
  • None);
  • Event Player.IcingEffects = Append To Array(Event Player.IcingEffects, Last Created Entity);
  • Create Effect(All Players(All Teams), Cloud, Color(White), Last Of(Event Player.IcingStepPositions) + Down * 0.250,
  • Global.IcingRadius, None);
  • Event Player.IcingEffects = Append To Array(Event Player.IcingEffects, Last Created Entity);
  • Create Effect(All Players(All Teams), Sparkles, Team Of(Event Player), Last Of(Event Player.IcingStepPositions) + Down * 0.250,
  • Global.IcingRadius, None);
  • Event Player.IcingEffects = Append To Array(Event Player.IcingEffects, Last Created Entity);
  • Play Effect(All Players(All Teams), Ring Explosion, Team Of(Event Player), Last Of(Event Player.IcingStepPositions),
  • Global.IcingRadius * 2);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Last Of(Event Player.IcingStepPositions),
  • Global.IcingRadius * 2);
  • Play Effect(All Players(All Teams), Good Pickup Effect, Team Of(Event Player), Last Of(Event Player.IcingStepPositions),
  • Global.IcingRadius * 1);
  • Play Effect(All Players(All Teams), Buff Impact Sound, Color(White), Last Of(Event Player.IcingStepPositions), 25);
  • Wait(0.032, Ignore Condition);
  • End;
  • Destroy Effect(Event Player.IcingSnowballEffect);
  • "Clear after delay (duration)"
  • Wait(Global.IcingDuration, Ignore Condition);
  • Call Subroutine(ClearIcing);
  • }
  • }
  • rule("Player is on Icing and Icing Type is set to slide")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IcingType == 0;
  • "Icing has been created and has at least 1 position"
  • Count Of(Event Player.IcingStepPositions) > 0;
  • "Player is in any of the icing circles"
  • Is True For Any(Event Player.IcingStepPositions, Distance Between(Position Of(Event Player), Current Array Element)
  • < Global.IcingRadius) == True;
  • Is On Ground(Event Player) == True;
  • Is True For Any(Filtered Array(All Players(Team Of(Event Player)), Hero Of(Current Array Element) == Hero(Mei) && Count Of(
  • Current Array Element.IcingStepPositions) > 0).IcingStepPositions, Current Array Element != 0 && Distance Between(
  • Current Array Element, Position Of(Event Player)) < Global.IcingRadius) == True;
  • }
  • actions
  • {
  • Start Forcing Throttle(Event Player, 0, 1, 0, 0, 0, 1);
  • Event Player.InIcingOfPlayer = First Of(Filtered Array(All Players(Team Of(Event Player)), Hero Of(Current Array Element) == Hero(
  • Mei) && Count Of(Current Array Element.IcingStepPositions) > 0));
  • Start Forcing Throttle(Event Player, 0, 0, 0, 0, 0, 1);
  • "If player is facing end of icing and moving towards it"
  • If(Speed Of In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.IcingStartPosition))
  • > Speed Of In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.IcingEndPosition)));
  • If(Speed Of In Direction(Event Player, Direction Towards(Position Of(Event Player),
  • Event Player.InIcingOfPlayer.IcingStartPosition)) > Speed Of In Direction(Event Player, Direction Towards(Position Of(
  • Event Player), Event Player.InIcingOfPlayer.IcingEndPosition)));
  • "Accelerate towards end of icing"
  • Start Accelerating(Event Player, Direction Towards(Event Player.IcingEndPosition, Event Player.IcingStartPosition), 400, 200,
  • To World, Direction Rate and Max Speed);
  • Start Accelerating(Event Player, Direction Towards(Event Player.InIcingOfPlayer.IcingEndPosition,
  • Event Player.InIcingOfPlayer.IcingStartPosition), 400, 200, To World, Direction Rate and Max Speed);
  • Else;
  • "Accelerate towards start of icing"
  • Start Accelerating(Event Player, Direction Towards(Event Player.IcingStartPosition, Event Player.IcingEndPosition), 400, 200,
  • To World, Direction Rate and Max Speed);
  • Start Accelerating(Event Player, Direction Towards(Event Player.InIcingOfPlayer.IcingStartPosition,
  • Event Player.InIcingOfPlayer.IcingEndPosition), 400, 200, To World, Direction Rate and Max Speed);
  • End;
  • Call Subroutine(ChaseIcingSpeed);
  • }
  • }
  • rule("Player is not on icing and Icing Type is set to slide")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IcingType == 0;
  • Is True For Any(Event Player.IcingStepPositions, Distance Between(Position Of(Event Player), Current Array Element)
  • < Global.IcingRadius) == False;
  • Is True For Any(Filtered Array(All Players(Team Of(Event Player)), Hero Of(Current Array Element) == Hero(Mei) && Count Of(
  • Current Array Element.IcingStepPositions) > 0).IcingStepPositions, Current Array Element != 0 && Distance Between(
  • Current Array Element, Position Of(Event Player)) < Global.IcingRadius) == False;
  • }
  • actions
  • {
  • Wait(0.064, Ignore Condition);
  • Stop Accelerating(Event Player);
  • Event Player.InIcingOfPlayer = Null;
  • "Don't reset speed is using Avalanche"
  • If(Event Player.IsUsingAvalanche != True);
  • Set Move Speed(Event Player, 100);
  • Stop Forcing Throttle(Event Player);
  • End;
  • }
  • }
  • rule("Speed up teammates walking on icing (if enabled)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IcingType == 1;
  • Is True For Any(Filtered Array(All Players(Team Of(Event Player)), Hero Of(Current Array Element) == Hero(Mei) && Count Of(
  • Current Array Element.IcingStepPositions) > 0).IcingStepPositions, Current Array Element != 0 && Distance Between(
  • Current Array Element, Position Of(Event Player)) < Global.IcingRadius) == True;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, 100 + Global.IcingSpeedIncrease);
  • Wait(0.032, Ignore Condition);
  • Loop If Condition Is True;
  • "Don't reset speed is using Avalanche"
  • If(Event Player.IsUsingAvalanche != True);
  • Set Move Speed(Event Player, 100);
  • End;
  • }
  • }
  • rule("Slow down enemies walking on icing (if enabled)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IcingSlow > 0;
  • Is True For Any(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Hero Of(Current Array Element) == Hero(Mei)
  • && Count Of(Current Array Element.IcingStepPositions) > 0).IcingStepPositions, Current Array Element != 0 && Distance Between(
  • Current Array Element, Position Of(Event Player)) < Global.IcingRadius) == True;
  • }
  • actions
  • {
  • Set Move Speed(Event Player, 100 - Global.IcingSlow);
  • Wait(0.032, Ignore Condition);
  • Loop If Condition Is True;
  • Set Move Speed(Event Player, 100);
  • }
  • }
  • rule("Subroutine - Clear Icing")
  • {
  • event
  • {
  • Subroutine;
  • ClearIcing;
  • }
  • actions
  • {
  • "Clear icing and all of it's effects"
  • While(Count Of(Event Player.IcingEffects) > 0);
  • Destroy Effect(First Of(Event Player.IcingEffects));
  • Event Player.IcingEffects = Remove From Array(Event Player.IcingEffects, First Of(Event Player.IcingEffects));
  • Destroy Effect(First Of(Event Player.IcingEffects));
  • Event Player.IcingEffects = Remove From Array(Event Player.IcingEffects, First Of(Event Player.IcingEffects));
  • Destroy Effect(First Of(Event Player.IcingEffects));
  • Event Player.IcingEffects = Remove From Array(Event Player.IcingEffects, First Of(Event Player.IcingEffects));
  • Event Player.IcingStepPositions = Remove From Array(Event Player.IcingStepPositions, First Of(Event Player.IcingStepPositions));
  • Wait(0.032, Ignore Condition);
  • End;
  • "Set to empty, just in case"
  • Event Player.IcingStepPositions = Empty Array;
  • }
  • }
  • rule("Subroutine - Chase Icing Speed")
  • {
  • event
  • {
  • Subroutine;
  • ChaseIcingSpeed;
  • }
  • actions
  • {
  • "Slowly accelerate player between a range"
  • For Player Variable(Event Player, IcingCurrentSpeed, Global.IcingMinSpeed, Global.IcingMaxSpeed, (
  • Global.IcingMaxSpeed - Global.IcingMinSpeed) / 60);
  • Set Move Speed(Event Player, Event Player.IcingCurrentSpeed);
  • Wait(0.016, Abort When False);
  • End;
  • }
  • }
  • rule("Subroutine - Freeze and damage enemies on impact")
  • {
  • event
  • {
  • Subroutine;
  • IcingFreezeAndDamageOnImpact;
  • }
  • actions
  • {
  • "Freeze players in radius if freeze duration is set"
  • If(Global.IcingFreezeOnImpact > 0);
  • Set Status(Players Within Radius(Last Of(Event Player.IcingStepPositions), Global.IcingRadius, Opposite Team Of(Team Of(
  • Event Player)), Surfaces), Event Player, Frozen, Global.IcingFreezeOnImpact);
  • End;
  • "Damage players in radius if damage is set"
  • If(Global.IcingDamageOnImpact > 0);
  • Event Player.IcingPlayersToDamage = Filtered Array(Players Within Radius(Last Of(Event Player.IcingStepPositions),
  • Global.IcingRadius, Opposite Team Of(Team Of(Event Player)), Surfaces), Array Contains(Event Player.IcingPlayersDamaged,
  • Current Array Element) != True);
  • "Damage players in this radius and remove them from the array, continue until array is empty"
  • While(Count Of(Event Player.IcingPlayersToDamage) > 0);
  • Damage(Last Of(Event Player.IcingPlayersToDamage), Event Player, Global.IcingDamageOnImpact);
  • Event Player.IcingPlayersDamaged = Append To Array(Event Player.IcingPlayersDamaged, Last Of(Event Player.IcingPlayersToDamage));
  • Event Player.IcingPlayersToDamage = Remove From Array(Event Player.IcingPlayersToDamage, Last Of(
  • Event Player.IcingPlayersToDamage));
  • End;
  • End;
  • }
  • }
  • rule("Icing HUD cooldown element")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • disabled rule("--- Bllzzard")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • "Workshop setting that determines what button icing will use, opening this action might be laggy."
  • Global.BlizzardOverwritesButton = Workshop Setting Combo(Custom String("Blizzard ability"), Custom String(
  • "What button should Button overwrite?"), 0, Array(Custom String("None"), Custom String("Primary Fire"), Custom String(
  • "Secondary Fire"), Custom String("Ability 1 (Cryofreeze)"), Custom String("Ability 2 (Ice Wall)")), -1);
  • "Set the variable from the combo index to the actual button"
  • Global.BlizzardOverwritesButton = Global.OverwriteButtonArray[Global.BlizzardOverwritesButton];
  • Global.IsBlizzardAroundPlayer = Workshop Setting Toggle(Custom String("Blizzard ability"), Custom String(
  • "Position around player instead of throwable"), False, 0);
  • Global.BlizzardFlySpeed = Workshop Setting Real(Custom String("Blizzard ability"), Custom String("Blizzard fly speed"), 0.300,
  • 0.200, 1, 0);
  • Global.BlizzardGravityStrength = Workshop Setting Real(Custom String("Blizzard ability"), Custom String(
  • "Blizzard gravity strength (how quick the ball falls down)"), 2, 1, 3, 0);
  • Global.BlizzardCooldown = Workshop Setting Real(Custom String("Blizzard ability"), Custom String("Blizzard cooldown"), 10, 0, 20,
  • 0);
  • Global.BlizzardDamagePerSecond = Workshop Setting Real(Custom String("Blizzard ability"), Custom String(
  • "Blizzard damage per second"), 55, 10, 100, 0);
  • Global.BlizzardRadius = Workshop Setting Real(Custom String("Blizzard ability"), Custom String("Blizzard radius"), 4, 1, 10, 0);
  • Global.BlizzardMovementSlow = Workshop Setting Integer(Custom String("Blizzard ability"), Custom String("Blizzard slow"), 35, 10,
  • 100, 0);
  • Global.BlizzardDuration = Workshop Setting Real(Custom String("Blizzard ability"), Custom String("Blizzard duration"), 4, 1, 10,
  • 0);
  • }
  • }
  • rule("Disable original Ability")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.BlizzardOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • Is Dummy Bot(Event Player) != True;
  • }
  • actions
  • {
  • Disallow Button(Event Player, Global.BlizzardOverwritesButton);
  • }
  • }
  • rule("Initialise player")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.BlizzardOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • }
  • actions
  • {
  • Event Player.BlizzardIceArmor = 0;
  • }
  • }
  • rule("Ball effect")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.BlizzardOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • }
  • actions
  • {
  • Create Effect(Filtered Array(Event Player.BlizzardBallsFlying == True, True), Sphere, Color(Aqua),
  • Event Player.BlizzardCurrentCheckPosition, 0.100, Visible To Position and Radius);
  • Create Effect(Filtered Array(Event Player.BlizzardBallsFlying == True, True), Sparkles, Color(Aqua),
  • Event Player.BlizzardCurrentCheckPosition, 0.250, Visible To Position and Radius);
  • Create Effect(Filtered Array(Event Player.BlizzardBallsFlying == True, True), Good Aura, Color(White),
  • Event Player.BlizzardCurrentCheckPosition, 0.150, Visible To Position and Radius);
  • }
  • }
  • rule("Press ability to fire Bllzard (throwable)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.BlizzardOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsBlizzardAroundPlayer != True;
  • Is Dummy Bot(Event Player) != True;
  • Is Button Held(Event Player, Global.BlizzardOverwritesButton) == True;
  • Ability Cooldown(Event Player, Global.BlizzardOverwritesButton) == 0;
  • Event Player.BlizzardActiveCooldown == 0;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Global.BlizzardOverwritesButton, Global.BlizzardCooldown);
  • Event Player.BlizzardActiveCooldown = Global.BlizzardCooldown;
  • Chase Player Variable Over Time(Event Player, BlizzardActiveCooldown, 0, Global.BlizzardCooldown, Destination and Duration);
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 50);
  • Event Player.BlizzardActive = False;
  • Event Player.BlizzardBallsFlying = True;
  • Event Player.BlizzardFacingDirection = Facing Direction Of(Event Player);
  • Event Player.BlizzardEyeLocationWhenFired = Eye Position(Event Player);
  • Event Player.BlizzardRaycastFire = Ray Cast Hit Position(Event Player.BlizzardEyeLocationWhenFired,
  • Event Player.BlizzardEyeLocationWhenFired + (Facing Direction Of(Event Player) + Normalize(Up)) * 100, Null, All Players(
  • All Teams), False);
  • Event Player.BlizzardRaycastDistance = 100;
  • For Player Variable(Event Player, BlizzardShootLoop, 0, Event Player.BlizzardRaycastDistance, Global.BlizzardFlySpeed);
  • Event Player.BlizzardPreviousPosition = Event Player.BlizzardCurrentCheckPosition;
  • "Set current position in loop"
  • Event Player.BlizzardCurrentCheckPosition = Event Player.BlizzardEyeLocationWhenFired + Event Player.BlizzardFacingDirection * Event Player.BlizzardShootLoop;
  • "Set gravity"
  • Event Player.BlizzardCurrentCheckPosition = Event Player.BlizzardCurrentCheckPosition - Vector(0,
  • Global.BlizzardGravityStrength * -0.500 + Global.BlizzardGravityStrength ^ (Event Player.BlizzardShootLoop * 0.100), 0);
  • Wait(0.016, Ignore Condition);
  • If(X Component Of(Event Player.BlizzardPreviousPosition) != 0);
  • If(Distance Between(Event Player.BlizzardPreviousPosition, Ray Cast Hit Position(Event Player.BlizzardPreviousPosition,
  • Event Player.BlizzardCurrentCheckPosition, All Players(All Teams), Event Player, True)) < Distance Between(
  • Event Player.BlizzardPreviousPosition, Event Player.BlizzardCurrentCheckPosition));
  • Event Player.BlizzardCurrentCheckPosition = Ray Cast Hit Position(Event Player.BlizzardPreviousPosition,
  • Event Player.BlizzardCurrentCheckPosition, All Players(All Teams), Event Player, True);
  • Break;
  • End;
  • End;
  • If(Event Player.BlizzardShootLoop >= Event Player.BlizzardRaycastDistance);
  • Break;
  • End;
  • End;
  • Event Player.BlizzardBallsFlying = False;
  • Event Player.BlizzardFinalPosition = Event Player.BlizzardCurrentCheckPosition;
  • Event Player.BlizzardActive = True;
  • Event Player.BlizzardCurrentCheckPosition = Vector(0, 0, 0);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Event Player.BlizzardFinalPosition, Global.BlizzardRadius * 2);
  • Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player.BlizzardFinalPosition, Global.BlizzardRadius);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(White), Event Player.BlizzardFinalPosition, Global.BlizzardRadius);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player.BlizzardFinalPosition, 200);
  • }
  • }
  • rule("Press ability to fire Bllzard (around player)")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.BlizzardEnabled == True;
  • Global.IsBlizzardAroundPlayer == True;
  • Is Dummy Bot(Event Player) != True;
  • Is Button Held(Event Player, Global.BlizzardOverwritesButton) == True;
  • Ability Cooldown(Event Player, Global.BlizzardOverwritesButton) == 0;
  • Event Player.BlizzardActiveCooldown == 0;
  • }
  • actions
  • {
  • Set Ability Cooldown(Event Player, Global.BlizzardOverrideCryofreeze ? Button(Ability 1) : Button(Ability 2),
  • Global.BlizzardCooldown);
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 50);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Event Player, Global.BlizzardRadius * 2);
  • Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player, Global.BlizzardRadius);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(White), Event Player, Global.BlizzardRadius);
  • Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player, 200);
  • Event Player.BlizzardActive = True;
  • }
  • }
  • rule("Bllzard effect")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.BlizzardOverwritesButton != Null;
  • Hero Of(Event Player) == Hero(Mei);
  • }
  • actions
  • {
  • Create Effect(Filtered Array(Event Player.BlizzardActive == True, True), Ring, Color(Aqua),
  • Global.IsBlizzardAroundPlayer ? Event Player : Event Player.BlizzardFinalPosition, Global.BlizzardRadius,
  • Visible To Position and Radius);
  • Create Effect(Filtered Array(Event Player.BlizzardActive == True, True), Sparkles, Color(Aqua),
  • Global.IsBlizzardAroundPlayer ? Event Player : Event Player.BlizzardFinalPosition, Global.BlizzardRadius,
  • Visible To Position and Radius);
  • Create Effect(Filtered Array(Event Player.BlizzardActive == True, True), Cloud, Color(White),
  • Global.IsBlizzardAroundPlayer ? Event Player : Event Player.BlizzardFinalPosition, Global.BlizzardRadius,
  • Visible To Position and Radius);
  • }
  • }
  • rule("Bllzard is active")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.BlizzardActive == True;
  • }
  • actions
  • {
  • Wait(Global.BlizzardDuration, Abort When False);
  • Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua),
  • Global.IsBlizzardAroundPlayer ? Event Player : Event Player.BlizzardFinalPosition, Global.BlizzardRadius * 2);
  • Play Effect(All Players(All Teams), Good Explosion, Color(White),
  • Global.IsBlizzardAroundPlayer ? Event Player : Event Player.BlizzardFinalPosition, Global.BlizzardRadius);
  • Play Effect(All Players(All Teams), Bad Explosion, Color(White),
  • Global.IsBlizzardAroundPlayer ? Event Player : Event Player.BlizzardFinalPosition, Global.BlizzardRadius);
  • Set Status(Players Within Radius(Global.IsBlizzardAroundPlayer ? Position Of(Event Player) : Event Player.BlizzardFinalPosition,
  • Global.BlizzardRadius, Opposite Team Of(Team Of(Event Player)), Surfaces), Null, Frozen, 1.500);
  • Event Player.BlizzardActive = False;
  • }
  • }
  • rule("Enemies in Bllzzard")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.BlizzardActive == True;
  • }
  • actions
  • {
  • Event Player.EnemiesInBlizzard = Players Within Radius(Global.IsBlizzardAroundPlayer ? Position Of(Event Player)
  • : Event Player.BlizzardFinalPosition, Global.BlizzardRadius, Opposite Team Of(Team Of(Event Player)), Surfaces);
  • Set Move Speed(Event Player.EnemiesInBlizzard, 100 - Global.BlizzardMovementSlow);
  • Damage(Event Player.EnemiesInBlizzard, Event Player, Global.BlizzardDamagePerSecond / 10);
  • Wait(0.100, Ignore Condition);
  • Set Move Speed(Event Player.EnemiesInBlizzard, 100);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Mei herself is in Bllzzard")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IsMeiTank == True;
  • Event Player.BlizzardActive == True;
  • Distance Between(Global.IsBlizzardAroundPlayer ? Position Of(Event Player) : Event Player.BlizzardFinalPosition, Position Of(
  • Event Player)) <= Global.BlizzardRadius;
  • }
  • actions
  • {
  • Skip If(Event Player.BlizzardIceArmor >= Global.MaxIceArmor, 1);
  • Event Player.BlizzardIceArmor += 30;
  • Wait(0.250, Ignore Condition);
  • Heal(Event Player, Null, 30);
  • Loop If Condition Is True;
  • }
  • }
  • rule("Ice Armor")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.BlizzardOverwritesButton != Null;
  • Event Player.BlizzardIceArmor == True;
  • }
  • actions
  • {
  • Add Health Pool To Player(Event Player, Armor, Event Player.BlizzardIceArmor, True, True);
  • }
  • }
  • disabled rule("--- Mei as a tank")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.IsMeiTank = Workshop Setting Toggle(Custom String("Mei as a tank"), Custom String("- Is Mei a tank?"), False, 0);
  • Global.MeiTankHealth = Workshop Setting Integer(Custom String("Mei as a tank"), Custom String("Mei max health"), 300, 200, 600, 0);
  • Global.MaxIceArmor = Workshop Setting Integer(Custom String("Mei as a tank"), Custom String("Max Ice Armor"), 300, 200, 600, 0);
  • }
  • }
  • rule("Set values")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IsMeiTank == True;
  • Hero Of(Event Player) == Hero(Mei);
  • }
  • actions
  • {
  • Set Max Health(Event Player, 120);
  • }
  • }
  • disabled rule("--- Snowball secondary")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.SnowballFlySpeed = Workshop Setting Real(Custom String("Snowball secondary fire"), Custom String("Snowball fly speed"),
  • 0.500, 0.200, 1, 0);
  • Global.SnowballGravityStrength = Workshop Setting Real(Custom String("Snowball secondary fire"), Custom String(
  • "Snowball gravity strength (how quick the ball falls down)"), 1.750, 1, 3, 0);
  • Global.SnowballDamage = Workshop Setting Integer(Custom String("Snowball secondary fire"), Custom String("Snowball damage done"),
  • 50, 0, 200, 0);
  • }
  • }
  • rule("Disable original secondary fire")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsMeiTank == True;
  • Global.IsWeaponOvercharge != True;
  • }
  • actions
  • {
  • Disallow Button(Event Player, Button(Secondary Fire));
  • }
  • }
  • rule("Ball effect")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsMeiTank == True;
  • Global.IsWeaponOvercharge != True;
  • }
  • actions
  • {
  • Create Effect(Filtered Array(Event Player.SnowballBallsFlying == True, True), Sphere, Color(White),
  • Event Player.SnowballCurrentCheckPosition, 0.100, Visible To Position and Radius);
  • Create Effect(Filtered Array(Event Player.SnowballBallsFlying == True, True), Sparkles, Color(White),
  • Event Player.SnowballCurrentCheckPosition, 0.250, Visible To Position and Radius);
  • Create Effect(Filtered Array(Event Player.SnowballBallsFlying == True, True), Good Aura, Color(White),
  • Event Player.SnowballCurrentCheckPosition, 0.150, Visible To Position and Radius);
  • }
  • }
  • rule("Press ability to fire snowball")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsMeiTank == True;
  • Global.IsWeaponOvercharge != True;
  • Is Button Held(Event Player, Button(Secondary Fire)) == True;
  • }
  • actions
  • {
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 50);
  • Event Player.SnowballActive = False;
  • Event Player.SnowballBallsFlying = True;
  • Event Player.SnowballFacingDirection = Facing Direction Of(Event Player);
  • Event Player.SnowballEyeLocationWhenFired = Eye Position(Event Player);
  • Event Player.SnowballRaycastFire = Ray Cast Hit Position(Event Player.SnowballEyeLocationWhenFired,
  • Event Player.SnowballEyeLocationWhenFired + (Facing Direction Of(Event Player) + Normalize(Up)) * 100, Null, All Players(
  • All Teams), False);
  • Event Player.SnowballRaycastDistance = 100;
  • For Player Variable(Event Player, SnowballShootLoop, 0, Event Player.SnowballRaycastDistance, Global.SnowballFlySpeed);
  • Event Player.SnowballPreviousPosition = Event Player.SnowballCurrentCheckPosition;
  • "Set current position in loop"
  • Event Player.SnowballCurrentCheckPosition = Event Player.SnowballEyeLocationWhenFired + Event Player.SnowballFacingDirection * Event Player.SnowballShootLoop;
  • "Set gravity"
  • Event Player.SnowballCurrentCheckPosition = Event Player.SnowballCurrentCheckPosition - Vector(0,
  • Global.SnowballGravityStrength * -0.500 + Global.SnowballGravityStrength ^ (Event Player.SnowballShootLoop * 0.100), 0);
  • Wait(0.016, Ignore Condition);
  • If(X Component Of(Event Player.SnowballPreviousPosition) != 0);
  • If(Distance Between(Event Player.SnowballPreviousPosition, Ray Cast Hit Position(Event Player.SnowballPreviousPosition,
  • Event Player.SnowballCurrentCheckPosition, All Players(All Teams), Event Player, True)) < Distance Between(
  • Event Player.SnowballPreviousPosition, Event Player.SnowballCurrentCheckPosition));
  • Event Player.SnowballCurrentCheckPosition = Ray Cast Hit Position(Event Player.SnowballPreviousPosition,
  • Event Player.SnowballCurrentCheckPosition, All Players(All Teams), Event Player, True);
  • Break;
  • End;
  • End;
  • If(Event Player.SnowballShootLoop >= Event Player.SnowballRaycastDistance);
  • Break;
  • End;
  • End;
  • Event Player.SnowballBallsFlying = False;
  • Event Player.SnowballFinalPosition = Event Player.SnowballCurrentCheckPosition;
  • Event Player.SnowballActive = True;
  • Event Player.SnowballCurrentCheckPosition = Vector(0, 0, 0);
  • Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player.SnowballFinalPosition, 1200);
  • Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player.SnowballFinalPosition, 0.500);
  • Damage(First Of(Players Within Radius(Event Player.SnowballFinalPosition, 2, All Teams, Surfaces And Enemy Barriers)),
  • Event Player, Global.SnowballDamage);
  • }
  • }
  • disabled rule("--- Weapon overcharge")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • }
  • rule("Initialise")
  • {
  • event
  • {
  • Ongoing - Global;
  • }
  • actions
  • {
  • Global.IsWeaponOvercharge = Workshop Setting Toggle(Custom String("Weapon Overcharge"), Custom String(
  • "- Enable Overcharge Weapon?"), False, 0);
  • Global.OverchargeRate = Workshop Setting Real(Custom String("Weapon Overcharge"), Custom String(
  • "Charge rate (higher = faster overheat)"), 40, 1, 50, 0);
  • Global.DischargeRate = Workshop Setting Real(Custom String("Weapon Overcharge"), Custom String(
  • "Discharge rate compared to charge rate (higher = faster discharge)"), 1.500, 0.500, 5, 0);
  • Global.OverchargeDelay = Workshop Setting Real(Custom String("Weapon Overcharge"), Custom String("Delay before cooldown starts"),
  • 0.250, 0, 5, 0);
  • Global.DoesOverchargeUseAmmo = Workshop Setting Toggle(Custom String("Weapon Overcharge"), Custom String(
  • "Does Overcharge still use ammo?"), True, 0);
  • Global.OverchargeMaxAmmo = Workshop Setting Integer(Custom String("Weapon Overcharge"), Custom String(
  • "Overcharge Ammo, if using ammo"), 400, 0, 1000, 0);
  • }
  • }
  • rule("Overcharge HUD")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Is Dummy Bot(Event Player) != True;
  • }
  • actions
  • {
  • Create HUD Text(Filtered Array(Event Player, Event Player.CurrentWeaponCharge < 49.999), Custom String("{0}%",
  • Event Player.CurrentWeaponCharge), Null, Null, Top, 10, Color(Green), Color(White), Color(White), Visible To and String,
  • Default Visibility);
  • Create HUD Text(Filtered Array(Event Player, Event Player.CurrentWeaponCharge > 50 && Event Player.CurrentWeaponCharge < 74.999),
  • Custom String("{0}%", Event Player.CurrentWeaponCharge), Null, Null, Top, 10, Color(Yellow), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Filtered Array(Event Player, Event Player.CurrentWeaponCharge > 75 && Event Player.CurrentWeaponCharge < 89.999),
  • Custom String("{0}%", Event Player.CurrentWeaponCharge), Null, Null, Top, 10, Color(Orange), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Filtered Array(Event Player, Event Player.CurrentWeaponCharge >= 90), Custom String("{0}%",
  • Event Player.CurrentWeaponCharge), Null, Null, Top, 10, Color(Red), Color(White), Color(White), Visible To and String,
  • Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • Create HUD Text(Event Player, Null, Custom String(" "), Custom String(" "), Top, 5, Color(White), Color(White), Color(White),
  • Visible To and String, Default Visibility);
  • }
  • }
  • rule("Set weapon ammo")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Has Spawned(Event Player) == True;
  • Is Alive(Event Player) == True;
  • }
  • actions
  • {
  • Set Max Ammo(Event Player, 0, Global.DoesOverchargeUseAmmo ? Global.OverchargeMaxAmmo : 200);
  • Set Ammo(Event Player, 0, Global.DoesOverchargeUseAmmo ? Global.OverchargeMaxAmmo : 200);
  • }
  • }
  • rule("Is primary held? Charge weapon")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Is Firing Primary(Event Player) == True;
  • Event Player.WeaponIsOverheated != True;
  • }
  • actions
  • {
  • Stop Chasing Player Variable(Event Player, CurrentWeaponCharge);
  • Chase Player Variable At Rate(Event Player, CurrentWeaponCharge, 100, Global.OverchargeRate, Destination and Rate);
  • }
  • }
  • rule("Is primary NOT held? Stop charging weapon and discharge")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Is Firing Primary(Event Player) != True;
  • Is Button Held(Event Player, Button(Secondary Fire)) != True;
  • Event Player.WeaponIsOverheated != True;
  • }
  • actions
  • {
  • Stop Chasing Player Variable(Event Player, CurrentWeaponCharge);
  • Wait(Global.OverchargeDelay, Abort When False);
  • If(!Global.DoesOverchargeUseAmmo);
  • Set Ammo(Event Player, 0, Global.OverchargeMaxAmmo);
  • End;
  • Chase Player Variable At Rate(Event Player, CurrentWeaponCharge, 0, Global.OverchargeRate * Global.DischargeRate,
  • Destination and Rate);
  • }
  • }
  • rule("Is primary NOT held, but secondary is?")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Is Firing Primary(Event Player) != True;
  • Is Button Held(Event Player, Button(Secondary Fire)) == True;
  • Event Player.WeaponIsOverheated != True;
  • }
  • actions
  • {
  • Stop Chasing Player Variable(Event Player, CurrentWeaponCharge);
  • }
  • }
  • rule("Using secondary fire")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Event Player.CurrentWeaponCharge < 100;
  • Is Firing Secondary(Event Player) == True;
  • Event Player.WeaponIsOverheated != True;
  • }
  • actions
  • {
  • Set Damage Dealt(Event Player, 120 - 40 * (Event Player.CurrentWeaponCharge / 100));
  • Wait(0.016, Ignore Condition);
  • Event Player.CurrentWeaponCharge = 100;
  • Wait(1, Ignore Condition);
  • Set Damage Dealt(Event Player, 100);
  • }
  • }
  • rule("Is reloading?")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Hero Of(Event Player) == Hero(Mei);
  • Global.IsWeaponOvercharge == True;
  • Is Reloading(Event Player) == True;
  • }
  • actions
  • {
  • Chase Player Variable At Rate(Event Player, CurrentWeaponCharge, 0, 100, Destination and Rate);
  • }
  • }
  • rule("Is fully charged?")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Global.IsWeaponOvercharge == True;
  • Event Player.CurrentWeaponCharge == 100;
  • }
  • actions
  • {
  • Set Status(Event Player, Null, Burning, 10);
  • Event Player.WeaponIsOverheated = True;
  • Set Primary Fire Enabled(Event Player, False);
  • If(!Global.DoesOverchargeUseAmmo);
  • Wait(0.600, Ignore Condition);
  • Press Button(Event Player, Button(Reload));
  • Set Primary Fire Enabled(Event Player, True);
  • End;
  • }
  • }
  • rule("Is overheated?")
  • {
  • event
  • {
  • Ongoing - Each Player;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Player.WeaponIsOverheated == True;
  • }
  • actions
  • {
  • Set Primary Fire Enabled(Event Player, False);
  • Disallow Button(Event Player, Button(Secondary Fire));
  • Wait(0.500, Ignore Condition);
  • Allow Button(Event Player, Button(Secondary Fire));
  • Set Secondary Fire Enabled(Event Player, False);
  • Wait(0.500, Ignore Condition);
  • Chase Player Variable At Rate(Event Player, CurrentWeaponCharge, 0, Global.OverchargeRate * Global.DischargeRate,
  • Destination and Rate);
  • Wait(100 / (Global.OverchargeRate * Global.DischargeRate), Ignore Condition);
  • Set Primary Fire Enabled(Event Player, True);
  • Set Secondary Fire Enabled(Event Player, True);
  • Clear Status(Event Player, Burning);
  • Event Player.WeaponIsOverheated = False;
  • }
  • }
  • rule("Damage numbers")
  • {
  • event
  • {
  • Player Dealt Damage;
  • All;
  • All;
  • }
  • conditions
  • {
  • Event Damage > 20;
  • Global.IsWeaponOvercharge == True;
  • }
  • actions
  • {
  • Small Message(All Players(All Teams), Custom String("Damage dealt: {0}", Event Damage));
  • }
  • }
Join the Workshop.codes Discord