variables
{
player:
21: nearbyPlayers
22: beamDistance
23: checkPos
24: mercyBeamTarget
25: beaming
}
subroutines
{
1: ResetMercyTarget
2: GetMercyBeamTarget
}
rule("[sub] Get Mercy Beam target")
{
event
{
Subroutine;
GetMercyBeamTarget;
}
actions
{
Event Player.mercyBeamTarget = Null;
Event Player.nearbyPlayers = Players Within Radius(Position Of(Event Player), 15.500, Team Of(Event Player), Surfaces);
Event Player.nearbyPlayers = Filtered Array(Event Player.nearbyPlayers, Current Array Element != Event Player);
Event Player.nearbyPlayers = Sorted Array(Event Player.nearbyPlayers, Angle Between Vectors(Facing Direction Of(Event Player),
Direction Towards(Eye Position(Event Player), Position Of(Current Array Element) + Vector(0, 1.450, 0))) + Distance Between(
Position Of(Event Player), Position Of(Current Array Element)) * 0.406);
Wait(0.032, Ignore Condition);
For Player Variable(Event Player, I, 0, Count Of(Event Player.nearbyPlayers), 1);
Event Player.beamDistance = Distance Between(Position Of(Event Player), Position Of(Event Player.nearbyPlayers[Event Player.I]));
Event Player.checkPos = Eye Position(Event Player) + Facing Direction Of(Event Player) * Event Player.beamDistance;
For Player Variable(Event Player, J, 1.505, -0.100, -0.150);
If(Distance Between(Event Player.checkPos, Position Of(Event Player.nearbyPlayers[Event Player.I]) + Vector(0, Event Player.J, 0))
<= 0.461 + 0.348 * Event Player.beamDistance);
Event Player.mercyBeamTarget = Event Player.nearbyPlayers[Event Player.I];
Abort;
End;
End;
End;
}
}
rule("[sub] Reset Mercy Beam target")
{
event
{
Subroutine;
ResetMercyTarget;
}
actions
{
Event Player.mercyBeamTarget = Null;
Event Player.beaming = False;
}
}
rule("No longer firing beam - Reset Target")
{
event
{
Ongoing - Each Player;
All;
Mercy;
}
conditions
{
Is Firing Primary(Event Player) == False;
Is Firing Secondary(Event Player) == False;
}
actions
{
Call Subroutine(ResetMercyTarget);
}
}
rule("Beam distance check")
{
event
{
Ongoing - Each Player;
All;
Mercy;
}
conditions
{
Event Player.beaming == True;
(Is Firing Primary(Event Player) || Is Firing Secondary(Event Player)) == True;
Is Using Ultimate(Event Player) == False;
}
actions
{
While(Distance Between(Position Of(Event Player.mercyBeamTarget), Position Of(Event Player)) <= 15.500);
Wait(0.016, Ignore Condition);
Wait Until(Distance Between(Event Player.mercyBeamTarget, Event Player) > 15.500 || (Is Firing Primary(Event Player)
== False && Is Firing Secondary(Event Player) == False), 9999);
Wait Until(Distance Between(Event Player.mercyBeamTarget, Event Player) <= 15.500 || (Is Firing Primary(Event Player)
== False && Is Firing Secondary(Event Player) == False), 1.264);
If((Is Firing Primary(Event Player) || Is Firing Secondary(Event Player)) == False);
Break;
End;
End;
Call Subroutine(ResetMercyTarget);
}
}
rule("Using beam")
{
event
{
Ongoing - Each Player;
All;
Mercy;
}
conditions
{
Is Alive(Event Player) == True;
(Is Firing Primary(Event Player) || Is Firing Secondary(Event Player)) == True;
Event Player.beaming == False;
Hero Of(Event Player) == Hero(Mercy);
Weapon(Event Player) == 1;
}
actions
{
Call Subroutine(GetMercyBeamTarget);
If(Distance Between(Event Player.mercyBeamTarget, Event Player) <= 15.500 && Event Player.mercyBeamTarget != Null);
Event Player.beaming = True;
End;
Wait(0.016, Ignore Condition);
Loop If Condition Is True;
}
}
rule("Player dealt healing")
{
event
{
Player Dealt Healing;
All;
Mercy;
}
actions
{
Event Player.mercyBeamTarget = Healee;
}
}
rule("Flash heal bonus health")
{
event
{
Ongoing - Each Player;
All;
All;
}
conditions
{
Is Button Held(Event Player, Button(Reload)) == True;
(Ability Charge(Event Player, Button(Reload)) != 0 || Ability Cooldown(Event Player, Button(Reload)) == 0) == True;
Hero Of(Event Player) == Hero(Mercy);
Event Player.mercyBeamTarget != Null;
Normalized Health(Event Player.mercyBeamTarget) == 1;
}
actions
{
Wait(0.250, Ignore Condition);
Add Health Pool To Player(Event Player.mercyBeamTarget, Health, 50, False, True);
Wait(3, Ignore Condition);
Remove Health Pool From Player(Last Created Health Pool);
}
}
That should do the trick, just copy and paste it in and as long as you don’t have 21 player variables or any subroutines you should be alright, if you do, just change the numbers in the top few rows. Lots of the hard work for finding the beam target was done year ago by Workshop.Codes user Lotto for their code PTMZ4 ([Beta] Mercy Guardian Angel / Beam targetting) - wish I could link.
Hope it works as you want it to! Any other troubles and here to help!