/// <summary>True when there's a recorded position before boarding and player is on the ship</summary> public bool IsOnShip() { StreamingWorld world = GameManager.Instance.StreamingWorld; DFPosition shipCoords = DaggerfallBankManager.GetShipCoords(); return(boardShipPosition != null && shipCoords != null && world.MapPixelX == shipCoords.X && world.MapPixelY == shipCoords.Y); }
void Update() { // Do nothing if not ready if (!ReadyCheck()) { return; } // Update local world information whenever player map pixel changes DFPosition pos = CurrentMapPixel; if (pos.X != lastMapPixelX || pos.Y != lastMapPixelY) { RaiseOnMapPixelChangedEvent(pos); UpdateWorldInfo(pos.X, pos.Y); // Clear non-permanent scenes from cache, unless going to/from owned ship DFPosition shipCoords = DaggerfallBankManager.GetShipCoords(); if (shipCoords == null || (!(pos.X == shipCoords.X && pos.Y == shipCoords.Y) && !(lastMapPixelX == shipCoords.X && lastMapPixelY == shipCoords.Y))) { SaveLoadManager.ClearSceneCache(false); } lastMapPixelX = pos.X; lastMapPixelY = pos.Y; isPlayerInLocationRect = false; } // Raise other events RaiseEvents(); // Check if player is inside actual location rect PlayerLocationRectCheck(); }
void Update() { // Do nothing if not ready if (!ReadyCheck()) { return; } // Update local world information whenever player map pixel changes DFPosition pos = CurrentMapPixel; if (pos.X != lastMapPixelX || pos.Y != lastMapPixelY) { RaiseOnMapPixelChangedEvent(pos); UpdateWorldInfo(pos.X, pos.Y); // Clear non-permanent scenes from cache, unless going to/from owned ship DFPosition shipCoords = DaggerfallBankManager.GetShipCoords(); if (shipCoords == null || (!(pos.X == shipCoords.X && pos.Y == shipCoords.Y) && !(lastMapPixelX == shipCoords.X && lastMapPixelY == shipCoords.Y))) { SaveLoadManager.ClearSceneCache(false); } lastMapPixelX = pos.X; lastMapPixelY = pos.Y; } // Raise other events RaiseEvents(); // Check if player is inside actual location rect PlayerLocationRectCheck(); // Update nearby objects nearbyObjectsUpdateTimer += Time.deltaTime; if (nearbyObjectsUpdateTimer > refreshNearbyObjectsInterval) { UpdateNearbyObjects(); nearbyObjectsUpdateTimer = 0; } // Snap back to physical world boundary to prevent player running off edge of world // Setting to approx. 10000 inches (254 metres) in from edge so end of world not so visible if (WorldX < 10000 || // West WorldZ > 16370000 || // North WorldZ < 10000 || // South WorldX > 32750000) // East { gameObject.transform.position = lastFramePosition; } // Record player's last frame position lastFramePosition = gameObject.transform.position; }
private void UpdateMode(TransportModes transportMode) { // Update the transport mode and stop any riding sounds playing. mode = transportMode; if (ridingAudioSource.isPlaying) { ridingAudioSource.Stop(); } if (mode == TransportModes.Horse || mode == TransportModes.Cart) { // Tell player motor we're riding. playerMotor.IsRiding = true; // Setup appropriate riding sounds. SoundClips sound = (mode == TransportModes.Horse) ? horseRidingSound2 : cartRidingSound; ridingAudioSource.clip = dfAudioSource.GetAudioClip((int)sound); // Setup appropriate riding textures. string textureName = (mode == TransportModes.Horse) ? horseTextureName : cartTextureName; for (int i = 0; i < 4; i++) { ridingTexures[i] = ImageReader.GetImageData(textureName, 0, i, true, true); } ridingTexture = ridingTexures[0]; // Initialise neighing timer. neighTime = Time.time + Random.Range(1, 5); } else { // Tell player motor we're not riding. playerMotor.IsRiding = false; } if (mode == TransportModes.Ship) { GameManager.Instance.PlayerMotor.CancelMovement = true; SerializablePlayer serializablePlayer = GetComponent <SerializablePlayer>(); DaggerfallUI.Instance.FadeBehaviour.SmashHUDToBlack(); StreamingWorld world = GameManager.Instance.StreamingWorld; DFPosition shipCoords = DaggerfallBankManager.GetShipCoords(); // Is there recorded position before boarding and is player on the ship? if (IsOnShip()) { // Check for terrain sampler changes. (so don't fall through floor) StreamingWorld.RepositionMethods reposition = StreamingWorld.RepositionMethods.None; if (boardShipPosition.terrainSamplerName != DaggerfallUnity.Instance.TerrainSampler.ToString() || boardShipPosition.terrainSamplerVersion != DaggerfallUnity.Instance.TerrainSampler.Version) { reposition = StreamingWorld.RepositionMethods.RandomStartMarker; if (DaggerfallUI.Instance.DaggerfallHUD != null) { DaggerfallUI.Instance.DaggerfallHUD.PopupText.AddText("Terrain sampler changed. Repositioning player."); } } // Restore player position from before boarding ship, caching ship scene first. SaveLoadManager.CacheScene(world.SceneName); // TODO: Should this should move into teleport to support other teleports? Issue only if inside. (e.g. recall) DFPosition mapPixel = MapsFile.WorldCoordToMapPixel(boardShipPosition.worldPosX, boardShipPosition.worldPosZ); world.TeleportToCoordinates(mapPixel.X, mapPixel.Y, reposition); serializablePlayer.RestorePosition(boardShipPosition); boardShipPosition = null; // Restore cached scene (ship is special case, cache will not be cleared) SaveLoadManager.RestoreCachedScene(world.SceneName); } else { // Record current player position before boarding ship, and cache scene. (ship is special case, cache will not be cleared) boardShipPosition = serializablePlayer.GetPlayerPositionData(); SaveLoadManager.CacheScene(world.SceneName); // Teleport to the players ship, restoring cached scene. world.TeleportToCoordinates(shipCoords.X, shipCoords.Y, StreamingWorld.RepositionMethods.RandomStartMarker); SaveLoadManager.RestoreCachedScene(world.SceneName); } DaggerfallUI.Instance.FadeBehaviour.FadeHUDFromBlack(); mode = TransportModes.Foot; } }