custom_weaponry
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| custom_weaponry [2023/05/20 00:12] – created frank_lee_smith | custom_weaponry [2023/08/21 23:12] (current) – frank_lee_smith | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Custom Weaponry ====== | ====== Custom Weaponry ====== | ||
| + | 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.1684541561.txt.gz · Last modified: 2023/05/20 00:12 by frank_lee_smith