using Robust.Shared.Physics.Systems;
using Robust.Shared.Serialization;
using Robust.Shared.Timing;
-using Robust.Shared.Utility;
namespace Content.Shared.Weapons.Misc;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedJointSystem _joints = default!;
+ [Dependency] private readonly SharedGunSystem _gun = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
public const string GrapplingJoint = "grappling";
private void OnGrappleJointRemoved(EntityUid uid, GrapplingProjectileComponent component, JointRemovedEvent args)
{
- QueueDel(uid);
+ if (_netManager.IsServer)
+ QueueDel(uid);
}
private void OnGrapplingShot(EntityUid uid, GrapplingGunComponent component, ref GunShotEvent args)
if (!HasComp<GrapplingProjectileComponent>(shotUid))
continue;
+ //todo: this doesn't actually support multigrapple
// At least show the visuals.
component.Projectile = shotUid.Value;
Dirty(uid, component);
var visuals = EnsureComp<JointVisualsComponent>(shotUid.Value);
- visuals.Sprite =
- new SpriteSpecifier.Rsi(new ResPath("Objects/Weapons/Guns/Launchers/grappling_gun.rsi"), "rope");
+ visuals.Sprite = component.RopeSprite;
visuals.OffsetA = new Vector2(0f, 0.5f);
visuals.Target = uid;
Dirty(shotUid.Value, visuals);
TryComp<AppearanceComponent>(uid, out var appearance);
_appearance.SetData(uid, SharedTetherGunSystem.TetherVisualsStatus.Key, false, appearance);
+ Dirty(uid, component);
}
private void OnGrapplingDeselected(EntityUid uid, GrapplingGunComponent component, HandDeselectedEvent args)
if (!Timing.IsFirstTimePredicted || args.Handled)
return;
- _audio.PlayPredicted(component.CycleSound, uid, args.User);
+ if (Deleted(component.Projectile))
+ return;
- TryComp<AppearanceComponent>(uid, out var appearance);
- _appearance.SetData(uid, SharedTetherGunSystem.TetherVisualsStatus.Key, true, appearance);
- SetReeling(uid, component, false, args.User);
+ _audio.PlayPredicted(component.CycleSound, uid, args.User);
+ _appearance.SetData(uid, SharedTetherGunSystem.TetherVisualsStatus.Key, true);
- if (!Deleted(component.Projectile))
+ if (_netManager.IsServer)
{
- if (_netManager.IsServer)
- {
- QueueDel(component.Projectile.Value);
- }
-
- component.Projectile = null;
- Dirty(uid, component);
+ QueueDel(component.Projectile.Value);
}
+ component.Projectile = null;
+ SetReeling(uid, component, false, args.User);
+ _gun.ChangeBasicEntityAmmoCount(uid, 1);
+
args.Handled = true;
}
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
+using Robust.Shared.Utility;
namespace Content.Shared.Weapons.Ranged.Components;
[DataField("jointId"), AutoNetworkedField]
public string Joint = string.Empty;
- [DataField("projectile")] public EntityUid? Projectile;
+ [DataField, AutoNetworkedField]
+ public EntityUid? Projectile;
[ViewVariables(VVAccess.ReadWrite), DataField("reeling"), AutoNetworkedField]
public bool Reeling;
[ViewVariables(VVAccess.ReadWrite), DataField("cycleSound"), AutoNetworkedField]
public SoundSpecifier? CycleSound = new SoundPathSpecifier("/Audio/Weapons/Guns/MagIn/kinetic_reload.ogg");
+ [DataField, ViewVariables]
+ public SpriteSpecifier RopeSprite =
+ new SpriteSpecifier.Rsi(new ResPath("Objects/Weapons/Guns/Launchers/grappling_gun.rsi"), "rope");
+
public EntityUid? Stream;
}
}
#region Public API
+ public bool ChangeBasicEntityAmmoCount(EntityUid uid, int delta, BasicEntityAmmoProviderComponent? component = null)
+ {
+ if (!Resolve(uid, ref component, false) || component.Count == null)
+ return false;
+
+ return UpdateBasicEntityAmmoCount(uid, component.Count.Value + delta, component);
+ }
public bool UpdateBasicEntityAmmoCount(EntityUid uid, int count, BasicEntityAmmoProviderComponent? component = null)
{
- if (!Resolve(uid, ref component))
+ if (!Resolve(uid, ref component, false))
return false;
if (count > component.Capacity)
return false;
component.Count = count;
- Dirty(uid, component);
UpdateBasicEntityAppearance(uid, component);
UpdateAmmoCount(uid);
+ Dirty(uid, component);
return true;
}