using Sandbox; using System.ComponentModel; using LuckerGame.Minigames.FpsTest.Weapons; namespace LuckerGame.Minigames.FpsTest; public partial class Pawn : AnimatedEntity { [Net, Predicted] public FpsWeapon ActiveFpsWeapon { get; set; } public Vector3 InputDirection { get => PropertyProxy?.InputDirection ?? Vector3.Zero; set { if ( PropertyProxy == null ) return; PropertyProxy.InputDirection = value; } } public Angles ViewAngles { get => PropertyProxy?.ViewAngles ?? Angles.Zero; set { if ( PropertyProxy == null ) return; PropertyProxy.ViewAngles = value; } } /// /// Position a player should be looking from in world space. /// [Browsable( false )] public Vector3 EyePosition { get => Transform.PointToWorld( EyeLocalPosition ); set => EyeLocalPosition = Transform.PointToLocal( value ); } /// /// Position a player should be looking from in local to the entity coordinates. /// [Net, Predicted, Browsable( false )] public Vector3 EyeLocalPosition { get; set; } /// /// Rotation of the entity's "eyes", i.e. rotation for the camera when this entity is used as the view entity. /// [Browsable( false )] public Rotation EyeRotation { get => Transform.RotationToWorld( EyeLocalRotation ); set => EyeLocalRotation = Transform.RotationToLocal( value ); } /// /// Rotation of the entity's "eyes", i.e. rotation for the camera when this entity is used as the view entity. In local to the entity coordinates. /// [Net, Predicted, Browsable( false )] public Rotation EyeLocalRotation { get; set; } public BBox Hull { get => new ( new Vector3( -16, -16, 0 ), new Vector3( 16, 16, 64 ) ); } [BindComponent] public PawnController Controller { get; } [BindComponent] public PawnAnimator Animator { get; } public override Ray AimRay => new Ray( EyePosition, EyeRotation.Forward ); private PawnPropertyProxyComponent PropertyProxy { get => Owner?.Components.Get(); } /// /// Called when the entity is first created /// public override void Spawn() { SetModel( "models/citizen/citizen.vmdl" ); EnableDrawing = true; EnableHideInFirstPerson = true; EnableShadowInFirstPerson = true; Components.Create(); Components.Create(); } public void SetActiveWeapon( FpsWeapon fpsWeapon ) { ActiveFpsWeapon?.OnHolster(); ActiveFpsWeapon = fpsWeapon; ActiveFpsWeapon.OnEquip( this ); } public void DressFromClient( IClient cl ) { var c = new ClothingContainer(); c.LoadFromClient( cl ); c.DressEntity( this ); } public override void Simulate( IClient cl ) { SimulateRotation(); Controller?.Simulate( cl ); Animator?.Simulate(); ActiveFpsWeapon?.Simulate( cl ); EyeLocalPosition = Vector3.Up * (64f * Scale); } public override void BuildInput() { InputDirection = Input.AnalogMove; if ( Input.StopProcessing ) return; } public override void FrameSimulate( IClient cl ) { SimulateRotation(); } public TraceResult TraceBBox( Vector3 start, Vector3 end, float liftFeet = 0.0f ) { return TraceBBox( start, end, Hull.Mins, Hull.Maxs, liftFeet ); } public TraceResult TraceBBox( Vector3 start, Vector3 end, Vector3 mins, Vector3 maxs, float liftFeet = 0.0f ) { if ( liftFeet > 0 ) { start += Vector3.Up * liftFeet; maxs = maxs.WithZ( maxs.z - liftFeet ); } var tr = Trace.Ray( start, end ) .Size( mins, maxs ) .WithAnyTags( "solid", "playerclip", "passbullets" ) .Ignore( this ) .Run(); return tr; } public void SetupOwner( Entity owner ) { Owner = owner; owner.Components.GetOrCreate(); } protected void SimulateRotation() { EyeRotation = ViewAngles.ToRotation(); Rotation = ViewAngles.WithPitch( 0f ).ToRotation(); } }