Return to post
settings
{
main
{
Description: "Use many different abilities to make your way across the map from checkpoint to checkpoint. Made by Mitsiee. More info on https://workshop.codes/echo-parkour. v1.0.11.2 - Numbani"
}
lobby
{
Allow Players Who Are In Queue: Yes
}
modes
{
Skirmish
{
enabled maps
{
Numbani
}
}
General
{
Game Mode Start: Manual
Hero Limit: Off
Kill Cam: Off
Kill Feed: Off
Respawn Time Scalar: 0%
Spawn Health Packs: Disabled
}
}
heroes
{
General
{
Echo
{
Damage Dealt: 10%
Damage Received: 10%
Flight Cooldown Time: 0%
Focusing Beam Cooldown Time: 15%
Glide: Off
No Ammunition Requirement: On
Quick Melee: Off
Sticky Bombs Cooldown Time: 0%
Ultimate Ability Duplicate: Off
}
enabled heroes
{
Echo
}
}
}
}
variables
{
global:
0: CheckpointPositions
1: CheckpointRadius
2: RingPositions
4: DeathDoorPositions
player:
0: JumpPadLocations
1: JumpPadLoop
2: JumpPadEffects
3: RemoveEffectsLoop
4: FindJumpPadLoop
5: GrapplePoint
6: GrappleEffect
7: IsGrappling
8: CurrentCheckpoint
10: Timer
11: FindRingLoop
12: CurrentCheckpointRingsArray
13: RingsArrayLoop
14: CutOffArray
15: InstructionsShown
16: InstructionsText1
17: InstructionsText2
18: InstructionsText3
19: InstructionsText4
20: InstructionsText5
21: InstructionsText6
22: FinalTime
23: BestTime
24: TimerChase
25: InstructionsText7
}
subroutines
{
0: SetCurrentRingsArray
1: ResetJumpPads
2: SetAvailableAbilities
}
disabled rule("Made by Mitsiee. More info on https://workshop.codes/echo-parkour")
{
event
{
Ongoing - Global;
}
}
disabled rule("Initialise")
{
event
{
Ongoing - Global;
}
}
rule("Initialise player")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Event Player.CurrentCheckpoint = -1;
Event Player.InstructionsShown = False;
Event Player.TimerChase = 100000;
Set Status(Event Player, Null, Phased Out, 9999);
Call Subroutine(SetCurrentRingsArray);
Call Subroutine(SetAvailableAbilities);
}
}
rule("Phase out player")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Alive(Event Player) == True;
}
actions
{
Set Status(Event Player, Null, Phased Out, 9999);
}
}
rule("Teleport player")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Alive(Event Player) == True;
Is In Spawn Room(Event Player) == True;
}
actions
{
Teleport(Event Player, Global.CheckpointPositions[Event Player.CurrentCheckpoint] + Vector(0, 0.250, 0));
Wait(0.250, Ignore Condition);
Set Facing(Event Player, Direction Towards(Eye Position(Event Player),
Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1]), To World);
}
}
disabled rule("HUD")
{
event
{
Ongoing - Global;
}
}
rule("Number of checkpoints reached")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Create HUD Text(Event Player, Null, Custom String("Map difficulty: Very Hard {0}", Icon String(Poison)), Null, Right, 1, White,
Red, White, Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String("Map difficulty: Very Hard {0}", Icon String(Poison)), Null, Right, 1, Color(
White), Color(Red), Color(White), Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String("Checkpoint {0} / {1} {2}", Event Player.CurrentCheckpoint, Count Of(
Global.CheckpointPositions) - 1, Icon String(Flag)), Null, Right, 2, White, Turquoise, White, Visible To and String,
Default Visibility);
Global.CheckpointPositions) - 1, Icon String(Flag)), Null, Right, 2, Color(White), Color(Turquoise), Color(White),
Visible To and String, Default Visibility);
}
}
rule("Timer")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Create HUD Text(Event Player, Null, Custom String("Timer: {0}", Event Player.Timer), Null, Top, 5, White, White, White,
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String("Timer: {0}", Event Player.Timer), Null, Top, 5, Color(White), Color(White),
Color(White), Visible To and String, Default Visibility);
}
}
rule("Start timer")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
(Is Using Ability 1(Event Player) || Is Using Ability 2(Event Player) || Is Button Held(Event Player, Jump)) == True;
(Is Using Ability 1(Event Player) || Is Using Ability 2(Event Player) || Is Button Held(Event Player, Button(Jump))) == True;
Event Player.Timer == 0;
Event Player.CurrentCheckpoint + 1 != Count Of(Global.CheckpointPositions);
}
actions
{
Event Player.TimerChase = 10000;
Chase Player Variable At Rate(Event Player, Timer, Event Player.TimerChase, 1, Destination and Rate);
}
}
rule("How to show controls")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, White, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, White, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, White, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, White, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, White, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, Color(White), Color(White), Color(White),
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, Color(White), Color(White), Color(White),
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, Color(White), Color(White), Color(White),
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, Color(White), Color(White), Color(White),
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String(" "), Null, Left, 0, Color(White), Color(White), Color(White),
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String("{0} Press [Interact] to toggle full instructions", Icon String(Question Mark)),
Null, Left, 0, White, Blue, White, Visible To and String, Default Visibility);
Null, Left, 0, Color(White), Color(Blue), Color(White), Visible To and String, Default Visibility);
}
}
rule("Pressing interact to show controls")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Button(Interact)) == True;
Event Player.InstructionsShown == False;
}
actions
{
Disallow Button(Event Player, Interact);
Disallow Button(Event Player, Button(Interact));
Create HUD Text(Event Player, Null, Custom String("Pressing [Ability 1] will give you 2 quick boosts forward."), Null, Left, 1,
White, White, White, Visible To and String, Default Visibility);
Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText1 = Last Text ID;
Create HUD Text(Event Player, Null, Custom String(
"Pressing [Ability 2] will attach a grappling hook to a surface (20 meters range)."), Null, Left, 2, White, White, White,
Visible To and String, Default Visibility);
"Pressing [Ability 2] will attach a grappling hook to a surface (20 meters range)."), Null, Left, 2, Color(White), Color(
White), Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText2 = Last Text ID;
Create HUD Text(Event Player, Null, Custom String(
"Pressing [Secondary fire] will spawn jump pads on the location of each sticky bomb."), Null, Left, 3, White, White, White,
Visible To and String, Default Visibility);
"Pressing [Secondary fire] will spawn jump pads on the location of each sticky bomb."), Null, Left, 3, Color(White), Color(
White), Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText3 = Last Text ID;
Create HUD Text(Event Player, Null, Custom String("The abilities you have available will vary per checkpoint."), Null, Left, 4,
White, White, White, Visible To and String, Default Visibility);
Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText4 = Last Text ID;
Create HUD Text(Event Player, Null, Custom String(
"Each checkpoint may have one or more yellow rings. Flying through these rings will recharge [Ability 1]."), Null, Left, 5,
White, Yellow, White, Visible To and String, Default Visibility);
Color(White), Color(Yellow), Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText5 = Last Text ID;
Create HUD Text(Event Player, Null, Custom String("Press [Reload] for a quick reset."), Null, Left, 6, White, Aqua, White,
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Null, Custom String("Press [Reload] for a quick reset."), Null, Left, 6, Color(White), Color(Aqua),
Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText6 = Last Text ID;
Create HUD Text(Event Player, Null, Custom String("Press [Crouch] + [Ultimate] + [Interact] for a full reset back to the start."),
Null, Left, 7, White, Orange, White, Visible To and String, Default Visibility);
Null, Left, 7, Color(White), Color(Orange), Color(White), Visible To and String, Default Visibility);
Event Player.InstructionsText7 = Last Text ID;
Wait(0.100, Ignore Condition);
Event Player.InstructionsShown = True;
Allow Button(Event Player, Interact);
Allow Button(Event Player, Button(Interact));
}
}
rule("Pressing interact to hide controls")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Button(Interact)) == True;
Event Player.InstructionsShown == True;
}
actions
{
Disallow Button(Event Player, Interact);
Disallow Button(Event Player, Button(Interact));
Destroy HUD Text(Event Player.InstructionsText1);
Destroy HUD Text(Event Player.InstructionsText2);
Destroy HUD Text(Event Player.InstructionsText3);
Destroy HUD Text(Event Player.InstructionsText4);
Destroy HUD Text(Event Player.InstructionsText5);
Destroy HUD Text(Event Player.InstructionsText6);
Destroy HUD Text(Event Player.InstructionsText7);
Wait(0.100, Ignore Condition);
Event Player.InstructionsShown = False;
Allow Button(Event Player, Interact);
Allow Button(Event Player, Button(Interact));
}
}
rule("In-world instructions")
{
event
{
Ongoing - Global;
}
actions
{
"----- Instructions on first checkpoint, explaining Flight"
Create In-World Text(Filtered Array(All Players(All Teams), Current Array Element.CurrentCheckpoint == 0), Custom String(
"{0} Press [Ability 1] to launch yourself", Icon String(Question Mark)), Global.CheckpointPositions[1] + Vector(0, -2, 0), 1,
Do Not Clip, Visible To Position and String, Blue, Default Visibility);
Do Not Clip, Visible To Position and String, Color(Blue), Default Visibility);
"----- Instructions on 2nd checkpoint, explaining grapple"
Create In-World Text(Filtered Array(All Players(All Teams), Current Array Element.CurrentCheckpoint == 1), Custom String(
"{0} Press [Ability 2] to grapple, Press again to let go early", Icon String(Question Mark)),
Global.CheckpointPositions[2] + Vector(0, -2, 0), 1, Do Not Clip, Visible To Position and String, Blue, Default Visibility);
Global.CheckpointPositions[2] + Vector(0, -2, 0), 1, Do Not Clip, Visible To Position and String, Color(Blue),
Default Visibility);
"----- Instructions on 3rd checkpoint, explaining Jump pads"
Create In-World Text(Filtered Array(All Players(All Teams), Current Array Element.CurrentCheckpoint == 2), Custom String(
"{0} Press [Secondary fire] to spawn jump pads on location of bombs", Icon String(Question Mark)),
Global.CheckpointPositions[3] + Vector(0, -2, 0), 1, Do Not Clip, Visible To Position and String, Blue, Default Visibility);
Global.CheckpointPositions[3] + Vector(0, -2, 0), 1, Do Not Clip, Visible To Position and String, Color(Blue),
Default Visibility);
"----- Instructions explaining Rings"
Create In-World Text(Filtered Array(All Players(All Teams), Current Array Element.CurrentCheckpoint == 4), Custom String(
"{0} Pick up to charge [Ability 1]", Icon String(Question Mark)), Global.RingPositions[2], 1, Clip Against Surfaces,
Visible To Position and String, Yellow, Default Visibility);
Visible To Position and String, Color(Yellow), Default Visibility);
"----- Sorry."
Create In-World Text(Filtered Array(All Players(All Teams), Current Array Element.CurrentCheckpoint == 12), Custom String("Sorry.",
Icon String(Question Mark)), Global.CheckpointPositions[13] + Vector(0, -2, 0), 1, Do Not Clip, Visible To Position and String,
Blue, Default Visibility);
Color(Blue), Default Visibility);
}
}
rule("Best and Final timer")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Create HUD Text(Filtered Array(Event Player, Current Array Element.FinalTime > 0), Null, Custom String("Final time: {0}",
Event Player.FinalTime), Null, Top, 1, White, Orange, White, Visible To and String, Default Visibility);
Event Player.FinalTime), Null, Top, 1, Color(White), Color(Orange), Color(White), Visible To and String, Default Visibility);
Create HUD Text(Filtered Array(Event Player, Current Array Element.BestTime > 0), Null, Custom String("Your best time: {0}",
Event Player.BestTime), Null, Top, 2, White, Turquoise, White, Visible To and String, Default Visibility);
Event Player.BestTime), Null, Top, 2, Color(White), Color(Turquoise), Color(White), Visible To and String, Default Visibility);
}
}
disabled rule("Checkpoints")
{
event
{
Ongoing - Global;
}
}
rule("Subroutine - Available abilities")
{
event
{
Subroutine;
SetAvailableAbilities;
}
actions
{
Wait(0.050, Ignore Condition);
If(Event Player.CurrentCheckpoint == 0);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 1);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 2);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, True);
Else If(Event Player.CurrentCheckpoint == 3);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 4);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 5);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, True);
Else If(Event Player.CurrentCheckpoint == 6);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 7);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, True);
Else If(Event Player.CurrentCheckpoint == 8);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 9);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 10);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 11);
Set Ability 1 Enabled(Event Player, False);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 12);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 13);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
Else If(Event Player.CurrentCheckpoint == 14);
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, True);
Else;
Set Ability 1 Enabled(Event Player, True);
Set Ability 2 Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, True);
End;
}
}
rule("Set checkpoints")
{
event
{
Ongoing - Global;
}
actions
{
Global.CheckpointPositions = Empty Array;
Global.CheckpointRadius = Empty Array;
"--- Start, Final control point"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(206.887, -0.488, 22.420));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 4);
"--- Balcony after tunnel"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(176.856, 5.952, 13.540));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 4);
"--- Outskirts near last checkpoint"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(205.467, -2.102, -6.722));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 5.500);
"--- Right before tunnel"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(160.660, -2.470, 1.738));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 3.500);
"--- Balcony road to second control point"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(117.672, 5.949, 2.940));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 4);
"--- Stairs flank of first control point"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(86.160, 5.951, -26.518));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.500);
"--- Upper area ramp to first controlpoint"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(76.456, 7.951, 10.913));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.500);
"--- Vending machine room before ramp to first controlpoint"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(70.870, -0.052, 18.161));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.500);
"--- On top of car right outside attacker spawn"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(6.132, 3.776, -4.017));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.500);
"--- Golden statue"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(112.715, 7.196, 22.596));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.750);
"--- Near first control point, clothes store entrace"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(107.934, -0.052, -2.791));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.500);
"--- Outskirts at final control point"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(210.343, 3.898, 50.315));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 2.500);
"--- Room to the left after tunnel"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(183.914, -0.052, -17.381));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 3);
"--- Pillar before tunnel"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(151.923, 6.036, -5.422));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 3);
"--- Side area near attacker spawn"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(12.828, 1.952, 41.911));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 3);
"--- Museum stairs"
Global.CheckpointPositions = Append To Array(Global.CheckpointPositions, Vector(218.853, 1.596, 22.557));
Global.CheckpointRadius = Append To Array(Global.CheckpointRadius, 3);
}
}
rule("Create checkpoint effects for player")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Wait(0.250, Ignore Condition);
Create Effect(Event Player, Ring, Blue, Global.CheckpointPositions[Event Player.CurrentCheckpoint] - Vector(0, 1, 0),
Create Effect(Event Player, Ring, Color(Blue), Global.CheckpointPositions[Event Player.CurrentCheckpoint] - Vector(0, 1, 0),
Global.CheckpointRadius[Event Player.CurrentCheckpoint] - 0.500, Visible To Position and Radius);
Create Effect(Event Player, Ring, Blue, Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1] - Vector(0, 1, 0),
Create Effect(Event Player, Ring, Color(Blue), Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1] - Vector(0, 1, 0),
Global.CheckpointRadius[Event Player.CurrentCheckpoint + 1] - 0.500, Visible To Position and Radius);
Create Icon(Event Player, Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1] - Vector(0, 1, 0), Flag,
Visible To and Position, Blue, True);
Visible To and Position, Color(Blue), True);
}
}
rule("Player has entered Checkpoint")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Alive(Event Player) == True;
Is On Ground(Event Player) == True;
Distance Between(Position Of(Event Player), Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1])
<= Global.CheckpointRadius[Event Player.CurrentCheckpoint + 1];
Event Player.CurrentCheckpoint + 1 < Count Of(Global.CheckpointPositions);
}
actions
{
Play Effect(Event Player, Buff Impact Sound, White, Event Player, 100);
Play Effect(All Players(All Teams), Good Explosion, Sky Blue, Event Player, 5);
Play Effect(Event Player, Buff Impact Sound, Color(White), Event Player, 100);
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player, 5);
Event Player.CurrentCheckpoint += 1;
Small Message(Event Player, Custom String("Checkpoint {0} / {1} reached", Event Player.CurrentCheckpoint, Count Of(
Global.CheckpointPositions) - 1));
Call Subroutine(ResetJumpPads);
Call Subroutine(SetCurrentRingsArray);
Call Subroutine(SetAvailableAbilities);
}
}
disabled rule("Rings")
{
event
{
Ongoing - Global;
}
}
rule("Ring positions")
{
event
{
Ongoing - Global;
}
actions
{
"------------------------"
Global.RingPositions = Append To Array(Global.RingPositions, 4);
Global.RingPositions = Append To Array(Global.RingPositions, Vector(98.593, 10.485, 25.148));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(88.628, 3.094, 14.747));
"------------------------"
Global.RingPositions = Append To Array(Global.RingPositions, 7);
Global.RingPositions = Append To Array(Global.RingPositions, Vector(45.940, 15.473, 13.020));
"------------------------"
Global.RingPositions = Append To Array(Global.RingPositions, 9);
Global.RingPositions = Append To Array(Global.RingPositions, Vector(123.929, 15.226, -10.396));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(116.143, -2.940, -32.034));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(86.659, 8.951, -27.748));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(90.847, 2.773, -7.266));
"------------------------"
Global.RingPositions = Append To Array(Global.RingPositions, 10);
Global.RingPositions = Append To Array(Global.RingPositions, Vector(146.703, 0.051, 28.920));
"------------------------"
Global.RingPositions = Append To Array(Global.RingPositions, 12);
Global.RingPositions = Append To Array(Global.RingPositions, Vector(172.688, 6.349, -5.274));
"------------------------"
Global.RingPositions = Append To Array(Global.RingPositions, 13);
Global.RingPositions = Append To Array(Global.RingPositions, Vector(146.001, -1.224, 26.139));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(136.207, 5.052, 45.934));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(118.161, 5.049, 25.483));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(88.441, 3.135, 14.591));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(76.183, 3.537, -17.834));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(52.315, 7.952, -25.938));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(41.995, 7.948, -14.458));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(27.725, 2.518, 21.608));
Global.RingPositions = Append To Array(Global.RingPositions, Vector(8.168, 8.514, 20.394));
}
}
rule("Subroutine - Set current rings array")
{
event
{
Subroutine;
SetCurrentRingsArray;
}
actions
{
Wait(0.100, Ignore Condition);
Event Player.CutOffArray = False;
"Get the rings starting from current checkpoint"
Event Player.CurrentCheckpointRingsArray = Array Slice(Global.RingPositions, Index Of Array Value(Global.RingPositions,
Event Player.CurrentCheckpoint), 10);
"Remove checkpoint number value"
Event Player.CurrentCheckpointRingsArray = Remove From Array(Event Player.CurrentCheckpointRingsArray,
Event Player.CurrentCheckpoint);
For Player Variable(Event Player, RingsArrayLoop, 0, Count Of(Event Player.CurrentCheckpointRingsArray), 1);
"Check if value is a vector, if it is, remove all further elements"
If(Y Component Of(Event Player.CurrentCheckpointRingsArray[Event Player.RingsArrayLoop]) == 0);
Event Player.CutOffArray = True;
End;
If(Event Player.CutOffArray);
Event Player.CurrentCheckpointRingsArray = Remove From Array(Event Player.CurrentCheckpointRingsArray,
Event Player.CurrentCheckpointRingsArray[Event Player.RingsArrayLoop]);
Event Player.RingsArrayLoop -= 1;
End;
End;
}
}
rule("Create ring effects")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Wait(0.250, Ignore Condition);
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Yellow,
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Color(Yellow),
Event Player.CurrentCheckpointRingsArray[0], 1.500, Visible To Position and Radius);
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Yellow,
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Color(Yellow),
Event Player.CurrentCheckpointRingsArray[1], 1.500, Visible To Position and Radius);
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Yellow,
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Color(Yellow),
Event Player.CurrentCheckpointRingsArray[2], 1.500, Visible To Position and Radius);
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Yellow,
Create Effect(Filtered Array(Event Player, Count Of(Event Player.CurrentCheckpointRingsArray) > 0), Good Aura, Color(Yellow),
Event Player.CurrentCheckpointRingsArray[3], 1.500, Visible To Position and Radius);
}
}
rule("Check if player is in Ring")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is In Air(Event Player) == True;
Is True For Any(Event Player.CurrentCheckpointRingsArray, Distance Between(Current Array Element, Event Player)
<= 2.500 && Y Component Of(Current Array Element) != 0) == True;
}
actions
{
For Player Variable(Event Player, FindRingLoop, 0, Count Of(Event Player.CurrentCheckpointRingsArray), 1);
If(Distance Between(Event Player, Event Player.CurrentCheckpointRingsArray[Event Player.FindRingLoop]) <= 2.500);
Event Player.CurrentCheckpointRingsArray = Remove From Array(Event Player.CurrentCheckpointRingsArray,
Event Player.CurrentCheckpointRingsArray[Event Player.FindRingLoop]);
Event Player.FindRingLoop = 10;
End;
End;
Small Message(Event Player, Custom String("You picked up a ring!"));
Set Ability 1 Enabled(Event Player, True);
Play Effect(Event Player, Ring Explosion Sound, White, Event Player, 90);
Play Effect(Event Player, Ring Explosion Sound, Color(White), Event Player, 90);
}
}
disabled rule("Death zone")
{
event
{
Ongoing - Global;
}
}
rule("Player is on the ground and not in a checkpoint")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is In Spawn Room(Event Player) != True;
Is Alive(Event Player) == True;
Is On Ground(Event Player) == True;
(Distance Between(Position Of(Event Player), Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1])
<= Global.CheckpointRadius[Event Player.CurrentCheckpoint + 1] || Distance Between(Position Of(Event Player),
Global.CheckpointPositions[Event Player.CurrentCheckpoint]) <= Global.CheckpointRadius[Event Player.CurrentCheckpoint])
!= True;
}
actions
{
Kill(Event Player, Null);
}
}
disabled rule("Sticky bomb")
{
event
{
Ongoing - Global;
}
}
rule("Create Sticky Bomb jump pads")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Firing Secondary(Event Player) == True;
}
actions
{
Event Player.JumpPadLocations = Empty Array;
For Player Variable(Event Player, JumpPadLoop, 0, 6, 1);
Wait(0.065, Ignore Condition);
Event Player.JumpPadLocations[Event Player.JumpPadLoop] = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(
Event Player) + Facing Direction Of(Event Player) * 200, Null, All Players(All Teams), False);
End;
Set Secondary Fire Enabled(Event Player, False);
}
}
rule("Remove previous effects")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Firing Secondary(Event Player) == True;
}
actions
{
For Player Variable(Event Player, RemoveEffectsLoop, 0, Count Of(Event Player.JumpPadEffects), 1);
Destroy Effect(Event Player.JumpPadEffects[Event Player.RemoveEffectsLoop]);
End;
}
}
rule("[0] Sticky bomb pad delay")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.JumpPadLocations[0] != 0;
}
actions
{
Wait(Distance Between(Position Of(Event Player), Event Player.JumpPadLocations[0]) / 50, Ignore Condition);
Create Effect(Event Player, Sphere, Green, Event Player.JumpPadLocations[0], 1, None);
Create Effect(Event Player, Sphere, Color(Green), Event Player.JumpPadLocations[0], 1, None);
Event Player.JumpPadEffects[0] = Last Created Entity;
}
}
rule("[1] Sticky bomb pad delay")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.JumpPadLocations[1] != 0;
}
actions
{
Wait(Distance Between(Position Of(Event Player), Event Player.JumpPadLocations[1]) / 50, Ignore Condition);
Create Effect(Event Player, Sphere, Green, Event Player.JumpPadLocations[1], 1, None);
Create Effect(Event Player, Sphere, Color(Green), Event Player.JumpPadLocations[1], 1, None);
Event Player.JumpPadEffects[1] = Last Created Entity;
}
}
rule("[2] Sticky bomb pad delay")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.JumpPadLocations[2] != 0;
}
actions
{
Wait(Distance Between(Position Of(Event Player), Event Player.JumpPadLocations[2]) / 50, Ignore Condition);
Create Effect(Event Player, Sphere, Green, Event Player.JumpPadLocations[2], 1, None);
Create Effect(Event Player, Sphere, Color(Green), Event Player.JumpPadLocations[2], 1, None);
Event Player.JumpPadEffects[2] = Last Created Entity;
}
}
rule("[3] Sticky bomb pad delay")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.JumpPadLocations[3] != 0;
}
actions
{
Wait(Distance Between(Position Of(Event Player), Event Player.JumpPadLocations[3]) / 50, Ignore Condition);
Create Effect(Event Player, Sphere, Green, Event Player.JumpPadLocations[3], 1, None);
Create Effect(Event Player, Sphere, Color(Green), Event Player.JumpPadLocations[3], 1, None);
Event Player.JumpPadEffects[3] = Last Created Entity;
}
}
rule("[4] Sticky bomb pad delay")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.JumpPadLocations[4] != 0;
}
actions
{
Wait(Distance Between(Position Of(Event Player), Event Player.JumpPadLocations[4]) / 50, Ignore Condition);
Create Effect(Event Player, Sphere, Green, Event Player.JumpPadLocations[4], 1, None);
Create Effect(Event Player, Sphere, Color(Green), Event Player.JumpPadLocations[4], 1, None);
Event Player.JumpPadEffects[4] = Last Created Entity;
}
}
rule("[5] Sticky bomb pad delay")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.JumpPadLocations[5] != 0;
}
actions
{
Wait(Distance Between(Position Of(Event Player), Event Player.JumpPadLocations[5]) / 50, Ignore Condition);
Create Effect(Event Player, Sphere, Green, Event Player.JumpPadLocations[5], 1, None);
Create Effect(Event Player, Sphere, Color(Green), Event Player.JumpPadLocations[5], 1, None);
Event Player.JumpPadEffects[5] = Last Created Entity;
}
}
rule("Check if player is on jump pad")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is True For Any(Event Player.JumpPadLocations, Distance Between(Current Array Element, Event Player) <= 3) == True;
}
actions
{
For Player Variable(Event Player, FindJumpPadLoop, 0, Count Of(Event Player.JumpPadLocations), 1);
If(Distance Between(Event Player, Event Player.JumpPadLocations[Event Player.FindJumpPadLoop]) <= 3);
Event Player.JumpPadLocations[Event Player.FindJumpPadLoop] = Vector(0, 0, 0);
Destroy Effect(Event Player.JumpPadEffects[Event Player.FindJumpPadLoop]);
Event Player.FindJumpPadLoop = 6;
End;
End;
Apply Impulse(Event Player, Up, 15, To World, Cancel Contrary Motion);
Play Effect(Event Player, Explosion Sound, White, Event Player, 50);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 50);
}
}
rule("Subroutine - Reset jump pads")
{
event
{
Subroutine;
ResetJumpPads;
}
actions
{
For Player Variable(Event Player, RemoveEffectsLoop, 0, Count Of(Event Player.JumpPadEffects), 1);
Destroy Effect(Event Player.JumpPadEffects[Event Player.RemoveEffectsLoop]);
End;
Event Player.JumpPadLocations = Empty Array;
Event Player.JumpPadEffects = Empty Array;
}
}
disabled rule("Flight")
{
event
{
Ongoing - Global;
}
}
rule("Disable flight after using it")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Using Ability 1(Event Player) == True;
}
actions
{
Disallow Button(Event Player, Ability 1);
Disallow Button(Event Player, Button(Ability 1));
Wait(0.230, Ignore Condition);
Allow Button(Event Player, Ability 1);
Allow Button(Event Player, Button(Ability 1));
Wait(0.020, Ignore Condition);
Press Button(Event Player, Ability 1);
Press Button(Event Player, Button(Ability 1));
Wait(0.020, Ignore Condition);
Set Ability 1 Enabled(Event Player, False);
}
}
rule("Cheat control")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Using Ability 1(Event Player) == True;
}
actions
{
Wait(0.650, Abort When False);
Small Message(Event Player, Custom String("It looks like you encountered a bug by spamming [Ability 1]. Sorry."));
Kill(Event Player, Null);
}
}
disabled rule("Beam - Grapple Hook")
{
event
{
Ongoing - Global;
}
}
rule("Get position of grapple")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Using Ability 2(Event Player) == True;
}
actions
{
Event Player.GrapplePoint = Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(
Event Player) * 200, Null, All Players(All Teams), False);
If(Distance Between(Position Of(Event Player), Event Player.GrapplePoint) <= 20);
Event Player.IsGrappling = True;
Create Beam Effect(All Players(All Teams), Good Beam, Event Player, Event Player.GrapplePoint, Sky Blue,
Create Beam Effect(All Players(All Teams), Good Beam, Event Player, Event Player.GrapplePoint, Color(Sky Blue),
Visible To Position and Radius);
Event Player.GrappleEffect = Last Created Entity;
End;
}
}
rule("Is using Grapple")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.IsGrappling == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Apply Impulse(Event Player, Vector Towards(Position Of(Event Player), Event Player.GrapplePoint), Max(Min(Distance Between(
Position Of(Event Player), Event Player.GrapplePoint) / 7.500, 2), 1.500), To World, Incorporate Contrary Motion);
Wait(0.035, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Is no longer using Grapple")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Using Ability 2(Event Player) != True;
}
actions
{
Event Player.IsGrappling = False;
Destroy Effect(Event Player.GrappleEffect);
}
}
disabled rule("Death door")
{
event
{
Ongoing - Global;
}
}
rule("Death door position")
{
event
{
Ongoing - Global;
}
actions
{
Global.DeathDoorPositions = Empty Array;
Global.DeathDoorPositions = Append To Array(Global.DeathDoorPositions, Vector(117.530, -2.052, -5.727));
Create Beam Effect(All Players(All Teams), Good Beam, Global.DeathDoorPositions[0] + Vector(0, 2, 0),
Global.DeathDoorPositions[0] + Vector(0, -2, 0), Red, Visible To Position and Radius);
Global.DeathDoorPositions[0] + Vector(0, -2, 0), Color(Red), Visible To Position and Radius);
Global.DeathDoorPositions = Append To Array(Global.DeathDoorPositions, Vector(101.954, -0.052, 15.638));
Create Beam Effect(All Players(All Teams), Good Beam, Global.DeathDoorPositions[1] + Vector(0, 2, 0),
Global.DeathDoorPositions[1] + Vector(0, -2, 0), Red, Visible To Position and Radius);
Global.DeathDoorPositions[1] + Vector(0, -2, 0), Color(Red), Visible To Position and Radius);
}
}
rule("Kill when in death door")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is True For Any(Global.DeathDoorPositions, Distance Between(Current Array Element, Event Player) <= 2) == True;
}
actions
{
Kill(Event Player, Null);
}
}
disabled rule("Misc stuff")
{
event
{
Ongoing - Global;
}
}
rule("Reset yourself")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Reload) == True;
Is Button Held(Event Player, Button(Reload)) == True;
}
actions
{
Kill(Event Player, Null);
}
}
rule("Reset on death")
{
event
{
Player Died;
All;
All;
}
actions
{
Wait(0.032, Ignore Condition);
Set Status(Event Player, Null, Hacked, 0.500);
Teleport(Event Player, Global.CheckpointPositions[Event Player.CurrentCheckpoint] + Vector(0, 0.250, 0));
Wait(0.032, Ignore Condition);
Call Subroutine(SetCurrentRingsArray);
If(Count Of(Event Player.CurrentCheckpointRingsArray) > 0);
Set Facing(Event Player, Direction Towards(Eye Position(Event Player), Event Player.CurrentCheckpointRingsArray[0]), To World);
Else;
Set Facing(Event Player, Direction Towards(Eye Position(Event Player),
Global.CheckpointPositions[Event Player.CurrentCheckpoint + 1]), To World);
End;
Wait(0.250, Ignore Condition);
Resurrect(Event Player);
Wait(0.016, Ignore Condition);
Apply Impulse(Event Player, Down, 1, To Player, Cancel Contrary Motion);
Call Subroutine(ResetJumpPads);
Call Subroutine(SetAvailableAbilities);
}
}
rule("Full reset")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Ultimate) == True;
Is Button Held(Event Player, Crouch) == True;
Is Button Held(Event Player, Button(Interact)) == True;
Is Button Held(Event Player, Button(Ultimate)) == True;
Is Button Held(Event Player, Button(Crouch)) == True;
}
actions
{
Event Player.CurrentCheckpoint = 0;
Event Player.Timer = 0;
Event Player.TimerChase = 0;
Kill(Event Player, Null);
}
}
rule("Last Checkpoint reached")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.CurrentCheckpoint + 1 == Count Of(Global.CheckpointPositions);
}
actions
{
Event Player.FinalTime = Event Player.Timer;
Event Player.TimerChase = Event Player.FinalTime;
If(Event Player.BestTime > 0);
Event Player.BestTime = Min(Event Player.FinalTime, Event Player.BestTime);
Else;
Event Player.BestTime = Event Player.FinalTime;
End;
Big Message(All Players(All Teams), Custom String("{0} Completed the course in {1}!", Event Player, Event Player.FinalTime));
Play Effect(All Players(All Teams), Good Explosion, Sky Blue, Event Player, 15);
Play Effect(All Players(All Teams), Good Explosion, Blue, Event Player, 10);
Play Effect(All Players(All Teams), Buff Explosion Sound, White, Event Player, 100);
Play Effect(All Players(All Teams), Good Explosion, Color(Sky Blue), Event Player, 15);
Play Effect(All Players(All Teams), Good Explosion, Color(Blue), Event Player, 10);
Play Effect(All Players(All Teams), Buff Explosion Sound, Color(White), Event Player, 100);
}
}
rule("Infinite match timer")
{
event
{
Ongoing - Global;
}
conditions
{
Match Time < 1800;
}
actions
{
Set Match Time(3599);
}
}
rule("Disable inspector")
{
event
{
Ongoing - Global;
}
actions
{
Disable Inspector Recording;
}
}