diff --git a/OpenDreamClient/Interface/Html/HtmlParser.cs b/OpenDreamClient/Interface/Html/HtmlParser.cs
index 476fd4f928..ef434e83c2 100644
--- a/OpenDreamClient/Interface/Html/HtmlParser.cs
+++ b/OpenDreamClient/Interface/Html/HtmlParser.cs
@@ -8,6 +8,7 @@ public static class HtmlParser {
private const string TagNotClosedError = "HTML tag was not closed";
private static readonly ISawmill Sawmill;
+ private static readonly HashSet WarnedAttributes = new();
static HtmlParser() {
Sawmill = IoCManager.Resolve().GetSawmill("opendream.html_parser");
@@ -169,7 +170,8 @@ private static Dictionary ParseAttributes(string[] attr
parameter = new(color);
break;
default:
- Sawmill.Debug($"Unimplemented HTML attribute \"{attributeName}\"");
+ if (WarnedAttributes.Add(attributeName))
+ Sawmill.Debug($"Unimplemented HTML attribute \"{attributeName}\"");
continue;
}
diff --git a/OpenDreamClient/Rendering/ClientAppearanceSystem.cs b/OpenDreamClient/Rendering/ClientAppearanceSystem.cs
index 684730c40f..00caf24338 100644
--- a/OpenDreamClient/Rendering/ClientAppearanceSystem.cs
+++ b/OpenDreamClient/Rendering/ClientAppearanceSystem.cs
@@ -15,6 +15,7 @@ internal sealed class ClientAppearanceSystem : SharedAppearanceSystem {
private readonly Dictionary>> _appearanceLoadCallbacks = new();
private readonly Dictionary _turfIcons = new();
private readonly Dictionary _filterShaders = new();
+ private bool _receivedAllAppearancesMsg;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IDreamResourceManager _dreamResourceManager = default!;
@@ -30,13 +31,17 @@ public override void Initialize() {
}
public override void Shutdown() {
+ _receivedAllAppearancesMsg = false;
_appearances.Clear();
_appearanceLoadCallbacks.Clear();
_turfIcons.Clear();
+ _filterShaders.Clear();
}
public void SetAllAppearances(Dictionary appearances) {
_appearances = appearances;
+ _receivedAllAppearancesMsg = true;
+
//need to do this because all overlays can't be resolved until the whole appearance table is populated
foreach(KeyValuePair pair in _appearances) {
pair.Value.ResolveOverlays(this);
@@ -73,10 +78,14 @@ public DreamIcon GetTurfIcon(uint turfId) {
public void OnNewAppearance(MsgNewAppearance e) {
uint appearanceId = e.Appearance.MustGetId();
_appearances[appearanceId] = e.Appearance;
- _appearances[appearanceId].ResolveOverlays(this);
- if (_appearanceLoadCallbacks.TryGetValue(appearanceId, out var callbacks)) {
- foreach (var callback in callbacks) callback(_appearances[appearanceId]);
+ // If we haven't received the MsgAllAppearances yet, leave this initialization for later
+ if (_receivedAllAppearancesMsg) {
+ _appearances[appearanceId].ResolveOverlays(this);
+
+ if (_appearanceLoadCallbacks.TryGetValue(appearanceId, out var callbacks)) {
+ foreach (var callback in callbacks) callback(_appearances[appearanceId]);
+ }
}
}
diff --git a/OpenDreamClient/Rendering/DreamViewOverlay.cs b/OpenDreamClient/Rendering/DreamViewOverlay.cs
index 343a6e6166..526276bf1e 100644
--- a/OpenDreamClient/Rendering/DreamViewOverlay.cs
+++ b/OpenDreamClient/Rendering/DreamViewOverlay.cs
@@ -513,7 +513,7 @@ private DreamPlane GetPlane(int planeIndex, Vector2i viewportSize) {
plane = new(renderTarget);
_planes.Add(planeIndex, plane);
- _sawmill.Info($"Created plane {planeIndex}");
+ _sawmill.Verbose($"Created plane {planeIndex}");
return plane;
}