Gun verb changes (#1888)
* Bolt action ver fixes * Fixes bolt-action playing two sounds when cycling on empty magazine * MagazineBarrel open/close bolt verb visibility * mag stuff * Dirty checks on guns Co-authored-by: py01 <pyronetics01@gmail.com>
This commit is contained in:
@@ -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<AmmoComponent>();
|
||||
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<AmmoComponent>().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)
|
||||
|
||||
@@ -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<AudioSystem>();
|
||||
|
||||
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<AudioSystem>();
|
||||
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<AmmoComponent>();
|
||||
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<RangedMagazineComponent>().TakeAmmo();
|
||||
|
||||
if (nextRound != null)
|
||||
{
|
||||
// If you're really into gunporn you could put a sound here
|
||||
_chamberContainer.Insert(nextRound);
|
||||
}
|
||||
TryFeedChamber();
|
||||
|
||||
var soundSystem = EntitySystem.Get<AudioSystem>();
|
||||
|
||||
if (_autoEjectMag && magazine != null && magazine.GetComponent<RangedMagazineComponent>().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<AmmoComponent>();
|
||||
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<RangedMagazineComponent>().TakeAmmo();
|
||||
|
||||
if (nextRound == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
_chamberContainer.Insert(nextRound);
|
||||
|
||||
if (_autoEjectMag && magazine != null && magazine.GetComponent<RangedMagazineComponent>().ShotsLeft == 0)
|
||||
{
|
||||
if (_soundAutoEject != null)
|
||||
{
|
||||
var soundSystem = EntitySystem.Get<AudioSystem>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user