Weapons/RatThrowWeapon.cs
public class RatThrowWeapon : BaseWeapon
{
	[Property] public GameObject RatPrefab { get; set; }

	TimeSince TimeSinceCreated = 0;

	protected override void OnEnabled()
	{
		TimeSinceCreated = 0;
	}

	public override void OnControl( Player player )
	{
		base.OnControl( player );

		if ( TimeSinceCreated < 0.2f )
			return;

		if ( Input.Pressed( "Attack1" ) )
		{
			StartAttack();
		}

		if ( Input.Released( "Attack1" ) )
		{
			StopAttack();
			Attack( player );
		}
	}

	[Rpc.Host]
	public void ThrowRat()
	{
		if ( !Owner.IsValid() ) return;

		var ratGo = RatPrefab?.Clone( Owner.EyeTransform.Position + Owner.EyeTransform.Forward * 64f );
		var rat = ratGo.GetComponent<Rat>();
		rat.Instigator = Owner.PlayerData;

		rat.Throw( Owner.EyeTransform.Rotation );

		ratGo.NetworkSpawn();
	}

	void Attack( Player player )
	{
		if ( !CanShoot() || !TakeAmmo( 1 ) )
		{
			return;
		}

		AddShootDelay( 1 );

		var ev = new IWeaponEvent.AttackEvent( ViewModel.IsValid() );
		IWeaponEvent.PostToGameObject( GameObject.Root, x => x.OnAttack( ev ) );

		ThrowRat();

		if ( !HasAmmo() )
		{
			SwitchAway();
		}
	}
}