custom_weaponry
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| custom_weaponry [2023/08/21 23:12] – frank_lee_smith | custom_weaponry [2026/05/01 23:26] (current) – frank_lee_smith | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Custom Weaponry ====== | + | coming soon when facepunch lets us do addons |
| - | You can create custom weaponry from deriving from one of the following classes: | + | |
| - | * Gun (Gun provides common useful methods such as ShootBullet that gun like weapons would find useful, it is derived from Weapon) | + | |
| - | * Melee (Melee has an Attack method, it is derived from Weapon) | + | |
| - | * Weapon (Weapon provides reload and ammo system and no more, it is derived from Carriable) | + | |
| - | * Carriable (Carriable provides nothing, its a bare bones thing that goes into your inventory and has a viewmodel) | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | heres an example weapon you might find helpful | + | |
| - | <code csharp> | + | |
| - | using Editor; | + | |
| - | using Sandbox; | + | |
| - | using TerrorTown; | + | |
| - | + | ||
| - | [Library(" | + | |
| - | [Title(" | + | |
| - | public class OverpoweredWeapon : Gun, ISecondaryWeapon, | + | |
| - | { | + | |
| - | public override string ViewModelPath => " | + | |
| - | public override string WorldModelPath => " | + | |
| - | public override float PrimaryAttackDelay => 0.000f; | + | |
| - | public override float PrimaryReloadDelay => 0.000f; | + | |
| - | public override int MaxPrimaryAmmo => 100000; | + | |
| - | public override AmmoType PrimaryAmmoType => AmmoType.Spare; | + | |
| - | public override float HeadshotMultiplier => 10.00f; | + | |
| - | public override bool Automatic => true; | + | |
| - | public override void PrimaryAttack() | + | |
| - | { | + | |
| - | PrimaryAmmo -= 1; | + | |
| - | ShootBullet(1000, | + | |
| - | PlaySound(" | + | |
| - | (Owner as AnimatedEntity)? | + | |
| - | ShootEffects(); | + | |
| - | } | + | |
| - | public override void ReloadPrimary() | + | |
| - | { | + | |
| - | base.ReloadPrimary(); | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | if you would like to make a scope similar to the one on the m24, you can use this code snippet taken from the m24 | + | |
| - | <code csharp> | + | |
| - | public override void SecondaryAttack() | + | |
| - | { | + | |
| - | base.SecondaryAttack(); | + | |
| - | if ( Game.IsClient ) | + | |
| - | { | + | |
| - | if ( !Scoped ) | + | |
| - | { | + | |
| - | ScopeIn(); | + | |
| - | } | + | |
| - | else if ( Scoped ) | + | |
| - | { | + | |
| - | ScopeOut(); | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | ScopeOverlay ScopeOverlay; | + | |
| - | void ScopeIn() | + | |
| - | { | + | |
| - | Scoped = true; | + | |
| - | (Owner as Player).CameraController.SensitivityMultiplier = 25 / Game.Preferences.FieldOfView; | + | |
| - | (Owner as Player).CameraController.FOVMultiplier = 25 / Game.Preferences.FieldOfView; | + | |
| - | if ( Game.IsClient ) | + | |
| - | { | + | |
| - | ViewModelEntity.EnableDrawing = false; | + | |
| - | ScopeOverlay = new ScopeOverlay(); | + | |
| - | HUDRootPanel.Current.AddChild( ScopeOverlay ); | + | |
| - | PlaySound( " | + | |
| - | } | + | |
| - | } | + | |
| - | void ScopeOut() | + | |
| - | { | + | |
| - | Scoped = false; | + | |
| - | (Owner as Player).CameraController.SensitivityMultiplier = 1; | + | |
| - | (Owner as Player).CameraController.FOVMultiplier = 1; | + | |
| - | if ( Game.IsClient ) | + | |
| - | { | + | |
| - | ViewModelEntity.EnableDrawing = true; | + | |
| - | ScopeOverlay? | + | |
| - | PlaySound( " | + | |
| - | } | + | |
| - | } | + | |
| - | public override void OnActiveEnd() | + | |
| - | { | + | |
| - | ScopeOverlay? | + | |
| - | if ( Owner is Player player ) | + | |
| - | { | + | |
| - | player.CameraController.SensitivityMultiplier = 1; | + | |
| - | player.CameraController.FOVMultiplier = 1; | + | |
| - | } | + | |
| - | base.OnActiveEnd(); | + | |
| - | + | ||
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Smoke Grenade Code | + | |
| - | + | ||
| - | <code csharp> | + | |
| - | + | ||
| - | using Editor; | + | |
| - | using Sandbox; | + | |
| - | namespace TerrorTown; | + | |
| - | + | ||
| - | [Library( " | + | |
| - | [Title( "Smoke Grenade" | + | |
| - | [EditorModel( " | + | |
| - | public class SmokeGrenade : Throwable, IGrenade, IRandomGrenade | + | |
| - | { | + | |
| - | public override string ViewModelPath => " | + | |
| - | public override string WorldModelPath => " | + | |
| - | public override void Throw() | + | |
| - | { | + | |
| - | if ( Game.IsServer ) | + | |
| - | { | + | |
| - | var Nade = new SmokeGrenadeThrown(); | + | |
| - | Nade.SetModel( WorldModelPath ); | + | |
| - | Nade.SetupPhysicsFromModel( PhysicsMotionType.Dynamic ); | + | |
| - | Nade.Position = Owner.AimRay.Position + (Owner.AimRay.Forward * 24) + (Vector3.Down * 5); | + | |
| - | Nade.PhysicsBody.Velocity = (Owner.AimRay.Forward * 900) + (Owner.AimRay.Forward.EulerAngles.ToRotation().Up * 80); | + | |
| - | Nade.PhysicsBody.Velocity += Owner.Velocity * 1f; | + | |
| - | Nade.PhysicsBody.AngularVelocity = Vector3.Random * 20; | + | |
| - | Nade.TimeOffset = TimeSinceClicked.Relative; | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | public class SmokeGrenadeThrown : BasePhysics | + | |
| - | { | + | |
| - | public float TimeOffset; | + | |
| - | public override void Spawn() | + | |
| - | { | + | |
| - | base.Spawn(); | + | |
| - | SetModel( " | + | |
| - | SetupPhysicsFromModel( PhysicsMotionType.Dynamic ); | + | |
| - | TimeSinceSpawned = 0; | + | |
| - | } | + | |
| - | TimeSince TimeSinceSpawned; | + | |
| - | Particles Particle; | + | |
| - | [GameEvent.Tick.Server] | + | |
| - | void tick() | + | |
| - | { | + | |
| - | if ( TimeSinceSpawned > (5 - TimeOffset) ) | + | |
| - | { | + | |
| - | if ( Particle == null ) | + | |
| - | { | + | |
| - | Particle = Particles.Create( " | + | |
| - | ParticleCleanupSystem.RegisterForCleanup( Particle ); | + | |
| - | } | + | |
| - | } | + | |
| - | if ( TimeSinceSpawned > (65 - TimeOffset) ) | + | |
| - | { | + | |
| - | Particle.Destroy(); | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | </ | + | |
custom_weaponry.txt · Last modified: 2026/05/01 23:26 by frank_lee_smith