Return to post
settings
{
main
{
Description: "Quick Widow Experimental test code By @Cactus_Puppy Press Interact to set start location, press Crouch + Interact to set end location Press Ultimate to toggle noclip (thanks Josbird)"
Description: "Hitscan Damage Falloff Tool by CactusPuppy | Last updated (2021-04-05)"
}
modes
{
Assault
{
Limit Roles: 2 Of Each Role Per Team
}
Control
{
Limit Roles: 2 Of Each Role Per Team
}
Escort
{
Limit Roles: 2 Of Each Role Per Team
}
Skirmish
Hybrid
General
{
Limit Roles: 2 Of Each Role Per Team
Game Mode Start: Manual
Hero Limit: Off
}
}
}
variables
{
global:
0: _extendedGlobalCollection
1: _arrayBuilder
2: data
3: allowUltForNoclip
4: fxCorrectionFactors
126: textBudget
127: exitButtonProperties
player:
0: startPosition
1: endPosition
2: IsNoclipping
0: _extendedPlayerCollection
1: startPosition
2: endPosition
3: maxBodyshotDamage
4: minBodyshotDamage
5: headshotMultiplier
6: falloffStartDistance
7: falloffEndDistance
8: currentHero
9: specialPrefix
10: restorePosition
11: noclipButtonID
12: visTypeButtonID
13: falloffVis
14: falloffVisEffectIDs
15: isNoClipping
118: getProperties
119: buttonModification
120: currActionID
121: destroyButtonID
122: lastMenuButtonID
123: buttons
124: newButton
125: menuOriginalFacing
126: menuFrame
127: isInMenu
}
subroutines
{
0: createMenuButton
1: createFalloffVisEffects
2: modifyMenuButton
3: ToggleNoClip
4: destroyMenuButton
5: getButtonProperties
6: createCursor
7: createBorderCorners
8: createBorderEdges
9: createExitButton
10: doButtonUpdate
11: createClickAreas
}
rule("Set start/end on Interact (crouch for end)")
rule("Initial Global")
{
event
{
Ongoing - Global;
}
actions
{
Global.data = Array(Array(Hero(Ashe), Hero(Soldier: 76), Hero(Sombra), Hero(Widowmaker), Hero(McCree), Hero(Tracer)), Array(
Custom String("Scoped "), Custom String(""), Custom String(""), Custom String("Scoped "), Custom String("Primary Fire "),
Custom String("")), Array(Array(75, 37.500, 2, 30, 50), Array(19, 9.500, 2, 30, 50), Array(8, 2.400, 2, 15, 35), Array(120, 60,
2.500, 60, 85), Array(70, 35, 2, 20, 40), Array(6, 1.800, 2, 12, 20)));
Global.allowUltForNoclip = Workshop Setting Toggle(Custom String("NoClip"), Custom String("Ultimate Button toggles NoClip"), True,
0);
Global.fxCorrectionFactors = Array(1.016, 1.053, 1.053, 1.062);
}
}
rule("Initial Player")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
Event Player.falloffVis = 2;
Event Player.falloffVisEffectIDs = Empty Array;
}
}
rule("Game setup")
{
event
{
Ongoing - Global;
}
conditions
{
Is Button Held(Event Player, Interact) == True;
Is Game In Progress == True;
}
actions
{
Set Match Time(817);
Pause Match Time;
Set Objective Description(All Players(All Teams), Custom String("Code: QMJBR"), Visible To);
}
}
rule("Create a menu button")
{
event
{
Subroutine;
createMenuButton;
}
actions
{
If(Count Of(Event Player.newButton) != 13);
Log To Inspector(Custom String("[CursorMenu.createMenuButton] Error: incorrect number of arguments (got {0}, expected {1})",
Event Player.destroyButtonID, 13));
Else;
Event Player.lastMenuButtonID = Count Of(Event Player.buttons);
Event Player._extendedPlayerCollection[2] = 0;
While(Event Player._extendedPlayerCollection[2] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player._extendedPlayerCollection[2]] == Null);
Event Player.lastMenuButtonID = Event Player._extendedPlayerCollection[2];
Event Player._extendedPlayerCollection[2] = Count Of(Event Player.buttons);
End;
Event Player._extendedPlayerCollection[2] += 1;
End;
Event Player.buttons[Event Player.lastMenuButtonID] = Event Player.newButton;
End;
}
}
rule("Modify a menu button")
{
event
{
Subroutine;
modifyMenuButton;
}
actions
{
If(Is Button Held(Event Player, Crouch));
Event Player.endPosition = Eye Position(Event Player);
If(Count Of(Event Player.buttonModification) % 2 == 0 || Count Of(Event Player.buttonModification) < 3);
Log To Inspector(Custom String("[CursorMenu.modifyMenuButton] Error: incorrect number of arguments ({0})", Count Of(
Event Player.buttonModification[0])));
Else If(Event Player.buttonModification[0] >= Count Of(Event Player.buttons)
|| !Event Player.buttons[Event Player.buttonModification[0]]);
Log To Inspector(Custom String("[CursorMenu.modifyMenuButton] Error: tried to modify an invalid button ID ({0})",
Event Player.buttonModification[0]));
Else;
Event Player.startPosition = Eye Position(Event Player);
Event Player._extendedPlayerCollection[2] = 1;
While(Event Player._extendedPlayerCollection[2] < Count Of(Event Player.buttonModification));
If(
Event Player.buttonModification[Event Player._extendedPlayerCollection[2]] < 0 || Event Player.buttonModification[Event Player._extendedPlayerCollection[2]] >= 13);
Log To Inspector(Custom String("[CursorMenu.modifyMenuButton] Error: tried to modify an invalid property index ({0})", Count Of(
Event Player.buttonModification[Event Player._extendedPlayerCollection[2]])));
Else;
Global._arrayBuilder = Event Player.buttons[Event Player.buttonModification[0]];
Global._arrayBuilder[Event Player.buttonModification[Event Player._extendedPlayerCollection[2]]] = Event Player.buttonModification[Event Player._extendedPlayerCollection[2] + 1];
Event Player.buttons[Event Player.buttonModification[0]] = Global._arrayBuilder;
End;
Event Player._extendedPlayerCollection[2] += 2;
End;
End;
}
}
rule("Create effects")
rule("[SUB] Create falloff visuals")
{
event
{
Subroutine;
createFalloffVisEffects;
}
actions
{
Skip(Array(16, 0, 3, 10)[Index Of Array Value(Array(1, 2, 3), Event Player.falloffVis) + 1]);
Event Player.buttonModification = Array(Event Player.visTypeButtonID, 0, Custom String("None"));
Call Subroutine(modifyMenuButton);
Skip(13);
"falloff start"
Create Effect(Event Player, Sphere, Color(Sky Blue), Event Player.startPosition,
Event Player.falloffStartDistance * Global.fxCorrectionFactors[0], Visible To Position and Radius);
Modify Player Variable(Event Player, falloffVisEffectIDs, Append To Array, Last Created Entity);
"falloff end"
Create Effect(Event Player, Sphere, Color(Red), Event Player.startPosition,
Event Player.falloffEndDistance * Global.fxCorrectionFactors[0], Visible To Position and Radius);
Modify Player Variable(Event Player, falloffVisEffectIDs, Append To Array, Last Created Entity);
Event Player.buttonModification = Array(Event Player.visTypeButtonID, 0, Custom String("Sphere"));
Call Subroutine(modifyMenuButton);
Skip(6);
"falloff start"
Create Effect(Event Player, Ring, Color(Sky Blue), Event Player.startPosition,
Event Player.falloffStartDistance * Global.fxCorrectionFactors[3], Visible To Position and Radius);
Modify Player Variable(Event Player, falloffVisEffectIDs, Append To Array, Last Created Entity);
"falloff end"
Create Effect(Event Player, Ring, Color(Red), Event Player.startPosition,
Event Player.falloffEndDistance * Global.fxCorrectionFactors[3], Visible To Position and Radius);
Modify Player Variable(Event Player, falloffVisEffectIDs, Append To Array, Last Created Entity);
Event Player.buttonModification = Array(Event Player.visTypeButtonID, 0, Custom String("Ring"));
Call Subroutine(modifyMenuButton);
}
}
rule("PLAYER SETUP: Disable HUDs, set up menu, set up personal effects, and set allowed heroes")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
disabled Disable Game Mode HUD(Event Player);
Set Player Allowed Heroes(Event Player, First Of(Global.data));
"Create menu buttons"
Event Player.newButton = Array(Custom String("Set Start Point"), Custom String("setStartPoint"), Custom String("setStartPoint"), 3,
-1.500, 0.750, 1.200, 0.200, Color(Green), Color(White), False, True, True);
Call Subroutine(createMenuButton);
Event Player.newButton = Array(Custom String("Set End Point"), Custom String("setEndPoint"), Custom String("setEndPoint"), 3,
-1.500, -0.750, 1.200, 0.200, Color(Red), Color(White), False, True, True);
Call Subroutine(createMenuButton);
Event Player.newButton = Array(Custom String("Change Hero"), Custom String("changeHero"), Custom String("changeHero"), 3, 0, 0.750,
1.200, 0.200, Color(Aqua), Color(White), False, True, True);
Call Subroutine(createMenuButton);
Event Player.newButton = Array(Custom String("Enable NoClip"), Custom String("noClipToggle"), Custom String("noClipToggle"), 3, 0,
-0.750, 1.400, 0.200, Color(Green), Color(White), False, True, True);
Call Subroutine(createMenuButton);
Event Player.noclipButtonID = Event Player.lastMenuButtonID;
Event Player.newButton = Array(Custom String("Falloff Marker Type:"), Custom String("fVis+"), Custom String("fVis-"), 2.500, 1.600,
0.120, 1.250, 0.250, Color(White), Color(White), False, True, True);
Call Subroutine(createMenuButton);
Event Player.newButton = Array(Custom String("----"), Custom String("fVis+"), Custom String("fVis-"), 2.500, 1.600, -0.120, 1.250,
0.250, Color(Green), Color(White), False, True, True);
Call Subroutine(createMenuButton);
Event Player.visTypeButtonID = Event Player.lastMenuButtonID;
Call Subroutine(createFalloffVisEffects);
}
}
rule("Set player's damage falloff constants when player switches heroes")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.currentHero != Hero Of(Event Player);
}
actions
{
Event Player.specialPrefix = Custom String("{0}{1}", Hero Icon String(Hero Of(Event Player)), Global.data[1][Index Of Array Value(
First Of(Global.data), Hero Of(Event Player))]) == Null ? Custom String("") : Global.data[1][Index Of Array Value(First Of(
Global.data), Hero Of(Event Player))];
Event Player.maxBodyshotDamage = First Of(Global.data[2][Index Of Array Value(First Of(Global.data), Hero Of(Event Player))]);
Event Player.minBodyshotDamage = Global.data[2][Index Of Array Value(First Of(Global.data), Hero Of(Event Player))][1];
Event Player.headshotMultiplier = Global.data[2][Index Of Array Value(First Of(Global.data), Hero Of(Event Player))][2];
Event Player.falloffStartDistance = Global.data[2][Index Of Array Value(First Of(Global.data), Hero Of(Event Player))][3];
Event Player.falloffEndDistance = Global.data[2][Index Of Array Value(First Of(Global.data), Hero Of(Event Player))][4];
Event Player.currentHero = Hero Of(Event Player);
}
}
rule("Create start/end effects")
{
event
{
Ongoing - Global;
}
actions
{
"start sphere"
Create Effect(All Players(All Teams), Sphere, Green, Event Player.startPosition, 0.500, Visible To Position and Radius);
Create Effect(Local Player, Sphere, Color(Green), Local Player.startPosition, 0.500, Visible To Position and Radius);
"end sphere"
Create Effect(All Players(All Teams), Sphere, Red, Event Player.endPosition, 0.500, Visible To Position and Radius);
Create Effect(Local Player, Sphere, Color(Orange), Local Player.endPosition, 0.500, Visible To Position and Radius);
}
}
rule("Info HUDs")
rule("Set start location")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.currActionID == Custom String("setStartPoint");
}
actions
{
Create HUD Text(Event Player, Custom String("Live Damage: {0} / {1}", 120, 300), Null, Null, Left, False, White, White, White,
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Custom String("Experimental Damage: {0} / {1}", Min(120, Max(60, -2.400 * Distance Between(
Event Player.startPosition, Event Player.endPosition) + 264)), 2.500 * Min(120, Max(60, -2.400 * Distance Between(
Event Player.startPosition, Event Player.endPosition) + 264))), Null, Null, Left, True, Yellow, White, White,
Visible To and String, Default Visibility);
Create HUD Text(Event Player, Custom String("Distance: {0}", Distance Between(Event Player.startPosition,
Event Player.endPosition)), Null, Null, Left, -1, Green, White, White, Visible To and String, Default Visibility);
Event Player.startPosition = Eye Position(Event Player);
}
}
disabled rule("Noclip Module by josbird")
rule("Set end location")
{
event
{
Ongoing - Global;
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.currActionID == Custom String("setEndPoint");
}
actions
{
Event Player.endPosition = Eye Position(Event Player);
}
}
rule("Toggle noclip")
rule("Change heroes")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Ultimate) == True;
Event Player.currActionID == Custom String("changeHero");
}
actions
{
Event Player.IsNoclipping = !Event Player.IsNoclipping;
If(Event Player.IsNoclipping);
Event Player.restorePosition = Array(Position Of(Event Player), Facing Direction Of(Event Player));
Event Player.isInMenu = False;
"Force player back to hero select"
Set Player Allowed Heroes(Event Player, Remove From Array(Allowed Heroes(Event Player), Hero Of(Event Player)));
"Wait until in hero select"
Wait Until(!Has Spawned(Event Player), 10);
Set Player Allowed Heroes(Event Player, First Of(Global.data));
Wait Until(Has Spawned(Event Player), 9999);
Teleport(Event Player, First Of(Event Player.restorePosition));
Set Facing(Event Player, Event Player.restorePosition[1], To World);
}
}
rule("[SUB] Toggle noclip")
{
event
{
Subroutine;
ToggleNoClip;
}
actions
{
Event Player.isNoClipping = !Event Player.isNoClipping;
If(Event Player.isNoClipping);
Small Message(Event Player, Custom String("Noclip activated"));
Event Player.buttonModification = Array(Event Player.noclipButtonID, 0, Custom String("Disable NoClip"), 8, Color(Red));
Call Subroutine(modifyMenuButton);
Else;
Small Message(Event Player, Custom String("Noclip deactivated"));
Event Player.buttonModification = Array(Event Player.noclipButtonID, 0, Custom String("Enable NoClip"), 8, Color(Green));
Call Subroutine(modifyMenuButton);
End;
}
}
rule("Toggle noclip via menu")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.currActionID == Custom String("noClipToggle");
}
actions
{
Call Subroutine(ToggleNoClip);
}
}
rule("Cycle falloff visualization forward/backward")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
(Event Player.currActionID == Custom String("fVis+") || Event Player.currActionID == Custom String("fVis-")) == True;
}
actions
{
If(Event Player.currActionID == Custom String("fVis+"));
Event Player.falloffVis += 1;
If(Event Player.falloffVis == 4);
Event Player.falloffVis = 1;
End;
End;
If(Event Player.currActionID == Custom String("fVis-"));
Event Player.falloffVis -= 1;
If(Event Player.falloffVis == 0);
Event Player.falloffVis = 3;
End;
End;
Event Player._extendedPlayerCollection[3] = 0;
While(Event Player._extendedPlayerCollection[3] < Count Of(Event Player.falloffVisEffectIDs));
Destroy Effect(Event Player.falloffVisEffectIDs[Event Player._extendedPlayerCollection[3]]);
Event Player._extendedPlayerCollection[3] += 1;
End;
Call Subroutine(createFalloffVisEffects);
}
}
rule("Info HUDs")
{
event
{
Ongoing - Global;
}
actions
{
If(Global.allowUltForNoclip);
Create HUD Text(All Players(All Teams), Custom String("Press [{0}] to {1} noclip", Input Binding String(Button(Ultimate)),
Local Player.isNoClipping ? Custom String("disable") : Custom String("enable")), Null, Null, Left, 1,
Local Player.isNoClipping ? Color(Red) : Color(Green), Color(White), Color(White), Visible To String and Color,
Default Visibility);
End;
Create HUD Text(Local Player.isNoClipping ? Local Player : Null, Custom String("Hold [{0}] for fast flight", Input Binding String(
Button(Reload))), Null, Null, Left, 2, Is Button Held(Local Player, Button(Reload)) ? Color(White) : Color(Yellow), Color(
White), Color(White), Visible To String and Color, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("{0}{1}", Custom String("{0}{1}Damage: {2}", Hero Icon String(Hero Of(
Local Player)), Local Player.specialPrefix, Min(Local Player.maxBodyshotDamage, Max(Local Player.minBodyshotDamage, (
Local Player.maxBodyshotDamage - Local Player.minBodyshotDamage) / (
Local Player.falloffStartDistance - Local Player.falloffEndDistance) * Distance Between(Local Player.startPosition,
Local Player.endPosition) + (Local Player.maxBodyshotDamage - (Local Player.maxBodyshotDamage - Local Player.minBodyshotDamage)
/ (Local Player.falloffStartDistance - Local Player.falloffEndDistance) * Local Player.falloffStartDistance)))), Custom String(
" / {0} ({1}%)", Local Player.headshotMultiplier * Min(Local Player.maxBodyshotDamage, Max(Local Player.minBodyshotDamage, (
Local Player.maxBodyshotDamage - Local Player.minBodyshotDamage) / (
Local Player.falloffStartDistance - Local Player.falloffEndDistance) * Distance Between(Local Player.startPosition,
Local Player.endPosition) + (Local Player.maxBodyshotDamage - (Local Player.maxBodyshotDamage - Local Player.minBodyshotDamage)
/ (Local Player.falloffStartDistance - Local Player.falloffEndDistance) * Local Player.falloffStartDistance))),
Round To Integer(100 * Min(Local Player.maxBodyshotDamage, Max(Local Player.minBodyshotDamage, (
Local Player.maxBodyshotDamage - Local Player.minBodyshotDamage) / (
Local Player.falloffStartDistance - Local Player.falloffEndDistance) * Distance Between(Local Player.startPosition,
Local Player.endPosition) + (Local Player.maxBodyshotDamage - (Local Player.maxBodyshotDamage - Local Player.minBodyshotDamage)
/ (Local Player.falloffStartDistance - Local Player.falloffEndDistance) * Local Player.falloffStartDistance)))
/ Local Player.maxBodyshotDamage, Down))), Null, Null, Top, 1, Color(Yellow), Color(White), Color(White),
Visible To and String, Default Visibility);
Create HUD Text(All Players(All Teams), Custom String("Distance: {0}", Distance Between(Local Player.startPosition,
Local Player.endPosition)), Null, Null, Top, 2, Color(Green), Color(White), Color(White), Visible To and String,
Default Visibility);
Create HUD Text(Local Player.isInMenu ? Null : Local Player, Null, Null, Custom String("[{0}] Open Menu", Input Binding String(
Button(Interact))), Top, 3, Color(White), Color(White), Color(Green), Visible To and String, Default Visibility);
}
}
rule("Toggle noclip with ult button")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.allowUltForNoclip == True;
Is Button Held(Event Player, Button(Ultimate)) == True;
}
actions
{
Call Subroutine(ToggleNoClip);
}
}
rule("Start noclipping")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.IsNoclipping == True;
Event Player.isNoClipping == True;
}
actions
{
Set Gravity(Event Player, 0);
Disable Movement Collision With Environment(Event Player, True);
Disable Movement Collision With Players(Event Player);
Set Move Speed(Event Player, 0);
Disallow Button(Event Player, Button(Jump));
Disallow Button(Event Player, Button(Crouch));
}
}
rule("Stop noclipping")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.IsNoclipping == False;
Event Player.isNoClipping == False;
}
actions
{
Set Gravity(Event Player, 100);
Enable Movement Collision With Environment(Event Player);
Enable Movement Collision With Players(Event Player);
Set Move Speed(Event Player, 100);
Allow Button(Event Player, Button(Jump));
Allow Button(Event Player, Button(Crouch));
}
}
rule("Noclip propulsion")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.IsNoclipping == True;
(Is Button Held(Event Player, Crouch) || Is Button Held(Event Player, Jump) || Throttle Of(Event Player) != Vector(False, False,
False)) == True;
Event Player.isNoClipping == True;
(Is Button Held(Event Player, Button(Crouch)) || Is Button Held(Event Player, Button(Jump)) || Throttle Of(Event Player)
!= Left - Left) == True;
}
actions
{
Apply Impulse(Event Player, Velocity Of(Event Player) * -1, Speed Of(Event Player) * 0.030, To World, Incorporate Contrary Motion);
Apply Impulse(Event Player, Normalize(Facing Direction Of(Event Player) * Z Component Of(Throttle Of(Event Player))
+ World Vector Of(Left, Event Player, Rotation) * X Component Of(Throttle Of(Event Player)) + Up * (Is Button Held(
Event Player, Jump) - Is Button Held(Event Player, Crouch))), (60 + 400 * Is Button Held(Event Player, Reload) - Speed Of(
Event Player)) / 62.500, To World, Incorporate Contrary Motion);
Event Player, Button(Jump)) - Is Button Held(Event Player, Button(Crouch)))), (60 + 400 * Is Button Held(Event Player, Button(
Reload)) - Speed Of(Event Player)) / 62.500, To World, Incorporate Contrary Motion);
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Noclip air resistance")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.IsNoclipping == True;
(Is Button Held(Event Player, Crouch) || Is Button Held(Event Player, Jump) || Throttle Of(Event Player) != Vector(False, False,
False)) == False;
Event Player.isNoClipping == True;
(Is Button Held(Event Player, Button(Crouch)) || Is Button Held(Event Player, Button(Jump)) || Throttle Of(Event Player)
!= Left - Left) == False;
Speed Of(Event Player) > 0.010;
}
actions
{
Apply Impulse(Event Player, Velocity Of(Event Player) * -1, Speed Of(Event Player) * 0.060, To World, Incorporate Contrary Motion);
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒【Josbird's Cursor Menu】▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒")
{
event
{
Ongoing - Global;
}
}
rule("Global init")
{
event
{
Ongoing - Global;
}
actions
{
Global.textBudget = 128;
If(Workshop Setting Toggle(Custom String("Extra"), Custom String("Server load hud"), False, 0));
Create HUD Text(Host Player, Server Load Average, Custom String("Server Load"), Null, Right, -1, Color(Turquoise), Color(White),
Color(White), Visible To and String, Default Visibility);
Global.textBudget -= 1;
End;
Create HUD Text(Filtered Array(All Players(All Teams), Current Array Element.isInMenu), Null, Null, Custom String(
"Cursor Menu created by Josbird {0} Code: GETVX", Ability Icon String(Hero(Mercy), Button(Ultimate))), Right, -100, Color(
White), Color(White), Color(Turquoise), Visible To and String, Default Visibility);
Global.textBudget -= 1;
Global._extendedGlobalCollection[1] = Workshop Setting Real(Custom String("Josbird's Cursor Menu"), Custom String("Menu Width"), 5,
0, 10, 1);
Global._extendedGlobalCollection[2] = Workshop Setting Real(Custom String("Josbird's Cursor Menu"), Custom String("Menu Height"),
2.500, 0, 5, 2);
Global._extendedGlobalCollection[6] = Workshop Setting Toggle(Custom String("Josbird's Cursor Menu"), Custom String(
"Button click sounds"), True, 3);
Global._extendedGlobalCollection[5] = Workshop Setting Toggle(Custom String("Josbird's Cursor Menu"), Custom String(
"Debug mode (show button click areas)"), False, 4);
Global._extendedGlobalCollection[7] = Workshop Setting Toggle(Custom String("Josbird's Cursor Menu"), Custom String(
"Menu disables game hud"), True, 7);
Global._extendedGlobalCollection[3] = Custom String("━");
Global._extendedGlobalCollection[4] = Custom String("┃\n");
Global.exitButtonProperties = Array(Custom String("exit menu"), Global._extendedGlobalCollection[1] / 2 - 0.150,
Global._extendedGlobalCollection[2] / 2 - 0.150, 0.350);
}
}
rule("Destroy a menu button")
{
event
{
Subroutine;
destroyMenuButton;
}
actions
{
If(Event Player.destroyButtonID >= Count Of(Event Player.buttons) || !Event Player.buttons[Event Player.destroyButtonID]);
Log To Inspector(Custom String("[CursorMenu.destroyMenuButton] Error: tried to destroy an invalid button ID ({0})",
Event Player.destroyButtonID));
Else;
Global._arrayBuilder = Event Player.buttons[Event Player.destroyButtonID];
Global._arrayBuilder[15] = True;
Event Player.buttons[Event Player.destroyButtonID] = Global._arrayBuilder;
End;
}
}
rule("Get properties of a menu button")
{
event
{
Subroutine;
getButtonProperties;
}
actions
{
If(Event Player.getProperties >= Count Of(Event Player.buttons) || !Event Player.buttons[Event Player.getProperties]);
Log To Inspector(Custom String("[CursorMenu.getButtonProperties] Error: tried to access an invalid button ID ({0})",
Event Player.getProperties));
Else;
Event Player.getProperties = Array Slice(Event Player.buttons[Event Player.getProperties], 0, 13);
End;
}
}
rule("(For OSTW purposes only) Include all subroutines")
{
event
{
Ongoing - Each Player;
All;
All;
}
actions
{
If(Number Of Players(All Teams) < -9999);
Call Subroutine(createMenuButton);
Call Subroutine(destroyMenuButton);
Call Subroutine(modifyMenuButton);
Call Subroutine(getButtonProperties);
End;
}
}
rule("Toggle menu")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
!Is Dummy Bot(Event Player) == True;
Is Button Held(Event Player, Button(Interact)) == True;
!Is Communicating Any Emote(Event Player) == True;
}
actions
{
Event Player.isInMenu = !Event Player.isInMenu;
}
}
rule("Create menu cursor")
{
event
{
Subroutine;
createCursor;
}
actions
{
Create In-World Text(Filtered Array(Event Player, Total Time Elapsed % 0.032 < 0.016), Custom String("▲"), Update Every Frame(
Eye Position(Event Player) + 100 * (Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) * Cross Product(Facing Direction Of(Event Player),
Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90)) + (Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Event Player.menuOriginalFacing)) - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 3, Do Not Clip, Visible To Position and String, Color(White),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Create In-World Text(Filtered Array(Event Player, Total Time Elapsed % 0.032 >= 0.016), Custom String("▲"), Update Every Frame(
Eye Position(Event Player) + 100 * (Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) * Cross Product(Facing Direction Of(Event Player),
Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90)) + (Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Event Player.menuOriginalFacing)) - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 3, Do Not Clip, Visible To Position and String, Color(White),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
}
}
rule("Create menu border corners")
{
event
{
Subroutine;
createBorderCorners;
}
actions
{
Create In-World Text(Event Player, Custom String("┌"), Update Every Frame(Eye Position(Event Player) + 100 * (
Global._extendedGlobalCollection[1] * -1 / 2 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (Global._extendedGlobalCollection[2] / 2 - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position, Color(White),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Create In-World Text(Event Player, Custom String("┐"), Update Every Frame(Eye Position(Event Player) + 100 * (
Global._extendedGlobalCollection[1] / 2 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (Global._extendedGlobalCollection[2] / 2 - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position, Color(White),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Create In-World Text(Event Player, Custom String("└"), Update Every Frame(Eye Position(Event Player) + 100 * (
Global._extendedGlobalCollection[1] * -1 / 2 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (Global._extendedGlobalCollection[2] * -1 / 2 - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position, Color(White),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Create In-World Text(Event Player, Custom String("┘"), Update Every Frame(Eye Position(Event Player) + 100 * (
Global._extendedGlobalCollection[1] / 2 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (Global._extendedGlobalCollection[2] * -1 / 2 - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position, Color(White),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
}
}
rule("Create menu border edges")
{
event
{
Subroutine;
createBorderEdges;
}
actions
{
Global._extendedGlobalCollection[8] = Custom String("");
Event Player._extendedPlayerCollection[2] = 0;
While(Event Player._extendedPlayerCollection[2] < 23 / 5 * Global._extendedGlobalCollection[1] - 1);
Global._extendedGlobalCollection[8] = Custom String("{0}{1}", Global._extendedGlobalCollection[8],
Global._extendedGlobalCollection[3]);
Event Player._extendedPlayerCollection[2] += 1;
End;
Create In-World Text(Event Player, Global._extendedGlobalCollection[8], Update Every Frame(Eye Position(Event Player) + 100 * (
0 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)) + (
Global._extendedGlobalCollection[2] / 2 - 0.200) * Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90) + 3 * Facing Direction Of(
Event Player))), 4, Do Not Clip, Visible To and Position, Color(White), Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Global._extendedGlobalCollection[9] = Custom String("");
Event Player._extendedPlayerCollection[2] = 0;
While(Event Player._extendedPlayerCollection[2] < 23 / 5 * Global._extendedGlobalCollection[1] - 1);
Global._extendedGlobalCollection[9] = Custom String("{0}{1}", Global._extendedGlobalCollection[9],
Global._extendedGlobalCollection[3]);
Event Player._extendedPlayerCollection[2] += 1;
End;
Create In-World Text(Event Player, Global._extendedGlobalCollection[9], Update Every Frame(Eye Position(Event Player) + 100 * (
0 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)) + (
Global._extendedGlobalCollection[2] * -1 / 2 - 0.200) * Direction From Angles(Horizontal Angle From Direction(
Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)
+ 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position, Color(White), Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Global._extendedGlobalCollection[10] = Custom String("");
Event Player._extendedPlayerCollection[2] = 0.300;
While(Event Player._extendedPlayerCollection[2] < Global._extendedGlobalCollection[2]);
Global._extendedGlobalCollection[10] = Custom String("{0}{1}", Global._extendedGlobalCollection[10],
Global._extendedGlobalCollection[4]);
Event Player._extendedPlayerCollection[2] += 0.300;
End;
Create In-World Text(Event Player, Global._extendedGlobalCollection[10], Update Every Frame(Eye Position(Event Player) + 100 * (
Global._extendedGlobalCollection[1] / 2 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (-0.095 * Round To Integer(Global._extendedGlobalCollection[2] / 0.300, Down) - 0.200)
* Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position,
Color(White), Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Global._extendedGlobalCollection[11] = Custom String("");
Event Player._extendedPlayerCollection[2] = 0.300;
While(Event Player._extendedPlayerCollection[2] < Global._extendedGlobalCollection[2]);
Global._extendedGlobalCollection[11] = Custom String("{0}{1}", Global._extendedGlobalCollection[11],
Global._extendedGlobalCollection[4]);
Event Player._extendedPlayerCollection[2] += 0.300;
End;
Create In-World Text(Event Player, Global._extendedGlobalCollection[11], Update Every Frame(Eye Position(Event Player) + 100 * (
Global._extendedGlobalCollection[1] * -1 / 2 * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (-0.095 * Round To Integer(Global._extendedGlobalCollection[2] / 0.300, Down) - 0.200)
* Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 4, Do Not Clip, Visible To and Position,
Color(White), Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
}
}
rule("Create exit button")
{
event
{
Subroutine;
createExitButton;
}
actions
{
Create Icon(Event Player, Update Every Frame(Eye Position(Event Player) + 100 * (Global.exitButtonProperties[1] * Cross Product(
Facing Direction Of(Event Player), Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)) + (Global.exitButtonProperties[2] - 0.250)
* Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Facing Direction Of(Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), X, Position and Color, Absolute Value(
Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)) - Global.exitButtonProperties[1]) <= Global.exitButtonProperties[3] / 2 && Absolute Value(
Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)) - Global.exitButtonProperties[2]) <= Global.exitButtonProperties[3] / 2 ? Color(Yellow)
: Color(Red), False);
Event Player._extendedPlayerCollection[0] = Last Created Entity;
}
}
rule("Do button update")
{
event
{
Subroutine;
doButtonUpdate;
}
actions
{
Event Player._extendedPlayerCollection[2] = 0;
While(Event Player._extendedPlayerCollection[2] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player._extendedPlayerCollection[2]]);
If(Event Player.buttons[Event Player._extendedPlayerCollection[2]][15]);
If(Event Player.buttons[Event Player._extendedPlayerCollection[2]][14]);
Destroy In-World Text(Event Player.buttons[Event Player._extendedPlayerCollection[2]][13]);
End;
Event Player.buttons[Event Player._extendedPlayerCollection[2]] = Null;
Else If((
!Event Player.buttons[Event Player._extendedPlayerCollection[2]][12] && Event Player.buttons[Event Player._extendedPlayerCollection[2]][14])
|| !Event Player.isInMenu);
Destroy In-World Text(Event Player.buttons[Event Player._extendedPlayerCollection[2]][13]);
Global.textBudget += 1;
Global._arrayBuilder = Event Player.buttons[Event Player._extendedPlayerCollection[2]];
Global._arrayBuilder[14] = False;
Event Player.buttons[Event Player._extendedPlayerCollection[2]] = Global._arrayBuilder;
Else If(
Event Player.buttons[Event Player._extendedPlayerCollection[2]][12] && !Event Player.buttons[Event Player._extendedPlayerCollection[2]][14]);
Create In-World Text(Event Player, Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])
][10] ? Custom String("
{0}
", Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][0])
: Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][0], Update Every Frame(Eye Position(
Event Player) + 100 * (Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][4] * Cross Product(
Facing Direction Of(Event Player), Direction From Angles(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)) + (Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][5] - 0.200) * Direction From Angles(Horizontal Angle From Direction(
Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(Event Player)) - 90)
+ 3 * Facing Direction Of(Event Player))), Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][3],
Do Not Clip, Visible To Position String and Color, Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][11] && Absolute Value(Angle Difference(Horizontal Angle From Direction(
Facing Direction Of(Event Player)), Horizontal Angle From Direction(Event Player.menuOriginalFacing))
- Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][4]) <= Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][6] / 2 && Absolute Value(Angle Difference(Vertical Angle From Direction(
Facing Direction Of(Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing))
- Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][5]) <= Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][7] / 2 ? Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][9] : Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])
][8], Default Visibility);
Global._arrayBuilder = Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])];
Global._arrayBuilder[13] = Last Text ID;
Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])] = Global._arrayBuilder;
Global._arrayBuilder = Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])];
Global._arrayBuilder[14] = True;
Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])] = Global._arrayBuilder;
Global.textBudget -= 1;
End;
End;
Event Player._extendedPlayerCollection[2] += 1;
End;
}
}
rule("Create click areas")
{
event
{
Subroutine;
createClickAreas;
}
actions
{
Event Player._extendedPlayerCollection[2] = 0;
While(Event Player._extendedPlayerCollection[2] < Count Of(Event Player.buttons));
Create In-World Text(Event Player, Custom String("┌"), Update Every Frame(Eye Position(Event Player) + 100 * ((
Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][4] - Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][6] / 2) * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])
][5] + Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][7] / 2 - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 2, Do Not Clip, Visible To and Position,
!Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][12] ? Custom Color(0, 0, 0, 0) : (
Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][11] ? Color(Yellow) : Color(White)),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Create In-World Text(Event Player, Custom String("┘"), Update Every Frame(Eye Position(Event Player) + 100 * ((
Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][4] + Event Player.buttons[Evaluate Once(
Event Player._extendedPlayerCollection[2])][6] / 2) * Cross Product(Facing Direction Of(Event Player), Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90)) + (Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])
][5] - Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][7] / 2 - 0.200) * Direction From Angles(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(Facing Direction Of(
Event Player)) - 90) + 3 * Facing Direction Of(Event Player))), 2, Do Not Clip, Visible To and Position,
!Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][12] ? Custom Color(0, 0, 0, 0) : (
Event Player.buttons[Evaluate Once(Event Player._extendedPlayerCollection[2])][11] ? Color(Yellow) : Color(White)),
Default Visibility);
Modify Player Variable(Event Player, menuFrame, Append To Array, Last Text ID);
Global.textBudget -= 1;
Event Player._extendedPlayerCollection[2] += 1;
End;
}
}
rule("Open menu")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
!Is Dummy Bot(Event Player) == True;
Event Player.isInMenu == True;
}
actions
{
Set Aim Speed(Event Player, 15);
Event Player.menuOriginalFacing = Facing Direction Of(Event Player);
Set Primary Fire Enabled(Event Player, False);
Set Secondary Fire Enabled(Event Player, False);
If(Global._extendedGlobalCollection[7]);
Disable Hero HUD(Event Player);
End;
Event Player.menuFrame = Empty Array;
Call Subroutine(createCursor);
Wait(0.016, Ignore Condition);
Call Subroutine(createBorderCorners);
Call Subroutine(createBorderEdges);
Wait(0.016, Ignore Condition);
Call Subroutine(createExitButton);
Wait(0.016, Ignore Condition);
Call Subroutine(doButtonUpdate);
If(Global._extendedGlobalCollection[5]);
Call Subroutine(createClickAreas);
End;
}
}
rule("Menu loading hud")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Workshop Setting Toggle(Custom String("Josbird's Cursor Menu"), Custom String("Loading hud"), True, 6) == True;
Event Player.isInMenu == True;
}
actions
{
Create HUD Text(Event Player, Custom String("loading menu..."), Null, Null, Top, 3, Color(Turquoise), Color(White), Color(White),
None, Default Visibility);
Event Player._extendedPlayerCollection[1] = Last Text ID;
Global.textBudget -= 1;
Wait(1, Ignore Condition);
Destroy HUD Text(Event Player._extendedPlayerCollection[1]);
Global.textBudget += 1;
}
}
rule("Close menu")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
!Is Dummy Bot(Event Player) == True;
!Event Player.isInMenu == True;
}
actions
{
Set Aim Speed(Event Player, 100);
Set Primary Fire Enabled(Event Player, True);
Set Secondary Fire Enabled(Event Player, True);
If(Global._extendedGlobalCollection[7]);
Enable Hero HUD(Event Player);
End;
Event Player._extendedPlayerCollection[2] = 0;
While(Event Player._extendedPlayerCollection[2] < Count Of(Event Player.menuFrame));
Destroy In-World Text(Event Player.menuFrame[Event Player._extendedPlayerCollection[2]]);
Global.textBudget += 1;
Event Player._extendedPlayerCollection[2] += 1;
End;
Destroy Icon(First Of(Event Player._extendedPlayerCollection));
Call Subroutine(doButtonUpdate);
}
}
rule("Check for button update")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.isInMenu == True;
Is True For Any(Event Player.buttons, Current Array Element[15] || (!Current Array Element[12] && Current Array Element[14]) || (
Current Array Element[12] && !Current Array Element[14])) == True;
}
actions
{
Call Subroutine(doButtonUpdate);
Wait(0.016, Ignore Condition);
}
}
rule("Detect primary fire button press")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.isInMenu == True;
Is Button Held(Event Player, Button(Primary Fire)) == True;
}
actions
{
If(Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[1])
<= Global.exitButtonProperties[3] / 2 && Absolute Value(Angle Difference(Vertical Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[2])
<= Global.exitButtonProperties[3] / 2);
Event Player.currActionID = First Of(Global.exitButtonProperties);
End;
Event Player._extendedPlayerCollection[4] = 0;
While(Event Player._extendedPlayerCollection[4] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player._extendedPlayerCollection[4]][11] && Absolute Value(Angle Difference(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player._extendedPlayerCollection[4]][4])
<= Event Player.buttons[Event Player._extendedPlayerCollection[4]][6] / 2 && Absolute Value(Angle Difference(
Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player._extendedPlayerCollection[4]][5])
<= Event Player.buttons[Event Player._extendedPlayerCollection[4]][7] / 2);
Event Player.currActionID = Event Player.buttons[Event Player._extendedPlayerCollection[4]][1];
End;
Event Player._extendedPlayerCollection[4] += 1;
End;
If(Event Player.currActionID && Global._extendedGlobalCollection[6]);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 30);
End;
Wait(0.016, Ignore Condition);
Event Player.currActionID = Null;
}
}
rule("Detect secondary fire button press")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.isInMenu == True;
Is Button Held(Event Player, Button(Secondary Fire)) == True;
}
actions
{
If(Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[1])
<= Global.exitButtonProperties[3] / 2 && Absolute Value(Angle Difference(Vertical Angle From Direction(Facing Direction Of(
Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing)) - Global.exitButtonProperties[2])
<= Global.exitButtonProperties[3] / 2);
Event Player.currActionID = First Of(Global.exitButtonProperties);
End;
Event Player._extendedPlayerCollection[5] = 0;
While(Event Player._extendedPlayerCollection[5] < Count Of(Event Player.buttons));
If(Event Player.buttons[Event Player._extendedPlayerCollection[5]][11] && Absolute Value(Angle Difference(
Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player._extendedPlayerCollection[5]][4])
<= Event Player.buttons[Event Player._extendedPlayerCollection[5]][6] / 2 && Absolute Value(Angle Difference(
Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)) - Event Player.buttons[Event Player._extendedPlayerCollection[5]][5])
<= Event Player.buttons[Event Player._extendedPlayerCollection[5]][7] / 2);
Event Player.currActionID = Event Player.buttons[Event Player._extendedPlayerCollection[5]][2];
End;
Event Player._extendedPlayerCollection[5] += 1;
End;
If(Event Player.currActionID && Global._extendedGlobalCollection[6]);
Play Effect(Event Player, Explosion Sound, Color(White), Event Player, 30);
End;
Wait(0.016, Ignore Condition);
Event Player.currActionID = Null;
}
}
rule("Action ID: Exit menu")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.currActionID == Custom String("exit menu");
}
actions
{
Event Player.isInMenu = False;
}
}
rule("Cursor bounds")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.isInMenu == True;
(Absolute Value(Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)),
Horizontal Angle From Direction(Event Player.menuOriginalFacing)))
> Global._extendedGlobalCollection[1] / 2 + 0.050 || Absolute Value(Angle Difference(Vertical Angle From Direction(
Facing Direction Of(Event Player)), Vertical Angle From Direction(Event Player.menuOriginalFacing)))
> Global._extendedGlobalCollection[2] / 2 + 0.050) == True;
}
actions
{
Set Facing(Event Player, Direction From Angles(Min(Max(Horizontal Angle From Direction(Event Player.menuOriginalFacing)
- Angle Difference(Horizontal Angle From Direction(Facing Direction Of(Event Player)), Horizontal Angle From Direction(
Event Player.menuOriginalFacing)), Horizontal Angle From Direction(Event Player.menuOriginalFacing)
- Global._extendedGlobalCollection[1] / 2), Horizontal Angle From Direction(Event Player.menuOriginalFacing)
+ Global._extendedGlobalCollection[1] / 2), Min(Max(Vertical Angle From Direction(Event Player.menuOriginalFacing)
- Angle Difference(Vertical Angle From Direction(Facing Direction Of(Event Player)), Vertical Angle From Direction(
Event Player.menuOriginalFacing)), Vertical Angle From Direction(Event Player.menuOriginalFacing)
- Global._extendedGlobalCollection[2] / 2), Vertical Angle From Direction(Event Player.menuOriginalFacing)
+ Global._extendedGlobalCollection[2] / 2)), To World);
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Text budget warning")
{
event
{
Ongoing - Global;
}
conditions
{
Global.textBudget < 0;
}
actions
{
Small Message(Host Player, Custom String("{0} Warning! Text budget exceeded! {0}", Icon String(Warning)));
}
}
rule("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒a")
{
event
{
Ongoing - Global;
}
}