UI/HitMarker.cs
using Sandbox.Utility;
public sealed class HitMarker : Component
{
TimeSince timeSinceBorn;
[Property] public Color Color { get; set; } = Color.White;
protected override void OnEnabled()
{
base.OnEnabled();
timeSinceBorn = 0;
}
protected override void OnPreRender()
{
if ( Scene.Camera is null ) return;
var delta = (timeSinceBorn.Relative % 2).Remap( 0, 0.4f );
if ( delta >= 1 )
{
DestroyGameObject();
return;
}
delta = Easing.EaseIn( delta );
var hud = Scene.Camera.Hud;
var pos = Scene.Camera.PointToScreenPixels( WorldPosition, out bool isBehind );
if ( isBehind )
return;
var left = Vector2.Left + Vector2.Up;
var up = Vector2.Left - Vector2.Up;
var color = Color.WithAlpha( 1 - MathF.Pow( delta, 4 ) );
var t = 3;
var a = 2;
var b = 8;
var corners = new Vector4( 100 );
hud.DrawLine( pos + left * a, pos + left * b, t, color, corners );
hud.DrawLine( pos - left * a, pos - left * b, t, color, corners );
hud.DrawLine( pos + up * a, pos + up * b, t, color, corners );
hud.DrawLine( pos - up * a, pos - up * b, t, color, corners );
}
public static void CreateFromTrace( SceneTraceResult tr )
{
if ( !tr.Hit ) return;
var hitPlayer = tr.GameObject.GetComponent<Player>();
if ( !hitPlayer.IsValid() )
return;
bool wasHeadshot = tr.Hitbox?.Tags?.Contains( "head" ) ?? false;
CreateAt( tr.HitPosition, wasHeadshot, hitPlayer.Armour > 0f );
}
public static void CreateAt( Vector3 position, bool isHeadshot = false, bool hasArmor = false )
{
var prefab = isHeadshot ? "items/hitmarker/hitmarker.head.prefab" : "items/hitmarker/hitmarker.prefab";
if ( hasArmor ) prefab = "items/hitmarker/hitmarker.armor.prefab";
var go = GameObject.Clone( prefab );
go.WorldPosition = position;
}
}