private ReflectedEntityCache CreateReflectedEntity(EntityState entityState)
    {
        string entityType = entityState.entityType.entityKind + ":" + entityState.entityType.domain + ":" + entityState.entityType.country + ":" + entityState.entityType.category + ":" + entityState.entityType.subCategory + ":" + entityState.entityType.specific + ":" + entityState.entityType.extra;

        GameObject reflectedPrefab = null;

        foreach (var reflectedModelPair in ReflectedModels)
        {
            if (reflectedModelPair.EntityType == entityType)
            {
                reflectedPrefab = reflectedModelPair.ReflectedPrefab;
                break;
            }
        }


        if (reflectedPrefab == null)
        {
            return(null);
        }

        var reflectedGameObj = Instantiate(reflectedPrefab);
        var reflectedEntity  = reflectedGameObj.GetComponent <ReflectedEntity>();

        if (reflectedEntity == null)
        {
            reflectedEntity = reflectedGameObj.AddComponent <ReflectedEntity>();
        }

        reflectedEntity.EntityId    = entityState.entityId;
        reflectedEntity.MarkingText = NetSimAgent.Instance.GetReflectedEntityMarkingText(entityState.reflectedEntityPtr);
        reflectedEntity.EntityType  = entityState.entityType;

        reflectedGameObj.name = reflectedEntity.MarkingText;

        var reflectedEntityCache = new ReflectedEntityCache();

        reflectedEntityCache.GameObject      = reflectedGameObj;
        reflectedEntityCache.ReflectedEntity = reflectedEntity;
        reflectedEntityCache.Rigidbody       = reflectedEntity.GetComponent <Rigidbody>();
        reflectedEntityCache.Transform       = reflectedEntity.transform;
        reflectedEntityCache.Animator        = reflectedEntity.GetComponent <Animator>();
        reflectedEntityCache.SelectedDevice  = reflectedEntity.GetComponent <Infantry.ReflectedInfantryModelOptions>();
        if (reflectedEntityCache.Animator)
        {
            reflectedEntityCache.AnimatorParameters = reflectedEntityCache.Animator.parameters;
            foreach (var anim in reflectedEntityCache.AnimatorParameters)
            {
                if (anim.name == "Speed")
                {
                    reflectedEntityCache.AnimatorSpeedParameterHash = anim.nameHash;
                }
            }
        }
        reflectedEntityCache.ArtParts = new Dictionary <uint, ReflectedEntityArtPart>();
        foreach (var artPart in reflectedGameObj.GetComponentsInChildren <ReflectedEntityArtPart>())
        {
            reflectedEntityCache.ArtParts[artPart.PartID] = artPart;
        }

        reflectedEntityCache.ReflectedEntity.LifeformState = entityState.lifeformState;
        reflectedEntityCache.ReflectedEntity.DamageState   = entityState.DamageState;

        reflectedEntitiesCache[entityState.entityId] = reflectedEntityCache;

        return(reflectedEntityCache);
    }
 private void SetAnimatorParams <T>(string paramName, T currentState, ref T prevState, ReflectedEntityCache reflectedEntityCache) where T : struct, IComparable
 {
     if (!prevState.Equals(currentState))
     {
         for (int i = 0; i < reflectedEntityCache.AnimatorParameters.Length; i++)
         {
             if (reflectedEntityCache.AnimatorParameters[i].name.StartsWith(paramName))
             {
                 bool isActive = reflectedEntityCache.AnimatorParameters[i].name == paramName + currentState.ToString();
                 reflectedEntityCache.Animator.SetBool(reflectedEntityCache.AnimatorParameters[i].nameHash, isActive);
             }
         }
         prevState = currentState;
     }
 }