Create
Return to post

Comparing difference between and

View raw
  • 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;
  • }
  • }
Join the Workshop.codes Discord