Add EntityQuery<MetaDataComponent> to EntityManager (#4166)

This commit is contained in:
metalgearsloth
2023-07-13 20:14:47 +10:00
committed by GitHub
parent dd12110c34
commit cb63499ec9
8 changed files with 230 additions and 53 deletions

View File

@@ -4,6 +4,7 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.CompilerServices;
using JetBrains.Annotations;
using Robust.Shared.GameStates;
using Robust.Shared.Log;
using Robust.Shared.Physics.Components;
@@ -46,6 +47,8 @@ namespace Robust.Shared.GameObjects
private UniqueIndexHkm<EntityUid, Component> _entCompIndex =
new(ComponentCollectionCapacity);
private EntityQuery<MetaDataComponent> _metaQuery;
/// <inheritdoc />
public event Action<AddedComponentEventArgs>? ComponentAdded;
@@ -63,6 +66,7 @@ namespace Robust.Shared.GameObjects
FillComponentDict();
_componentFactory.ComponentAdded += OnComponentAdded;
_componentFactory.ComponentReferenceAdded += OnComponentReferenceAdded;
_metaQuery = GetEntityQuery<MetaDataComponent>();
}
/// <summary>
@@ -700,15 +704,15 @@ namespace Robust.Shared.GameObjects
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T GetComponent<T>(EntityUid uid)
public T GetComponent<T>(EntityUid uid) where T : IComponent
{
var dict = _entTraitArray[CompIdx.ArrayIndex<T>()];
DebugTools.Assert(dict != null, $"Unknown component: {typeof(T).Name}");
if (dict!.TryGetValue(uid, out var comp))
{
if (!comp.Deleted)
if (!comp!.Deleted)
{
return (T)(IComponent)comp;
return (T)(IComponent) comp;
}
}
@@ -1034,8 +1038,7 @@ namespace Robust.Shared.GameObjects
where TComp1 : Component
{
var trait1 = _entTraitArray[CompIdx.ArrayIndex<TComp1>()];
var metaTraits = _entTraitArray[CompIdx.ArrayIndex<MetaDataComponent>()];
return new EntityQueryEnumerator<TComp1>(trait1, metaTraits);
return new EntityQueryEnumerator<TComp1>(trait1, _metaQuery);
}
public EntityQueryEnumerator<TComp1, TComp2> EntityQueryEnumerator<TComp1, TComp2>()
@@ -1044,8 +1047,7 @@ namespace Robust.Shared.GameObjects
{
var trait1 = _entTraitArray[CompIdx.ArrayIndex<TComp1>()];
var trait2 = _entTraitArray[CompIdx.ArrayIndex<TComp2>()];
var metaTraits = _entTraitArray[CompIdx.ArrayIndex<MetaDataComponent>()];
return new EntityQueryEnumerator<TComp1, TComp2>(trait1, trait2, metaTraits);
return new EntityQueryEnumerator<TComp1, TComp2>(trait1, trait2, _metaQuery);
}
public EntityQueryEnumerator<TComp1, TComp2, TComp3> EntityQueryEnumerator<TComp1, TComp2, TComp3>()
@@ -1056,8 +1058,7 @@ namespace Robust.Shared.GameObjects
var trait1 = _entTraitArray[CompIdx.ArrayIndex<TComp1>()];
var trait2 = _entTraitArray[CompIdx.ArrayIndex<TComp2>()];
var trait3 = _entTraitArray[CompIdx.ArrayIndex<TComp3>()];
var metaTraits = _entTraitArray[CompIdx.ArrayIndex<MetaDataComponent>()];
return new EntityQueryEnumerator<TComp1, TComp2, TComp3>(trait1, trait2, trait3, metaTraits);
return new EntityQueryEnumerator<TComp1, TComp2, TComp3>(trait1, trait2, trait3, _metaQuery);
}
public EntityQueryEnumerator<TComp1, TComp2, TComp3, TComp4> EntityQueryEnumerator<TComp1, TComp2, TComp3, TComp4>()
@@ -1070,8 +1071,8 @@ namespace Robust.Shared.GameObjects
var trait2 = _entTraitArray[CompIdx.ArrayIndex<TComp2>()];
var trait3 = _entTraitArray[CompIdx.ArrayIndex<TComp3>()];
var trait4 = _entTraitArray[CompIdx.ArrayIndex<TComp4>()];
var metaTraits = _entTraitArray[CompIdx.ArrayIndex<MetaDataComponent>()];
return new EntityQueryEnumerator<TComp1, TComp2, TComp3, TComp4>(trait1, trait2, trait3, trait4, metaTraits);
return new EntityQueryEnumerator<TComp1, TComp2, TComp3, TComp4>(trait1, trait2, trait3, trait4, _metaQuery);
}
/// <inheritdoc />
@@ -1091,15 +1092,11 @@ namespace Robust.Shared.GameObjects
}
else
{
var metaComps = _entTraitArray[CompIdx.ArrayIndex<MetaDataComponent>()];
foreach (var t1Comp in comps!.Values)
foreach (var t1Comp in comps.Values)
{
if (t1Comp.Deleted || !metaComps.TryGetValue(t1Comp.Owner, out var metaComp)) continue;
if (t1Comp.Deleted || !_metaQuery.TryGetComponentInternal(t1Comp.Owner, out var metaComp)) continue;
var meta = (MetaDataComponent)metaComp;
if (meta.EntityPaused) continue;
if (metaComp.EntityPaused) continue;
yield return (T)(object)t1Comp;
}
@@ -1369,6 +1366,7 @@ namespace Robust.Shared.GameObjects
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
public TComp1 GetComponent(EntityUid uid)
{
if (_traitDict.TryGetValue(uid, out var comp) && !comp.Deleted)
@@ -1378,6 +1376,7 @@ namespace Robust.Shared.GameObjects
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
public bool TryGetComponent([NotNullWhen(true)] EntityUid? uid, [NotNullWhen(true)] out TComp1? component)
{
if (uid == null)
@@ -1390,6 +1389,7 @@ namespace Robust.Shared.GameObjects
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
public bool TryGetComponent(EntityUid uid, [NotNullWhen(true)] out TComp1? component)
{
if (_traitDict.TryGetValue(uid, out var comp) && !comp.Deleted)
@@ -1403,12 +1403,14 @@ namespace Robust.Shared.GameObjects
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
public bool HasComponent(EntityUid uid)
{
return _traitDict.TryGetValue(uid, out var comp) && !comp.Deleted;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
public bool Resolve(EntityUid uid, [NotNullWhen(true)] ref TComp1? component, bool logMissing = true)
{
if (component != null)
@@ -1430,6 +1432,7 @@ namespace Robust.Shared.GameObjects
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
public TComp1? CompOrNull(EntityUid uid)
{
if (TryGetComponent(uid, out var comp))
@@ -1437,6 +1440,103 @@ namespace Robust.Shared.GameObjects
return null;
}
#region Internal
/// <summary>
/// Elides the component.Deleted check of <see cref="GetComponent"/>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
internal TComp1 GetComponentInternal(EntityUid uid)
{
if (_traitDict.TryGetValue(uid, out var comp))
return (TComp1) comp;
throw new KeyNotFoundException($"Entity {uid} does not have a component of type {typeof(TComp1)}");
}
/// <summary>
/// Elides the component.Deleted check of <see cref="TryGetComponent(System.Nullable{Robust.Shared.GameObjects.EntityUid},out TComp1?)"/>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
internal bool TryGetComponentInternal([NotNullWhen(true)] EntityUid? uid, [NotNullWhen(true)] out TComp1? component)
{
if (uid == null)
{
component = default;
return false;
}
return TryGetComponentInternal(uid.Value, out component);
}
/// <summary>
/// Elides the component.Deleted check of <see cref="TryGetComponent(System.Nullable{Robust.Shared.GameObjects.EntityUid},out TComp1?)"/>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
internal bool TryGetComponentInternal(EntityUid uid, [NotNullWhen(true)] out TComp1? component)
{
if (_traitDict.TryGetValue(uid, out var comp))
{
component = (TComp1) comp;
return true;
}
component = default;
return false;
}
/// <summary>
/// Elides the component.Deleted check of <see cref="HasComponent"/>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
internal bool HasComponentInternal(EntityUid uid)
{
return _traitDict.TryGetValue(uid, out var comp) && !comp.Deleted;
}
/// <summary>
/// Elides the component.Deleted check of <see cref="Resolve"/>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
internal bool ResolveInternal(EntityUid uid, [NotNullWhen(true)] ref TComp1? component, bool logMissing = true)
{
if (component != null)
{
DebugTools.Assert(uid == component.Owner, "Specified Entity is not the component's Owner!");
return true;
}
if (_traitDict.TryGetValue(uid, out var comp))
{
component = (TComp1)comp;
return true;
}
if (logMissing)
_sawmill.Error($"Can't resolve \"{typeof(TComp1)}\" on entity {uid}!\n{new StackTrace(1, true)}");
return false;
}
/// <summary>
/// Elides the component.Deleted check of <see cref="CompOrNull"/>
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[Pure]
internal TComp1? CompOrNullInternal(EntityUid uid)
{
if (TryGetComponent(uid, out var comp))
return comp;
return null;
}
#endregion
}
#region Query
@@ -1448,14 +1548,14 @@ namespace Robust.Shared.GameObjects
where TComp1 : Component
{
private Dictionary<EntityUid, Component>.Enumerator _traitDict;
private readonly Dictionary<EntityUid, Component> _metaDict;
private readonly EntityQuery<MetaDataComponent> _metaQuery;
public EntityQueryEnumerator(
Dictionary<EntityUid, Component> traitDict,
Dictionary<EntityUid, Component> metaDict)
EntityQuery<MetaDataComponent> metaQuery)
{
_traitDict = traitDict.GetEnumerator();
_metaDict = metaDict;
_metaQuery = metaQuery;
}
public bool MoveNext(out EntityUid uid, [NotNullWhen(true)] out TComp1? comp1)
@@ -1476,7 +1576,7 @@ namespace Robust.Shared.GameObjects
continue;
}
if (!_metaDict.TryGetValue(current.Key, out var metaComp) || ((MetaDataComponent)metaComp).EntityPaused)
if (!_metaQuery.TryGetComponentInternal(current.Key, out var metaComp) || metaComp.EntityPaused)
{
continue;
}
@@ -1508,16 +1608,16 @@ namespace Robust.Shared.GameObjects
{
private Dictionary<EntityUid, Component>.Enumerator _traitDict;
private readonly Dictionary<EntityUid, Component> _traitDict2;
private readonly Dictionary<EntityUid, Component> _metaDict;
private readonly EntityQuery<MetaDataComponent> _metaQuery;
public EntityQueryEnumerator(
Dictionary<EntityUid, Component> traitDict,
Dictionary<EntityUid, Component> traitDict2,
Dictionary<EntityUid, Component> metaDict)
EntityQuery<MetaDataComponent> metaQuery)
{
_traitDict = traitDict.GetEnumerator();
_traitDict2 = traitDict2;
_metaDict = metaDict;
_metaQuery = metaQuery;
}
public bool MoveNext(out EntityUid uid, [NotNullWhen(true)] out TComp1? comp1, [NotNullWhen(true)] out TComp2? comp2)
@@ -1539,7 +1639,7 @@ namespace Robust.Shared.GameObjects
continue;
}
if (!_metaDict.TryGetValue(current.Key, out var metaComp) || ((MetaDataComponent)metaComp).EntityPaused)
if (!_metaQuery.TryGetComponentInternal(current.Key, out var metaComp) || metaComp.EntityPaused)
{
continue;
}
@@ -1579,18 +1679,18 @@ namespace Robust.Shared.GameObjects
private Dictionary<EntityUid, Component>.Enumerator _traitDict;
private readonly Dictionary<EntityUid, Component> _traitDict2;
private readonly Dictionary<EntityUid, Component> _traitDict3;
private readonly Dictionary<EntityUid, Component> _metaDict;
private readonly EntityQuery<MetaDataComponent> _metaQuery;
public EntityQueryEnumerator(
Dictionary<EntityUid, Component> traitDict,
Dictionary<EntityUid, Component> traitDict2,
Dictionary<EntityUid, Component> traitDict3,
Dictionary<EntityUid, Component> metaDict)
EntityQuery<MetaDataComponent> metaQuery)
{
_traitDict = traitDict.GetEnumerator();
_traitDict2 = traitDict2;
_traitDict3 = traitDict3;
_metaDict = metaDict;
_metaQuery = metaQuery;
}
public bool MoveNext(out EntityUid uid, [NotNullWhen(true)] out TComp1? comp1, [NotNullWhen(true)] out TComp2? comp2, [NotNullWhen(true)] out TComp3? comp3)
@@ -1613,7 +1713,7 @@ namespace Robust.Shared.GameObjects
continue;
}
if (!_metaDict.TryGetValue(current.Key, out var metaComp) || ((MetaDataComponent)metaComp).EntityPaused)
if (!_metaQuery.TryGetComponentInternal(current.Key, out var metaComp) || metaComp.EntityPaused)
{
continue;
}
@@ -1664,20 +1764,20 @@ namespace Robust.Shared.GameObjects
private readonly Dictionary<EntityUid, Component> _traitDict2;
private readonly Dictionary<EntityUid, Component> _traitDict3;
private readonly Dictionary<EntityUid, Component> _traitDict4;
private readonly Dictionary<EntityUid, Component> _metaDict;
private readonly EntityQuery<MetaDataComponent> _metaQuery;
public EntityQueryEnumerator(
Dictionary<EntityUid, Component> traitDict,
Dictionary<EntityUid, Component> traitDict2,
Dictionary<EntityUid, Component> traitDict3,
Dictionary<EntityUid, Component> traitDict4,
Dictionary<EntityUid, Component> metaDict)
EntityQuery<MetaDataComponent> metaQuery)
{
_traitDict = traitDict.GetEnumerator();
_traitDict2 = traitDict2;
_traitDict3 = traitDict3;
_traitDict4 = traitDict4;
_metaDict = metaDict;
_metaQuery = metaQuery;
}
public bool MoveNext(out EntityUid uid, [NotNullWhen(true)] out TComp1? comp1, [NotNullWhen(true)] out TComp2? comp2, [NotNullWhen(true)] out TComp3? comp3, [NotNullWhen(true)] out TComp4? comp4)
@@ -1701,7 +1801,7 @@ namespace Robust.Shared.GameObjects
continue;
}
if (!_metaDict.TryGetValue(current.Key, out var metaComp) || ((MetaDataComponent)metaComp).EntityPaused)
if (!_metaQuery.TryGetComponentInternal(current.Key, out var metaComp) || metaComp.EntityPaused)
{
continue;
}