workshopModes/defendTheCastleExtended/old_versions/c125.ow

9350 lines
291 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

settings
{
main
{
Description: "Defend The Castle Extended v0.6.c125\nby ShuriZma#2349\nJ1K6F (Code Version: c125)\nOriginal mode by HuKuTa94#2589\n\nDefend the gate, kill enemies and don't allow them to damage the gate!\n\nSpecial Thanks to:\nShingen#21859 for the Abilities,\nLemonAid#11644 for the Hero Talents\n& Josbird for teaching me about Menus!\n\nFind this mode on: workshop.codes/defend-the-castle\nFind the Original Mode on: workshop.codes/BQEGS\nTell me what you think on Discord: discord.shurizma.de\n\nPS: SHINGEN PLS COME BACK"
Mode Name: "Defend The Castle Extended"
}
lobby
{
Max Spectators: 0
Max Team 1 Players: 4
Max Team 2 Players: 0
Return To Lobby: Never
Swap Teams After Match: No
}
modes
{
Escort
{
enabled maps
{
Havana
}
}
Team Deathmatch
{
enabled maps
{
}
}
General
{
Game Mode Start: Immediately
Spawn Health Packs: Disabled
}
}
workshop
{
Ana can nano herself even if there are other players only if no player targeted: On
Story Heroes: Off
}
extensions
{
Beam Effects
Kinetic Explosion Effects
Explosion Sounds
Play More Effects
Spawn More Dummy Bots
}
}
variables
{
global:
0: GatePosition
1: ZenSpawnPositions
2: SpawnPositionMaxId
3: LoopIterator1
4: BigBossSpawnPositions
5: PlayerSpawnPositions
6: GateHealthChase
7: GateHealth
8: GateMaxHealth
9: GateProgressBarColorCurrent
10: GateProgressBarColorComponent
11: GateHealthEvent
12: BastionTargetPositions
13: SniperPositions
14: BallSpawnPositions
15: ZenRespawnTime
16: TimeMin
17: TimeSec
18: DefaultCurrentBot
19: DefaultHeroBotsPool
20: DefaultHeroBotsPoolCurrentId
21: IsDebug
22: BotOrisaParent
23: IsStoryHeroes
24: BotOrisaChild
25: GateRepairPosition
26: BotOrisaTargetPosition
27: BotEchoRespawnPosition
28: BotEchoTeleportPositions
29: UpgradeGateMaxHealthValue
30: UpgradeGateMaxHealthHudId
31: UpgradePlayerMaxHealthValue
32: UpgradePlayerMaxHealthHudId
33: UpgradeCriticalDamageValue
34: UpgradeCriticalDamageHudId
35: UpgradeMaxAmmoValue
36: UpgradeMaxAmmoHudId
37: UpgradeMaxAmmoMaxValue
38: UpgradePlayerMaxHealthMaxValue
39: UpgradeCriticalDamageMaxValue
40: UpgradeGateMaxHealthMaxValue
41: DamageDone
42: IsDebugAINavigation
43: GameLogicCountOfUniqueHeroes
44: IsNewWaveGameLogicProcessing
45: AutoRepair
46: UpgradePerkSharpshooterValue
47: Perk
48: MaxHealthDone
49: StartMoney
50: Time5Min
51: SelfNanoWorkshopSetting
52: ShopCamPos
53: ShopBasePos
54: ShopPosAngle
55: activeBoss
56: bossTrigger
57: bossRotation
58: lastBoss
59: Time10Min
60: MoneyMult
61: challengeCount
62: UpgradeBossHealthValue
112: AllPos
113: AllDir
114: firstpos
115: secondpos
116: firstpoint2
117: secondpoint2
118: second
119: z
120: Wall_ID
121: showwalls
122: is_Grounded
123: g_beamType
124: x
125: NodePositions
126: NodeConnections
127: DistanceMatrix
player:
0: BotSeePlayer
1: BotDoesUniqueBehaviour
2: BotEffects
3: BotRayCastHitPosition
4: BotEventPosition
5: CurrentHero
6: IsDead
7: IsRespawning
8: BotBastionArtilleryDidShotsCount
9: BotCounter
10: HasBadStatus
11: EventHealth
12: HealOverTimeId
13: BotIsOrisaChild
14: BotEchoCapturedPlayer
15: BotPlayersInRadius
16: BotLoopIterator2
17: BotWidowShotTime
18: BotWidowTeleportTime
19: IsNanoed
20: AbilityHUD
21: Lucio_Dash_Active
22: Lucio_Dash_Icon
23: AnaEntityID
24: Abilities
25: Money
26: HeroTalentText
27: DamageDealt
28: PlayerHealth
29: AbilityCountdown
30: HP_Pool
31: Effects_
32: Ability_Projectile1
33: Ability_End
34: Storm_Projectile
35: Storm_EndPoint
36: Storm_Effects
37: Feared_until
38: Modification_Damage
39: Ability_Projectile2
40: Ability_Position
41: Chain_Reaction_On
42: Chain_Reaction_Immune
43: Ability_Active
44: Ability_Resource
45: secondWindActive
46: isInMenu
47: ReinPin
48: PlayerFacing
49: isBoss
50: Gen_Direction
51: Gen_Available
52: Ability_Player
53: Ability_Countdown
54: lastSecondWind
55: deathPosition
105: filterpos
106: lastsavedpos
107: closestbodypos
108: fullbodypos
109: prevpos_intersection
110: active_wall
111: closestwall
112: x
113: intersection_length
114: thickness
115: BotCancelPathFinding
116: BotLoopIterator1
117: BotTempArray
118: BotTargetPlayer
119: BotTargetPosition
120: BotClosestNodeIdToTarget
121: BotClosestNodeIdToBot
122: BotPrevNodeId
123: BotNextNodeId
124: BotNextNodePosition
125: BotCurrentDistanceToTarget
126: BotShortestDistanceToTarget
127: BotIsPathFinding
}
subroutines
{
0: BotBastionArtilleryDamage
1: BotBastionFlameGunDamage
2: BotBastionRespawn
3: GateProgressBarColor
4: BotZenyattaRespawn
5: BotWidowRespawn
6: BotBallRespawn
7: GameLogicAddNextHeroInGame
8: BotOrisaRespawn
9: BotLandingFromSky
10: BotEchoRespawn
11: BotEchoDetachPlayer
12: BotEchoFlyToPlayer
13: BotEchoFlyToPortal
14: GameLogicSetBotProperties
15: DisablePlayer
16: BotApearFromUnderground
17: BotReinRespawn
18: PlayerInit
19: BotInit
20: PlayerRespawn
21: BotRespawn
22: BotWidowBadStatus
23: GameLogicWave0
24: Refund
25: EnablePlayer
26: GateRepair
124: BotStartPathFinding
125: BotGetClosestNodeIdToTarget
126: BotGetNextNodeIdAndPosition
127: BotResetPathFinding
}
disabled rule("=== PATH BUILDER MODE IMPORT ===")
{
event
{
Ongoing - Global;
}
}
rule("MAP: HAVANA")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Havana);
}
actions
{
Global.NodePositions = Array(Vector(147.588, 6.425, -46.749), Vector(136.181, 6.425, -57.159), Vector(130.189, 6.425, -63.781),
Vector(123.305, 6.425, -57.983), Vector(125.678, 6.504, -46.633), Vector(114.485, 7.471, -46.699), Vector(138.743, 6.425,
-32.974), Vector(126.498, 6.425, -39.920), Vector(124.572, 10.434, -34.300), Vector(138.605, 5.359, -18.647), Vector(119.009,
2.331, -31.024), Vector(121.138, 5.228, -19.933), Vector(126.722, 6.425, -29.505), Vector(102.762, 3.157, -33.609), Vector(
76.030, 7.418, -74.087), Vector(83.720, 9.425, -33.744), Vector(97.439, 7.238, -42.379), Vector(86.252, 12.416, -47.261),
Vector(65.178, 11.425, -73.187), Vector(97.466, 7.269, -50.596), Vector(113.039, 7.424, -37.337), Vector(106.179, 7.450,
-46.143), Vector(90.086, 7.411, -44.653), Vector(78.752, 7.418, -62.140), Vector(82.124, 7.428, -44.229), Vector(90.675, 7.231,
-51.234), Vector(85.717, 4.692, -63.446), Vector(90.830, 4.330, -70.697), Vector(102.425, 2.387, -72.817), Vector(81.443,
4.425, -81.648), Vector(70.743, 6.418, -81.495), Vector(69.738, 6.419, -96.344), Vector(127.586, 12.643, -63.344), Vector(
118.911, 13.468, -58.008), Vector(102.885, 1.092, -56.579), Vector(100.009, 2.967, -67.139), Vector(106.703, 0.465, -44.628),
Vector(81.695, 7.418, -52.140), Vector(126.979, 12.393, -55.079), Vector(153.720, 18.578, -21.745), Vector(155.301, 18.619,
-17.595), Vector(133.043, 10.425, -26.625), Vector(114.646, 7.278, -57.336), Vector(95.160, 3.688, -81.194), Vector(78.456,
5.418, -93.581), Vector(75.455, 5.418, -101.492), Vector(148.071, 9.432, -32.123), Vector(146.706, 9.425, -27.858), Vector(
144.273, 9.445, -63.119), Vector(144.278, 9.454, -58.447));
Global.NodeConnections = Array(Array(1, 6, 4, 7), Array(2, 1, 4, 6, 7, 0, 49), Array(1, 3), Array(2, 4, 42), Array(3, 1, 5, 7, 6,
1, 0), Array(4, 7, 20, 21, 19, 16, 42), Array(7, 1, 4, 1, 9, 12, 0, 46), Array(4, 5, 6, 1, 1, 12, 0), Array(7, 41), Array(6,
11), Array(11, 13), Array(9, 10, 13), Array(6, 7, 10), Array(10, 16, 36), Array(18, 23, 30), Array(17, 24), Array(13, 19, 22,
21, 25, 5), Array(15, 22, 25, 23), Array(14), Array(16, 21, 22, 26, 27, 35, 25, 5), Array(5, 13, 10), Array(19, 16, 5, 13, 22,
34), Array(16, 19, 21, 24, 25), Array(14, 25, 26, 37), Array(22, 15, 37), Array(23, 22, 19, 16, 26, 27, 35, 37), Array(25, 19,
27, 35, 29), Array(19, 26, 25, 29, 35, 43), Array(35, 34, 43), Array(27, 26, 30, 43, 44), Array(29, 14, 31), Array(30, 29, 45),
Array(33, 38, 1, 48), Array(32, 38, 42), Array(35, 36, 28), Array(28, 19, 25, 27, 26, 34), Array(13, 34), Array(25, 23, 24),
Array(5, 4, 1, 6, 1, 32, 33, 0), Array(40), Array(39), Array(6, 8, 47, 46), Array(3, 5, 34), Array(28, 27, 29, 44), Array(29,
43, 45), Array(44, 31), Array(6, 47), Array(46, 41), Array(49, 32), Array(1, 0, 6, 48));
Global.DistanceMatrix = Array(Array(0, 1, 2, 2, 1, 2, 1, 1, 5, 2, 3, 3, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7,
4, 5, 4, 4, 5, 5, 5, 0, 0, 4, 3, 5, 6, 7, 2, 3, 3, 2), Array(1, 0, 1, 2, 1, 2, 1, 1, 5, 2, 3, 3, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3,
4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 3, 4, 4, 4, 5, 5, 4, 0, 0, 4, 3, 5, 6, 7, 2, 3, 2, 1), Array(2, 1, 0, 1, 2, 3, 2, 2, 6, 3, 4, 4,
3, 5, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 4, 6, 7, 8, 4, 5, 3, 4, 4, 6, 5, 0, 0, 5, 2, 5, 6, 7, 3, 4, 3, 2), Array(2, 2,
1, 0, 1, 2, 2, 2, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 3, 5, 6, 7, 5, 6, 2, 3, 3, 5, 6, 0, 0, 5, 1, 4,
5, 6, 3, 4, 4, 3), Array(1, 1, 2, 1, 0, 1, 1, 1, 5, 2, 3, 3, 2, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 4, 5,
3, 3, 4, 4, 5, 0, 0, 4, 2, 4, 5, 6, 2, 3, 3, 2), Array(2, 2, 3, 2, 1, 0, 2, 1, 6, 3, 2, 3, 2, 2, 4, 4, 1, 5, 5, 1, 1, 1, 2, 3,
3, 2, 2, 2, 3, 3, 4, 5, 5, 6, 2, 2, 3, 3, 6, 0, 0, 5, 1, 3, 4, 5, 3, 4, 4, 3), Array(1, 1, 2, 2, 1, 2, 0, 1, 4, 1, 2, 2, 1, 3,
6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 4, 5, 4, 4, 4, 5, 5, 0, 0, 3, 3, 5, 6, 7, 1, 2, 3, 2), Array(1, 1, 2, 2,
1, 1, 1, 0, 5, 2, 2, 3, 1, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 4, 5, 3, 3, 4, 4, 5, 0, 0, 4, 2, 4, 5, 6,
2, 3, 3, 2), Array(2, 2, 3, 3, 2, 2, 2, 1, 0, 3, 3, 4, 2, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 5, 6, 4, 4,
5, 5, 6, 0, 0, 1, 3, 5, 6, 7, 2, 2, 4, 3), Array(2, 2, 3, 3, 2, 3, 1, 2, 5, 0, 2, 1, 2, 2, 6, 6, 3, 7, 7, 4, 4, 4, 4, 5, 5, 4,
5, 5, 5, 6, 7, 8, 5, 6, 4, 5, 3, 5, 6, 0, 0, 4, 4, 6, 7, 8, 2, 3, 4, 3), Array(4, 4, 5, 5, 4, 3, 3, 4, 7, 2, 0, 1, 4, 1, 5, 5,
2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 4, 5, 6, 7, 7, 8, 3, 4, 2, 4, 8, 0, 0, 6, 4, 5, 6, 7, 4, 5, 6, 5), Array(3, 3, 4, 4, 3, 3,
2, 3, 6, 1, 1, 0, 3, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 4, 4, 4, 5, 6, 7, 6, 7, 3, 4, 2, 4, 7, 0, 0, 5, 4, 5, 6, 7, 3, 4,
5, 4), Array(2, 2, 3, 3, 2, 2, 1, 1, 5, 2, 1, 2, 0, 2, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 5, 5, 6, 7, 5, 6, 4, 4, 3, 5,
6, 0, 0, 4, 3, 5, 6, 7, 2, 3, 4, 3), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 3, 1, 2, 4, 0, 4, 4, 1, 5, 5, 2, 3, 2, 2, 3, 3, 2, 3, 3,
3, 4, 5, 6, 7, 8, 2, 3, 1, 3, 8, 0, 0, 7, 3, 4, 5, 6, 5, 6, 6, 5), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 5, 6, 6, 4, 0, 4, 3, 5,
1, 3, 5, 4, 3, 1, 3, 2, 2, 3, 4, 2, 1, 2, 9, 10, 4, 3, 5, 2, 10, 0, 0, 9, 5, 3, 3, 3, 7, 8, 8, 7), Array(6, 6, 7, 6, 5, 4, 6,
5, 10, 7, 5, 6, 6, 4, 3, 0, 3, 1, 4, 3, 5, 3, 2, 2, 1, 2, 3, 3, 4, 4, 4, 5, 9, 10, 4, 3, 5, 2, 10, 0, 0, 9, 5, 4, 5, 6, 7, 8,
8, 7), Array(3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 2, 3, 3, 1, 3, 3, 0, 4, 4, 1, 2, 1, 1, 2, 2, 1, 2, 2, 3, 3, 4, 5, 6, 7, 2, 2, 2, 2,
7, 0, 0, 6, 2, 3, 4, 5, 4, 5, 5, 4), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 2, 1, 2, 0, 3, 2, 4, 2, 1, 1, 2, 1, 2, 2,
3, 3, 3, 4, 8, 9, 3, 2, 4, 2, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6), Array(7, 7, 8, 7, 6, 5, 7, 6, 11, 8, 6, 7, 7, 5, 1, 5, 4, 6,
0, 4, 6, 5, 4, 2, 4, 3, 3, 4, 5, 3, 2, 3, 10, 11, 5, 4, 6, 3, 11, 0, 0, 10, 6, 4, 4, 4, 8, 9, 9, 8), Array(3, 3, 4, 3, 2, 1, 3,
2, 7, 4, 3, 4, 3, 2, 3, 3, 1, 4, 4, 0, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 3, 4, 6, 7, 2, 1, 3, 2, 7, 0, 0, 6, 2, 2, 3, 4, 4, 5, 5,
4), Array(3, 3, 4, 3, 2, 1, 3, 2, 7, 3, 1, 2, 3, 1, 5, 5, 2, 6, 6, 2, 0, 2, 3, 4, 4, 3, 3, 3, 4, 4, 5, 6, 6, 7, 3, 3, 2, 4, 7,
0, 0, 6, 2, 4, 5, 6, 4, 5, 5, 4), Array(3, 3, 4, 3, 2, 1, 3, 2, 7, 4, 2, 3, 3, 1, 4, 3, 1, 4, 5, 1, 2, 0, 1, 3, 2, 2, 2, 2, 2,
3, 4, 5, 6, 7, 1, 2, 2, 3, 7, 0, 0, 6, 2, 3, 4, 5, 4, 5, 5, 4), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 3, 4, 4, 2, 3, 2, 1, 3, 4,
1, 3, 1, 0, 2, 1, 1, 2, 2, 3, 3, 4, 5, 7, 8, 2, 2, 3, 2, 8, 0, 0, 7, 3, 3, 4, 5, 5, 6, 6, 5), Array(5, 5, 6, 5, 4, 3, 5, 4, 9,
6, 4, 5, 5, 3, 1, 3, 2, 4, 2, 2, 4, 3, 2, 0, 2, 1, 1, 2, 3, 2, 2, 3, 8, 9, 3, 2, 4, 1, 9, 0, 0, 8, 4, 3, 3, 4, 6, 7, 7, 6),
Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 3, 1, 2, 2, 4, 2, 4, 2, 1, 2, 0, 2, 3, 3, 4, 4, 4, 5, 8, 9, 3, 3, 4, 1, 9, 0,
0, 8, 4, 4, 5, 6, 6, 7, 7, 6), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 3, 4, 4, 2, 2, 3, 1, 4, 3, 1, 3, 2, 1, 1, 2, 0, 1, 1, 2, 2,
3, 4, 7, 8, 2, 1, 3, 1, 8, 0, 0, 7, 3, 2, 3, 4, 5, 6, 6, 5), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5, 4, 3, 3, 4, 2, 5, 4, 1,
3, 2, 2, 2, 3, 1, 0, 1, 2, 1, 2, 3, 7, 8, 2, 1, 3, 2, 8, 0, 0, 7, 3, 2, 2, 3, 5, 6, 6, 5), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5,
4, 5, 4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 0, 2, 1, 2, 3, 7, 8, 2, 1, 3, 2, 8, 0, 0, 7, 3, 1, 2, 3, 5, 6, 6, 5), Array(
5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 4, 5, 3, 6, 5, 2, 4, 3, 3, 3, 4, 2, 2, 2, 0, 2, 3, 4, 8, 9, 1, 1, 2, 3, 9, 0, 0, 8,
4, 1, 2, 3, 6, 7, 7, 6), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 5, 6, 5, 4, 2, 5, 3, 6, 3, 2, 4, 3, 3, 3, 4, 2, 1, 1, 2, 0, 1, 2,
8, 9, 3, 2, 4, 3, 9, 0, 0, 8, 4, 1, 1, 2, 6, 7, 7, 6), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 1, 5, 4, 6, 2, 3, 5, 4,
4, 2, 4, 3, 2, 2, 3, 1, 0, 1, 9, 10, 4, 3, 5, 3, 10, 0, 0, 9, 5, 2, 2, 2, 7, 8, 8, 7), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6,
7, 6, 5, 2, 6, 4, 7, 3, 3, 5, 4, 4, 3, 5, 3, 2, 2, 3, 1, 1, 0, 9, 10, 4, 3, 5, 4, 10, 0, 0, 9, 5, 2, 2, 1, 7, 8, 8, 7), Array(
2, 1, 2, 3, 2, 2, 2, 2, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 4, 5, 6, 7, 0, 1, 3, 4, 4, 5, 1, 0, 0, 5,
2, 5, 6, 7, 3, 4, 1, 2), Array(2, 2, 3, 2, 2, 2, 2, 3, 6, 3, 4, 4, 3, 4, 6, 6, 3, 7, 7, 3, 3, 3, 4, 5, 5, 4, 4, 4, 3, 5, 6, 7,
1, 0, 2, 3, 3, 5, 1, 0, 0, 5, 1, 4, 5, 6, 3, 4, 2, 3), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 5, 3, 4, 5, 2, 4, 5, 3, 6, 5, 2, 4, 3,
3, 3, 4, 2, 2, 2, 1, 3, 4, 5, 8, 9, 0, 1, 1, 3, 9, 0, 0, 8, 4, 2, 3, 4, 6, 7, 7, 6), Array(4, 4, 5, 4, 3, 2, 4, 3, 8, 5, 4, 5,
4, 3, 3, 4, 2, 5, 4, 1, 3, 2, 2, 2, 3, 1, 1, 1, 1, 2, 3, 4, 7, 8, 1, 0, 2, 2, 8, 0, 0, 7, 3, 2, 3, 4, 5, 6, 6, 5), Array(5, 5,
6, 5, 4, 3, 5, 4, 9, 4, 2, 3, 5, 1, 5, 5, 2, 6, 6, 3, 4, 3, 3, 4, 4, 3, 3, 3, 2, 4, 5, 6, 8, 9, 1, 2, 0, 4, 9, 0, 0, 8, 4, 3,
4, 5, 6, 7, 7, 6), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 4, 5, 5, 3, 2, 2, 2, 3, 3, 2, 4, 3, 2, 1, 1, 1, 2, 2, 3, 3, 3, 4, 8, 9,
3, 2, 4, 0, 9, 0, 0, 8, 4, 3, 4, 5, 6, 7, 7, 6), Array(1, 1, 2, 2, 1, 1, 1, 2, 5, 2, 3, 3, 2, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4,
4, 3, 3, 3, 4, 4, 5, 6, 1, 1, 3, 3, 4, 4, 0, 0, 0, 4, 2, 4, 5, 6, 2, 3, 2, 2), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), Array(2, 2, 3, 3, 2, 3, 1, 2, 1, 2, 3, 3, 2,
4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 5, 6, 5, 5, 5, 6, 6, 0, 0, 0, 4, 6, 7, 8, 1, 1, 4, 3), Array(3, 3, 2,
1, 2, 1, 3, 2, 7, 4, 3, 4, 3, 3, 5, 5, 2, 6, 6, 2, 2, 2, 3, 4, 4, 3, 3, 3, 2, 4, 5, 6, 6, 7, 1, 2, 2, 4, 7, 0, 0, 6, 0, 3, 4,
5, 4, 5, 5, 4), Array(5, 5, 6, 5, 4, 3, 5, 4, 9, 6, 5, 6, 5, 4, 3, 5, 3, 6, 4, 2, 4, 3, 3, 3, 4, 2, 2, 1, 1, 1, 2, 3, 8, 9, 2,
2, 3, 3, 9, 0, 0, 8, 4, 0, 1, 2, 6, 7, 7, 6), Array(6, 6, 7, 6, 5, 4, 6, 5, 10, 7, 6, 7, 6, 5, 3, 6, 4, 7, 4, 3, 5, 4, 4, 4, 5,
3, 2, 2, 2, 1, 2, 2, 9, 10, 3, 3, 4, 4, 10, 0, 0, 9, 5, 1, 0, 1, 7, 8, 8, 7), Array(7, 7, 8, 7, 6, 5, 7, 6, 11, 8, 7, 8, 7, 6,
3, 7, 5, 8, 4, 4, 6, 5, 5, 4, 6, 4, 3, 3, 3, 2, 2, 1, 10, 11, 4, 4, 5, 5, 11, 0, 0, 10, 6, 2, 1, 0, 8, 9, 9, 8), Array(2, 2, 3,
3, 2, 3, 1, 2, 3, 2, 3, 3, 2, 4, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 5, 6, 5, 5, 5, 6, 6, 0, 0, 2, 4, 6, 7,
8, 0, 1, 4, 3), Array(3, 3, 4, 4, 3, 4, 2, 3, 2, 3, 4, 4, 3, 5, 8, 8, 5, 9, 9, 5, 5, 5, 6, 7, 7, 6, 6, 6, 7, 7, 8, 9, 6, 7, 6,
6, 6, 7, 7, 0, 0, 1, 5, 7, 8, 9, 1, 0, 5, 4), Array(2, 2, 3, 4, 3, 3, 2, 3, 6, 3, 4, 4, 3, 5, 7, 7, 4, 8, 8, 4, 4, 4, 5, 6, 6,
5, 5, 5, 5, 6, 7, 8, 1, 2, 4, 5, 5, 6, 2, 0, 0, 5, 3, 6, 7, 8, 3, 4, 0, 1), Array(1, 1, 2, 3, 2, 3, 1, 2, 5, 2, 3, 3, 2, 4, 7,
7, 4, 8, 8, 4, 4, 4, 5, 6, 6, 5, 5, 5, 6, 6, 7, 8, 2, 3, 5, 5, 5, 6, 3, 0, 0, 4, 4, 6, 7, 8, 2, 3, 1));
}
}
rule("SUBROUTINE: BOT - RESET PATH FINDING")
{
event
{
Subroutine;
BotResetPathFinding;
}
actions
{
Event Player.BotTargetPlayer = -1;
Event Player.BotTargetPosition = -1;
Event Player.BotPrevNodeId = -1;
Event Player.BotClosestNodeIdToTarget = -1;
Event Player.BotNextNodeId = -1;
Event Player.BotNextNodePosition = -1;
Event Player.BotIsPathFinding = False;
Event Player.BotCancelPathFinding = False;
Stop Throttle In Direction(Event Player);
disabled Stop Facing(Event Player);
}
}
rule("SUBROUTINE: BOT - START PATH FINDING")
{
event
{
Subroutine;
BotStartPathFinding;
}
actions
{
disabled Abort If(Event Player.BotIsPathFinding == True);
Call Subroutine(BotGetNextNodeIdAndPosition);
disabled Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
Event Player.BotIsPathFinding = True;
}
}
rule("SUBROUTINE: BOT - GET NEXT NODE ID AND POSITION")
{
event
{
Subroutine;
BotGetNextNodeIdAndPosition;
}
actions
{
"BOT JUST START FOLLOW PATH OR LOST NEXT NODE"
If(Event Player.BotPrevNodeId == -1);
Event Player.BotClosestNodeIdToBot = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(Global.NodePositions,
Is In Line of Sight(Position Of(Event Player) + Vector(0, 2, 0), Current Array Element, Barriers Do Not Block LOS) == True),
Distance Between(Position Of(Event Player), Current Array Element))[0]);
Call Subroutine(BotGetClosestNodeIdToTarget);
End;
"NEXT NODE IS TARGET (DISTANCE TO TARGET NODE = 1)"
If(Global.DistanceMatrix[Event Player.BotClosestNodeIdToBot][Event Player.BotClosestNodeIdToTarget] == 1);
Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToTarget;
"CHECK CONNECTIONS OF REACHED NODE"
Else;
Event Player.BotShortestDistanceToTarget = 999;
Event Player.BotCurrentDistanceToTarget = Event Player.BotShortestDistanceToTarget;
Event Player.BotTempArray = Global.NodeConnections[Event Player.BotClosestNodeIdToBot];
For Player Variable(Event Player, BotLoopIterator1, 0, Count Of(Event Player.BotTempArray), 1);
Event Player.BotCurrentDistanceToTarget = Global.DistanceMatrix[Event Player.BotTempArray[Event Player.BotLoopIterator1]][Event Player.BotClosestNodeIdToTarget];
If(Event Player.BotCurrentDistanceToTarget < Event Player.BotShortestDistanceToTarget);
Event Player.BotShortestDistanceToTarget = Event Player.BotCurrentDistanceToTarget;
Event Player.BotNextNodeId = Event Player.BotTempArray[Event Player.BotLoopIterator1];
End;
End;
End;
"NEXT NODE IS HIGHER THAN BOT AND BOT DIDN'T REACH CLOSEST NODE"
If(Y Component Of(Position Of(Event Player)) - Y Component Of(Global.NodePositions[Event Player.BotNextNodeId])
< -3 && Event Player.BotPrevNodeId != Event Player.BotClosestNodeIdToBot);
Event Player.BotPrevNodeId = Event Player.BotClosestNodeIdToBot;
Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToBot;
"BOT CAN SEE TARGET POSITION AND NEXT NODE IS TARGET"
Else If(
Global.DistanceMatrix[Event Player.BotClosestNodeIdToBot][Event Player.BotClosestNodeIdToTarget] == 1 && Is In Line of Sight(
Position Of(Event Player) + Vector(0, 1.600, 0), Event Player.BotTargetPosition + Vector(0, 2, 0), Barriers Do Not Block LOS));
Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
Abort;
"BOT CAN'T SEE NEXT NODE AND PREV NODE != REACHED NODE"
Else If(Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0),
Global.NodePositions[Event Player.BotNextNodeId] + Vector(0, 2, 0), Barriers Do Not Block LOS)
== False && Event Player.BotPrevNodeId != Event Player.BotClosestNodeIdToBot);
Event Player.BotPrevNodeId = Event Player.BotClosestNodeIdToBot;
Event Player.BotNextNodeId = Event Player.BotClosestNodeIdToBot;
End;
Event Player.BotNextNodePosition = Global.NodePositions[Event Player.BotNextNodeId];
}
}
rule("SUBROUTINE: BOT - GET CLOSEST NODE ID AND POSITION TO TARGET")
{
event
{
Subroutine;
BotGetClosestNodeIdToTarget;
}
actions
{
Event Player.BotTargetPosition = Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer)
: Event Player.BotTargetPosition;
Event Player.BotClosestNodeIdToTarget = Index Of Array Value(Global.NodePositions, Sorted Array(Filtered Array(
Global.NodePositions, Is In Line of Sight(Event Player.BotTargetPosition + Vector(0, 2, 0), Current Array Element,
Barriers Do Not Block LOS) == True), Distance Between(Event Player.BotTargetPosition, Current Array Element))[0]);
}
}
rule("BOT: PATH FINDING - START")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
(Event Player.BotTargetPosition != -1 || Event Player.BotTargetPlayer != -1) == True;
}
actions
{
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: PATH FINDING - CANCEL")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.BotIsPathFinding == True;
Event Player.BotCancelPathFinding == True;
}
actions
{
Start Rule(BotResetPathFinding, Restart Rule);
}
}
rule("BOT: PATH FINDING - LOST THE NODE")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.BotIsPathFinding == True;
(Is In Line of Sight(Position Of(Event Player) + Vector(0, 1.600, 0), Event Player.BotNextNodePosition + Vector(0, 2.500, 0),
Barriers Do Not Block LOS) == False && Speed Of In Direction(Event Player, Throttle Of(Event Player)) < 2) == True;
}
actions
{
Wait(0.500, Abort When False);
"RESET PREV NODE ID TO INFORM BOT THAT IT LOST NEXT NODE"
Event Player.BotPrevNodeId = -1;
"TRY FIND NEW NEXT NODE"
Call Subroutine(BotGetNextNodeIdAndPosition);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodeId), 360, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
}
}
rule("BOT: PATH FINDING - REACHED THE NODE")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Event Player.BotIsPathFinding == True;
Event Player.BotClosestNodeIdToTarget >= 0;
(Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Vector(
X Component Of(Event Player.BotNextNodePosition), 0, Z Component Of(Event Player.BotNextNodePosition))) < 0.850) == True;
}
actions
{
Event Player.BotPrevNodeId = Event Player.BotNextNodeId;
Event Player.BotClosestNodeIdToBot = Event Player.BotNextNodeId;
"BOT'S TARGET IS PLAYER"
If(Event Player.BotTargetPlayer != -1);
Call Subroutine(BotGetClosestNodeIdToTarget);
End;
Event Player.BotCurrentDistanceToTarget = Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(
Position Of(Event Player))), Vector(X Component Of(Event Player.BotTargetPosition), 0, Z Component Of(
Event Player.BotTargetPosition)));
"BOT REACHED THE TARGET NODE OR TARGET POSITION"
If(Event Player.BotNextNodeId == Event Player.BotClosestNodeIdToTarget || Event Player.BotCurrentDistanceToTarget <= 0.850);
"BOT DIDN'T REACH TARGET POSITION"
If(Event Player.BotCurrentDistanceToTarget > 0.850);
Event Player.BotNextNodePosition = Event Player.BotTargetPosition;
Skip(6);
"BOT REACHED TARGET"
Else;
Call Subroutine(BotResetPathFinding);
Abort;
End;
End;
"CONTINUE FOLLOW PATH"
Call Subroutine(BotGetNextNodeIdAndPosition);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
}
}
disabled rule("=== PATH BUILDER MODE IMPORT ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: GAME MODE INIT - WORKSHOP SETTINGS")
{
event
{
Ongoing - Global;
}
actions
{
Global.IsDebug = False;
Global.IsDebugAINavigation = False;
Global.GateMaxHealth = Workshop Setting Integer(Custom String("Defend The Castle Extended"), Custom String("GATE MAX HEALTH"), 500, 100, 1000,
0);
Global.MoneyMult = Workshop Setting Real(Custom String("Defend The Castle Extended"), Custom String("Money Multiplicator"), 1, 0.500, 2, 0);
Global.IsStoryHeroes = Workshop Setting Toggle(Custom String("Defend The Castle Extended"), Custom String("Story Heroes"), True, 0);
Global.SelfNanoWorkshopSetting = Workshop Setting Toggle(Custom String("Ana Self Nano"), Custom String(
"Ana can nano herself even if there are other players (only if no player targeted)"), False, 0);
}
}
rule("GLOBAL: GAME MODE INIT - COMMON PROPERTIES")
{
event
{
Ongoing - Global;
}
actions
{
Create HUD Text(All Players(All Teams), Null, Null, Custom String(
"Defend The Castle Extended v0.6.c125 BY ShuriZma#2349\r\nOriginal mode by HUKUTA94#2589\r\nDiscord: discord.shurizma.de\r\n{0}", Custom String(
"Special Thanks to:\nShingen#21859 for the Abilities,\nLemonAid#11644 for the Hero Talents &\nJosbird for teaching me about Menus{0}",
Custom String(" \nPS: SHINGEN PLS COME BACK"))), Right, -1000, Null, Null, Color(White), Visible To,
Default Visibility);
Global.GateRepairPosition = Vector(153, 8, -46.500);
Global.GatePosition = Vector(148.800, 6, -46.400);
Global.BallSpawnPositions = Array(Vector(104, 7, -46), Vector(106, 2, -31));
Global.SniperPositions = Array(Vector(154, 18, -22.600), Vector(86, 12, -46.600), Vector(80.880, 11.300, -71.600), Vector(98, 9,
-19));
Global.ZenSpawnPositions = Array(Vector(79.500, 5, -100), Vector(90, 4, -88), Vector(65, 11, -70), Vector(85, 4, -68), Vector(96,
2, -73), Vector(84, 7, -47), Vector(95, 9, -34), Vector(108, 1.700, -28), Vector(113, 7, -37), Vector(123, 5, -19), Vector(144,
5, -19), Vector(123, 6, -39), Vector(123, 6, -61), Vector(129, 6, -30.500), Vector(135, 6, -63));
Global.PlayerSpawnPositions = Array(Vector(153.300, 10, -63.800), Vector(153.300, 10, -61.700), Vector(153.300, 10, -31.700),
Vector(153.300, 10, -29.600));
Global.BigBossSpawnPositions = Array(Vector(78, 4, -84), Vector(95, 4, -82));
Global.BastionTargetPositions = Array(Vector(131, 12, -62), Vector(115, 7, -46), Objective Position(2), Vector(136, 10, -27));
Global.SpawnPositionMaxId = 2;
Global.BotOrisaTargetPosition = Vector(104, 7, -46);
Global.BotEchoRespawnPosition = Vector(130, 23, -44);
Global.BotEchoTeleportPositions = Array(Vector(88, 23, -79), Vector(108, 18, -27));
Global.DefaultHeroBotsPool = Array(Hero(Zenyatta), Hero(Widowmaker), Null, Hero(Bastion), Hero(Echo), Hero(Bastion));
Global.ZenRespawnTime = 10;
Global.GameLogicCountOfUniqueHeroes = 5;
Global.lastBoss = Array(Null, Null, Null, Null);
Create Effect(All Players(Team 1), Ring, Color(Sky Blue), Vector(186, 11, -46.500), 9, Visible To Position and Radius);
Create Effect(All Players(Team 1), Ring, Color(Yellow), Vector(153.300, 10, -61.700), 2, Visible To Position and Radius);
}
}
disabled rule("PLAYER: DEBUG - PRESS INTERACT")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Host Player == True;
Is Button Held(Event Player, Button(Interact)) == True;
}
actions
{
disabled Modify Player Score(Event Player, 10);
disabled Global.GateHealth -= 5;
disabled Start Rule(GateProgressBarColor, Restart Rule);
Global.TimeSec = 59;
Set Status(Event Player, Null, Phased Out, 9999);
disabled Set Ultimate Charge(Event Player, 100);
disabled Kill(Event Player, Null);
disabled Create Dummy Bot(Hero(Reinhardt), Team 2, -1, Objective Position(2), Vector(0, 0, 0));
}
}
rule("GLOBAL: DEBUG - AI NAVIGATION")
{
event
{
Ongoing - Global;
}
conditions
{
Global.IsDebugAINavigation == True;
}
actions
{
For Global Variable(LoopIterator1, 0, Count Of(Global.NodePositions), 1);
Create Effect(All Players(All Teams), Sphere, Color(Red), Global.NodePositions[Global.LoopIterator1], 0.850, Visible To);
Create In-World Text(All Players(All Teams), Custom String("NODE {0}", Global.LoopIterator1),
Global.NodePositions[Global.LoopIterator1], 1.200, Clip Against Surfaces, Visible To, Color(White), Default Visibility);
End;
}
}
disabled rule("GLOBAL: DEBUG - CREATE BOTS")
{
event
{
Ongoing - Global;
}
conditions
{
Is In Setup == True;
}
actions
{
Create Dummy Bot(Hero(Bastion), Team 2, -1, Objective Position(2), Vector(0, 0, 0));
Create Dummy Bot(Hero(Orisa), Team 2, -1, Objective Position(2), Vector(0, 0, 0));
}
}
disabled rule("PLAYER: DEBUG - INFOS")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.IsDebug == True;
Host Player == Event Player;
Has Spawned(Event Player) == True;
Is Dummy Bot(Event Player) == False;
}
actions
{
Create HUD Text(Event Player, Custom String("POS {0}\r\nFACING {1}", Position Of(Event Player), Facing Direction Of(Event Player)),
Null, Null, Left, -99, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
Create HUD Text(Event Player, Custom String("SERVER PERFORMANCE\r\nLOAD {0}%\r\nPEAK {1}%\r\nAVG {2}%", Server Load,
Server Load Peak, Server Load Average), Null, Null, Left, -99, Color(White), Color(White), Color(White), Visible To and String,
Default Visibility);
disabled Create Progress Bar HUD Text(Event Player, 45, Custom String("45 / 100 KILLS"), Left, -99, Color(Blue), Color(White),
Visible To Values and Color, Default Visibility);
disabled Create HUD Text(Event Player, Custom String("{0}", Hero Icon String(Hero Of(Event Player))), Null, Custom String(
"LEVEL 1 - 50 AMMO CLIP"), Left, -99, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
"ЭФФЕКТ С ОФФСЕТОМ ОТ ПОЗИЦИИ ГЛАЗ"
disabled Create Beam Effect(All Players(All Teams), Bad Beam, Eye Position(Event Player) - Vector(0, 0.700, 0) + Facing Direction Of(
Event Player) * 3, Eye Position(Event Player) + Facing Direction Of(Event Player) * 50, Color(Purple),
Visible To Position and Radius);
}
}
disabled rule("=== TEAM UPGRADES ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: TEAM UPGRADES - INIT")
{
event
{
Ongoing - Global;
}
actions
{
Global.UpgradeMaxAmmoMaxValue[0] = 250;
Global.UpgradeMaxAmmoMaxValue[1] = 500;
Global.UpgradeMaxAmmoMaxValue[2] = 1000;
Global.UpgradeCriticalDamageMaxValue[0] = 10;
Global.UpgradeCriticalDamageMaxValue[1] = 5;
Global.UpgradeCriticalDamageMaxValue[2] = 5;
Global.UpgradePlayerMaxHealthMaxValue[0] = 2500;
Global.UpgradePlayerMaxHealthMaxValue[1] = 5000;
Global.UpgradePlayerMaxHealthMaxValue[2] = 10000;
Global.UpgradeGateMaxHealthMaxValue[0] = Round To Integer(Global.GateMaxHealth + Global.GateMaxHealth * 0.500, Up);
Global.UpgradeGateMaxHealthMaxValue[1] = Global.UpgradeGateMaxHealthMaxValue[0] + Global.UpgradeGateMaxHealthMaxValue[0];
Global.UpgradeGateMaxHealthMaxValue[2] = Global.UpgradeGateMaxHealthMaxValue[1] + Global.UpgradeGateMaxHealthMaxValue[1];
Abort If(Global.IsDebug == False);
Global.UpgradeMaxAmmoMaxValue[0] = 1;
Global.UpgradeCriticalDamageMaxValue[0] = 1;
Global.UpgradePlayerMaxHealthMaxValue[0] = 1;
Global.UpgradeGateMaxHealthMaxValue[0] = 1;
Global.UpgradeMaxAmmoMaxValue[1] = 1;
Global.UpgradeCriticalDamageMaxValue[1] = 1;
Global.UpgradePlayerMaxHealthMaxValue[1] = 1;
Global.UpgradeGateMaxHealthMaxValue[1] = 1;
Global.UpgradeMaxAmmoMaxValue[2] = 1;
Global.UpgradeCriticalDamageMaxValue[2] = 1;
Global.UpgradePlayerMaxHealthMaxValue[2] = 1;
Global.UpgradeGateMaxHealthMaxValue[2] = 1;
}
}
rule("GLOBAL: UPGRADE - GATE'S MAX HEALTH - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[0]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("GATE'S MAX HEALTH UNLOCKED!"));
Play Effect(All Players(All Teams), Good Explosion, Color(Green), Global.GatePosition, 5);
Play Effect(All Players(All Teams), Buff Impact Sound, Color(Green), Global.GatePosition, 100);
Global.GateMaxHealth = Global.UpgradeGateMaxHealthMaxValue[0];
Global.GateHealth = Global.GateMaxHealth;
Destroy HUD Text(Global.UpgradeGateMaxHealthHudId[0]);
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("{0}",
Icon String(Checkmark)), Custom String("GATE'S MAX HEALTH: {0} HP", Global.UpgradeGateMaxHealthMaxValue[0]), Right, 1, Color(
Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeGateMaxHealthHudId[0] = Last Text ID;
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("2X GATE REPAIR"),
Custom String("REPAIR GATE {0}/{1} HP", Global.UpgradeGateMaxHealthValue, Global.UpgradeGateMaxHealthMaxValue[1]), Left, 12,
Color(Orange), Color(White), Color(White), Visible To and String, Default Visibility);
Global.UpgradeGateMaxHealthHudId[1] = Last Text ID;
Start Rule(GateProgressBarColor, Restart Rule);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - GATE'S MAX HEALTH 2 - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[1]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("2X GATE REPAIR UNLOCKED!"));
Play Effect(All Players(All Teams), Good Explosion, Color(Green), Global.GatePosition, 5);
Play Effect(All Players(All Teams), Buff Impact Sound, Color(Green), Global.GatePosition, 100);
Destroy HUD Text(Global.UpgradeGateMaxHealthHudId[1]);
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("{0}",
Icon String(Checkmark)), Custom String("2X GATE REPAIR"), Right, 2, Color(Green), Color(Green), Color(Green), Visible To,
Default Visibility);
Global.UpgradeGateMaxHealthHudId[1] = Last Text ID;
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("2X AUTO-REPAIR"),
Custom String("REPAIR GATE {0}/{1} HP", Global.UpgradeGateMaxHealthValue, Global.UpgradeGateMaxHealthMaxValue[2]), Left, 12,
Color(Orange), Color(White), Color(White), Visible To and String, Default Visibility);
Global.UpgradeGateMaxHealthHudId[2] = Last Text ID;
Global.GateHealth = Global.GateMaxHealth;
Start Rule(GateProgressBarColor, Restart Rule);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - GATE'S MAX HEALTH 3 - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[2]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("2X AUTO-REPAIR UNLOCKED!"));
Play Effect(All Players(All Teams), Good Explosion, Color(Green), Global.GatePosition, 5);
Play Effect(All Players(All Teams), Buff Impact Sound, Color(Green), Global.GatePosition, 100);
Destroy HUD Text(Global.UpgradeGateMaxHealthHudId[2]);
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String("{0}",
Icon String(Checkmark)), Custom String("2X AUTO-REPAIR"), Right, 3, Color(Green), Color(Green), Color(Green), Visible To,
Default Visibility);
Global.UpgradeGateMaxHealthHudId[2] = Last Text ID;
Global.GateHealth = Global.GateMaxHealth;
Start Rule(GateProgressBarColor, Restart Rule);
Global.challengeCount += 1;
}
}
rule("PLAYER: UPGRADE - PLAYER'S MAX HEALTH - DEALT HEALING")
{
event
{
Player Received Healing;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
disabled Healer != Event Player;
Global.UpgradePlayerMaxHealthValue < Global.UpgradePlayerMaxHealthMaxValue[2];
}
actions
{
Global.UpgradePlayerMaxHealthValue += Event Healing;
}
}
rule("GLOBAL: UPGRADE - PLAYER'S MAX HEALTH - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradePlayerMaxHealthValue >= Global.UpgradePlayerMaxHealthMaxValue[0]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("PLAYER'S MAX HEALTH UNLOCKED!"));
Destroy HUD Text(Global.UpgradePlayerMaxHealthHudId[0]);
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("{0}", Icon String(Checkmark)), Custom String(
"PLAYER'S MAX HEALTH +50%"), Right, 4, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradePlayerMaxHealthHudId[0] = Last Text ID;
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("Up You Go: You respawn twice as fast"), Custom String(
"HEAL PLAYERS {0}/{1} HP", Round To Integer(Global.UpgradePlayerMaxHealthValue, Down),
Global.UpgradePlayerMaxHealthMaxValue[1]), Left, 13, Color(Orange), Color(White), Color(White), Visible To and String,
Default Visibility);
Global.UpgradePlayerMaxHealthHudId[1] = Last Text ID;
For Global Variable(LoopIterator1, 0, Count Of(All Players(Team 1)), 1);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), Position Of(All Players(Team 1)[Global.LoopIterator1]), 1);
Play Effect(All Players(All Teams), Buff Impact Sound, Color(Yellow), Position Of(All Players(Team 1)[Global.LoopIterator1]), 100);
End;
Global.MaxHealthDone = 50;
All Players(Team 1).PlayerHealth = 100 + Global.MaxHealthDone + All Players(Team 1).Abilities[14] * 5;
Set Max Health(All Players(Team 1), All Players(Team 1).PlayerHealth);
Heal(All Players(Team 1), Null, 9999);
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - PERK UP YOU GO - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradePlayerMaxHealthValue >= Global.UpgradePlayerMaxHealthMaxValue[1]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("UP YOU GO UNLOCKED!"));
Destroy HUD Text(Global.UpgradePlayerMaxHealthHudId[1]);
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("{0}", Icon String(Checkmark)), Custom String("Up You Go"),
Right, 5, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradePlayerMaxHealthHudId[1] = Last Text ID;
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("PLAYER'S MAX HEALTH +100%"), Custom String(
"HEAL PLAYERS {0}/{1} HP", Round To Integer(Global.UpgradePlayerMaxHealthValue, Down),
Global.UpgradePlayerMaxHealthMaxValue[2]), Left, 13, Color(Orange), Color(White), Color(White), Visible To and String,
Default Visibility);
Global.UpgradePlayerMaxHealthHudId[2] = Last Text ID;
Set Respawn Max Time(All Players(Team 1), 5);
Heal(All Players(Team 1), Null, 9999);
For Global Variable(LoopIterator1, 0, Count Of(All Players(Team 1)), 1);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), Position Of(All Players(Team 1)[Global.LoopIterator1]), 1);
Play Effect(All Players(All Teams), Buff Impact Sound, Color(Yellow), Position Of(All Players(Team 1)[Global.LoopIterator1]), 100);
End;
Global.Perk[2] = 1;
Create HUD Text(All Players(Team 1), Null, Null, Custom String("Up You Go"), Left, 917, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
All Players(Team 1).AbilityHUD[17] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - PLAYER'S MAX HEALTH 2 - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradePlayerMaxHealthValue >= Global.UpgradePlayerMaxHealthMaxValue[2]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("PLAYER'S MAX HEALTH 2 UNLOCKED!"));
Destroy HUD Text(Global.UpgradePlayerMaxHealthHudId[2]);
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("{0}", Icon String(Checkmark)), Custom String(
"PLAYER'S MAX HEALTH +100%"), Right, 6, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradePlayerMaxHealthHudId[2] = Last Text ID;
For Global Variable(LoopIterator1, 0, Count Of(All Players(Team 1)), 1);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Yellow), Position Of(All Players(Team 1)[Global.LoopIterator1]), 1);
Play Effect(All Players(All Teams), Buff Impact Sound, Color(Yellow), Position Of(All Players(Team 1)[Global.LoopIterator1]), 100);
End;
Global.MaxHealthDone = 150;
All Players(Team 1).PlayerHealth = 100 + Global.MaxHealthDone + All Players(Team 1).Abilities[14] * 5;
Set Max Health(All Players(Team 1), All Players(Team 1).PlayerHealth);
Heal(All Players(Team 1), Null, 9999);
Global.challengeCount += 1;
}
}
rule("PLAYER: UPGRADE - CRITICAL DAMAGE - DEALT KILL")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Event Was Critical Hit == True;
Hero Of(Victim) == Hero(Widowmaker);
Global.UpgradeCriticalDamageValue < Global.UpgradeCriticalDamageMaxValue[0];
}
actions
{
Global.UpgradeCriticalDamageValue += 1;
Small Message(All Players(Team 1), Custom String("CRITICAL DAMAGE CHALLENGE +1"));
}
}
rule("GLOBAL: UPGRADE - CRITICAL DAMAGE - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.UpgradeCriticalDamageValue >= Global.UpgradeCriticalDamageMaxValue[0];
}
actions
{
Big Message(All Players(Team 1), Custom String("CRITICAL DAMAGE 150% UNLOCKED!"));
Destroy HUD Text(Global.UpgradeCriticalDamageHudId[0]);
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("{0}", Icon String(Checkmark)), Custom String(
"CRITICAL DAMAGE 150%"), Right, 7, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeCriticalDamageHudId[0] = Last Text ID;
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String(
"Sharpshooter: Deal 40% more damage to enemies that are further than 15 meters away"), Custom String("KILL ECHO {0}/{1}",
Global.UpgradePerkSharpshooterValue, Global.UpgradeCriticalDamageMaxValue[1]), Left, 14, Color(Orange), Color(White), Color(
White), Visible To and String, Default Visibility);
Global.UpgradeCriticalDamageHudId[1] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("PLAYER: UPGRADE - CRITICAL DAMAGE - UNLOCKED")
{
event
{
Player Dealt Damage;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Event Was Critical Hit == True;
Global.UpgradeCriticalDamageValue >= Global.UpgradeCriticalDamageMaxValue[0];
}
actions
{
Damage(Victim, Event Player, Event Damage * 0.500);
}
}
rule("PLAYER: UPGRADE - PERK SHARPSHOOTER - DEALT KILL")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Hero Of(Victim) == Hero(Echo);
Global.UpgradePerkSharpshooterValue < Global.UpgradeCriticalDamageMaxValue[1];
Global.UpgradeCriticalDamageValue >= Global.UpgradeCriticalDamageMaxValue[0];
}
actions
{
Global.UpgradePerkSharpshooterValue += 1;
Small Message(All Players(Team 1), Custom String("SHARPSHOOTER CHALLENGE +1"));
}
}
rule("GLOBAL: UPGRADE - PERK SHARPSHOOTER - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.UpgradePerkSharpshooterValue >= Global.UpgradeCriticalDamageMaxValue[1];
}
actions
{
Big Message(All Players(Team 1), Custom String("SHARPSHOOTER UNLOCKED!"));
Destroy HUD Text(Global.UpgradeCriticalDamageHudId[1]);
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("{0}", Icon String(Checkmark)), Custom String(
"Sharpshooter"), Right, 8, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeCriticalDamageHudId[1] = Last Text ID;
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("-10% BOSS HEALTH"), Custom String("KILL Bosses {0}/{1}",
Global.UpgradeBossHealthValue, Global.UpgradeCriticalDamageMaxValue[2]), Left, 14, Color(Orange), Color(White), Color(White),
Visible To and String, Default Visibility);
Global.UpgradeCriticalDamageHudId[2] = Last Text ID;
Global.Perk[0] = 1;
Create HUD Text(All Players(Team 1), Null, Null, Custom String("Sharpshooter"), Left, 918, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
All Players(Team 1).AbilityHUD[18] = Last Text ID;
Global.challengeCount += 1;
}
}
disabled rule("PLAYER: UPGRADE - -10% BOSS HEALTH - DEALT KILL")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Global.UpgradePerkSharpshooterValue >= Global.UpgradeCriticalDamageMaxValue[1];
Global.UpgradeBossHealthValue < Global.UpgradeCriticalDamageMaxValue[2];
Victim.isBoss == 1;
}
actions
{
Global.UpgradeBossHealthValue += 1;
Small Message(All Players(Team 1), Custom String("-10% BOSS HEALTH CHALLENGE +1"));
}
}
rule("GLOBAL: UPGRADE - -10% BOSS HEALTH - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2];
}
actions
{
Big Message(All Players(Team 1), Custom String("-10% BOSS HEALTH UNLOCKED!"));
Destroy HUD Text(Global.UpgradeCriticalDamageHudId[2]);
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("{0}", Icon String(Checkmark)), Custom String(
"-10% BOSS HEALTH"), Right, 9, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeCriticalDamageHudId[2] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("PLAYER: UPGRADE - MAX AMMO - DEALT KILL")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Hero Of(Victim) == Hero(Zenyatta);
Global.UpgradeMaxAmmoValue < Global.UpgradeMaxAmmoMaxValue[2];
}
actions
{
If(Event Player.isBoss == 1);
Global.UpgradeMaxAmmoValue += 10;
Else;
Global.UpgradeMaxAmmoValue += 1;
End;
}
}
rule("GLOBAL: UPGRADE - MAX AMMO - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradeMaxAmmoValue >= Global.UpgradeMaxAmmoMaxValue[0]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("MAX AMMO 200% UNLOCKED!"));
Destroy HUD Text(Global.UpgradeMaxAmmoHudId[0]);
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("{0}", Icon String(Checkmark)), Custom String(
"MAX AMMO 200%"), Right, 10, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeMaxAmmoHudId[0] = Last Text ID;
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("Bulletstorm: Your weapon can hold unlimited ammo"),
Custom String("KILL {2}: {0}/{1}", Global.UpgradeMaxAmmoValue, Global.UpgradeMaxAmmoMaxValue[1], Hero(Zenyatta)), Left, 15,
Color(Orange), Color(White), Color(White), Visible To and String, Default Visibility);
Global.UpgradeMaxAmmoHudId[1] = Last Text ID;
For Global Variable(LoopIterator1, 0, Count Of(All Players(Team 1)), 1);
Set Max Ammo(All Players(Team 1)[Global.LoopIterator1], 0, Max Ammo(All Players(Team 1)[Global.LoopIterator1], 0) * 2);
Set Max Ammo(All Players(Team 1)[Global.LoopIterator1], 1, Max Ammo(All Players(Team 1)[Global.LoopIterator1], 1) * 2);
Set Ammo(All Players(Team 1)[Global.LoopIterator1], 0, Max Ammo(All Players(Team 1)[Global.LoopIterator1], 0));
Set Ammo(All Players(Team 1)[Global.LoopIterator1], 1, Max Ammo(All Players(Team 1)[Global.LoopIterator1], 1));
End;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - PERK BULLETSTORM - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradeMaxAmmoValue >= Global.UpgradeMaxAmmoMaxValue[1]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("BULLETSTORM UNLOCKED!"));
Destroy HUD Text(Global.UpgradeMaxAmmoHudId[1]);
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("{0}", Icon String(Checkmark)), Custom String(
"Bulletstorm"), Right, 11, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeMaxAmmoHudId[1] = Last Text ID;
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("+50% DAMAGE"), Custom String("KILL {2}: {0}/{1}",
Global.UpgradeMaxAmmoValue, Global.UpgradeMaxAmmoMaxValue[2], Hero(Zenyatta)), Left, 15, Color(Orange), Color(White), Color(
White), Visible To and String, Default Visibility);
Global.UpgradeMaxAmmoHudId[2] = Last Text ID;
Global.Perk[1] = 1;
Create HUD Text(All Players(Team 1), Null, Null, Custom String("Bulletstorm"), Left, 919, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
All Players(Team 1).AbilityHUD[19] = Last Text ID;
Global.challengeCount += 1;
}
}
rule("GLOBAL: UPGRADE - +50% DAMAGE - DONE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Global.UpgradeMaxAmmoValue >= Global.UpgradeMaxAmmoMaxValue[1]) == True;
}
actions
{
Big Message(All Players(Team 1), Custom String("+50% DAMAGE UNLOCKED!"));
Destroy HUD Text(Global.UpgradeMaxAmmoHudId[2]);
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("{0}", Icon String(Checkmark)), Custom String(
"+50% DAMAGE"), Right, 12, Color(Green), Color(Green), Color(Green), Visible To, Default Visibility);
Global.UpgradeMaxAmmoHudId[2] = Last Text ID;
Global.DamageDone = 50;
All Players(Team 1).DamageDealt = 100 + Global.DamageDone + All Players(Team 1).Abilities[13] * 5;
Set Damage Dealt(All Players(Team 1), All Players(Team 1).DamageDealt);
Global.challengeCount += 1;
}
}
disabled rule("=== GAME PHASES ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: ASEMBLING PHASE - MAKE CHALLENGES HUDS")
{
event
{
Ongoing - Global;
}
conditions
{
Is Assembling Heroes == True;
}
actions
{
If(Global.IsDebug);
Set Match Time(1);
Else;
Disable Inspector Recording;
Set Match Time(20);
End;
Create In-World Text(All Players(Team 1), Custom String(" {0}\r\nREPAIR\r\n {1}", Hero Icon String(Hero(Torbjörn)),
Ability Icon String(Hero(Bastion), Button(Secondary Fire))), Global.GatePosition + Vector(0, 1.400, 0), 1.200, Do Not Clip,
Visible To, Color(White), Default Visibility);
Create HUD Text(All Players(Team 1), Null, Null, Custom String("TEAM CHALLENGES"), Left, 11, Color(White), Color(Blue), Color(
White), Visible To, Default Visibility);
"UPGRADE - GATE'S MAX HEALTH"
Create HUD Text(All Players(Team 1), Ability Icon String(Hero(Reinhardt), Button(Secondary Fire)), Custom String(
"GATE'S MAX HEALTH: {0} HP", Global.UpgradeGateMaxHealthMaxValue[0]), Custom String("REPAIR GATE {0}/{1} HP",
Global.UpgradeGateMaxHealthValue, Global.UpgradeGateMaxHealthMaxValue[0]), Left, 12, Color(Orange), Color(White), Color(White),
Visible To and String, Default Visibility);
Global.UpgradeGateMaxHealthHudId[0] = Last Text ID;
disabled Create HUD Text(All Players(Team 1), Null, Custom String(" \r\n "), Null, Left, 2, Color(White), Color(White), Color(White),
Visible To, Default Visibility);
"UPGRADE - PLAYER'S MAX HEALTH"
Create HUD Text(All Players(Team 1), Icon String(Plus), Custom String("PLAYER'S MAX HEALTH +50%"), Custom String(
"HEAL PLAYERS {0}/{1} HP", Round To Integer(Global.UpgradePlayerMaxHealthValue, Down),
Global.UpgradePlayerMaxHealthMaxValue[0]), Left, 13, Color(Orange), Color(White), Color(White), Visible To and String,
Default Visibility);
Global.UpgradePlayerMaxHealthHudId[0] = Last Text ID;
disabled Create HUD Text(All Players(Team 1), Null, Custom String(" \r\n "), Null, Left, 4, Color(White), Color(White), Color(White),
Visible To, Default Visibility);
"UPGRADE - CRITICAL DAMAGE"
Create HUD Text(All Players(Team 1), Icon String(Skull), Custom String("CRITICAL DAMAGE 150%"), Custom String(
"KILL WIDOW WITH HEADSHOT: {0}/{1}", Global.UpgradeCriticalDamageValue, Global.UpgradeCriticalDamageMaxValue[0]), Left, 14,
Color(Orange), Color(White), Color(White), Visible To and String, Default Visibility);
Global.UpgradeCriticalDamageHudId[0] = Last Text ID;
disabled Create HUD Text(All Players(Team 1), Null, Custom String(" \r\n "), Null, Left, 6, Color(White), Color(White), Color(White),
Visible To, Default Visibility);
"UPGRADE - MAX AMMO"
Create HUD Text(All Players(Team 1), Icon String(Asterisk), Custom String("MAX AMMO 200%"), Custom String("KILL {2}: {0}/{1}",
Global.UpgradeMaxAmmoValue, Global.UpgradeMaxAmmoMaxValue[0], Hero(Zenyatta)), Left, 15, Color(Orange), Color(White), Color(
White), Visible To and String, Default Visibility);
Global.UpgradeMaxAmmoHudId[0] = Last Text ID;
Create HUD Text(All Players(Team 1), Custom String("HOLD {0} - Reload to open the shop", Input Binding String(Button(Reload))),
Null, Null, Top, 1000, Color(Yellow), Color(White), Color(White), Visible To and String, Default Visibility);
}
}
rule("GLOBAL: SETUP PHASE")
{
event
{
Ongoing - Global;
}
conditions
{
Is In Setup == True;
}
actions
{
If(Global.IsDebug);
Set Match Time(1);
Else;
Set Match Time(20);
End;
Set Objective Description(All Players(All Teams), Custom String("DEFEND GATE"), Visible To and String);
}
}
rule("GLOBAL: GAME IN PROGRESS")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
}
actions
{
Set Match Time(3599);
Pause Match Time;
Disable Built-In Game Mode Scoring;
Disable Built-In Game Mode Announcer;
Disable Built-In Game Mode Completion;
Disable Game Mode HUD(All Players(All Teams));
Disable Game Mode In-World UI(All Players(All Teams));
Global.GateHealth = Global.GateMaxHealth;
Global.GateHealthChase = Global.GateHealth;
Global.GateProgressBarColorComponent = 255;
Global.GateProgressBarColorCurrent = Color(White);
Create Progress Bar HUD Text(All Players(Team 1), Global.GateHealthChase * 100 / Global.GateMaxHealth, Custom String(
"GATE {0}/{1}", Global.GateHealth, Global.GateMaxHealth), Top, 1, Global.GateProgressBarColorCurrent, Color(White),
Visible To Values and Color, Default Visibility);
Create HUD Text(All Players(Team 1), Null, Null, Custom String("SURVIVED TIME: {0}:{1}", Global.TimeMin,
Global.TimeSec < 10 ? Custom String("0{0}", Global.TimeSec) : Global.TimeSec), Top, 2, Color(White), Color(White), Color(
White), Visible To and String, Default Visibility);
Start Rule(GameLogicWave0, Do Nothing);
}
}
disabled rule("=== GAME - MAIN LOGIC ===")
{
event
{
Ongoing - Global;
}
}
rule("GLOBAL: DEFEAT")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.IsDebug == False;
Global.GateHealth <= 0;
}
actions
{
Declare Team Victory(Team 2);
}
}
rule("GLOBAL: TIMER - MAIN GAME LOOP")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
disabled Global.GateHealth > 0;
}
actions
{
Wait(1, Ignore Condition);
Global.TimeSec += 1;
If(Global.TimeSec == 60);
Global.TimeSec = 0;
Global.TimeMin += 1;
Global.Time5Min = Round To Integer(Global.TimeMin / 5, Down);
Global.Time10Min = Round To Integer(Global.TimeMin / 10, Down);
Global.SpawnPositionMaxId += 1;
disabled Start Rule(GameLogicAddNextHeroInGame, Restart Rule);
Else If(Global.TimeSec == 30);
Global.SpawnPositionMaxId += 1;
End;
Loop If Condition Is True;
}
}
rule("SUBROUTINE: GAME LOGIC - ADD NEXT HERO IN GAME")
{
event
{
Subroutine;
GameLogicAddNextHeroInGame;
}
actions
{
"REDUCE RESPAWN TIME FOR ZENS"
disabled Global.ZenRespawnTime -= 1.500;
disabled Global.ZenRespawnTime = Max(1, Global.ZenRespawnTime);
disabled Set Respawn Max Time(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Global.DefaultHeroBotsPool[0]),
Global.ZenRespawnTime);
"ALL HEROES WAS ADDED IN GAME"
Abort If(Global.DefaultHeroBotsPoolCurrentId == Count Of(Global.DefaultHeroBotsPool) - 1);
Global.DefaultHeroBotsPoolCurrentId += 1;
"ВРЕМЕННЫЙ КОСТЫЛЬ ЧТОБЫ ЭХО ЗАМЕНИЛА ХАМСТЕРА"
If(Global.DefaultHeroBotsPool[Global.DefaultHeroBotsPoolCurrentId] == Hero(Echo));
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Wrecking Ball)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Wrecking Ball))[0];
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.050, Ignore Condition);
Create Dummy Bot(Hero(Echo), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Abort;
End;
"ABORT IF NEXT HERO IN ARRAY ORDER IS NULL"
Abort If(Global.DefaultHeroBotsPool[Global.DefaultHeroBotsPoolCurrentId] == Null);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.050, Ignore Condition);
Create Dummy Bot(Global.DefaultHeroBotsPool[Global.DefaultHeroBotsPoolCurrentId], Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
}
rule("SUBROUTINE: GAME LOGIC - SET BOT PROPERTIES")
{
event
{
Subroutine;
GameLogicSetBotProperties;
}
actions
{
Abort If(Event Player.BotIsOrisaChild == True);
If(Global.TimeMin >= 10);
If(Filtered Array(Global.lastBoss, Current Array Element == Hero Of(Event Player)) == False);
If(Global.activeBoss == False);
If(Global.bossTrigger < Global.TimeMin);
Global.bossTrigger = Global.TimeMin;
Global.activeBoss = Event Player;
Event Player.isBoss = 1;
Big Message(All Players(Team 1), Custom String("BOSS SPAWNED - {0}", Hero Of(Event Player)));
End;
End;
End;
End;
"PROPERTIES BY DEFAULT"
Set Gravity(Event Player, 100);
Set Damage Dealt(Event Player, 100);
Set Respawn Max Time(Event Player, 10);
Start Scaling Player(Event Player, 1, False);
"INDIVIDUAL HERO'S PROPERTIES"
If(Hero Of(Event Player) == Hero(Zenyatta));
If(Event Player.isBoss == 1);
Set Move Speed(Event Player, 30);
Set Max Health(Event Player, 10 * (100 + 10 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 1.500, False);
Else;
If(20 + 3 * Number Of Players(Team 1) + 3 * Global.TimeMin > 75);
Set Move Speed(Event Player, 75);
Else;
Set Move Speed(Event Player, 20 + 3 * Count Of(All Players(Team 1)) + 3 * Global.TimeMin);
End;
Set Max Health(Event Player, 100 + 10 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min);
End;
Else If(Hero Of(Event Player) == Hero(Wrecking Ball));
If(Event Player.isBoss == 1);
Set Move Speed(Event Player, 20);
Set Max Health(Event Player, 5 * (70 + 20 * Count Of(All Players(Team 1)) + 10 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 2, False);
Else;
If(30 + Global.TimeMin + 2.500 * Global.Time5Min > 40);
Set Move Speed(Event Player, 40);
Else;
Set Move Speed(Event Player, 30 + Global.TimeMin + 2.500 * Global.Time5Min);
End;
Set Ultimate Charge(Event Player, 0);
Set Max Health(Event Player, 70 + 20 * Count Of(All Players(Team 1)) + 10 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min);
End;
Else If(Hero Of(Event Player) == Hero(Widowmaker));
If(Event Player.isBoss == 1);
Set Damage Dealt(Event Player, 2 * (85 + 15 * Count Of(All Players(Team 1)) + 25 * Global.Time5Min + 50 * Global.Time10Min));
Set Move Speed(Event Player, 100);
Set Max Health(Event Player, 5 * (100 + 25 * Count Of(All Players(Team 1)) + 5 * Global.TimeMin + 15 * Global.Time5Min + 40 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 2, False);
Else;
Event Player.BotCounter = 0;
Set Damage Dealt(Event Player, 85 + 15 * Count Of(All Players(Team 1)) + 25 * Global.Time5Min + 50 * Global.Time10Min);
Set Move Speed(Event Player, 100);
Set Max Health(Event Player, 100 + 25 * Count Of(All Players(Team 1)) + 5 * Global.TimeMin + 15 * Global.Time5Min + 40 * Global.Time10Min);
End;
Else If(Hero Of(Event Player) == Hero(Bastion));
If(Event Player.isBoss == 1);
Set Move Speed(Event Player, 50);
Set Damage Dealt(Event Player, 85 + 5 * Count Of(All Players(Team 1)) + 5 * Global.Time5Min + 10 * Global.Time10Min);
Start Scaling Player(Event Player, 3, False);
Set Max Health(Event Player, 5 * (155 + 150 * Count Of(All Players(Team 1)) + 20 * Global.TimeMin + 40 * Global.Time5Min + 65 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Else;
Set Move Speed(Event Player, 80);
Set Damage Dealt(Event Player, 85 + 5 * Count Of(All Players(Team 1)) + 5 * Global.Time5Min + 10 * Global.Time10Min);
Start Scaling Player(Event Player, 2, False);
Set Max Health(Event Player, 155 + 150 * Count Of(All Players(Team 1)) + 20 * Global.TimeMin + 40 * Global.Time5Min + 65 * Global.Time10Min);
End;
Else If(Hero Of(Event Player) == Hero(Orisa));
If(Event Player.isBoss == 1);
Start Scaling Player(Event Player, 1.800, False);
Set Max Health(Event Player, 5 * (220 + Count Of(All Players(Team 1)) * 80 + 50 * Global.Time5Min + 100 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Set Move Speed(Event Player, 30 + 5 * Global.Time5Min);
Else;
Start Scaling Player(Event Player, 1.800, False);
Set Max Health(Event Player, 220 + Count Of(All Players(Team 1)) * 80 + 50 * Global.Time5Min + 100 * Global.Time10Min);
Set Move Speed(Event Player, 90 + 5 * Global.Time5Min);
End;
Else If(Hero Of(Event Player) == Hero(Echo));
If(Event Player.isBoss == 1);
Set Gravity(Event Player, 40);
Set Move Speed(Event Player, 70 + 5 * Global.Time5Min);
Set Respawn Max Time(Event Player, 18);
Set Max Health(Event Player, 5 * (90 + 25 * Count Of(All Players(Team 1)) + 15 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Start Scaling Player(Event Player, 2, False);
Else;
Set Gravity(Event Player, 40);
Set Move Speed(Event Player, 130 + 5 * Global.Time5Min);
Set Respawn Max Time(Event Player, 18);
Set Max Health(Event Player, 90 + 25 * Count Of(All Players(Team 1)) + 15 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min);
End;
Else If(Hero Of(Event Player) == Hero(Reinhardt));
If(Event Player.isBoss == 1);
Start Scaling Player(Event Player, 1.500, False);
Set Move Speed(Event Player, 70);
Set Damage Dealt(Event Player, 100 + 5 * Count Of(All Players(Team 1)) + 5 * Global.Time5Min + 10 * Global.Time10Min);
Set Respawn Max Time(Event Player, 15);
Set Max Health(Event Player, 5 * (55 + 25 * Count Of(All Players(Team 1)) + 15 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min) * (
Global.UpgradeBossHealthValue >= Global.UpgradeCriticalDamageMaxValue[2] ? 0.900 : 1));
Else;
disabled Start Scaling Player(Event Player, 0.850, False);
Set Move Speed(Event Player, 110);
Set Damage Dealt(Event Player, 100 + 5 * Count Of(All Players(Team 1)) + 5 * Global.Time5Min + 10 * Global.Time10Min);
Set Respawn Max Time(Event Player, 15);
Set Max Health(Event Player, 55 + 25 * Count Of(All Players(Team 1)) + 15 * Global.TimeMin + 25 * Global.Time5Min + 50 * Global.Time10Min);
End;
End;
Wait(0.250, Ignore Condition);
"FILL HEALTH"
Heal(Event Player, Null, 100000);
}
}
disabled rule("=== GATE ===")
{
event
{
Ongoing - Global;
}
}
rule("Subroutine: GATE REPAIR")
{
event
{
Subroutine;
GateRepair;
}
actions
{
Small Message(Event Player, Custom String("REPAIR +2% ULTIMATE"));
"UPGRADE - GATE'S MAX HEALTH"
If(Global.UpgradeGateMaxHealthValue < Global.UpgradeGateMaxHealthMaxValue[2]);
If(Event Player.IsNanoed == 1);
If(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[1]);
Global.UpgradeGateMaxHealthValue += 100 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 20;
Else;
Global.UpgradeGateMaxHealthValue += 50 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 10;
End;
Else;
If(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[1]);
Global.UpgradeGateMaxHealthValue += 50 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 10;
Else;
Global.UpgradeGateMaxHealthValue += 25 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 5;
End;
End;
End;
"HEAL GATE"
If(Event Player.IsNanoed == 1);
If(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[1]);
Global.GateHealth += 100 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 20;
Else;
Global.GateHealth += 50 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 10;
End;
Else;
If(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[1]);
Global.GateHealth += 50 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 10;
Else;
Global.GateHealth += 25 - (Number Of Players(Team 1) <= 3 ? Number Of Players(Team 1) : 3) * 5;
End;
If(Global.GateHealth > Global.GateMaxHealth);
Global.GateHealth = Global.GateMaxHealth;
"CHARGE ULTIMATE"
Else;
Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 2);
End;
End;
"UPDATE GATE'S HEALTH BAR"
Start Rule(GateProgressBarColor, Restart Rule);
}
}
rule("TORB: GATE REPAIR")
{
event
{
Ongoing - Each Player;
Team 1;
Torbjörn;
}
conditions
{
Has Spawned(Event Player) == True;
Weapon(Event Player) == 2;
Is Firing Primary(Event Player) == True;
Global.GateHealth < Global.GateMaxHealth;
Is In View Angle(Event Player, Global.GateRepairPosition, 80) == True;
Distance Between(Position Of(Event Player), Global.GatePosition) < 3.500;
Is Game In Progress == True;
}
actions
{
Call Subroutine(GateRepair);
Wait(Is Using Ability 2(Event Player) == True ? 0.350 : 0.700, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Brig: GATE REPAIR")
{
event
{
Ongoing - Each Player;
Team 1;
Brigitte;
}
conditions
{
Has Spawned(Event Player) == True;
Is Firing Primary(Event Player) == True;
Global.GateHealth < Global.GateMaxHealth;
Is In View Angle(Event Player, Global.GateRepairPosition, 80) == True;
Distance Between(Position Of(Event Player), Global.GatePosition) < 5;
Is Game In Progress == True;
}
actions
{
Call Subroutine(GateRepair);
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Rein: GATE REPAIR")
{
event
{
Ongoing - Each Player;
Team 1;
Reinhardt;
}
conditions
{
Has Spawned(Event Player) == True;
Is Firing Primary(Event Player) == True;
Global.GateHealth < Global.GateMaxHealth;
Is In View Angle(Event Player, Global.GateRepairPosition, 80) == True;
Distance Between(Position Of(Event Player), Global.GatePosition) < 3;
Is Game In Progress == True;
}
actions
{
Wait(0.100, Ignore Condition);
Call Subroutine(GateRepair);
Wait(0.850, Ignore Condition);
Loop If Condition Is True;
}
}
rule("SUBROUTINE: GATE PROGRESS BAR COLOR")
{
event
{
Subroutine;
GateProgressBarColor;
}
actions
{
Stop Chasing Global Variable(GateHealthChase);
Chase Global Variable Over Time(GateHealthChase, Global.GateHealth, 0.100, Destination and Duration);
"GATE WAS DAMAGED"
If(Global.GateHealth < Global.GateHealthEvent);
For Global Variable(LoopIterator1, 0, 3, 1);
Global.GateProgressBarColorCurrent = Color(Red);
Wait(0.030, Ignore Condition);
Global.GateProgressBarColorCurrent = Color(White);
Wait(0.030, Ignore Condition);
End;
"GATE WAS REPAIRED"
Else;
Global.GateProgressBarColorCurrent = Color(Green);
Wait(0.030, Ignore Condition);
Global.GateProgressBarColorCurrent = Color(Yellow);
Wait(0.030, Ignore Condition);
End;
Global.GateHealthEvent = Global.GateHealth;
Global.GateProgressBarColorComponent = Global.GateHealth * 255 / Global.GateMaxHealth;
Global.GateProgressBarColorCurrent = Custom Color(255, Global.GateProgressBarColorComponent, Global.GateProgressBarColorComponent,
255);
}
}
disabled rule("=== COMMON MECHANICS ===")
{
event
{
Ongoing - Global;
}
}
rule("ALL: INIT")
{
event
{
Player Joined Match;
All;
All;
}
actions
{
"ALL (COMMON) INIT"
Event Player.IsDead = True;
Disable Kill Feed(Event Player);
Disable Game Mode In-World UI(Event Player);
Disable Death Spectate Target HUD(Event Player);
"BOT INIT"
If(Is Dummy Bot(Event Player));
Call Subroutine(BotInit);
"PLAYER INIT"
Else;
Call Subroutine(PlayerInit);
End;
}
}
rule("SUBROUTINE: BOT - INIT")
{
event
{
Subroutine;
BotInit;
}
actions
{
"INIT VARS"
Event Player.HasBadStatus = False;
Event Player.IsRespawning = False;
Event Player.BotDoesUniqueBehaviour = False;
Event Player.BotEventPosition = Vector(9999, 999, 9999);
"DISABLE ALL FOR BOT"
Disable Hero HUD(Event Player);
Disable Messages(Event Player);
Disable Text Chat(Event Player);
Disable Scoreboard(Event Player);
Disable Game Mode HUD(Event Player);
Disable Death Spectate All Players(Event Player);
Disable Voice Chat(Event Player, True, True, True);
"INIT AI NAVIGATION VARS"
Call Subroutine(BotResetPathFinding);
}
}
rule("SUBROUTINE: PLAYER - INIT")
{
event
{
Subroutine;
PlayerInit;
}
actions
{
"STORY HEROES"
If(Global.IsStoryHeroes);
Reset Player Hero Availability(Event Player);
Set Player Allowed Heroes(Event Player, Array(Hero(Ana), Hero(Brigitte), Hero(Mercy), Hero(Lúcio), Hero(Moira), Hero(Baptiste),
Hero(Ashe), Hero(D.Va), Hero(Genji), Hero(Hanzo), Hero(Widowmaker), Hero(Cassidy), Hero(Reinhardt), Hero(Soldier: 76), Hero(
Torbjörn), Hero(Tracer), Hero(Winston), Hero(Pharah)));
End;
"TEAM CHALLENGE - PLAYER'S MAX HEALTH"
If(Global.UpgradePlayerMaxHealthValue >= Global.UpgradePlayerMaxHealthMaxValue[0]);
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
End;
If(Is Game In Progress);
Disable Game Mode HUD(Event Player);
End;
}
}
rule("ALL: RESPAWN")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
(Hero Of(Event Player) != Event Player.CurrentHero || Event Player.IsDead == True) == True;
}
actions
{
Event Player.IsDead = False;
"BOT RESPAWN"
If(Is Dummy Bot(Event Player));
Call Subroutine(BotRespawn);
If(Global.IsDebugAINavigation);
Create Beam Effect(All Players(All Teams), Good Beam, Eye Position(Event Player), Event Player.BotNextNodePosition, Color(Green),
Visible To Position and Radius);
End;
"PLAYER RESPAWN"
Else;
Call Subroutine(PlayerRespawn);
End;
"MUST BE AFTER ALL RESPAWN SUBROUTINES!"
Event Player.CurrentHero = Hero Of(Event Player);
}
}
rule("SUBROUTINE: BOT - RESPAWN")
{
event
{
Subroutine;
BotRespawn;
}
actions
{
"RESET COMMON PROPERTIES"
Event Player.IsRespawning = True;
Enable Nameplates(Event Player, All Players(Team 1));
Call Subroutine(BotResetPathFinding);
disabled If(Hero Of(Event Player) != Event Player.CurrentHero);
Call Subroutine(GameLogicSetBotProperties);
disabled End;
"INDIVIDUAL HERO'S RESPAWN SCRIPTS"
If(Hero Of(Event Player) == Hero(Bastion));
Call Subroutine(BotBastionRespawn);
Else If(Hero Of(Event Player) == Hero(Zenyatta));
Call Subroutine(BotZenyattaRespawn);
Else If(Hero Of(Event Player) == Hero(Widowmaker));
Call Subroutine(BotWidowRespawn);
Else If(Hero Of(Event Player) == Hero(Wrecking Ball));
Call Subroutine(BotBallRespawn);
Else If(Hero Of(Event Player) == Hero(Orisa));
Call Subroutine(BotOrisaRespawn);
Else If(Hero Of(Event Player) == Hero(Echo));
Call Subroutine(BotEchoRespawn);
Else If(Hero Of(Event Player) == Hero(Reinhardt));
Call Subroutine(BotReinRespawn);
End;
Event Player.IsRespawning = False;
}
}
rule("SUBROUTINE: PLAYER - RESPAWN")
{
event
{
Subroutine;
PlayerRespawn;
}
actions
{
"TEAM CHALLENGE - MAX AMMO"
If(Hero Of(Event Player) != Event Player.CurrentHero && Global.UpgradeMaxAmmoValue >= Global.UpgradeMaxAmmoMaxValue[0]);
Set Max Ammo(Event Player, 0, Ammo(Event Player, 0) * 2);
Set Max Ammo(Event Player, 1, Ammo(Event Player, 1) * 2);
Set Ammo(Event Player, 0, Max Ammo(Event Player, 0));
Set Ammo(Event Player, 1, Max Ammo(Event Player, 1));
End;
"MUST BE AFTER TEAM CHALLENGE MAX AMMO!"
disabled Event Player.CurrentHero = Hero Of(Event Player);
"PLAYER RESPAWN"
Set Status(Event Player, Null, Phased Out, 3);
Set Facing(Event Player, Vector(-1, 0, 0), To World);
If(Ability Cooldown(Players On Hero(Hero(Mercy), Team 1), Button(Ability 2)) >= 29);
Wait(0.250, Ignore Condition);
Teleport(Event Player, Event Player.deathPosition);
Else;
Teleport(Event Player, Global.PlayerSpawnPositions[Slot Of(Event Player) == Count Of(Global.PlayerSpawnPositions) ? Random Integer(
0, Count Of(Global.PlayerSpawnPositions) - 1) : Slot Of(Event Player)]);
End;
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
}
}
rule("PLAYER: DEATH")
{
event
{
Player Died;
Team 1;
All;
}
actions
{
If(Hero Of(Event Player) == Hero(Roadhog));
Event Player.Abilities[8] -= 1;
Wait(Global.Perk[2] ? 5 : 10, Ignore Condition);
Event Player.Abilities[8] += 1;
End;
Event Player.deathPosition = Position Of(Event Player);
disabled If(Event Player.lastSecondWind > 0);
disabled Event Player.lastSecondWind = 0;
disabled End;
Event Player.IsDead = True;
}
}
rule("BOT: DEATH")
{
event
{
Player Died;
Team 2;
All;
}
actions
{
If(Event Player.isBoss == 1);
If(Global.UpgradePerkSharpshooterValue >= Global.UpgradeCriticalDamageMaxValue[1]);
If(Global.UpgradeBossHealthValue < Global.UpgradeCriticalDamageMaxValue[2]);
Global.UpgradeBossHealthValue += 1;
Small Message(All Players(Team 1), Custom String("-10% BOSS HEALTH CHALLENGE +1"));
End;
End;
Event Player.isBoss = 0;
Global.activeBoss = Null;
Big Message(All Players(Team 1), Custom String("BOSS DIED - {0}", Hero Of(Event Player)));
End;
Event Player.IsDead = True;
Event Player.HasBadStatus = False;
Event Player.BotDoesUniqueBehaviour = False;
Disable Nameplates(Event Player, All Players(Team 1));
disabled Stop Holding Button(Event Player, Button(Ability 1));
disabled Stop Holding Button(Event Player, Button(Primary Fire));
disabled Stop Holding Button(Event Player, Button(Secondary Fire));
"BOT HAS 1 EFFECT IN VAR (NOT ARRAY)"
Skip If(!Entity Exists(Event Player.BotEffects), 1);
Destroy Effect(Event Player.BotEffects);
"BOT HAS MORE THEN 1 EFFECT IN VAR (ARRAY)"
Skip If(Count Of(Event Player.BotEffects) == 0, 3);
For Player Variable(Event Player, BotLoopIterator1, 0, Count Of(Event Player.BotEffects), 1);
Destroy Effect(Event Player.BotEffects[Event Player.BotLoopIterator1]);
End;
}
}
disabled rule("=== BOT COMMON MECHANICS ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: BAD STATUS")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.HasBadStatus == False;
(Has Status(Event Player, Hacked) || Has Status(Event Player, Frozen) || Has Status(Event Player, Knocked Down) || Has Status(
Event Player, Asleep) || Has Status(Event Player, Stunned)) == True;
}
actions
{
Event Player.HasBadStatus = True;
"PROCESS BAD STATUS"
If(Hero Of(Event Player) == Hero(Widowmaker));
Start Rule(BotWidowBadStatus, Do Nothing);
End;
Wait Until(!Has Status(Event Player, Knocked Down) && !Has Status(Event Player, Asleep) && !Has Status(Event Player, Frozen)
&& !Has Status(Event Player, Stunned), 15);
Event Player.HasBadStatus = False;
}
}
rule("SUBROUTINE: BOT - LANDING FROM SKY")
{
event
{
Subroutine;
BotLandingFromSky;
}
actions
{
Stop Throttle In Direction(Event Player);
"SET RESPAWN POSITION"
Event Player.BotEventPosition = Random Value In Array(Global.BigBossSpawnPositions);
"CREATE EFFECTS"
disabled Create Effect(All Players(All Teams), Light Shaft, Color(Red), Event Player.BotEventPosition, 3, Visible To);
disabled Event Player.BotEffects = Last Created Entity;
"RESPAWN IN LIGHT SHAFT EFFECT"
Teleport(Event Player, Event Player.BotEventPosition + Vector(0, 25, 0));
Wait(0.020, Ignore Condition);
"SLOW LANDING"
Set Gravity(Event Player, 50);
While(Is In Air(Event Player) == True);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Orange), Position Of(Event Player) + Vector(0, -2.700, 0), 2);
Wait(0.250, Ignore Condition);
End;
Set Gravity(Event Player, 100);
disabled Destroy Effect(Event Player.BotEffects);
"LANDING EFFECTS"
Play Effect(All Players(All Teams), Wrecking Ball Piledriver Impact Effect, Custom Color(105, 87, 46, 255), Position Of(
Event Player), 8);
Play Effect(All Players(All Teams), Doomfist Meteor Strike Impact Sound, Color(White), Position Of(Event Player), 150);
}
}
rule("SUBROUTINE: BOT - APPEAR FROM UNDERGROUND")
{
event
{
Subroutine;
BotApearFromUnderground;
}
actions
{
Set Status(Event Player, Null, Knocked Down, 1);
Wait(0.200, Ignore Condition);
Set Gravity(Event Player, 20);
Disable Movement Collision With Environment(Event Player, True);
Teleport(Event Player, Global.ZenSpawnPositions[Random Integer(Min(Global.TimeMin, Count Of(Global.ZenSpawnPositions) - 10), Min(
Global.SpawnPositionMaxId, Count Of(Global.ZenSpawnPositions) - 4))] + Vector(0, -1.500, 0));
Wait(0.016, Ignore Condition);
Play Effect(All Players(All Teams), Sigma Accretion Impact Effect, Custom Color(220, 175, 100, 255), Eye Position(Event Player),
3);
Play Effect(All Players(All Teams), Sigma Accretion Impact Sound, Color(Gray), Eye Position(Event Player), 50);
Apply Impulse(Event Player, Up, 3.500, To World, Cancel Contrary Motion);
Wait(0.400, Ignore Condition);
Clear Status(Event Player, Knocked Down);
Set Gravity(Event Player, 100);
Enable Movement Collision With Environment(Event Player);
}
}
disabled rule("=== PLAYER MECHANICS ===")
{
event
{
Ongoing - Global;
}
}
disabled rule("PLAYER: DARKNESS")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Button Held(Event Player, Button(Ultimate)) == True;
!Entity Exists(Event Player.BotEffects) == True;
}
actions
{
Disable Nameplates(Event Player, All Players(All Teams));
Start Forcing Player Outlines(Event Player, All Players(All Teams), False, Color(White), Default);
Create Effect(Event Player, Bad Aura, Color(Black), Update Every Frame(Eye Position(Event Player) + Vector(0, 2, 0)
+ Facing Direction Of(Event Player) * 14), 25, Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
Create Effect(Event Player, Bad Aura, Color(Black), Update Every Frame(Eye Position(Event Player) + World Vector Of(Vector(-5, 0,
3), Event Player, Rotation) + Facing Direction Of(Event Player) * 10), 25, Visible To Position and Radius);
Create Effect(Event Player, Bad Aura, Color(Black), Update Every Frame(Eye Position(Event Player) + World Vector Of(Vector(5, 0,
3), Event Player, Rotation) + Facing Direction Of(Event Player) * 10), 25, Visible To Position and Radius);
}
}
rule("PLAYER: HEALTH REGEN")
{
event
{
Player Took Damage;
Team 1;
All;
}
actions
{
Stop Heal Over Time(Event Player.HealOverTimeId);
Event Player.EventHealth = Health(Event Player);
Wait(4, Ignore Condition);
"TOOK DAMAGE, RESET REGENERATION TIMER"
Loop If(Is Alive(Event Player) && Event Player.EventHealth > Health(Event Player));
Start Heal Over Time(Event Player, Null, 3, Max Health(Event Player) / 3);
Event Player.HealOverTimeId = Last Heal Over Time ID;
}
}
disabled rule("=== NERFS ===")
{
event
{
Ongoing - Global;
}
}
disabled rule("REINHARDT: ANTI-CHARGE FOR BASTION & ORISA")
{
event
{
Ongoing - Each Player;
Team 1;
Reinhardt;
}
conditions
{
Has Spawned(Event Player) == True;
Is Using Ability 1(Event Player) == True;
Hero Of(Ray Cast Hit Player(Eye Position(Event Player) + Vector(0, 2, 0), Eye Position(Event Player) + Vector(0, 2, 0)
+ Facing Direction Of(Event Player) * 2, All Living Players(Team 2), Event Player, True)) == (Hero(Bastion) == True || Hero(
Orisa) == True);
}
actions
{
Set Status(Event Player, Null, Knocked Down, 1.500);
}
}
rule("HOG: ANTI-HOOK FOR BASTION & ORISA")
{
event
{
Player Dealt Damage;
Team 1;
Roadhog;
}
conditions
{
Event Ability == Button(Ability 1);
(Hero Of(Victim) == Hero(Bastion) || Hero Of(Victim) == Hero(Orisa)) == True;
}
actions
{
Set Status(Event Player, Null, Stunned, 0.005);
}
}
disabled rule("=== ZENYATTA ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: ZEN - REACHED THE GATE")
{
event
{
Ongoing - Each Player;
Team 2;
Zenyatta;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
}
actions
{
Set Ammo(Event Player, 0, 0);
Communicate(Event Player, Hello);
disabled Call Subroutine(BotResetPathFinding);
Wait(1.500, Ignore Condition);
Abort If(Is Dead(Event Player) == True);
Kill(Event Player, Null);
}
}
rule("BOT: ZEN - DEATH")
{
event
{
Player Died;
Team 2;
Zenyatta;
}
actions
{
"EFFECT"
Play Effect(All Players(All Teams), Junkrat Frag Launcher Explosion Effect, Color(Red), Eye Position(Event Player), 2.500);
Play Effect(All Players(All Teams), Ashe Dynamite Explosion Sound, Color(Red), Eye Position(Event Player), 70);
"DAMAGE AND APPLY IMPULSE TO PLAYERS"
Event Player.BotPlayersInRadius = Players Within Radius(Position Of(Event Player), 2.500, All Teams, Surfaces And Enemy Barriers);
For Player Variable(Event Player, BotLoopIterator1, 0, Count Of(Event Player.BotPlayersInRadius), 1);
Apply Impulse(Event Player.BotPlayersInRadius[Event Player.BotLoopIterator1], Direction Towards(Position Of(Event Player),
Eye Position(Event Player.BotPlayersInRadius[Event Player.BotLoopIterator1])), 5, To World, Incorporate Contrary Motion);
If(Team Of(Event Player.BotPlayersInRadius[Event Player.BotLoopIterator1]) == Team 1);
Damage(Event Player.BotPlayersInRadius[Event Player.BotLoopIterator1], Event Player, 50);
End;
End;
"DAMAGE GATE"
If(Distance Between(Position Of(Event Player), Global.GatePosition) < 3 && Is In Line of Sight(Eye Position(Event Player),
Global.GatePosition, Enemy Barriers Block LOS));
If(Event Player.isBoss == 1);
Global.GateHealth -= 125;
Else;
Global.GateHealth -= 25;
End;
Start Rule(GateProgressBarColor, Restart Rule);
Respawn(Event Player);
Abort;
End;
"KILLED BY PLAYER"
Teleport(Event Player, Vector(0, -999, 0));
Wait(2, Ignore Condition);
Respawn(Event Player);
Wait(2, Ignore Condition);
}
}
rule("SUBROUTINE: ZEN - RESPAWN")
{
event
{
Subroutine;
BotZenyattaRespawn;
}
actions
{
Call Subroutine(BotApearFromUnderground);
Event Player.BotTargetPosition = Global.GatePosition;
Event Player.BotIsPathFinding = True;
Start Rule(BotStartPathFinding, Do Nothing);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
Direction and Turn Rate);
}
}
disabled rule("=== WRECKING BALL ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: BALL - REACHED THE GATE")
{
event
{
Ongoing - Each Player;
Team 2;
Wrecking Ball;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
disabled Distance Between(Position Of(Event Player), Global.GatePosition) < 3;
}
actions
{
Start Holding Button(Event Player, Button(Ability 1));
Set Ammo(Event Player, 0, 0);
Wait(1, Ignore Condition);
Set Ultimate Charge(Event Player, 100);
Start Holding Button(Event Player, Button(Ultimate));
Wait Until(Is Using Ultimate(Event Player), 0.600);
Abort If(Is Dead(Event Player));
Kill(Event Player, Null);
Play Effect(All Players(All Teams), Junkrat RIP Tire Explosion Effect, Color(Orange), Eye Position(Event Player), 6);
Play Effect(All Players(All Teams), DVa Self Destruct Explosion Sound, Color(White), Eye Position(Event Player), 250);
If(Distance Between(Position Of(Event Player), Global.GatePosition) < 3.500 && Is In Line of Sight(Eye Position(Event Player),
Global.GatePosition, Enemy Barriers Block LOS));
If(Event Player.isBoss == 1);
Global.GateHealth -= 300;
Else;
Global.GateHealth -= 150;
End;
Start Rule(GateProgressBarColor, Restart Rule);
End;
Damage(Players Within Radius(Eye Position(Event Player), 7, Team 1, Surfaces And All Barriers), Event Player, 200);
}
}
rule("BOT: BALL - ALTERNATIVE FORM")
{
event
{
Ongoing - Each Player;
Team 2;
Wrecking Ball;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is In Alternate Form(Event Player) == False;
}
actions
{
Start Holding Button(Event Player, Button(Ability 1));
Wait Until(Is In Alternate Form(Event Player), 10);
Stop Holding Button(Event Player, Button(Ability 1));
}
}
rule("BOT: BALL - DEATH")
{
event
{
Player Died;
Team 2;
Wrecking Ball;
}
actions
{
Stop Holding Button(Event Player, Button(Ability 1));
Stop Holding Button(Event Player, Button(Ultimate));
}
}
rule("SUBROUTINE: BALL - RESPAWN")
{
event
{
Subroutine;
BotBallRespawn;
}
actions
{
"RESPAWN IN AIR"
Teleport(Event Player, Random Value In Array(Global.BallSpawnPositions) + Vector(0, 20, 0));
Stop Holding Button(Event Player, Button(Ultimate));
Wait(0.250, Ignore Condition);
"LANDING"
Start Holding Button(Event Player, Button(Crouch));
Wait Until(Is On Ground(Event Player), 9999);
Stop Holding Button(Event Player, Button(Crouch));
"LANDING IMPACT EFFECT"
Play Effect(All Players(All Teams), Sigma Accretion Impact Sound, Color(White), Event Player, 150);
Play Effect(All Players(All Teams), Doomfist Meteor Strike Impact Effect, Color(Gray), Position Of(Event Player), 10);
Create Effect(All Players(All Teams), Bad Aura, Color(Orange), Eye Position(Event Player), 1.500, Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
"PATH FINDING TO GATE"
Event Player.BotTargetPosition = Global.GatePosition;
Event Player.BotIsPathFinding = True;
Start Rule(BotStartPathFinding, Do Nothing);
}
}
disabled rule("=== ECHO ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: ECHO - FLY ABILITY")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
Is Using Ability 1(Event Player) == False;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 1), 0);
Press Button(Event Player, Button(Ability 1));
Wait(0.300, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: ECHO - BEAM ABILITY")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Is Using Ability 1(Event Player) == False;
Event Player.BotDoesUniqueBehaviour == True;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 2), 0);
Press Button(Event Player, Button(Ability 2));
}
}
rule("BOT: ECHO - BAD STATUS - RESET BEAM")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.HasBadStatus == True;
disabled (Has Status(Event Player, Hacked) || Has Status(Event Player, Frozen) || Has Status(Event Player, Knocked Down) || Has Status(
Event Player, Asleep) || Has Status(Event Player, Stunned)) == True;
}
actions
{
If(Event Player.BotDoesUniqueBehaviour);
Call Subroutine(BotEchoDetachPlayer);
End;
Wait Until(Event Player.HasBadStatus, 7);
}
}
rule("BOT: ECHO - CAN'T SEE PORTAL - APPLY IMPULSE")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotDoesUniqueBehaviour == True;
Is In Line of Sight(Position Of(Event Player), Global.BotEchoRespawnPosition, Barriers Do Not Block LOS) == False;
}
actions
{
Wait(0.300, Abort When False);
Apply Impulse(Event Player, Vector(Random Integer(-1, 1), 1, Random Integer(-1, 1)), 20, To World, Incorporate Contrary Motion);
Wait(1, Ignore Condition);
If(!Is In Line of Sight(Position Of(Event Player), Global.BotEchoRespawnPosition, Barriers Do Not Block LOS));
Event Player.BotTargetPosition = Global.BotEchoRespawnPosition;
Start Rule(BotStartPathFinding, Restart Rule);
Else;
Call Subroutine(BotResetPathFinding);
End;
Loop If Condition Is True;
}
}
disabled rule("BOT: ECHO - MAIN LOGIC - BACKUP")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
}
actions
{
If(!Event Player.BotIsPathFinding);
Event Player.BotSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Is In Line of Sight(Eye Position(Event Player),
Eye Position(Current Array Element), Barriers Do Not Block LOS) == True), Distance Between(Position Of(Event Player),
Position Of(Current Array Element)))[0];
End;
"NO PLAYERS IN VIEW RANGE"
disabled If(Event Player.BotSeePlayer == Null);
disabled Stop Throttle In Direction(Event Player);
disabled End;
"FLY TO PLAYER"
If(Event Player.BotSeePlayer != Null && Distance Between(Position Of(Event Player), Position Of(Event Player.BotSeePlayer))
> 4 && Event Player.BotDoesUniqueBehaviour == False);
Event Player.BotTargetPlayer = Event Player.BotSeePlayer;
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer)), 300, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer)),
1, To World, Replace existing throttle, Direction and Magnitude);
Start Holding Button(Event Player, Button(Jump));
"ACTIVATE FOCUS BEAM"
Else If(Event Player.BotSeePlayer != Null && Distance Between(Position Of(Event Player), Position Of(Event Player.BotSeePlayer))
< 4 && Event Player.BotDoesUniqueBehaviour == False && Event Player.HasBadStatus == False);
Event Player.BotDoesUniqueBehaviour = True;
Set Status(Event Player.BotSeePlayer, Event Player, Stunned, 1);
Set Status(Event Player.BotSeePlayer, Event Player, Hacked, 99999);
Attach Players(Event Player.BotSeePlayer, Event Player, Vector(0, 0, 2));
Press Button(Event Player, Button(Ability 2));
"TELEPORT PLAYER TO AWAY"
Else If(Event Player.BotDoesUniqueBehaviour && Distance Between(Position Of(Event Player.BotSeePlayer),
Global.BotEchoRespawnPosition) < 4);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(White), Global.BotEchoRespawnPosition, 1);
Teleport(Event Player.BotSeePlayer, Random Value In Array(Global.BotEchoTeleportPositions));
Set Status(Event Player.BotSeePlayer, Event Player, Knocked Down, 1);
Call Subroutine(BotEchoDetachPlayer);
"BEGIN TO FLY TO THE PORTAL"
Else If(Event Player.BotDoesUniqueBehaviour == True);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.BotEchoRespawnPosition), 100, To World,
Direction and Turn Rate);
"BOT SEES THE PORTAL"
If(Is In Line of Sight(Position Of(Event Player), Global.BotEchoRespawnPosition, Barriers Do Not Block LOS));
"RESET PATH FINDING"
If(Event Player.BotIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Global.BotEchoRespawnPosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
"BOT DOES NOT SEE THE PORTAL"
Else If(!Event Player.BotIsPathFinding);
Event Player.BotTargetPlayer = Event Player.BotSeePlayer;
Stop Holding Button(Event Player, Button(Jump));
Start Rule(BotStartPathFinding, Restart Rule);
End;
End;
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: ECHO - MAIN LOGIC - LOOP")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
}
actions
{
If(Event Player.BotDoesUniqueBehaviour == False);
Event Player.BotSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)
== True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
End;
"TELEPORT PLAYER SO FAR"
If(Event Player.BotDoesUniqueBehaviour && Distance Between(Position Of(Event Player.BotEchoCapturedPlayer),
Global.BotEchoRespawnPosition) < 4);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(White), Global.BotEchoRespawnPosition, 1);
Teleport(Event Player.BotEchoCapturedPlayer, Random Value In Array(Global.BotEchoTeleportPositions));
Set Status(Event Player.BotEchoCapturedPlayer, Event Player, Knocked Down, 1);
Call Subroutine(BotEchoDetachPlayer);
End;
"BEGIN TO FLY TO THE PORTAL WITH A PLAYER"
If(Event Player.BotDoesUniqueBehaviour);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.BotEchoRespawnPosition), 100, To World,
Direction and Turn Rate);
"BOT SEES THE PORTAL"
If(Is In Line of Sight(Position Of(Event Player), Global.BotEchoRespawnPosition, Barriers Do Not Block LOS));
"RESET PATH FINDING"
If(Event Player.BotIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Global.BotEchoRespawnPosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
"BOT DOES NOT SEE THE PORTAL"
Else If(!Event Player.BotIsPathFinding);
Event Player.BotTargetPlayer = Event Player.BotEchoCapturedPlayer;
Stop Holding Button(Event Player, Button(Jump));
Start Rule(BotStartPathFinding, Restart Rule);
End;
End;
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: ECHO - DEFEND PORTAL")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer == Null;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
Event Player.BotDoesUniqueBehaviour == False;
}
actions
{
Call Subroutine(BotEchoFlyToPortal);
}
}
rule("BOT: ECHO - CAN SEE PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer != Null;
Event Player.IsRespawning == False;
Event Player.BotDoesUniqueBehaviour == False;
Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer), Barriers Do Not Block LOS) == True;
}
actions
{
If(Event Player.BotIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Call Subroutine(BotEchoFlyToPlayer);
}
}
rule("BOT: ECHO - PATH FINDING TO PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer != Null;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
Event Player.BotDoesUniqueBehaviour == False;
Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer), Barriers Do Not Block LOS) == False;
}
actions
{
Event Player.BotTargetPlayer = Event Player.BotSeePlayer;
Stop Holding Button(Event Player, Button(Jump));
Call Subroutine(BotStartPathFinding);
}
}
rule("BOT: ECHO - ATTACH PLAYER BY BEAM")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.HasBadStatus == False;
Event Player.BotSeePlayer != Null;
Event Player.IsRespawning == False;
Event Player.BotEchoCapturedPlayer == Null;
Event Player.BotDoesUniqueBehaviour == False;
Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer), Barriers Do Not Block LOS) == True;
Distance Between(Position Of(Event Player), Position Of(Event Player.BotSeePlayer)) < 3;
}
actions
{
Event Player.BotDoesUniqueBehaviour = True;
Event Player.BotEchoCapturedPlayer = Event Player.BotSeePlayer;
Set Status(Event Player.BotEchoCapturedPlayer, Event Player, Stunned, 0.700);
Set Status(Event Player.BotEchoCapturedPlayer, Event Player, Hacked, 10);
Attach Players(Event Player.BotEchoCapturedPlayer, Event Player, Vector(0, 0, 2));
Press Button(Event Player, Button(Ability 2));
}
}
rule("BOT: ECHO - PLAYER DEAD")
{
event
{
Ongoing - Each Player;
Team 2;
Echo;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Is Dead(Event Player.BotEchoCapturedPlayer) != Null;
}
actions
{
If(Event Player.BotDoesUniqueBehaviour);
Call Subroutine(BotEchoDetachPlayer);
End;
If(Event Player.BotIsPathFinding);
Call Subroutine(BotResetPathFinding);
End;
Call Subroutine(BotEchoFlyToPortal);
}
}
rule("BOT: ECHO - DEATH")
{
event
{
Player Died;
Team 2;
Echo;
}
actions
{
Call Subroutine(BotEchoDetachPlayer);
Stop Holding Button(Event Player, Button(Jump));
Wait(5, Ignore Condition);
Teleport(Event Player, Vector(0, 999, 0));
Start Forcing Player To Be Hero(Event Player, Hero(Orisa));
}
}
rule("SUBROUTINE: ECHO - RESPAWN")
{
event
{
Subroutine;
BotEchoRespawn;
}
actions
{
Event Player.BotCounter = 0;
Event Player.BotEffects = Empty Array;
Create Effect(All Players(All Teams), Good Aura, Color(Sky Blue), Global.BotEchoRespawnPosition, Event Player.BotCounter,
Visible To Position and Radius);
Modify Player Variable(Event Player, BotEffects, Append To Array, Last Created Entity);
Create Effect(All Players(All Teams), Bad Aura, Color(Sky Blue), Global.BotEchoRespawnPosition, Event Player.BotCounter,
Visible To Position and Radius);
Modify Player Variable(Event Player, BotEffects, Append To Array, Last Created Entity);
Create Effect(All Players(All Teams), Energy Sound, Color(White), Global.BotEchoRespawnPosition, 200, Visible To);
Modify Player Variable(Event Player, BotEffects, Append To Array, Last Created Entity);
Chase Player Variable Over Time(Event Player, BotCounter, 3, 0.800, Destination and Duration);
Play Effect(All Players(All Teams), Sombra EMP Explosion Effect, Color(Sky Blue), Global.BotEchoRespawnPosition, 12);
Play Effect(All Players(All Teams), Sombra EMP Explosion Sound, Null, Global.BotEchoRespawnPosition, 100);
Wait(3, Ignore Condition);
Teleport(Event Player, Global.BotEchoRespawnPosition);
Play Effect(All Players(All Teams), Good Explosion, Color(White), Global.BotEchoRespawnPosition, 2.500);
Play Effect(All Players(All Teams), Debuff Impact Sound, Null, Global.BotEchoRespawnPosition, 100);
}
}
rule("SUBROUTINE: ECHO - FLY TO PLAYER")
{
event
{
Subroutine;
BotEchoFlyToPlayer;
}
actions
{
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer)), 300, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer)),
1, To World, Replace existing throttle, Direction and Magnitude);
Stop Holding Button(Event Player, Button(Jump));
}
}
rule("SUBROUTINE: ECHO - FLY TO PORTAL")
{
event
{
Subroutine;
BotEchoFlyToPortal;
}
actions
{
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Global.BotEchoRespawnPosition), 100, To World,
Direction and Turn Rate);
Start Throttle In Direction(Event Player, Direction Towards(Eye Position(Event Player), Global.BotEchoRespawnPosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
Start Holding Button(Event Player, Button(Jump));
}
}
rule("SUBROUTINE: ECHO - DETACH PLAYER")
{
event
{
Subroutine;
BotEchoDetachPlayer;
}
actions
{
Detach Players(Event Player.BotEchoCapturedPlayer);
Clear Status(Event Player.BotEchoCapturedPlayer, Hacked);
"IF PLAYER INSIDE THE WALL"
If(Is In Line of Sight(Eye Position(Event Player), Eye Position(Event Player.BotEchoCapturedPlayer), Barriers Do Not Block LOS));
Teleport(Event Player.BotEchoCapturedPlayer, Position Of(Event Player));
End;
Event Player.BotDoesUniqueBehaviour = False;
Event Player.BotEchoCapturedPlayer = Null;
}
}
disabled rule("=== REINHARDT ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: REIN - SET PLAYER AS TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
disabled Event Player.BotIsPathFinding == False;
"BOT IS FAR FROM GATES"
disabled Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Vector(
X Component Of(Global.GatePosition), 0, Z Component Of(Global.GatePosition))) > 20;
"CAN SEE PLAYER"
Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)), Is In Line of Sight(Eye Position(
Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)) == True;
}
actions
{
Call Subroutine(BotResetPathFinding);
"SET CLOSEST PLAYER TO BOT AS TARGET AND FOLLOW HIM"
Event Player.BotTargetPlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)
== True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Position Of(Event Player.BotTargetPlayer)), 360, To World,
Direction and Turn Rate);
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: REIN - SET GATE AS TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
"BOT DOESN'T FOLLOW PLAYER"
Event Player.BotTargetPlayer == -1;
"CAN'T SEE ANY PLAYER"
disabled Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)), !Is In Line of Sight(Eye Position(
Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)) == True;
}
actions
{
Call Subroutine(BotResetPathFinding);
"SET GATE AS TARGET"
Event Player.BotTargetPosition = Global.GatePosition;
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
Direction and Turn Rate);
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: REIN - TARGET DEAD")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotTargetPlayer != -1;
Is Dead(Event Player.BotTargetPlayer) == True;
}
actions
{
Call Subroutine(BotResetPathFinding);
}
}
rule("BOT: REIN - ATTACK TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
"CAN ATTACK TARGET"
Distance Between(Position Of(Event Player), Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer)
: Global.GatePosition) < 4;
"CAN ATTACK TARGET (2D DISTANCE)"
disabled Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Vector(
X Component Of(Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer) : Global.GatePosition), 0,
Z Component Of(Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer) : Global.GatePosition))) < 4;
}
actions
{
Start Holding Button(Event Player, Button(Primary Fire));
Stop Holding Button(Event Player, Button(Secondary Fire));
"TARGET IS PLAYER"
Abort If(Event Player.BotTargetPlayer != -1);
If(Event Player.isBoss == 1);
"TARGET IS GATE"
Global.GateHealth -= 25;
Else;
Global.GateHealth -= 5;
End;
Start Rule(GateProgressBarColor, Restart Rule);
Wait(0.900, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: REIN - STOP ATTACK TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
"CAN ATTACK TARGET"
Distance Between(Position Of(Event Player), Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer)
: Global.GatePosition) > 4;
"CAN'T ATTACK TARGET (2D DISTANCE)"
disabled Distance Between(Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(Position Of(Event Player))), Vector(
X Component Of(Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer) : Global.GatePosition), 0,
Z Component Of(Event Player.BotTargetPlayer != -1 ? Position Of(Event Player.BotTargetPlayer) : Global.GatePosition))) > 4;
}
actions
{
Stop Holding Button(Event Player, Button(Primary Fire));
}
}
rule("BOT: REIN - USE SHIELD")
{
event
{
Player Took Damage;
Team 2;
Reinhardt;
}
conditions
{
Distance Between(Position Of(Event Player), Position Of(Event Player.BotTargetPlayer)) > 3;
}
actions
{
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Attacker)), 200, To World,
Direction and Turn Rate);
Start Holding Button(Event Player, Button(Secondary Fire));
Wait Until(Distance Between(Position Of(Event Player), Position Of(Event Player.BotTargetPlayer)) < 3, 3);
Stop Holding Button(Event Player, Button(Secondary Fire));
}
}
rule("BOT: REIN - CHARGE IN GATE")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotTargetPlayer == -1;
Is Using Ability 1(Event Player) == False;
Is In Line of Sight(Eye Position(Event Player), Global.GatePosition, Barriers Do Not Block LOS) == True;
Is In View Angle(Event Player, Global.GatePosition, 7.500) == True;
}
actions
{
disabled Wait(0.800, Abort When False);
Start Holding Button(Event Player, Button(Ability 1));
Wait Until(Is Using Ability 1(Event Player), 1);
Stop Holding Button(Event Player, Button(Ability 1));
}
}
rule("BOT: REIN - DEATH")
{
event
{
Ongoing - Each Player;
Team 2;
Reinhardt;
}
actions
{
Stop Holding Button(Event Player, Button(Primary Fire));
Stop Holding Button(Event Player, Button(Secondary Fire));
}
}
rule("SUBROUTINE: REIN - RESPAWN")
{
event
{
Subroutine;
BotReinRespawn;
}
actions
{
Call Subroutine(BotApearFromUnderground);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
Direction and Turn Rate);
}
}
disabled rule("=== WIDOW ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: WIDOW - SEE PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Widowmaker;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Is Reloading(Event Player) == False;
Event Player.BotSeePlayer == Null;
Event Player.HasBadStatus == False;
"CAN SEE PLAYER"
Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)), Is In Line of Sight(Eye Position(
Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)) == True;
}
actions
{
Event Player.BotSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)
== True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
Event Player.BotWidowShotTime = Total Time Elapsed + (Global.TimeMin >= 9 ? Random Real(2, 5) : Random Real(5, 10));
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer)), 9999, To World,
Direction and Turn Rate);
}
}
rule("BOT: WIDOW - SHOOT")
{
event
{
Ongoing - Each Player;
Team 2;
Widowmaker;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Is Reloading(Event Player) == False;
Event Player.BotSeePlayer != Null;
Event Player.HasBadStatus == False;
Total Time Elapsed >= Event Player.BotWidowShotTime;
}
actions
{
Press Button(Event Player, Button(Primary Fire));
Stop Facing(Event Player);
Event Player.BotSeePlayer = Null;
}
}
rule("BOT: WIDOW - Aim Sound")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Alive(Event Player) == True;
Is In Line of Sight(Eye Position(Players On Hero(Hero(Widowmaker), Team 2)), Eye Position(Event Player), Barriers Do Not Block LOS)
== True;
Is Alive(Players On Hero(Hero(Widowmaker), Team 2)) == True;
Players On Hero(Hero(Widowmaker), Team 2).BotSeePlayer == True;
}
actions
{
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 100);
Wait(1, Abort When False);
Loop If Condition Is True;
}
}
rule("BOT: WIDOW - TELEPORT TO NEW POSITION")
{
event
{
Ongoing - Each Player;
Team 2;
Widowmaker;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.HasBadStatus == False;
Total Time Elapsed >= Event Player.BotWidowTeleportTime;
}
actions
{
Event Player.BotWidowTeleportTime = Total Time Elapsed + 28;
Event Player.BotWidowShotTime = Total Time Elapsed + (Global.TimeMin >= 9 ? Random Real(1, 3) : Random Real(3, 6));
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(White), Event Player, 1);
Wait(0.016, Ignore Condition);
Teleport(Event Player, Filtered Array(Global.SniperPositions, Distance Between(Event Player.BotEventPosition,
Current Array Element) > 5)[Random Integer(0, Count Of(Global.SniperPositions) - 2)]);
Wait(0.020, Ignore Condition);
Event Player.BotEventPosition = Position Of(Event Player);
Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Objective Position(2)), To World);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Event Player, 2);
Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 100);
}
}
rule("BOT: WIDOW - DEATH")
{
event
{
Player Died;
Team 2;
Widowmaker;
}
actions
{
Stop Holding Button(Event Player, Button(Secondary Fire));
Wait(0.250, Ignore Condition);
Destroy Effect(Event Player.BotEffects);
}
}
rule("SUBROUTINE: WIDOW - RESPAWN")
{
event
{
Subroutine;
BotWidowRespawn;
}
actions
{
"RESPAWN ON RANDOM SNIPER POSITION"
Teleport(Event Player, Filtered Array(Global.SniperPositions, Distance Between(Event Player.BotEventPosition,
Current Array Element) > 5)[Random Integer(0, Count Of(Global.SniperPositions) - 2)]);
Wait(0.020, Ignore Condition);
Event Player.BotEventPosition = Position Of(Event Player);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Event Player, 2);
Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player, 100);
Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Objective Position(2)), To World);
Wait(0.700, Ignore Condition);
Start Holding Button(Event Player, Button(Secondary Fire));
Create Beam Effect(All Players(All Teams), Torbjörn Turret Sight Beam, Eye Position(Event Player), Update Every Frame(
Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 999, Null,
Event Player, False)), Color(Red), Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
Wait Until(Is Dead(Event Player), 99999);
Destroy Effect(Event Player.BotEffects);
}
}
rule("SUBROUTINE: WIDOW - BAD STATUS")
{
event
{
Subroutine;
BotWidowBadStatus;
}
actions
{
Stop Facing(Event Player);
Destroy Effect(Event Player.BotEffects);
Wait Until(!Event Player.HasBadStatus, 15);
Create Beam Effect(All Players(All Teams), Torbjörn Turret Sight Beam, Eye Position(Event Player), Update Every Frame(
Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 999, Null,
Event Player, False)), Color(Red), Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
}
}
disabled rule("=== BASTION ===")
{
event
{
Ongoing - Global;
}
}
disabled rule("BOT: BASTION - FLAME GUN")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer == True;
Is Reloading(Event Player) == False;
Event Player.BotDoesUniqueBehaviour == False;
Is In View Angle(Event Player, Position Of(Event Player.BotSeePlayer), 50) == True;
Distance Between(Position Of(Event Player), Position Of(Event Player.BotSeePlayer)) < 8;
}
actions
{
Event Player.BotDoesUniqueBehaviour = True;
Stop Holding Button(Event Player, Button(Primary Fire));
Create Effect(All Players(All Teams), Bad Aura, Color(Orange), Update Every Frame(Eye Position(Event Player) + World Vector Of(
Vector(-1, -1.200, 1.800), Event Player, Rotation)), 1, Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
Start Rule(BotBastionFlameGunDamage, Do Nothing);
Wait(1.100, Ignore Condition);
Destroy Effect(Event Player.BotEffects);
Wait(4, Ignore Condition);
Loop If Condition Is True;
}
}
disabled rule("BOT: BASTION - CAN SEE PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
disabled Event Player.BotSeePlayer == Null;
Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)), Is In Line of Sight(Eye Position(
Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)) == True;
}
actions
{
Event Player.BotSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)
== True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer)), 100, To World,
Direction and Turn Rate);
}
}
disabled rule("BOT: BASTION - CAN'T SEE PLAYER")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer != Null;
Is True For Any(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)), Is In Line of Sight(Eye Position(
Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)) == False;
}
actions
{
Event Player.BotSeePlayer = Null;
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 100, To World,
Direction and Turn Rate);
}
}
disabled rule("BOT: BASTION - MOVE TO BASTION'S TARGET (POSITION)")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
Event Player.BotDoesUniqueBehaviour == False;
}
actions
{
Event Player.BotTargetPosition = Random Value In Array(Filtered Array(Global.BastionTargetPositions, Distance Between(Position Of(
Event Player), Current Array Element) > 3.500));
Start Rule(BotStartPathFinding, Do Nothing);
}
}
rule("BOT: BASTION - MAIN LOGIC - LOOP")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotDoesUniqueBehaviour == False;
}
actions
{
Event Player.BotSeePlayer = Sorted Array(Filtered Array(All Living Players(Team 1), Has Spawned(Current Array Element)
== True && Is In Line of Sight(Eye Position(Event Player), Eye Position(Current Array Element), Barriers Do Not Block LOS)
== True), Distance Between(Position Of(Event Player), Position Of(Current Array Element)))[0];
"SEE THE PLAYER"
If(Event Player.BotSeePlayer != Null);
Stop Holding Button(Event Player, Button(Secondary Fire));
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Eye Position(Event Player.BotSeePlayer) - Vector(0, 0.500,
0)), 100, To World, Direction and Turn Rate);
"SELF REPAIRING"
Else If(!Is Firing Secondary(Event Player) && Health(Event Player) < Max Health(Event Player));
Start Holding Button(Event Player, Button(Secondary Fire));
End;
"START FOLLOW PATH"
disabled If(!Event Player.BotIsPathFinding && !Event Player.BotDoesUniqueBehaviour);
disabled Start Rule(BotResetPathFinding, Do Nothing);
disabled Wait(0.050, Ignore Condition);
disabled Event Player.BotTargetPosition = Random Value In Array(Global.BastionTargetPositions);
disabled Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Event Player.BotTargetPosition + Vector(0, 2, 0)), 100,
To World, Direction and Turn Rate);
disabled Start Rule(BotStartPathFinding, Do Nothing);
"REACHED PATH TARGET"
disabled Else If(Distance Between(Position Of(Event Player), Event Player.BotTargetPosition) <= 3);
disabled Start Rule(BotResetPathFinding, Do Nothing);
disabled End;
Wait(1, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: BASTION - ARTILLERY")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer == True;
Is Reloading(Event Player) == False;
Event Player.BotDoesUniqueBehaviour == False;
Is In View Angle(Event Player, Position Of(Event Player.BotSeePlayer), 30) == True;
Distance Between(Position Of(Event Player), Position Of(Event Player.BotSeePlayer)) > 18;
Distance Between(Eye Position(Event Player), Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
+ Up * 99, Null, Event Player, False)) >= 35;
}
actions
{
"TRYING TO CAPTURE TARGET"
Wait(0.800, Abort When False);
"CAPTURE TARGET"
Event Player.BotDoesUniqueBehaviour = True;
Stop Throttle In Direction(Event Player);
Create Beam Effect(All Players(All Teams), Torbjörn Turret Sight Beam, Update Every Frame(Eye Position(Event Player)),
Update Every Frame(Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 1000, All Living Players(Team 1), Event Player, True)), Color(Sky Blue), Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
Wait(1.400, Ignore Condition);
Destroy Effect(Event Player.BotEffects);
Abort If(Is Dead(Event Player));
Event Player.BotEventPosition = Position Of(Event Player.BotSeePlayer);
"SHOOT FROM ARTILLERY"
Event Player.BotBastionArtilleryDidShotsCount = 0;
For Player Variable(Event Player, BotLoopIterator1, 0, 4, 1);
Event Player.BotBastionArtilleryDidShotsCount += 1;
Play Effect(All Players(All Teams), Wrecking Ball Minefield Explosion Sound, Color(White), Eye Position(Event Player), 250);
Play Effect(All Players(All Teams), Pharah Barrage Explosion Effect, Color(Orange), Eye Position(Event Player) + World Vector Of(
Vector(0, 1.400, -0.700), Event Player, Rotation), 2);
Create Beam Effect(All Players(All Teams), Zarya Particle Beam, Eye Position(Event Player) + World Vector Of(Vector(0, 1.400,
-0.700), Event Player, Rotation), Eye Position(Event Player) + World Vector Of(Vector(Random Real(-1, 1), Random Integer(40,
80), Random Real(0.500, 1.500)), Event Player, Rotation), Color(Orange), Visible To);
Event Player.BotEffects = Last Created Entity;
Wait(0.050, Ignore Condition);
Destroy Effect(Event Player.BotEffects);
Wait(0.400, Ignore Condition);
If(Is Dead(Event Player));
Break;
End;
End;
disabled Call Subroutine(BotResetPathFinding);
disabled Start Rule(BotStartPathFinding, Do Nothing);
Start Throttle In Direction(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 1,
To World, Replace existing throttle, Direction and Magnitude);
Wait(1.500, Ignore Condition);
Start Rule(BotBastionArtilleryDamage, Do Nothing);
Wait(4, Ignore Condition);
}
}
rule("BOT: BASTION - PRIMARY FIRE")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == False;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotSeePlayer != Null;
Event Player.BotDoesUniqueBehaviour == False;
Is In View Angle(Event Player, Position Of(Event Player.BotSeePlayer), 40) == True;
}
actions
{
Start Holding Button(Event Player, Button(Primary Fire));
Wait(1, Ignore Condition);
Stop Holding Button(Event Player, Button(Primary Fire));
Wait(1, Ignore Condition);
Loop If Condition Is True;
}
}
rule("BOT: BASTION - DEATH")
{
event
{
Player Died;
Team 2;
Bastion;
}
actions
{
Stop Holding Button(Event Player, Button(Secondary Fire));
For Player Variable(Event Player, BotLoopIterator1, 0, 3, 1);
Play Effect(All Players(All Teams), Bastion Tank Cannon Explosion Effect, Color(White), Event Player, 1);
Play Effect(All Players(All Teams), Bastion Tank Cannon Explosion Sound, Color(White), Event Player, 100);
Wait(0.250, Ignore Condition);
End;
}
}
rule("SUBROUTINE: BASTION - RESPAWN")
{
event
{
Subroutine;
BotBastionRespawn;
}
actions
{
Abort If(Event Player.BotIsOrisaChild == True);
Call Subroutine(BotLandingFromSky);
Set Ammo(Event Player, 0, 0);
Wait Until(!Is Reloading(Event Player), 99999);
Event Player.BotTargetPosition = Objective Position(2);
}
}
rule("SUBROUTINE: BASTION - ARTILLERY DAMAGE")
{
event
{
Subroutine;
BotBastionArtilleryDamage;
}
actions
{
Event Player.BotDoesUniqueBehaviour = False;
"EXPLOSIONS OF ARTILLERY"
For Player Variable(Event Player, BotLoopIterator2, 0, Event Player.BotBastionArtilleryDidShotsCount, 1);
Event Player.BotEventPosition = Ray Cast Hit Position(Event Player.BotEventPosition + Vector(0, 50, 0),
Event Player.BotEventPosition + Vector(Random Integer(-4, 4), -15, Random Integer(-4, 4)), Null, Event Player, True);
Damage(Players Within Radius(Event Player.BotEventPosition, 8, Team 1, Surfaces And Enemy Barriers), Event Player, 50);
Play Effect(All Players(All Teams), Bastion Tank Cannon Explosion Sound, Color(White), Event Player.BotEventPosition, 150);
Play Effect(All Players(All Teams), Pharah Rocket Launcher Explosion Effect, Color(Orange), Event Player.BotEventPosition, 5);
Create Beam Effect(All Players(All Teams), Zarya Particle Beam, Event Player.BotEventPosition,
Event Player.BotEventPosition + Vector(0, 60, 0), Color(Orange), Visible To);
Event Player.BotEffects = Last Created Entity;
Wait(0.050, Ignore Condition);
Destroy Effect(Event Player.BotEffects);
Wait(0.400, Ignore Condition);
End;
}
}
disabled rule("SUBROUTINE: BASTION - FLAME GUN DAMAGE")
{
event
{
Subroutine;
BotBastionFlameGunDamage;
}
actions
{
Event Player.BotRayCastHitPosition = Eye Position(Event Player) + World Vector Of(Vector(-1, -1.200, 1.800), Event Player,
Rotation);
"FIRE PARTICLES OF FLAME GUN"
For Player Variable(Event Player, BotLoopIterator1, 1, 13, 3);
Event Player.BotEventPosition = Ray Cast Hit Position(Event Player.BotRayCastHitPosition,
Event Player.BotRayCastHitPosition + Facing Direction Of(Event Player) * Event Player.BotLoopIterator1, Null, Event Player,
True);
Damage(Players Within Radius(Event Player.BotEventPosition, 4, Team 1, Surfaces And Enemy Barriers), Event Player, 20);
Set Status(Players Within Radius(Event Player.BotEventPosition, 4, Team 1, Off), Event Player, Burning, 2);
Play Effect(All Players(All Teams), Debuff Impact Sound, Color(White), Event Player.BotEventPosition, 150);
Play Effect(All Players(All Teams), Bad Explosion, Color(Orange), Event Player.BotEventPosition, 2.500);
Wait(0.200, Ignore Condition);
End;
Event Player.BotDoesUniqueBehaviour = False;
}
}
disabled rule("=== ORISA + BASTION ===")
{
event
{
Ongoing - Global;
}
}
rule("BOT: ORISA-BASTION - REACHED TARGET POSITION")
{
event
{
Ongoing - Each Player;
Team 2;
Orisa;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.BotIsPathFinding == True;
Distance Between(Position Of(Event Player), Global.BotOrisaTargetPosition) < 1.500;
}
actions
{
Call Subroutine(BotResetPathFinding);
Start Facing(Event Player, Direction Towards(Eye Position(Event Player), Vector(X Component Of(Global.GatePosition), -999,
Z Component Of(Global.GatePosition))), 80, To World, Direction and Turn Rate);
Start Facing(Global.BotOrisaChild, Direction Towards(Eye Position(Event Player), Is In Line of Sight(Eye Position(Event Player),
Global.GatePosition, Barriers Do Not Block LOS) ? Global.GatePosition : Sorted Array(Filtered Array(All Players(Team 1),
Is Alive(Current Array Element)), Distance Between(Eye Position(Event Player), Position Of(Current Array Element)))[0]), 200,
To World, Direction and Turn Rate);
disabled Start Facing(Global.BotOrisaChild, Direction Towards(Eye Position(Event Player), Is In Line of Sight(Eye Position(Event Player),
Global.GatePosition, Barriers Do Not Block LOS) ? Global.GatePosition : Sorted Array(Filtered Array(All Players(Team 1),
Is Alive(Current Array Element) && Is In Line of Sight(Eye Position(Event Player), Position Of(Current Array Element),
Barriers Do Not Block LOS)), Distance Between(Eye Position(Event Player), Position Of(Current Array Element)))[0]), 200,
To World, Direction and Turn Rate);
Press Button(Event Player, Button(Ability 1));
Wait Until(Y Component Of(Facing Direction Of(Event Player)) < -0.300, 99999);
Press Button(Event Player, Button(Ability 2));
Wait(0.800, Ignore Condition);
Global.BotOrisaChild.BotDoesUniqueBehaviour = False;
Disallow Button(Event Player, Button(Ability 2));
}
}
rule("BOT: ORISA-BASTION - SHOOT")
{
event
{
Ongoing - Each Player;
Team 2;
Bastion;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Event Player.BotIsOrisaChild == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotDoesUniqueBehaviour == False;
}
actions
{
Event Player.BotDoesUniqueBehaviour = True;
While(Is Alive(Event Player));
disabled Create Effect(All Players(All Teams), Bad Aura, Color(Purple), Eye Position(Event Player) - Vector(0, 0.700, 0)
+ Facing Direction Of(Event Player) * 3.200, 1, Visible To Position and Radius);
disabled Event Player.BotEffects = Last Created Entity;
Wait(1.500, Ignore Condition);
disabled Destroy Effect(Event Player.BotEffects);
Abort If(Is Dead(Event Player));
Press Button(Event Player, Button(Primary Fire));
Press Button(Event Player, Button(Reload));
Event Player.BotRayCastHitPosition = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player)
+ Facing Direction Of(Event Player) * 999, All Players(Team 1), All Players(Team 2), True);
"ANTI-SHIELD BUG"
Event Player.BotRayCastHitPosition = Event Player.BotRayCastHitPosition + Direction Towards(Event Player.BotRayCastHitPosition,
Eye Position(Event Player)) * 0.200;
Create Beam Effect(All Players(All Teams), Zarya Particle Beam, Eye Position(Event Player) - Vector(0, 0.700, 0)
+ Facing Direction Of(Event Player) * 3, Event Player.BotRayCastHitPosition, Color(Purple), Visible To Position and Radius);
Event Player.BotEffects = Last Created Entity;
Damage(Players Within Radius(Event Player.BotRayCastHitPosition, 4, Team 1, Surfaces And All Barriers), Event Player, 0.040);
Play Effect(All Players(All Teams), Pharah Concussive Blast Effect, Color(Purple), Event Player.BotRayCastHitPosition, 4);
Play Effect(All Players(All Teams), Pharah Concussive Blast Sound, Color(Purple), Event Player.BotRayCastHitPosition, 250);
Play Effect(All Players(All Teams), Bad Explosion, Color(Purple), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 3.300, 2);
Play Effect(All Players(All Teams), Sombra EMP Explosion Sound, Color(Purple), Eye Position(Event Player), 170);
If(Distance Between(Event Player.BotRayCastHitPosition, Global.GatePosition) < 4 && Is In Line of Sight(
Event Player.BotRayCastHitPosition, Global.GatePosition, Enemy Barriers Block LOS));
Global.GateHealth -= 80;
Start Rule(GateProgressBarColor, Restart Rule);
End;
Wait(0.150, Ignore Condition);
Destroy Effect(Event Player.BotEffects);
Wait(0.060, Ignore Condition);
Wait Until(!Is Reloading(Event Player), 2.500);
End;
}
}
rule("BOT: ORISA-BASTION - CAN'T SEE THE TARGET")
{
event
{
Ongoing - Each Player;
Team 2;
Orisa;
}
conditions
{
Is Dummy Bot(Event Player) == True;
Has Spawned(Event Player) == True;
Is Alive(Event Player) == True;
Event Player.IsRespawning == False;
Event Player.BotIsPathFinding == False;
Is In Line of Sight(Eye Position(Event Player), Global.GatePosition, Barriers Do Not Block LOS) == False;
}
actions
{
Event Player.BotTargetPosition = Global.BotOrisaTargetPosition;
Start Rule(BotStartPathFinding, Restart Rule);
}
}
rule("BOT: ORISA-BASTION - DEATH")
{
event
{
Player Died;
Team 2;
Orisa;
}
actions
{
Allow Button(Event Player, Button(Ability 2));
Kill(Global.BotOrisaChild, Null);
Detach Players(Global.BotOrisaChild);
Clear Status(Global.BotOrisaChild, Phased Out);
Set Damage Dealt(Global.BotOrisaChild, 100);
Global.BotOrisaChild.BotIsOrisaChild = False;
Global.BotOrisaChild = Null;
Global.BotOrisaParent = Null;
Start Forcing Player To Be Hero(Event Player, Hero(Widowmaker));
}
}
rule("SUBROUTINE: ORISA - RESPAWN")
{
event
{
Subroutine;
BotOrisaRespawn;
}
actions
{
Global.BotOrisaParent = Event Player;
"WAITING FOR ANY BASTION TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(Bastion)),
99999);
"SETUP BASTION AS CHILD"
Global.BotOrisaChild = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Bastion))[0];
Global.BotOrisaChild.BotIsOrisaChild = True;
Global.BotOrisaChild.BotDoesUniqueBehaviour = True;
Wait(2, Ignore Condition);
Respawn(Global.BotOrisaChild);
Start Scaling Player(Global.BotOrisaChild, 1.800, False);
Set Damage Dealt(Global.BotOrisaChild, 2000);
Set Status(Global.BotOrisaChild, Null, Phased Out, 9999);
Disable Nameplates(Global.BotOrisaChild, All Players(All Teams));
Set Facing(Global.BotOrisaChild, Vector(X Component Of(Facing Direction Of(Event Player)), 9999, Z Component Of(
Facing Direction Of(Event Player))), To World);
Start Holding Button(Global.BotOrisaChild, Button(Ability 1));
Wait Until(Is In Alternate Form(Global.BotOrisaChild), 5);
Stop Holding Button(Global.BotOrisaChild, Button(Ability 1));
Teleport(Global.BotOrisaChild, Position Of(Event Player));
Attach Players(Global.BotOrisaChild, Global.BotOrisaParent, Vector(0, 1.800, 0.230));
disabled Wait(1, Ignore Condition);
disabled Stop Holding Button(Global.BotOrisaChild, Button(Primary Fire));
disabled Wait(0.250, Ignore Condition);
Call Subroutine(BotLandingFromSky);
Start Facing(Event Player, Direction Towards(Position Of(Event Player), Event Player.BotNextNodePosition), 360, To World,
Direction and Turn Rate);
Event Player.BotTargetPosition = Global.BotOrisaTargetPosition;
Start Rule(BotStartPathFinding, Do Nothing);
}
}
rule("GLOBAL: GAME LOGIC - MIN 0 - ZENS, REINS, BALL")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 0;
}
actions
{
"CREATE BOTS - ZEN"
While(Count Of(All Players(Team 2)) < 13);
Create Dummy Bot(Hero(Zenyatta), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Wait(1, Ignore Condition);
End;
"BALL"
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))) == 0);
Create Dummy Bot(Hero(Wrecking Ball), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
Wait(1, Ignore Condition);
End;
"REPLACE DEAD ZEN TO REIN"
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Reinhardt))) != 3);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.200, Ignore Condition);
Create Dummy Bot(Hero(Reinhardt), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
}
}
rule("GLOBAL: GAME LOGIC - MIN 1 - WIDOW")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 1;
}
actions
{
Global.IsNewWaveGameLogicProcessing = True;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Widowmaker))) == 0);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.200, Ignore Condition);
Create Dummy Bot(Hero(Widowmaker), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
Global.IsNewWaveGameLogicProcessing = False;
}
}
rule("GLOBAL: GAME LOGIC - MIN 3 - BALL")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 3;
}
actions
{
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Wrecking Ball), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Reinhardt), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
}
}
rule("GLOBAL: GAME LOGIC - MIN 5 - REINS WAVE")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 5;
}
actions
{
"PREPARE WAVE - DESTROY WIDOW AND BALLS"
Destroy Dummy Bot(Team 2, Slot Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Widowmaker))[0]));
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))) > 0);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))[0];
Kill(Global.DefaultCurrentBot, Null);
Wait(0.500, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
End;
"BOSS WAVE"
Big Message(All Players(All Teams), Custom String("BOSS WAVE - {1} {0}", Hero Icon String(Hero(Reinhardt)), Hero(Reinhardt)));
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Reinhardt))) < 6);
Wait Until(Is True For Any(All Players(Team 2), Distance Between(Position Of(Current Array Element), Global.GatePosition)
> 13 && Hero Of(Current Array Element) == Hero(Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Reinhardt), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
disabled Wait(0.200, Ignore Condition);
disabled Set Max Health(Global.DefaultCurrentBot, 50);
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Reinhardt))) > 3);
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Reinhardt)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Reinhardt))[0];
Wait(0.500, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Widowmaker))) == 0);
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Widowmaker), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))) == 0);
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Wrecking Ball), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
While(Count Of(All Players(Team 2)) < 13);
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Zenyatta), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
Big Message(All Players(All Teams), Custom String("BOSS WAVE FINISHED!"));
}
}
rule("GLOBAL: GAME LOGIC - MIN 7 - BASTION")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 7;
}
actions
{
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Bastion))) == 0);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Bastion), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Widowmaker))) == 0);
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Widowmaker), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
}
}
rule("GLOBAL: GAME LOGIC - MIN 9 - ECHO, +1 BASTION")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 9;
}
actions
{
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))) > 0);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Wrecking Ball)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Wrecking Ball))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Echo))) == 0);
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Echo), Team 2, -1, Vector(0, 9999, 0), Vector(0, 0, 0));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Bastion))) < 2);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Bastion), Team 2, -1, Vector(0, 9999, 0), Vector(0, 0, 0));
End;
While(Count Of(Filtered Array(All Players(Team 2), Hero Of(Current Array Element) == Hero(Wrecking Ball))) < 2);
"WAITING FOR ANY ZEN TO DIE"
Wait Until(Is True For Any(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element) == Hero(
Zenyatta)), 99999);
"REPLACE HIM TO A NEW HERO"
Global.DefaultCurrentBot = Filtered Array(All Players(Team 2), Is Dead(Current Array Element) && Hero Of(Current Array Element)
== Hero(Zenyatta))[0];
Wait(0.200, Ignore Condition);
Destroy Dummy Bot(Team 2, Slot Of(Global.DefaultCurrentBot));
Wait(0.500, Ignore Condition);
Create Dummy Bot(Hero(Wrecking Ball), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
"FILL EMPTY SLOTS BY ZENS"
While(Count Of(All Players(Team 2)) < 12);
Wait(1, Ignore Condition);
Create Dummy Bot(Hero(Zenyatta), Team 2, -1, Vector(0, 999, 0), Vector(0, 0, 0));
End;
}
}
rule("Ana Nano Variable")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
conditions
{
Is Using Ultimate(Event Player) == True;
}
actions
{
Player Closest To Reticle(Event Player, Team 1).IsNanoed = 1;
}
}
rule("IsNanoed")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.IsNanoed == True;
}
actions
{
If(Is Dead(Event Player));
Event Player.IsNanoed = 0;
End;
Wait(8, Ignore Condition);
Event Player.IsNanoed = 0;
}
}
rule("money on kill")
{
event
{
Player Dealt Final Blow;
Team 1;
All;
}
actions
{
If(Hero Of(Victim) == Hero(Zenyatta));
All Players(Team 1).Money[0] += 5 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 10 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Else If(Hero Of(Victim) == Hero(Reinhardt));
All Players(Team 1).Money[0] += 15 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 20 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Else If(Hero Of(Victim) == Hero(Wrecking Ball));
All Players(Team 1).Money[0] += 25 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 25 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Else If(Hero Of(Victim) == Hero(Widowmaker));
All Players(Team 1).Money[0] += 30 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 30 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Else If(Hero Of(Victim) == Hero(Bastion));
All Players(Team 1).Money[0] += 50 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 50 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Else If(Hero Of(Victim) == Hero(Echo));
All Players(Team 1).Money[0] += 75 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 75 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Else If(Hero Of(Victim) == Hero(Orisa));
All Players(Team 1).Money[0] += 100 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
Global.StartMoney += 100 * (Victim.isBoss ? 3 : 1) * Global.MoneyMult;
}
}
rule("Abilities and Hero Talents by Shingen and LemonAid")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
actions
{
Event Player.DamageDealt = 100;
Event Player.PlayerHealth = 100;
Event Player.Money[0] = 2400 + Global.StartMoney;
If(Custom String("{0}", Event Player) == Custom String("ShuriZma"));
Create HUD Text(Event Player, Custom String("Serverload: {0}, AVG {1}, Peak {2}", Server Load, Server Load Average,
Server Load Peak), Null, Null, Left, -10000, Color(Red), Color(White), Color(White), Visible To and String,
Default Visibility);
disabled Create HUD Text(Event Player, Custom String("Last SW: {0}, SW Active {1}", Event Player.lastSecondWind,
Event Player.secondWindActive), Null, Null, Left, -10000, Color(Red), Color(White), Color(White), Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Custom String("Death position: {0}", Event Player.deathPosition), Null, Null, Left, -10000, Color(Red), Color(White), Color(White), Visible To and String,
Default Visibility);
End;
}
}
rule("Team 1 (Ability): Headhunter")
{
event
{
Player Dealt Damage;
Team 1;
All;
}
conditions
{
Event Player.Abilities[1] == True;
Event Was Critical Hit == True;
}
actions
{
Damage(Victim, Event Player, Event Player.Abilities[1] * 40 / Event Player.DamageDealt * Event Damage);
}
}
rule("Team 1 (Ability): Ambush")
{
event
{
Player Dealt Damage;
Team 1;
All;
}
conditions
{
Event Player.Abilities[2] == True;
Event Ability != Null;
(Y Component Of(Position Of(Event Player)) - Y Component Of(Position Of(Victim)) >= 3 || Absolute Value(Horizontal Angle Towards(
Victim, Event Player)) >= 90) == True;
}
actions
{
Damage(Victim, Event Player, Event Player.Abilities[2] * 30 / Event Player.DamageDealt * Event Damage);
}
}
rule("Team 1 (Ability): Quick Fix")
{
event
{
Player Earned Elimination;
Team 1;
All;
}
conditions
{
Event Player.Abilities[3] == True;
}
actions
{
Heal(Event Player, Null, Event Player.Abilities[3] * 50);
Set Move Speed(Event Player, 100 + Event Player.Abilities[3] * 20);
Wait(5, Restart When True);
Set Move Speed(Event Player, 100);
}
}
rule("Team 1 (Ability): Heavyweight")
{
event
{
Player Dealt Knockback;
Team 1;
All;
}
conditions
{
Event Player.Abilities[4] == True;
}
actions
{
Damage(Victim, Event Player, Event Player.Abilities[4] * 25 / Event Player.DamageDealt * Event Damage);
}
}
rule("Team 1 (Ability): Charged")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[5] == True;
Ultimate Charge Percent(Event Player) < Event Player.Abilities[5] * 20;
}
actions
{
Set Ultimate Charge(Event Player, Event Player.Abilities[5] * 20);
If(Is Duplicating(Event Player));
Wait(0.016, Ignore Condition);
Set Ultimate Charge(Event Player, Event Player.Abilities[5] * 20);
End;
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Team 1 (Ability): Haste Primary Fire")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[6] == True;
Ability Cooldown(Event Player, Button(Primary Fire)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Primary Fire), (1 - 0.250 * Event Player.Abilities[6]) * Ability Cooldown(Event Player,
Button(Primary Fire)));
}
}
rule("Team 1 (Ability): Haste Secondary Fire")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[6] == True;
Ability Cooldown(Event Player, Button(Secondary Fire)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Secondary Fire), (1 - 0.250 * Event Player.Abilities[6]) * Ability Cooldown(Event Player,
Button(Secondary Fire)));
}
}
rule("Team 1 (Ability): Haste Ability 1")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[6] == True;
Ability Cooldown(Event Player, Button(Ability 1)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 1), (1 - 0.250 * Event Player.Abilities[6]) * Ability Cooldown(Event Player,
Button(Ability 1)));
}
}
rule("Team 1 (Ability): Haste Ability 2")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[6] == True;
Ability Cooldown(Event Player, Button(Ability 2)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Ability 2), (1 - 0.250 * Event Player.Abilities[6]) * Ability Cooldown(Event Player,
Button(Ability 2)));
}
}
rule("Team 1 (Ability): Haste Jump")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[6] == True;
Ability Cooldown(Event Player, Button(Jump)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Jump), (1 - 0.250 * Event Player.Abilities[6]) * Ability Cooldown(Event Player, Button(
Jump)));
}
}
rule("Team 1 (Ability): Haste Crouch")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[6] == True;
Ability Cooldown(Event Player, Button(Crouch)) > 0.100;
}
actions
{
Set Ability Cooldown(Event Player, Button(Crouch), (1 - 0.250 * Event Player.Abilities[6]) * Ability Cooldown(Event Player, Button(
Crouch)));
}
}
rule("Team 1 (Ability): Heavy Impact")
{
event
{
Player Took Damage;
Team 2;
All;
}
conditions
{
Attacker.Abilities[7] == True;
}
actions
{
Abort If(Random Real(-0.020, 1) > Event Damage / Max Health(Event Player));
Set Status(Event Player, Attacker, Stunned, 1 * Attacker.Abilities[7]);
Wait(5, Ignore Condition);
}
}
rule("Team 1 (Ability): Binding Heal")
{
event
{
Player Dealt Healing;
Team 1;
All;
}
conditions
{
Event Player.Abilities[10] == True;
Healee != Event Player;
}
actions
{
Set Player Health(Event Player, Health(Event Player) + Event Player.Abilities[10] * 0.250 * Event Healing);
}
}
rule("Team 1 (Ability): Resilience")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[11] == True;
Normalized Health(Event Player) < Event Player.Abilities[11] * 0.300;
}
actions
{
Set Damage Received(Event Player, 70);
Wait Until(!(Event Player.Abilities[11] && Normalized Health(Event Player) < Event Player.Abilities[11] * 0.300), 99999);
Set Damage Received(Event Player, 100);
}
}
rule("Auto Repair")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.AutoRepair == True;
Global.GateHealth < Global.GateMaxHealth;
}
actions
{
If(Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[2]);
Global.GateHealth += 10 * Global.AutoRepair;
Global.UpgradeGateMaxHealthValue += 10 * Global.AutoRepair;
Else;
Global.GateHealth += 5 * Global.AutoRepair;
Global.UpgradeGateMaxHealthValue += 5 * Global.AutoRepair;
End;
If(Global.GateHealth > Global.GateMaxHealth);
Global.GateHealth = Global.GateMaxHealth;
End;
"UPDATE GATE'S HEALTH BAR"
Start Rule(GateProgressBarColor, Restart Rule);
Wait(5, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Ana Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Ana), Button(Ability 1)), Custom String(
"Sleep Paralysis: Slept enemies cannot be woken up by damage"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Ana), Button(Ability 2)), Custom String(
"Multinade: Ana throws multiple Biotic Grenades"));
}
}
rule("Brigitte Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Brigitte;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Brigitte), Button(Ability 1)), Custom String(
"Heavy Iron: Hitting enemies with Whip Flail will root them in pace"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Brigitte), Button(Ultimate)), Custom String(
"Endeavor: Gain a health, damage and speed boost when your barrier breaks"));
}
}
rule("Mercy Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Mercy;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Mercy), Button(Ability 2)), Custom String(
"Angelic blessing: Healing an ally slowly charges their ultimate"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Mercy), Button(Ultimate)), Custom String(
"Holy light missiles: Unleash blasts of holy light missiles during valkyrie"));
}
}
rule("Lúcio Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Lúcio;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Lúcio), Button(Secondary Fire)), Custom String(
"Healing Wave: Soundwave heals allies for 30% of their max HP"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Lúcio), Button(Ability 1)), Custom String(
"Reverse Amp: Amp It Up inflicts the opposite effect of the currently played song to enemies"));
}
}
rule("Moira Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Moira;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Moira), Button(Secondary Fire)), Custom String(
"Hose: Biotic Grasp primary will damage and push enemies back"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Moira), Button(Ability 2)), Custom String(
"Flourish: Biotic Orbs are 3x more effective"));
}
}
rule("Baptiste Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Baptiste;
}
actions
{
Event Player.HeroTalentText[1] = Array(Icon String(Poison), Custom String(
"Corrode: Regenerative Burst will damage and poison enemies"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Baptiste), Button(Ability 2)), Custom String(
"Breakthrough: Immortality Field HP threshold increased to 100%; allies inside gain ultimate"));
}
}
rule("Ashe Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Ashe;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Ashe), Button(Ability 2)), Custom String(
"Wildfire: Shooting a burning enemy ignites other nearby enemies"));
Event Player.HeroTalentText[2] = Array(Icon String(Fire), Custom String(
"Flare trigger: Coach gun instantly damages all burning enemies"));
}
}
rule("D.Va Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
D.Va;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(D.Va), Button(Secondary Fire)), Custom String(
"Voltage Grid: Defense Matrix will damage and root enemies it's casted over"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(D.Va), Button(Ability 1)), Custom String(
"Shooting Star: Boosters set enemies on fire"));
}
}
rule("Genji Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Genji;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Genji), Button(Ability 1)), Custom String(
"Venomous Strike: Swift Strike poisons enemies; heal for poison damage"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Genji), Button(Ultimate)), Custom String(
"Dragon's Breath: Dragonblade fires large explosive energy charges"));
}
}
rule("Hanzo Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Hanzo;
}
actions
{
Event Player.HeroTalentText[1] = Array(Icon String(Bolt), Custom String(
"Stormbreak: Enemies eliminated by hanzo unleash a thundercloud"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Hanzo), Button(Ability 2)), Custom String(
"Punch II: Storm Arrows deal more damage and stun and knockback enemies"));
}
}
rule("Widowmaker Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Widowmaker;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Widowmaker), Button(Ultimate)), Custom String(
"Kiss Of Death: Scoped critical hits against enemies below 30% health explode and instantly die"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Widowmaker), Button(Ability 2)), Custom String(
"Epidemic: Enemies hurt by Venom Mine unleash toxic pulses; heal for dealt damage"));
}
}
rule("McCree Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Cassidy;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Cassidy), Button(Ability 2)), Custom String(
"Panic: Flashbang puts enemies in fear; deal +120% more damage to enemies in fear"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Cassidy), Button(Ultimate)), Custom String(
"Clocked: Deadeye deals more damage and knocks enemies down"));
}
}
rule("Reinhardt Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Reinhardt;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Reinhardt), Button(Ability 2)), Custom String(
"Fire Blast: Fire Strike explodes as it deals damage, setting enemies on fire"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Reinhardt), Button(Ultimate)), Custom String(
"Epicenter: Earthshatter travels in all directions"));
}
}
rule("Soldier: 76 Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Pharah), Button(Ultimate)), Custom String(
"Triple Threat: 2 more rockets are fired alongside Helix Rockets"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Soldier: 76), Button(Ability 1)), Custom String(
"Shoulder Check: Sprinting into enemies will damage and tackle them to the ground"));
}
}
rule("Torbjörn Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Torbjörn;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Torbjörn), Button(Ability 2)), Custom String(
"Melting point: Unleash heatwaves during overload and molten core"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Torbjörn), Button(Ultimate)), Custom String(
"Roots Of Magma: Enemies trapped in Molten Core blots cannot move"));
}
}
rule("Tracer Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Tracer;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Tracer), Button(Ability 2)), Custom String(
"Vortex: Recall pulls and roots enemies towards the activation point"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Tracer), Button(Ultimate)), Custom String(
"Chain Reaction: Pulse Bomb creates chain explosions on enemies damaged by it"));
}
}
rule("Winston Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Winston;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Winston), Button(Ability 2)), Custom String(
"Blast Barrier: Barrier Projector damages enemies inside the area"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Winston), Button(Ultimate)), Custom String(
"Next Generation: Eliminations during Primal Rage add +15% ultimate charge towards the next"));
}
}
rule("Pharah Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Pharah;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Pharah), Button(Ability 2)), Custom String(
"Head Trauma: Concussive Blast stuns and damages enemies for 25% of their max health"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Pharah), Button(Ability 1)), Custom String(
"Thunderbird: Gain 150 shields and deal 4x the damage to barriers and objects"));
}
}
rule("Bastion Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Bastion;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Echo), Button(Secondary Fire)), Custom String(
"Bomblets: Bullets shot during sentry configuration are explosive"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Symmetra), Button(Ability 1)), Custom String(
"Tesla: A powerful mounted laser will autmotically attack one enemy at a time"));
}
}
rule("Doomfist Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Doomfist;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Pharah), Button(Jump)), Custom String(
"Phase Shifter: Immune to damage while any ability is active"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Doomfist), Button(Ultimate)), Custom String(
"Fissure: Meteor Strike leaves a large fissure behind that burns enemies over it"));
}
}
rule("Echo Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Echo;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Echo), Button(Ability 2)), Custom String(
"Focusing Optics: Focusing Beam damage ramp starts at 90% health"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Echo), Button(Secondary Fire)), Custom String(
"Streamline: Fire many more sticky bombs per burst"));
}
}
rule("Junkrat Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Junkrat;
}
actions
{
Event Player.HeroTalentText[1] = Array(Icon String(Fire), Custom String("Pyromania: All explosive attacks inflict fire damage"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Junkrat), Button(Ability 2)), Custom String(
"Short Fused: Steel Trap sets off violent explosions once triggered"));
}
}
rule("Mei Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Mei;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Mei), Button(Ultimate)), Custom String(
"Cold Snap: Instantly freeze neaerby enemies once Cryo-Freeze expires"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Mei), Button(Ability 2)), Custom String(
"Icebound: While Ice Wall is up, Icicles freeze and deal much more damage"));
}
}
rule("Orisa Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Orisa;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Orisa), Button(Ability 1)), Custom String(
"Immovable Object: During Fortify, become immune and convert 50% of taken damage to healing"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Orisa), Button(Secondary Fire)), Custom String(
"Unstoppable Force: Halt! is much larger and pushes enemies. When triggered, it explodes violently"));
}
}
rule("Reaper Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Reaper), Button(Ability 1)), Custom String(
"shadow streak: shadow step creates a beam that damages enemies who cross"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Reaper), Button(Ultimate)), Custom String(
"Loom: Traumatize enemies in front of you when using Wraith Form"));
}
}
rule("Roadhog Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
actions
{
Event Player.HeroTalentText[1] = Array(Icon String(Poison), Custom String("Stench: Roadhog constantly damages enemies nearby"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Roadhog), Button(Ability 1)), Custom String(
"Rusted Anchor: Hook deals more damage; Eliminations will reset hook cooldown"));
}
}
rule("Sigma Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Sigma;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Sigma), Button(Ability 1)), Custom String(
"Gravity Well: Kinetic Grasp gives invincibility"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Sigma), Button(Ultimate)), Custom String(
"Gravity Channels: Gravitic Flux damages enemies for 75% of max hp instead of 50%"));
}
}
rule("Sombra Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Sombra;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Sombra), Button(Secondary Fire)), Custom String(
"Malware: Enemies hacked or in fear take +100% more damage"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Sombra), Button(Ultimate)), Custom String(
"Glitch: EMP leaves behind a large hack zone "));
}
}
rule("Symmetra Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Symmetra;
}
actions
{
Event Player.HeroTalentText[1] = Array(Icon String(Bolt), Custom String(
"High Voltage: Enemies eliminated by Symmetra explode and damage other enemies"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Symmetra), Button(Ultimate)), Custom String(
"Energy Source: While Photon Barrier is active, all players regenerate health and gain ultimate"));
}
}
rule("Wrecking Ball Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Wrecking Ball;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Wrecking Ball), Button(Ultimate)), Custom String(
"Mirror Ball: Reflect 100% of taken damage to nearby enemies"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Wrecking Ball), Button(Ability 2)), Custom String(
"Distort: Adaptive Shields damages and hacks nearby enemies"));
}
}
rule("Zarya Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Zarya;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Zarya), Button(Ability 1)), Custom String(
"Augment: Health and barrier hp increased by 50%; barrier sized doubled"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Echo), Button(Ability 2)), Custom String(
"Perpetual Energy: secondary inflicts burn damage that continues to last until the enemy dies"));
}
}
rule("Zenyatta Hero Talent Text")
{
event
{
Ongoing - Each Player;
Team 1;
Zenyatta;
}
actions
{
Event Player.HeroTalentText[1] = Array(Ability Icon String(Hero(Baptiste), Button(Ability 2)), Custom String(
"Vigor: The ally under the effect of Harmony Orb is immune to damage"));
Event Player.HeroTalentText[2] = Array(Ability Icon String(Hero(Zenyatta), Button(Ultimate)), Custom String(
"Perfect Balance: Transcendence damages enemies in a large proximity"));
}
}
rule("Ana: Sleep Paralysis")
{
event
{
Player Dealt Damage;
Team 1;
Ana;
}
conditions
{
Event Ability == Button(Ability 1);
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Black), Victim, 1);
Wait(0.250, Ignore Condition);
Set Status(Victim, Null, Knocked Down, 5);
}
}
rule("Ana: Multinade")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Event Player.AbilityCountdown = 4;
While(Event Player.AbilityCountdown > 0);
Wait(0.030, Ignore Condition);
Set Ability Cooldown(Event Player, Button(Ability 2), 0);
Cancel Primary Action(Event Player);
Wait(0.050, Ignore Condition);
Press Button(Event Player, Button(Ability 2));
Event Player.AbilityCountdown -= 1;
End;
Wait(2, Ignore Condition);
}
}
rule("Brigitte: Heavy Iron")
{
event
{
Player Dealt Damage;
Team 1;
Brigitte;
}
conditions
{
(Event Ability == Button(Primary Fire) || Event Ability == Button(Ability 1)) == True;
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Victim, 1.500);
Set Status(Victim, Null, Rooted, 0.500);
Set Environment Credit Player(Victim, Event Player);
}
}
rule("Brigitte: Endeavor")
{
event
{
Ongoing - Each Player;
Team 1;
Brigitte;
}
conditions
{
Ability Cooldown(Event Player, Button(Secondary Fire)) >= 0.100;
Event Player.Abilities[12] == True;
}
actions
{
Create Effect(All Players(All Teams), Ring, Color(Orange), 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 Of(Event Player), Off), Event Player, 200);
Event Player.DamageDealt *= 2.500;
Set Move Speed(Event Player, 100 * 1.750);
Add Health Pool To Player(Event Player, Armor, Max Health(Event Player) / 2, False, True);
Event Player.HP_Pool[1] = Last Created Health Pool;
Wait Until(Is Dead(Event Player), 6);
Event Player.DamageDealt = 100 + Global.DamageDone + Event Player.Abilities[13] * 5;
Set Move Speed(Event Player, 100);
Remove Health Pool From Player(Event Player.HP_Pool[1]);
Destroy Effect(Event Player.Effects_[1]);
}
}
rule("Mercy: Angelic Blessing")
{
event
{
Player Dealt Healing;
All;
Mercy;
}
conditions
{
Event Player.Abilities[8] == True;
Healee != Event Player;
Normalized Health(Healee) < True;
}
actions
{
Set Ultimate Charge(Healee, Ultimate Charge Percent(Healee) + 1);
Wait(0.400, Ignore Condition);
}
}
rule("Mercy: Aurora")
{
event
{
Ongoing - Each Player;
Team 1;
Mercy;
}
conditions
{
Event Player.Abilities[12] == True;
Is Using Ultimate(Event Player) == True;
}
actions
{
Wait(1.500, Ignore Condition);
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) * 60, All Living Players(All Teams), Event Player, True);
Create Beam Effect(All Players(All Teams), Mercy Heal Beam, Event Player, Event Player.Ability_Projectile1, Color(White),
Visible To Position and Radius);
Event Player.Effects_[3] = Last Created Entity;
Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, 70, Destination and Rate);
While(Event Player.Ability_End != Event Player.Ability_Projectile1);
Play Effect(All Players(All Teams), Good Explosion, Color(Yellow), Event Player.Ability_Projectile1, 1);
Wait(0.032, Ignore Condition);
End;
Destroy Effect(Event Player.Effects_[3]);
Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player.Ability_Projectile1, 5);
Play Effect(All Players(All Teams), Bad Explosion, Color(Orange), Event Player.Ability_Projectile1, 5);
Damage(Players Within Radius(Event Player.Ability_Projectile1, 5, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
120);
Loop If Condition Is True;
}
}
rule("Lucio: Healing Wave")
{
event
{
Ongoing - Each Player;
Team 1;
Lúcio;
}
conditions
{
Is Firing Secondary(Event Player) == True;
Event Player.Abilities[8] == 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 Of(Event Player), Surfaces),
Event Player, Max Health(Filtered Array(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player)
* 4, 4, Team Of(Event Player), Surfaces), Is Alive(Current Array Element))) * 0.300);
}
}
rule("Lucio: Reverse Amp")
{
event
{
Ongoing - Each Player;
Team 1;
Lúcio;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
If(Is Using Ability 1(Event Player));
Set Status(Players Within Radius(Event Player, 12, Opposite Team Of(Team Of(Event Player)), Surfaces), Null, Rooted, 4);
Else;
Damage(Players Within Radius(Event Player, 12, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 16.250);
End;
Play Effect(All Players(All Teams), Ring Explosion, Is Using Ability 1(Event Player) ? Color(Green) : Color(Yellow), Event Player,
1);
Wait(0.400, Ignore Condition);
Loop If Condition Is True;
}
}
rule("[Moira] Hose")
{
event
{
Ongoing - Each Player;
Team 1;
Moira;
}
conditions
{
Is Firing Primary(Event Player) == True;
Event Player.Abilities[8] == True;
Ability Resource(Event Player, Button(Primary Fire)) > False;
}
actions
{
Apply Impulse(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 25), Distance Between(
Event Player, Current Array Element) <= 15 && Is In Line of Sight(Event Player, Current Array Element,
Enemy Barriers Block LOS) && !Has Status(Current Array Element, Phased Out)), Facing Direction Of(Event Player), 15, To World,
Cancel Contrary Motion);
Apply Impulse(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 25), Distance Between(
Event Player, Current Array Element) <= 15 && !Is In Line of Sight(Current Array Element, Event Player,
Enemy Barriers Block LOS) && !Has Status(Current Array Element, Phased Out)), Up, 8, To World, Cancel Contrary Motion);
Start Damage Over Time(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 25),
Distance Between(Event Player, Current Array Element) <= 15 && Is In Line of Sight(Event Player, Current Array Element,
Enemy Barriers Block LOS)), Event Player, 1, 15);
Wait(0.300, Ignore Condition);
Loop If Condition Is True;
}
}
rule("[Moira] Flourish - Damage")
{
event
{
Player Dealt Damage;
Team 1;
Moira;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[12] == True;
}
actions
{
Damage(Victim, Event Player, Event Damage * 2);
Play Effect(All Players(All Teams), Good Explosion, Color(Violet), Victim, 0.100);
Wait(0.250, Ignore Condition);
}
}
rule("[Moira] Flourish - Healing")
{
event
{
Player Dealt Healing;
Team 1;
Moira;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[12] == True;
}
actions
{
Heal(Healee, Event Player, Event Healing * 2);
Play Effect(All Players(All Teams), Good Explosion, Color(Yellow), Healee, 0.100);
Wait(0.250, Ignore Condition);
}
}
rule("Baptiste: Corrode")
{
event
{
Ongoing - Each Player;
Team 1;
Baptiste;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Position Of(Event Player), 20);
Damage(Players Within Radius(Event Player, 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 25);
Start Damage Over Time(Players Within Radius(Event Player, 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 5,
20);
Wait(0.200, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Color(Violet), Position Of(Event Player), 18);
Damage(Players Within Radius(Event Player, 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 25);
Start Damage Over Time(Players Within Radius(Event Player, 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 5,
12);
}
}
rule("Baptiste: Breakthrough")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Has Status(Event Player, Unkillable) == True;
(Event Player.Abilities[12] ? Players On Hero(Hero(Baptiste), Team Of(Event Player)) : Empty Array).Abilities[12] == True;
}
actions
{
Heal(Event Player, Event Player, 10000);
Set Status(Event Player, Null, Invincible, 0.800);
Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 2);
Wait(0.750, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Ashe: Firebourne")
{
event
{
Player Dealt Damage;
Team 1;
Ashe;
}
conditions
{
Event Player.Abilities[8] == True;
Event Ability == Button(Primary Fire);
Has Status(Victim, Burning) == True;
}
actions
{
Set Status(Filtered Array(Players Within Radius(Victim, 5, Opposite Team Of(Team Of(Event Player)), Surfaces), Hero Of(
Current Array Element) != Hero(Torbjörn)), Null, Burning, 10);
Start Damage Over Time(Filtered Array(Players Within Radius(Victim, 5, Opposite Team Of(Team Of(Event Player)), Surfaces), Hero Of(
Current Array Element) != Hero(Torbjörn)), Event Player, 10, 15);
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Victim, 5);
Play Effect(All Players(All Teams), Bad Explosion, Color(Red), Victim, 5);
Wait(0.250, Ignore Condition);
}
}
rule("Ashe: Taunt")
{
event
{
Ongoing - Each Player;
Team 1;
Ashe;
}
conditions
{
Event Player.Abilities[12] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Damage(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Has Status(Current Array Element, Burning)),
Event Player, 125);
Set Status(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Has Status(Event Player, Burning)), Null, Frozen,
0.016);
Set Status(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Has Status(Event Player, Burning)), Null, Stunned,
2);
}
}
rule("D.Va: Voltage Grid")
{
event
{
Ongoing - Each Player;
Team 1;
D.Va;
}
conditions
{
Is Firing Secondary(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 2, 0.500);
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 5, 0.500);
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Eye Position(Event Player) + Facing Direction Of(Event Player)
* 8, 0.500);
Wait(0.300, Ignore Condition);
Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 2, 2.500, Opposite Team Of(Team Of(
Event Player)), Off), Event Player, 25);
Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 5, 2.500, Opposite Team Of(Team Of(
Event Player)), Off), Event Player, 25);
Damage(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 8, 2.500, Opposite Team Of(Team Of(
Event Player)), Off), Event Player, 25);
Wait(0.016, Ignore Condition);
Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 2, 2.500, Opposite Team Of(
Team Of(Event Player)), Off), Event Player, Rooted, 0.500);
Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 5, 2.500, Opposite Team Of(
Team Of(Event Player)), Off), Event Player, Rooted, 0.500);
Set Status(Players Within Radius(Eye Position(Event Player) + Facing Direction Of(Event Player) * 8, 2.500, Opposite Team Of(
Team Of(Event Player)), Off), Event Player, Rooted, 0.500);
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.Abilities[12] == True;
}
actions
{
Damage(Victim, Event Player, 40);
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("Genji: Venomous Strike")
{
event
{
Player Dealt Damage;
Team 1;
Genji;
}
conditions
{
Event Ability == Button(Ability 1);
Event Player.Abilities[8] == True;
}
actions
{
Start Heal Over Time(Event Player, Event Player, 3, 25);
Start Damage Over Time(Victim, Event Player, 3, 25);
Damage(Victim, Event Player, 25);
Heal(Event Player, Event Player, 25);
}
}
rule("Genji: Dragon's Breath")
{
event
{
Ongoing - Each Player;
Team 1;
Genji;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Is Firing Primary(Event Player) == True;
Event Player.Abilities[12] == 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(Opposite Team Of(Team Of(Event Player))), All Players(Team Of(Event Player)), True);
Wait Until(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, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
100);
}
}
rule("[Hanzo] Stormbreak (Storm_Effects6)")
{
event
{
Player Died;
Team 2;
All;
}
conditions
{
Attacker.Abilities[8] == True;
Hero Of(Attacker) == Hero(Hanzo);
}
actions
{
Event Player.Storm_Projectile = Eye Position(Event Player);
Event Player.Storm_EndPoint = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Up * 12, Null,
All Players(All Teams), False);
Chase Player Variable At Rate(Event Player, Storm_Projectile, Event Player.Storm_EndPoint, 4, Destination and Rate);
Create Effect(All Players(All Teams), Cloud, Color(White), Vector(False, -0.500, False) + Event Player.Storm_Projectile, 4,
Visible To Position and Radius);
Event Player.Storm_Effects[3] = Last Created Entity;
Create Effect(All Players(All Teams), Bad Aura, Color(White), Event Player.Storm_Projectile, 3, Visible To Position and Radius);
Event Player.Storm_Effects[4] = Last Created Entity;
Create Effect(All Players(All Teams), Cloud, Color(White), Event Player.Storm_Projectile, 3.500, Visible To Position and Radius);
Event Player.Storm_Effects[5] = Last Created Entity;
Create Beam Effect(All Players(All Teams), Bad Beam, Event Player.Storm_Projectile, Ray Cast Hit Position(
Event Player.Storm_Projectile, Vector(0.100, 0, 0) + Event Player.Storm_Projectile + Down * 1000, Null, All Players(All Teams),
False), Color(Aqua), Visible To Position and Radius);
Event Player.Storm_Effects[6] = Last Created Entity;
While(Distance Between(Event Player.Storm_Projectile, Event Player.Storm_EndPoint) > 1);
Wait(0.600, Ignore Condition);
Damage(Players Within Radius(Ray Cast Hit Position(Event Player.Storm_Projectile, Event Player.Storm_Projectile + Down * 1000,
Null, All Players(All Teams), False), 3, Team Of(Event Player), Surfaces), Attacker, 50);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Aqua), Ray Cast Hit Position(Event Player.Storm_Projectile,
Event Player.Storm_Projectile + Down * 1000, Null, All Players(All Teams), False), 3);
Play Effect(All Players(All Teams), Good Explosion, Color(Blue), Ray Cast Hit Position(Event Player.Storm_Projectile,
Event Player.Storm_Projectile + Down * 1000, Null, All Players(All Teams), False), 3);
End;
Destroy Effect(Event Player.Storm_Effects[3]);
Destroy Effect(Event Player.Storm_Effects[4]);
Destroy Effect(Event Player.Storm_Effects[5]);
Destroy Effect(Event Player.Storm_Effects[6]);
}
}
rule("Hanzo: Punch II")
{
event
{
Player Dealt Damage;
Team 1;
Hanzo;
}
conditions
{
Event Player.Abilities[12] == True;
Event Ability == Button(Ability 2);
Hero Of(Victim) != Hero(Torbjörn);
}
actions
{
Damage(Victim, Event Player, Event Damage * 0.800);
Apply Impulse(Victim, Facing Direction Of(Event Player), 12, To World, Cancel Contrary Motion);
Apply Impulse(Victim, Up, 5, To World, Cancel Contrary Motion);
Set Environment Credit Player(Victim, Event Player);
Set Status(Victim, Null, Stunned, 1);
}
}
rule("Widowmaker: Kiss Of Death")
{
event
{
Player Dealt Damage;
Team 1;
Widowmaker;
}
conditions
{
(Normalized Health(Victim) <= 0.300 || Event Damage >= Normalized Health(Victim) + Event Damage) == True;
Is Firing Secondary(Event Player) == True;
Event Ability == Button(Primary Fire);
Event Player.Abilities[8] == True;
Event Damage >= 40;
Event Was Critical Hit == True;
}
actions
{
Kill(Victim, Event Player);
Play Effect(All Players(All Teams), Bad Explosion, Color(Team 2), Victim, 3);
Damage(Players Within Radius(Victim, 3, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, Event Damage * 1.500);
}
}
rule("Widowmaker: Epidemic")
{
event
{
Player Dealt Damage;
Team 1;
Widowmaker;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[12] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Color(Violet), Victim, 8);
Play Effect(All Players(All Teams), Good Explosion, Color(Purple), Victim, 4);
Play Effect(All Players(All Teams), Ring Explosion, Color(Violet), Victim, 16);
Play Effect(All Players(All Teams), Bad Explosion, Color(White), Victim, 3);
Start Damage Over Time(Players Within Radius(Victim, 8, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 3, 50);
Start Heal Over Time(Event Player, Event Player, 3, 50);
Wait(0.500, Ignore Condition);
}
}
rule("McCree: Panic")
{
event
{
Player Dealt Damage;
Team 1;
Cassidy;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[8] == True;
}
actions
{
Victim.Feared_until = Total Time Elapsed + 3.500;
}
}
rule("McCree: Panic - Damage")
{
event
{
Ongoing - Each Player;
Team 1;
Cassidy;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Start Damage Modification(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))),
Event Player.Feared_until >= Total Time Elapsed), All Players(Team Of(Event Player)), 220,
Receivers Damagers and Damage Percent);
Event Player.Modification_Damage[1] = Last Damage Modification ID;
Wait Until(!Event Player.Abilities[8], 99999);
Stop Damage Modification(Event Player.Modification_Damage[1]);
}
}
rule("McCree: Clocked")
{
event
{
Player Dealt Damage;
Team 1;
Cassidy;
}
conditions
{
Event Ability == Button(Ultimate);
Event Player.Abilities[12] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Orange), Victim, 1);
Damage(Victim, Event Player, Event Damage * 1.500);
Set Status(Victim, Null, Knocked Down, 3);
}
}
rule("Reinhardt: Fire Blast")
{
event
{
Player Dealt Damage;
Team 1;
Reinhardt;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Victim, 5);
Start Damage Over Time(Players Within Radius(Victim, 5, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 5, 20);
Set Status(Players Within Radius(Victim, 5, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, Burning, 5);
}
}
rule("Reinhardt: Epicenter")
{
event
{
Ongoing - Each Player;
Team 1;
Reinhardt;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Is On Ground(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Set Status(Filtered Array(Players Within Radius(Event Player, 20, Opposite Team Of(Team Of(Event Player)), Surfaces), !Has Status(
Current Array Element, Knocked Down)), Event Player, Knocked Down, 2.500);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 10);
Damage(Filtered Array(Players Within Radius(Event Player, 20, Opposite Team Of(Team Of(Event Player)), Surfaces), !Has Status(
Current Array Element, Knocked Down)), Event Player, 50);
Wait(0.016, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 20);
Wait(0.016, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 30);
Wait(0.016, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 40);
Wait(5, Ignore Condition);
}
}
rule("[Soldier: 76] Rocket Assault Rifle")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Is Firing Secondary(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Event Player.Ability_Projectile2 = 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, Null, Null, False) + World Vector Of(
Vector(-2, 0, 0), Event Player, Rotation), Null, 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, Null, Null, False) + World Vector Of(
Vector(2, 0, 0), Event Player, Rotation), Null, Null, False);
Event Player.Ability_Position = Eye Position(Event Player) + Facing Direction Of(Event Player) + World Vector Of(Vector(0, -0.250,
0), Event Player, Rotation);
Event Player.Ability_End = Eye Position(Event Player) + Facing Direction Of(Event Player) + World Vector Of(Vector(0, -0.250, 0),
Event Player, Rotation);
Chase Player Variable At Rate(Event Player, Ability_Position, Event Player.Ability_Projectile1, 60, Destination and Rate);
Chase Player Variable At Rate(Event Player, Ability_End, Event Player.Ability_Projectile2, 60, Destination and Rate);
Wait Until(Event Player.Ability_Position == 0 && Event Player.Ability_End == 0, 2.500);
}
}
rule("[Soldier: 76] First Rocket Effect")
{
event
{
Ongoing - Each Player;
All;
Soldier: 76;
}
conditions
{
Event Player.Ability_Projectile1 != Event Player.Ability_Position;
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Random Value In Array(Array(Color(Sky Blue), Color(Aqua))),
Event Player.Ability_Position, 0.400);
Wait(0.050, Ignore Condition);
Loop If Condition Is True;
Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Event Player.Ability_Position, 100);
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.Ability_Position, 2.500);
Play Effect(All Players(All Teams), Bad Explosion, Color(Team 1), Event Player.Ability_Position, 2.500);
Stop Chasing Player Variable(Event Player, Ability_Position);
Wait(0.016, Ignore Condition);
Damage(Players Within Radius(Event Player.Ability_Position, 4, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
80);
Stop Chasing Player Variable(Event Player, Ability_Position);
Event Player.Ability_Position = 0;
Event Player.Ability_Projectile1 = 0;
Wait(0.016, Ignore Condition);
}
}
rule("[Soldier: 76] Second Rocket Effect")
{
event
{
Ongoing - Each Player;
All;
Soldier: 76;
}
conditions
{
Event Player.Ability_Projectile2 != Event Player.Ability_End;
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Random Value In Array(Array(Color(Sky Blue), Color(Aqua))),
Event Player.Ability_End, 0.400);
Wait(0.050, Ignore Condition);
Loop If Condition Is True;
Play Effect(All Players(All Teams), Explosion Sound, Color(Orange), Event Player.Ability_End, 100);
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.Ability_End, 2.500);
Play Effect(All Players(All Teams), Bad Explosion, Color(Team 1), Event Player.Ability_End, 2.500);
Stop Chasing Player Variable(Event Player, Ability_End);
Damage(Players Within Radius(Event Player.Ability_End, 4, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 80);
Event Player.Ability_End = 0;
Event Player.Ability_Projectile2 = 0;
}
}
rule("Soldier: 76 - Init rockets")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Event Player.Ability_Projectile1 = Event Player.Ability_Position;
Event Player.Ability_Projectile2 = Event Player.Ability_End;
}
}
rule("[Soldier: 76] Shoulder Check")
{
event
{
Ongoing - Each Player;
Team 1;
Soldier: 76;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.Abilities[12] == True;
Distance Between(Event Player, Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player)))) <= 3;
Is Alive(Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player)))) == True;
}
actions
{
Damage(Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player))), Event Player, 55);
Set Status(Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player))), Null, Knocked Down, 1.500);
Apply Impulse(Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player))), Facing Direction Of(Event Player), 15,
To World, Cancel Contrary Motion);
Apply Impulse(Event Player, Vector(0, 8, 15), 15, To Player, Cancel Contrary Motion);
Play Effect(All Players(All Teams), Bad Explosion, Color(White), Closest Player To(Event Player, Opposite Team Of(Team Of(
Event Player))), 1);
Set Ability Cooldown(Event Player, Button(Melee), 0);
Press Button(Event Player, Button(Melee));
Wait(1, Ignore Condition);
}
}
rule("Torbjorn: Melting Point")
{
event
{
Ongoing - Each Player;
Team 1;
Torbjörn;
}
conditions
{
Event Player.Abilities[8] == True;
(Is Using Ability 2(Event Player) || Is Using Ultimate(Event Player)) == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Color(Orange), Event Player, 8);
Play Effect(All Players(All Teams), Bad Explosion, Color(Yellow), Event Player, 8);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Position Of(Event Player), 16);
Start Damage Over Time(Players Within Radius(Event Player, 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 3,
25);
Set Status(Players Within Radius(Event Player, 10, Opposite Team Of(Team Of(Event Player)), Off), Null, Burning, 3);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(White), Event Player, 100);
Wait(0.750, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Torbjorn: Roots of Magma")
{
event
{
Player Dealt Damage;
Team 1;
Torbjörn;
}
conditions
{
Event Ability == Button(Ultimate);
Event Player.Abilities[12] == True;
}
actions
{
Play Effect(All Players(All Teams), Good Pickup Effect, Color(Orange), Victim, 1);
Set Status(Victim, Null, Rooted, 1);
Wait(1, Ignore Condition);
}
}
rule("Tracer: Vortex")
{
event
{
Ongoing - Each Player;
Team 1;
Tracer;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Heal(Players Within Radius(Event Player, 12, Opposite Team Of(Team Of(Event Player)), Surfaces), Null, 0);
Damage(Players Within Radius(Event Player, 12, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 10);
Play Effect(All Players(All Teams), Ring Explosion, Color(Red), Position Of(Event Player), 24);
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), 12);
Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Position Of(Event Player), 6);
Set Environment Credit Player(Players Within Radius(Event Player, 8, Opposite Team Of(Team Of(Event Player)), Surfaces),
Event Player);
}
}
rule("Tracer: Vortex 2")
{
event
{
Player Received Healing;
Team 2;
All;
}
conditions
{
Healer.Abilities[8] == True;
Hero Of(Healer) == Hero(Tracer);
Is Using Ability 2(Healer) == True;
Event Ability == Null;
Event Damage <= 20;
}
actions
{
Apply Impulse(Event Player, Up, 5, To World, Cancel Contrary Motion);
Wait(0.100, Ignore Condition);
Apply Impulse(Event Player, Direction Towards(Event Player, Healer), Distance Between(Event Player, Healer) * 3.500, To World,
Cancel Contrary Motion);
Set Status(Event Player, Null, Rooted, 1.300);
}
}
rule("Tracer: Chain Reaction")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Is True For Any(Filtered Array(All Players(Team Of(Event Player)), Current Array Element.Chain_Reaction_On), Distance Between(
Event Player, Current Array Element) <= 8 && True) == 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;
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player, 3);
}
}
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), Opposite Team Of(Team Of(Event Player))), 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;
}
conditions
{
Event Ability == Button(Ultimate);
Event Damage > 20;
Event Player.Abilities[12] == True;
}
actions
{
Victim.Chain_Reaction_On = True;
}
}
rule("[Winston] Electric Field")
{
event
{
Ongoing - Each Player;
Team 1;
Winston;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Damage(Players Within Radius(Event Player.Ability_Projectile1, 6, Opposite Team Of(Team Of(Event Player)), Off), Event Player, 65);
Destroy Effect(Event Player.Effects_[1]);
Event Player.Ability_Active = True;
Create Effect(All Players(All Teams), Orb, Color(White), Event Player.Ability_Projectile1, 1, Visible To Position and Radius);
Event Player.Effects_[1] = Last Created Entity;
Stop Chasing Player Variable(Event Player, Ability_Resource);
Event Player.Ability_Projectile1 = Eye Position(Event Player);
Event Player.Ability_End = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Down * 1000, Null,
All Players(All Teams), False);
Wait(0.100, Ignore Condition);
Event Player.Ability_Resource = 5;
Wait(0.250, Ignore Condition);
Chase Player Variable At Rate(Event Player, Ability_Resource, 20, 7, Destination and Rate);
Chase Player Variable At Rate(Event Player, Ability_Projectile1, Event Player.Ability_End, Event Player.Ability_Resource,
Destination and Rate);
Wait(8.650, Restart When True);
Event Player.Ability_Active = False;
}
}
rule("[Winston] Electric Field 2")
{
event
{
Ongoing - Each Player;
Team 1;
Winston;
}
conditions
{
Event Player.Ability_Active == True;
Event Player.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion, Color(Aqua), Event Player.Ability_Projectile1, 5);
Damage(Players Within Radius(Event Player.Ability_Projectile1, 5, Opposite Team Of(Team Of(Event Player)), Off), Event Player, 33);
Play Effect(All Players(All Teams), Ring Explosion, Color(Blue), Event Player.Ability_Projectile1, 10);
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
Damage(Players Within Radius(Event Player.Ability_Projectile1, 6, Opposite Team Of(Team Of(Event Player)), Off), Event Player, 80);
Play Effect(All Players(All Teams), Bad Explosion, Color(Turquoise), Event Player.Ability_Projectile1, 12);
Destroy Effect(Event Player.Effects_[1]);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(White), Event Player.Ability_Projectile1, 125);
}
}
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.Abilities[12] == True;
}
actions
{
Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 15);
}
}
rule("Pharah: Head Trauma")
{
event
{
Player Dealt Knockback;
Team 1;
Pharah;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[8] == True;
Victim != Event Player;
}
actions
{
Damage(Victim, Event Player, Max Health(Victim) * 0.300);
Set Status(Victim, Event Player, Knocked Down, 1);
Play Effect(All Players(All Teams), Good Explosion, Color(Team 1), Victim, 1);
}
}
rule("Pharah: Thunderbird")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[12] == True;
Hero Of(Event Player) == Hero(Pharah);
}
actions
{
Event Player.DamageDealt *= 4;
Start Damage Modification(All Players(All Teams), Event Player, 25, Receivers Damagers and Damage Percent);
Event Player.Modification_Damage[1] = Last Damage Modification ID;
Add Health Pool To Player(Event Player, Shields, 150, True, True);
Event Player.HP_Pool[1] = Last Created Health Pool;
Wait Until(!Event Player.Abilities[12] || Hero Of(Event Player) != Hero(Pharah), 99999);
Event Player.DamageDealt = 100 + Global.DamageDone + Event Player.Abilities[13] * 5;
Stop Damage Modification(Event Player.Modification_Damage[1]);
Remove Health Pool From Player(Event Player.HP_Pool[1]);
}
}
rule("Orisa: Unstoppable Force")
{
event
{
Ongoing - Each Player;
Team 1;
Orisa;
}
conditions
{
Is Firing Secondary(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Event Player.Gen_Direction = Facing Direction Of(Event Player);
Event Player.Ability_Active = True;
Create Effect(All Players(All Teams), Sphere, Color(Green), Event Player.Ability_Projectile1, 4, Visible To Position and Radius);
Event Player.Effects_[1] = Last Created Entity;
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.Gen_Available && Is Button Held(Event Player, Button(Secondary Fire))) || (
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, Opposite Team Of(Team Of(Event Player)), Off), Event Player,
100);
Play Effect(All Players(All Teams), Good Explosion, Color(Lime Green), Event Player.Ability_Projectile1, 5);
Destroy Effect(Event Player.Effects_[1]);
Event Player.Ability_Active = False;
}
}
rule("Orisa: Availability for Halt!")
{
event
{
Ongoing - Each Player;
Team 1;
Orisa;
}
conditions
{
Is Firing Secondary(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Event Player.Gen_Available = True;
Wait Until(!Is Button Held(Event Player, Button(Secondary Fire)), 99999);
Event Player.Gen_Available = False;
}
}
rule("Orisa: Drag effect")
{
event
{
Ongoing - Each Player;
Team 1;
Orisa;
}
conditions
{
Event Player.Abilities[12] == True;
Event Player.Ability_Active == True;
}
actions
{
Apply Impulse(Players Within Radius(Event Player.Ability_Projectile1, 5, Opposite Team Of(Team Of(Event Player)), Surfaces),
Direction Towards(Is Alive(Event Player) ? Players Within Radius(Event Player.Ability_Projectile1, 5, Opposite Team Of(Team Of(
Event Player)), Surfaces) : Empty Array, Event Player.Ability_Projectile1), 8, To World, Cancel Contrary Motion);
Apply Impulse(Players Within Radius(Event Player.Ability_Projectile1, 5, Opposite Team Of(Team Of(Event Player)), Surfaces),
Direction Towards(Event Player.Ability_Projectile1, Event Player.Ability_End), 20, To World, Cancel Contrary Motion);
Apply Impulse(Players Within Radius(Event Player.Ability_Projectile1, 5, Opposite Team Of(Team Of(Event Player)), Surfaces), Up, 5,
To Player, Cancel Contrary Motion);
Wait(0.200, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Orisa: Immoveable Object - Reduce dmg")
{
event
{
Ongoing - Each Player;
Team 1;
Orisa;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Set Damage Received(Event Player, 100 * 0.003);
Wait Until(!Is Using Ability 1(Event Player), 99999);
Set Damage Received(Event Player, 100);
}
}
rule("Orisa: Immovable Object - Healing")
{
event
{
Player Took Damage;
Team 1;
Orisa;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Heal(Event Player, Null, Event Damage * 3);
}
}
rule("[Reaper] Shadow Streak (Sethh)")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
conditions
{
Event Player.Abilities[8] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Event Player.Ability_Position = Position Of(Event Player) + Vector(0, 1, 0);
Wait(2, Abort When False);
Event Player.Ability_End = Position Of(Event Player) + Vector(0, 1, 0);
Create Beam Effect(All Players(All Teams), Bad Beam, Event Player.Ability_End, Event Player.Ability_Position, Color(Black),
Visible To Position and Radius);
Event Player.Effects_[1] = Last Created Entity;
Event Player.Ability_Active = True;
Wait Until(Is Dead(Event Player) || Is Using Ability 2(Event Player), 99999);
Destroy Effect(Event Player.Effects_[1]);
Event Player.Ability_Active = False;
Loop If Condition Is True;
}
}
rule("[Reaper] Shadow Streak - Damage start to end (Sethh)")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
conditions
{
Event Player.Abilities[8] == True;
Ray Cast Hit Player(Event Player.Ability_Position, Event Player.Ability_End, All Living Players(Opposite Team Of(Team Of(
Event Player))), Event Player, False) != Null;
Is Using Ability 2(Event Player) == False;
Event Player.Ability_Active == True;
}
actions
{
Play Effect(All Players(All Teams), Moira Fade Disappear Effect, Color(White), Ray Cast Hit Player(Event Player.Ability_Position,
Event Player.Ability_End, All Living Players(All Teams), Event Player, True), 1);
Damage(Players Within Radius(Ray Cast Hit Player(Event Player.Ability_Position, Event Player.Ability_End, All Living Players(
Opposite Team Of(Team Of(Event Player))), All Players(Team Of(Event Player)), True), 4, Opposite Team Of(Team Of(
Event Player)), Off), Event Player, 40);
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
}
}
rule("[Reaper] Shadow Streak - Damage end to start (Sethh)")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
conditions
{
Event Player.Abilities[8] == True;
Ray Cast Hit Player(Event Player.Ability_End, Event Player.Ability_Position, All Players(Opposite Team Of(Team Of(Event Player))),
Event Player, False) != Null;
Is Using Ability 2(Event Player) == False;
Event Player.Ability_Active == True;
}
actions
{
Damage(Players Within Radius(Ray Cast Hit Player(Event Player.Ability_End, Event Player.Ability_Position, All Living Players(
Opposite Team Of(Team Of(Event Player))), All Players(Team Of(Event Player)), True), 4, Opposite Team Of(Team Of(
Event Player)), Off), Event Player, 40);
Play Effect(All Players(All Teams), Moira Fade Disappear Effect, Color(White), Ray Cast Hit Player(Event Player.Ability_End,
Event Player.Ability_Position, All Living Players(All Teams), Event Player, True), 1);
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Reaper: Loom")
{
event
{
Ongoing - Each Player;
Team 1;
Reaper;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Set Status(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 45), Is In Line of Sight(
Event Player, Current Array Element, Barriers Do Not Block LOS)), Event Player, Hacked, 1.500);
Set Status(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 45), Is In Line of Sight(
Event Player, Current Array Element, Barriers Do Not Block LOS)), Event Player, Rooted, 1.500);
Damage(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 45), Is In Line of Sight(
Current Array Element, Event Player, Barriers Do Not Block LOS)), Event Player, 45);
}
}
rule("Sigma: Gravity Well")
{
event
{
Ongoing - Each Player;
Team 1;
Sigma;
}
conditions
{
Is Using Ability 1(Event Player) == True;
Event Player.Abilities[8] == True;
}
actions
{
Damage(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 90), Is In Line of Sight(
Event Player, Current Array Element, Barriers Do Not Block LOS)), Event Player, 25);
Set Status(Filtered Array(Players in View Angle(Event Player, Opposite Team Of(Team Of(Event Player)), 90), Is In Line of Sight(
Current Array Element, Event Player, Barriers Do Not Block LOS)), Null, Rooted, 2);
Set Status(Event Player, Null, Invincible, 1);
Play Effect(Event Player, Ring Explosion, Color(Blue), Eye Position(Event Player), 50);
Wait(0.300, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Sigma: Gravity Channels")
{
event
{
Ongoing - Each Player;
Team 1;
Sigma;
}
conditions
{
Event Player.Abilities[12] == True;
}
actions
{
Start Damage Modification(Filtered Array(All Players(All Teams), Is Using Ultimate(Event Player)), Event Player, 150,
Receivers Damagers and Damage Percent);
Event Player.Modification_Damage[1] = Last Damage Modification ID;
Wait Until(!Event Player.Abilities[12], 99999);
Stop Damage Modification(Event Player.Modification_Damage[1]);
}
}
rule("Echo: Focusing Optics")
{
event
{
Player Dealt Damage;
Team 1;
Echo;
}
conditions
{
Event Ability == Button(Ability 2);
Event Player.Abilities[8] == True;
Normalized Health(Victim) > 0.500;
Normalized Health(Victim) <= 0.900;
Is Duplicating(Event Player) == False;
}
actions
{
Damage(Victim, Event Player, Event Damage * 3);
Play Effect(All Players(All Teams), Bad Explosion, Color(Violet), Victim, 0.500);
}
}
rule("Echo: Streamline")
{
event
{
Ongoing - Each Player;
Team 1;
Echo;
}
conditions
{
Event Player.Abilities[12] == True;
Is Firing Secondary(Event Player) == True;
Is Duplicating(Event Player) == False;
}
actions
{
Wait(0.700, Abort When False);
Cancel Primary Action(Event Player);
}
}
rule("Echo: Streamline")
{
event
{
Ongoing - Each Player;
Team 1;
Echo;
}
conditions
{
Event Player.Abilities[12] == True;
Is Firing Secondary(Event Player) == True;
Is Duplicating(Event Player) == False;
}
actions
{
Set Projectile Speed(Event Player, 100);
Wait(0.150, Ignore Condition);
Loop If Condition Is True;
}
}
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.Abilities[8] == True;
}
actions
{
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Orange), Null + Ray Cast Hit Position(Eye Position(Event Player),
Eye Position(Event Player) + Facing Direction Of(Event Player) * 60, All Living Players(Opposite Team Of(Team Of(
Event Player))), All Players(Team Of(Event Player)), 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(Opposite Team Of(Team Of(Event Player))), All Players(Team Of(Event Player)), True), 2,
Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 12);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Bastion: Taser - Loop damage")
{
event
{
Ongoing - Each Player;
Team 1;
Bastion;
}
conditions
{
Is True For Any(Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player))), Is Alive(Current Array Element)
&& Is In Line of Sight(Event Player, Current Array Element, Barriers Do Not Block LOS) && !Has Status(Current Array Element,
Phased Out) && Distance Between(Event Player, Current Array Element) <= 25) == True;
Is Alive(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Play Effect(All Players(All Teams), Explosion Sound, Color(White), Event Player.Ability_Player, 80);
Play Effect(All Players(All Teams), Bad Pickup Effect, Color(Aqua), Event Player.Ability_Player, 1);
Event Player.Ability_Player = Filtered Array(Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player))), Is Alive(
Current Array Element) && Is In Line of Sight(Event Player, Current Array Element, Barriers Do Not Block LOS) && !Has Status(
Current Array Element, Phased Out) && Distance Between(Event Player, Current Array Element) <= 25);
Damage(Players Within Radius(Event Player.Ability_Player, 3, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 30);
Wait(0.450, Ignore Condition);
Loop If Condition Is True;
Event Player.Ability_Player = Null;
}
}
rule("Bastion: Taser - Visual beam")
{
event
{
Ongoing - Each Player;
Team 1;
Bastion;
}
conditions
{
Event Player.Abilities[12] == True;
}
actions
{
Create Beam Effect(All Players(All Teams), Bad Beam, Event Player + Vector(False, 1, False),
Event Player.Ability_Player != Null ? Event Player.Ability_Player : Event Player, Color(Aqua),
Visible To Position Radius and Color);
Event Player.Effects_[1] = Last Created Entity;
Wait Until(!Event Player.Abilities[12], 99999);
Destroy Effect(Event Player.Effects_[1]);
}
}
rule("Sombra: Malware")
{
event
{
Ongoing - Each Player;
Team 1;
Sombra;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Start Damage Modification(Filtered Array(All Players(Opposite Team Of(Team Of(Event Player))), Has Status(Current Array Element,
Hacked) || Current Array Element.Feared_until >= Total Time Elapsed), All Players(Team Of(Event Player)), 200,
Receivers Damagers and Damage Percent);
Event Player.Modification_Damage[1] = Last Damage Modification ID;
Wait Until(!Event Player.Abilities[8], 99999);
Stop Damage Modification(Event Player.Modification_Damage[1]);
}
}
rule("Sombra: Glitch")
{
event
{
Ongoing - Each Player;
Team 1;
Sombra;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Event Player.Ability_Active = True;
Event Player.Ability_Position = Position Of(Event Player);
Create Effect(All Players(All Teams), Sphere, Color(Purple), Event Player.Ability_Position, 15, Visible To Position and Radius);
Event Player.Effects_[1] = Last Created Entity;
Wait(8, Ignore Condition);
Destroy Effect(Event Player.Effects_[1]);
Event Player.Ability_Active = False;
}
}
rule("Sombra: Glitch - Loop")
{
event
{
Ongoing - Each Player;
Team 1;
Sombra;
}
conditions
{
Event Player.Ability_Active == True;
}
actions
{
Set Status(Players Within Radius(Event Player.Ability_Position, 15, Opposite Team Of(Team Of(Event Player)), Off), Null, Hacked,
0.750);
Wait(0.500, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Mei: Cold Snap")
{
event
{
Ongoing - Each Player;
Team 1;
Mei;
}
conditions
{
Event Player.Abilities[8] == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Create Effect(All Players(All Teams), Bad Aura, Color(Sky Blue), Event Player, 1, Visible To Position and Radius);
Event Player.Effects_[1] = Last Created Entity;
Wait Until(!Is Using Ability 1(Event Player), 99999);
Destroy Effect(Event Player.Effects_[1]);
Damage(Players Within Radius(Eye Position(Event Player), 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 5);
Set Status(Players Within Radius(Eye Position(Event Player), 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
Frozen, 2);
Set Status(Players Within Radius(Eye Position(Event Player), 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
Rooted, 2);
Play Effect(All Players(All Teams), Ring Explosion, Color(White), Position Of(Event Player), 20);
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, 0), 20);
}
}
rule("Mei: Icebound")
{
event
{
Ongoing - Each Player;
Team 1;
Mei;
}
conditions
{
Is Using Ability 2(Event Player) == True;
Is Firing Secondary(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Create Effect(All Players(All Teams), Ring, Color(Aqua), Event Player, 0.400, Visible To Position and Radius);
Event Player.Effects_[2] = Last Created Entity;
Set Projectile Speed(Event Player, 200);
Wait Until(!Is Firing Secondary(Event Player), 99999);
Destroy Effect(Event Player.Effects_[2]);
Set Projectile Speed(Event Player, 100);
}
}
rule("Mei: Icebound - Icicles hit")
{
event
{
Player Dealt Damage;
Team 1;
Mei;
}
conditions
{
Event Ability == Button(Secondary Fire);
Is Using Ability 2(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Damage(Victim, Event Player, Event Damage * 1.250);
Set Status(Victim, Null, Frozen, 1);
Set Status(Victim, Null, Rooted, 1);
Play Effect(All Players(All Teams), Good Pickup Effect, Color(White), Victim, 1);
}
}
rule("Wrecking Ball: Mirror Ball")
{
event
{
Player Took Damage;
Team 1;
Wrecking Ball;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Damage(Players Within Radius(Event Player, 4.500, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, Event Damage);
Wait(0.100, Ignore Condition);
}
}
rule("Wrecking Ball: Distort")
{
event
{
Ongoing - Each Player;
Team 1;
Wrecking Ball;
}
conditions
{
Event Player.Abilities[12] == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion, Color(Purple), Position Of(Event Player), 20);
Damage(Players Within Radius(Event Player, 8, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 80);
Wait(0.100, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Color(Violet), Position Of(Event Player), 18);
Set Status(Players Within Radius(Event Player, 8, Opposite Team Of(Team Of(Event Player)), Surfaces), Null, Hacked, Count Of(
Players Within Radius(Event Player, 8, Opposite Team Of(Team Of(Event Player)), Surfaces)) * 1.500);
Play Effect(All Players(All Teams), Ring Explosion Sound, Color(Violet), Position Of(Event Player), 125);
Play Effect(All Players(All Teams), Junkrat RIP Tire Explosion Sound, Color(Purple), Position Of(Event Player), 16);
Play Effect(All Players(All Teams), Explosion Sound, Color(Violet), Position Of(Event Player), 80);
}
}
rule("Symmetra: High voltage")
{
event
{
Player Dealt Final Blow;
Team 1;
Symmetra;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Wait(0.250, Ignore Condition);
Play Effect(All Players(All Teams), Good Explosion, Color(Blue), Victim, 10);
Play Effect(All Players(All Teams), Bad Explosion, Color(Aqua), Victim, 8);
Damage(Players Within Radius(Victim, 10, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 150);
}
}
rule("Symmetra: Energy Source")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is True For Any(Players On Hero(Hero(Symmetra), Team Of(Event Player)), Is Using Ultimate(Current Array Element)
&& Current Array Element.Abilities[12]) == True;
}
actions
{
Start Heal Over Time(Event Player, Event Player, 1, 40);
Play Effect(All Players(All Teams), Good Explosion, Color(Blue), Event Player, 0.100);
Set Ultimate Charge(Event Player, Ultimate Charge Percent(Event Player) + 2);
Wait(0.900, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Junkrat: Pyromania")
{
event
{
Player Dealt Knockback;
Team 1;
Junkrat;
}
conditions
{
Event Player.Abilities[8] == True;
Event Ability != Button(Melee);
Victim != Event Player;
}
actions
{
Start Damage Over Time(Victim, Event Player, 2, 30);
Set Status(Victim, Null, Burning, 2);
}
}
rule("Junkrat: Short Fused")
{
event
{
Player Dealt Damage;
Team 1;
Junkrat;
}
conditions
{
Event Player.Abilities[12] == True;
Event Ability == Button(Ability 2);
}
actions
{
Event Player.Ability_Countdown = 4;
While(Event Player.Ability_Countdown > 0);
Event Player.Ability_Countdown -= 1;
Event Player.Ability_Position = Position Of(Victim) + Vector(Random Real(-2, 2), Random Real(-2, 2), Random Real(-2, 2));
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player.Ability_Position, 4);
Play Effect(All Players(All Teams), Good Explosion, Color(White), Event Player.Ability_Position, 4);
Damage(Players Within Radius(Event Player.Ability_Position, 4, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
35);
Set Status(Players Within Radius(Event Player.Ability_Position, 4, Opposite Team Of(Team Of(Event Player)), Surfaces),
Event Player, Stunned, 0.800);
Wait(0.200, Ignore Condition);
End;
}
}
rule("Zenyatta: Vigor")
{
event
{
Player Dealt Healing;
Team 1;
Zenyatta;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Set Status(Healee, Null, Invincible, 1);
Wait(0.800, Ignore Condition);
}
}
rule("Zenyatta: Perfect Balance")
{
event
{
Ongoing - Each Player;
Team 1;
Zenyatta;
}
conditions
{
Is Using Ultimate(Event Player) == True;
Event Player.Abilities[12] == True;
}
actions
{
Start Damage Over Time(Players Within Radius(Event Player, 12, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player,
0.750, 200);
Play Effect(All Players(All Teams), Ring Explosion, Color(Orange), Event Player, 24);
Wait(0.600, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Roadhog: Stench")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
conditions
{
Event Player.Abilities[8] == 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.Abilities[8] || Hero Of(Event Player) != Hero(Roadhog), 99999);
Destroy Effect(Event Player.Effects_[1]);
}
}
rule("Roadhog: Stench effect")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
conditions
{
Distance Between(Event Player, Closest Player To(Event Player, Opposite Team Of(Team Of(Event Player)))) <= 8;
Event Player.Abilities[8] == True;
}
actions
{
Damage(Players Within Radius(Event Player, 8, Opposite Team Of(Team Of(Event Player)), Surfaces), Event Player, 9);
Wait(0.250, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Roadhog: Rusted Anchor")
{
event
{
Ongoing - Each Player;
Team 1;
Roadhog;
}
conditions
{
Event Player.Abilities[12] == True;
}
actions
{
Start Damage Modification(Filtered Array(All Players(All Teams), Is Using Ability 1(Event Player)), Event Player, 400,
Receivers Damagers and Damage Percent);
Event Player.Modification_Damage[1] = Last Damage Modification ID;
Wait Until(!Event Player.Abilities[8] || Hero Of(Event Player) != Hero(Roadhog), 99999);
Stop Damage Modification(Event Player.Modification_Damage[1]);
}
}
rule("Roadhog: Rusted Anchor - Reset cooldown")
{
event
{
Player Earned Elimination;
Team 1;
Roadhog;
}
conditions
{
Event Player.Abilities[12] == True;
}
actions
{
Wait Until(!Is Using Ability 1(Event Player), 3);
Set Ability Cooldown(Event Player, Button(Ability 1), False);
}
}
rule("Zarya: Augment")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[8] == True;
}
actions
{
Start Scaling Barriers(Event Player, 2, True);
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5 + 50;
Set Max Health(Event Player, Event Player.PlayerHealth);
Wait Until(!Event Player.Abilities[8] || Hero Of(Event Player) != Hero(Zarya), 99999);
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
Stop Scaling Barriers(Event Player);
}
}
rule("Zarya: Perpetual Energy")
{
event
{
Player Dealt Knockback;
Team 1;
Zarya;
}
conditions
{
Event Ability == Button(Secondary Fire);
Event Player.Abilities[12] == True;
Victim != Event Player;
}
actions
{
Start Damage Over Time(Victim, Event Player, 9999, 15);
Set Status(Victim, Null, Burning, 9999);
}
}
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.Abilities[8] == True;
}
actions
{
Set Status(Event Player, Null, Phased Out, 1);
Wait(1, 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.Abilities[12] == True;
}
actions
{
Wait Until(!Is Using Ultimate(Event Player), 99999);
Event Player.Ability_Position = 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.Abilities[12] == True;
}
actions
{
Create Effect(All Players(All Teams), Ring, Color(Orange), Event Player.Ability_Position, 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_Position, 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_Position, 16);
While(Event Player.Ability_Active == True);
Damage(Players Within Radius(Event Player.Ability_Position, 8, Opposite Team Of(Team Of(Event Player)), Off), Event Player, 34);
Wait(0.235, Ignore Condition);
End;
Destroy Effect(Event Player.Effects_[1]);
Destroy Effect(Event Player.Effects_[2]);
}
}
rule("Team 1 (Perk): Sharpshooter")
{
event
{
Player Dealt Damage;
Team 1;
All;
}
conditions
{
Global.Perk[0] == True;
Event Ability != Null;
Distance Between(Event Player, Victim) >= 10;
}
actions
{
Damage(Victim, Event Player, 50 / Event Player.DamageDealt * Event Damage);
}
}
rule("Team 1 (Perk): Bulletstorm")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.Perk[1] == True;
(Ammo(Event Player, 0) < Max Ammo(Event Player, 0) || Ammo(Event Player, 1) < Max Ammo(Event Player, 1)) == True;
}
actions
{
Set Ammo(Event Player, 0, 1000);
Set Ammo(Event Player, 1, 1000);
}
}
rule("Team 1 Challenges")
{
event
{
Player Joined Match;
Team 1;
All;
}
actions
{
If(Global.Perk[2] == 1);
Create HUD Text(Event Player, Null, Null, Custom String("Up You Go"), Left, 917, Color(White), Color(White), Color(Turquoise),
Visible To and String, Default Visibility);
Event Player.AbilityHUD[17] = Last Text ID;
End;
If(Global.Perk[0] == 1);
Create HUD Text(Event Player, Null, Null, Custom String("Sharpshooter"), Left, 918, Color(White), Color(White), Color(Turquoise),
Visible To and String, Default Visibility);
Event Player.AbilityHUD[18] = Last Text ID;
End;
If(Global.Perk[1] == 1);
Create HUD Text(Event Player, Null, Null, Custom String("Bulletstorm"), Left, 919, Color(White), Color(White), Color(Turquoise),
Visible To and String, Default Visibility);
Event Player.AbilityHUD[19] = Last Text ID;
End;
If(Global.MaxHealthDone == 50);
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
End;
}
}
rule("Remove Auto Repair when Player leaves")
{
event
{
Player Left Match;
Team 1;
All;
}
actions
{
Global.AutoRepair -= Event Player.Abilities[16];
}
}
rule("Refund")
{
event
{
Subroutine;
Refund;
}
actions
{
"Refund Money"
Event Player.Money[0] += Event Player.Money[1];
Event Player.Money[1] = 0;
"Reset Headhunter"
Event Player.Abilities[1] = 0;
"Reset Ambush"
Event Player.Abilities[2] = 0;
"Reset QuickFix"
Event Player.Abilities[3] = 0;
"Reset HeavyWeight"
Event Player.Abilities[4] = 0;
"Reset Charged"
Event Player.Abilities[5] = 0;
"Reset Haste"
Event Player.Abilities[6] = 0;
"Reset HeavyImpact"
Event Player.Abilities[7] = 0;
"Reset HeroTalent1"
Event Player.Abilities[8] = 0;
"Reset SecondWind"
Event Player.Abilities[9] = 0;
"Reset BindingHeal"
Event Player.Abilities[10] = 0;
"Reset Resilience"
Event Player.Abilities[11] = 0;
"Reset HeroTalent2"
Event Player.Abilities[12] = 0;
"Reset Damage"
Event Player.Abilities[13] = 0;
Event Player.DamageDealt = 100 + Global.DamageDone + Event Player.Abilities[13] * 5;
Set Damage Dealt(Event Player, Event Player.DamageDealt);
"Reset Health"
Event Player.Abilities[14] = 0;
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
If(Global.MaxHealthDone == 0);
End;
"Reset Healing"
Event Player.Abilities[15] = 0;
Set Healing Dealt(Event Player, 100 + Event Player.Abilities[15] * 5);
"Reset AutoRepair"
Global.AutoRepair -= Event Player.Abilities[16];
Event Player.Abilities[16] = 0;
}
}
rule("Lucio Dash HUD Creation")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Lúcio);
}
actions
{
If(Event Player.Lucio_Dash_Active == False);
Event Player.Lucio_Dash_Active = True;
Create HUD Text(Event Player, Null, Null, Custom String("{0} Slam on ground - Press: {1}", Ability Icon String(Hero(Wrecking Ball),
Button(Crouch)), Input Binding String(Button(Crouch))), Left, 1000, Color(White), Color(White), Color(White),
Visible To and String, Default Visibility);
Event Player.Lucio_Dash_Icon = Last Text ID;
End;
}
}
rule("Lucio Dash Remove HUD")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) != Hero(Lúcio);
Event Player.Lucio_Dash_Active == True;
}
actions
{
Destroy HUD Text(Event Player.Lucio_Dash_Icon);
Event Player.Lucio_Dash_Active = False;
}
}
rule("Lucio Dash")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Lúcio);
Event Player.Lucio_Dash_Active == True;
Is On Ground(Event Player) == False;
Is Button Held(Event Player, Button(Crouch)) == True;
}
actions
{
Apply Impulse(Event Player, Down, 20, To World, Cancel Contrary Motion);
}
}
rule("Ana Self-Nano")
{
event
{
Ongoing - Each Player;
Team 1;
Ana;
}
conditions
{
Is Button Held(Event Player, Button(Ultimate)) == True;
Ultimate Charge Percent(Event Player) == 100;
Is Dummy Bot(Event Player) == False;
}
actions
{
Abort If(Global.SelfNanoWorkshopSetting == False && Number Of Players(Team 1) > 1);
Wait(0.100, Ignore Condition);
If(Is Using Ultimate(Event Player) == False);
Create Dummy Bot(Hero(Ana), Team Of(Event Player), -1, Position Of(Event Player) + Backward, Eye Position(Event Player));
Event Player.AnaEntityID = Last Created Entity;
Wait(0.100, Ignore Condition);
Set Ultimate Charge(Event Player.AnaEntityID, 100);
Start Facing(Event Player.AnaEntityID, Direction Towards(Eye Position(Event Player.AnaEntityID), Position Of(Event Player) + Up),
1000, To World, Direction and Turn Rate);
Set Invisible(Event Player.AnaEntityID, All);
Set Status(Event Player.AnaEntityID, Null, Phased Out, 9999);
Wait(0.150, Ignore Condition);
Press Button(Event Player.AnaEntityID, Button(Ultimate));
Set Ultimate Charge(Event Player, 0);
Wait(0.150, Ignore Condition);
Teleport(Event Player.AnaEntityID, Position Of(First Of(Spawn Points(Team Of(Event Player)))));
Wait(10, Ignore Condition);
Destroy Dummy Bot(Team Of(Event Player), Slot Of(Event Player.AnaEntityID));
End;
}
}
rule("Reinhard Charge Cancel")
{
event
{
Ongoing - Each Player;
Team 1;
Reinhardt;
}
conditions
{
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(0.600, Ignore Condition);
Wait Until(Is Button Held(Event Player, Button(Ability 1)), 5);
Set Status(Event Player, Null, Rooted, 0.001);
Wait Until(Event Player.ReinPin, 1);
If(Event Player.ReinPin != 0);
Apply Impulse(Event Player.ReinPin, Facing Direction Of(Event Player), 15, To World, Cancel Contrary Motion);
End;
}
}
disabled rule("Map Editor Walls")
{
event
{
Ongoing - Global;
}
}
rule("Initial Global")
{
event
{
Ongoing - Global;
}
actions
{
Global.AllPos = Empty Array;
Global.AllDir = Empty Array;
Global.firstpos = Empty Array;
Global.secondpos = Empty Array;
Global.firstpoint2 = Empty Array;
Global.secondpoint2 = Empty Array;
Global.second = Empty Array;
Global.z = Empty Array;
Global.Wall_ID = Empty Array;
Global.g_beamType = Empty Array;
}
}
rule("Initial Player")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
actions
{
Event Player.filterpos = 0;
Event Player.lastsavedpos = 0;
Event Player.closestbodypos = 0;
Event Player.fullbodypos = 0;
Event Player.prevpos_intersection = 0;
Event Player.active_wall = Empty Array;
Event Player.closestwall = Empty Array;
}
}
rule("Collision Logic")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Has Spawned(Event Player) == True;
}
actions
{
Event Player.lastsavedpos = (Eye Position(Event Player) + Position Of(Event Player)) / 2;
Wait(0.016, Ignore Condition);
Event Player.closestwall = Filtered Array(Global.AllPos, Distance Between(Global.AllPos[Current Array Index], Event Player)
<= Distance Between(Global.AllPos[Current Array Index], Global.firstpos[Current Array Index])
|| Event Player.active_wall[Current Array Index] == 1 || (Dot Product(Direction Towards(Current Array Element,
Event Player.lastsavedpos), Global.AllDir[Current Array Index]) > 0) != (Dot Product(Direction Towards(Current Array Element,
Event Player), Global.AllDir[Current Array Index]) > 0));
For Player Variable(Event Player, x, 0, Count Of(Event Player.closestwall), 1);
Global.z = Index Of Array Value(Global.AllPos, Event Player.closestwall[Event Player.x]);
If(Global.Wall_ID[Global.z] == 1 || Global.Wall_ID[Global.z] == 3 || Global.Wall_ID[Global.z] == 5);
If(Y Component Of(Global.firstpos[Global.z]) >= Y Component Of(Position Of(Event Player)) && Y Component Of(
Global.firstpos[Global.z]) <= Y Component Of(Eye Position(Event Player) + Vector(Empty Array, 0.200, Empty Array)));
Event Player.closestbodypos = Global.firstpos[Global.z];
Else If(Y Component Of(Global.secondpos[Global.z]) >= Y Component Of(Position Of(Event Player)) && Y Component Of(
Global.secondpos[Global.z]) <= Y Component Of(Eye Position(Event Player) + Vector(Empty Array, 0.200, Empty Array)));
Event Player.closestbodypos = Global.secondpos[Global.z];
Else;
Event Player.closestbodypos = Position Of(Event Player);
End;
Event Player.fullbodypos = Vector(X Component Of(Eye Position(Event Player)), Y Component Of(Event Player.closestbodypos),
Z Component Of(Eye Position(Event Player)));
Event Player.filterpos = Event Player.fullbodypos + Global.AllDir[Global.z] * Dot Product(
Global.AllPos[Global.z] - Event Player.fullbodypos, Global.AllDir[Global.z]) / Dot Product(Global.AllDir[Global.z],
Global.AllDir[Global.z]);
If(Global.Wall_ID[Global.z] == 1 || Global.Wall_ID[Global.z] == 3);
If((Dot Product(Direction Towards(Global.AllPos[Global.z], Event Player.lastsavedpos), Global.AllDir[Global.z]) > 0) != (
Dot Product(Direction Towards(Global.AllPos[Global.z], Event Player.fullbodypos), Global.AllDir[Global.z]) > 0));
Event Player.intersection_length = Dot Product(Global.AllPos[Global.z] - Event Player.fullbodypos, Global.AllDir[Global.z])
/ Dot Product(Direction Towards(Event Player.lastsavedpos, Event Player.fullbodypos), Global.AllDir[Global.z]);
Event Player.prevpos_intersection = Event Player.fullbodypos + Direction Towards(Event Player.lastsavedpos,
Event Player.fullbodypos) * Vector(1, Empty Array, 1) * Event Player.intersection_length;
If(Dot Product(Direction Towards(Global.firstpos[Global.z], Vector(X Component Of(Global.secondpos[Global.z]), Y Component Of(
Global.firstpos[Global.z]), Z Component Of(Global.secondpos[Global.z]))), Direction Towards(Global.firstpos[Global.z],
Event Player.prevpos_intersection)) >= 0 && Dot Product(Direction Towards(Global.firstpos[Global.z], Vector(X Component Of(
Global.firstpos[Global.z]), Y Component Of(Global.secondpos[Global.z]), Z Component Of(Global.firstpos[Global.z]))),
Direction Towards(Global.firstpos[Global.z], Event Player.prevpos_intersection)) >= 0 && Dot Product(Direction Towards(
Global.secondpos[Global.z], Vector(X Component Of(Global.secondpos[Global.z]), Y Component Of(Global.firstpos[Global.z]),
Z Component Of(Global.secondpos[Global.z]))), Direction Towards(Global.secondpos[Global.z], Event Player.prevpos_intersection))
>= 0 && Dot Product(Direction Towards(Global.secondpos[Global.z], Vector(X Component Of(Global.firstpos[Global.z]),
Y Component Of(Global.secondpos[Global.z]), Z Component Of(Global.firstpos[Global.z]))), Direction Towards(
Global.secondpos[Global.z], Event Player.prevpos_intersection)) >= 0);
Cancel Primary Action(Event Player);
Teleport(Event Player, Event Player.prevpos_intersection + Direction Towards(Event Player.prevpos_intersection,
Event Player.lastsavedpos) * Vector(1, Empty Array, 1) * 2);
End;
End;
End;
Event Player.thickness = 0;
If(Global.Wall_ID[Global.z] == 5);
Event Player.thickness = 4;
Else;
Event Player.thickness = 1;
End;
If(Distance Between(Event Player.fullbodypos, Event Player.filterpos) <= Event Player.thickness && Dot Product(Direction Towards(
Global.firstpos[Global.z], Vector(X Component Of(Global.secondpos[Global.z]), Y Component Of(Global.firstpos[Global.z]),
Z Component Of(Global.secondpos[Global.z]))), Direction Towards(Global.firstpos[Global.z], Event Player.filterpos))
>= 0 && Dot Product(Direction Towards(Global.firstpos[Global.z], Vector(X Component Of(Global.firstpos[Global.z]),
Y Component Of(Global.secondpos[Global.z]), Z Component Of(Global.firstpos[Global.z]))), Direction Towards(
Global.firstpos[Global.z], Event Player.filterpos)) >= 0 && Dot Product(Direction Towards(Global.secondpos[Global.z], Vector(
X Component Of(Global.secondpos[Global.z]), Y Component Of(Global.firstpos[Global.z]), Z Component Of(
Global.secondpos[Global.z]))), Direction Towards(Global.secondpos[Global.z], Event Player.filterpos)) >= 0 && Dot Product(
Direction Towards(Global.secondpos[Global.z], Vector(X Component Of(Global.firstpos[Global.z]), Y Component Of(
Global.secondpos[Global.z]), Z Component Of(Global.firstpos[Global.z]))), Direction Towards(Global.secondpos[Global.z],
Event Player.filterpos)) >= 0);
If(!Global.is_Grounded);
Set Gravity(Event Player, 100);
End;
If(Event Player.active_wall[Global.z] == False);
Event Player.active_wall[Global.z] = 1;
If((Global.Wall_ID[Global.z] == 1 || Global.Wall_ID[Global.z] == 3) && Global.is_Grounded == False);
Set Gravity(Event Player, 100);
Else If(Global.Wall_ID[Global.z] == 5);
Disable Movement Collision With Environment(Event Player, False);
End;
End;
If(Global.Wall_ID[Global.z] == 1);
Apply Impulse(Event Player, Direction Towards(Event Player.filterpos, Event Player.fullbodypos) * Vector(1, Empty Array, 1), 0.001,
To World, Cancel Contrary Motion);
Set Move Speed(Event Player, 100 - Dot Product(Direction Towards(Eye Position(Event Player), Eye Position(Event Player)
+ World Vector Of(Throttle Of(Event Player), Event Player, Rotation)), Direction Towards(Event Player.filterpos,
Event Player.fullbodypos) * -1) * 100);
Else If(Global.Wall_ID[Global.z] == 3);
Apply Impulse(Event Player, Direction Towards(Event Player.filterpos, Event Player.fullbodypos), Speed Of(Event Player), To World,
Cancel Contrary Motion);
End;
Else;
Event Player.active_wall[Global.z] = 0;
Set Move Speed(Event Player, 100);
End;
End;
End;
Loop;
}
}
rule("Reset")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Count Of(Filtered Array(Event Player.active_wall, Current Array Element != 0)) == 0;
}
actions
{
Enable Movement Collision With Environment(Event Player);
}
}
disabled rule("Effect Creation")
{
event
{
Ongoing - Global;
}
actions
{
Wait(5, Ignore Condition);
If(Global.showwalls);
For Global Variable(x, 0, Count Of(Global.AllPos), 1);
If(Global.Wall_ID[Global.x] == 5);
Create Beam Effect(All Players(Team 1), Good Beam, Global.firstpos[Global.x], Vector(X Component Of(Global.secondpos[Global.x]),
Y Component Of(Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Color(Red), None);
Create Beam Effect(All Players(Team 1), Good Beam, Vector(X Component Of(Global.secondpos[Global.x]), Y Component Of(
Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Red), None);
Create Beam Effect(All Players(Team 1), Good Beam, Global.firstpos[Global.x] + Vector(0.001, Empty Array, Empty Array), Vector(
X Component Of(Global.firstpos[Global.x]), Y Component Of(Global.secondpos[Global.x]), Z Component Of(
Global.firstpos[Global.x])), Color(Red), None);
Create Beam Effect(All Players(Team 1), Good Beam, Vector(X Component Of(Global.firstpos[Global.x]), Y Component Of(
Global.secondpos[Global.x]), Z Component Of(Global.firstpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Red), None);
Else;
Skip(Array(14, 0, 5, 10)[Index Of Array Value(Array(1, 2, 3), Global.g_beamType[Global.x]) + 1]);
Create Beam Effect(All Players(Team 1), Grapple Beam, Global.firstpos[Global.x], Vector(X Component Of(Global.secondpos[Global.x]),
Y Component Of(Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Grapple Beam, Vector(X Component Of(Global.secondpos[Global.x]), Y Component Of(
Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Grapple Beam, Global.firstpos[Global.x] + Vector(0.001, Empty Array, Empty Array), Vector(
X Component Of(Global.firstpos[Global.x]), Y Component Of(Global.secondpos[Global.x]), Z Component Of(
Global.firstpos[Global.x])), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Grapple Beam, Vector(X Component Of(Global.firstpos[Global.x]), Y Component Of(
Global.secondpos[Global.x]), Z Component Of(Global.firstpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Aqua), None);
Skip(9);
Create Beam Effect(All Players(Team 1), Good Beam, Global.firstpos[Global.x], Vector(X Component Of(Global.secondpos[Global.x]),
Y Component Of(Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Good Beam, Vector(X Component Of(Global.secondpos[Global.x]), Y Component Of(
Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Good Beam, Global.firstpos[Global.x] + Vector(0.001, Empty Array, Empty Array), Vector(
X Component Of(Global.firstpos[Global.x]), Y Component Of(Global.secondpos[Global.x]), Z Component Of(
Global.firstpos[Global.x])), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Good Beam, Vector(X Component Of(Global.firstpos[Global.x]), Y Component Of(
Global.secondpos[Global.x]), Z Component Of(Global.firstpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Aqua), None);
Skip(4);
Create Beam Effect(All Players(Team 1), Bad Beam, Global.firstpos[Global.x], Vector(X Component Of(Global.secondpos[Global.x]),
Y Component Of(Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Bad Beam, Vector(X Component Of(Global.secondpos[Global.x]), Y Component Of(
Global.firstpos[Global.x]), Z Component Of(Global.secondpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Bad Beam, Global.firstpos[Global.x] + Vector(0.001, Empty Array, Empty Array), Vector(
X Component Of(Global.firstpos[Global.x]), Y Component Of(Global.secondpos[Global.x]), Z Component Of(
Global.firstpos[Global.x])), Color(Aqua), None);
Create Beam Effect(All Players(Team 1), Bad Beam, Vector(X Component Of(Global.firstpos[Global.x]), Y Component Of(
Global.secondpos[Global.x]), Z Component Of(Global.firstpos[Global.x])), Global.secondpos[Global.x] + Vector(Empty Array,
Empty Array, 0.001), Color(Aqua), None);
End;
Wait(0.016, Ignore Condition);
End;
End;
}
}
rule("Wall Data")
{
event
{
Ongoing - Global;
}
actions
{
Global.AllPos = Array(Vector(155.968, 12.470, -30.507), Vector(155.962, 12.472, -62.500), Vector(81.153, 6.453, -103.851), Vector(
69.148, 6.474, -104.548));
Global.AllDir = Array(Vector(-1, 0, -0.002), Vector(1, 0, -0.001), Vector(0, 0, 1), Vector(0.001, 0, 1));
Global.firstpos = Array(Vector(155.971, 11.047, -31.771), Vector(155.964, 11.050, -61.229), Vector(79.761, 5.030, -103.852),
Vector(67.738, 5.022, -104.547));
Global.secondpos = Array(Vector(155.965, 13.894, -29.242), Vector(155.960, 13.894, -63.771), Vector(82.544, 7.876, -103.851),
Vector(70.558, 7.925, -104.550));
Global.firstpoint2 = Array(Vector(155.971, 13.894, -31.771), Vector(155.964, 13.894, -61.229), Vector(79.761, 7.876, -103.852),
Vector(67.738, 7.925, -104.547));
Global.secondpoint2 = Array(Vector(155.965, 11.047, -29.242), Vector(155.960, 11.050, -63.771), Vector(82.544, 5.030, -103.851),
Vector(70.558, 5.022, -104.550));
Global.z = 3;
Global.g_beamType = Array(1, 1, 1, 1);
Global.showwalls = True;
Global.Wall_ID = Array(5, 5, 5, 5);
}
}
disabled rule("NEW SHOP")
{
event
{
Ongoing - Global;
}
}
rule("Setting Shop Position")
{
event
{
Ongoing - Global;
}
actions
{
Global.ShopCamPos = 900 * Up;
Global.ShopPosAngle[1] = Direction From Angles(Horizontal Angle From Direction(Forward), Vertical Angle From Direction(Forward)
- 90);
Global.ShopPosAngle[0] = Cross Product(Global.ShopPosAngle[1], Forward);
Global.ShopBasePos = Global.ShopCamPos - 9 * Global.ShopPosAngle[1] + 142 * Forward;
}
}
rule("Create Shop Buttons")
{
event
{
Ongoing - Global;
}
actions
{
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String(
"┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃"), Global.ShopBasePos - 41 * Global.ShopPosAngle[1] + 90 * Global.ShopPosAngle[0], 2.500,
Do Not Clip, Visible To, Color(White), Default Visibility);
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String(
"┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃\n┃"), Global.ShopBasePos - 41 * Global.ShopPosAngle[1] - 90 * Global.ShopPosAngle[0], 2.500,
Do Not Clip, Visible To, Color(White), Default Visibility);
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("Refund"),
Global.ShopBasePos + 45 * Global.ShopPosAngle[1] + 67.500 * Global.ShopPosAngle[0], 3, Do Not Clip, Visible To, Color(Green),
Default Visibility);
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("[{0}] Leave",
Input Binding String(Button(Reload))), Global.ShopBasePos + 45 * Global.ShopPosAngle[1] - 67.500 * Global.ShopPosAngle[0], 3,
Do Not Clip, Visible To and String, Color(Green), Default Visibility);
Create In-World Text(Local Player.isInMenu ? Local Player : Empty Array, Custom String("{0}$\n", Local Player.Money[0]),
Global.ShopBasePos + 36.500 * Global.ShopPosAngle[1], 3, Do Not Clip, Visible To and String, Color(White), Default Visibility);
Create In-World Text(Local Player.isInMenu ? Local Player : Empty Array, Custom String("▲"), Update Every Frame(
Global.ShopBasePos - (4 + Vertical Facing Angle Of(Local Player)) * Global.ShopPosAngle[1] + Horizontal Facing Angle Of(
Local Player) * Global.ShopPosAngle[0]), 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);
"Headhunter"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[1] ? Custom String("Headhunter II\n800$") : Custom String("Headhunter I\n800$"),
Global.ShopBasePos + 20 * Global.ShopPosAngle[1] + 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[1] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Ambush"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[2] ? Custom String("Ambush II\n 800$") : Custom String("Ambush I\n 800$"),
Global.ShopBasePos - 2.500 * Global.ShopPosAngle[1] + 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[2] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Quick Fix"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[3] ? Custom String("Quick Fix II\n 700$") : Custom String("Quick Fix I\n 700$"),
Global.ShopBasePos - 25 * Global.ShopPosAngle[1] + 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[3] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Heavyweight"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[4] ? Custom String("Heavyweight II\n1000$") : Custom String("Heavyweight I\n1000$"),
Global.ShopBasePos - 47.500 * Global.ShopPosAngle[1] + 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[4] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Charged"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[5] ? Custom String("Charged II\n 700$") : Custom String("Charged I\n 700$"),
Global.ShopBasePos + 20 * Global.ShopPosAngle[1] + 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[5] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Haste"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[6] ? Custom String("Haste II\n 700$") : Custom String("Haste I\n 700$"),
Global.ShopBasePos - 2.500 * Global.ShopPosAngle[1] + 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[6] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Heavy Impact"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[7] ? Custom String("Heavy Impact II\n1000$") : Custom String("Heavy Impact I\n1000$"),
Global.ShopBasePos - 25 * Global.ShopPosAngle[1] + 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[7] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Hero Talent 1"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("Hero Talent 1\n1200$"),
Global.ShopBasePos - 47.500 * Global.ShopPosAngle[1] + 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[8] < 1 ? Color(Green) : Color(Gray), Default Visibility);
"Second Wind"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[9] ? Custom String("Second Wind II\n 900$") : Custom String("Second Wind I\n 900$"),
Global.ShopBasePos + 20 * Global.ShopPosAngle[1] - 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[9] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Binding Heal"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[10] ? Custom String("Binding Heal II\n 700$") : Custom String("Binding Heal I\n 700$"),
Global.ShopBasePos - 2.500 * Global.ShopPosAngle[1] - 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[10] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Resilience"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu),
Local Player.Abilities[11] ? Custom String("Resilience II\n 800$") : Custom String("Resilience I\n 800$"),
Global.ShopBasePos - 25 * Global.ShopPosAngle[1] - 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[11] < 2 ? Color(Green) : Color(Gray), Default Visibility);
"Hero Talent 2"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("Hero Talent 2\n1200$"),
Global.ShopBasePos - 47.500 * Global.ShopPosAngle[1] - 22.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Local Player.Abilities[12] < 1 ? Color(Green) : Color(Gray), Default Visibility);
"PlusDamage"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("+5% Damage\n400$"),
Global.ShopBasePos + 20 * Global.ShopPosAngle[1] - 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Color(Green), Default Visibility);
"PlusHealth"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("+5% Health\n 400$"),
Global.ShopBasePos - 2.500 * Global.ShopPosAngle[1] - 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Color(Green), Default Visibility);
"PlusHealing"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String("+5% Healing\n400$"),
Global.ShopBasePos - 25 * Global.ShopPosAngle[1] - 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip, Visible To and String,
Color(Green), Default Visibility);
"PlusHealing"
Create In-World Text(Filtered Array(All Players(Team 1), Current Array Element.isInMenu), Custom String(
"+{0} Auto-Repair\n 400$", Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[2] ? 10 : 5),
Global.ShopBasePos - 47.500 * Global.ShopPosAngle[1] - 67.500 * Global.ShopPosAngle[0], 2.500, Do Not Clip,
Visible To String and Color, Global.AutoRepair < 5 ? Color(Green) : Color(Gray), Default Visibility);
"Use Update Every Frame to avoid showing the String when the cursor is out of bounds, resulting in 0\r\n ROW 0"
Create In-World Text(Update Every Frame(Local Player.isInMenu && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) + 11.250) < 47.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < -33.750 ? Array(Custom String("Leave Buy Menu\n"), Custom String(
""), Custom String(""), Custom String("Refund your money\n"))[Round To Integer((Horizontal Facing Angle Of(Local Player) + 90)
/ 45, Down)] : Custom String("")), Global.ShopBasePos - 75 * Global.ShopPosAngle[1], 2.500, Do Not Clip, Visible To and String,
Color(White), Default Visibility);
"ROW 1"
Create In-World Text(Update Every Frame(Local Player.isInMenu && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) + 11.250) < 22.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < -11.250 ? Array(Custom String("Increase your damage by 5%\n"),
Local Player.Abilities[9] ? Custom String(
"Second Wind II: 60% chance to revive yourself after going down\nThis cannot occur more than once every 30 seconds")
: Custom String(
"Second Wind I: 30% chance to revive yourself after going down\n This cannot occur more than once every 30 seconds"),
Local Player.Abilities[5] ? Custom String("Charged II: Ultimates cost 40% less\n") : Custom String(
"Charged I: Ultimates cost 20% less\n"), Local Player.Abilities[1] ? Custom String(
"Headhunter II: Critical hits deal 80% more damage\n") : Custom String("Headhunter I: Critical hits deal 40% more damage\n"))
[Round To Integer((Horizontal Facing Angle Of(Local Player) + 90) / 45, Down)] : Custom String("")),
Global.ShopBasePos - 75 * Global.ShopPosAngle[1], 2.500, Do Not Clip, Visible To and String, Color(White), Default Visibility);
"ROW 2"
Create In-World Text(Update Every Frame(Local Player.isInMenu && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) - 36.250) < 47.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < 11.250 ? Array(Custom String("Increase your health by 5%\n"),
Local Player.Abilities[10] ? Custom String("Binding Heal II: Heal yourself for 50% the amount when healing allies\n")
: Custom String("Binding Heal I: Heal yourself for 25% the amount when healing allies\n"),
Local Player.Abilities[6] ? 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.Abilities[2] ? Custom String("Ambush II: Deal 60% more damage when attacking enemies from behind or above\n")
: Custom String("Ambush I: Deal 30% more damage when attacking enemies from behind or above\n"))[Round To Integer((
Horizontal Facing Angle Of(Local Player) + 90) / 45, Down)] : Custom String("")),
Global.ShopBasePos - 75 * Global.ShopPosAngle[1], 2.500, Do Not Clip, Visible To and String, Color(White), Default Visibility);
"ROW 3"
Create In-World Text(Update Every Frame(Local Player.isInMenu && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) - 83.750) < 72.500 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < 33.750 ? Array(Custom String("Increase your healing by 5%\n"),
Local Player.Abilities[11] ? Custom String("Resilience II: Take 30% less damage while below 60% health\n") : Custom String(
"Resilience I: Take 30% less damage while below 30% health\n"), Local Player.Abilities[7] ? 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"), Local Player.Abilities[3] ? Custom String(
"Quick Fix II: Eliminations restore 100 HP and shortly increase speed by 40%\n") : Custom String(
"Quick Fix I: Eliminations restore 50 HP and shortly increase speed by 20%\n"))[Round To Integer((Horizontal Facing Angle Of(
Local Player) + 90) / 45, Down)] : Custom String("")), Global.ShopBasePos - 75 * Global.ShopPosAngle[1], 2.500, Do Not Clip,
Visible To and String, Color(White), Default Visibility);
"ROW 4"
Create In-World Text(Update Every Frame(Local Player.isInMenu && Absolute Value(Horizontal Facing Angle Of(Local Player))
< 90 && Absolute Value(Vertical Facing Angle Of(Local Player) - 133) < 99.250 ? Local Player : Empty Array),
Update Every Frame(Vertical Facing Angle Of(Local Player) < 56.250 ? Array(Custom String(
"Increase your auto-repair by {0}/5s\n", Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[2] ? 10 : 5),
Custom String("{0}", Local Player.HeroTalentText[2][1]), Custom String("{0}", Local Player.HeroTalentText[1][1]),
Local Player.Abilities[4] ? Custom String(
"Heavyweight II: Your knock back attacks deal 50% more damage and knock back\nYou receive 33% less knock back")
: Custom String(
"Heavyweight I: Your knock back attacks deal 25% more damage and knock back\nYou receive 20% less knock back"))
[Round To Integer((Horizontal Facing Angle Of(Local Player) + 90) / 45, Down)] : Custom String("")),
Global.ShopBasePos - 75 * Global.ShopPosAngle[1], 2.500, Do Not Clip, Visible To and String, Color(White), Default Visibility);
}
}
rule("Toggle Shop")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
!Is Dummy Bot(Event Player) == True;
Is Button Held(Event Player, Button(Reload)) == True;
!Is Communicating Any Emote(Event Player) == True;
}
actions
{
If(Event Player.isInMenu == False);
Wait Until(!Is Button Held(Event Player, Button(Reload)), 0.500);
If(!Is Button Held(Event Player, Button(Reload)));
Abort;
End;
End;
Event Player.isInMenu = !Event Player.isInMenu;
}
}
rule("Open Shop")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
"Open Shop"
Event Player.isInMenu == True;
}
actions
{
Event Player.PlayerFacing = Facing Direction Of(Event Player);
Start Camera(Event Player, Global.ShopCamPos, Global.ShopCamPos + Forward, 0);
Disable Hero HUD(Event Player);
Call Subroutine(DisablePlayer);
Set Aim Speed(Event Player, 200);
}
}
rule("Close Shop")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
"Open Shop"
Event Player.isInMenu == False;
}
actions
{
Stop Camera(Event Player);
Enable Hero HUD(Event Player);
Call Subroutine(EnablePlayer);
Set Aim Speed(Event Player, 100);
Set Facing(Event Player, Event Player.PlayerFacing, To World);
}
}
rule("Subroutine: Disable Player")
{
event
{
Subroutine;
DisablePlayer;
}
actions
{
Start Forcing Throttle(Event Player, 0, 0, 0, 0, 0, 0);
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;
EnablePlayer;
}
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("Buy Ability")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isInMenu == True;
Is Button Held(Event Player, Button(Primary Fire)) == True;
(Absolute Value(Horizontal Facing Angle Of(Event Player)) < 90 && Absolute Value(Vertical Facing Angle Of(Event Player))
+ 11.250 < 67) == True;
}
actions
{
"ROW 0"
If(Vertical Facing Angle Of(Event Player) < -33.750);
"LEAVE SHOP"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
Event Player.isInMenu = !Event Player.isInMenu;
"REFUND"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Money[1] != 0);
Call Subroutine(Refund);
Else;
Small Message(Local Player, Custom String("You don't have anything to refund!"));
End;
End;
"ROW 1"
Else If(Vertical Facing Angle Of(Event Player) < -11.250);
"+5% DAMAGE"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Money[0] >= 400);
Event Player.Money[0] -= 400;
Event Player.Money[1] += 400;
Event Player.Abilities[13] += 1;
Event Player.DamageDealt = 100 + Global.DamageDone + Event Player.Abilities[13] * 5;
Set Damage Dealt(Event Player, Event Player.DamageDealt);
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
"SECOND WIND"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[9] != 2);
If(Event Player.Money[0] >= 900);
Event Player.Money[0] -= 900;
Event Player.Money[1] += 900;
Event Player.Abilities[9] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"CHARGED"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[5] != 2);
If(Event Player.Money[0] >= 700);
Event Player.Money[0] -= 700;
Event Player.Money[1] += 700;
Event Player.Abilities[5] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HEADHUNTER"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[1] != 2);
If(Event Player.Money[0] >= 800);
Event Player.Money[0] -= 800;
Event Player.Money[1] += 800;
Event Player.Abilities[1] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
"ROW 2"
Else If(Vertical Facing Angle Of(Event Player) < 11.250);
"+5% HEALTH"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Money[0] >= 400);
Event Player.Money[0] -= 400;
Event Player.Money[1] += 400;
Event Player.Abilities[14] += 1;
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
"BINDING HEAL"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[10] != 2);
If(Event Player.Money[0] >= 700);
Event Player.Money[0] -= 700;
Event Player.Money[1] += 700;
Event Player.Abilities[10] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HASTE"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[6] != 2);
If(Event Player.Money[0] >= 700);
Event Player.Money[0] -= 700;
Event Player.Money[1] += 700;
Event Player.Abilities[6] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"AMBUSH"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[2] != 2);
If(Event Player.Money[0] >= 800);
Event Player.Money[0] -= 800;
Event Player.Money[1] += 800;
Event Player.Abilities[2] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
"ROW 3"
Else If(Vertical Facing Angle Of(Event Player) < 33.750);
"+5% HEALING"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Money[0] >= 400);
Event Player.Money[0] -= 400;
Event Player.Money[1] += 400;
Event Player.Abilities[15] += 1;
Set Healing Dealt(Event Player, 100 + Event Player.Abilities[15] * 5);
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
"RESILIENCE"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[11] != 2);
If(Event Player.Money[0] >= 800);
Event Player.Money[0] -= 800;
Event Player.Money[1] += 800;
Event Player.Abilities[11] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HEAVY IMPACT"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[7] != 2);
If(Event Player.Money[0] >= 1000);
Event Player.Money[0] -= 1000;
Event Player.Money[1] += 1000;
Event Player.Abilities[7] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"QUICK FIX"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[3] != 2);
If(Event Player.Money[0] >= 700);
Event Player.Money[0] -= 700;
Event Player.Money[1] += 700;
Event Player.Abilities[3] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
"ROW 4"
Else If(Vertical Facing Angle Of(Event Player) < 56.250);
"+5 AUTO-REPAIR"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Global.AutoRepair != 5);
If(Event Player.Money[0] >= 400);
Event Player.Money[0] -= 400;
Event Player.Money[1] += 400;
Global.AutoRepair += 1;
Event Player.Abilities[16] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HERO TALENT 2"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[12] != 1);
If(Event Player.Money[0] >= 1200);
Event Player.Money[0] -= 1200;
Event Player.Money[1] += 1200;
Event Player.Abilities[12] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HERO TALENT 1"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[8] != 1);
If(Event Player.Money[0] >= 1200);
Event Player.Money[0] -= 1200;
Event Player.Money[1] += 1200;
Event Player.Abilities[8] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
"HEAVYWEIGHT"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[4] != 2);
If(Event Player.Money[0] >= 1000);
Event Player.Money[0] -= 1000;
Event Player.Money[1] += 1000;
Event Player.Abilities[4] += 1;
Else;
Small Message(Event Player, Custom String("Not enough money!"));
End;
End;
End;
End;
}
}
rule("Refund Single Ability")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.isInMenu == True;
Is Button Held(Event Player, Button(Secondary Fire)) == True;
(Absolute Value(Horizontal Facing Angle Of(Event Player)) < 90 && Absolute Value(Vertical Facing Angle Of(Event Player))
+ 11.250 < 67) == True;
}
actions
{
"ROW 0"
If(Vertical Facing Angle Of(Event Player) < -33.750);
"LEAVE SHOP"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
"REFUND"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
End;
"ROW 1"
Else If(Vertical Facing Angle Of(Event Player) < -11.250);
"+5% DAMAGE"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Abilities[13] != 0);
Event Player.Money[0] += 400;
Event Player.Money[1] -= 400;
Event Player.Abilities[13] -= 1;
Event Player.DamageDealt = 100 + Global.DamageDone + Event Player.Abilities[13] * 5;
Set Damage Dealt(Event Player, Event Player.DamageDealt);
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"SECOND WIND"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[9] != 0);
Event Player.Money[0] += 900;
Event Player.Money[1] -= 900;
Event Player.Abilities[9] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"CHARGED"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[5] != 0);
Event Player.Money[0] += 700;
Event Player.Money[1] -= 700;
Event Player.Abilities[5] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HEADHUNTER"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[1] != 0);
Event Player.Money[0] += 800;
Event Player.Money[1] -= 800;
Event Player.Abilities[1] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
"ROW 2"
Else If(Vertical Facing Angle Of(Event Player) < 11.250);
"+5% HEALTH"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Abilities[14] != 0);
Event Player.Money[0] += 400;
Event Player.Money[1] -= 400;
Event Player.Abilities[14] -= 1;
Event Player.PlayerHealth = 100 + Global.MaxHealthDone + Event Player.Abilities[14] * 5;
Set Max Health(Event Player, Event Player.PlayerHealth);
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"BINDING HEAL"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[10] != 0);
Event Player.Money[0] += 700;
Event Player.Money[1] -= 700;
Event Player.Abilities[10] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HASTE"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[6] != 0);
Event Player.Money[0] += 700;
Event Player.Money[1] -= 700;
Event Player.Abilities[6] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"AMBUSH"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[2] != 0);
Event Player.Money[0] += 800;
Event Player.Money[1] -= 800;
Event Player.Abilities[2] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
"ROW 3"
Else If(Vertical Facing Angle Of(Event Player) < 33.750);
"+5% HEALING"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Abilities[15] != 0);
Event Player.Money[0] += 400;
Event Player.Money[1] -= 400;
Event Player.Abilities[15] -= 1;
Set Healing Dealt(Event Player, 100 + Event Player.Abilities[15] * 5);
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"RESILIENCE"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[11] != 0);
Event Player.Money[0] += 800;
Event Player.Money[1] -= 800;
Event Player.Abilities[11] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HEAVY IMPACT"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[7] != 0);
Event Player.Money[0] += 1000;
Event Player.Money[1] -= 1000;
Event Player.Abilities[7] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"QUICK FIX"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[3] != 0);
Event Player.Money[0] += 700;
Event Player.Money[1] -= 700;
Event Player.Abilities[3] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
"ROW 4"
Else If(Vertical Facing Angle Of(Event Player) < 56.250);
"+5 AUTO-REPAIR"
If(Horizontal Facing Angle Of(Event Player) + 99.750 < 55);
If(Event Player.Abilities[16] != 0);
Event Player.Money[0] += 400;
Event Player.Money[1] -= 400;
Global.AutoRepair -= 1;
Event Player.Abilities[16] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HERO TALENT 2"
Else If(Horizontal Facing Angle Of(Event Player) + 22.500 < 22.500);
If(Event Player.Abilities[12] != 0);
Event Player.Money[0] += 1200;
Event Player.Money[1] -= 1200;
Event Player.Abilities[12] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HERO TALENT 1"
Else If(Horizontal Facing Angle Of(Event Player) + 11.250 < 56);
If(Event Player.Abilities[8] != 0);
Event Player.Money[0] += 1200;
Event Player.Money[1] -= 1200;
Event Player.Abilities[8] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
"HEAVYWEIGHT"
Else If(Horizontal Facing Angle Of(Event Player) + 0 > 45);
If(Event Player.Abilities[4] != 0);
Event Player.Money[0] += 1000;
Event Player.Money[1] -= 1000;
Event Player.Abilities[4] -= 1;
Else;
Small Message(Event Player, Custom String("You don't have that ability!"));
End;
End;
End;
}
}
rule("Create Player HUD")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Has Spawned(Event Player) == True;
}
actions
{
Create HUD Text(All Players(Team 1), Custom String("{0}", Hero Icon String(Hero Of(Event Player))), Custom String("{0}{1}",
Event Player, Event Player.isInMenu ? Custom String("(In Shop)") : Custom String("")), Custom String("{0}{1}", Is Alive(
Event Player) ? Custom String("{0} HP", Round To Integer(Health(Event Player), Up)) : Custom String("Dead"), Custom String(
", {0}$", Event Player.Money)), Left, Local Player == Event Player ? -1 : Slot Of(Event Player), Is Dead(Event Player) ? Color(
Red) : (Health(Event Player) > Max Health(Event Player) * 0.500 ? Color(Green) : Color(Orange)), Is Dead(Event Player) ? Color(
Red) : (Health(Event Player) > Max Health(Event Player) * 0.500 ? Color(Green) : Color(Orange)), Is Dead(Event Player) ? Color(
Red) : (Health(Event Player) > Max Health(Event Player) * 0.500 ? Color(Green) : Color(Orange)),
Visible To Sort Order String and Color, Default Visibility);
Create HUD Text(Event Player.Abilities[13] || Global.DamageDone ? Event Player : Null, Null, Null, Custom String("+{0}% Damage",
Global.DamageDone + Event Player.Abilities[13] * 5), Left, 913, Color(White), Color(White), Color(Turquoise),
Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[9] ? Event Player : Null, Null, Null, Custom String("Second Wind {0}",
Event Player.Abilities[9] == 1 ? Custom String("I") : Custom String("II")), Left, 908, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[5] ? Event Player : Null, Null, Null, Custom String("Charged {0}",
Event Player.Abilities[5] == 1 ? Custom String("I") : Custom String("II")), Left, 905, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[1] ? Event Player : Null, Null, Null, Custom String("Headhunter {0}",
Event Player.Abilities[1] == 1 ? Custom String("I") : Custom String("II")), Left, 901, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[14] || Global.MaxHealthDone ? Event Player : Null, Null, Null, Custom String("+{0}% Health",
Global.MaxHealthDone + Event Player.Abilities[14] * 5), Left, 914, Color(White), Color(White), Color(Turquoise),
Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[10] ? Event Player : Null, Null, Null, Custom String("Binding Heal {0}",
Event Player.Abilities[10] == 1 ? Custom String("I") : Custom String("II")), Left, 909, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[6] ? Event Player : Null, Null, Null, Custom String("Haste {0}",
Event Player.Abilities[6] == 1 ? Custom String("I") : Custom String("II")), Left, 906, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[2] ? Event Player : Null, Null, Null, Custom String("Ambush {0}",
Event Player.Abilities[2] == 1 ? Custom String("I") : Custom String("II")), Left, 902, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[15] ? Event Player : Null, Null, Null, Custom String("+{0}% Healing",
Event Player.Abilities[15] * 5), Left, 915, Color(White), Color(White), Color(Turquoise), Visible To and String,
Default Visibility);
Create HUD Text(Event Player.Abilities[11] ? Event Player : Null, Null, Null, Custom String("Resilience {0}",
Event Player.Abilities[11] == 1 ? Custom String("I") : Custom String("II")), Left, 910, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[7] ? Event Player : Null, Null, Null, Custom String("Heavy Impact {0}",
Event Player.Abilities[7] == 1 ? Custom String("I") : Custom String("II")), Left, 907, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[3] ? Event Player : Null, Null, Null, Custom String("Quick Fix {0}",
Event Player.Abilities[3] == 1 ? Custom String("I") : Custom String("II")), Left, 903, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Global.AutoRepair ? Event Player : Null, Null, Null, Custom String("{0} total Auto-Repair/5s",
Global.AutoRepair * (Global.UpgradeGateMaxHealthValue >= Global.UpgradeGateMaxHealthMaxValue[2] ? 10 : 5)), Left, 916, Color(
White), Color(White), Color(Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[12] ? Event Player : Null, Null, Null, Custom String("{0} {1}",
Event Player.HeroTalentText[2][0], Event Player.HeroTalentText[2][1]), Top, 902, Color(White), Color(White), Color(Green),
Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[12] ? Event Player : Null, Null, Null, Custom String("Hero Talent 2"), Left, 912, Color(
White), Color(White), Color(Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[8] ? Event Player : Null, Null, Null, Custom String("{0} {1}",
Event Player.HeroTalentText[1][0], Event Player.HeroTalentText[1][1]), Top, 901, Color(White), Color(White), Color(Green),
Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[8] ? Event Player : Null, Null, Null, Custom String("Hero Talent 1"), Left, 911, Color(
White), Color(White), Color(Turquoise), Visible To and String, Default Visibility);
Create HUD Text(Event Player.Abilities[4] ? Event Player : Null, Null, Null, Custom String("Heavyweight {0}",
Event Player.Abilities[4] == 1 ? Custom String("I") : Custom String("II")), Left, 904, Color(White), Color(White), Color(
Turquoise), Visible To and String, Default Visibility);
}
}
rule("Rein Pin detect")
{
event
{
Player Dealt Knockback;
Team 1;
Reinhardt;
}
conditions
{
Event Ability == Button(Ability 1);
Has Status(Victim, Stunned) == True;
}
actions
{
Event Player.ReinPin = Victim;
Wait(1, Ignore Condition);
Event Player.ReinPin = Null;
}
}
rule("Boss Rotation")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.activeBoss == True;
}
actions
{
If(Global.bossRotation == 0 || Global.bossRotation == 3);
Global.bossRotation = 1;
Global.lastBoss[1] = Hero Of(Global.activeBoss);
Else If(Global.bossRotation == 1);
Global.bossRotation = 2;
Global.lastBoss[2] = Hero Of(Global.activeBoss);
Else If(Global.bossRotation == 2);
Global.bossRotation = 3;
Global.lastBoss[3] = Hero Of(Global.activeBoss);
End;
}
}
rule("15 minutes hud")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.TimeMin == 10;
}
actions
{
Create HUD Text(All Players(Team 1), Global.activeBoss ? Custom String("Boss: {0}, HP: {1}/{2}", Hero Of(Global.activeBoss),
Health(Global.activeBoss), Max Health(Global.activeBoss)) : Custom String(""), Null, Null, Top, 900, Color(Red), Color(White),
Color(White), Visible To and String, Default Visibility);
}
}
rule("debug")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.IsDebug == True;
(Is Button Held(Event Player, Button(Primary Fire)) && Is Button Held(Event Player, Button(Crouch))) == True;
}
actions
{
Global.TimeSec = 59;
}
}
disabled rule("debug")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Global.IsDebug == True;
}
actions
{
Create HUD Text(Local Player, Custom String("{0}", Position Of(Local Player)), Null, Null, Left, 0, Color(Yellow), Color(White),
Color(White), Visible To and String, Default Visibility);
Set Status(Event Player, Null, Invincible, 9999);
Set Status(Event Player, Null, Phased Out, 9999);
}
}
rule("ending 1 part 1")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.challengeCount == 12;
}
actions
{
Big Message(All Players(Team 1), Custom String("Exfiltration available! (optional - ends the mode)"));
Create In-World Text(All Players(Team 1), Custom String(
"Exfiltration available! Gather here!\n{0}/{1} Players ready to exfiltrate!", Count Of(Filtered Array(All Players(Team 1),
Distance Between(Vector(186, 11, -46.500), Current Array Element) <= 9)), Count Of(All Players(Team 1))), Vector(186, 15,
-46.500), 1.200, Do Not Clip, Visible To and String, Color(Green), Default Visibility);
}
}
rule("ending 1 part 2")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
Global.challengeCount == 12;
Distance Between(Vector(186, 11, -46.500), All Players(Team 1)) <= 9;
}
actions
{
Big Message(All Players(Team 1), Custom String("GG! YOU DID IT!"));
Destroy All Dummy Bots;
Disable Movement Collision With Environment(All Players(Team 1), True);
Start Accelerating(All Players(Team 1), Up, 100, 5, To World, Direction Rate and Max Speed);
Wait(5, Ignore Condition);
Declare Team Victory(Team 1);
}
}
rule("Team 1 (Ability): Second Wind save life")
{
event
{
Player Took Damage;
Team 1;
All;
}
conditions
{
Event Player.Abilities[9] == True;
Event Player.secondWindActive == True;
Health(Event Player) == 1;
}
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);
Clear Status(Event Player, Unkillable);
Set Player Health(Event Player, Max Health(Event Player));
Event Player.lastSecondWind = 30;
Event Player.secondWindActive = 0;
}
}
rule("Team 1 (Ability): Second Wind after buying")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Event Player.Abilities[9] == True;
Event Player.secondWindActive == False;
Event Player.lastSecondWind == 0;
}
actions
{
If(Random Integer(1, 100) > Event Player.Abilities[9] * 30);
Wait(30, Ignore Condition);
Loop;
End;
Set Status(Event Player, Null, Unkillable, 9999);
Event Player.secondWindActive = 1;
}
}
rule("Team 1 (Ability): Second Wind counter")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Is Game In Progress == True;
Event Player.lastSecondWind > 0;
}
actions
{
Wait(1, Ignore Condition);
Event Player.lastSecondWind -= 1;
Loop If Condition Is True;
}
}
rule("Team 1: Change Hero")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Distance Between(Vector(153.300, 10, -61.700), All Players(Team 1)) <= 3;
Is Button Held(Event Player, Button(Interact)) == True;
}
actions
{
Set Player Allowed Heroes(Event Player, Hero(Pharah));
Set Player Allowed Heroes(Event Player, Hero(Ana));
If(Global.IsStoryHeroes);
Reset Player Hero Availability(Event Player);
Set Player Allowed Heroes(Event Player, Array(Hero(Ana), Hero(Brigitte), Hero(Mercy), Hero(Lúcio), Hero(Moira), Hero(Baptiste),
Hero(Ashe), Hero(D.Va), Hero(Genji), Hero(Hanzo), Hero(Widowmaker), Hero(Cassidy), Hero(Reinhardt), Hero(Soldier: 76), Hero(
Torbjörn), Hero(Tracer), Hero(Winston), Hero(Pharah)));
Else;
Reset Player Hero Availability(Event Player);
End;
}
}