Ejemplo n.º 1
0
        void TeleportPlayer()
        {
            // Validate references
            if (!serializablePlayer || !playerEnterExit)
            {
                return;
            }

            // Get anchor position from player entity
            anchorPosition = GameManager.Instance.PlayerEntity.AnchorPosition;

            // Is player in same interior as anchor?
            if (IsSameInterior())
            {
                // Just need to move player
                serializablePlayer.RestorePosition(anchorPosition);
            }
            else
            {
                // When teleporting to interior anchor, restore world compensation height early before initworld
                // Ensures exterior world level is aligned with building height at time of anchor
                // Only works with floating origin v3 saves and above with both serialized world compensation and context
                if (anchorPosition.worldContext == WorldContext.Interior)
                {
                    GameManager.Instance.StreamingWorld.RestoreWorldCompensationHeight(anchorPosition.worldCompensation.y);
                }
                else
                {
                    GameManager.Instance.StreamingWorld.RestoreWorldCompensationHeight(0);
                }

                // Cache scene before departing
                if (!playerEnterExit.IsPlayerInside)
                {
                    SaveLoadManager.CacheScene(GameManager.Instance.StreamingWorld.SceneName);      // Player is outside
                }
                else if (playerEnterExit.IsPlayerInsideBuilding)
                {
                    SaveLoadManager.CacheScene(playerEnterExit.Interior.name);                      // Player inside a building
                }
                else // Player inside a dungeon
                {
                    playerEnterExit.TransitionDungeonExteriorImmediate();
                }

                // Need to load some other part of the world again - player could be anywhere
                PlayerEnterExit.OnRespawnerComplete += PlayerEnterExit_OnRespawnerComplete;
                playerEnterExit.RestorePositionHelper(anchorPosition, false, true);

                // Restore building summary data
                if (anchorPosition.insideBuilding)
                {
                    playerEnterExit.BuildingDiscoveryData = anchorPosition.buildingDiscoveryData;
                }

                // When moving anywhere other than same interior trigger a fade so transition appears smoother
                DaggerfallUI.Instance.FadeBehaviour.FadeHUDFromBlack();
            }
        }
Ejemplo n.º 2
0
        void TeleportPlayer()
        {
            // Validate references
            if (!serializablePlayer || !playerEnterExit)
            {
                return;
            }

            // Is player in same interior as anchor?
            if (IsSameInterior())
            {
                // Just need to move player
                serializablePlayer.RestorePosition(anchorPosition);
                return;
            }
            else
            {
                // Cache scene before departing
                if (!playerEnterExit.IsPlayerInside)
                {
                    SaveLoadManager.CacheScene(GameManager.Instance.StreamingWorld.SceneName);      // Player is outside
                }
                else if (playerEnterExit.IsPlayerInsideBuilding)
                {
                    SaveLoadManager.CacheScene(playerEnterExit.Interior.name);                      // Player inside a building
                }
                else // Player inside a dungeon
                {
                    playerEnterExit.TransitionDungeonExteriorImmediate();
                }

                // Need to load some other part of the world again - player could be anywhere
                PlayerEnterExit.OnRespawnerComplete += PlayerEnterExit_OnRespawnerComplete;
                playerEnterExit.RestorePositionHelper(anchorPosition, false, true);

                // Restore building summary data
                if (anchorPosition.insideBuilding)
                {
                    playerEnterExit.BuildingDiscoveryData = anchorPosition.buildingDiscoveryData;
                }

                // When moving anywhere other than same interior trigger a fade so transition appears smoother
                DaggerfallUI.Instance.FadeBehaviour.FadeHUDFromBlack();
            }

            // End and resign
            // Player will need to create a new teleport with a new anchor from here
            // This is same behaviour as classic
            forcedRoundsRemaining = 0;
            ResignAsIncumbent();
            anchorSet = false;
        }