Refactor status icons take 2, cyborgs don't see criminal status (#26207)

* Initial commit.

* review

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
Krunklehorn
2024-04-17 23:20:44 -04:00
committed by GitHub
parent 020f322e27
commit 460b588de5
19 changed files with 266 additions and 203 deletions

View File

@@ -0,0 +1,28 @@
using Content.Shared.Overlays;
using Content.Shared.Security.Components;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes;
namespace Content.Client.Overlays;
public sealed class ShowCriminalRecordIconsSystem : EquipmentHudSystem<ShowCriminalRecordIconsComponent>
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CriminalRecordComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
}
private void OnGetStatusIconsEvent(EntityUid uid, CriminalRecordComponent component, ref GetStatusIconsEvent ev)
{
if (!IsActive || ev.InContainer)
return;
if (_prototype.TryIndex<StatusIconPrototype>(component.StatusIcon.Id, out var iconPrototype))
ev.StatusIcons.Add(iconPrototype);
}
}

View File

@@ -1,14 +1,13 @@
using Content.Shared.Nutrition.EntitySystems;
using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.Components;
using Content.Shared.Overlays; using Content.Shared.Overlays;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components; using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes;
namespace Content.Client.Overlays; namespace Content.Client.Overlays;
public sealed class ShowHungerIconsSystem : EquipmentHudSystem<ShowHungerIconsComponent> public sealed class ShowHungerIconsSystem : EquipmentHudSystem<ShowHungerIconsComponent>
{ {
[Dependency] private readonly IPrototypeManager _prototypeMan = default!; [Dependency] private readonly HungerSystem _hunger = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -17,42 +16,12 @@ public sealed class ShowHungerIconsSystem : EquipmentHudSystem<ShowHungerIconsCo
SubscribeLocalEvent<HungerComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent); SubscribeLocalEvent<HungerComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
} }
private void OnGetStatusIconsEvent(EntityUid uid, HungerComponent hungerComponent, ref GetStatusIconsEvent args) private void OnGetStatusIconsEvent(EntityUid uid, HungerComponent component, ref GetStatusIconsEvent ev)
{ {
if (!IsActive || args.InContainer) if (!IsActive || ev.InContainer)
return; return;
var hungerIcons = DecideHungerIcon(uid, hungerComponent); if (_hunger.TryGetStatusIconPrototype(component, out var iconPrototype))
ev.StatusIcons.Add(iconPrototype);
args.StatusIcons.AddRange(hungerIcons);
}
private IReadOnlyList<StatusIconPrototype> DecideHungerIcon(EntityUid uid, HungerComponent hungerComponent)
{
var result = new List<StatusIconPrototype>();
switch (hungerComponent.CurrentThreshold)
{
case HungerThreshold.Overfed:
if (_prototypeMan.TryIndex<StatusIconPrototype>("HungerIconOverfed", out var overfed))
{
result.Add(overfed);
}
break;
case HungerThreshold.Peckish:
if (_prototypeMan.TryIndex<StatusIconPrototype>("HungerIconPeckish", out var peckish))
{
result.Add(peckish);
}
break;
case HungerThreshold.Starving:
if (_prototypeMan.TryIndex<StatusIconPrototype>("HungerIconStarving", out var starving))
{
result.Add(starving);
}
break;
}
return result;
} }
} }

View File

@@ -0,0 +1,60 @@
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.Overlays;
using Content.Shared.PDA;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes;
namespace Content.Client.Overlays;
public sealed class ShowJobIconsSystem : EquipmentHudSystem<ShowJobIconsComponent>
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!;
[ValidatePrototypeId<StatusIconPrototype>]
private const string JobIconForNoId = "JobIconNoId";
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<StatusIconComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
}
private void OnGetStatusIconsEvent(EntityUid uid, StatusIconComponent _, ref GetStatusIconsEvent ev)
{
if (!IsActive || ev.InContainer)
return;
var iconId = JobIconForNoId;
if (_accessReader.FindAccessItemsInventory(uid, out var items))
{
foreach (var item in items)
{
// ID Card
if (TryComp<IdCardComponent>(item, out var id))
{
iconId = id.JobIcon;
break;
}
// PDA
if (TryComp<PdaComponent>(item, out var pda)
&& pda.ContainedId != null
&& TryComp(pda.ContainedId, out id))
{
iconId = id.JobIcon;
break;
}
}
}
if (_prototype.TryIndex<StatusIconPrototype>(iconId, out var iconPrototype))
ev.StatusIcons.Add(iconPrototype);
else
Log.Error($"Invalid job icon prototype: {iconPrototype}");
}
}

View File

@@ -0,0 +1,28 @@
using Content.Shared.Mindshield.Components;
using Content.Shared.Overlays;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes;
namespace Content.Client.Overlays;
public sealed class ShowMindShieldIconsSystem : EquipmentHudSystem<ShowMindShieldIconsComponent>
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<MindShieldComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
}
private void OnGetStatusIconsEvent(EntityUid uid, MindShieldComponent component, ref GetStatusIconsEvent ev)
{
if (!IsActive || ev.InContainer)
return;
if (_prototype.TryIndex<StatusIconPrototype>(component.MindShieldStatusIcon.Id, out var iconPrototype))
ev.StatusIcons.Add(iconPrototype);
}
}

View File

@@ -1,86 +0,0 @@
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.Mindshield.Components;
using Content.Shared.Overlays;
using Content.Shared.PDA;
using Content.Shared.Security.Components;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes;
namespace Content.Client.Overlays;
public sealed class ShowSecurityIconsSystem : EquipmentHudSystem<ShowSecurityIconsComponent>
{
[Dependency] private readonly IPrototypeManager _prototypeMan = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!;
[ValidatePrototypeId<StatusIconPrototype>]
private const string JobIconForNoId = "JobIconNoId";
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<StatusIconComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
}
private void OnGetStatusIconsEvent(EntityUid uid, StatusIconComponent _, ref GetStatusIconsEvent @event)
{
if (!IsActive || @event.InContainer)
{
return;
}
var securityIcons = DecideSecurityIcon(uid);
@event.StatusIcons.AddRange(securityIcons);
}
private IReadOnlyList<StatusIconPrototype> DecideSecurityIcon(EntityUid uid)
{
var result = new List<StatusIconPrototype>();
var jobIconToGet = JobIconForNoId;
if (_accessReader.FindAccessItemsInventory(uid, out var items))
{
foreach (var item in items)
{
// ID Card
if (TryComp(item, out IdCardComponent? id))
{
jobIconToGet = id.JobIcon;
break;
}
// PDA
if (TryComp(item, out PdaComponent? pda)
&& pda.ContainedId != null
&& TryComp(pda.ContainedId, out id))
{
jobIconToGet = id.JobIcon;
break;
}
}
}
if (_prototypeMan.TryIndex<StatusIconPrototype>(jobIconToGet, out var jobIcon))
result.Add(jobIcon);
else
Log.Error($"Invalid job icon prototype: {jobIcon}");
if (TryComp<MindShieldComponent>(uid, out var comp))
{
if (_prototypeMan.TryIndex<StatusIconPrototype>(comp.MindShieldStatusIcon.Id, out var icon))
result.Add(icon);
}
if (TryComp<CriminalRecordComponent>(uid, out var record))
{
if(_prototypeMan.TryIndex<StatusIconPrototype>(record.StatusIcon.Id, out var criminalIcon))
result.Add(criminalIcon);
}
return result;
}
}

View File

@@ -1,10 +1,11 @@
using Content.Shared.Overlays; using Content.Shared.Overlays;
using Content.Shared.StatusIcon.Components;
using Content.Shared.NukeOps; using Content.Shared.NukeOps;
using Content.Shared.StatusIcon; using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
namespace Content.Client.Overlays; namespace Content.Client.Overlays;
public sealed class ShowSyndicateIconsSystem : EquipmentHudSystem<ShowSyndicateIconsComponent> public sealed class ShowSyndicateIconsSystem : EquipmentHudSystem<ShowSyndicateIconsComponent>
{ {
[Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IPrototypeManager _prototype = default!;
@@ -16,28 +17,13 @@ public sealed class ShowSyndicateIconsSystem : EquipmentHudSystem<ShowSyndicateI
SubscribeLocalEvent<NukeOperativeComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent); SubscribeLocalEvent<NukeOperativeComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
} }
private void OnGetStatusIconsEvent(EntityUid uid, NukeOperativeComponent nukeOperativeComponent, ref GetStatusIconsEvent args) private void OnGetStatusIconsEvent(EntityUid uid, NukeOperativeComponent component, ref GetStatusIconsEvent ev)
{ {
if (!IsActive || args.InContainer) if (!IsActive || ev.InContainer)
{
return; return;
}
var syndicateIcons = SyndicateIcon(uid, nukeOperativeComponent); if (_prototype.TryIndex<StatusIconPrototype>(component.SyndStatusIcon, out var iconPrototype))
ev.StatusIcons.Add(iconPrototype);
args.StatusIcons.AddRange(syndicateIcons);
}
private IReadOnlyList<StatusIconPrototype> SyndicateIcon(EntityUid uid, NukeOperativeComponent nukeOperativeComponent)
{
var result = new List<StatusIconPrototype>();
if (_prototype.TryIndex<StatusIconPrototype>(nukeOperativeComponent.SyndStatusIcon, out var syndicateicon))
{
result.Add(syndicateicon);
}
return result;
} }
} }

View File

@@ -1,14 +1,13 @@
using Content.Shared.Nutrition.EntitySystems;
using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.Components;
using Content.Shared.Overlays; using Content.Shared.Overlays;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components; using Content.Shared.StatusIcon.Components;
using Robust.Shared.Prototypes;
namespace Content.Client.Overlays; namespace Content.Client.Overlays;
public sealed class ShowThirstIconsSystem : EquipmentHudSystem<ShowThirstIconsComponent> public sealed class ShowThirstIconsSystem : EquipmentHudSystem<ShowThirstIconsComponent>
{ {
[Dependency] private readonly IPrototypeManager _prototypeMan = default!; [Dependency] private readonly ThirstSystem _thirst = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -17,42 +16,12 @@ public sealed class ShowThirstIconsSystem : EquipmentHudSystem<ShowThirstIconsCo
SubscribeLocalEvent<ThirstComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent); SubscribeLocalEvent<ThirstComponent, GetStatusIconsEvent>(OnGetStatusIconsEvent);
} }
private void OnGetStatusIconsEvent(EntityUid uid, ThirstComponent thirstComponent, ref GetStatusIconsEvent args) private void OnGetStatusIconsEvent(EntityUid uid, ThirstComponent component, ref GetStatusIconsEvent ev)
{ {
if (!IsActive || args.InContainer) if (!IsActive || ev.InContainer)
return; return;
var thirstIcons = DecideThirstIcon(uid, thirstComponent); if (_thirst.TryGetStatusIconPrototype(component, out var iconPrototype))
ev.StatusIcons.Add(iconPrototype!);
args.StatusIcons.AddRange(thirstIcons);
}
private IReadOnlyList<StatusIconPrototype> DecideThirstIcon(EntityUid uid, ThirstComponent thirstComponent)
{
var result = new List<StatusIconPrototype>();
switch (thirstComponent.CurrentThirstThreshold)
{
case ThirstThreshold.OverHydrated:
if (_prototypeMan.TryIndex<StatusIconPrototype>("ThirstIconOverhydrated", out var overhydrated))
{
result.Add(overhydrated);
}
break;
case ThirstThreshold.Thirsty:
if (_prototypeMan.TryIndex<StatusIconPrototype>("ThirstIconThirsty", out var thirsty))
{
result.Add(thirsty);
}
break;
case ThirstThreshold.Parched:
if (_prototypeMan.TryIndex<StatusIconPrototype>("ThirstIconParched", out var parched))
{
result.Add(parched);
}
break;
}
return result;
} }
} }

View File

@@ -38,12 +38,14 @@ public partial class InventorySystem
SubscribeLocalEvent<InventoryComponent, SolutionScanEvent>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, SolutionScanEvent>(RelayInventoryEvent);
// ComponentActivatedClientSystems // ComponentActivatedClientSystems
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowSecurityIconsComponent>>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowJobIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowHealthBarsComponent>>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowHealthBarsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowHealthIconsComponent>>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowHealthIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowHungerIconsComponent>>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowHungerIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowThirstIconsComponent>>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowThirstIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowMindShieldIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowSyndicateIconsComponent>>(RelayInventoryEvent); SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowSyndicateIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ShowCriminalRecordIconsComponent>>(RelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<EquipmentVerb>>(OnGetEquipmentVerbs); SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<EquipmentVerb>>(OnGetEquipmentVerbs);
} }

View File

@@ -1,17 +1,22 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Alert; using Content.Shared.Alert;
using Content.Shared.Damage; using Content.Shared.Damage;
using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Systems;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.Components;
using Content.Shared.Rejuvenate; using Content.Shared.Rejuvenate;
using Content.Shared.StatusIcon;
using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Random;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Shared.Nutrition.EntitySystems; namespace Content.Shared.Nutrition.EntitySystems;
public sealed class HungerSystem : EntitySystem public sealed class HungerSystem : EntitySystem
{ {
[Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly DamageableSystem _damageable = default!;
@@ -19,10 +24,27 @@ public sealed class HungerSystem : EntitySystem
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
[Dependency] private readonly SharedJetpackSystem _jetpack = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!;
[ValidatePrototypeId<StatusIconPrototype>]
private const string HungerIconOverfedId = "HungerIconOverfed";
[ValidatePrototypeId<StatusIconPrototype>]
private const string HungerIconPeckishId = "HungerIconPeckish";
[ValidatePrototypeId<StatusIconPrototype>]
private const string HungerIconStarvingId = "HungerIconStarving";
private StatusIconPrototype? _hungerIconOverfed;
private StatusIconPrototype? _hungerIconPeckish;
private StatusIconPrototype? _hungerIconStarving;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
DebugTools.Assert(_prototype.TryIndex(HungerIconOverfedId, out _hungerIconOverfed) &&
_prototype.TryIndex(HungerIconPeckishId, out _hungerIconPeckish) &&
_prototype.TryIndex(HungerIconStarvingId, out _hungerIconStarving));
SubscribeLocalEvent<HungerComponent, MapInitEvent>(OnMapInit); SubscribeLocalEvent<HungerComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<HungerComponent, ComponentShutdown>(OnShutdown); SubscribeLocalEvent<HungerComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<HungerComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed); SubscribeLocalEvent<HungerComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
@@ -194,6 +216,27 @@ public sealed class HungerSystem : EntitySystem
} }
} }
public bool TryGetStatusIconPrototype(HungerComponent component, [NotNullWhen(true)] out StatusIconPrototype? prototype)
{
switch (component.CurrentThreshold)
{
case HungerThreshold.Overfed:
prototype = _hungerIconOverfed;
break;
case HungerThreshold.Peckish:
prototype = _hungerIconPeckish;
break;
case HungerThreshold.Starving:
prototype = _hungerIconStarving;
break;
default:
prototype = null;
break;
}
return prototype != null;
}
public override void Update(float frameTime) public override void Update(float frameTime)
{ {
base.Update(frameTime); base.Update(frameTime);

View File

@@ -3,9 +3,12 @@ using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.Components;
using Content.Shared.Rejuvenate; using Content.Shared.Rejuvenate;
using Content.Shared.StatusIcon;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Random;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Shared.Nutrition.EntitySystems; namespace Content.Shared.Nutrition.EntitySystems;
@@ -13,15 +16,33 @@ namespace Content.Shared.Nutrition.EntitySystems;
public sealed class ThirstSystem : EntitySystem public sealed class ThirstSystem : EntitySystem
{ {
[Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!; [Dependency] private readonly MovementSpeedModifierSystem _movement = default!;
[Dependency] private readonly SharedJetpackSystem _jetpack = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!;
[ValidatePrototypeId<StatusIconPrototype>]
private const string ThirstIconOverhydratedId = "ThirstIconOverhydrated";
[ValidatePrototypeId<StatusIconPrototype>]
private const string ThirstIconThirstyId = "ThirstIconThirsty";
[ValidatePrototypeId<StatusIconPrototype>]
private const string ThirstIconParchedId = "ThirstIconParched";
private StatusIconPrototype? _thirstIconOverhydrated = null;
private StatusIconPrototype? _thirstIconThirsty = null;
private StatusIconPrototype? _thirstIconParched = null;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
DebugTools.Assert(_prototype.TryIndex(ThirstIconOverhydratedId, out _thirstIconOverhydrated) &&
_prototype.TryIndex(ThirstIconThirstyId, out _thirstIconThirsty) &&
_prototype.TryIndex(ThirstIconParchedId, out _thirstIconParched));
SubscribeLocalEvent<ThirstComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed); SubscribeLocalEvent<ThirstComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
SubscribeLocalEvent<ThirstComponent, MapInitEvent>(OnMapInit); SubscribeLocalEvent<ThirstComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<ThirstComponent, RejuvenateEvent>(OnRejuvenate); SubscribeLocalEvent<ThirstComponent, RejuvenateEvent>(OnRejuvenate);
@@ -107,6 +128,28 @@ public sealed class ThirstSystem : EntitySystem
} }
} }
public bool TryGetStatusIconPrototype(ThirstComponent component, out StatusIconPrototype? prototype)
{
switch (component.CurrentThirstThreshold)
{
case ThirstThreshold.OverHydrated:
prototype = _thirstIconOverhydrated;
return true;
case ThirstThreshold.Thirsty:
prototype = _thirstIconThirsty;
return true;
case ThirstThreshold.Parched:
prototype = _thirstIconParched;
return true;
default:
prototype = null;
return false;
}
}
private void UpdateEffects(EntityUid uid, ThirstComponent component) private void UpdateEffects(EntityUid uid, ThirstComponent component)
{ {
if (IsMovementThreshold(component.LastThirstThreshold) != IsMovementThreshold(component.CurrentThirstThreshold) && if (IsMovementThreshold(component.LastThirstThreshold) != IsMovementThreshold(component.CurrentThirstThreshold) &&

View File

@@ -0,0 +1,9 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Overlays;
/// <summary>
/// This component allows you to see criminal record status of mobs.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class ShowCriminalRecordIconsComponent : Component { }

View File

@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Shared.Overlays; namespace Content.Shared.Overlays;
/// <summary> /// <summary>
/// This component allows you to see the hungriness of mobs. /// This component allows you to see the hungriness of mobs.
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent] [RegisterComponent, NetworkedComponent]
public sealed partial class ShowHungerIconsComponent : Component { } public sealed partial class ShowHungerIconsComponent : Component { }

View File

@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Shared.Overlays; namespace Content.Shared.Overlays;
/// <summary> /// <summary>
/// This component allows you to see job icons above mobs. /// This component allows you to see job icons above mobs.
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent] [RegisterComponent, NetworkedComponent]
public sealed partial class ShowSecurityIconsComponent : Component { } public sealed partial class ShowJobIconsComponent : Component { }

View File

@@ -0,0 +1,9 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Overlays;
/// <summary>
/// This component allows you to see mindshield icons above mobs.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class ShowMindShieldIconsComponent : Component { }

View File

@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Shared.Overlays; namespace Content.Shared.Overlays;
/// <summary> /// <summary>
/// /// This component allows you to identify members of the Syndicate faction.
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent] [RegisterComponent, NetworkedComponent]
public sealed partial class ShowSyndicateIconsComponent : Component {} public sealed partial class ShowSyndicateIconsComponent : Component {}

View File

@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Shared.Overlays; namespace Content.Shared.Overlays;
/// <summary> /// <summary>
/// This component allows you to see the thirstiness of mobs. /// This component allows you to see the thirstiness of mobs.
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent] [RegisterComponent, NetworkedComponent]
public sealed partial class ShowThirstIconsComponent : Component { } public sealed partial class ShowThirstIconsComponent : Component { }

View File

@@ -156,7 +156,7 @@
- WhitelistChameleon - WhitelistChameleon
- type: entity - type: entity
parent: ClothingEyesBase parent: [ClothingEyesBase, ShowSecurityIcons]
id: ClothingEyesGlassesSecurity id: ClothingEyesGlassesSecurity
name: security glasses name: security glasses
description: Upgraded sunglasses that provide flash immunity and a security HUD. description: Upgraded sunglasses that provide flash immunity and a security HUD.
@@ -178,7 +178,6 @@
- type: GuideHelp - type: GuideHelp
guides: guides:
- Security - Security
- type: ShowSecurityIcons
- type: IdentityBlocker - type: IdentityBlocker
coverage: EYES coverage: EYES

View File

@@ -1,3 +1,13 @@
- type: entity
id: ShowSecurityIcons
abstract: true
noSpawn: true
components:
- type: ShowJobIcons
- type: ShowMindShieldIcons
- type: ShowCriminalRecordIcons
- type: entity - type: entity
parent: ClothingEyesBase parent: ClothingEyesBase
id: ClothingEyesHudDiagnostic id: ClothingEyesHudDiagnostic
@@ -17,7 +27,7 @@
parent: ClothingEyesBase parent: ClothingEyesBase
id: ClothingEyesHudMedical id: ClothingEyesHudMedical
name: medical hud name: medical hud
description: A heads-up display that scans the humanoids in view and provides accurate data about their health status. description: A heads-up display that scans the humanoids in view and provides accurate data about their health status.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Eyes/Hud/med.rsi sprite: Clothing/Eyes/Hud/med.rsi
@@ -34,7 +44,7 @@
- HudMedical - HudMedical
- type: entity - type: entity
parent: ClothingEyesBase parent: [ClothingEyesBase, ShowSecurityIcons]
id: ClothingEyesHudSecurity id: ClothingEyesHudSecurity
name: security hud name: security hud
description: A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. description: A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records.
@@ -43,7 +53,6 @@
sprite: Clothing/Eyes/Hud/sec.rsi sprite: Clothing/Eyes/Hud/sec.rsi
- type: Clothing - type: Clothing
sprite: Clothing/Eyes/Hud/sec.rsi sprite: Clothing/Eyes/Hud/sec.rsi
- type: ShowSecurityIcons
- type: Tag - type: Tag
tags: tags:
- HudSecurity - HudSecurity
@@ -138,7 +147,7 @@
- type: ShowThirstIcons - type: ShowThirstIcons
- type: entity - type: entity
parent: ClothingEyesBase parent: [ClothingEyesBase, ShowSecurityIcons]
id: ClothingEyesHudMedSec id: ClothingEyesHudMedSec
name: medsec hud name: medsec hud
description: An eye display that looks like a mixture of medical and security huds. description: An eye display that looks like a mixture of medical and security huds.
@@ -150,13 +159,12 @@
- type: Construction - type: Construction
graph: HudMedSec graph: HudMedSec
node: medsecHud node: medsecHud
- type: ShowSecurityIcons
- type: ShowHealthBars - type: ShowHealthBars
damageContainers: damageContainers:
- Biological - Biological
- type: entity - type: entity
parent: ClothingEyesBase parent: [ClothingEyesBase, ShowSecurityIcons]
id: ClothingEyesHudMultiversal id: ClothingEyesHudMultiversal
name: multiversal hud name: multiversal hud
description: Filler description: Filler
@@ -165,7 +173,6 @@
sprite: Clothing/Eyes/Hud/medsecengi.rsi sprite: Clothing/Eyes/Hud/medsecengi.rsi
- type: Clothing - type: Clothing
sprite: Clothing/Eyes/Hud/medsecengi.rsi sprite: Clothing/Eyes/Hud/medsecengi.rsi
- type: ShowSecurityIcons
- type: ShowHealthBars - type: ShowHealthBars
damageContainers: damageContainers:
- Biological - Biological
@@ -176,7 +183,7 @@
- type: ShowSyndicateIcons - type: ShowSyndicateIcons
- type: entity - type: entity
parent: ClothingEyesBase parent: [ClothingEyesBase, ShowSecurityIcons]
id: ClothingEyesHudOmni id: ClothingEyesHudOmni
name: omni hud name: omni hud
description: Filler description: Filler
@@ -185,7 +192,6 @@
sprite: Clothing/Eyes/Hud/omni.rsi sprite: Clothing/Eyes/Hud/omni.rsi
- type: Clothing - type: Clothing
sprite: Clothing/Eyes/Hud/omni.rsi sprite: Clothing/Eyes/Hud/omni.rsi
- type: ShowSecurityIcons
- type: ShowHealthBars - type: ShowHealthBars
damageContainers: damageContainers:
- Biological - Biological
@@ -198,7 +204,7 @@
- type: ShowSyndicateIcons - type: ShowSyndicateIcons
- type: entity - type: entity
parent: ClothingEyesBase parent: [ClothingEyesBase, ShowSecurityIcons]
id: ClothingEyesHudSyndicate id: ClothingEyesHudSyndicate
name: syndicate visor name: syndicate visor
description: The syndicate's professional head-up display, designed for better detection of humanoids and their subsequent elimination. description: The syndicate's professional head-up display, designed for better detection of humanoids and their subsequent elimination.
@@ -208,7 +214,6 @@
- type: Clothing - type: Clothing
sprite: Clothing/Eyes/Hud/synd.rsi sprite: Clothing/Eyes/Hud/synd.rsi
- type: ShowSyndicateIcons - type: ShowSyndicateIcons
- type: ShowSecurityIcons
- type: entity - type: entity
parent: ClothingEyesBase parent: ClothingEyesBase
@@ -227,11 +232,9 @@
- Biological - Biological
- type: entity - type: entity
parent: ClothingEyesGlassesSunglasses parent: [ClothingEyesGlassesSunglasses, ShowSecurityIcons]
id: ClothingEyesGlassesHiddenSecurity id: ClothingEyesGlassesHiddenSecurity
suffix: Syndicate suffix: Syndicate
components:
- type: ShowSecurityIcons
- type: entity - type: entity
parent: ClothingEyesHudMedical parent: ClothingEyesHudMedical

View File

@@ -227,7 +227,8 @@
- AllAccess - AllAccess
- type: AccessReader - type: AccessReader
access: [["Command"], ["Research"]] access: [["Command"], ["Research"]]
- type: ShowSecurityIcons - type: ShowJobIcons
- type: ShowMindShieldIcons
- type: entity - type: entity
id: BaseBorgChassisSyndicate id: BaseBorgChassisSyndicate