diff --git a/OpenDreamClient/EntryPoint.cs b/OpenDreamClient/EntryPoint.cs index 5860becfaa..00e2b13b6c 100644 --- a/OpenDreamClient/EntryPoint.cs +++ b/OpenDreamClient/EntryPoint.cs @@ -85,7 +85,6 @@ public override void PostInit() { IoCManager.Resolve().Initialize(); _netManager.RegisterNetMessage(RxAllAppearances); - _netManager.RegisterNetMessage(RxNewAppearance); if (_configurationManager.GetCVar(CVars.DisplayCompat)) _dreamInterface.OpenAlert( @@ -113,15 +112,6 @@ private void RxAllAppearances(MsgAllAppearances message) { clientAppearanceSystem.SetAllAppearances(message.AllAppearances); } - private void RxNewAppearance(MsgNewAppearance message) { - if (!_entitySystemManager.TryGetEntitySystem(out var clientAppearanceSystem)) { - Logger.GetSawmill("opendream").Error("Received MsgNewAppearance before initializing entity systems"); - return; - } - - clientAppearanceSystem.OnNewAppearance(message); - } - // As of RobustToolbox v0.90.0.0 there's a TileEdgeOverlay that breaks our rendering // because we don't have an ITileDefinition for each tile. // This removes that overlay immediately after MapSystem adds it. diff --git a/OpenDreamClient/Interface/DummyDreamInterfaceManager.cs b/OpenDreamClient/Interface/DummyDreamInterfaceManager.cs index 61d4c06dff..ebba9c9ccd 100644 --- a/OpenDreamClient/Interface/DummyDreamInterfaceManager.cs +++ b/OpenDreamClient/Interface/DummyDreamInterfaceManager.cs @@ -1,5 +1,4 @@ using OpenDreamClient.Interface.Controls; -using OpenDreamClient.Interface.Descriptors; using OpenDreamShared.Dream; using OpenDreamShared.Network.Messages; using Robust.Shared.Network; @@ -20,6 +19,7 @@ public sealed class DummyDreamInterfaceManager : IDreamInterfaceManager { public ControlMap? DefaultMap => null; public ViewRange View => new(5); public bool ShowPopupMenus => true; + [Dependency] private readonly IClientNetManager _netManager = default!; public void Initialize() { diff --git a/OpenDreamClient/Rendering/ClientAppearanceSystem.cs b/OpenDreamClient/Rendering/ClientAppearanceSystem.cs index 35df689a9e..fd02bc198a 100644 --- a/OpenDreamClient/Rendering/ClientAppearanceSystem.cs +++ b/OpenDreamClient/Rendering/ClientAppearanceSystem.cs @@ -6,7 +6,6 @@ using OpenDreamClient.Resources; using OpenDreamClient.Resources.ResourceTypes; using Robust.Shared.Timing; -using OpenDreamShared.Network.Messages; namespace OpenDreamClient.Rendering; @@ -25,6 +24,7 @@ internal sealed class ClientAppearanceSystem : SharedAppearanceSystem { [Dependency] private readonly DMISpriteSystem _spriteSystem = default!; public override void Initialize() { + SubscribeNetworkEvent(OnNewAppearance); SubscribeNetworkEvent(e => _appearances.Remove(e.AppearanceId)); SubscribeNetworkEvent(OnAnimation); SubscribeLocalEvent(OnWorldAABB); @@ -75,7 +75,7 @@ public DreamIcon GetTurfIcon(uint turfId) { return icon; } - public void OnNewAppearance(MsgNewAppearance e) { + public void OnNewAppearance(NewAppearanceEvent e) { uint appearanceId = e.Appearance.MustGetId(); _appearances[appearanceId] = e.Appearance; diff --git a/OpenDreamRuntime/DreamManager.Connections.cs b/OpenDreamRuntime/DreamManager.Connections.cs index b7f8524ed0..e8373517c8 100644 --- a/OpenDreamRuntime/DreamManager.Connections.cs +++ b/OpenDreamRuntime/DreamManager.Connections.cs @@ -72,7 +72,6 @@ private void InitializeConnectionManager() { _netManager.RegisterNetMessage(); _netManager.RegisterNetMessage(); _netManager.RegisterNetMessage(); - _netManager.RegisterNetMessage(); var topicPort = _config.GetCVar(OpenDreamCVars.TopicPort); var worldTopicAddress = new IPEndPoint(IPAddress.Loopback, topicPort); diff --git a/OpenDreamRuntime/Rendering/ServerAppearanceSystem.cs b/OpenDreamRuntime/Rendering/ServerAppearanceSystem.cs index 0091f4f64b..c2afa5d9f1 100644 --- a/OpenDreamRuntime/Rendering/ServerAppearanceSystem.cs +++ b/OpenDreamRuntime/Rendering/ServerAppearanceSystem.cs @@ -1,17 +1,16 @@ using OpenDreamShared.Dream; using Robust.Server.Player; using Robust.Shared.Enums; -using SharedAppearanceSystem = OpenDreamShared.Rendering.SharedAppearanceSystem; using System.Diagnostics.CodeAnalysis; using OpenDreamShared.Network.Messages; using Robust.Shared.Player; -using Robust.Shared.Network; using System.Diagnostics; +using SharedAppearanceSystem = OpenDreamShared.Rendering.SharedAppearanceSystem; namespace OpenDreamRuntime.Rendering; public sealed class ServerAppearanceSystem : SharedAppearanceSystem { - public readonly ImmutableAppearance DefaultAppearance; + public ImmutableAppearance DefaultAppearance = default!; /// /// Each appearance gets a unique ID when marked as registered. Here we store these as a key -> weakref in a weaktable, which does not count @@ -28,10 +27,9 @@ public sealed class ServerAppearanceSystem : SharedAppearanceSystem { private readonly Dictionary _idToAppearance = new(); private uint _counter; - [Dependency] private readonly IServerNetManager _networkManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; - public ServerAppearanceSystem() { + public override void Initialize() { DefaultAppearance = new ImmutableAppearance(MutableAppearance.Default, this); DefaultAppearance.MarkRegistered(_counter++); //first appearance registered gets id 0, this is the blank default appearance ProxyWeakRef proxyWeakRef = new(DefaultAppearance); @@ -40,9 +38,7 @@ public ServerAppearanceSystem() { //leaving this in as a sanity check for mutable and immutable appearance hashcodes covering all the same vars //if this debug assert fails, you've probably changed appearance var and not updated its counterpart Debug.Assert(DefaultAppearance.GetHashCode() == MutableAppearance.Default.GetHashCode()); - } - public override void Initialize() { _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; } @@ -75,7 +71,8 @@ private void RegisterAppearance(ImmutableAppearance immutableAppearance) { ProxyWeakRef proxyWeakRef = new(immutableAppearance); _appearanceLookup.Add(proxyWeakRef); _idToAppearance.Add(immutableAppearance.MustGetId(), proxyWeakRef); - _networkManager.ServerSendToAll(new MsgNewAppearance(immutableAppearance)); + + RaiseNetworkEvent(new NewAppearanceEvent(immutableAppearance)); } public ImmutableAppearance AddAppearance(MutableAppearance appearance, bool registerAppearance = true) { @@ -98,6 +95,7 @@ public ImmutableAppearance AddAppearance(ImmutableAppearance appearance, bool re } //this should only be called by the ImmutableAppearance's finalizer + [Access(typeof(ImmutableAppearance))] public override void RemoveAppearance(ImmutableAppearance appearance) { lock (_lock) { ProxyWeakRef proxyWeakRef = new(appearance); diff --git a/OpenDreamShared/Dream/ImmutableAppearance.cs b/OpenDreamShared/Dream/ImmutableAppearance.cs index 5688237d6d..97bffc6d38 100644 --- a/OpenDreamShared/Dream/ImmutableAppearance.cs +++ b/OpenDreamShared/Dream/ImmutableAppearance.cs @@ -23,12 +23,9 @@ namespace OpenDreamShared.Dream; */ // TODO: Wow this is huge! Probably look into splitting this by most used/least used to reduce the size of these -[Serializable] +[Serializable, NetSerializable] public sealed class ImmutableAppearance : IEquatable { private uint? _registeredId; - private bool _needsFinalizer; - private int? _storedHashCode; - private readonly SharedAppearanceSystem? _appearanceSystem; [ViewVariables] public readonly string Name = MutableAppearance.Default.Name; [ViewVariables] public readonly string? Desc = MutableAppearance.Default.Desc; @@ -71,6 +68,9 @@ public sealed class ImmutableAppearance : IEquatable { // PixelOffset2 behaves the same as PixelOffset in top-down mode, so this is used public Vector2i TotalPixelOffset => PixelOffset + PixelOffset2; + [NonSerialized] private readonly SharedAppearanceSystem? _appearanceSystem; + [NonSerialized] private bool _needsFinalizer; + [NonSerialized] private int? _storedHashCode; [NonSerialized] private List? _overlayIDs; [NonSerialized] private List? _underlayIDs; diff --git a/OpenDreamShared/Network/Messages/MsgNewAppearance.cs b/OpenDreamShared/Network/Messages/MsgNewAppearance.cs deleted file mode 100644 index e40973a781..0000000000 --- a/OpenDreamShared/Network/Messages/MsgNewAppearance.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Lidgren.Network; -using OpenDreamShared.Dream; -using Robust.Shared.Network; -using Robust.Shared.Serialization; - -namespace OpenDreamShared.Network.Messages; - -public sealed class MsgNewAppearance: NetMessage { - public override MsgGroups MsgGroup => MsgGroups.EntityEvent; - - public MsgNewAppearance() : this(new ImmutableAppearance(MutableAppearance.Default, null)) {} - public MsgNewAppearance(ImmutableAppearance appearance) => Appearance = appearance; - public ImmutableAppearance Appearance; - - public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer) { - Appearance = new ImmutableAppearance(buffer, serializer); - } - - public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer) { - Appearance.WriteToBuffer(buffer,serializer); - } -} diff --git a/OpenDreamShared/Rendering/SharedAppearanceSystem.cs b/OpenDreamShared/Rendering/SharedAppearanceSystem.cs index 5f6d0101fb..dfae4c5ebf 100644 --- a/OpenDreamShared/Rendering/SharedAppearanceSystem.cs +++ b/OpenDreamShared/Rendering/SharedAppearanceSystem.cs @@ -10,9 +10,8 @@ public abstract class SharedAppearanceSystem : EntitySystem { public abstract void RemoveAppearance(ImmutableAppearance appearance); [Serializable, NetSerializable] - public sealed class NewAppearanceEvent(uint appearanceId, MutableAppearance appearance) : EntityEventArgs { - public uint AppearanceId { get; } = appearanceId; - public MutableAppearance Appearance { get; } = appearance; + public sealed class NewAppearanceEvent(ImmutableAppearance appearance) : EntityEventArgs { + public ImmutableAppearance Appearance { get; } = appearance; } [Serializable, NetSerializable]