Return to post
settings
{
main
{
Description: "\"Sparc\" Is a recreation of the not at all popular VR game by the same name. Read more at workshop.codes/sparc. Made by Mitsiee. - v1.0"
Description: "\"Sparc\" Is a recreation of the not at all popular VR game by the same name. Read more at workshop.codes/sparc. Made by Mitsiee. - v1.1"
}
lobby
{
Allow Players Who Are In Queue: Yes
Match Voice Chat: Enabled
Max Spectators: 12
Max Team 1 Players: 1
Max Team 2 Players: 1
}
modes
{
Team Deathmatch
{
Game Length In Minutes: 15
Score To Win: 5
enabled maps
{
Workshop Chamber
}
}
General
{
Game Mode Start: Immediately
Hero Limit: Off
}
}
heroes
{
General
{
Genji
{
Damage Dealt: 10%
Damage Received: 10%
Deflect Cooldown Time: 10%
No Ammunition Requirement: On
Primary Fire: Off
Secondary Fire: Off
Swift Strike: Off
Ultimate Generation - Combat Dragonblade: 0%
Ultimate Generation - Passive Dragonblade: 0%
Ultimate Generation Dragonblade: 10%
}
Lúcio
{
Amp It Up: Off
Crossfade: Off
Damage Dealt: 10%
Damage Received: 10%
Jump Vertical Speed: 150%
No Ammunition Requirement: On
Primary Fire: Off
Soundwave Cooldown Time: 25%
Soundwave Knockback Scalar: 0%
Ultimate Generation - Combat Sound Barrier: 0%
Ultimate Generation - Passive Sound Barrier: 0%
Ultimate Generation Sound Barrier: 10%
}
enabled heroes
{
Genji
Lúcio
}
}
}
}
variables
{
global:
0: Player1PlayArea
1: Player2PlayArea
2: PlayAreaRadius
3: WallOffset
4: CeilingHeight
5: BallRadius
7: Ball1IsMoving
8: Ball2IsMoving
9: Ball1Position
10: Ball2Position
11: Ball1DirectionTowards
12: Ball2DirectionTowards
13: Ball1Speed
14: Ball2Speed
15: GameHasStarted
16: Player1Score
17: Player2Score
18: MaxScore
19: BackboardPlayer1Position
20: BackboardPlayer2Position
21: BackboardRadius
23: BeamBoxZDivider
24: BeamBoxStep
25: BeamBoxLoop
26: Ball1SpeedModifier
27: Ball2SpeedModifier
28: Ball1IsVisible
29: Ball2IsVisible
30: ReadyUpArea
31: Countdown
32: TutorialArea
33: ChangeHeroArea
34: ShieldRadius
35: AdvancedArea
36: AdvancedMode
37: TutorialActive
player:
1: BallHitbox
2: IsHoldingBall
3: HasShieldAvailable
4: IsUsingShield
}
subroutines
{
0: CreateBeamBoxDivider
1: Ball1ChangeDirectionEffects
2: CreatePlayer1BoxDivider
3: CreatePlayer2BoxDivider
4: Ball2ChangeDirectionEffects
5: Ball1Respawn
6: Ball2Respawn
7: BallHitAPlayer
8: PlayerMightTalkWhenThrowing
9: ShieldExplodesEffects
}
rule("Initialise")
{
event
{
Ongoing - Global;
}
actions
{
Global.GameHasStarted = False;
Global.Countdown = False;
Global.AdvancedMode = False;
Wait(5, Ignore Condition);
Set Objective Description(All Players(All Teams), Custom String("First to {0}", Global.MaxScore), Visible To and String);
}
}
rule("Initialise player")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Has Spawned(Event Player) == True;
}
actions
{
Event Player.IsHoldingBall = False;
Event Player.HasShieldAvailable = False;
Teleport(Event Player, Vector(16, 0, 0));
Wait(0.250, Ignore Condition);
Set Facing(Event Player, Direction Towards(Position Of(Event Player), Vector(0, 0, 0)), To World);
Set Status(Event Player, Null, Phased Out, 9999);
}
}
rule("In-world text")
{
event
{
Ongoing - Global;
}
actions
{
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String("Sparc"), Vector(-16, 16, 0), 5,
Clip Against Surfaces, Visible To Position and String, Orange, Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String("Workshop.codes/sparc"), Vector(-16, 15, 0), 2,
Clip Against Surfaces, Visible To Position and String, Aqua, Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String("Made by Mitsiee"), Vector(-16, 14, 0), 1,
Clip Against Surfaces, Visible To Position and String, White, Default Visibility);
Create In-World Text(Filtered Array(All Players(All Teams), Global.Countdown), Global.Countdown, Up, 5, Clip Against Surfaces,
Visible To Position and String, White, Default Visibility);
}
}
disabled rule("--- Pre-game")
{
event
{
Ongoing - Global;
}
}
rule("Push down game interface in pre-game")
{
event
{
Ongoing - Global;
}
actions
{
"Push down game interface"
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), !Global.GameHasStarted), Null, Custom String(" "), Custom String(" "), Top,
0, White, White, White, Visible To and String, Default Visibility);
}
}
rule("Game is in hero select")
{
event
{
Ongoing - Global;
}
conditions
{
Is Assembling Heroes == True;
}
actions
{
Set Match Time(1);
}
}
rule("Players cannot leave pre-game area")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.GameHasStarted != True;
Has Spawned(Event Player) == True;
X Component Of(Position Of(Event Player)) < Global.WallOffset + 1;
Slot Of(Event Player) == 0;
}
actions
{
Apply Impulse(Event Player, Direction Towards(Position Of(Event Player), Vector(16, Y Component Of(Position Of(Event Player)),
Z Component Of(Position Of(Event Player)))), 5, To World, Cancel Contrary Motion);
Wait(0.025, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Ready up area")
{
event
{
Ongoing - Global;
}
actions
{
Global.ReadyUpArea = Vector(8, 0, 4);
Create Effect(Filtered Array(!Global.GameHasStarted, True), Ring, Lime Green, Global.ReadyUpArea, 2,
Visible To Position and Radius);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String("All players crouch here to ready up"),
Global.ReadyUpArea + Vector(0, 0.500, 0), 1.100, Clip Against Surfaces, Visible To Position and String, Lime Green,
Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Icon String(Checkmark), Global.ReadyUpArea + Up, 1.100,
Clip Against Surfaces, Visible To Position and String, Lime Green, Default Visibility);
}
}
rule("Player is crouching in ready up area")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.GameHasStarted != True;
Is Crouching(Event Player) == True;
Distance Between(Position Of(Event Player), Global.ReadyUpArea) < 2.500;
}
actions
{
Wait(0.250, Abort When False);
Play Effect(All Players(All Teams), Good Pickup Effect, Turquoise, Event Player, 2);
Play Effect(All Players(All Teams), Buff Impact Sound, White, Event Player, 100);
Communicate(Event Player, Ready);
}
}
rule("All players are crouching in ready area")
{
event
{
Ongoing - Global;
}
conditions
{
Global.GameHasStarted != True;
Is True For All(All Living Players(All Teams), Is Button Held(Current Array Element, Crouch)) == True;
Is True For All(All Players(All Teams), Distance Between(Position Of(Current Array Element), Global.ReadyUpArea) < 2.500) == True;
Count Of(All Living Players(All Teams)) > 0;
}
actions
{
Wait(0.250, Abort When False);
Clear Status(All Players(All Teams), Phased Out);
Global.GameHasStarted = True;
Global.Ball1IsVisible = False;
Global.Ball2IsVisible = False;
Global.Ball1Position = Vector(0, -5, 0);
Global.Ball2Position = Vector(0, -5, 0);
Wait(1, Ignore Condition);
Communicate(All Players(All Teams), Countdown);
Global.Countdown = 3;
Play Effect(All Players(All Teams), Debuff Impact Sound, White, Vector(0, 0, 0), 100);
Wait(1, Ignore Condition);
Global.Countdown = 2;
Play Effect(All Players(All Teams), Debuff Impact Sound, White, Vector(0, 0, 0), 100);
Wait(1, Ignore Condition);
Global.Countdown = 1;
Play Effect(All Players(All Teams), Debuff Impact Sound, White, Vector(0, 0, 0), 100);
Wait(1, Ignore Condition);
Global.Countdown = 0;
Play Effect(All Players(All Teams), Ring Explosion Sound, White, Vector(0, 0, 0), 200);
Play Effect(All Players(All Teams), Ring Explosion, White, Vector(0, 0, 0), 40);
Communicate(All Players(All Teams), Go);
Set Match Time(180);
}
}
rule("Change hero area")
{
event
{
Ongoing - Global;
}
actions
{
Global.ChangeHeroArea = Vector(8, 0, 0);
Create Effect(Filtered Array(!Global.GameHasStarted, True), Ring, Purple, Global.ChangeHeroArea, 1,
Visible To Position and Radius);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String("Crouch here to change hero"),
Global.ChangeHeroArea + Vector(0, 0.250, 0), 1.100, Clip Against Surfaces, Visible To Position and String, Purple,
Default Visibility);
}
}
rule("Player is crouching in change hero area")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.GameHasStarted != True;
Is Crouching(Event Player) == True;
Distance Between(Position Of(Event Player), Global.ChangeHeroArea) < 1.500;
}
actions
{
Set Player Allowed Heroes(Event Player, Remove From Array(All Heroes, Hero Of(Event Player)));
Wait(0.250, Ignore Condition);
Reset Player Hero Availability(Event Player);
}
}
rule("Game started - ball 1")
{
event
{
Ongoing - Global;
}
conditions
{
Global.Countdown == 1;
Global.GameHasStarted == True;
}
actions
{
Call Subroutine(Ball1Respawn);
}
}
rule("Game started - ball 2")
{
event
{
Ongoing - Global;
}
conditions
{
Global.Countdown == 1;
Global.GameHasStarted == True;
}
actions
{
Call Subroutine(Ball2Respawn);
}
}
disabled rule("--- Player area")
{
event
{
Ongoing - Global;
}
}
rule("Set Play Area")
{
event
{
Ongoing - Global;
}
actions
{
Global.Player1PlayArea = Vector(0, 0, 12);
Global.Player2PlayArea = Vector(0, 0, -12);
Global.PlayAreaRadius = 3.750;
Global.WallOffset = 4;
Global.CeilingHeight = 6;
Global.BeamBoxStep = 1;
}
}
rule("Create Play Area")
{
event
{
Ongoing - Global;
}
actions
{
"Rings player 1"
Create Effect(All Players(All Teams), Ring, Aqua, Global.Player1PlayArea, Global.PlayAreaRadius, Visible To Position and Radius);
Create Effect(All Players(All Teams), Ring, Aqua, Global.Player1PlayArea, Global.PlayAreaRadius / 2.500,
Visible To Position and Radius);
"Rings player 2"
Create Effect(All Players(All Teams), Ring, Orange, Global.Player2PlayArea, Global.PlayAreaRadius, Visible To Position and Radius);
Create Effect(All Players(All Teams), Ring, Orange, Global.Player2PlayArea, Global.PlayAreaRadius / 2.500,
Visible To Position and Radius);
"Player 1 effect on floor"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, 0, 20), Vector(Global.WallOffset, 0, 0), Aqua,
Visible To Position and Radius);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, 20), Vector(Global.WallOffset * -1, 0, 0),
Aqua, Visible To Position and Radius);
"Player 2 effect on floor"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, 0, -20), Vector(Global.WallOffset, 0, 0), Orange,
Visible To Position and Radius);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, -20), Vector(Global.WallOffset * -1, 0, 0),
Orange, Visible To Position and Radius);
"Player 1 effect top of box"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, Global.CeilingHeight, 20), Vector(
Global.WallOffset, Global.CeilingHeight, 0), Aqua, Visible To Position and Radius);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight, 20), Vector(
Global.WallOffset * -1, Global.CeilingHeight, 0), Aqua, Visible To Position and Radius);
"Player 2 effect top of box"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, Global.CeilingHeight, -20), Vector(
Global.WallOffset, Global.CeilingHeight, 0), Orange, Visible To Position and Radius);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight, -20), Vector(
Global.WallOffset * -1, Global.CeilingHeight, 0), Orange, Visible To Position and Radius);
}
}
rule("Create Play Area limits box")
{
event
{
Ongoing - Global;
}
actions
{
"Team 1 backing beams"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, 0, 19.980), Vector(Global.WallOffset,
Global.CeilingHeight, 19.981), Aqua, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, 19.980), Vector(Global.WallOffset * -1,
Global.CeilingHeight, 19.981), Aqua, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, 19.880), Vector(Global.WallOffset, 0,
19.881), Aqua, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight, 19.980), Vector(
Global.WallOffset, Global.CeilingHeight, 19.981), Aqua, None);
}
}
rule("Create grapple beam box")
{
event
{
Ongoing - Global;
}
actions
{
Wait(2, Ignore Condition);
"Beam box on top"
For Global Variable(BeamBoxLoop, 0, Global.WallOffset * 2 + Global.BeamBoxStep, Global.BeamBoxStep);
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset * -1 + Global.BeamBoxLoop, Global.CeilingHeight,
20), Vector(Global.WallOffset * -1 + Global.BeamBoxLoop, Global.CeilingHeight, -20), White, None);
End;
"Beam box positive x"
For Global Variable(BeamBoxLoop, 0, Global.CeilingHeight + Global.BeamBoxStep, Global.BeamBoxStep);
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset, Global.CeilingHeight - Global.BeamBoxLoop, 20),
Vector(Global.WallOffset, Global.CeilingHeight - Global.BeamBoxLoop, -20), White, None);
End;
"Beam box negative x"
For Global Variable(BeamBoxLoop, 0, Global.CeilingHeight + Global.BeamBoxStep, Global.BeamBoxStep);
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight - Global.BeamBoxLoop,
20), Vector(Global.WallOffset * -1, Global.CeilingHeight - Global.BeamBoxLoop, -20), White, None);
End;
"Create grapple beam dividers"
Global.BeamBoxZDivider = 0;
Call Subroutine(CreateBeamBoxDivider);
Global.BeamBoxZDivider = 8;
Call Subroutine(CreateBeamBoxDivider);
Call Subroutine(CreatePlayer1BoxDivider);
Global.BeamBoxZDivider = -8;
Call Subroutine(CreateBeamBoxDivider);
Call Subroutine(CreatePlayer2BoxDivider);
Global.BeamBoxZDivider = 16;
Call Subroutine(CreateBeamBoxDivider);
Call Subroutine(CreatePlayer1BoxDivider);
Global.BeamBoxZDivider = -16;
Call Subroutine(CreateBeamBoxDivider);
Call Subroutine(CreatePlayer2BoxDivider);
Global.BeamBoxZDivider = 19.980;
Call Subroutine(CreateBeamBoxDivider);
Call Subroutine(CreatePlayer1BoxDivider);
Global.BeamBoxZDivider = -19.980;
Call Subroutine(CreateBeamBoxDivider);
Call Subroutine(CreatePlayer2BoxDivider);
}
}
rule("Subroutine - Create beam box divider")
{
event
{
Subroutine;
CreateBeamBoxDivider;
}
actions
{
"Center divider"
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset, Global.CeilingHeight, Global.Player1PlayArea + Global.BeamBoxZDivider + 0.001), White, None);
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset * -1, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset * -1, Global.CeilingHeight, Global.BeamBoxZDivider + 0.001), White, None);
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset * -1, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset, 0, Global.BeamBoxZDivider + 0.001), White, None);
Create Beam Effect(All Players(All Teams), Grapple Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight,
Global.BeamBoxZDivider), Vector(Global.WallOffset, Global.CeilingHeight, Global.BeamBoxZDivider + 0.001), White, None);
}
}
rule("Subroutine - Create Player 1 beam box divider")
{
event
{
Subroutine;
CreatePlayer1BoxDivider;
}
actions
{
"Center divider"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset, Global.CeilingHeight, Global.Player1PlayArea + Global.BeamBoxZDivider + 0.001), Aqua, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset * -1, Global.CeilingHeight, Global.BeamBoxZDivider + 0.001), Aqua, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset, 0, Global.BeamBoxZDivider + 0.001), Aqua, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight, Global.BeamBoxZDivider),
Vector(Global.WallOffset, Global.CeilingHeight, Global.BeamBoxZDivider + 0.001), Aqua, None);
}
}
rule("Subroutine - Create Player 2 beam box divider")
{
event
{
Subroutine;
CreatePlayer2BoxDivider;
}
actions
{
"Center divider"
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset, Global.CeilingHeight, Global.Player1PlayArea + Global.BeamBoxZDivider + 0.001), Orange, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset * -1, Global.CeilingHeight, Global.BeamBoxZDivider + 0.001), Orange, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, 0, Global.BeamBoxZDivider), Vector(
Global.WallOffset, 0, Global.BeamBoxZDivider + 0.001), Orange, None);
Create Beam Effect(All Players(All Teams), Good Beam, Vector(Global.WallOffset * -1, Global.CeilingHeight, Global.BeamBoxZDivider),
Vector(Global.WallOffset, Global.CeilingHeight, Global.BeamBoxZDivider + 0.001), Orange, None);
}
}
rule("Player 1 cannot leave play area")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 0;
}
conditions
{
(X Component Of(Position Of(Event Player)) > X Component Of(Global.Player1PlayArea) + Global.PlayAreaRadius || X Component Of(
Position Of(Event Player)) < X Component Of(Global.Player1PlayArea) - Global.PlayAreaRadius || Z Component Of(Position Of(
Event Player)) > Z Component Of(Global.Player1PlayArea) + Global.PlayAreaRadius || Z Component Of(Position Of(Event Player))
< Z Component Of(Global.Player1PlayArea) - Global.PlayAreaRadius) == True;
Has Spawned(Event Player) == True;
Global.GameHasStarted == True;
}
actions
{
Apply Impulse(Event Player, Direction Towards(Position Of(Event Player), Global.Player1PlayArea + Vector(0, Y Component Of(
Position Of(Event Player)) - 1, 0)), 7.500, To World, Cancel Contrary Motion);
Set Move Speed(Event Player, 0);
Wait(0.025, Ignore Condition);
Set Move Speed(Event Player, 100);
Loop If Condition Is True;
}
}
rule("Player 2 cannot leave play area")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 0;
}
conditions
{
(X Component Of(Position Of(Event Player)) > X Component Of(Global.Player2PlayArea) + Global.PlayAreaRadius || X Component Of(
Position Of(Event Player)) < X Component Of(Global.Player2PlayArea) - Global.PlayAreaRadius || Z Component Of(Position Of(
Event Player)) > Z Component Of(Global.Player2PlayArea) + Global.PlayAreaRadius || Z Component Of(Position Of(Event Player))
< Z Component Of(Global.Player2PlayArea) - Global.PlayAreaRadius) == True;
Has Spawned(Event Player) == True;
Global.GameHasStarted == True;
}
actions
{
Apply Impulse(Event Player, Direction Towards(Position Of(Event Player), Global.Player2PlayArea + Vector(0, Y Component Of(
Position Of(Event Player)) - 1, 0)), 7.500, To World, Cancel Contrary Motion);
Set Move Speed(Event Player, 0);
Wait(0.025, Ignore Condition);
Set Move Speed(Event Player, 100);
Loop If Condition Is True;
}
}
disabled rule("--- Initialse players")
{
event
{
Ongoing - Global;
}
}
rule("Teleport player 1")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 0;
}
conditions
{
Is Alive(Event Player) == True;
Has Spawned(Event Player) == True;
Global.GameHasStarted == True;
}
actions
{
Teleport(Event Player, Global.Player1PlayArea + Forward);
Set Facing(Event Player, Global.Player2PlayArea, To World);
}
}
rule("Teleport player 2")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 0;
}
conditions
{
Is Alive(Event Player) == True;
Has Spawned(Event Player) == True;
Global.GameHasStarted == True;
}
actions
{
Teleport(Event Player, Global.Player2PlayArea + Backward);
Set Facing(Event Player, Global.Player1PlayArea, To World);
}
}
disabled rule("--- Ball")
{
event
{
Ongoing - Global;
}
}
rule("Initialise balls")
{
event
{
Ongoing - Global;
}
actions
{
Global.BallRadius = 0.500;
Global.Ball1Position = Global.Player1PlayArea + Up;
Global.Ball2Position = Global.Player2PlayArea + Up;
Global.Ball1Speed = 0.150;
Global.Ball2Speed = 0.150;
Global.Ball1Speed = 0.200;
Global.Ball2Speed = 0.200;
Global.Ball1SpeedModifier = 0;
Global.Ball2SpeedModifier = 0;
Global.Ball1IsVisible = True;
Global.Ball2IsVisible = True;
Wait(0.250, Ignore Condition);
}
}
rule("Set ball hitbox for Lucio")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Lúcio);
}
actions
{
Event Player.BallHitbox = 3;
}
}
rule("Set ball hitbox for Genji")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Genji);
}
actions
{
Event Player.BallHitbox = 2;
}
}
rule("Create ball effects")
{
event
{
Ongoing - Each Player;
All;
Slot 0;
}
actions
{
"Ball 1"
Create Effect(Filtered Array(Event Player, Global.Ball1IsVisible), Sphere, Aqua, Global.Ball1Position, Global.BallRadius,
Visible To Position and Radius);
Create Effect(Event Player, Bad Aura, Aqua, Global.Ball1Position, Global.BallRadius, Visible To Position and Radius);
Create Effect(Event Player, Pick-up Sound, White, Global.Ball1Position, 250 - Distance Between(Event Player, Global.Ball1Position)
* 8, Visible To Position and Radius);
Create Effect(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Y Component Of(Global.Ball1Position)
> 0 && !Global.Ball1IsMoving), Light Shaft, Aqua, Global.Ball1Position + Vector(0, -5, 0), 0.150,
Visible To Position and Radius);
"Ball 2"
Create Effect(Filtered Array(Event Player, Global.Ball2IsVisible), Sphere, Orange, Global.Ball2Position, Global.BallRadius,
Visible To Position and Radius);
Create Effect(Event Player, Bad Aura, Orange, Global.Ball2Position, Global.BallRadius, Visible To Position and Radius);
Create Effect(Event Player, Pick-up Sound, White, Global.Ball2Position, 250 - Distance Between(Event Player, Global.Ball2Position)
* 8, Visible To Position and Radius);
Create Effect(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Y Component Of(Global.Ball2Position)
> 0 && !Global.Ball2IsMoving), Light Shaft, Orange, Global.Ball2Position + Vector(0, -5, 0), 0.150,
Visible To Position and Radius);
}
}
rule("Move ball 1")
{
event
{
Ongoing - Global;
}
conditions
{
Global.Ball1IsMoving == True;
}
actions
{
Global.Ball1Position = Global.Ball1Position + Vector(Global.Ball1DirectionTowards[0], Global.Ball1DirectionTowards[1],
Global.Ball1DirectionTowards[2]) * (Global.Ball1Speed + Global.Ball1SpeedModifier * (Global.Ball1Speed / 3));
Global.Ball1DirectionTowards[2]) * (Global.Ball1Speed + Global.Ball1SpeedModifier * (Global.Ball1Speed / 5));
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Move ball 2")
{
event
{
Ongoing - Global;
}
conditions
{
Global.Ball2IsMoving == True;
}
actions
{
Global.Ball2Position = Global.Ball2Position + Vector(Global.Ball2DirectionTowards[0], Global.Ball2DirectionTowards[1],
Global.Ball2DirectionTowards[2]) * (Global.Ball2Speed + Global.Ball2SpeedModifier * (Global.Ball2Speed / 3));
Global.Ball2DirectionTowards[2]) * (Global.Ball2Speed + Global.Ball2SpeedModifier * (Global.Ball2Speed / 5));
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Ball 1 has hit X wall")
{
event
{
Ongoing - Global;
}
conditions
{
(X Component Of(Global.Ball1Position) + Global.BallRadius >= Global.WallOffset || X Component Of(Global.Ball1Position)
- Global.BallRadius <= Global.WallOffset * -1) == True;
}
actions
{
If(Global.Ball1DirectionTowards[0] < 0);
Global.Ball1DirectionTowards[0] = Absolute Value(Global.Ball1DirectionTowards[0]);
Else;
Global.Ball1DirectionTowards[0] = Absolute Value(Global.Ball1DirectionTowards[0]) * -1;
End;
Call Subroutine(Ball1ChangeDirectionEffects);
}
}
rule("Ball 1 has hit Y wall")
{
event
{
Ongoing - Global;
}
conditions
{
(Y Component Of(Global.Ball1Position) + Global.BallRadius >= Global.CeilingHeight || Y Component Of(Global.Ball1Position)
- Global.BallRadius <= 0) == True;
Global.Ball1IsMoving == True;
}
actions
{
If(Global.Ball1DirectionTowards[1] < 0);
Global.Ball1DirectionTowards[1] = Absolute Value(Global.Ball1DirectionTowards[1]);
Else;
Global.Ball1DirectionTowards[1] = Absolute Value(Global.Ball1DirectionTowards[1]) * -1;
End;
Call Subroutine(Ball1ChangeDirectionEffects);
}
}
rule("Ball 1 has hit opposit Z wall")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball1Position) - Global.BallRadius <= -20;
}
actions
{
Global.Ball1DirectionTowards[0] = X Component Of(Direction Towards(Global.Ball1Position, Global.Player1PlayArea));
Global.Ball1DirectionTowards[1] = Y Component Of(Direction Towards(Global.Ball1Position, Global.Player1PlayArea + Up));
Global.Ball1DirectionTowards[2] = Z Component Of(Direction Towards(Global.Ball1Position, Global.Player1PlayArea));
Call Subroutine(Ball1ChangeDirectionEffects);
Global.Ball1IsVisible = False;
Play Effect(All Players(All Teams), Good Pickup Effect, Aqua, Global.Ball1Position, 2);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball1Position, 5);
Wait(0.250, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball1Position, 5);
Wait(0.250, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball1Position, 5);
}
}
rule("Ball 1 has hit current Z wall")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball1Position) + Global.BallRadius >= 20;
}
actions
{
Call Subroutine(Ball1ChangeDirectionEffects);
Call Subroutine(Ball1Respawn);
}
}
rule("Ball 1 is moving back and crosses threshhold")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball1Position) > -8;
Global.Ball1IsVisible != True;
Global.Ball1IsMoving == True;
Global.Ball1DirectionTowards[2] > 0;
}
actions
{
Global.Ball1IsVisible = True;
}
}
rule("Ball 2 has hit X wall")
{
event
{
Ongoing - Global;
}
conditions
{
(X Component Of(Global.Ball2Position) + Global.BallRadius >= Global.WallOffset || X Component Of(Global.Ball2Position)
- Global.BallRadius <= Global.WallOffset * -1) == True;
}
actions
{
If(Global.Ball2DirectionTowards[0] < 0);
Global.Ball2DirectionTowards[0] = Absolute Value(Global.Ball2DirectionTowards[0]);
Else;
Global.Ball2DirectionTowards[0] = Absolute Value(Global.Ball2DirectionTowards[0]) * -1;
End;
Call Subroutine(Ball2ChangeDirectionEffects);
}
}
rule("Ball 2 has hit Y wall")
{
event
{
Ongoing - Global;
}
conditions
{
(Y Component Of(Global.Ball2Position) + Global.BallRadius >= Global.CeilingHeight || Y Component Of(Global.Ball2Position)
- Global.BallRadius <= 0) == True;
Global.Ball2IsMoving == True;
}
actions
{
If(Global.Ball2DirectionTowards[1] < 0);
Global.Ball2DirectionTowards[1] = Absolute Value(Global.Ball2DirectionTowards[1]);
Else;
Global.Ball2DirectionTowards[1] = Absolute Value(Global.Ball2DirectionTowards[1]) * -1;
End;
Call Subroutine(Ball2ChangeDirectionEffects);
}
}
rule("Ball 2 has hit opposit Z wall")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball2Position) + Global.BallRadius >= 20;
}
actions
{
Global.Ball2DirectionTowards[0] = X Component Of(Direction Towards(Global.Ball2Position, Global.Player1PlayArea));
Global.Ball2DirectionTowards[1] = Y Component Of(Direction Towards(Global.Ball2Position, Global.Player1PlayArea + Up));
Global.Ball2DirectionTowards[2] = Z Component Of(Direction Towards(Global.Ball2Position, Global.Player1PlayArea));
Global.Ball2DirectionTowards[0] = X Component Of(Direction Towards(Global.Ball2Position, Global.Player2PlayArea));
Global.Ball2DirectionTowards[1] = Y Component Of(Direction Towards(Global.Ball2Position, Global.Player2PlayArea + Up));
Global.Ball2DirectionTowards[2] = Z Component Of(Direction Towards(Global.Ball2Position, Global.Player2PlayArea));
Call Subroutine(Ball2ChangeDirectionEffects);
Global.Ball2IsVisible = False;
Play Effect(All Players(All Teams), Good Pickup Effect, Aqua, Global.Ball2Position, 2);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball2Position, 5);
Play Effect(All Players(All Teams), Good Pickup Effect, Orange, Global.Ball2Position, 2);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.Ball2Position, 5);
Wait(0.250, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball2Position, 5);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.Ball2Position, 5);
Wait(0.250, Ignore Condition);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball2Position, 5);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.Ball2Position, 5);
}
}
rule("Ball 2 has hit current Z wall")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball2Position) - Global.BallRadius <= -20;
}
actions
{
Call Subroutine(Ball2ChangeDirectionEffects);
Call Subroutine(Ball2Respawn);
}
}
rule("Ball 2 is moving back and crosses threshhold")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball2Position) < 8;
Global.Ball2IsVisible != True;
Global.Ball2IsMoving == True;
Global.Ball2DirectionTowards[2] > 0;
Global.Ball2DirectionTowards[2] < 0;
}
actions
{
Global.Ball2IsVisible = True;
}
}
rule("Subroutine - Ball effects when ball 1 changes direction")
{
event
{
Subroutine;
Ball1ChangeDirectionEffects;
}
actions
{
Play Effect(All Players(All Teams), Bad Explosion, Aqua, Global.Ball1Position, Global.BallRadius * 1.500);
Play Effect(All Players(All Teams), Explosion Sound, White, Global.Ball1Position, 50 - Distance Between(Position Of(Event Player),
Global.Ball1Position) * 2);
}
}
rule("Subroutine - Ball effects when ball 2 changes direction")
{
event
{
Subroutine;
Ball2ChangeDirectionEffects;
}
actions
{
Play Effect(All Players(All Teams), Bad Explosion, Orange, Global.Ball2Position, Global.BallRadius * 1.500);
Play Effect(All Players(All Teams), Explosion Sound, White, Global.Ball2Position, 50 - Distance Between(Position Of(Event Player),
Global.Ball2Position) * 2);
}
}
rule("Subroutine - (Re)spawn ball 1")
{
event
{
Subroutine;
Ball1Respawn;
}
actions
{
Global.Ball1IsMoving = False;
Global.Ball1IsVisible = False;
Play Effect(All Players(All Teams), Good Pickup Effect, Aqua, Global.Ball1Position, 2);
Wait(0.500, Ignore Condition);
Global.Ball1Position = Global.Player1PlayArea;
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball1Position, 2.500);
Wait(0.250, Ignore Condition);
Global.Ball1Position = Global.Player1PlayArea + Vector(0, 0.500, 0);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball1Position, 2.500);
Wait(0.250, Ignore Condition);
Global.Ball1Position = Global.Player1PlayArea + Vector(0, 1, 0);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.Ball1Position, 2.500);
Global.Ball1IsVisible = True;
}
}
rule("Subroutine - (Re)spawn ball 2")
{
event
{
Subroutine;
Ball2Respawn;
}
actions
{
Global.Ball2IsMoving = False;
Global.Ball2IsVisible = False;
Play Effect(All Players(All Teams), Good Pickup Effect, Orange, Global.Ball2Position, 2);
Wait(0.500, Ignore Condition);
Global.Ball2Position = Global.Player2PlayArea;
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.Ball2Position, 2.500);
Wait(0.250, Ignore Condition);
Global.Ball2Position = Global.Player2PlayArea + Vector(0, 0.500, 0);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.Ball2Position, 2.500);
Wait(0.250, Ignore Condition);
Global.Ball2Position = Global.Player2PlayArea + Vector(0, 1, 0);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.Ball2Position, 2.500);
Global.Ball2IsVisible = True;
}
}
rule("Subroutine - Ball hit a player effects")
{
event
{
Subroutine;
BallHitAPlayer;
}
actions
{
Set Status(Event Player, Null, Knocked Down, 0.500);
Play Effect(All Players(All Teams), Debuff Impact Sound, White, Event Player, 200);
Play Effect(All Players(All Teams), Bad Explosion, Red, Event Player, 5);
Play Effect(All Players(All Teams), Bad Pickup Effect, Red, Event Player, 20);
Play Effect(All Players(All Teams), Ring Explosion, Red, Vector(X Component Of(Position Of(Event Player)), 0, Z Component Of(
Position Of(Event Player))), 20);
}
}
rule("Ball 1 hit player 1")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 0;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball1Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball1IsMoving == True;
Global.Ball1IsVisible == True;
Event Player.IsHoldingBall != True;
Event Player.IsUsingShield != True;
}
actions
{
Global.Ball1Position = Vector(0, -5, 0);
Big Message(All Players(All Teams), Custom String("{0} got hit", Players In Slot(0, Team 1)));
Global.Player2Score += 1;
Set Team Score(Team 2, Global.Player2Score);
Global.Ball1SpeedModifier = 0;
Call Subroutine(BallHitAPlayer);
Global.Ball1IsVisible = False;
Global.Ball1IsMoving = False;
Wait(1, Ignore Condition);
Call Subroutine(Ball1Respawn);
}
}
rule("Ball 2 hit player 1")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 0;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball2Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball2IsMoving == True;
Global.Ball2IsVisible == True;
Event Player.IsUsingShield != True;
}
actions
{
Global.Ball2Position = Vector(0, -5, 0);
Big Message(All Players(All Teams), Custom String("{0} got hit", Players In Slot(0, Team 1)));
Global.Player2Score += 1;
Set Team Score(Team 2, Global.Player2Score);
Global.Ball2SpeedModifier = 0;
Call Subroutine(BallHitAPlayer);
Global.Ball2IsVisible = False;
Global.Ball2IsMoving = False;
Wait(1, Ignore Condition);
Call Subroutine(Ball2Respawn);
}
}
rule("Ball 1 hit player 2")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 0;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball1Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball1IsMoving == True;
Global.Ball1IsVisible == True;
Event Player.IsUsingShield != True;
}
actions
{
Global.Ball1Position = Vector(0, -5, 0);
Big Message(All Players(All Teams), Custom String("{0} got hit", Players In Slot(0, Team 2)));
Global.Player1Score += 1;
Set Team Score(Team 1, Global.Player1Score);
Global.Ball1SpeedModifier = 0;
Call Subroutine(BallHitAPlayer);
Global.Ball1IsVisible = False;
Global.Ball1IsMoving = False;
Wait(1, Ignore Condition);
Call Subroutine(Ball1Respawn);
}
}
rule("Ball 2 hit player 2")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 0;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball2Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball2IsMoving == True;
Global.Ball2IsVisible == True;
Event Player.IsHoldingBall != True;
Event Player.IsUsingShield != True;
}
actions
{
Global.Ball2Position = Vector(0, -5, 0);
Big Message(All Players(All Teams), Custom String("{0} got hit", Players In Slot(0, Team 2)));
Global.Player1Score += 1;
Set Team Score(Team 1, Global.Player1Score);
Global.Ball2SpeedModifier = 0;
Call Subroutine(BallHitAPlayer);
Global.Ball2IsVisible = False;
Global.Ball2IsMoving = False;
Wait(1, Ignore Condition);
Call Subroutine(Ball2Respawn);
}
}
disabled rule("--- Using deflect")
{
event
{
Ongoing - Global;
}
}
rule("Player is using ability and ball 1 is near user")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player))) == True;
Distance Between(Position Of(Event Player), Global.Ball1Position) <= Event Player.BallHitbox;
Is In View Angle(Event Player, Global.Ball1Position, 60) == True;
Global.Ball1IsVisible == True;
}
actions
{
Global.Ball1IsMoving = True;
Global.Ball1DirectionTowards[0] = Min(Max(X Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
Global.Ball1DirectionTowards[1] = Min(Max(Y Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
If(Z Component Of(Facing Direction Of(Event Player)) >= 0);
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), 0.250), 1);
Else;
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), -1), -0.250);
End;
Call Subroutine(Ball1ChangeDirectionEffects);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Player is using ability and ball 2 is near user")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player))) == True;
Distance Between(Position Of(Event Player), Global.Ball2Position) <= Event Player.BallHitbox;
Is In View Angle(Event Player, Global.Ball2Position, 60) == True;
Global.Ball2IsVisible == True;
}
actions
{
Global.Ball2IsMoving = True;
Global.Ball2DirectionTowards[0] = Min(Max(X Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
Global.Ball2DirectionTowards[1] = Min(Max(Y Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
If(Z Component Of(Facing Direction Of(Event Player)) >= 0);
Global.Ball2DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), 0.250), 1);
Else;
Global.Ball2DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), -1), -0.250);
End;
Call Subroutine(Ball2ChangeDirectionEffects);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Genji use secondary fire to deflect")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Genji);
Is Button Held(Event Player, Secondary Fire) == True;
}
actions
{
Press Button(Event Player, Ability 2);
}
}
disabled rule("--- Score HUD")
{
event
{
Ongoing - Global;
}
}
rule("Initialise")
{
event
{
Ongoing - Global;
}
actions
{
Global.Player1Score = 0;
Global.Player2Score = 0;
Global.MaxScore = 5;
}
}
rule("In-world text of score")
{
event
{
Ongoing - Global;
}
actions
{
"Score player 1"
Create In-World Text(All Players(All Teams), Global.Player1Score, Vector(18, 10, 3), 25, Clip Against Surfaces,
Visible To Position and String, Aqua, Default Visibility);
"Score player 2"
Create In-World Text(All Players(All Teams), Global.Player2Score, Vector(18, 10, -3), 25, Clip Against Surfaces,
Visible To Position and String, Orange, Default Visibility);
"Score text"
Create In-World Text(All Players(All Teams), Custom String("Score"), Vector(18, 10, 0), 2, Clip Against Surfaces,
Visible To Position and String, White, Default Visibility);
"Max score"
Create In-World Text(All Players(All Teams), Custom String("First to {0}", Global.MaxScore), Vector(18, 9, 0), 1,
Clip Against Surfaces, Visible To Position and String, White, Default Visibility);
"Speed modifier ball 1"
Create In-World Text(All Players(All Teams), Custom String("{0} {1}", Icon String(Bolt), Global.Ball1SpeedModifier), Vector(18, 9,
3), 1, Clip Against Surfaces, Visible To Position and String, Aqua, Default Visibility);
"Speed modifier ball 1"
Create In-World Text(All Players(All Teams), Custom String("{0} {1}", Icon String(Bolt), Global.Ball2SpeedModifier), Vector(18, 9,
-3), 1, Clip Against Surfaces, Visible To Position and String, Orange, Default Visibility);
}
}
disabled rule("--- Backboards")
{
event
{
Ongoing - Global;
}
}
rule("Create backboards")
{
event
{
Ongoing - Global;
}
actions
{
Global.BackboardRadius = 1.500;
"Backboard player 1"
Global.BackboardPlayer1Position = Vector(0, Global.BackboardRadius * 1.250, 20);
Create Effect(All Players(All Teams), Sphere, Aqua, Global.BackboardPlayer1Position, Global.BackboardRadius,
Visible To Position and Radius);
"Backboard player 2"
Global.BackboardPlayer2Position = Vector(0, Global.BackboardRadius * 1.250, -20);
Create Effect(All Players(All Teams), Sphere, Orange, Global.BackboardPlayer2Position, Global.BackboardRadius,
Visible To Position and Radius);
}
}
rule("Ball 1 enters backboard 2")
{
event
{
Ongoing - Global;
}
conditions
{
Distance Between(Global.Ball1Position, Global.BackboardPlayer2Position) - Global.BallRadius <= Global.BackboardRadius;
Global.Ball1IsVisible == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Aqua, Global.BackboardPlayer2Position, 3);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Global.BackboardPlayer2Position, 20);
Play Effect(All Players(All Teams), Buff Explosion Sound, White, Global.BackboardPlayer2Position, 100);
If(Global.Ball1SpeedModifier < 5);
Global.Ball1SpeedModifier += 1;
End;
}
}
rule("Ball 2 enters backboard 1")
{
event
{
Ongoing - Global;
}
conditions
{
Distance Between(Global.Ball2Position, Global.BackboardPlayer1Position) - Global.BallRadius <= Global.BackboardRadius;
Global.Ball2IsVisible == True;
}
actions
{
Play Effect(All Players(All Teams), Good Explosion, Orange, Global.BackboardPlayer1Position, 3);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Global.BackboardPlayer1Position, 20);
Play Effect(All Players(All Teams), Buff Explosion Sound, White, Global.BackboardPlayer1Position, 100);
If(Global.Ball2SpeedModifier < 5);
Global.Ball2SpeedModifier += 1;
End;
}
}
disabled rule("--- Catching your ball")
{
event
{
Ongoing - Global;
}
}
rule("Player 1 is using melee near ball 1")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 0;
}
conditions
{
Is Meleeing(Event Player) == True;
Distance Between(Position Of(Event Player), Global.Ball1Position) <= 2.500;
Is In View Angle(Event Player, Global.Ball1Position, 60) == True;
Global.Ball1IsVisible == True;
Event Player.IsHoldingBall != True;
}
actions
{
Call Subroutine(Ball1ChangeDirectionEffects);
Global.Ball1IsVisible = False;
Global.Ball1IsMoving = False;
Global.Ball1Position = Vector(0, -5, 0);
Stop Holding Button(Event Player, Melee);
Disallow Button(Event Player, Melee);
Wait(0.100, Ignore Condition);
Event Player.IsHoldingBall = True;
Event Player.HasShieldAvailable = True;
}
}
rule("Player 2 is using melee near ball 2")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 0;
}
conditions
{
Is Meleeing(Event Player) == True;
Distance Between(Position Of(Event Player), Global.Ball2Position) <= 2.500;
Is In View Angle(Event Player, Global.Ball2Position, 60) == True;
Global.Ball2IsVisible == True;
Event Player.IsHoldingBall != True;
}
actions
{
Call Subroutine(Ball2ChangeDirectionEffects);
Global.Ball2Position = False;
Global.Ball2IsMoving = False;
Global.Ball2Position = Vector(0, -5, 0);
Stop Holding Button(Event Player, Melee);
Disallow Button(Event Player, Melee);
Wait(0.100, Ignore Condition);
Event Player.IsHoldingBall = True;
Event Player.HasShieldAvailable = True;
}
}
rule("Player 1 Is holding ball and press melee")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 0;
}
conditions
{
Event Player.IsHoldingBall == True;
Is Meleeing(Event Player) == True;
}
actions
{
Global.Ball1IsMoving = True;
Global.Ball1IsVisible = True;
Event Player.HasShieldAvailable = False;
Global.Ball1Position = Eye Position(Event Player) - Vector(0, Global.BallRadius / 2, 0) + Ray Cast Hit Normal(Eye Position(
Event Player), Facing Direction Of(Event Player) * 3, All Players(All Teams), Event Player, True);
Global.Ball1DirectionTowards[0] = Min(Max(X Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
Global.Ball1DirectionTowards[1] = Min(Max(Y Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
If(Z Component Of(Facing Direction Of(Event Player)) >= 0);
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), 0.250), 1);
Else;
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), -1), -0.250);
End;
Call Subroutine(Ball1ChangeDirectionEffects);
Call Subroutine(PlayerMightTalkWhenThrowing);
Wait(0.500, Ignore Condition);
Event Player.IsHoldingBall = False;
}
}
rule("Player 2 Is holding ball and press melee")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 0;
}
conditions
{
Event Player.IsHoldingBall == True;
Is Meleeing(Event Player) == True;
}
actions
{
Global.Ball2IsMoving = True;
Global.Ball2IsVisible = True;
Event Player.HasShieldAvailable = False;
Global.Ball1Position = Eye Position(Event Player) - Vector(0, Global.BallRadius / 2, 0) + Ray Cast Hit Normal(Eye Position(
Global.Ball2Position = Eye Position(Event Player) - Vector(0, Global.BallRadius / 2, 0) + Ray Cast Hit Normal(Eye Position(
Event Player), Facing Direction Of(Event Player) * 3, All Players(All Teams), Event Player, True);
Global.Ball2DirectionTowards[0] = Min(Max(X Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
Global.Ball2DirectionTowards[1] = Min(Max(Y Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
If(Z Component Of(Facing Direction Of(Event Player)) >= 0);
Global.Ball2DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), 0.250), 1);
Else;
Global.Ball2DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), -1), -0.250);
End;
Call Subroutine(Ball2ChangeDirectionEffects);
Call Subroutine(PlayerMightTalkWhenThrowing);
Wait(0.500, Ignore Condition);
Event Player.IsHoldingBall = False;
}
}
rule("Holding ball effects")
{
event
{
Ongoing - Global;
}
actions
{
"Player 1 holding ball effects"
Create Effect(Filtered Array(Players In Slot(0, Team 1).IsHoldingBall == True, True), Bad Aura, Aqua, Eye Position(Players In Slot(
0, Team 1)) + Vector(0, 2, 0), Global.BallRadius, Visible To Position and Radius);
Create Effect(Filtered Array((Players In Slot(0, Team 1).HasShieldAvailable && Players In Slot(0, Team 1).IsHoldingBall) == True,
True), Sparkles, Lime Green, Position Of(Players In Slot(0, Team 1)), 2, Visible To Position and Radius);
"Player 2 holding ball effects"
Create Effect(Filtered Array(Players In Slot(0, Team 2).IsHoldingBall == True, True), Bad Aura, Orange, Eye Position(
Players In Slot(0, Team 2)) + Vector(0, 2, 0), Global.BallRadius, Visible To Position and Radius);
Create Effect(Filtered Array((Players In Slot(0, Team 2).HasShieldAvailable && Players In Slot(0, Team 2).IsHoldingBall) == True,
True), Sparkles, Lime Green, Position Of(Players In Slot(0, Team 1)), 2, Visible To Position and Radius);
True), Sparkles, Lime Green, Position Of(Players In Slot(0, Team 2)), 2, Visible To Position and Radius);
}
}
rule("Is holding ball on-screen text")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String("You are holding your ball"), Custom String("Press Melee to throw"), Top, 10, White, White, White,
Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams),
Current Array Element == Event Player && Event Player.IsHoldingBall && Event Player.HasShieldAvailable), Null, Custom String(
"Press Interact to shield"), Null, Top, 11, White, Lime Green, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams),
Current Array Element == Event Player && Event Player.IsHoldingBall && !Event Player.HasShieldAvailable), Null, Custom String(
"Shield not available"), Null, Top, 11, White, Red, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element == Event Player && Event Player.IsHoldingBall), Null,
Custom String(" "), Custom String(" "), Top, 5, White, White, White, Visible To and String, Default Visibility);
}
}
rule("No longer holding melee")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Melee) != True;
}
actions
{
Allow Button(Event Player, Melee);
}
}
rule("Cancel melee")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Meleeing(Event Player) == True;
}
actions
{
Cancel Primary Action(Event Player);
}
}
rule("Press primary fire to melee")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Primary Fire) == True;
}
actions
{
Press Button(Event Player, Melee);
}
}
rule("Subroutine - Player might say something when throwing ball")
{
event
{
Subroutine;
PlayerMightTalkWhenThrowing;
}
actions
{
Skip(Random Value In Array(Array(0, 1, 1, 1, 1, 1)));
Communicate(Event Player, Incoming);
}
}
disabled rule("--- Shield")
{
event
{
Ongoing - Global;
}
}
rule("Initialise shield")
{
event
{
Ongoing - Global;
}
actions
{
Global.ShieldRadius = 1.250;
}
}
rule("Player is holding interact")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.HasShieldAvailable == True;
Event Player.IsHoldingBall == True;
Is Button Held(Event Player, Interact) == True;
}
actions
{
Event Player.IsUsingShield = True;
}
}
rule("Is not holding interact")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
(!Is Button Held(Event Player, Interact) || !Event Player.IsHoldingBall) == True;
}
actions
{
Event Player.IsUsingShield = False;
}
}
rule("Shield effects")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Create Effect(Filtered Array(Event Player.IsUsingShield == True, True), Sphere, Lime Green, Eye Position(Event Player) + Vector(0,
-0.500, 0), Global.ShieldRadius, Visible To Position and Radius);
}
}
rule("Shield is hit by ball 1")
{
event
{
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball1Position)
<= Global.BallRadius + Global.ShieldRadius;
Event Player.IsUsingShield == True;
Global.Ball1IsVisible == True;
Global.Ball1IsMoving == True;
}
actions
{
Call Subroutine(Ball1ChangeDirectionEffects);
Call Subroutine(ShieldExplodesEffects);
Global.Ball1DirectionTowards[0] = Min(Max(X Component Of(Direction Towards(Eye Position(Event Player) + Vector(0, -0.500, 0),
Global.Ball1Position)), -0.750), 0.750);
Global.Ball1DirectionTowards[1] = Min(Max(Y Component Of(Direction Towards(Eye Position(Event Player) + Vector(0, -0.500, 0),
Global.Ball1Position)), -0.750), 0.750);
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Direction Towards(Eye Position(Event Player) + Vector(0, -0.500, 0),
Global.Ball1Position)), -0.750), 0.750);
Wait(0.050, Ignore Condition);
Event Player.IsUsingShield = False;
Event Player.HasShieldAvailable = False;
}
}
rule("Shield is hit by ball 2")
{
event
{
Ongoing - Each Player;
Team 1;
All;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball2Position)
<= Global.BallRadius + Global.ShieldRadius;
Event Player.IsUsingShield == True;
Global.Ball2IsVisible == True;
Global.Ball2IsMoving == True;
}
actions
{
Call Subroutine(Ball2ChangeDirectionEffects);
Call Subroutine(ShieldExplodesEffects);
Global.Ball2DirectionTowards[0] = Min(Max(X Component Of(Direction Towards(Eye Position(Event Player) + Vector(0, -0.500, 0),
Global.Ball2Position)), -0.750), 0.750);
Global.Ball2DirectionTowards[1] = Min(Max(Y Component Of(Direction Towards(Eye Position(Event Player) + Vector(0, -0.500, 0),
Global.Ball2Position)), -0.750), 0.750);
Global.Ball2DirectionTowards[2] = Min(Max(Z Component Of(Direction Towards(Eye Position(Event Player) + Vector(0, -0.500, 0),
Global.Ball2Position)), -0.750), 0.750);
Wait(0.050, Ignore Condition);
Event Player.IsUsingShield = False;
Event Player.HasShieldAvailable = False;
}
}
rule("Recharge shield for player 1")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball1Position) < 0;
}
actions
{
Players In Slot(0, Team 1).HasShieldAvailable = True;
}
}
rule("Recharge shield for player 2")
{
event
{
Ongoing - Global;
}
conditions
{
Z Component Of(Global.Ball2Position) > 0;
}
actions
{
Players In Slot(0, Team 2).HasShieldAvailable = True;
}
}
rule("Subroutine - Shield explodes")
{
event
{
Subroutine;
ShieldExplodesEffects;
}
actions
{
Play Effect(All Players(All Teams), Ring Explosion, Lime Green, Event Player, Global.ShieldRadius * 1.500);
Play Effect(All Players(All Teams), Bad Explosion, Lime Green, Event Player, Global.ShieldRadius * 1.500);
Play Effect(All Players(All Teams), Bad Pickup Effect, Lime Green, Event Player, Global.ShieldRadius * 1.500);
}
}
disabled rule("--- Advanced mode")
{
event
{
Ongoing - Global;
}
}
rule("Advanced mode area")
{
event
{
Ongoing - Global;
}
actions
{
Global.AdvancedArea = Vector(16, 0, -16);
Create Effect(Filtered Array(!Global.GameHasStarted, True), Ring, Red, Global.AdvancedArea, 2, Visible To Position and Radius);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String(
"All players crouch here to toggle advanced mode"), Global.AdvancedArea + Vector(0, 0.500, 0), 1.100, Clip Against Surfaces,
Visible To Position and String, Red, Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String("Advanced mode disables Secondary fire"),
Global.AdvancedArea + Vector(0, 0.250, 0), 0.900, Clip Against Surfaces, Visible To Position and String, Red,
Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Icon String(Skull), Global.AdvancedArea + Up, 1.100,
Clip Against Surfaces, Visible To Position and String, Red, Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted && Global.AdvancedMode, True), Custom String("Currently Enabled"),
Global.AdvancedArea + Vector(0, 0, 0), 0.900, Clip Against Surfaces, Visible To Position and String, Green,
Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted && !Global.AdvancedMode, True), Custom String("Currently Disabled"),
Global.AdvancedArea + Vector(0, 0, 0), 0.900, Clip Against Surfaces, Visible To Position and String, White,
Default Visibility);
}
}
rule("All players are crouching in advanced mode area")
{
event
{
Ongoing - Global;
}
conditions
{
Global.GameHasStarted != True;
Is True For All(All Living Players(All Teams), Is Button Held(Current Array Element, Crouch)) == True;
Is True For All(All Players(All Teams), Distance Between(Position Of(Current Array Element), Global.AdvancedArea) < 2.500) == True;
Count Of(All Living Players(All Teams)) > 0;
}
actions
{
Wait(0.250, Abort When False);
Global.AdvancedMode = !Global.AdvancedMode;
Play Effect(All Players(All Teams), Ring Explosion, Red, Global.AdvancedArea, 5);
Play Effect(All Players(All Teams), Ring Explosion Sound, Red, Global.AdvancedArea, 100);
}
}
rule("Advanced mode is enabled")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.AdvancedMode == True;
}
actions
{
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Disallow Button(Event Player, Secondary Fire);
Disallow Button(Event Player, Ability 2);
}
}
rule("Advanced mode is disabled")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.AdvancedMode != True;
}
actions
{
Allow Button(Event Player, Secondary Fire);
If(Hero Of(Event Player) == Hero(Genji));
Set Ability 2 Enabled(Event Player, True);
Allow Button(Event Player, Ability 2);
End;
If(Hero Of(Event Player) == Hero(Lúcio));
Set Secondary Fire Enabled(Event Player, True);
End;
}
}
disabled rule("--- Tutorial")
{
event
{
Ongoing - Global;
}
}
rule("Tutorial area")
{
event
{
Ongoing - Global;
}
actions
{
Global.TutorialArea = Vector(8, 0, -4);
Create Effect(Filtered Array(!Global.GameHasStarted, True), Ring, Sky Blue, Global.TutorialArea, 2,
Visible To Position and Radius);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Custom String(
"All players crouch here to learn how to play (1 minute)"), Global.TutorialArea + Vector(0, 0.500, 0), 1.100,
Clip Against Surfaces, Visible To Position and String, Sky Blue, Default Visibility);
Create In-World Text(Filtered Array(!Global.GameHasStarted, True), Icon String(Question Mark), Global.TutorialArea + Up, 1.100,
Clip Against Surfaces, Visible To Position and String, Sky Blue, Default Visibility);
}
}
rule("All players are crouching in tutorial area")
{
event
{
Ongoing - Global;
}
conditions
{
Global.GameHasStarted != True;
Is True For All(All Living Players(All Teams), Is Button Held(Current Array Element, Crouch)) == True;
Is True For All(All Players(All Teams), Distance Between(Position Of(Current Array Element), Global.TutorialArea) < 2.500) == True;
Count Of(All Living Players(All Teams)) > 0;
}
actions
{
Wait(0.250, Abort When False);
Clear Status(All Players(All Teams), Phased Out);
Global.TutorialActive = True;
}
}
rule("Tutorial Ball 1 hit player 2")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 1;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball1Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball1IsMoving == True;
Global.Ball1IsVisible == True;
Event Player.IsUsingShield != True;
Global.TutorialActive == True;
}
actions
{
Global.Ball1Position = Vector(0, -5, 0);
Call Subroutine(BallHitAPlayer);
Global.Ball1IsVisible = False;
Global.Ball1IsMoving = False;
}
}
rule("Tutorial Ball 2 hit player 2")
{
event
{
Ongoing - Each Player;
Team 2;
Slot 1;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball2Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball2IsMoving == True;
Global.Ball2IsVisible == True;
Event Player.IsHoldingBall != True;
Event Player.IsUsingShield != True;
Global.TutorialActive == True;
}
actions
{
Global.Ball2Position = Vector(0, -5, 0);
Call Subroutine(BallHitAPlayer);
Global.Ball2IsVisible = False;
Global.Ball2IsMoving = False;
}
}
rule("Tutorial Ball 1 hit player 1")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 1;
}
conditions
{
Distance Between(Eye Position(Event Player) + Vector(0, -0.500, 0), Global.Ball1Position) <= Global.BallRadius * 2.500;
((Hero Of(Event Player) == Hero(Lúcio) && Is Firing Secondary(Event Player)) || (Hero Of(Event Player) == Hero(Genji)
&& Is Using Ability 2(Event Player) && Is In View Angle(Event Player, Global.Ball1Position, 60))) != True;
Global.Ball1IsMoving == True;
Global.Ball1IsVisible == True;
Event Player.IsHoldingBall != True;
Event Player.IsUsingShield != True;
Global.TutorialActive == True;
}
actions
{
Global.Ball1Position = Vector(0, -5, 0);
Call Subroutine(BallHitAPlayer);
Global.Ball1IsVisible = False;
Global.Ball1IsMoving = False;
}
}
rule("Tutorial Player 1 is using melee near ball 1")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 1;
}
conditions
{
Is Meleeing(Event Player) == True;
Distance Between(Position Of(Event Player), Global.Ball1Position) <= 2.500;
Is In View Angle(Event Player, Global.Ball1Position, 60) == True;
Global.Ball1IsVisible == True;
Event Player.IsHoldingBall != True;
}
actions
{
Call Subroutine(Ball1ChangeDirectionEffects);
Global.Ball1IsVisible = False;
Global.Ball1IsMoving = False;
Global.Ball1Position = Vector(0, -5, 0);
Stop Holding Button(Event Player, Melee);
Disallow Button(Event Player, Melee);
Wait(0.100, Ignore Condition);
Event Player.IsHoldingBall = True;
Event Player.HasShieldAvailable = True;
}
}
rule("Tutorial Player 1 Is holding ball and press melee")
{
event
{
Ongoing - Each Player;
Team 1;
Slot 1;
}
conditions
{
Event Player.IsHoldingBall == True;
Is Meleeing(Event Player) == True;
}
actions
{
Global.Ball1IsMoving = True;
Global.Ball1IsVisible = True;
Event Player.HasShieldAvailable = False;
Global.Ball1Position = Eye Position(Event Player) - Vector(0, Global.BallRadius / 2, 0) + Ray Cast Hit Normal(Eye Position(
Event Player), Facing Direction Of(Event Player) * 3, All Players(All Teams), Event Player, True);
Global.Ball1DirectionTowards[0] = Min(Max(X Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
Global.Ball1DirectionTowards[1] = Min(Max(Y Component Of(Facing Direction Of(Event Player)), -0.750), 0.750);
If(Z Component Of(Facing Direction Of(Event Player)) >= 0);
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), 0.250), 1);
Else;
Global.Ball1DirectionTowards[2] = Min(Max(Z Component Of(Facing Direction Of(Event Player)), -1), -0.250);
End;
Call Subroutine(Ball1ChangeDirectionEffects);
Call Subroutine(PlayerMightTalkWhenThrowing);
Wait(0.500, Ignore Condition);
Event Player.IsHoldingBall = False;
}
}
rule("Tutorial is active")
{
event
{
Ongoing - Global;
}
conditions
{
Global.TutorialActive == True;
}
actions
{
Set Status(All Players(All Teams), Null, Rooted, 9999);
Set Invisible(All Players(All Teams), All);
Global.Ball1IsVisible = False;
Global.Ball2IsVisible = False;
Global.Ball1Position = Vector(0, -5, 0);
Global.Ball2Position = Vector(0, -5, 0);
Start Camera(All Players(All Teams), Vector(0, 5, 0), Vector(-0.001, 0, 0), 0);
Wait(0.050, Ignore Condition);
"Camera above play area"
Start Camera(All Players(All Teams), Vector(0.001, 16, 0.001), Vector(-0.001, 0.002, 0.001), 2);
Wait(0.500, Ignore Condition);
Small Message(All Players(All Teams), Custom String("There's a good amount of rules, so sit tight."));
Wait(4, Ignore Condition);
Small Message(All Players(All Teams), Custom String("Each player has their own play area that they can not leave."));
Wait(1, Ignore Condition);
"Spawn bots for demonstation"
Create Dummy Bot(Hero(Genji), Team 1, 1, Global.Player1PlayArea + Forward, Vector(0, 0, 0));
Create Dummy Bot(Hero(Genji), Team 2, 1, Global.Player2PlayArea + Backward, Vector(0, 0, 0));
Wait(0.150, Ignore Condition);
Teleport(Players In Slot(1, Team 1), Global.Player1PlayArea + Forward);
Teleport(Players In Slot(1, Team 2), Global.Player2PlayArea + Backward);
Wait(0.350, Ignore Condition);
Set Facing(Players In Slot(1, Team 1), Global.Player2PlayArea + Vector(0, 0.100, 0), To World);
Set Facing(Players In Slot(1, Team 2), Global.Player1PlayArea + Vector(0, 0.100, 0), To World);
"Spawn balls"
Wait(3, Ignore Condition);
Small Message(All Players(All Teams), Custom String("Each player has their own ball."));
Start Camera(All Players(All Teams), Vector(3, 1, 10), Vector(0.001, 1, 12), 0.750);
Call Subroutine(Ball1Respawn);
Wait(5, Ignore Condition);
Small Message(All Players(All Teams), Custom String("You can propel your ball using [Secondary Fire]"));
Wait(2, Ignore Condition);
Press Button(Players In Slot(1, Team 1), Secondary Fire);
Wait(0.500, Ignore Condition);
Start Camera(All Players(All Teams), Vector(3, 1, 10), Global.Player2PlayArea + Up, 2);
Wait(2.500, Ignore Condition);
Small Message(All Players(All Teams), Custom String("When you hit your opponent you score a point."));
Wait(2, Ignore Condition);
Call Subroutine(Ball2Respawn);
Small Message(All Players(All Teams), Custom String("Your enemy also has a ball they can propel at you."));
Wait(3, Ignore Condition);
Press Button(Players In Slot(1, Team 2), Secondary Fire);
Start Camera(All Players(All Teams), Vector(3, 1, 10), Vector(0.001, 1, 12), 2);
Wait(2, Ignore Condition);
Press Button(Players In Slot(1, Team 1), Secondary Fire);
Small Message(All Players(All Teams), Custom String("Which can also be deflected back at them."));
Wait(0.500, Ignore Condition);
Start Camera(All Players(All Teams), Vector(3, 1, 10), Global.Player2PlayArea + Up, 2);
Wait(3, Ignore Condition);
Start Camera(All Players(All Teams), Vector(3, 1, 10), Vector(0.001, 1, 12), 2);
Call Subroutine(Ball1Respawn);
Small Message(All Players(All Teams), Custom String("Instead of deflecting your ball, you can catch it using [Primary fire]"));
Wait(3, Ignore Condition);
Press Button(Players In Slot(1, Team 1), Primary Fire);
Wait(2, Ignore Condition);
Small Message(All Players(All Teams), Custom String("You can throw the ball in any direction using [Primary fire] again"));
Wait(1, Ignore Condition);
Set Facing(Players In Slot(1, Team 1), Vector(2, 4, -20), To World);
Wait(0.250, Ignore Condition);
Press Button(Players In Slot(1, Team 1), Primary Fire);
Start Camera(All Players(All Teams), Vector(3, 1, 16), Global.Player2PlayArea + Up, 2);
Wait(2, Ignore Condition);
Small Message(All Players(All Teams), Custom String("The ball returns when it hits the opponents wall."));
Wait(1.500, Ignore Condition);
Small Message(All Players(All Teams), Custom String("A returning ball can not hit your opponent."));
Wait(2.500, Ignore Condition);
Small Message(All Players(All Teams), Custom String("But it can hit you!"));
Wait(2, Ignore Condition);
Set Facing(Players In Slot(1, Team 1), Vector(0, 0, -1), To World);
Start Throttle In Direction(Players In Slot(1, Team 2), Vector(1, 0, 0), 1, To World, Replace existing throttle,
Direction and Magnitude);
Wait(0.400, Ignore Condition);
Stop Throttle In Direction(Players In Slot(1, Team 2));
Call Subroutine(Ball1Respawn);
Press Button(Players In Slot(1, Team 1), Secondary Fire);
Wait(2, Ignore Condition);
Small Message(All Players(All Teams), Custom String(
"Hitting the target behind your opponent will increase the speed of your ball."));
Wait(3.900, Ignore Condition);
Press Button(Players In Slot(1, Team 1), Primary Fire);
Wait(2, Ignore Condition);
Small Message(All Players(All Teams), Custom String("While holding your ball you can use a shield by holding [Interact]"));
Wait(1, Ignore Condition);
Start Holding Button(Players In Slot(1, Team 1), Interact);
Call Subroutine(Ball2Respawn);
Start Throttle In Direction(Players In Slot(1, Team 2), Vector(-1, 0, 0), 1, To World, Replace existing throttle,
Direction and Magnitude);
Wait(0.400, Ignore Condition);
Stop Throttle In Direction(Players In Slot(1, Team 2));
Press Button(Players In Slot(1, Team 2), Secondary Fire);
Wait(2, Ignore Condition);
Small Message(All Players(All Teams), Custom String("Your shield is lost once it's hit."));
Wait(2, Ignore Condition);
Small Message(All Players(All Teams), Custom String("Catch the ball after it has passed the center to recharge your shield."));
Wait(3, Ignore Condition);
Start Camera(All Players(All Teams), Vector(0, 5, 0), Vector(-0.001, 0, 0), 0.500);
Wait(1, Ignore Condition);
Small Message(All Players(All Teams), Custom String("That's the basics. Good luck!"));
Wait(3, Ignore Condition);
Stop Camera(All Players(All Teams));
Set Invisible(All Players(All Teams), None);
Clear Status(All Players(All Teams), Rooted);
Destroy Dummy Bot(Team 1, 1);
Destroy Dummy Bot(Team 2, 1);
Call Subroutine(Ball1Respawn);
Call Subroutine(Ball2Respawn);
}
}