Weapons/PythonWeapon.cs
using Sandbox.Rendering;
using Sandbox.Utility;
public class PythonWeapon : BaseBulletWeapon
{
[Property]
public float Damage { get; set; } = 12.0f;
public override void OnControl( Player player )
{
base.OnControl( player );
if ( Input.Pressed( "attack1" ) )
{
ShootBullet( player );
}
}
public void ShootBullet( Player player )
{
if ( !CanShoot() )
{
TryAutoReload();
return;
}
AddShootDelay( 0.9f );
if ( !TakeAmmo( 1 ) )
{
return;
}
var forward = player.EyeTransform.Rotation.Forward.WithAimCone( 1, 1 );
var bulletRadius = GameSettings.PythonBulletRadius * GameSettings.BulletRadius;
var tr = Scene.Trace.Ray( player.EyeTransform.ForwardRay with { Forward = forward }, 4096 )
.IgnoreGameObjectHierarchy( player.GameObject )
.WithCollisionRules( "bullet" )
.Radius( bulletRadius )
.UseHitboxes()
.Run();
ShootEffects( tr.EndPosition, tr.Hit, tr.Normal, tr.GameObject, tr.Surface );
TraceAttack( TraceAttackInfo.From( tr, Damage ) );
TimeSinceShoot = 0;
if ( player.IsLocalPlayer )
{
HitMarker.CreateFromTrace( tr );
}
player.Controller.EyeAngles += new Angles( Random.Shared.Float( -2, -3 ), Random.Shared.Float( -2, 2 ), 0 );
if ( !player.Controller.ThirdPerson && player.IsLocalPlayer )
{
_ = new Sandbox.CameraNoise.Punch( new Vector3( Random.Shared.Float( -50, -65 ), Random.Shared.Float( -20, 0 ), 0 ), 4.0f, 1, 0.5f );
_ = new Sandbox.CameraNoise.Shake( 1.5f, 1.0f );
}
}
public override void DrawCrosshair( HudPainter hud, Vector2 center )
{
var tss = TimeSinceShoot.Relative.Remap( 0, 0.8f, 1, 0 );
var len = 16f + Easing.ExpoIn( tss ) * 16f;
Color color = !CanShoot() ? UI.CrosshairInactive : UI.CrosshairActive;
var gap = 10 + tss * 22;
var w = 2f;
hud.DrawLine( center + Vector2.Left * (len + gap), center + Vector2.Left * gap, w, color );
hud.DrawLine( center - Vector2.Left * (len + gap), center - Vector2.Left * gap, w, color );
hud.DrawCircle( center, w * 2f, color );
}
}