Files
wwdpublic/Content.Server/Medical/PenLightSystem.cs
SleepyScarecrow 04d01f687f Added Penlights (#567)
# Description

Added in penlights that spawn in Medical Staff PDAs.

---

# TODO

- [x] EyeCheck system
- [x] Add in the bloody pens.

---


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


https://github.com/user-attachments/assets/dc746aa2-782e-4d86-b9ef-9e012343fb87


</p>
</details>

---

# Changelog

🆑 Tilkku
- add: Added Pen Lights
- add: Eye Examination

---------

Signed-off-by: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2024-08-06 22:51:21 +01:00

119 lines
3.8 KiB
C#

using Content.Server.DoAfter;
using Content.Server.PowerCell;
using Content.Shared.Damage;
using Content.Shared.DoAfter;
using Content.Shared.Drugs;
using Content.Shared.Drunk;
using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Interaction;
using Content.Shared.Medical;
using Content.Shared.Mobs.Systems;
using Content.Shared.Traits.Assorted.Components;
using Robust.Server.GameObjects;
using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Server.Medical;
/// <summary>
/// This stores the eye exam system for <see cref="PenLightComponent"/>
/// </summary>
public sealed class PenLightSystem : EntitySystem
{
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly DoAfterSystem _doAfter = default!;
[Dependency] private readonly PowerCellSystem _powerCell = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<PenLightComponent, AfterInteractEvent>(OnAfterInteract);
SubscribeLocalEvent<PenLightComponent, PenLightDoAfterEvent>(OnDoAfter);
}
private void OnAfterInteract(EntityUid uid, PenLightComponent component, AfterInteractEvent args)
{
if (args.Handled
|| args.Target is not { } target)
return;
args.Handled = TryStartExam(uid, target, args.User, component);
}
private void OnDoAfter(Entity<PenLightComponent> uid, ref PenLightDoAfterEvent args)
{
if (args.Handled
|| args.Cancelled
|| args.Target == null
|| !_powerCell.HasDrawCharge(uid, user: args.User))
return;
OpenUserInterface(args.User, uid);
Diagnose(uid, args.Target.Value);
args.Handled = true;
}
/// <summary>
/// Actually handles the exam interaction.
/// </summary>
public bool TryStartExam(EntityUid uid, EntityUid target, EntityUid user, PenLightComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
return _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ExamSpeed, new PenLightDoAfterEvent(),
uid, target, uid)
{
BlockDuplicate = true,
BreakOnUserMove = true,
BreakOnTargetMove = true,
BreakOnHandChange = true,
NeedHand = true
});
}
private void OpenUserInterface(EntityUid user, EntityUid penlight)
{
if (!TryComp<ActorComponent>(user, out var actor)
|| !_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui))
return;
_uiSystem.OpenUi(ui, actor.PlayerSession);
}
/// <summary>
/// Runs the checks for the different types of eye damage
/// </summary>
private void Diagnose(EntityUid penlight, EntityUid target)
{
if (!_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui)
|| !HasComp<EyeComponent>(target))
return;
// Blind
var blind = _entityManager.HasComponent<PermanentBlindnessComponent>(target);
// Drunk
var drunk = _entityManager.HasComponent<DrunkComponent>(target);
// EyeDamage
var eyeDamage = false;
if (TryComp<BlindableComponent>(target, out var eyeDam))
{
eyeDamage = eyeDam.EyeDamage > 0 && eyeDam.EyeDamage < 6; //6 means perma-blind
}
// Hallucinating
var seeingRainbows = _entityManager.HasComponent<SeeingRainbowsComponent>(target);
// Healthy
var healthy = !(blind || drunk || eyeDamage || seeingRainbows);
_uiSystem.SendUiMessage(ui, new PenLightUserMessage(GetNetEntity(target),
blind,
drunk,
eyeDamage,
healthy,
seeingRainbows
));
}
}