using Content.Server.Weapon.Ranged.Components; using Content.Shared.Examine; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Server.Weapon.Ranged.Systems; public sealed class RechargeBasicEntityAmmoSystem : EntitySystem { [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedGunSystem _gun = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnExamined); } public override void Update(float frameTime) { base.Update(frameTime); foreach (var (recharge, ammo) in EntityQuery()) { if (ammo.Count is null || ammo.Count == ammo.Capacity) continue; recharge.AccumulatedFrameTime += frameTime; if (recharge.AccumulatedFrameTime < recharge.NextRechargeTime) return; recharge.AccumulatedFrameTime -= recharge.NextRechargeTime; UpdateCooldown(recharge); if (_gun.UpdateBasicEntityAmmoCount(ammo.Owner, ammo.Count.Value + 1, ammo)) { SoundSystem.Play(recharge.RechargeSound.GetSound(), Filter.Pvs(recharge.Owner), recharge.Owner, recharge.RechargeSound.Params); } } } private void OnInit(EntityUid uid, RechargeBasicEntityAmmoComponent component, ComponentInit args) { UpdateCooldown(component); } private void OnExamined(EntityUid uid, RechargeBasicEntityAmmoComponent component, ExaminedEvent args) { if (!TryComp(uid, out var ammo) || ammo.Count == ammo.Capacity) { args.PushMarkup(Loc.GetString("recharge-basic-entity-ammo-full")); return; } var timeLeft = component.NextRechargeTime - component.AccumulatedFrameTime; args.PushMarkup(Loc.GetString("recharge-basic-entity-ammo-can-recharge", ("seconds", Math.Round(timeLeft, 1)))); } private void UpdateCooldown(RechargeBasicEntityAmmoComponent component) { component.NextRechargeTime = _random.NextFloat(component.MinRechargeCooldown, component.MaxRechargeCooldown); } }