diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs index 3e4b6362fc..3755370ea7 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs @@ -69,6 +69,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels if (value) { + TryEjectChamber(); if (_soundBoltOpen != null) { soundSystem.PlayAtCoords(_soundBoltOpen, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-2)); @@ -76,6 +77,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } else { + TryFeedChamber(); if (_soundBoltClosed != null) { soundSystem.PlayAtCoords(_soundBoltClosed, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-2)); @@ -84,6 +86,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels _boltOpen = value; UpdateAppearance(); + Dirty(); } } private bool _boltOpen; @@ -210,29 +213,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels private void Cycle(bool manual = false) { - var chamberedEntity = _chamberContainer.ContainedEntity; - if (chamberedEntity != null) - { - _chamberContainer.Remove(chamberedEntity); - var ammoComponent = chamberedEntity.GetComponent(); - if (!ammoComponent.Caseless) - { - EjectCasing(chamberedEntity); - } - } - - if (_spawnedAmmo.TryPop(out var next)) - { - _ammoContainer.Remove(next); - _chamberContainer.Insert(next); - } - - if (_unspawnedCount > 0) - { - _unspawnedCount--; - var ammoEntity = Owner.EntityManager.SpawnEntity(_fillPrototype, Owner.Transform.GridPosition); - _chamberContainer.Insert(ammoEntity); - } + TryEjectChamber(); + TryFeedChamber(); if (_chamberContainer.ContainedEntity == null && manual) { @@ -241,9 +223,9 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels { Owner.PopupMessage(container.Owner, Loc.GetString("Bolt opened")); } + return; } - - if (manual) + else { if (_soundCycle != null) { @@ -310,11 +292,11 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels { BoltOpen = false; Owner.PopupMessage(eventArgs.User, Loc.GetString("Bolt closed")); - // Dirty(); return true; } Cycle(true); + return true; } @@ -323,6 +305,46 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return TryInsertBullet(eventArgs.User, eventArgs.Using); } + private bool TryEjectChamber() + { + var chamberedEntity = _chamberContainer.ContainedEntity; + if (chamberedEntity != null) + { + if (!_chamberContainer.Remove(chamberedEntity)) + { + return false; + } + if (!chamberedEntity.GetComponent().Caseless) + { + EjectCasing(chamberedEntity); + } + return true; + } + return false; + } + + private bool TryFeedChamber() + { + if (_chamberContainer.ContainedEntity != null) + { + return false; + } + if (_spawnedAmmo.TryPop(out var next)) + { + _ammoContainer.Remove(next); + _chamberContainer.Insert(next); + return true; + } + else if (_unspawnedCount > 0) + { + _unspawnedCount--; + var ammoEntity = Owner.EntityManager.SpawnEntity(_fillPrototype, Owner.Transform.GridPosition); + _chamberContainer.Insert(ammoEntity); + return true; + } + return false; + } + public override void Examine(FormattedMessage message, bool inDetailsRange) { base.Examine(message, inDetailsRange); @@ -342,7 +364,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } data.Text = Loc.GetString("Open bolt"); - data.Visibility = component.BoltOpen ? VerbVisibility.Disabled : VerbVisibility.Visible; + data.Visibility = component.BoltOpen ? VerbVisibility.Invisible : VerbVisibility.Visible; } protected override void Activate(IEntity user, BoltActionBarrelComponent component) @@ -363,7 +385,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } data.Text = Loc.GetString("Close bolt"); - data.Visibility = component.BoltOpen ? VerbVisibility.Visible : VerbVisibility.Disabled; + data.Visibility = component.BoltOpen ? VerbVisibility.Visible : VerbVisibility.Invisible; } protected override void Activate(IEntity user, BoltActionBarrelComponent component) diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs index 7999fce221..ed7ec35452 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs @@ -81,7 +81,42 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels private string _magFillPrototype; - public bool BoltOpen { get; private set; } = true; + public bool BoltOpen + { + get => _boltOpen; + set + { + if (_boltOpen == value) + { + return; + } + + var soundSystem = EntitySystem.Get(); + + if (value) + { + TryEjectChamber(); + if (_soundBoltOpen != null) + { + soundSystem.PlayAtCoords(_soundBoltOpen, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-2)); + } + } + else + { + TryFeedChamber(); + if (_soundBoltClosed != null) + { + soundSystem.PlayAtCoords(_soundBoltClosed, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-2)); + } + } + + _boltOpen = value; + UpdateAppearance(); + Dirty(); + } + } + private bool _boltOpen = true; + private bool _autoEjectMag; // If the bolt needs to be open before we can insert / remove the mag (i.e. for LMGs) public bool MagNeedsOpenBolt => _magNeedsOpenBolt; @@ -170,30 +205,6 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels UpdateAppearance(); } - public void ToggleBolt() - { - // For magazines only when we normally set BoltOpen we'll defer the UpdateAppearance until everything is done - // Whereas this will just call it straight up. - BoltOpen = !BoltOpen; - var soundSystem = EntitySystem.Get(); - if (BoltOpen) - { - if (_soundBoltOpen != null) - { - soundSystem.PlayAtCoords(_soundBoltOpen, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-5)); - } - } - else - { - if (_soundBoltClosed != null) - { - soundSystem.PlayAtCoords(_soundBoltClosed, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-5)); - } - } - Dirty(); - UpdateAppearance(); - } - public override IEntity PeekAmmo() { return BoltOpen ? null : _chamberContainer.ContainedEntity; @@ -218,41 +229,13 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return; } - var chamberEntity = _chamberContainer.ContainedEntity; - if (chamberEntity != null) - { - _chamberContainer.Remove(chamberEntity); - var ammoComponent = chamberEntity.GetComponent(); - if (!ammoComponent.Caseless) - { - EjectCasing(chamberEntity); - } - } + TryEjectChamber(); - // Try and pull a round from the magazine to replace the chamber if possible - var magazine = _magazineContainer.ContainedEntity; - var nextRound = magazine?.GetComponent().TakeAmmo(); - - if (nextRound != null) - { - // If you're really into gunporn you could put a sound here - _chamberContainer.Insert(nextRound); - } + TryFeedChamber(); var soundSystem = EntitySystem.Get(); - if (_autoEjectMag && magazine != null && magazine.GetComponent().ShotsLeft == 0) - { - if (_soundAutoEject != null) - { - soundSystem.PlayAtCoords(_soundAutoEject, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-2)); - } - - _magazineContainer.Remove(magazine); - SendNetworkMessage(new MagazineAutoEjectMessage()); - } - - if (nextRound == null && !BoltOpen) + if (_chamberContainer.ContainedEntity == null && !BoltOpen) { if (_soundBoltOpen != null) { @@ -264,8 +247,6 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels Owner.PopupMessage(container.Owner, Loc.GetString("Bolt open")); } BoltOpen = true; - Dirty(); - UpdateAppearance(); return; } @@ -305,8 +286,6 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } Owner.PopupMessage(eventArgs.User, Loc.GetString("Bolt closed")); BoltOpen = false; - Dirty(); - UpdateAppearance(); return true; } @@ -316,6 +295,57 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } + public bool TryEjectChamber() + { + var chamberEntity = _chamberContainer.ContainedEntity; + if (chamberEntity != null) + { + if (!_chamberContainer.Remove(chamberEntity)) + { + return false; + } + var ammoComponent = chamberEntity.GetComponent(); + if (!ammoComponent.Caseless) + { + EjectCasing(chamberEntity); + } + return true; + } + return false; + } + + public bool TryFeedChamber() + { + if (_chamberContainer.ContainedEntity != null) + { + return false; + } + + // Try and pull a round from the magazine to replace the chamber if possible + var magazine = _magazineContainer.ContainedEntity; + var nextRound = magazine?.GetComponent().TakeAmmo(); + + if (nextRound == null) + { + return false; + } + + _chamberContainer.Insert(nextRound); + + if (_autoEjectMag && magazine != null && magazine.GetComponent().ShotsLeft == 0) + { + if (_soundAutoEject != null) + { + var soundSystem = EntitySystem.Get(); + soundSystem.PlayAtCoords(_soundAutoEject, Owner.Transform.GridPosition, AudioParams.Default.WithVolume(-2)); + } + + _magazineContainer.Remove(magazine); + SendNetworkMessage(new MagazineAutoEjectMessage()); + } + return true; + } + public void RemoveMagazine(IEntity user) { var mag = _magazineContainer.ContainedEntity; @@ -470,12 +500,12 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } data.Text = Loc.GetString("Open bolt"); - data.Visibility = component.BoltOpen ? VerbVisibility.Disabled : VerbVisibility.Visible; + data.Visibility = component.BoltOpen ? VerbVisibility.Invisible : VerbVisibility.Visible; } protected override void Activate(IEntity user, ServerMagazineBarrelComponent component) { - component.ToggleBolt(); + component.BoltOpen = true; } } @@ -491,12 +521,12 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } data.Text = Loc.GetString("Close bolt"); - data.Visibility = component.BoltOpen ? VerbVisibility.Visible : VerbVisibility.Disabled; + data.Visibility = component.BoltOpen ? VerbVisibility.Visible : VerbVisibility.Invisible; } protected override void Activate(IEntity user, ServerMagazineBarrelComponent component) { - component.ToggleBolt(); + component.BoltOpen = false; } } }