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 0000000000..8492f5ad7f Binary files /dev/null and b/Resources/Audio/White/Weapons/Modules/silence.ogg differ 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 0000000000..3a66711c97 Binary files /dev/null and b/Resources/Textures/White/Objects/Weapons/modules.rsi/flamehider.png differ diff --git a/Resources/Textures/White/Objects/Weapons/modules.rsi/laser.png b/Resources/Textures/White/Objects/Weapons/modules.rsi/laser.png new file mode 100644 index 0000000000..457b77dda9 Binary files /dev/null and b/Resources/Textures/White/Objects/Weapons/modules.rsi/laser.png differ diff --git a/Resources/Textures/White/Objects/Weapons/modules.rsi/meta.json b/Resources/Textures/White/Objects/Weapons/modules.rsi/meta.json index edc936e871..8e40da7f79 100644 --- a/Resources/Textures/White/Objects/Weapons/modules.rsi/meta.json +++ b/Resources/Textures/White/Objects/Weapons/modules.rsi/meta.json @@ -9,6 +9,11 @@ "states": [ { "name": "light" + }, + { + "name": "laser" + }, { + "name": "flamehider" } ] } diff --git a/Resources/Textures/White/Objects/Weapons/modules.rsi/silencer.png b/Resources/Textures/White/Objects/Weapons/modules.rsi/silencer.png new file mode 100644 index 0000000000..40cf69b56a Binary files /dev/null and b/Resources/Textures/White/Objects/Weapons/modules.rsi/silencer.png differ