/// <summary> /// Teleport to specific map pixel with an optional automatic reposition. /// </summary> public void TeleportToCoordinates(int mapPixelX, int mapPixelY, RepositionMethods autoReposition = RepositionMethods.Origin) { TeleportToMapPixel(mapPixelX, mapPixelY, Vector3.zero, autoReposition); }
void Update() { // Cannot proceed until ready and player is set if (!ReadyCheck()) return; // Handle moving to new map pixel or first-time init DFPosition curMapPixel = LocalPlayerGPS.CurrentMapPixel; if (curMapPixel.X != MapPixelX || curMapPixel.Y != MapPixelY || init) { //Debug.Log(string.Format("Entering new map pixel X={0}, Y={1}", curMapPixel.X, curMapPixel.Y)); MapPixelX = curMapPixel.X; MapPixelY = curMapPixel.Y; UpdateWorld(); InitPlayerTerrain(); StartCoroutine(UpdateTerrains()); updateLocatations = true; init = false; } // Exit if terrain data still updating // Raise location update flag any time terrain updates if (terrainUpdateRunning) { updateLocatations = true; return; } // Update locations when terrain data finished // This flag is raised during terrain update if (updateLocatations) { UpdateLocations(); updateLocatations = false; } // Reposition player if (autoRepositionMethod != RepositionMethods.None) { switch (autoRepositionMethod) { case RepositionMethods.RandomStartMarker: PositionPlayerToLocation(); break; case RepositionMethods.Offset: RepositionPlayer(MapPixelX, MapPixelY, autoRepositionOffset); break; case RepositionMethods.DungeonEntrance: PositionPlayerToDungeonExit(); break; default: case RepositionMethods.Origin: RepositionPlayer(MapPixelX, MapPixelY, Vector3.zero); break; } autoRepositionMethod = RepositionMethods.None; } // Do not update world position if player is inside dungeon // This can cause player to become desynced from world as dungeon can // actually extend beyond the current map pixel area if (GameManager.Instance.PlayerEnterExit.IsPlayerInsideDungeon) return; // Get distance player has moved in world map units and apply to world position Vector3 playerPos = LocalPlayerGPS.transform.position; worldX += (playerPos.x - lastPlayerPos.x) * SceneMapRatio; worldZ += (playerPos.z - lastPlayerPos.z) * SceneMapRatio; // Sync PlayerGPS to new world position LocalPlayerGPS.WorldX = (int)worldX; LocalPlayerGPS.WorldZ = (int)worldZ; // Update last player position lastPlayerPos = playerPos; }
public void SetAutoReposition(RepositionMethods method, Vector3 offset) { autoRepositionOffset = offset; autoRepositionMethod = method; }
// Teleports to map pixel with an optional reset or autoreposition void TeleportToMapPixel(int mapPixelX, int mapPixelY, Vector3 repositionOffset, RepositionMethods autoReposition) { DFPosition worldPos = MapsFile.MapPixelToWorldCoord(mapPixelX, mapPixelY); LocalPlayerGPS.WorldX = worldPos.X; LocalPlayerGPS.WorldZ = worldPos.Y; LocalPlayerGPS.UpdateWorldInfo(); autoRepositionOffset = repositionOffset; autoRepositionMethod = autoReposition; InitWorld(); RaiseOnTeleportToCoordinatesEvent(worldPos); }