PRevent the forever sleep. (#40366)

* Fix

* Rejuvenate

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
This commit is contained in:
Princess Cheeseballs
2025-10-09 06:32:43 -07:00
committed by GitHub
parent cc4c7f5ada
commit 3ac94ea7f5

View File

@@ -59,6 +59,8 @@ public sealed partial class SleepingSystem : EntitySystem
SubscribeLocalEvent<SleepingComponent, EntityZombifiedEvent>(OnZombified); SubscribeLocalEvent<SleepingComponent, EntityZombifiedEvent>(OnZombified);
SubscribeLocalEvent<SleepingComponent, MobStateChangedEvent>(OnMobStateChanged); SubscribeLocalEvent<SleepingComponent, MobStateChangedEvent>(OnMobStateChanged);
SubscribeLocalEvent<SleepingComponent, ComponentInit>(OnCompInit); SubscribeLocalEvent<SleepingComponent, ComponentInit>(OnCompInit);
SubscribeLocalEvent<SleepingComponent, ComponentRemove>(OnComponentRemoved);
SubscribeLocalEvent<SleepingComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<SleepingComponent, SpeakAttemptEvent>(OnSpeakAttempt); SubscribeLocalEvent<SleepingComponent, SpeakAttemptEvent>(OnSpeakAttempt);
SubscribeLocalEvent<SleepingComponent, CanSeeAttemptEvent>(OnSeeAttempt); SubscribeLocalEvent<SleepingComponent, CanSeeAttemptEvent>(OnSeeAttempt);
SubscribeLocalEvent<SleepingComponent, PointAttemptEvent>(OnPointAttempt); SubscribeLocalEvent<SleepingComponent, PointAttemptEvent>(OnPointAttempt);
@@ -69,7 +71,6 @@ public sealed partial class SleepingSystem : EntitySystem
SubscribeLocalEvent<SleepingComponent, InteractHandEvent>(OnInteractHand); SubscribeLocalEvent<SleepingComponent, InteractHandEvent>(OnInteractHand);
SubscribeLocalEvent<SleepingComponent, StunEndAttemptEvent>(OnStunEndAttempt); SubscribeLocalEvent<SleepingComponent, StunEndAttemptEvent>(OnStunEndAttempt);
SubscribeLocalEvent<SleepingComponent, StandUpAttemptEvent>(OnStandUpAttempt); SubscribeLocalEvent<SleepingComponent, StandUpAttemptEvent>(OnStandUpAttempt);
SubscribeLocalEvent<SleepingComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<ForcedSleepingStatusEffectComponent, StatusEffectAppliedEvent>(OnStatusEffectApplied); SubscribeLocalEvent<ForcedSleepingStatusEffectComponent, StatusEffectAppliedEvent>(OnStatusEffectApplied);
SubscribeLocalEvent<SleepingComponent, UnbuckleAttemptEvent>(OnUnbuckleAttempt); SubscribeLocalEvent<SleepingComponent, UnbuckleAttemptEvent>(OnUnbuckleAttempt);
@@ -102,6 +103,12 @@ public sealed partial class SleepingSystem : EntitySystem
TrySleeping((ent, ent.Comp)); TrySleeping((ent, ent.Comp));
} }
private void OnRejuvenate(Entity<SleepingComponent> ent, ref RejuvenateEvent args)
{
// WAKE UP!!!
RemComp<SleepingComponent>(ent);
}
/// <summary> /// <summary>
/// when sleeping component is added or removed, we do some stuff with other components. /// when sleeping component is added or removed, we do some stuff with other components.
/// </summary> /// </summary>
@@ -143,6 +150,16 @@ public sealed partial class SleepingSystem : EntitySystem
_actionsSystem.AddAction(ent, ref ent.Comp.WakeAction, WakeActionId, ent); _actionsSystem.AddAction(ent, ref ent.Comp.WakeAction, WakeActionId, ent);
} }
private void OnComponentRemoved(Entity<SleepingComponent> ent, ref ComponentRemove args)
{
_actionsSystem.RemoveAction(ent.Owner, ent.Comp.WakeAction);
var ev = new SleepStateChangedEvent(false);
RaiseLocalEvent(ent, ref ev);
_blindableSystem.UpdateIsBlind(ent.Owner);
}
private void OnSpeakAttempt(Entity<SleepingComponent> ent, ref SpeakAttemptEvent args) private void OnSpeakAttempt(Entity<SleepingComponent> ent, ref SpeakAttemptEvent args)
{ {
// TODO reduce duplication of this behavior with MobStateSystem somehow // TODO reduce duplication of this behavior with MobStateSystem somehow
@@ -187,11 +204,6 @@ public sealed partial class SleepingSystem : EntitySystem
args.Cancelled = true; args.Cancelled = true;
} }
private void OnRejuvenate(Entity<SleepingComponent> ent, ref RejuvenateEvent args)
{
TryWaking((ent.Owner, ent.Comp), true);
}
private void OnExamined(Entity<SleepingComponent> ent, ref ExaminedEvent args) private void OnExamined(Entity<SleepingComponent> ent, ref ExaminedEvent args)
{ {
if (args.IsInDetailsRange) if (args.IsInDetailsRange)
@@ -275,17 +287,6 @@ public sealed partial class SleepingSystem : EntitySystem
TrySleeping(args.Target); TrySleeping(args.Target);
} }
private void Wake(Entity<SleepingComponent> ent)
{
RemComp<SleepingComponent>(ent);
_actionsSystem.RemoveAction(ent.Owner, ent.Comp.WakeAction);
var ev = new SleepStateChangedEvent(false);
RaiseLocalEvent(ent, ref ev);
_blindableSystem.UpdateIsBlind(ent.Owner);
}
/// <summary> /// <summary>
/// Try sleeping. Only mobs can sleep. /// Try sleeping. Only mobs can sleep.
/// </summary> /// </summary>
@@ -345,8 +346,7 @@ public sealed partial class SleepingSystem : EntitySystem
_popupSystem.PopupClient(Loc.GetString("wake-other-success", ("target", Identity.Entity(ent, EntityManager))), ent, user); _popupSystem.PopupClient(Loc.GetString("wake-other-success", ("target", Identity.Entity(ent, EntityManager))), ent, user);
} }
Wake((ent, ent.Comp)); return RemComp<SleepingComponent>(ent);
return true;
} }
/// <summary> /// <summary>