protected override void WarpCharacter(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position) { if (!CanWarpCharacter(playerCharacterEntity)) { return; } base.WarpCharacter(playerCharacterEntity, mapName, position); long connectionId = playerCharacterEntity.ConnectionId; MapInfo mapInfo; if (!string.IsNullOrEmpty(mapName) && !mapName.Equals(playerCharacterEntity.CurrentMapName) && playerCharacters.ContainsKey(connectionId) && playerCharacterEntity.IsServer && playerCharacterEntity.IsOwnerClient && GameInstance.MapInfos.TryGetValue(mapName, out mapInfo) && mapInfo.IsSceneSet()) { // Save data before warp SaveWorld(); SaveStorage(); buildingEntities.Clear(); storageItems.Clear(); SetMapInfo(mapInfo); teleportPosition = position; BasePlayerCharacterEntity owningCharacter = BasePlayerCharacterController.OwningCharacter; if (owningCharacter != null) { selectedCharacter = owningCharacter.CloneTo(selectedCharacter); selectedCharacter.CurrentMapName = mapInfo.GetSceneName(); selectedCharacter.CurrentPosition = position; selectedCharacter.SavePersistentCharacterData(); } // Unregister all players characters to register later after map changed foreach (LiteNetLibPlayer player in GetPlayers()) { UnregisterPlayerCharacter(player.ConnectionId); } if (owningCharacter != null) { // Destroy owning character to avoid save while warp owningCharacter.NetworkDestroy(); } ServerSceneChange(mapInfo.scene); } }