Skip to content

Commit

Permalink
More device configurator serialization fixes (space-wizards#33664)
Browse files Browse the repository at this point in the history
More device configurator invalid entity serialization fixes
  • Loading branch information
ElectroJr authored Dec 5, 2024
1 parent 59bce41 commit 6f51aa4
Showing 1 changed file with 41 additions and 2 deletions.
43 changes: 41 additions & 2 deletions Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
using Robust.Server.Audio;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Player;
using Robust.Shared.Map.Events;
using Robust.Shared.Timing;
using Robust.Shared.Utility;

Expand Down Expand Up @@ -66,6 +66,42 @@ public override void Initialize()
SubscribeLocalEvent<NetworkConfiguratorComponent, BoundUserInterfaceCheckRangeEvent>(OnUiRangeCheck);

SubscribeLocalEvent<DeviceListComponent, ComponentRemove>(OnComponentRemoved);

SubscribeLocalEvent<BeforeSaveEvent>(OnMapSave);
}

private void OnMapSave(BeforeSaveEvent ev)
{
var enumerator = AllEntityQuery<NetworkConfiguratorComponent>();
while (enumerator.MoveNext(out var uid, out var conf))
{
if (CompOrNull<TransformComponent>(conf.ActiveDeviceList)?.MapUid != ev.Map)
continue;

// The linked device list is (probably) being saved. Make sure that the configurator is also being saved
// (i.e., not in the hands of a mapper/ghost). In the future, map saving should raise a separate event
// containing a set of all entities that are about to be saved, which would make checking this much easier.
// This is a shitty bandaid, and will force close the UI during auto-saves.
// TODO Map serialization refactor

var xform = Transform(uid);
if (xform.MapUid == ev.Map && IsSaveable(uid))
continue;

_uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure);
DebugTools.AssertNull(conf.ActiveDeviceList);
}

bool IsSaveable(EntityUid uid)
{
while (uid.IsValid())
{
if (Prototype(uid)?.MapSavable == false)
return false;
uid = Transform(uid).ParentUid;
}
return true;
}
}

private void OnUiRangeCheck(Entity<NetworkConfiguratorComponent> ent, ref BoundUserInterfaceCheckRangeEvent args)
Expand Down Expand Up @@ -485,6 +521,9 @@ private void OpenDeviceListUi(EntityUid configuratorUid, EntityUid? targetUid, E
if (!TryComp(targetUid, out DeviceListComponent? list))
return;

if (TryComp(configurator.ActiveDeviceList, out DeviceListComponent? oldList))
oldList.Configurators.Remove(configuratorUid);

list.Configurators.Add(configuratorUid);
configurator.ActiveDeviceList = targetUid;
Dirty(configuratorUid, configurator);
Expand Down Expand Up @@ -758,7 +797,7 @@ private void OnConfigButtonPressed(EntityUid uid, NetworkConfiguratorComponent c
{
if (query.TryGetComponent(device, out var comp))
{
component.Devices[addr] = device;
component.Devices.Add(addr, device);
comp.Configurators.Add(uid);
}
}
Expand Down

0 comments on commit 6f51aa4

Please sign in to comment.