From 47741932edc964d0effc22efe9a4f083e94948e0 Mon Sep 17 00:00:00 2001 From: CaYpeN1 Date: Tue, 19 Mar 2024 10:08:18 +0500 Subject: [PATCH] add: laser, flamehider and silencer module for rifles --- .../WeaponModules/WeaponModulesSystem.cs | 116 ++++++++++++++---- .../Weapons/Ranged/Components/GunComponent.cs | 6 + .../Weapons/Ranged/Systems/SharedGunSystem.cs | 29 ++++- .../Audio/White/Weapons/Modules/silence.ogg | Bin 0 -> 4574 bytes .../Objects/Weapons/Guns/Modules/modules.yml | 34 ++++- .../Weapons/modules.rsi/flamehider.png | Bin 0 -> 2736 bytes .../Objects/Weapons/modules.rsi/laser.png | Bin 0 -> 2805 bytes .../Objects/Weapons/modules.rsi/meta.json | 5 + .../Objects/Weapons/modules.rsi/silencer.png | Bin 0 -> 2747 bytes 9 files changed, 162 insertions(+), 28 deletions(-) create mode 100644 Resources/Audio/White/Weapons/Modules/silence.ogg create mode 100644 Resources/Textures/White/Objects/Weapons/modules.rsi/flamehider.png create mode 100644 Resources/Textures/White/Objects/Weapons/modules.rsi/laser.png create mode 100644 Resources/Textures/White/Objects/Weapons/modules.rsi/silencer.png diff --git a/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs b/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs index bb9114489a..0df6b63fe3 100644 --- a/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs +++ b/Content.Server/_White/WeaponModules/WeaponModulesSystem.cs @@ -1,6 +1,11 @@ -using Content.Server.Light.Events; +using System.Numerics; +using Content.Server.Light.Events; using Content.Server.Lightning; +using Content.Shared.Light; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; using Robust.Server.GameObjects; +using Robust.Shared.Audio; using Robust.Shared.Containers; namespace Content.Server._White.WeaponModules; @@ -8,7 +13,11 @@ namespace Content.Server._White.WeaponModules; public sealed class WeaponModulesSystem : EntitySystem { protected const string ModulesSlot = "gun_modules"; - [Dependency] private readonly SharedPointLightSystem _lightSystem = default!; + [Dependency] private readonly PointLightSystem _lightSystem = default!; + [Dependency] private readonly SharedGunSystem _gunSystem = default!; + + SoundSpecifier? oldSoundGunshot; + public override void Initialize() { base.Initialize(); @@ -22,11 +31,14 @@ public sealed class WeaponModulesSystem : EntitySystem if (ModulesSlot != args.Container.ID) return; - string weapon = Prototype(args.Entity)!.ID; - EntityUid target = args.Container.Owner; + string module = Prototype(args.Entity)!.ID; + EntityUid weapon = args.Container.Owner; - insertModules(weapon, comp); - moduleEffect(weapon, target); + TryComp(weapon, out var gunComp); + oldSoundGunshot = gunComp!.SoundGunshot; + + insertModules(module, comp); + moduleEffect(module, weapon); } private void OnEject(EntityUid uid, WeaponModulesComponent comp, EntRemovedFromContainerMessage args) @@ -34,11 +46,11 @@ public sealed class WeaponModulesSystem : EntitySystem if (ModulesSlot != args.Container.ID) return; - string weapon = Prototype(args.Entity)!.ID; - EntityUid target = args.Container.Owner; + string module = Prototype(args.Entity)!.ID; + EntityUid weapon = args.Container.Owner; - removeModules(weapon, comp); - removeModuleEffect(weapon, target); + removeModules(module, comp); + removeModuleEffect(module, weapon); } private void insertModules(string module, WeaponModulesComponent comp) @@ -49,23 +61,52 @@ public sealed class WeaponModulesSystem : EntitySystem if(comp.Modules.Contains("LightModule")) break; comp.Modules.Add("LightModule"); break; + + case "LaserModule": + if(comp.Modules.Contains("LaserModule")) break; + comp.Modules.Add("LaserModule"); + break; + + case "FlameHiderModule": + if(comp.Modules.Contains("FlameHiderModule")) break; + comp.Modules.Add("FlameHiderModule"); + break; + + case "SilencerModule": + if(comp.Modules.Contains("SilencerModule")) break; + comp.Modules.Add("SilencerModule"); + break; } } - private void moduleEffect(string module, EntityUid target) + private void moduleEffect(string module, EntityUid weapon) { switch (module) { - case "LightModule": - if (HasComp(target)) - { - _lightSystem.SetEnabled(target, true); - break; - } + case "LightModule" when HasComp(weapon): + { + _lightSystem.SetEnabled(weapon, true); + break; + } - _lightSystem.TryGetLight(target, out var light); - _lightSystem.EnsureLight(target); - _lightSystem.SetRadius(target, 2F, light); + case "LightModule": + + _lightSystem.TryGetLight(weapon, out var light); + _lightSystem.EnsureLight(weapon).Offset = new Vector2(0, -1); + _lightSystem.SetRadius(weapon, 2F, light); + break; + + case "LaserModule": + _gunSystem.setProjectileSpeed(weapon, 40F); + break; + + case "FlameHiderModule": + _gunSystem.setUseEffect(weapon, true); + break; + + case "SilencerModule": + _gunSystem.setUseEffect(weapon, true); + _gunSystem.setSound(weapon, new SoundPathSpecifier("/Audio/White/Weapons/Modules/silence.ogg")); break; } } @@ -77,19 +118,46 @@ public sealed class WeaponModulesSystem : EntitySystem case "LightModule": comp.Modules.Remove("LightModule"); break; + + case "LaserModule": + comp.Modules.Remove("LaserModule"); + break; + + case "FlameHiderModule": + comp.Modules.Remove("FlameHiderModule"); + break; + + case "SilencerModule": + comp.Modules.Remove("SilencerModule"); + break; } } - private void removeModuleEffect(string module, EntityUid target) + private void removeModuleEffect(string module, EntityUid weapon) { switch (module) { case "LightModule": - if(!HasComp(target)) + if (!HasComp(weapon)) break; - _lightSystem.TryGetLight(target, out var light); - _lightSystem.SetEnabled(target, false, light); + _lightSystem.TryGetLight(weapon, out var light); + _lightSystem.SetEnabled(weapon, false, light); + break; + + case "LaserModule": + if (!HasComp(weapon)) + break; + _gunSystem.setProjectileSpeed(weapon, 25F); + break; + + case "FlameHiderModule": + _gunSystem.setUseEffect(weapon, false); + break; + + case "SilencerModule": + _gunSystem.setUseEffect(weapon, false); + _gunSystem.setSound(weapon, oldSoundGunshot!); break; } } diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 752232475a..f01f0f6373 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -179,6 +179,12 @@ public sealed partial class GunComponent : Component [DataField] public bool ResetOnHandSelected = true; + /// + /// For flamehider module | WD EDIT + /// + [DataField, AutoNetworkedField] + public bool canUseEffect; + /// /// The base value for how fast the projectile moves. /// diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 67a6b66cbb..681bd29987 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -475,7 +475,9 @@ public abstract partial class SharedGunSystem : EntitySystem protected void MuzzleFlash(EntityUid gun, AmmoComponent component, EntityUid? user = null) { - var attemptEv = new GunMuzzleFlashAttemptEvent(); + TryComp(gun, out var gunComponent); // WD EDIT + + var attemptEv = new GunMuzzleFlashAttemptEvent(gunComponent!.canUseEffect); // WD EDIT RaiseLocalEvent(gun, ref attemptEv); if (attemptEv.Cancelled) return; @@ -534,8 +536,31 @@ public abstract partial class SharedGunSystem : EntitySystem Dirty(gun); } - protected abstract void CreateEffect(EntityUid uid, MuzzleFlashEvent message, EntityUid? user = null); + public void setProjectileSpeed(EntityUid weapon, float projectileSpeed) + { + TryComp(weapon, out var gunComponent); + gunComponent!.ProjectileSpeed = projectileSpeed; + RefreshModifiers(weapon); + } + + public void setSound(EntityUid weapon, SoundSpecifier sound) + { + TryComp(weapon, out var gunComponent); + gunComponent!.SoundGunshot = sound; + + RefreshModifiers(weapon); + } + + public void setUseEffect(EntityUid weapon, bool state) + { + TryComp(weapon, out var gunComponent); + gunComponent!.canUseEffect = state; + + RefreshModifiers(weapon); + } + + protected abstract void CreateEffect(EntityUid uid, MuzzleFlashEvent message, EntityUid? user = null); /// /// Used for animated effects on the client. /// diff --git a/Resources/Audio/White/Weapons/Modules/silence.ogg b/Resources/Audio/White/Weapons/Modules/silence.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8492f5ad7fa208a6738b9eec04992404f4798663 GIT binary patch literal 4574 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 L8)wwUD|G$?Yut?% literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml index be8ce29fbd..aba064c9e0 100644 --- a/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml +++ b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Modules/modules.yml @@ -12,7 +12,7 @@ sprite: White/Objects/Weapons/modules.rsi size: Small shape: - - 0,0,1,1 + - 0,0,0,0 layers: - state: base map: ["enum.GunVisualLayers.Base"] @@ -23,10 +23,40 @@ # modules - type: entity id: LightModule - name: "light module for rifle" + name: "light module" parent: BaseModule components: - type: Item - type: Sprite state: light + - type: Appearance + +- type: entity + id: LaserModule + name: "laser module" + parent: BaseModule + components: + - type: Item + - type: Sprite + state: laser + - type: Appearance + +- type: entity + id: FlameHiderModule + name: "flamehider module" + parent: BaseModule + components: + - type: Item + - type: Sprite + state: flamehider + - type: Appearance + +- type: entity + id: SilencerModule + name: "silencer module" + parent: BaseModule + components: + - type: Item + - type: Sprite + state: flamehider - type: Appearance \ No newline at end of file diff --git a/Resources/Textures/White/Objects/Weapons/modules.rsi/flamehider.png b/Resources/Textures/White/Objects/Weapons/modules.rsi/flamehider.png new file mode 100644 index 0000000000000000000000000000000000000000..3a66711c97d7edf72a6c34c19c6b02dfe497b61a GIT binary patch literal 2736 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