fix mirror server crashes (#28318)
This commit is contained in:
@@ -4,7 +4,6 @@ using Content.Shared.Humanoid.Markings;
|
|||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.UserInterface;
|
using Content.Shared.UserInterface;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
using Robust.Shared.Utility;
|
|
||||||
|
|
||||||
namespace Content.Shared.MagicMirror;
|
namespace Content.Shared.MagicMirror;
|
||||||
|
|
||||||
@@ -18,6 +17,7 @@ public abstract class SharedMagicMirrorSystem : EntitySystem
|
|||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<MagicMirrorComponent, AfterInteractEvent>(OnMagicMirrorInteract);
|
SubscribeLocalEvent<MagicMirrorComponent, AfterInteractEvent>(OnMagicMirrorInteract);
|
||||||
SubscribeLocalEvent<MagicMirrorComponent, BeforeActivatableUIOpenEvent>(OnBeforeUIOpen);
|
SubscribeLocalEvent<MagicMirrorComponent, BeforeActivatableUIOpenEvent>(OnBeforeUIOpen);
|
||||||
|
SubscribeLocalEvent<MagicMirrorComponent, ActivatableUIOpenAttemptEvent>(OnAttemptOpenUI);
|
||||||
SubscribeLocalEvent<MagicMirrorComponent, BoundUserInterfaceCheckRangeEvent>(OnMirrorRangeCheck);
|
SubscribeLocalEvent<MagicMirrorComponent, BoundUserInterfaceCheckRangeEvent>(OnMirrorRangeCheck);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,10 +26,8 @@ public abstract class SharedMagicMirrorSystem : EntitySystem
|
|||||||
if (!args.CanReach || args.Target == null)
|
if (!args.CanReach || args.Target == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!UISystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User))
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdateInterface(mirror, args.Target.Value, mirror);
|
UpdateInterface(mirror, args.Target.Value, mirror);
|
||||||
|
UISystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args)
|
private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args)
|
||||||
@@ -37,17 +35,27 @@ public abstract class SharedMagicMirrorSystem : EntitySystem
|
|||||||
if (args.Result == BoundUserInterfaceRangeResult.Fail)
|
if (args.Result == BoundUserInterfaceRangeResult.Fail)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DebugTools.Assert(component.Target != null && Exists(component.Target));
|
if (component.Target == null || !Exists(component.Target))
|
||||||
|
{
|
||||||
|
component.Target = null;
|
||||||
|
args.Result = BoundUserInterfaceRangeResult.Fail;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_interaction.InRangeUnobstructed(uid, component.Target.Value))
|
if (!_interaction.InRangeUnobstructed(uid, component.Target.Value))
|
||||||
args.Result = BoundUserInterfaceRangeResult.Fail;
|
args.Result = BoundUserInterfaceRangeResult.Fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnAttemptOpenUI(EntityUid uid, MagicMirrorComponent component, ref ActivatableUIOpenAttemptEvent args)
|
||||||
|
{
|
||||||
|
var user = component.Target ?? args.User;
|
||||||
|
|
||||||
|
if (!HasComp<HumanoidAppearanceComponent>(user))
|
||||||
|
args.Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
private void OnBeforeUIOpen(Entity<MagicMirrorComponent> ent, ref BeforeActivatableUIOpenEvent args)
|
private void OnBeforeUIOpen(Entity<MagicMirrorComponent> ent, ref BeforeActivatableUIOpenEvent args)
|
||||||
{
|
{
|
||||||
if (args.User != ent.Comp.Target && ent.Comp.Target != null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdateInterface(ent, args.User, ent);
|
UpdateInterface(ent, args.User, ent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,6 +63,7 @@ public abstract class SharedMagicMirrorSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
if (!TryComp<HumanoidAppearanceComponent>(targetUid, out var humanoid))
|
if (!TryComp<HumanoidAppearanceComponent>(targetUid, out var humanoid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
component.Target ??= targetUid;
|
component.Target ??= targetUid;
|
||||||
|
|
||||||
var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings)
|
var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
changeSlotTime: 0
|
changeSlotTime: 0
|
||||||
- type: ActivatableUI
|
- type: ActivatableUI
|
||||||
key: enum.MagicMirrorUiKey.Key
|
key: enum.MagicMirrorUiKey.Key
|
||||||
|
singleUser: true
|
||||||
- type: UserInterface
|
- type: UserInterface
|
||||||
interfaces:
|
interfaces:
|
||||||
enum.MagicMirrorUiKey.Key:
|
enum.MagicMirrorUiKey.Key:
|
||||||
|
|||||||
Reference in New Issue
Block a user