using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using Robust.Shared.Log; using Robust.Shared.Utility; namespace Robust.Shared.GameObjects { public abstract partial class EntitySystem { /// /// Resolves the component on the entity but only if the component instance is null. /// /// The entity where to query the components. /// A reference to the variable storing the component, or null if it has to be resolved. /// Whether to log missing components. /// The component type to resolve. /// True if the component is not null or was resolved correctly, false if the component couldn't be resolved. [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public bool Resolve(EntityUid uid, [NotNullWhen(true)] ref TComp? component, bool logMissing = true) where TComp : IComponent { DebugTools.Assert(component == null || uid == component.Owner, "Specified Entity is not the component's Owner!"); if (component != null) return true; var found = EntityManager.TryGetComponent(uid, out component); if(logMissing && !found) Logger.ErrorS("resolve", $"Can't resolve \"{typeof(TComp)}\" on entity {uid}!\n{new StackTrace(1, true)}"); return found; } /// /// Resolves the components on the entity for the null component references. /// /// The entity where to query the components. /// A reference to the variable storing the component, or null if it has to be resolved. /// A reference to the variable storing the component, or null if it has to be resolved. /// Whether to log missing components. /// The component type to resolve. /// The component type to resolve. /// True if the components are not null or were resolved correctly, false if any of the component couldn't be resolved. [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public bool Resolve(EntityUid uid, [NotNullWhen(true)] ref TComp1? comp1, [NotNullWhen(true)] ref TComp2? comp2, bool logMissing = true) where TComp1 : IComponent where TComp2 : IComponent { return Resolve(uid, ref comp1, logMissing) & Resolve(uid, ref comp2, logMissing); } /// /// Resolves the components on the entity for the null component references. /// /// The entity where to query the components. /// A reference to the variable storing the component, or null if it has to be resolved. /// A reference to the variable storing the component, or null if it has to be resolved. /// A reference to the variable storing the component, or null if it has to be resolved. /// Whether to log missing components. /// The component type to resolve. /// The component type to resolve. /// The component type to resolve. /// True if the components are not null or were resolved correctly, false if any of the component couldn't be resolved. [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public bool Resolve(EntityUid uid, [NotNullWhen(true)] ref TComp1? comp1, [NotNullWhen(true)] ref TComp2? comp2, [NotNullWhen(true)] ref TComp3? comp3, bool logMissing = true) where TComp1 : IComponent where TComp2 : IComponent where TComp3 : IComponent { return Resolve(uid, ref comp1, ref comp2, logMissing) & Resolve(uid, ref comp3, logMissing); } /// /// Resolves the components on the entity for the null component references. /// /// The entity where to query the components. /// A reference to the variable storing the component, or null if it has to be resolved. /// A reference to the variable storing the component, or null if it has to be resolved. /// A reference to the variable storing the component, or null if it has to be resolved. /// A reference to the variable storing the component, or null if it has to be resolved. /// Whether to log missing components. /// The component type to resolve. /// The component type to resolve. /// The component type to resolve. /// The component type to resolve. /// True if the components are not null or were resolved correctly, false if any of the component couldn't be resolved. [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public bool Resolve(EntityUid uid, [NotNullWhen(true)] ref TComp1? comp1, [NotNullWhen(true)] ref TComp2? comp2, [NotNullWhen(true)] ref TComp3? comp3, [NotNullWhen(true)] ref TComp4? comp4, bool logMissing = true) where TComp1 : IComponent where TComp2 : IComponent where TComp3 : IComponent where TComp4 : IComponent { return Resolve(uid, ref comp1, ref comp2, logMissing) & Resolve(uid, ref comp3, ref comp4, logMissing); } } }