Create FPS Test minigame with other shit
This commit is contained in:
164
code/Minigames/FpsTest/Pawn.cs
Normal file
164
code/Minigames/FpsTest/Pawn.cs
Normal file
@@ -0,0 +1,164 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Position a player should be looking from in world space.
|
||||
/// </summary>
|
||||
[Browsable( false )]
|
||||
public Vector3 EyePosition
|
||||
{
|
||||
get => Transform.PointToWorld( EyeLocalPosition );
|
||||
set => EyeLocalPosition = Transform.PointToLocal( value );
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Position a player should be looking from in local to the entity coordinates.
|
||||
/// </summary>
|
||||
[Net, Predicted, Browsable( false )]
|
||||
public Vector3 EyeLocalPosition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Rotation of the entity's "eyes", i.e. rotation for the camera when this entity is used as the view entity.
|
||||
/// </summary>
|
||||
[Browsable( false )]
|
||||
public Rotation EyeRotation
|
||||
{
|
||||
get => Transform.RotationToWorld( EyeLocalRotation );
|
||||
set => EyeLocalRotation = Transform.RotationToLocal( value );
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
[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<PawnPropertyProxyComponent>(); }
|
||||
|
||||
/// <summary>
|
||||
/// Called when the entity is first created
|
||||
/// </summary>
|
||||
public override void Spawn()
|
||||
{
|
||||
|
||||
SetModel( "models/citizen/citizen.vmdl" );
|
||||
|
||||
EnableDrawing = true;
|
||||
EnableHideInFirstPerson = true;
|
||||
EnableShadowInFirstPerson = true;
|
||||
|
||||
Components.Create<PawnController>();
|
||||
Components.Create<PawnAnimator>();
|
||||
}
|
||||
|
||||
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<PawnPropertyProxyComponent>();
|
||||
}
|
||||
|
||||
protected void SimulateRotation()
|
||||
{
|
||||
EyeRotation = ViewAngles.ToRotation();
|
||||
Rotation = ViewAngles.WithPitch( 0f ).ToRotation();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user