Return to post
variables
{
global:
26: cfg_CamDistance
27: cfg_CamRaycastsEyePos
28: cfg_CamHasCrosshairCorrection
29: cfg_CamOverridesGame
30: cfg_CamOverridesEmotes
31: cfg_CamOffset
32: cfg_CamAimDistance
33: cfg_CamBlendSpeed
34: cfg_ScopesDisableCam
35: cfg_StartWithCamActive
114: cfg_CamDistance
115: cfg_CamRaycastsEyePos
116: cfg_CamHasCrosshairCorrection
117: cfg_CamOverridesGame
118: cfg_CamOverridesEmotes
119: cfg_CamOffset
120: cfg_CamAimDistance
121: cfg_CamBlendSpeed
122: cfg_ScopesDisableCam
123: cfg_StartWithCamActive
player:
26: plyr_CamDistance
27: plyr_CamRaycastsEyePos
28: plyr_CamHasCrosshairCorrection
29: plyr_CamOverridesGame
30: plyr_CamOverridesEmotes
31: plyr_CamOffset
32: plyr_CamAimDistance
33: plyr_CamActive
34: plyr_CamBlendSpeed
35: plyr_ScopesDisableCam
107: plyr_CamDistance
108: plyr_CamRaycastsEyePos
109: plyr_CamHasCrosshairCorrection
110: plyr_CamOverridesGame
111: plyr_CamOverridesEmotes
112: plyr_CamOffset
113: plyr_CamAimDistance
114: plyr_CamActive
115: plyr_CamBlendSpeed
116: plyr_ScopesDisableCam
}
subroutines
{
8: StartPlayerCam
9: StopPlayerCam
10: StartAllCams
11: StopAllCams
12: ResetPlayerCamSettings
14: RefreshCam
112: StartPlayerCam
113: StopPlayerCam
114: StartAllCams
115: StopAllCams
116: ResetPlayerCamSettings
117: RefreshCam
}
rule("Configuration")
{
event
{
Ongoing - Global;
}
actions
{
"Controls how far behind the player's head camera will be."
Global.cfg_CamDistance = Workshop Setting Real(Custom String("3p camera position"), Custom String("Distance from eye position"), 1,
0, 100);
0, 100, 1);
"Determines whether the camera will check for surfaces behind the player. Setting this to False can reduce server load, but may result in the camera clipping into terrain."
Global.cfg_CamRaycastsEyePos = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String(
"Camera raycasts eye position (may increase server load)"), True);
"Camera raycasts eye position (may increase server load)"), True, 3);
"Controls the offset of the camera from the player's facing direction. X affects the left/right offset, Y controls the up/down offset, and Z controls the forward/back offset. Any X or Y offset can result in misalignment of the player crosshair."
Global.cfg_CamOffset = Vector(Workshop Setting Real(Custom String("3p camera position"), Custom String(
"X offset (positive = left, negative = right)"), -0.500, -100, 100), Workshop Setting Real(Custom String("3p camera position"),
Custom String("Y offset (positive = up, negative = down)"), 0, -100, 100), Workshop Setting Real(Custom String(
"3p camera position"), Custom String("Z offset (positive = forward, negative = backward)"), 0, -100, 100));
"X offset (positive = left, negative = right)"), -0.500, -100, 100, 2), Workshop Setting Real(Custom String(
"3p camera position"), Custom String("Y offset (positive = up, negative = down)"), 0, -100, 100, 3), Workshop Setting Real(
Custom String("3p camera position"), Custom String("Z offset (positive = forward, negative = backward)"), 0, -100, 100, 4));
"Determines whether or not the camera will attempt to place the crosshair directly over what the hero is aiming at. Setting this to True will increase server load. Aim may also feel somewhat jittery, especially when cfg_CamOffset is large."
Global.cfg_CamHasCrosshairCorrection = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String(
"Crosshair correction (may cause jitter/increase server load)"), False);
"Crosshair correction (may cause jitter/increase server load)"), False, 4);
"Determines the distance at which the crosshair will be exactly accurate to the hero's target. If set to 0, the crosshair aiming line will be parallel to the hero aiming line. (If cfg_CamCrosshairCorrection is enabled, this setting is ignored.)"
Global.cfg_CamAimDistance = Workshop Setting Real(Custom String("3p camera settings"), Custom String(
"Aim convergence distance (overriden by crosshair correction)"), 0, 50, 1000);
"Aim convergence distance (overriden by crosshair correction)"), 0, 50, 1000, 1);
"Controls the blend speed of the camera."
Global.cfg_CamBlendSpeed = Workshop Setting Real(Custom String("3p camera settings"), Custom String("Blend speed"), 75, 0, 1000);
Global.cfg_CamBlendSpeed = Workshop Setting Real(Custom String("3p camera settings"), Custom String("Blend speed"), 75, 0, 1000,
2);
"Determines whether the camera will override the game's native third person cameras, such as Reinhardt's shield or Hammond's ball form."
Global.cfg_CamOverridesGame = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String(
"Native 3p override (such as Reinhardt's Shield or Hammond's Ball form)"), True);
"Native 3p override (such as Reinhardt's Shield or Hammond's Ball form)"), True, 6);
"Determines whether or not the camera will override the third person emoting camera."
Global.cfg_CamOverridesEmotes = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String("Emote override"),
True);
Global.cfg_CamOverridesEmotes = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String("Emote override"), True,
5);
"Determines whether scopes such as Ana's, Widow's, or Ashe's disable the camera."
Global.cfg_ScopesDisableCam = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String("Scopes disable camera"),
True);
True, 8);
Global.cfg_StartWithCamActive = Workshop Setting Toggle(Custom String("3p camera settings"), Custom String(
"Players start with camera on"), True);
"Players start with camera on"), True, 7);
}
}
rule("Start cams")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Global.cfg_StartWithCamActive == True;
}
actions
{
Call Subroutine(ResetPlayerCamSettings);
Call Subroutine(StartPlayerCam);
}
}
rule("[Subroutine] StartPlayerCam")
{
event
{
Subroutine;
StartPlayerCam;
}
actions
{
"Activates a particular player's camera. Make sure not to call this subroutine from a Global rule."
Event Player.plyr_CamActive = True;
}
}
rule("[Subroutine] StopPlayerCam")
{
event
{
Subroutine;
StopPlayerCam;
}
actions
{
"Deactivates a particular player's camera. Make sure not to call this subroutine from a Global rule."
Event Player.plyr_CamActive = False;
}
}
rule("[Subroutine] StartAllCams")
{
event
{
Subroutine;
StartAllCams;
}
actions
{
"Activates all players' cameras."
All Players(All Teams).plyr_CamActive = True;
}
}
rule("[Subroutine] StopAllCams")
{
event
{
Subroutine;
StopAllCams;
}
actions
{
"Deactivates all players' cameras."
All Players(All Teams).plyr_CamActive = False;
}
}
rule("[Subroutine] ResetPlayerCamSettings")
{
event
{
Subroutine;
ResetPlayerCamSettings;
}
actions
{
"Resets a particular player's camera settings back to the defaults listed in Configuration. Make sure not to call this subroutine from a Global rule."
Event Player.plyr_CamDistance = Global.cfg_CamDistance;
Event Player.plyr_CamRaycastsEyePos = Global.cfg_CamRaycastsEyePos;
Event Player.plyr_CamOffset = Global.cfg_CamOffset;
Event Player.plyr_CamHasCrosshairCorrection = Global.cfg_CamHasCrosshairCorrection;
Event Player.plyr_CamAimDistance = Global.cfg_CamAimDistance;
Event Player.plyr_CamBlendSpeed = Global.cfg_CamBlendSpeed;
Event Player.plyr_CamOverridesGame = Global.cfg_CamOverridesGame;
Event Player.plyr_CamOverridesEmotes = Global.cfg_CamOverridesEmotes;
Event Player.plyr_ScopesDisableCam = Global.cfg_ScopesDisableCam;
}
}
rule("[Subroutine] ResetAllCamSettings")
{
event
{
Subroutine;
Sub0;
}
actions
{
"Resets all players' camera settings back to the defaults listed in Configuration."
All Players(All Teams).plyr_CamDistance = Global.cfg_CamDistance;
All Players(All Teams).plyr_CamRaycastsEyePos = Global.cfg_CamRaycastsEyePos;
All Players(All Teams).plyr_CamOffset = Global.cfg_CamOffset;
All Players(All Teams).plyr_CamHasCrosshairCorrection = Global.cfg_CamHasCrosshairCorrection;
All Players(All Teams).plyr_CamAimDistance = Global.cfg_CamAimDistance;
All Players(All Teams).plyr_CamBlendSpeed = Global.cfg_CamBlendSpeed;
All Players(All Teams).plyr_CamOverridesGame = Global.cfg_CamOverridesGame;
All Players(All Teams).plyr_CamOverridesEmotes = Global.cfg_CamOverridesEmotes;
All Players(All Teams).plyr_ScopesDisableCam = Global.cfg_ScopesDisableCam;
}
}
rule("[Subroutine] RefreshCam")
{
event
{
Subroutine;
RefreshCam;
}
actions
{
Skip If(!Event Player.plyr_ScopesDisableCam, 1);
"Refreshes a particular player's camera. Call this after changing a player's camera settings. Make sure not to call this subroutine from a Global rule."
Stop Camera(Event Player);
If(Event Player.plyr_CamActive);
If(!Event Player.plyr_CamRaycastsEyePos && !Event Player.plyr_CamHasCrosshairCorrection);
Start Camera(Event Player, Eye Position(Event Player) + World Vector Of(Event Player.plyr_CamOffset, Event Player, Rotation)
+ Facing Direction Of(Event Player) * -1 * Event Player.plyr_CamDistance, Eye Position(Event Player) + (
Event Player.plyr_CamAimDistance <= 0 ? World Vector Of(Event Player.plyr_CamOffset, Event Player, Rotation)
: Facing Direction Of(Event Player) * Event Player.plyr_CamAimDistance), Event Player.plyr_CamBlendSpeed);
Else If(Event Player.plyr_CamRaycastsEyePos && !Event Player.plyr_CamHasCrosshairCorrection);
Start Camera(Event Player, Ray Cast Hit Position(Eye Position(Event Player) + World Vector Of(Event Player.plyr_CamOffset,
Event Player, Rotation), Eye Position(Event Player) + World Vector Of(Event Player.plyr_CamOffset, Event Player, Rotation)
+ Facing Direction Of(Event Player) * -1 * Event Player.plyr_CamDistance, Null, All Players(All Teams), True), Eye Position(
Event Player) + (Event Player.plyr_CamAimDistance <= 0 ? World Vector Of(Event Player.plyr_CamOffset, Event Player, Rotation)
: Facing Direction Of(Event Player) * Event Player.plyr_CamAimDistance), Event Player.plyr_CamBlendSpeed);
Else If(!Event Player.plyr_CamRaycastsEyePos && Event Player.plyr_CamHasCrosshairCorrection);
Start Camera(Event Player, Eye Position(Event Player) + World Vector Of(Event Player.plyr_CamOffset, Event Player, Rotation)
+ Facing Direction Of(Event Player) * -1 * Event Player.plyr_CamDistance, Ray Cast Hit Position(Eye Position(Event Player),
Eye Position(Event Player) + Facing Direction Of(Event Player) * 300, All Players(Opposite Team Of(Team Of(Event Player))),
All Players(Team Of(Event Player)), True), Event Player.plyr_CamBlendSpeed);
Else If(Event Player.plyr_CamRaycastsEyePos && Event Player.plyr_CamHasCrosshairCorrection);
Start Camera(Event Player, Ray Cast Hit Position(Eye Position(Event Player) + World Vector Of(Event Player.plyr_CamOffset,
Event Player, Rotation), Eye Position(Event Player) + World Vector Of(Event Player.plyr_CamOffset, Event Player, Rotation)
+ Facing Direction Of(Event Player) * -1 * Event Player.plyr_CamDistance, Null, All Players(All Teams), True),
Ray Cast Hit Position(Eye Position(Event Player), Eye Position(Event Player) + Facing Direction Of(Event Player) * 300,
All Players(Opposite Team Of(Team Of(Event Player))), All Players(Team Of(Event Player)), True),
Event Player.plyr_CamBlendSpeed);
Else;
Small Message(Host Player, Custom String("Camera error - {0}", Event Player));
End;
End;
}
}
rule("Activate camera")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Deactivate camera")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override shields start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Reinhardt), Hero(Brigitte)), Hero Of(Event Player)) || Array Contains(Array(Hero(Reinhardt), Hero(
Brigitte)), Hero Being Duplicated(Event Player))) == True;
Is Firing Secondary(Event Player) == True;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override shields stop")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Reinhardt), Hero(Brigitte)), Hero Of(Event Player)) || Array Contains(Array(Hero(Reinhardt), Hero(
Brigitte)), Hero Being Duplicated(Event Player))) == True;
Is Firing Secondary(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override ability 1s start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Mei), Hero(Wrecking Ball)), Hero Of(Event Player)) || Array Contains(Array(Hero(Mei), Hero(
Wrecking Ball)), Hero Being Duplicated(Event Player))) == True;
Is Using Ability 1(Event Player) == True;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override ability 1s stop")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Mei), Hero(Wrecking Ball)), Hero Of(Event Player)) || Array Contains(Array(Hero(Mei), Hero(
Wrecking Ball)), Hero Being Duplicated(Event Player))) == True;
Is Using Ability 1(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override Reaper tp start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Reaper)), Hero Of(Event Player)) || Array Contains(Array(Hero(Reaper)), Hero Being Duplicated(
Event Player))) == True;
Is Using Ability 2(Event Player) == True;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override Reaper tp stop")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Reaper)), Hero Of(Event Player)) || Array Contains(Array(Hero(Reaper)), Hero Being Duplicated(
Event Player))) == True;
Is Using Ability 2(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override ults start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Reaper), Hero(Zenyatta)), Hero Of(Event Player)) || Array Contains(Array(Hero(Reaper), Hero(Zenyatta)),
Hero Being Duplicated(Event Player))) == True;
Is Using Ultimate(Event Player) == True;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override ults stop")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesGame == True;
(Array Contains(Array(Hero(Reaper), Hero(Zenyatta)), Hero Of(Event Player)) || Array Contains(Array(Hero(Reaper), Hero(Zenyatta)),
Hero Being Duplicated(Event Player))) == True;
Is Using Ultimate(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Cancel cam for junk ult start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
(Array Contains(Array(Hero(Junkrat)), Hero Of(Event Player)) || Array Contains(Array(Hero(Junkrat)), Hero Being Duplicated(
Event Player))) == True;
Is Using Ultimate(Event Player) == True;
}
actions
{
Stop Camera(Event Player);
}
}
rule("Cancel cam for junk ult stop")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
(Array Contains(Array(Hero(Junkrat)), Hero Of(Event Player)) || Array Contains(Array(Hero(Junkrat)), Hero Being Duplicated(
Event Player))) == True;
Is Using Ultimate(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override emote start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesEmotes == True;
Is Communicating Any Emote(Event Player) == True;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Override emote stop")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
Event Player.plyr_CamOverridesEmotes == True;
Is Communicating Any Emote(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}
rule("Disable on scope start")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Event Player.plyr_CamActive == True;
(Array Contains(Array(Hero(Ana), Hero(Ashe), Hero(Widowmaker)), Hero Of(Event Player)) || Array Contains(Array(Hero(Ashe), Hero(
Ana), Hero(Widowmaker)), Hero Being Duplicated(Event Player))) == True;
Is Firing Secondary(Event Player) == True;
}
actions
{
Wait(0.100, Abort When False);
Stop Camera(Event Player);
While(Is Button Held(Event Player, Secondary Fire) && Ammo(Event Player, 0) > 0);
While(Is Button Held(Event Player, Button(Secondary Fire)) && Ammo(Event Player, 0) > 0);
Wait(0.016, Ignore Condition);
End;
Call Subroutine(RefreshCam);
}
}
rule("Echo cam bugfix")
{
event
{
Ongoing - Each Player;
All;
Echo;
}
conditions
{
Event Player.plyr_CamActive == True;
Is Duplicating(Event Player) == False;
}
actions
{
Call Subroutine(RefreshCam);
}
}