Files
wwdpublic/Content.Server/Charges/Systems/ChargesSystem.cs
dootythefrooty 717f8404f0 Abductor Port (#2234)
<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Ports the lone abductor and possibly(?) the duo abductors.

---

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [X] Figure out why abductors aren't spawning as the abductor race.
- [X] Make sure it's not a buggy mess.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>

![image](https://github.com/user-attachments/assets/81292bde-ad96-4d08-a30e-87c9bc2df8aa)
</p>
</details>

---
# Credits
Thank to [Starlight ](https://discord.com/invite/wAyQKB78fH)for the
original version!
Darkrell, Rinary, and Landosaur made the funny little guys.

![image](https://github.com/user-attachments/assets/1c62afe9-7fb9-458e-bc61-5745ba3a2a6b)

# Changelog

<!--
You can add an author after the `🆑` to change the name that appears
in the changelog (ex: `🆑 Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

🆑 Darkrell, Rinary, Landosaur
- add: The Abductors are here to replace your organs. Gleep Glorp!

---------

Co-authored-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com>
Co-authored-by: Solstice <solsticeofthewinter@gmail.com>
Co-authored-by: SX_7 <sn1.test.preria.2002@gmail.com>
Co-authored-by: Theodore Lukin <66275205+pheenty@users.noreply.github.com>
Co-authored-by: Piras314 <p1r4s@proton.me>
Co-authored-by: Ilya246 <57039557+ilya246@users.noreply.github.com>

(cherry picked from commit ea9f1526868289d20832989cb02f79c76c240918)
2025-04-19 01:45:58 +03:00

65 lines
2.4 KiB
C#

using Content.Server.Charges.Components;
using Content.Shared.Charges.Components;
using Content.Shared.Charges.Systems;
using Content.Shared.Examine;
using Robust.Shared.Timing;
namespace Content.Server.Charges.Systems;
public sealed class ChargesSystem : SharedChargesSystem
{
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AutoRechargeComponent, ComponentInit>(OnInit);
}
private void OnInit(EntityUid uid, AutoRechargeComponent comp, ComponentInit args)
{
comp.NextChargeTime = _timing.CurTime + comp.RechargeDuration;
}
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<LimitedChargesComponent, AutoRechargeComponent>();
while (query.MoveNext(out var uid, out var charges, out var recharge))
{
if (charges.Charges == charges.MaxCharges || _timing.CurTime < recharge.NextChargeTime)
continue;
AddCharges(uid, 1, charges);
recharge.NextChargeTime = _timing.CurTime + recharge.RechargeDuration;
}
}
protected override void OnExamine(EntityUid uid, LimitedChargesComponent comp, ExaminedEvent args)
{
base.OnExamine(uid, comp, args);
// only show the recharging info if it's not full
if (!args.IsInDetailsRange || comp.Charges == comp.MaxCharges || !TryComp<AutoRechargeComponent>(uid, out var recharge))
return;
var timeRemaining = Math.Round((recharge.NextChargeTime - _timing.CurTime).TotalSeconds);
args.PushMarkup(Loc.GetString("limited-charges-recharging", ("seconds", timeRemaining)));
}
public override void AddCharges(EntityUid uid, int change, LimitedChargesComponent? comp = null)
{
if (!Query.Resolve(uid, ref comp, false))
return;
var startRecharge = comp.Charges == comp.MaxCharges;
base.AddCharges(uid, change, comp);
// if a charge was just used from full, start the recharge timer
// TODO: probably make this an event instead of having le server system that just does this
if (change < 0 && startRecharge && TryComp<AutoRechargeComponent>(uid, out var recharge))
recharge.NextChargeTime = _timing.CurTime + recharge.RechargeDuration;
}
}