diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineComponent.cs index c1c168e3d0..e690a83bb5 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineComponent.cs @@ -30,6 +30,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile public int CountLoaded => _loadedBullets.Count; + public event Action OnAmmoCountChanged; + public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -45,11 +47,24 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile base.Initialize(); _appearance = Owner.GetComponent(); + } + + public override void Startup() + { + base.Startup(); _bulletContainer = ContainerManagerComponent.Ensure("magazine_bullet_container", Owner, out var existed); - if (!existed && _fillType != null) + if (existed) + { + foreach (var entity in _bulletContainer.ContainedEntities) + { + _loadedBullets.Push(entity); + } + _updateAppearance(); + } + else if (_fillType != null) { // Load up bullets from fill. for (var i = 0; i < Capacity; i++) @@ -59,6 +74,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile } } + OnAmmoCountChanged?.Invoke(); _appearance.SetData(BallisticMagazineVisuals.AmmoCapacity, Capacity); } @@ -77,6 +93,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile _bulletContainer.Insert(bullet); _loadedBullets.Push(bullet); _updateAppearance(); + OnAmmoCountChanged?.Invoke(); } public IEntity TakeBullet() @@ -88,6 +105,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile var bullet = _loadedBullets.Pop(); _updateAppearance(); + OnAmmoCountChanged?.Invoke(); return bullet; } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineWeaponComponent.cs index 2914d2e65e..497bc80434 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineWeaponComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Projectile/BallisticMagazineWeaponComponent.cs @@ -34,7 +34,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile private bool _autoEjectMagazine; private AppearanceComponent _appearance; - private static readonly Direction[] _randomBulletDirs = { + private static readonly Direction[] _randomBulletDirs = + { Direction.North, Direction.East, Direction.South, @@ -60,22 +61,32 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile base.Initialize(); _appearance = Owner.GetComponent(); + _bulletDropRandom = new Random(Owner.Uid.GetHashCode() ^ DateTime.Now.GetHashCode()); + } + + public override void Startup() + { + base.Startup(); _magazineSlot = ContainerManagerComponent.Ensure("ballistic_gun_magazine", Owner, out var alreadyExisted); - _bulletDropRandom = new Random(Owner.Uid.GetHashCode() ^ DateTime.Now.GetHashCode()); - if (!alreadyExisted && _defaultMagazine != null) { var magazine = Owner.EntityManager.SpawnEntity(_defaultMagazine); InsertMagazine(magazine, false); } + else if (Magazine != null) + { + // Already got magazine from loading a container. + Magazine.GetComponent().OnAmmoCountChanged += _magazineAmmoCountChanged; + } + _updateAppearance(); } - public bool InsertMagazine(IEntity magazine, bool playSound=true) + public bool InsertMagazine(IEntity magazine, bool playSound = true) { if (!magazine.TryGetComponent(out BallisticMagazineComponent component)) { @@ -103,6 +114,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile audioSystem.Play(_magInSound, Owner); } + component.OnAmmoCountChanged += _magazineAmmoCountChanged; if (GetChambered(0) == null) { // No bullet in chamber, load one from magazine. @@ -117,7 +129,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile return true; } - public bool EjectMagazine(bool playSound=true) + public bool EjectMagazine(bool playSound = true) { var entity = Magazine; if (entity == null) @@ -133,7 +145,9 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile var audioSystem = IoCManager.Resolve().GetEntitySystem(); audioSystem.Play(_magOutSound, Owner); } + _updateAppearance(); + entity.GetComponent().OnAmmoCountChanged -= _magazineAmmoCountChanged; return true; } @@ -212,6 +226,11 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Projectile return InsertMagazine(attackwith); } + private void _magazineAmmoCountChanged() + { + _updateAppearance(); + } + private void _updateAppearance() { if (Magazine != null)