mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
Remove Entity Transform/MetaData Component Cache (#2296)
Co-authored-by: Vera Aguilera Puerto <gradientvera@outlook.com>
This commit is contained in:
@@ -247,7 +247,7 @@ namespace Robust.Client.GameObjects
|
||||
|
||||
internal static RenderingTreeComponent? GetRenderTree(IEntity entity)
|
||||
{
|
||||
if (entity.Transform.MapID == MapId.Nullspace ||
|
||||
if (entity.Deleted || entity.Transform.MapID == MapId.Nullspace ||
|
||||
entity.HasComponent<RenderingTreeComponent>()) return null;
|
||||
|
||||
var parent = entity.Transform.Parent?.Owner;
|
||||
@@ -265,7 +265,7 @@ namespace Robust.Client.GameObjects
|
||||
|
||||
private bool IsVisible(SpriteComponent component)
|
||||
{
|
||||
return component.Visible && !component.ContainerOccluded;
|
||||
return component.Visible && !component.ContainerOccluded && !component.Deleted;
|
||||
}
|
||||
|
||||
public override void FrameUpdate(float frameTime)
|
||||
@@ -312,7 +312,7 @@ namespace Robust.Client.GameObjects
|
||||
{
|
||||
light.TreeUpdateQueued = false;
|
||||
|
||||
if (!light.Enabled || light.ContainerOccluded)
|
||||
if (light.Deleted || !light.Enabled || light.ContainerOccluded)
|
||||
{
|
||||
ClearLight(light);
|
||||
continue;
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Prototypes;
|
||||
@@ -17,7 +18,7 @@ namespace Robust.Shared.GameObjects
|
||||
#region Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEntityManager EntityManager { get; }
|
||||
public IEntityManager EntityManager => IoCManager.Resolve<IEntityManager>();
|
||||
|
||||
/// <inheritdoc />
|
||||
[ViewVariables]
|
||||
@@ -26,7 +27,17 @@ namespace Robust.Shared.GameObjects
|
||||
/// <inheritdoc />
|
||||
EntityLifeStage IEntity.LifeStage { get => LifeStage; set => LifeStage = value; }
|
||||
|
||||
public EntityLifeStage LifeStage { get => MetaData.EntityLifeStage; internal set => MetaData.EntityLifeStage = value; }
|
||||
public EntityLifeStage LifeStage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!EntityManager.EntityExists(Uid))
|
||||
return EntityLifeStage.Deleted;
|
||||
|
||||
return MetaData.EntityLifeStage;
|
||||
}
|
||||
internal set => MetaData.EntityLifeStage = value;
|
||||
}
|
||||
|
||||
[ViewVariables]
|
||||
GameTick IEntity.LastModifiedTick { get => MetaData.EntityLastModifiedTick; set => MetaData.EntityLastModifiedTick = value; }
|
||||
@@ -66,22 +77,26 @@ namespace Robust.Shared.GameObjects
|
||||
public bool Deleted => LifeStage >= EntityLifeStage.Deleted;
|
||||
|
||||
[ViewVariables]
|
||||
public bool Paused { get => MetaData.EntityPaused; set => MetaData.EntityPaused = value; }
|
||||
|
||||
private TransformComponent? _transform;
|
||||
public bool Paused { get => Deleted || MetaData.EntityPaused; set => MetaData.EntityPaused = value; }
|
||||
|
||||
/// <inheritdoc />
|
||||
[ViewVariables]
|
||||
public TransformComponent Transform => _transform ??= GetComponent<TransformComponent>();
|
||||
|
||||
private MetaDataComponent? _metaData;
|
||||
public TransformComponent Transform
|
||||
{
|
||||
get
|
||||
{
|
||||
return (TransformComponent)IoCManager.Resolve<IEntityManager>().GetComponent(Uid, typeof(TransformComponent));
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[ViewVariables]
|
||||
public MetaDataComponent MetaData
|
||||
{
|
||||
get => _metaData ??= GetComponent<MetaDataComponent>();
|
||||
internal set => _metaData = value;
|
||||
get
|
||||
{
|
||||
return (MetaDataComponent)IoCManager.Resolve<IEntityManager>().GetComponent(Uid, typeof(MetaDataComponent));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Members
|
||||
@@ -90,7 +105,6 @@ namespace Robust.Shared.GameObjects
|
||||
|
||||
public Entity(IEntityManager entityManager, EntityUid uid)
|
||||
{
|
||||
EntityManager = entityManager;
|
||||
Uid = uid;
|
||||
}
|
||||
|
||||
|
||||
@@ -293,10 +293,10 @@ namespace Robust.Shared.GameObjects
|
||||
if(entity.Deleted) //TODO: Why was this still a child if it was already deleted?
|
||||
return;
|
||||
|
||||
var uid = entity.Uid;
|
||||
var transform = entity.Transform;
|
||||
var metadata = entity.MetaData;
|
||||
entity.LifeStage = EntityLifeStage.Terminating;
|
||||
|
||||
EventBus.RaiseLocalEvent(entity.Uid, new EntityTerminatingEvent(), false);
|
||||
|
||||
// DeleteEntity modifies our _children collection, we must cache the collection to iterate properly
|
||||
@@ -306,8 +306,12 @@ namespace Robust.Shared.GameObjects
|
||||
RecursiveDeleteEntity(childTransform.Owner);
|
||||
}
|
||||
|
||||
// Dispose all my components, in a safe order so transform is available
|
||||
DisposeComponents(entity.Uid);
|
||||
// Shut down all components.
|
||||
foreach (var component in InSafeOrder(_entCompIndex[uid]))
|
||||
{
|
||||
if(component.Running)
|
||||
component.LifeShutdown();
|
||||
}
|
||||
|
||||
// map does not have a parent node, everything else needs to be detached
|
||||
if (transform.ParentUid != EntityUid.Invalid)
|
||||
@@ -316,6 +320,9 @@ namespace Robust.Shared.GameObjects
|
||||
transform.DetachParentToNull();
|
||||
}
|
||||
|
||||
// Dispose all my components, in a safe order so transform is available
|
||||
DisposeComponents(entity.Uid);
|
||||
|
||||
metadata.EntityLifeStage = EntityLifeStage.Deleted;
|
||||
EntityDeleted?.Invoke(this, entity.Uid);
|
||||
EventBus.RaiseEvent(EventSource.Local, new EntityDeletedMessage(entity));
|
||||
@@ -343,7 +350,7 @@ namespace Robust.Shared.GameObjects
|
||||
|
||||
public bool EntityExists(EntityUid uid)
|
||||
{
|
||||
return TryGetEntity(uid, out _);
|
||||
return _entTraitDict[typeof(MetaDataComponent)].ContainsKey(uid);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -402,7 +409,6 @@ namespace Robust.Shared.GameObjects
|
||||
|
||||
// Create the MetaDataComponent and set it directly on the Entity to avoid a stack overflow in DEBUG.
|
||||
var metadata = new MetaDataComponent() { Owner = entity };
|
||||
entity.MetaData = metadata;
|
||||
|
||||
// add the required MetaDataComponent directly.
|
||||
AddComponentInternal(uid.Value, metadata);
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace Robust.Shared.GameObjects
|
||||
{
|
||||
var entity = component.Owner;
|
||||
|
||||
if (entity.Transform.MapID == MapId.Nullspace) return null;
|
||||
if (entity.Deleted || entity.Transform.MapID == MapId.Nullspace) return null;
|
||||
|
||||
var parent = entity.Transform.Parent?.Owner;
|
||||
|
||||
|
||||
@@ -641,6 +641,9 @@ namespace Robust.Shared.Physics
|
||||
|
||||
private void AddToMoveBuffer(MapId mapId, FixtureProxy proxy, Box2 aabb)
|
||||
{
|
||||
if(mapId == MapId.Nullspace)
|
||||
return;
|
||||
|
||||
_moveBuffer[mapId][proxy] = aabb;
|
||||
}
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ namespace Robust.UnitTesting.Server.GameObjects.Components
|
||||
Assert.That(entityItem.Transform.Parent!.Owner, Is.EqualTo(entityOne));
|
||||
|
||||
entityOne.Delete();
|
||||
Assert.That(entityTwo.Transform.Deleted, Is.True);
|
||||
Assert.That(entityTwo.Deleted, Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -254,14 +254,11 @@ namespace Robust.UnitTesting.Shared.Map
|
||||
mapEnt.Delete();
|
||||
|
||||
// These shouldn't be valid anymore.
|
||||
Assert.That(newEnt.Transform.Coordinates.IsValid(entityManager), Is.False);
|
||||
Assert.That(gridEnt.Transform.Coordinates.IsValid(entityManager), Is.False);
|
||||
Assert.That(newEnt.Deleted, Is.True);
|
||||
Assert.That(gridEnt.Deleted, Is.True);
|
||||
|
||||
Assert.That(newEnt.Transform.Coordinates.TryGetEntity(entityManager, out newEntParent), Is.EqualTo(false));
|
||||
Assert.That(newEntParent, Is.Null);
|
||||
|
||||
Assert.That(gridEnt.Transform.Coordinates.TryGetEntity(entityManager, out gridEntParent), Is.EqualTo(false));
|
||||
Assert.That(gridEntParent, Is.Null);
|
||||
Assert.That(newEntParent!.Deleted, Is.True);
|
||||
Assert.That(gridEntParent!.Deleted, Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
Reference in New Issue
Block a user