using Content.Shared.Damage.Components;
using Content.Shared.Damage.Events;
using Content.Shared.Destructible;
+using Content.Shared.Prototypes;
using Content.Shared.Rejuvenate;
using Content.Shared.Slippery;
+using Content.Shared.StatusEffect;
using Content.Shared.StatusEffectNew;
+using Content.Shared.StatusEffectNew.Components;
+using Robust.Shared.Prototypes;
namespace Content.Shared.Damage.Systems;
public abstract class SharedGodmodeSystem : EntitySystem
{
+ [Dependency] private readonly IPrototypeManager _protoMan = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
public override void Initialize()
SubscribeLocalEvent<GodmodeComponent, BeforeDamageChangedEvent>(OnBeforeDamageChanged);
SubscribeLocalEvent<GodmodeComponent, BeforeStatusEffectAddedEvent>(OnBeforeStatusEffect);
+ SubscribeLocalEvent<GodmodeComponent, BeforeOldStatusEffectAddedEvent>(OnBeforeOldStatusEffect);
SubscribeLocalEvent<GodmodeComponent, BeforeStaminaDamageEvent>(OnBeforeStaminaDamage);
SubscribeLocalEvent<GodmodeComponent, SlipAttemptEvent>(OnSlipAttempt);
SubscribeLocalEvent<GodmodeComponent, DestructionAttemptEvent>(OnDestruction);
private void OnBeforeStatusEffect(EntityUid uid, GodmodeComponent component, ref BeforeStatusEffectAddedEvent args)
{
+ if (_protoMan.Index(args.Effect).HasComponent<RejuvenateRemovedStatusEffectComponent>(Factory))
+ args.Cancelled = true;
+ }
+
+ private void OnBeforeOldStatusEffect(Entity<GodmodeComponent> ent, ref BeforeOldStatusEffectAddedEvent args)
+ {
+ // Old status effect system doesn't distinguish between good and bad status effects
args.Cancelled = true;
}
if (!Resolve(uid, ref status, false))
return false;
- var ev = new BeforeStatusEffectAddedEvent(key);
+ var ev = new BeforeOldStatusEffectAddedEvent(key);
RaiseLocalEvent(uid, ref ev);
if (ev.Cancelled)
return false;
}
}
+ /// <summary>
+ /// Raised on an entity before a status effect is added to determine if adding it should be cancelled.
+ /// Obsolete version of <see cref="BeforeStatusEffectAddedEvent" />
+ /// </summary>
+ [ByRefEvent, Obsolete("Migration to StatusEffectNew.StatusEffectsSystem is required")]
+ public record struct BeforeOldStatusEffectAddedEvent(string EffectKey, bool Cancelled = false);
+
public readonly struct StatusEffectAddedEvent
{
public readonly EntityUid Uid;
--- /dev/null
+using Content.Shared.Damage.Components;
+using Content.Shared.Rejuvenate;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.StatusEffectNew.Components;
+
+/// <summary>
+/// Marker component for a status effect that should be removed on rejuvenation
+/// and should not be applied on targets with <see cref="GodmodeComponent" />.
+/// Only applies to effects using the new <see cref="StatusEffectsSystem" />.
+/// </summary>
+/// <seealso cref="RejuvenateEvent"/>
+[RegisterComponent, NetworkedComponent]
+public sealed partial class RejuvenateRemovedStatusEffectComponent : Component;
using Content.Shared.Movement.Events;
using Content.Shared.Movement.Systems;
+using Content.Shared.Rejuvenate;
using Content.Shared.StatusEffectNew.Components;
using Content.Shared.Stunnable;
using Robust.Shared.Player;
{
SubscribeLocalEvent<StatusEffectContainerComponent, LocalPlayerAttachedEvent>(RelayStatusEffectEvent);
SubscribeLocalEvent<StatusEffectContainerComponent, LocalPlayerDetachedEvent>(RelayStatusEffectEvent);
+ SubscribeLocalEvent<StatusEffectContainerComponent, RejuvenateEvent>(RelayStatusEffectEvent);
SubscribeLocalEvent<StatusEffectContainerComponent, RefreshMovementSpeedModifiersEvent>(RelayStatusEffectEvent);
SubscribeLocalEvent<StatusEffectContainerComponent, UpdateCanMoveEvent>(RelayStatusEffectEvent);
using System.Diagnostics.CodeAnalysis;
+using Content.Shared.Rejuvenate;
using Content.Shared.StatusEffectNew.Components;
using Content.Shared.Whitelist;
using Robust.Shared.Containers;
SubscribeLocalEvent<StatusEffectContainerComponent, EntInsertedIntoContainerMessage>(OnEntityInserted);
SubscribeLocalEvent<StatusEffectContainerComponent, EntRemovedFromContainerMessage>(OnEntityRemoved);
+ SubscribeLocalEvent<RejuvenateRemovedStatusEffectComponent, StatusEffectRelayedEvent<RejuvenateEvent>>(OnRejuvenate);
+
_containerQuery = GetEntityQuery<StatusEffectContainerComponent>();
_effectQuery = GetEntityQuery<StatusEffectComponent>();
}
Dirty(args.Entity, statusComp);
}
+ private void OnRejuvenate(Entity<RejuvenateRemovedStatusEffectComponent> ent,
+ ref StatusEffectRelayedEvent<RejuvenateEvent> args)
+ {
+ PredictedQueueDel(ent.Owner);
+ }
+
private void SetStatusEffectTime(EntityUid effect, TimeSpan? duration)
{
if (!_effectQuery.TryComp(effect, out var effectComp))
components:
- MobState
+# Things that should be removed by rejuvenation should parent to this
+# Also blocks the status effect being added to godmode-ed entities.
- type: entity
- parent: StatusEffectBase
+ parent: MobStatusEffectBase
+ id: MobStatusEffectDebuff
+ abstract: true
+ components:
+ - type: RejuvenateRemovedStatusEffect
+
+- type: entity
+ parent: MobStatusEffectDebuff
id: MobStandStatusEffectBase
abstract: true
components:
# The creature sleeps so heavily that nothing can wake him up. Not even its own death.
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectDebuff
id: StatusEffectForcedSleeping
name: forced sleep
components:
# This creature is asleep because it's disconnected from the game.
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectBase # Not even rejuvenate can cure SSD...
id: StatusEffectSSDSleeping
name: forced sleep
components:
# Blurs your vision and makes you randomly fall asleep
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectDebuff
id: StatusEffectDrowsiness
name: drowsiness
components:
# Adds drugs overlay
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectDebuff
id: StatusEffectSeeingRainbow
name: hallucinations
components:
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectDebuff
id: StatusEffectSlowdown
abstract: true
name: slowdown
# Makes you more slippery, or perhaps less slippery.
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectDebuff # Debatable if this should be MobStatusEffectBase or not
id: StatusEffectFriction
name: friction
components:
# Stunnable Status Effect
- type: entity
- parent: MobStatusEffectBase
+ parent: MobStatusEffectDebuff
id: StatusEffectStunned
name: stunned
components: