Code/ModelViewer/ModelViewerViewModel.cs
using Sandbox;
public sealed class ModelViewerViewModel : Component
{
[Property]
[Group( "Handling" )]
bool IsTwoHanded { get; set; } = false;
[Property]
[Group( "Handling" )]
bool IsEmpty { get; set; } = false;
[Property]
[Group( "Handling" )]
bool LoweredWeapon { get; set; } = false;
[Property]
[Group( "Handling" )]
bool HolsterWeapon { get; set; } = false;
/*
[Property]
[Group( "Handling" )]
bool DeployWeapon { get; set; } = false;
*/
[Range( 0, 10 )]
[Property]
[Group( "Firing" )]
int FiringMode { get; set; } = 0;
[Range( 0, 8)]
[Property]
[Group( "Handling" )]
int HoldType { get; set; } = 0;
[Range( 0, 1 )]
[Property]
[Group( "IronSight" )]
float IronSightFireScale { get; set; } = 1;
[Range( 0, 50 )]
[Property]
[Group( "Movement" )]
float InertiaDamping { get; set; } = 20.0f;
[Property]
[ToggleGroup("MovementOverride")]
bool MovementOverride { get; set; } = false;
[Property]
[Group( "MovementOverride" )]
bool MovementJump { get; set; } = false;
[Property]
[Group( "MovementOverride" )]
bool MovementGrounded { get; set; } = true;
[Property]
[Group( "MovementOverride" )]
bool MovementSprinting { get; set; } = false;
[Property]
[Group( "MovementOverride" )]
[Range( 0, 100 )]
float MovementSpeed { get; set; } = 100.0f;
[Property]
[Group( "MovementOverride" )]
[Range( 0, 360 )]
float MovementAngle { get; set; } = 0.0f;
[Property]
[Group( "MovementOverride" )]
[Range( -2, 2 )]
float MovementX { get; set; } = 0.0f;
[Property]
[Group( "MovementOverride" )]
[Range( -2, 2 )]
float MovementY { get; set; } = 0.0f;
//
[Property]
[Group( "Don't worry about these" )]
private ClothingCamera MainCamera { get; set; }
[Property]
[Group( "Don't worry about these" )]
CameraComponent CameraComp { get; set; }
//
//Use these to keep track of the guns movement
public float YawInertia { get; private set; }
public float PitchInertia { get; private set; }
private float lastYaw;
private float lastPitch;
//
protected override void OnUpdate()
{
var newYaw = CameraComp.WorldRotation.Yaw();
var newPitch = CameraComp.WorldRotation.Pitch();
//var yawDelta = CameraComp.WorldRotation.Angles().yaw - lastYaw;
var yawDelta = Angles.NormalizeAngle( lastYaw - newYaw );
var pitchDelta = Angles.NormalizeAngle( lastPitch - newPitch );
YawInertia += yawDelta;
PitchInertia += pitchDelta;
var dir = MainCamera.WishVelocity;
var forward = MainCamera.ViewModelObject.WorldRotation.Forward.Dot( dir );
var sideward = MainCamera.ViewModelObject.WorldRotation.Right.Dot( dir );
var angle = MathF.Atan2( sideward, forward ).RadianToDegree().NormalizeDegrees();
var anim = GameObject.Children[0].Components.Get<SkinnedModelRenderer>();
if ( !MovementOverride )
{
//Movement
anim.Set( "b_jump", !MainCamera.isGrounded );
anim.Set( "move_direction", angle );
anim.Set( "move_speed", MainCamera.WishVelocity.Length );
anim.Set( "move_groundspeed", MainCamera.WishVelocity.WithZ( 0 ).Length );
anim.Set( "move_y", sideward );
anim.Set( "move_x", forward );
anim.Set( "move_z", MainCamera.WishVelocity.z );
anim.Set( "b_grounded", MainCamera.isGrounded );
anim.Set( "move_sprint", Input.Down( "run" ) );
anim.Set( "b_sprint", Input.Down( "run" ) );
}
else
{
anim.Set( "b_jump", MovementJump );
anim.Set( "move_direction", MovementAngle );
anim.Set( "move_speed", MovementSpeed );
anim.Set( "move_groundspeed", MovementSpeed );
anim.Set( "move_y", MovementX );
anim.Set( "move_x", MovementY );
anim.Set( "move_z", 0 );
anim.Set( "b_grounded", MovementGrounded );
anim.Set( "move_sprint", MovementSprinting );
anim.Set( "b_sprint", MovementSprinting );
}
//Fire
anim.Set( "b_attack", Input.Pressed( "Attack1" ) );
anim.Set( "b_attack_dry", Input.Pressed( "Attack1" ) && IsEmpty );
//Reload
anim.Set( "b_reload", Input.Pressed( "Reload" ) );
//Empty
anim.Set( "b_empty", IsEmpty );
//TwoHanded
anim.Set( "b_twohanded", IsTwoHanded );
//Iron sight
anim.Set( "ironsights", Input.Down( "attack2" ) ? 2 : 0);
anim.Set( "ironsights_fire_scale", IronSightFireScale );
//Fire Mode
anim.Set( "firing_mode", FiringMode );
//HoldType
anim.Set( "holdtype_pose", HoldType );
//Lowered
anim.Set( "b_lower_weapon", LoweredWeapon );
//Holster
anim.Set( "b_holster", HolsterWeapon );
//Deploy
//anim.Set( "b_deploy", !HolsterWeapon );
//Inertia sway
anim.Set( "aim_yaw_inertia", YawInertia);
anim.Set( "aim_pitch_inertia", PitchInertia );
lastYaw = newYaw;
lastPitch = newPitch;
YawInertia = YawInertia.LerpTo( 0, Time.Delta * InertiaDamping );
PitchInertia = PitchInertia.LerpTo( 0, Time.Delta * InertiaDamping );
}
}