// todo figure out a way to call messages on all objects...
        // so we can get actorstate.GameValue("Health") for instance...
        public static ObjectLoadState AddNewObject(PrefabReference prefabRef, string scene, Vector3 pos, Quaternion rot, bool permanent, out object obj, out string id)
        {
            bool sceneIsLoaded = SceneLoading.currentLoadedScenes.Contains(scene);

            id = GetNewGUID();

            DynamicObjectState objectState = new DynamicObjectState(id, scene, prefabRef, permanent);

            id2ObjectState.Add(id, objectState);

            if (sceneIsLoaded)
            {
                DynamicObject dynamicObject = GetAvailableInstance(prefabRef, pos, rot, id, false, false, false);

                MoveDynamicObjectToTransform(dynamicObject, pos, rot.eulerAngles, false);

                dynamicObject.AdjustState(objectState, scene, pos, rot.eulerAngles, false);

                obj = dynamicObject;
            }
            // add an unloaded representation, instantiate later when the scene is loaded
            else
            {
                if (!prefabRef.isEmpty)
                {
                    DynamicObject basePrefab = PrefabReferenceCollection.GetPrefabReference <DynamicObject>(prefabRef);
                    obj = basePrefab.AdjustState(objectState, scene, pos, rot.eulerAngles, true);
                }
                else
                {
                    obj = objectState;
                }
            }
            return(objectState.isLoaded ? ObjectLoadState.Loaded : ObjectLoadState.Unloaded);
        }
        static void MoveObject(ObjectLoadState state, object obj, string scene, MiniTransform target)
        {
            bool sceneIsLoaded = SceneLoading.currentLoadedScenes.Contains(scene);

            if (state == ObjectLoadState.Loaded)
            {
                DynamicObject dynamicObject = (DynamicObject)obj;
                // moving loaded DO to a scene and position thats already loaded
                if (sceneIsLoaded)
                {
                    MoveDynamicObjectToTransform(dynamicObject, target.position, target.rotation, false);
                }
                // moving loaded DO to an unloaded scene/position
                else
                {
                    if (dynamicObject.isPlayer)
                    {
                        MovePlayerToUnloadedScene(scene, target);
                    }
                    else
                    {
                        DynamicObjectState objState = GetStateByID(dynamicObject.GetID());
                        dynamicObject.AdjustState(objState, scene, target.position, target.rotation, false);
                        objState.loadedVersion = null;
                        // give to pool again
                        dynamicObject.gameObject.SetActive(false);
                    }
                }
            }
            else if (state == ObjectLoadState.Unloaded)
            {
                DynamicObjectState objState = (DynamicObjectState)obj;
                if (objState.id == alias2ID[PLAYER_ALIAS])
                {
                    Debug.Log("Cant Move Player When Player Is Unloaded...");
                    return;
                }
                objState.scene       = scene;
                objState.position    = target.position;
                objState.rotation    = target.rotation;
                objState.isUntouched = false;

                //moving an unloaded object to a loaded scene
                if (sceneIsLoaded)
                {
                    LoadNewDynamicObjectWithState(objState, false);
                }
            }
        }
        public static DynamicObject GetAvailableInstance(DynamicObject prefab, Vector3 position, Quaternion rotation, string gUID, bool createState, bool createID, bool permanentState)
        {
            DynamicObject inst = pool.GetAvailable(prefab, null, true, position, rotation, DynamicObject.onPoolCreateAction, null);

            if (createID)
            {
                gUID = GetNewGUID();
            }

            inst.SetID(gUID);

            if (createState)
            {
                DynamicObjectState objectState = new DynamicObjectState(gUID, null, inst.prefabRef, permanentState);
                id2ObjectState.Add(gUID, objectState);
                inst.AdjustState(objectState, null, position, rotation.eulerAngles, false);
            }

            return(inst);
        }
        void GetObjectStatesInScene(string scene, bool isUnloading, bool justDisable)
        {
            // get all the loaded objects in the current scene, that are active and available
            // (for instance an equipped item is not considered available, that shold be saved by the inventory component...)
            List <DynamicObject> dynamicObjects = FilterObjectsForScene(scene, DynamicObject.GetInstancesAvailableForLoad());

            if (dynamicObjects.Count > 0)
            {
                // teh list of saved objects to populate

                for (int i = 0; i < dynamicObjects.Count; i++)
                {
                    DynamicObject dynamicObject = dynamicObjects[i];

                    if (!justDisable)
                    {
                        DynamicObjectState state = GetStateByID(dynamicObject.GetID());

                        if (state != null)
                        {
                            dynamicObject.AdjustState(state, scene, dynamicObject.transform.position, dynamicObject.transform.rotation.eulerAngles, false);

                            if (isUnloading)
                            {
                                state.loadedVersion = null;
                            }
                        }
                    }

                    // TODO: add prevent disable on scene transfer (e.g. companions following...)

                    // disabling the scene our object is in
                    // give to pool again (if disabling scene)
                    if (isUnloading)
                    {
                        dynamicObject.gameObject.SetActive(false);
                    }
                }
            }
        }