Return to post
settings
{
main
{
Description: "Disc Golf in Overwatch! Place a tee and a hole, spawn in your disc, pick it up, and throw it! Use angles to make it curve like a real disc! (Early alpha version by nobody#1774. Latest version at: https://workshop.codes/disc-golf)"
Description: "Disc Golf in Overwatch! Place a tee and a hole, spawn in your disc, pick it up, and throw it! Use angles to make it curve like a real disc! (By nobody#1774. Latest version at: https://workshop.codes/disc-golf)"
}
lobby
{
Allow Players Who Are In Queue: Yes
Max FFA Players: 6
Map Rotation: After A Game
Max Spectators: 12
Max Team 2 Players: 0
Return To Lobby: Never
}
modes
{
Deathmatch
disabled Deathmatch
{
Game Length In Minutes: 15
Score To Win: 50
enabled maps
{
Blizzard World
}
}
Skirmish
{
enabled maps
{
Blizzard World
Blizzard World Winter
Eichenwalde
Eichenwalde Halloween
Hanamura
Hanamura Winter
Route 66
}
}
disabled Team Deathmatch
{
Game Length In Minutes: 15
}
General
{
Game Mode Start: Manual
Limit Roles: 2 Of Each Role Per Team
Hero Limit: Off
Respawn Time Scalar: 0%
}
}
heroes
{
Team 1
{
Health: 500%
Quick Melee: Off
enabled heroes
{
Lúcio
}
}
Team 2
General
{
Damage Dealt: 10%
Damage Received: 10%
Health: 500%
Primary Fire: Off
Quick Melee: Off
enabled heroes
{
Lúcio
}
}
Team FFA
{
Ultimate Generation: 10%
Ultimate Generation - Combat: 0%
Ultimate Generation - Passive: 0%
Ana
{
Sleep Dart: Off
}
Genji
{
Secondary Fire: Off
}
Symmetra
{
Sentry Turret: Off
}
Torbjörn
{
Deploy Turret: Off
}
Zarya
{
Secondary Fire: Off
}
}
General
{
Damage Dealt: 10%
Damage Received: 10%
Primary Fire: Off
Wrecking Ball
{
Movement Gravity: 50%
}
disabled heroes
{
Wrecking Ball
Torbjörn
}
}
}
}
variables
{
global:
0: BOOL_Disc_Spawned
1: INT_Disc_Outer_Orb_Width
2: PLAYERS_All
6: HUD_Instructions
7: VECTORS_Tee_Positions
8: VECTORS_Hole_Positions
10: EFFECTS_Tees_Holes
24: VECTORS_Temp
11: TEXT_Tees_Holes
12: EFFECTS_Tees
13: EFFECTS_Holes
14: TEXTS_Tees
15: TEXTS_Holes
16: REAL_Disc_Speak_Probability
23: INT_Temp
24: ARRAY_Temp
25: INT_Loop_Index
player:
0: INT_Curve_Angle
1: INT_Last_Facing_Angle
2: INT_Turn_Rate
1: VECTOR_Last_Facing
2: REAL_Turn_Rate_Degrees
3: BOOL_Disc_Thrown
4: ENTITY_Disc
5: EFFECTS_Disc
6: EFFECTS_Tees_Holes
7: BOOL_Holding_Disc
8: VECTOR_Disc_Curve_Impulse
9: INT_Disc_Curve_Speed
10: HUD_Holding_Disc
10: INTS_Scores_by_Hole
11: BOOL_Throwing_Disc
12: HUD_Last_Throw
12: TEXTS_Tees_Holes
13: INT_Color
14: VECTOR_Last_Throw_From
15: INT_Last_Throw_Distance
16: PLAYER_Disc_Owner
17: INT_Current_Hole
18: EFFECTS_Current_Hole
18: INT_Course_Score
19: BOOL_Playing_Hole
20: EFFECT_Goal_Name
21: EFFECT_Tee_Name
20: TEXT_Goal_Name
21: TEXT_Tee_Name
22: EFFECT_Tee
23: POINT_Tee
24: EFFECT_Goal
25: POINT_Goal
26: STRING_Playing_Hole
27: INT_Current_Strokes
28: STRINGS_Disc_Status
29: TEXT_Disc
30: BOOL_Disc_Visible
31: EFFECT_Holding_Disc
32: EFFECT_Disc_Inner_Orb
33: EFFECT_Disc_Outer_Orb
34: VECTOR_Current_POI
}
subroutines
{
0: Disc_Destroy
1: Disc_Spawn
4: PLAYER_Clear_All_Things
5: Player_Disc_Create_Effects
6: Player_Disc_Clear_Effects
7: PLAYER_Create_Hole_Effects
8: PLAYER_Clear_Hole_Effects
9: PLAYER_Clear_Self_Effects
5: PLAYER_Disc_Create_Effects
6: PLAYER_Disc_Clear_Effects
10: Create_Course_Effects
11: Clear_Course_Effects
12: WATCHDOG_Course_Effects
}
rule("MAP: BIizzard World")
rule("INIT")
{
event
{
Ongoing - Global;
}
conditions
{
Current Map == Map(Blizzard World);
Global.EFFECTS_Tees_Holes == 0;
}
actions
{
Global.VECTORS_Tee_Positions = Array(False, Vector(-70.980, 6.870, 111.910), Vector(-64.480, 0.690, 120.500), Vector(-42.520,
4.810, 90.680), Vector(-53.360, -0.160, 65.150), Vector(-62.705, 6.600, 80.572), Vector(-23.960, 6.090, 94.640));
Global.VECTORS_Hole_Positions = Array(False, Vector(-78.100, 0.600, 128.400), Vector(-55.220, 4.530, 98.820), Vector(-41.650,
-0.200, 62.210), Vector(-77.350, 4.880, 66.080), Vector(-31.650, 5.820, 100.370), Vector(-78.250, 6.570, 99.430));
Global.REAL_Disc_Speak_Probability = 0.300;
Global.EFFECTS_Tees_Holes = Empty Array;
Global.TEXT_Tees_Holes = Empty Array;
Wait(2, Ignore Condition);
Call Subroutine(Create_Course_Effects);
}
}
rule("INIT: Tee/Hole Effects (only seems to work with this event rather than \"Ongoing - Global\")")
rule("HUD: Instructions")
{
event
{
Player Joined Match;
All;
All;
Ongoing - Global;
}
conditions
{
disabled Global.EFFECTS_Tees_Holes == 0;
Global.HUD_Instructions == 0;
}
actions
{
"Delete and recreate all effects (not sure why, but seems to be necessary for new players to see them)."
For Global Variable(INT_Loop_Index, 0, Count Of(Global.EFFECTS_Tees_Holes), 1);
Destroy Effect(Global.EFFECTS_Tees_Holes[Global.INT_Loop_Index]);
Destroy In-World Text(Global.EFFECTS_Tees_Holes[Global.INT_Loop_Index]);
End;
Global.EFFECTS_Tees_Holes = 0;
"Create tee and hole effects and text."
For Global Variable(INT_Loop_Index, 1, Count Of(Global.VECTORS_Tee_Positions), 1);
Create Effect(All Players(All Teams), Sphere, Green, Global.VECTORS_Tee_Positions[Global.INT_Loop_Index], 0.250, None);
Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Created Entity);
Create Effect(All Players(All Teams), Sphere, Red, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 2, None);
Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Created Entity);
"Labels"
Create In-World Text(All Players(All Teams), Global.INT_Loop_Index, Global.VECTORS_Tee_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, None, Green, Default Visibility);
Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Text ID);
Create In-World Text(All Players(All Teams), Global.INT_Loop_Index, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, None, White, Default Visibility);
Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Text ID);
"Do it again and then delete it to workaround insane bug?! Seems to work but no idea why it's necessary or why it works around it."
Create In-World Text(All Players(All Teams), Global.INT_Loop_Index, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, None, White, Default Visibility);
Destroy In-World Text(Last Text ID);
disabled Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Text ID);
disabled Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Text ID);
End;
Create HUD Text(Global.PLAYERS_All, Custom String("Set Color"), Custom String(""), Custom String("{0} + {1}", Input Binding String(
Button(Interact)), Input Binding String(Button(Reload))), Right, 0, White, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Place goal"), Custom String(""), Custom String("{0} + {1}",
Input Binding String(Button(Interact)), Input Binding String(Button(Crouch))), Right, 0, Red, White, White,
Visible To and String, Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Place tee"), Custom String(""), Custom String("{0} + {1}", Input Binding String(
Button(Interact)), Input Binding String(Button(Jump))), Right, 0, Green, White, White, Visible To and String,
Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Set Angle"), Custom String("Ultimate charge 0-24=left, 26-50=right"),
Custom String("Left: {1} + {0} Right: {0}", Input Binding String(Button(Ultimate)), Input Binding String(Button(Interact))),
Right, 0, Orange, Orange, White, Visible To and String, Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Throw disc"), Custom String(" while turning (slowly!)"), Custom String(
"Hold and release {0}", Input Binding String(Button(Primary Fire))), Right, 0, White, Turquoise, White, Visible To and String,
Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Pick up disc"), Custom String("While next to disc"), Custom String(
"Crouch "), Right, 0, White, Turquoise, White, Visible To and String,
Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Spawn disc"), Custom String("Can only interact with own disc "),
Custom String("{0} + {1}", Input Binding String(Button(Interact)), Input Binding String(Button(Primary Fire))), Right, 0,
White, Turquoise, White, Visible To and String, Default Visibility);
Create HUD Text(Global.PLAYERS_All, Custom String("Share code"), Custom String("https://workshop.codes/disc-golf"), Custom String(
"V337X"), Left, 0, White, Turquoise, White, Visible To and String, Default Visibility);
}
}
rule("PLAYER: Joins")
rule("PLAYER: Joins (create tee/hole effects, etc.)")
{
event
{
Player Joined Match;
All;
Team 1;
All;
}
conditions
{
Hero Of(Event Player) != Hero(Wrecking Ball);
}
actions
{
"Update variable used to make effects visible to all players."
Global.PLAYERS_All = All Players(All Teams);
Global.INT_Disc_Outer_Orb_Width = 0.500;
Event Player.EFFECTS_Tees_Holes = Empty Array;
Event Player.TEXTS_Tees_Holes = Empty Array;
Event Player.EFFECTS_Disc = Empty Array;
Event Player.INT_Color = Random Integer(0, 12);
Event Player.INT_Current_Hole = 1;
Event Player.BOOL_Playing_Hole = False;
Event Player.STRING_Playing_Hole = Custom String("None");
Create HUD Text(Event Player, Custom String("Playing"), Custom String("Strokes: {0}", Event Player.INT_Current_Strokes),
Custom String("Hole: {0}", Event Player.STRING_Playing_Hole), Left, 9, Green, White, White, String, Default Visibility);
Create HUD Text(Event Player, Custom String("COURSE"), Custom String("Holes Played: {0} / {1}", Count Of(Filtered Array(
Event Player.INTS_Scores_by_Hole, 0 != Current Array Element)), Count Of(Global.VECTORS_Tee_Positions) - 1), Custom String(
"Total Score: {0}", Event Player.INT_Course_Score), Left, 10, Green, White, White, String, Default Visibility);
Create HUD Text(Event Player, Event Player.STRINGS_Disc_Status[0], Event Player.STRINGS_Disc_Status[1],
Event Player.STRINGS_Disc_Status[2], Top, 0, White, Turquoise, White, String, Default Visibility);
Event Player.STRINGS_Disc_Status = Array(Custom String("No disc"), Custom String("Now you can"), Custom String("Spawn a disc"));
Create HUD Text(Event Player, Custom String("Last throw"), Custom String("Distance: {0}m", Event Player.INT_Last_Throw_Distance),
Custom String("Strength: {0}%", Absolute Value(Event Player.REAL_Turn_Rate_Degrees / 50 * 100)), Left, 9, Green, White, White,
String, Default Visibility);
Event Player.ENTITY_Disc = False;
"Create reset HUD for host."
disabled If(Event Player == Host Player);
disabled Create HUD Text(Event Player, Custom String("RESET"), Custom String("If anything malfunctions"), Custom String(
"Interact + Ultimate"), Right, 99, Purple, Turquoise, White, None, Visible Never);
disabled End;
"Create dummy bot for player."
Create Dummy Bot(Hero(Torbjörn), Team 2, Slot Of(Event Player), Vector(0, 0, 0), Vector(0, 0, 0));
Event Player.ENTITY_Disc = Last Created Entity;
"Save player to bot variable."
Event Player.ENTITY_Disc.PLAYER_Disc_Owner = Event Player;
"Make bot invisible and phased out."
Set Invisible(Event Player.ENTITY_Disc, All);
Set Status(Event Player.ENTITY_Disc, Null, Phased Out, 9999);
"Move dummy bot to player's position."
Teleport(Event Player.ENTITY_Disc, Position Of(Event Player));
Create Icon(Event Player, Event Player.VECTOR_Current_POI, Flag, Visible To and Position, Lime Green, True);
Event Player.VECTOR_Current_POI = Global.VECTORS_Tee_Positions[1];
}
}
rule("PLAYER: Spawns")
{
event
{
Ongoing - Each Player;
All;
Team 1;
All;
}
conditions
{
Has Spawned(Event Player) == True;
Hero Of(Event Player) != Hero(Wrecking Ball);
disabled Hero Of(Event Player) != Hero(Torbjörn);
disabled Team Of(Event Player) == Team 1;
}
actions
{
Event Player.INT_Curve_Angle = 12.500;
Set Ultimate Charge(Event Player, 12.500);
Event Player.INT_Curve_Angle = 37.500;
Set Ultimate Charge(Event Player, 37.500);
Set Status(Event Player, Null, Phased Out, 9999);
"Move player to current tee."
Teleport(Event Player, Global.VECTORS_Tee_Positions[Event Player.INT_Current_Hole]);
"No disc: spawn it."
If(Event Player.ENTITY_Disc == 0);
"Create effects."
Call Subroutine(Disc_Spawn);
End;
"Move player to tee 0 (initial spawn point)."
Teleport(Event Player, Global.VECTORS_Tee_Positions[0]);
}
}
rule("HUD: Instructions")
rule("DISC: Owner leaves")
{
event
{
Ongoing - Global;
Ongoing - Each Player;
Team 2;
All;
}
conditions
{
Global.HUD_Instructions == 0;
Entity Exists(Event Player.PLAYER_Disc_Owner) == False;
}
actions
{
Create HUD Text(All Players(All Teams), Custom String("Set Color"), Custom String(""), Custom String("Interact + Reload "), Right,
0, White, White, White, Visible To and String, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Place goal"), Custom String(""), Custom String("Interact + Crouch"), Right,
0, Red, White, White, Visible To and String, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Place tee"), Custom String(""), Custom String("Interact + Jump "),
Right, 0, Green, White, White, Visible To and String, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Set Angle"), Custom String("Ultimate charge 0-24=left, 26-50=right"),
Custom String("Reload"), Right, 0, Orange, Orange, White, Visible To and String, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Throw disc"), Custom String(" while turning (slowly!)"), Custom String(
"Hold and release Primary Fire"), Right, 0, White, Turquoise, White, Visible To and String, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Pick up disc"), Custom String("While next to disc"), Custom String(
"Crouch "), Right, 0, White, Turquoise, White, Visible To and String,
Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Spawn disc"), Custom String("Can only interact with own disc"),
Custom String("Interact + Primary Fire "), Right, 0, White, Turquoise, White, Visible To and String,
Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Share code"), Custom String("https://workshop.codes/disc-golf"),
Custom String("V337X"), Left, 0, White, White, White, Visible To and String, Default Visibility);
Destroy Dummy Bot(Team 2, Slot Of(Event Player));
}
}
rule("PLAYER: Spawn disc / Begin hole")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Primary Fire) == True;
}
actions
{
"Respawn disc if necessary (e.g. after game mode start; weird workshop bugs)"
If(!Entity Exists(Event Player.ENTITY_Disc));
Call Subroutine(Disc_Destroy);
Call Subroutine(Disc_Spawn);
End;
disabled If(!Entity Exists(Event Player.ENTITY_Disc));
disabled Call Subroutine(Disc_Destroy);
disabled Call Subroutine(Disc_Spawn);
disabled End;
"Move dummy bot to player's position."
Teleport(Event Player.ENTITY_Disc, Position Of(Event Player));
Call Subroutine(Player_Disc_Create_Effects);
If(!Entity Exists(Event Player.ENTITY_Disc.EFFECT_Disc_Inner_Orb));
Call Subroutine(PLAYER_Disc_Create_Effects);
End;
"Find any tee the player is next to."
Global.VECTORS_Temp = Filtered Array(Global.VECTORS_Tee_Positions, Current Array Element != 0 && Distance Between(Position Of(
Global.ARRAY_Temp = Filtered Array(Global.VECTORS_Tee_Positions, Current Array Element != 0 && Distance Between(Position Of(
Event Player), Current Array Element) <= 1);
"Player is on a tee: set his current hole to that number."
If(First Of(Global.VECTORS_Temp) != 0);
Event Player.INT_Current_Hole = Index Of Array Value(Global.VECTORS_Tee_Positions, Global.VECTORS_Temp);
Event Player.INT_Current_Strokes = 0;
If(First Of(Global.ARRAY_Temp) != 0);
Event Player.INT_Current_Hole = Index Of Array Value(Global.VECTORS_Tee_Positions, Global.ARRAY_Temp);
Event Player.STRING_Playing_Hole = Event Player.INT_Current_Hole;
Small Message(All Players(All Teams), Custom String("{0} is playing hole #{1}", Event Player, Event Player.STRING_Playing_Hole));
"First hole: reset course score."
If(1 == Event Player.INT_Current_Hole);
Small Message(Event Player, Custom String("Hole #1: resetting course score"));
Event Player.INTS_Scores_by_Hole = Empty Array;
Event Player.INT_Course_Score = 0;
End;
"Set POI."
Event Player.VECTOR_Current_POI = Global.VECTORS_Hole_Positions[Event Player.INT_Current_Hole];
"Not at a tee: Stop playing hole and spawn \"free\" disc."
Else;
Event Player.STRING_Playing_Hole = Custom String("None");
Event Player.INT_Current_Strokes = 0;
"Set POI."
Event Player.VECTOR_Current_POI = Global.VECTORS_Tee_Positions[Event Player.INT_Current_Hole];
Small Message(Event Player, Custom String("Spawned free disc, not playing a hole"));
End;
Event Player.STRINGS_Disc_Status = Array(Custom String("Disc spawned"), Custom String("Now you can"), Custom String(
"Pick it up or spawn a new one"));
}
}
rule("SUBR: Disc_Spawn (for Event Player)")
{
event
{
Subroutine;
Disc_Spawn;
}
actions
{
"Create dummy bot for disc at player's position."
Create Dummy Bot(Hero(Wrecking Ball), All Teams, -1, Position Of(Event Player), Vector(0, 0, 0));
"Save bot to player's variable."
Event Player.ENTITY_Disc = Last Created Entity;
"Save player to bot variable."
Event Player.ENTITY_Disc.PLAYER_Disc_Owner = Event Player;
"Make bot invisible and phased out."
Set Invisible(Event Player.ENTITY_Disc, All);
Set Status(Event Player.ENTITY_Disc, Null, Phased Out, 9999);
"Move dummy bot to player's position."
Teleport(Event Player.ENTITY_Disc, Position Of(Event Player));
}
}
rule("SUBR: Disc_Destroy (for Event Player)")
{
event
{
Subroutine;
Disc_Destroy;
}
actions
{
Call Subroutine(Player_Disc_Clear_Effects);
"Destroy dummy bot for player's disc."
Destroy Dummy Bot(All Teams, Slot Of(Event Player.ENTITY_Disc));
"Destroy effects for player."
For Global Variable(INT_Loop_Index, 0, Count Of(Event Player.EFFECTS_Disc), 1);
Destroy Effect(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
disabled Destroy Icon(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
End;
"Set player disc variables to 0."
Event Player.ENTITY_Disc = 0;
Event Player.EFFECTS_Disc = 0;
Destroy HUD Text(Event Player.HUD_Holding_Disc);
}
}
rule("PLAYER: Set throw charge (reload)")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Reload) == True;
Is Button Held(Event Player, Interact) == False;
}
actions
{
If(Event Player.INT_Curve_Angle < 50);
Event Player.INT_Curve_Angle += 1;
Else;
Event Player.INT_Curve_Angle = 0;
"\"Address the ball.\""
If(Random Real(0, 1) >= Global.REAL_Disc_Speak_Probability);
Global.INT_Temp = Random Integer(0, 10);
If(Global.INT_Temp == 0);
Communicate(Event Player.ENTITY_Disc, Hello);
Else If(Global.INT_Temp == 1);
Communicate(Event Player.ENTITY_Disc, Thanks);
Else If(Global.INT_Temp == 2);
Communicate(Event Player.ENTITY_Disc, Acknowledge);
Else If(Global.INT_Temp == 3);
Communicate(Event Player.ENTITY_Disc, You are Welcome);
Else If(Global.INT_Temp == 4);
Communicate(Event Player.ENTITY_Disc, Yes);
Else If(Global.INT_Temp == 5);
Communicate(Event Player.ENTITY_Disc, Go);
Else If(Global.INT_Temp == 6);
Communicate(Event Player.ENTITY_Disc, Ready);
Else If(Global.INT_Temp == 7);
Communicate(Event Player.ENTITY_Disc, With You);
Else If(Global.INT_Temp == 8);
Communicate(Event Player.ENTITY_Disc, Going In);
Else If(Global.INT_Temp == 9);
Communicate(Event Player.ENTITY_Disc, On My Way);
Else If(Global.INT_Temp == 10);
Communicate(Event Player.ENTITY_Disc, Countdown);
End;
End;
Set Ultimate Charge(Event Player, Event Player.INT_Curve_Angle);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
disabled rule("PLAYER: Throw charge meter (ult meter)")
rule("PLAYER: Pick up disc")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Alive(Event Player) == True;
Ultimate Charge Percent(Event Player) != Event Player.INT_Curve_Angle;
Event Player.ENTITY_Disc != False;
Distance Between(Event Player.ENTITY_Disc, Event Player) <= 1.500;
Is Button Held(Event Player, Crouch) == True;
Event Player.BOOL_Holding_Disc != True;
}
actions
{
Set Ultimate Charge(Event Player, Event Player.INT_Curve_Angle);
Event Player.BOOL_Holding_Disc = True;
Event Player.BOOL_Throwing_Disc = False;
Event Player.BOOL_Disc_Visible = False;
Set Status(Event Player, Null, Rooted, 9999);
Call Subroutine(PLAYER_Disc_Clear_Effects);
Create Effect(All Players(All Teams), Ring, Green, Event Player, 1.500, Visible To Position and Radius);
Event Player.EFFECT_Holding_Disc = Last Created Entity;
Event Player.STRINGS_Disc_Status = Array(Custom String("Holding disc"), Custom String("To throw"), Custom String(
"hold Primary Fire, rotate slowly, and release"));
}
}
rule("PLAYER: Pick up disc")
rule("PLAYER: Record turn rate")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.ENTITY_Disc != 0;
Distance Between(Event Player.ENTITY_Disc, Event Player) <= 1.500;
Is Button Held(Event Player, Crouch) == True;
Event Player.BOOL_Holding_Disc != True;
disabled Event Player.BOOL_Holding_Disc == True;
Event Player.BOOL_Throwing_Disc == True;
}
actions
{
Call Subroutine(Player_Disc_Clear_Effects);
Create Effect(All Players(All Teams), Ring, Green, Event Player, 1, Visible To Position and Radius);
Modify Player Variable(Event Player, EFFECTS_Disc, Append To Array, Last Created Entity);
Event Player.BOOL_Holding_Disc = True;
Set Status(Event Player, Null, Rooted, 9999);
Event Player.BOOL_Throwing_Disc = False;
Event Player.STRINGS_Disc_Status = Array(Custom String("Holding disc"), Custom String("To throw"), Custom String(
"hold Primary Fire, rotate slowly, and release"));
Event Player.REAL_Turn_Rate_Degrees = Angle Between Vectors(Facing Direction Of(Event Player), Event Player.VECTOR_Last_Facing);
Event Player.VECTOR_Last_Facing = Facing Direction Of(Event Player);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("PLAYER: Throw disc")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.BOOL_Holding_Disc == True;
Is Button Held(Event Player, Primary Fire) == False;
Event Player.BOOL_Throwing_Disc == True;
}
actions
{
Call Subroutine(PLAYER_Clear_Self_Effects);
Call Subroutine(Player_Disc_Create_Effects);
"Clear player-holding-disc effects."
disabled Call Subroutine(Disc_Destroy);
disabled Call Subroutine(Disc_Spawn);
Event Player.ENTITY_Disc.BOOL_Disc_Thrown = True;
Event Player.BOOL_Throwing_Disc = False;
Event Player.BOOL_Holding_Disc = False;
"Destroy holding-disc effect."
Destroy Effect(Event Player.EFFECT_Holding_Disc);
Call Subroutine(PLAYER_Disc_Create_Effects);
Event Player.EFFECT_Holding_Disc = 0;
"Record position of throw."
Event Player.ENTITY_Disc.VECTOR_Last_Throw_From = Position Of(Event Player);
"Calcuate and set disc curve vector and speed."
Event Player.ENTITY_Disc.VECTOR_Disc_Curve_Impulse = Event Player.INT_Curve_Angle - 25 < 0 ? Vector(1, 0, 0) : Vector(-1, 0, 0);
If(Event Player.INT_Curve_Angle <= 25);
Event Player.ENTITY_Disc.INT_Disc_Curve_Speed = Absolute Value(Event Player.INT_Curve_Angle - 25) / 25;
Else If(Event Player.INT_Curve_Angle == 25);
Event Player.ENTITY_Disc.INT_Disc_Curve_Speed = 0;
Else;
Event Player.ENTITY_Disc.INT_Disc_Curve_Speed = (Event Player.INT_Curve_Angle - 25) / 25;
End;
"Scale curve speed."
disabled Event Player.ENTITY_Disc.INT_Disc_Curve_Speed = 1.500;
"Scale curve speed by throw speed (multiply by the fraction throw speed is of 50)."
disabled Event Player.ENTITY_Disc.INT_Disc_Curve_Speed = Event Player.ENTITY_Disc.INT_Disc_Curve_Speed * (Min(50, Absolute Value(
Event Player.INT_Turn_Rate)) / 50);
Event Player.REAL_Turn_Rate_Degrees)) / 50);
"Wait for dummy to spawn in. (Maybe we could just phase it out until after it's thrown instead.)"
Wait(0.150, Ignore Condition);
disabled Wait(0.150, Ignore Condition);
"Set dummy bot to facing direction of player."
Set Facing(Event Player.ENTITY_Disc, Facing Direction Of(Event Player), To World);
"Apply impulse to disc (uncapped speed)."
disabled Apply Impulse(Event Player.ENTITY_Disc, Facing Direction Of(Event Player), Absolute Value(Event Player.INT_Turn_Rate) * 2,
disabled Apply Impulse(Event Player.ENTITY_Disc, Facing Direction Of(Event Player), Absolute Value(Event Player.REAL_Turn_Rate_Degrees) * 2,
To World, Incorporate Contrary Motion);
"Apply impulse to disc (capped to 40)."
Apply Impulse(Event Player.ENTITY_Disc, Facing Direction Of(Event Player), Min(40, Absolute Value(Event Player.INT_Turn_Rate) * 2),
To World, Incorporate Contrary Motion);
Event Player.ENTITY_Disc.BOOL_Disc_Thrown = True;
Event Player.BOOL_Holding_Disc = False;
Apply Impulse(Event Player.ENTITY_Disc, Facing Direction Of(Event Player), Min(40, Absolute Value(
Event Player.REAL_Turn_Rate_Degrees) * 2), To World, Incorporate Contrary Motion);
Clear Status(Event Player, Rooted);
Destroy HUD Text(Event Player.HUD_Holding_Disc);
"Show last-throw HUD."
Destroy HUD Text(Event Player.HUD_Last_Throw);
Create HUD Text(Event Player, Custom String("Last throw"), Custom String("Distance: {0}m", Event Player.INT_Last_Throw_Distance),
Custom String("Strength: {0}%", Absolute Value(Event Player.INT_Turn_Rate / 50 * 100)), Left, 9, Green, White, White, String,
Default Visibility);
Event Player.HUD_Last_Throw = Last Text ID;
"Increment stroke counter."
Event Player.INT_Current_Strokes += 1;
Event Player.STRINGS_Disc_Status = Array(Custom String("Disc thrown"), Custom String("Now you can"), Custom String(
"Go pick it up or spawn a new one"));
}
}
rule("PLAYER: Disable buttons")
rule("PLAYER: Decrease (toward left) throw curve (ultimate)")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Alive(Event Player) == True;
Is Button Held(Event Player, Ultimate) == True;
Is Button Held(Event Player, Interact) == True;
}
actions
{
Disallow Button(Event Player, Ultimate);
If(Event Player.INT_Curve_Angle > 0);
Event Player.INT_Curve_Angle -= 1;
Else;
Event Player.INT_Curve_Angle = 50;
End;
Set Ultimate Charge(Event Player, Event Player.INT_Curve_Angle);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("DISC: Apply sideways motion in air")
rule("PLAYER: Increase (toward right) throw curve (ultimate)")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Wrecking Ball);
Is In Air(Event Player) == True;
Event Player.BOOL_Disc_Thrown == True;
Is Button Held(Event Player, Ultimate) == True;
Is Button Held(Event Player, Interact) == False;
}
actions
{
disabled Small Message(All Players(All Teams), Custom String("applying impulse: {0}", Event Player.VECTOR_Disc_Curve_Impulse));
Apply Impulse(Event Player, Event Player.VECTOR_Disc_Curve_Impulse, Event Player.INT_Disc_Curve_Speed, To Player,
Incorporate Contrary Motion);
If(Event Player.INT_Curve_Angle < 50);
Event Player.INT_Curve_Angle += 1;
Else;
Event Player.INT_Curve_Angle = 0;
End;
Set Ultimate Charge(Event Player, Event Player.INT_Curve_Angle);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("PLAYER: Record turn rate")
rule("DISC: Apply sideways motion in air")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.BOOL_Holding_Disc == True;
disabled Hero Of(Event Player) == Hero(Torbjörn);
Team Of(Event Player) == Team 2;
Is In Air(Event Player) == True;
Event Player.BOOL_Disc_Thrown == True;
}
actions
{
Event Player.INT_Turn_Rate = Angle Difference(Event Player.INT_Last_Facing_Angle, Horizontal Facing Angle Of(Event Player));
Event Player.INT_Last_Facing_Angle = Horizontal Facing Angle Of(Event Player);
disabled Small Message(All Players(All Teams), Custom String("applying impulse: {0}", Event Player.VECTOR_Disc_Curve_Impulse));
Apply Impulse(Event Player, Event Player.VECTOR_Disc_Curve_Impulse, Event Player.INT_Disc_Curve_Speed, To Player,
Incorporate Contrary Motion);
Wait(0.100, Ignore Condition);
Loop If Condition Is True;
}
}
rule("DISC: Came to rest")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Wrecking Ball);
Team Of(Event Player) == Team 2;
disabled Hero Of(Event Player) == Hero(Torbjörn);
Is In Air(Event Player) == False;
Speed Of(Event Player) == 0;
}
actions
{
Event Player.BOOL_Disc_Thrown = False;
Event Player.PLAYER_Disc_Owner.INT_Last_Throw_Distance = Distance Between(Event Player.VECTOR_Last_Throw_From, Position Of(
Event Player));
"Playing the hole:"
If(Event Player.PLAYER_Disc_Owner.STRING_Playing_Hole != Custom String("None"));
"Disc in hole: score."
If(Distance Between(Event Player, Global.VECTORS_Hole_Positions[Event Player.PLAYER_Disc_Owner.INT_Current_Hole]) <= 2);
"Disc in hole: score. (The distance requires the inner orb to be completely inside the goal. Well, approximately. The math doesn't seem to work out right.)"
If(Distance Between(Event Player, Global.VECTORS_Hole_Positions[Event Player.PLAYER_Disc_Owner.INT_Current_Hole]) <= 1.850);
Big Message(All Players(All Teams), Custom String("{0} made #{1} with {2} strokes", Event Player.PLAYER_Disc_Owner,
Event Player.PLAYER_Disc_Owner.INT_Current_Hole, Event Player.PLAYER_Disc_Owner.INT_Current_Strokes));
Modify Player Score(Event Player.PLAYER_Disc_Owner, -1 * Event Player.PLAYER_Disc_Owner.INT_Current_Strokes);
Event Player.STRING_Playing_Hole = Custom String("None");
disabled Event Player.PLAYER_Disc_Owner.INT_Current_Hole += 1;
"Wait after message to avoid the variable being reset to 0 before the message is displayed. (Race conditions WITHIN RULES...)"
Wait(0.050, Ignore Condition);
Event Player.PLAYER_Disc_Owner.INTS_Scores_by_Hole[Event Player.PLAYER_Disc_Owner.INT_Current_Hole] = Event Player.PLAYER_Disc_Owner.INT_Current_Strokes;
Event Player.PLAYER_Disc_Owner.INT_Course_Score += Event Player.PLAYER_Disc_Owner.INT_Current_Strokes;
Event Player.PLAYER_Disc_Owner.STRING_Playing_Hole = Custom String("None");
Event Player.PLAYER_Disc_Owner.INT_Current_Strokes = 0;
"Set POI."
Event Player.PLAYER_Disc_Owner.VECTOR_Current_POI = Global.VECTORS_Tee_Positions[1 + Event Player.PLAYER_Disc_Owner.INT_Current_Hole];
"\"Address the ball.\""
If(Random Real(0, 1) >= Global.REAL_Disc_Speak_Probability);
Global.INT_Temp = Random Integer(0, 4);
If(Global.INT_Temp == 0);
Communicate(Event Player.ENTITY_Disc, Thanks);
Else If(Global.INT_Temp == 1);
Communicate(Event Player.ENTITY_Disc, Acknowledge);
Else If(Global.INT_Temp == 2);
Communicate(Event Player.ENTITY_Disc, You are Welcome);
Else If(Global.INT_Temp == 4);
Communicate(Event Player.ENTITY_Disc, Yes);
End;
End;
Else;
"\"Address the ball.\""
If(Random Real(0, 1) >= Global.REAL_Disc_Speak_Probability);
Global.INT_Temp = Random Integer(0, 4);
If(Global.INT_Temp == 0);
Communicate(Event Player.ENTITY_Disc, Need Healing);
Else If(Global.INT_Temp == 1);
Communicate(Event Player.ENTITY_Disc, No);
Else If(Global.INT_Temp == 2);
Communicate(Event Player.ENTITY_Disc, Need Help);
Else If(Global.INT_Temp == 4);
Communicate(Event Player.ENTITY_Disc, Sorry);
End;
End;
End;
End;
}
}
disabled rule("DEBUG: Destroy all bots")
rule("DISC: Dies (duplicates actions from other subr, but since the disc owner is not the Event Player, they must be changed here)")
{
event
{
Player Died;
Team 2;
All;
}
actions
{
"Destroy effects for player's disc."
For Global Variable(INT_Loop_Index, 0, Count Of(Event Player.PLAYER_Disc_Owner.EFFECTS_Disc), 1);
If(Entity Exists(Event Player.PLAYER_Disc_Owner.EFFECTS_Disc[Global.INT_Loop_Index]));
Destroy Effect(Event Player.PLAYER_Disc_Owner.EFFECTS_Disc[Global.INT_Loop_Index]);
End;
Event Player.EFFECTS_Disc = Empty Array;
Event Player.PLAYER_Disc_Owner.STRINGS_Disc_Status = Array(Custom String("Oops"), Custom String("Now you can"), Custom String(
"Spawn a disc"));
"Destroy the disc (otherwise ball may go into ball form and roll around, which we don't want)."
disabled Destroy Dummy Bot(All Teams, Slot Of(Event Player));
Event Player.PLAYER_Disc_Owner.BOOL_Disc_Visible = False;
}
}
rule("PLAYER: Begin throwing (holding disc and pressing primary fire)")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player == Host Player;
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Reload) == True;
Event Player.BOOL_Holding_Disc == True;
Is Button Held(Event Player, Primary Fire) == True;
}
actions
{
Destroy All Dummy Bots;
Destroy All Effects;
Destroy All Icons;
Event Player.BOOL_Throwing_Disc = True;
Event Player.REAL_Turn_Rate_Degrees = 0;
Event Player.VECTOR_Last_Facing = Facing Direction Of(Event Player);
Event Player.STRINGS_Disc_Status = Array(Custom String("Throwing disc"), Custom String("Now you can"), Custom String(
"Aim up slightly, and release the disc while turning slowly"));
}
}
disabled rule("DEBUG: HUD")
rule("PLAYER: Change color")
{
event
{
Player Joined Match;
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) != Hero(Wrecking Ball);
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Reload) == True;
}
actions
{
"Increment color."
Event Player.INT_Color += 1;
"Wrap color back to 0."
If(Event Player.INT_Color > 12);
Event Player.INT_Color = 0;
End;
"Disc exists: Change its effect color."
If(Entity Exists(Event Player.ENTITY_Disc.EFFECT_Disc_Inner_Orb));
"Clear disc effects."
Call Subroutine(PLAYER_Disc_Clear_Effects);
Call Subroutine(PLAYER_Disc_Create_Effects);
End;
disabled Small Message(Event Player, Custom String("Color changed to: {0}", Event Player.INT_Color));
}
}
rule("SUBR: Create_Course_Effects")
{
event
{
Subroutine;
Create_Course_Effects;
}
actions
{
Global.EFFECTS_Tees_Holes = Empty Array;
Global.TEXT_Tees_Holes = Empty Array;
"Create tee and hole effects and text."
For Global Variable(INT_Loop_Index, 1, Count Of(Global.VECTORS_Tee_Positions), 1);
"NOTE: Apparently mandatory 100ms delay in loop to work around THESE WORKSHOP BUGS MAN."
Wait(0.100, Ignore Condition);
Create Effect(Global.PLAYERS_All, Sphere, Green, Global.VECTORS_Tee_Positions[Global.INT_Loop_Index], 0.250, Visible To);
Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Created Entity);
Create Effect(Global.PLAYERS_All, Sphere, Red, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 2, Visible To);
Modify Global Variable(EFFECTS_Tees_Holes, Append To Array, Last Created Entity);
"Labels"
Create In-World Text(Global.PLAYERS_All, Global.INT_Loop_Index, Global.VECTORS_Tee_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, Visible To, Green, Visible Always);
Modify Global Variable(TEXT_Tees_Holes, Append To Array, Last Text ID);
Create In-World Text(Global.PLAYERS_All, Global.INT_Loop_Index, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, Visible To, White, Visible Always);
Modify Global Variable(TEXT_Tees_Holes, Append To Array, Last Text ID);
"Do it again and then delete it to workaround insane bug?! Seems to work but no idea why it's necessary or why it works around it."
Create In-World Text(Global.PLAYERS_All, Global.INT_Loop_Index, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, Visible To, White, Default Visibility);
Destroy In-World Text(Last Text ID);
End;
}
}
rule("SUBR: Clear_Course_Effects")
{
event
{
Subroutine;
Clear_Course_Effects;
}
actions
{
For Global Variable(INT_Loop_Index, 0, Count Of(Global.EFFECTS_Tees_Holes), 1);
"NOTE: Apparently mandatory 100ms delay in loop to work around THESE WORKSHOP BUGS MAN."
Wait(0.100, Ignore Condition);
Destroy Effect(Global.EFFECTS_Tees_Holes[Global.INT_Loop_Index]);
End;
For Global Variable(INT_Loop_Index, 0, Count Of(Global.TEXT_Tees_Holes), 1);
"NOTE: Apparently mandatory 100ms delay in loop to work around THESE WORKSHOP BUGS MAN."
Wait(0.100, Ignore Condition);
Destroy In-World Text(Global.TEXT_Tees_Holes[Global.INT_Loop_Index]);
End;
Global.EFFECTS_Tees_Holes = Empty Array;
Global.TEXT_Tees_Holes = Empty Array;
}
}
rule("SUBR: PLAYER_Disc_Create_Effects")
{
event
{
Subroutine;
PLAYER_Disc_Create_Effects;
}
actions
{
Create HUD Text(Event Player, Custom String("Turn rate: {0} Disc vector: {1} Curve impulse: {2}", Event Player.INT_Turn_Rate,
Event Player.ENTITY_Disc.VECTOR_Disc_Curve_Impulse, Event Player.ENTITY_Disc.INT_Disc_Curve_Speed), Null, Null, Left, 0, White,
White, White, Visible To and String, Default Visibility);
"Create disc visual effects."
If(Event Player.INT_Color == 0);
Play Effect(All Players(All Teams), Ring Explosion, White, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, White, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 1);
Play Effect(All Players(All Teams), Ring Explosion, Yellow, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Yellow, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 2);
Play Effect(All Players(All Teams), Ring Explosion, Green, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Green, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 3);
Play Effect(All Players(All Teams), Ring Explosion, Purple, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Purple, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 4);
Play Effect(All Players(All Teams), Ring Explosion, Red, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Red, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 5);
Play Effect(All Players(All Teams), Ring Explosion, Blue, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Blue, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 6);
Play Effect(All Players(All Teams), Ring Explosion, Team 1, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Team 1, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 7);
Play Effect(All Players(All Teams), Ring Explosion, Team 2, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Team 2, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 8);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Aqua, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 9);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Orange, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 10);
Play Effect(All Players(All Teams), Ring Explosion, Sky Blue, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Sky Blue, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 11);
Play Effect(All Players(All Teams), Ring Explosion, Turquoise, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Turquoise, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 12);
Play Effect(All Players(All Teams), Ring Explosion, Lime Green, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Lime Green, Position Of(Event Player.ENTITY_Disc), Global.INT_Disc_Outer_Orb_Width,
Visible To Position and Radius);
End;
Event Player.ENTITY_Disc.EFFECT_Disc_Outer_Orb = Last Created Entity;
Create Effect(All Players(All Teams), Sphere, White, Position Of(Event Player.ENTITY_Disc), 0.300, Position and Radius);
Event Player.ENTITY_Disc.EFFECT_Disc_Inner_Orb = Last Created Entity;
"Create player name text on disc."
If(Event Player.INT_Color == 0);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, White, Default Visibility);
Else If(Event Player.INT_Color == 1);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Yellow, Default Visibility);
Else If(Event Player.INT_Color == 2);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Green, Default Visibility);
Else If(Event Player.INT_Color == 3);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Purple, Default Visibility);
Else If(Event Player.INT_Color == 4);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Red, Default Visibility);
Else If(Event Player.INT_Color == 5);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Blue, Default Visibility);
Else If(Event Player.INT_Color == 6);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Team 1, Default Visibility);
Else If(Event Player.INT_Color == 7);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Team 2, Default Visibility);
Else If(Event Player.INT_Color == 8);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Aqua, Default Visibility);
Else If(Event Player.INT_Color == 9);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Orange, Default Visibility);
Else If(Event Player.INT_Color == 10);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Sky Blue, Default Visibility);
Else If(Event Player.INT_Color == 11);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Turquoise, Default Visibility);
Else If(Event Player.INT_Color == 12);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Lime Green, Default Visibility);
End;
Event Player.ENTITY_Disc.TEXT_Disc = Last Text ID;
}
}
rule("SUBR: PLAYER_Disc_Clear_Effects")
{
event
{
Subroutine;
PLAYER_Disc_Clear_Effects;
}
actions
{
disabled Small Message(Host Player, Custom String("Destroying disc effects for player: {0}", Event Player));
disabled Small Message(Host Player, Custom String("Destroying disc effects: {0}, {1}, {2}", Event Player.ENTITY_Disc.EFFECT_Disc_Inner_Orb,
Event Player.ENTITY_Disc.EFFECT_Disc_Outer_Orb, Event Player.ENTITY_Disc.TEXT_Disc));
Global.BOOL_Disc_Spawned = 0;
Destroy Effect(Event Player.ENTITY_Disc.EFFECT_Disc_Inner_Orb);
Destroy Effect(Event Player.ENTITY_Disc.EFFECT_Disc_Outer_Orb);
Destroy In-World Text(Event Player.ENTITY_Disc.TEXT_Disc);
}
}
disabled rule("SUBR: WATCHDOG_Course_Effects (was experimental, probably unnecessary)")
{
event
{
Subroutine;
WATCHDOG_Course_Effects;
}
actions
{
Small Message(Host Player, Custom String("Watchdog checking."));
"(Re)create tee and hole effects and text for any that are missing. For some reason, they tend to disappear when players leave or join. So we need a kind of watchdog routine to monitor and recreate them."
For Global Variable(INT_Loop_Index, 1, Count Of(Global.VECTORS_Tee_Positions), 1);
"NOTE: Apparently mandatory 100ms delay in loop to work around THESE WORKSHOP BUGS MAN."
Wait(0.100, Ignore Condition);
"Ensure tee effect exists."
If(!Entity Exists(Global.EFFECTS_Tees[Global.INT_Loop_Index]));
Small Message(Host Player, Custom String("Recreating effect for tee {0}.", Global.INT_Loop_Index));
Create Effect(All Players(Team 1), Sphere, Green, Global.VECTORS_Tee_Positions[Global.INT_Loop_Index], 0.250, None);
Global.EFFECTS_Tees[Global.INT_Loop_Index] = Last Created Entity;
"Create tee text (apparently there's no action to check whether text exists, so just recreate it every time the tee effect is created, and hope this works)."
Create In-World Text(All Players(Team 1), Global.INT_Loop_Index, Global.VECTORS_Tee_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, None, Green, Visible Always);
Global.TEXTS_Tees[Global.INT_Loop_Index] = Last Text ID;
End;
"Ensure hole effect exists."
If(!Entity Exists(Global.EFFECTS_Holes[Global.INT_Loop_Index]));
Small Message(Host Player, Custom String("Recreating effect for hole {0}.", Global.INT_Loop_Index));
Create Effect(All Players(Team 1), Sphere, Red, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 2, None);
Global.EFFECTS_Holes[Global.INT_Loop_Index] = Last Created Entity;
"Create hole text (apparently there's no action to check whether text exists, so just recreate it every time the effect is created, and hope this works)"
Create In-World Text(All Players(Team 1), Global.INT_Loop_Index, Global.VECTORS_Hole_Positions[Global.INT_Loop_Index], 1,
Do Not Clip, None, White, Visible Always);
Global.TEXTS_Holes[Global.INT_Loop_Index] = Last Text ID;
End;
End;
Wait(30, Ignore Condition);
Loop;
}
}
rule("DEBUG: Create goals")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Crouch) == True;
}
actions
{
If(Is True For Any(Global.VECTORS_Tee_Positions, Current Array Element != 0 && Distance Between(Current Array Element, Position Of(
Event Player)) <= 5));
Small Message(Event Player, Custom String("Too close to a tee."));
Abort;
End;
If(Is True For Any(Global.VECTORS_Hole_Positions, Current Array Element != 0 && Distance Between(Current Array Element,
Position Of(Event Player)) <= 5));
Small Message(Event Player, Custom String("Too close to another hole."));
Abort;
End;
Destroy Effect(Event Player.EFFECT_Goal);
Event Player.POINT_Goal = Position Of(Event Player);
Create Effect(All Players(All Teams), Sphere, Red, Event Player.POINT_Goal, 2, Visible To Position and Radius);
Event Player.EFFECT_Goal = Last Created Entity;
Destroy Effect(Event Player.EFFECT_Goal_Name);
Destroy In-World Text(Event Player.TEXT_Goal_Name);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.POINT_Goal), 0.750, Do Not Clip,
Visible To Position and String, Red, Default Visibility);
Event Player.EFFECT_Goal_Name = Last Created Entity;
}
}
disabled rule("SCORE (not working, will be easier with actual designed courses)")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) == Hero(Wrecking Ball);
Is In Air(Event Player) == False;
Speed Of(Event Player) == 0;
Is Alive(Event Player) == True;
Is True For Any(Filtered Array(All Players(All Teams), !Is Dummy Bot(Current Array Element)),
Current Array Element.POINT_Goal != 0 && Distance Between(Current Array Element.EFFECT_Goal, Position Of(Event Player)) <= 2)
== True;
}
actions
{
Big Message(All Players(All Teams), Custom String("{0} Scored!", First Of(Filtered Array(All Players(All Teams),
Event Player == Current Array Element.ENTITY_Disc))));
Event Player.TEXT_Goal_Name = Last Text ID;
}
}
rule("DEBUG: Create tees")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Jump) == True;
Is Button Held(Event Player, Interact) == True;
}
actions
{
If(Is True For Any(Global.VECTORS_Tee_Positions, Current Array Element != 0 && Distance Between(Current Array Element, Position Of(
Event Player)) <= 5));
Small Message(Event Player, Custom String("Too close to another tee."));
Abort;
End;
If(Is True For Any(Global.VECTORS_Hole_Positions, Current Array Element != 0 && Distance Between(Current Array Element,
Position Of(Event Player)) <= 5));
Small Message(Event Player, Custom String("Too close to a hole."));
Abort;
End;
Destroy Effect(Event Player.EFFECT_Tee);
Event Player.POINT_Tee = Position Of(Event Player);
Create Effect(All Players(All Teams), Sphere, Green, Event Player.POINT_Tee, 0.250, Visible To Position and Radius);
Event Player.EFFECT_Tee = Last Created Entity;
Destroy Effect(Event Player.EFFECT_Tee_Name);
Destroy In-World Text(Event Player.TEXT_Tee_Name);
Create In-World Text(All Players(All Teams), Event Player, Event Player.POINT_Tee, 0.750, Do Not Clip,
Visible To Position and String, Green, Default Visibility);
Event Player.EFFECT_Tee_Name = Last Created Entity;
Event Player.TEXT_Tee_Name = Last Text ID;
}
}
rule("PLAYER: Leaves match")
disabled rule("DEBUG: Manually reset effects and dummy bots")
{
event
{
Player Left Match;
Ongoing - Each Player;
All;
All;
}
conditions
{
Hero Of(Event Player) != Hero(Wrecking Ball);
Event Player == Host Player;
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Ultimate) == True;
}
actions
{
disabled Small Message(Host Player, Custom String("Player left match: {0}", Event Player));
Call Subroutine(PLAYER_Clear_All_Things);
Small Message(All Players(All Teams), Custom String("Resetting..."));
Destroy All Dummy Bots;
Destroy All Effects;
disabled Call Subroutine(Clear_Course_Effects);
Call Subroutine(Create_Course_Effects);
Small Message(All Players(All Teams), Custom String("Effects and dummy bots reset."));
}
}
rule("PLAYER: Begin throwing (holding disc and pressing primary fire)")
disabled rule("DEBUG: Destroy all bots")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.BOOL_Holding_Disc == True;
Is Button Held(Event Player, Primary Fire) == True;
}
actions
{
Event Player.BOOL_Throwing_Disc = True;
}
}
rule("SUBR: Clear all event-player-related things")
{
event
{
Subroutine;
PLAYER_Clear_All_Things;
Event Player == Host Player;
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Reload) == True;
}
actions
{
Call Subroutine(Disc_Destroy);
Destroy All Dummy Bots;
Destroy All Effects;
Destroy All Icons;
}
}
rule("PLAYER: Change color")
disabled rule("DEBUG: HUD")
{
event
{
Ongoing - Each Player;
Player Joined Match;
All;
All;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Button Held(Event Player, Reload) == True;
Hero Of(Event Player) != Hero(Torbjörn);
}
actions
{
"Increment color."
Event Player.INT_Color += 1;
"Wrap color back to 0."
If(Event Player.INT_Color > 12);
Event Player.INT_Color = 0;
End;
"Disc exists: Change its effect color."
If(Event Player.ENTITY_Disc != 0);
"Clear disc effects."
Call Subroutine(Player_Disc_Clear_Effects);
Call Subroutine(Player_Disc_Create_Effects);
End;
Create HUD Text(Event Player, Custom String("Turn rate: {0} Disc vector: {1} Curve impulse: {2}",
Event Player.REAL_Turn_Rate_Degrees, Event Player.ENTITY_Disc.VECTOR_Disc_Curve_Impulse,
Event Player.ENTITY_Disc.INT_Disc_Curve_Speed), Null, Null, Left, 0, White, White, White, Visible To and String,
Default Visibility);
}
}
rule("SUBR: Clear player disc effects (call with player as Event Player)")
disabled rule("DEBUG: Serverload HUD")
{
event
{
Subroutine;
Player_Disc_Clear_Effects;
}
actions
{
"Destroy effects for player's disc."
For Global Variable(INT_Loop_Index, 0, Count Of(Event Player.ENTITY_Disc.EFFECTS_Disc), 1);
Destroy Effect(Event Player.ENTITY_Disc.EFFECTS_Disc[Global.INT_Loop_Index]);
Destroy Icon(Event Player.ENTITY_Disc.EFFECTS_Disc[Global.INT_Loop_Index]);
Destroy In-World Text(Event Player.ENTITY_Disc.EFFECTS_Disc[Global.INT_Loop_Index]);
End;
Event Player.ENTITY_Disc.EFFECTS_Disc = 0;
Player Joined Match;
All;
All;
}
}
disabled rule("SUBR: PLAYER: Activate hole")
{
event
conditions
{
Subroutine;
PLAYER_Create_Hole_Effects;
(Event Player == Host Player) == True;
}
actions
{
"Clear effects from previous hole."
Call Subroutine(PLAYER_Clear_Hole_Effects);
"Create effects for new hole."
Create Effect(Event Player, Sphere, Green, Global.VECTORS_Tee_Positions[Event Player.INT_Current_Hole], 0.250, None);
Modify Player Variable(Event Player, EFFECTS_Current_Hole, Append To Array, Last Created Entity);
Create Effect(Event Player, Sphere, Red, Global.VECTORS_Hole_Positions[Event Player.INT_Current_Hole], 3, None);
Modify Player Variable(Event Player, EFFECTS_Current_Hole, Append To Array, Last Created Entity);
Create In-World Text(Event Player, Event Player.INT_Current_Hole + 1, Global.VECTORS_Tee_Positions[Event Player.INT_Current_Hole],
1, Do Not Clip, None, Green, Default Visibility);
Modify Player Variable(Event Player, EFFECTS_Current_Hole, Append To Array, Last Text ID);
Create In-World Text(Event Player, Event Player.INT_Current_Hole + 1, Global.VECTORS_Hole_Positions[Event Player.INT_Current_Hole],
1, Do Not Clip, None, Red, Default Visibility);
Modify Player Variable(Event Player, EFFECTS_Current_Hole, Append To Array, Last Text ID);
Create HUD Text(Event Player, Custom String("LOAD"), Custom String("Current / Average / Peak"), String("{0} : {1} : {2}",
Server Load, Server Load Average, Server Load Peak), Left, 99, White, White, White, String, Visible Never);
}
}
disabled rule("SUBR: PLAYER: Clear hole effects")
rule("MAP: Eichenwalde (designed with help from BoiledEgg)")
{
event
{
Subroutine;
PLAYER_Clear_Hole_Effects;
Ongoing - Global;
}
actions
{
For Global Variable(INT_Loop_Index, 0, Count Of(Event Player.EFFECTS_Current_Hole), 1);
Destroy Effect(Event Player.EFFECTS_Current_Hole[Global.INT_Loop_Index]);
Destroy Icon(Event Player.EFFECTS_Current_Hole[Global.INT_Loop_Index]);
Destroy In-World Text(Event Player.EFFECTS_Current_Hole[Global.INT_Loop_Index]);
End;
}
}
rule("SUBR: Create disc effects (call with player as Event Player)")
{
event
conditions
{
Subroutine;
Player_Disc_Create_Effects;
(Current Map == Map(Eichenwalde) || Current Map == Map(Eichenwalde Halloween)) == True;
}
actions
{
"Create disc visual effects."
If(Event Player.INT_Color == 0);
Play Effect(All Players(All Teams), Ring Explosion, White, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, White, Position Of(Event Player.ENTITY_Disc), 0.750, Visible To Position and Radius);
Else If(Event Player.INT_Color == 1);
Play Effect(All Players(All Teams), Ring Explosion, Yellow, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Yellow, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 2);
Play Effect(All Players(All Teams), Ring Explosion, Green, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Green, Position Of(Event Player.ENTITY_Disc), 0.750, Visible To Position and Radius);
Else If(Event Player.INT_Color == 3);
Play Effect(All Players(All Teams), Ring Explosion, Purple, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Purple, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 4);
Play Effect(All Players(All Teams), Ring Explosion, Red, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Red, Position Of(Event Player.ENTITY_Disc), 0.750, Visible To Position and Radius);
Else If(Event Player.INT_Color == 5);
Play Effect(All Players(All Teams), Ring Explosion, Blue, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Blue, Position Of(Event Player.ENTITY_Disc), 0.750, Visible To Position and Radius);
Else If(Event Player.INT_Color == 6);
Play Effect(All Players(All Teams), Ring Explosion, Team 1, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Team 1, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 7);
Play Effect(All Players(All Teams), Ring Explosion, Team 2, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Team 2, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 8);
Play Effect(All Players(All Teams), Ring Explosion, Aqua, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Aqua, Position Of(Event Player.ENTITY_Disc), 0.750, Visible To Position and Radius);
Else If(Event Player.INT_Color == 9);
Play Effect(All Players(All Teams), Ring Explosion, Orange, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Orange, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 10);
Play Effect(All Players(All Teams), Ring Explosion, Sky Blue, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Sky Blue, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 11);
Play Effect(All Players(All Teams), Ring Explosion, Turquoise, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Turquoise, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
Else If(Event Player.INT_Color == 12);
Play Effect(All Players(All Teams), Ring Explosion, Lime Green, Position Of(Event Player), 3);
Create Effect(All Players(All Teams), Sphere, Lime Green, Position Of(Event Player.ENTITY_Disc), 0.750,
Visible To Position and Radius);
End;
Modify Player Variable(Event Player.ENTITY_Disc, EFFECTS_Disc, Append To Array, Last Created Entity);
Create Effect(All Players(All Teams), Sphere, White, Position Of(Event Player.ENTITY_Disc), 0.300, Visible To Position and Radius);
Modify Player Variable(Event Player.ENTITY_Disc, EFFECTS_Disc, Append To Array, Last Created Entity);
"Create player name text on disc."
If(Event Player.INT_Color == 0);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, White, Default Visibility);
Else If(Event Player.INT_Color == 1);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Yellow, Default Visibility);
Else If(Event Player.INT_Color == 2);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Green, Default Visibility);
Else If(Event Player.INT_Color == 3);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Purple, Default Visibility);
Else If(Event Player.INT_Color == 4);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Red, Default Visibility);
Else If(Event Player.INT_Color == 5);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Blue, Default Visibility);
Else If(Event Player.INT_Color == 6);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Team 1, Default Visibility);
Else If(Event Player.INT_Color == 7);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Team 2, Default Visibility);
Else If(Event Player.INT_Color == 8);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Aqua, Default Visibility);
Else If(Event Player.INT_Color == 9);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Orange, Default Visibility);
Else If(Event Player.INT_Color == 10);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Sky Blue, Default Visibility);
Else If(Event Player.INT_Color == 11);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Turquoise, Default Visibility);
Else If(Event Player.INT_Color == 12);
Create In-World Text(All Players(All Teams), Event Player, Position Of(Event Player.ENTITY_Disc), 0.750, Do Not Clip,
Visible To Position and String, Lime Green, Default Visibility);
End;
Modify Player Variable(Event Player.ENTITY_Disc, EFFECTS_Disc, Append To Array, Last Text ID);
Play Effect(All Players(All Teams), Buff Impact Sound, White, Event Player, 2);
Global.VECTORS_Tee_Positions = Array(Vector(-28.102, -0.211, -6.662), Vector(-29.770, -1.780, -0.510), Vector(-11.870, 3.910,
-32.150), Vector(8.420, 1.100, -5.600), Vector(20.360, 9.180, -26.300), Vector(5.590, 6.180, -46.890), Vector(-8.970, 5.090,
-54.800), Vector(10.530, 6.130, -85.140), Vector(33.980, 6.300, -76.580), Vector(51.390, 18.280, -76.990), Vector(61.720,
18.810, -92.480), Vector(102.340, 9.750, -91.340), Vector(67.230, 4.813, -85.466));
Global.VECTORS_Hole_Positions = Array(False, Vector(-31.750, 1.940, -33.690), Vector(-0.840, 0.020, -9.170), Vector(23.700, 6,
-15.520), Vector(5.560, 10, -40.590), Vector(19, 5.330, -64.670), Vector(1.920, 4.760, -94.540), Vector(10.690, 11.010,
-85.040), Vector(56.010, 21, -68.060), Vector(37.680, 12.720, -105.740), Vector(104.530, 12.700, -76.180), Vector(68.130,
12.720, -70), Vector(91.263, 12.723, -56.092));
}
}
rule("DISC: Dies (duplicates actions from other subr, but since the disc owner is not the Event Player, they must be changed here)")
rule("MAP: BIizzard World")
{
event
{
Player Died;
All;
Wrecking Ball;
Ongoing - Global;
}
conditions
{
(Current Map == Map(Blizzard World) || Current Map == Map(Blizzard World Winter)) == True;
}
actions
{
"Destroy effects for player's disc."
For Global Variable(INT_Loop_Index, 0, Count Of(Event Player.EFFECTS_Disc), 1);
Destroy Effect(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
Destroy Icon(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
Destroy In-World Text(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
End;
Event Player.EFFECTS_Disc = 0;
Event Player.PLAYER_Disc_Owner.STRINGS_Disc_Status = Array(Custom String("Oops"), Custom String("Now you can"), Custom String(
"Spawn a disc"));
"Destroy the disc (otherwise ball may go into ball form and roll around, which we don't want)."
Destroy Dummy Bot(All Teams, Slot Of(Event Player));
Global.VECTORS_Tee_Positions = Array(Vector(-19.084, -2.752, 4.699), Vector(-12.630, -3.970, -26.400), Vector(7.420, -3.910,
-13.910), Vector(23.780, -3.910, -3.200), Vector(-2.868, -0.010, 10.139), Vector(3.001, -0.005, 23.926), Vector(-9.168, 6.155,
57.192), Vector(-11.353, 1.105, 35.432), Vector(15.276, 2.010, 66.317), Vector(-6.661, 2.030, 86.548), Vector(-42.520, 4.810,
90.680), Vector(-53.360, -0.160, 65.150), Vector(-62.705, 6.600, 80.572), Vector(-64.480, 0.690, 120.500), Vector(-23.960,
6.090, 94.640), Vector(-81.550, 6.860, 104.040), Vector(-73.530, 0.920, 138.400), Vector(-20.810, 2.160, 103.480), Vector(
-47.278, -0.072, 74.218), Vector(-70.725, 0.912, 118.672), Vector(-108.697, 4.935, 137.274), Vector(-136.065, 0.841, 132.389),
Vector(-89.683, -1.162, 107.466));
Global.VECTORS_Hole_Positions = Array(Vector(0, 0, 0), Vector(-3.400, -4, -14.850), Vector(25.930, -4.100, -7.090), Vector(3, 0,
7.800), Vector(-27.667, -2, 21.656), Vector(-6.678, 6.065, 52.799), Vector(-36.342, 5.202, 48.457), Vector(26.799, 6, 69.217),
Vector(3.273, 6.022, 85.321), Vector(-31.650, 5.820, 100.370), Vector(-41.650, -0.200, 62.210), Vector(-77.350, 4.880, 66.080),
Vector(-76.800, 0.600, 124.110), Vector(-53.150, 4.520, 97.210), Vector(-78.250, 6.570, 99.430), Vector(-59.570, 0.750,
140.720), Vector(-33.460, -0.210, 100.300), Vector(-27.550, 0, 61.470), Vector(-54.264, -0.393, 110.593), Vector(-103.224,
-1.253, 133.073), Vector(-141.309, 0.747, 137.218), Vector(-110.575, -4.250, 113.798), Vector(-122.107, -0.152, 110.486));
}
}
rule("Game start: Warn that this doesn't work (sadly, too many workshop bugs it seems. Maybe with enough fiddling it can be fixed...)")
rule("MAP: Hanamura (designed with help from AuggieStyle)")
{
event
{
Ongoing - Global;
}
conditions
{
Is Game In Progress == True;
(Current Map == Map(Hanamura Winter) || Current Map == Map(Hanamura)) == True;
}
actions
{
Create HUD Text(All Players(All Teams), Custom String("RESTART REQUIRED"), Custom String("Please restart the match."),
Custom String(
"Then, do not actually start the game mode. (Due to workshop bugs, actually starting the mode is not yet supported.)"), Top, 0,
Red, White, White, Visible To and String, Default Visibility);
Global.VECTORS_Tee_Positions = Array(Vector(66.884, -1.913, 26.375), Vector(61.413, 0.443, 35.513), Vector(62.931, -1.918, 11.616),
Vector(57.691, -1.016, -12.390), Vector(50.781, 2.093, -26.222), Vector(48.095, 6.179, 4.005), Vector(40.854, 0.484, 34.476),
Vector(44.133, 1.093, 2.024), Vector(29.420, 0.351, -4.759), Vector(-11.940, 1.090, 30.973), Vector(18.226, 4.188, 9.120),
Vector(-21.017, -1.148, -15.296), Vector(-17.317, -1.166, -32.669), Vector(-26.300, 1.094, -70.134), Vector(5.438, -0.910,
-68.377), Vector(31.784, 1.823, -51.518), Vector(38.646, -1.790, -38.633), Vector(22.583, -1.765, -66.925), Vector(13.115,
-1.707, -37.307), Vector(9.856, 6.943, -21.739));
Global.VECTORS_Hole_Positions = Array(Null, Vector(58.333, -1.915, 21.173), Vector(62.282, -1.535, -11.067), Vector(54.651, 2,
-26.564), Vector(48.052, 6, -13.198), Vector(35.375, 3, 28.392), Vector(36.435, 0.167, 11.170), Vector(39.061, -0.017,
-19.244), Vector(13.859, -1.212, 34.621), Vector(12.076, 4, 22.276), Vector(-13.873, 1, 0.563), Vector(-3.612, 7, -21.077),
Vector(-32.320, 1, -60.400), Vector(-0.408, -0.140, -74.268), Vector(30.883, 1.796, -59.677), Vector(20.615, -1.979, -34.485),
Vector(45.346, -1.979, -72.268), Vector(5.919, -1.716, -41.135), Vector(13.052, 6.739, -21.685), Vector(11.921, 11.336,
21.019));
}
}
rule("SUBR: PLAYER_Clear_Self_Effects")
rule("MAP: Route 66")
{
event
{
Subroutine;
PLAYER_Clear_Self_Effects;
Ongoing - Global;
}
conditions
{
Current Map == Map(Route 66);
}
actions
{
"Destroy effects for player."
For Global Variable(INT_Loop_Index, 0, Count Of(Event Player.EFFECTS_Disc), 1);
Destroy Effect(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
disabled Destroy Icon(Event Player.EFFECTS_Disc[Global.INT_Loop_Index]);
End;
Event Player.EFFECTS_Disc = 0;
Destroy HUD Text(Event Player.HUD_Holding_Disc);
Global.VECTORS_Tee_Positions = Array(Vector(49.702, 3.684, 62.752), Vector(41.075, 2.476, 58.004), Vector(55.982, 0.293, 47.178),
Vector(33.467, 0.317, 40.581), Vector(63.072, 9.350, 12.438), Vector(48.335, 2.418, 8.774), Vector(23.715, 7.246, 20.019),
Vector(30.318, 8.304, -7.563), Vector(0.622, 2.469, -12.262), Vector(-13.441, 4.048, -56.081), Vector(-12.508, 8.542, -10.442),
Vector(-33.568, 8.826, -2.364), Vector(-22.944, 7.962, -43.413), Vector(-49.489, 4.644, 0.928), Vector(-67.298, 12.623,
23.649), Vector(-80.248, 10.959, -9.320), Vector(-105.090, 8.592, -17.257), Vector(-107.106, 12.592, -28.341));
Global.VECTORS_Hole_Positions = Array(Null, Vector(63.767, 0.035, 52.646), Vector(35.130, 0.311, 56.140), Vector(55.306, 5.179,
43.296), Vector(43.857, 2.067, -4.208), Vector(18.313, 7.507, 21.990), Vector(38.506, 8.313, -3.341), Vector(-0.607, 7.033,
-21.453), Vector(-13.493, 3.488, -44.602), Vector(-26.643, 8.430, -29.665), Vector(-33.589, 10.588, 6.066), Vector(-41.085,
9.678, -43.813), Vector(-54.131, 3.332, -11.838), Vector(-71.933, 12.531, 18.500), Vector(-92.434, 6.530, -23.371), Vector(
-107.562, 8.599, -10.355), Vector(-82.307, 6.508, -33.843), Vector(-32.809, 12.598, -15.141));
}
}
}