From a9eafd402532a7bd18bcb1e7796ef0a7197de34b Mon Sep 17 00:00:00 2001
From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Date: Sun, 18 Jun 2023 05:19:40 +1200
Subject: [PATCH] Add new `Dirty()` override for `Component.Owner` removal
(#4144)
---
.../GameObjects/ClientEntityManager.cs | 4 ++--
Robust.Shared/GameObjects/EntityManager.cs | 19 ++++++++-----------
.../GameObjects/EntitySystem.Proxy.cs | 9 +++++++++
Robust.Shared/GameObjects/IEntityManager.cs | 2 ++
4 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/Robust.Client/GameObjects/ClientEntityManager.cs b/Robust.Client/GameObjects/ClientEntityManager.cs
index 8524a1a9d..bfdbd41d6 100644
--- a/Robust.Client/GameObjects/ClientEntityManager.cs
+++ b/Robust.Client/GameObjects/ClientEntityManager.cs
@@ -81,11 +81,11 @@ namespace Robust.Client.GameObjects
}
///
- public override void Dirty(Component component, MetaDataComponent? meta = null)
+ public override void Dirty(EntityUid uid, Component component, MetaDataComponent? meta = null)
{
// Client only dirties during prediction
if (_gameTiming.InPrediction)
- base.Dirty(component, meta);
+ base.Dirty(uid, component, meta);
}
public override EntityStringRepresentation ToPrettyString(EntityUid uid)
diff --git a/Robust.Shared/GameObjects/EntityManager.cs b/Robust.Shared/GameObjects/EntityManager.cs
index e65fa994d..d4828708b 100644
--- a/Robust.Shared/GameObjects/EntityManager.cs
+++ b/Robust.Shared/GameObjects/EntityManager.cs
@@ -404,21 +404,18 @@ namespace Robust.Shared.GameObjects
}
}
- public virtual void Dirty(Component component, MetaDataComponent? meta = null)
+ [Obsolete("use override with an EntityUid")]
+ public void Dirty(Component component, MetaDataComponent? meta = null)
{
-#pragma warning disable CS0618
- var owner = component.Owner;
-#pragma warning restore CS0618
+ Dirty(component.Owner, component, meta);
+ }
- // Deserialization will cause this to be true.
- // ReSharper disable once ConditionIsAlwaysTrueOrFalse
- if (!owner.IsValid() || component.LifeStage >= ComponentLifeStage.Removing)
+ public virtual void Dirty(EntityUid uid, Component component, MetaDataComponent? meta = null)
+ {
+ if (component.LifeStage >= ComponentLifeStage.Removing || !component.NetSyncEnabled)
return;
- if (!component.NetSyncEnabled)
- return;
-
- DirtyEntity(owner, meta);
+ DirtyEntity(uid, meta);
component.LastModifiedTick = CurrentTick;
}
diff --git a/Robust.Shared/GameObjects/EntitySystem.Proxy.cs b/Robust.Shared/GameObjects/EntitySystem.Proxy.cs
index 012b452a5..be2df5597 100644
--- a/Robust.Shared/GameObjects/EntitySystem.Proxy.cs
+++ b/Robust.Shared/GameObjects/EntitySystem.Proxy.cs
@@ -200,6 +200,15 @@ public partial class EntitySystem
EntityManager.Dirty(component, meta);
}
+ ///
+ /// Marks a component as dirty. This also implicitly dirties the entity this component belongs to.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ protected void Dirty(EntityUid uid, Component component, MetaDataComponent? meta = null)
+ {
+ EntityManager.Dirty(uid, component, meta);
+ }
+
///
/// Retrieves the name of an entity.
///
diff --git a/Robust.Shared/GameObjects/IEntityManager.cs b/Robust.Shared/GameObjects/IEntityManager.cs
index 46eb260c8..90d736faf 100644
--- a/Robust.Shared/GameObjects/IEntityManager.cs
+++ b/Robust.Shared/GameObjects/IEntityManager.cs
@@ -102,6 +102,8 @@ namespace Robust.Shared.GameObjects
public void Dirty(Component component, MetaDataComponent? metadata = null);
+ public void Dirty(EntityUid uid, Component component, MetaDataComponent? meta = null);
+
public void QueueDeleteEntity(EntityUid uid);
public bool IsQueuedForDeletion(EntityUid uid);