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);