protected override void HandleWarpAtClient(MessageHandlerData messageHandler) { MMOWarpMessage message = messageHandler.ReadMessage <MMOWarpMessage>(); Assets.offlineScene.SceneName = string.Empty; StopClient(); StartClient(message.networkAddress, message.networkPort); }
protected override void HandleWarpAtClient(LiteNetLibMessageHandler messageHandler) { MMOWarpMessage message = messageHandler.ReadMessage <MMOWarpMessage>(); Assets.offlineScene.SceneName = string.Empty; StopClient(); Assets.onlineScene.SceneName = message.sceneName; StartClient(message.networkAddress, message.networkPort, message.connectKey); }
/// <summary> /// Warp to different map. /// </summary> /// <param name="playerCharacterEntity"></param> /// <param name="mapName"></param> /// <param name="position"></param> /// <param name="overrideRotation"></param> /// <param name="rotation"></param> /// <returns></returns> private async UniTaskVoid WarpCharacterRoutine(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position, bool overrideRotation, Vector3 rotation) { // If warping to different map long connectionId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; BaseMapInfo mapInfo; if (!string.IsNullOrEmpty(mapName) && ServerUserHandlers.TryGetPlayerCharacter(connectionId, out _) && mapServerConnectionIdsBySceneName.TryGetValue(mapName, out peerInfo) && GameInstance.MapInfos.TryGetValue(mapName, out mapInfo) && mapInfo.IsSceneSet()) { // Add this character to warping list playerCharacterEntity.IsWarping = true; // Unregister player character UnregisterPlayerCharacter(connectionId); // Clone character data to save PlayerCharacterData savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); savingCharacterData.CurrentMapName = mapName; savingCharacterData.CurrentPosition = position; if (overrideRotation) { savingCharacterData.CurrentRotation = rotation; } while (savingCharacters.Contains(savingCharacterData.Id)) { await UniTask.Yield(); } await SaveCharacterRoutine(savingCharacterData, playerCharacterEntity.UserId); // Remove this character from warping list playerCharacterEntity.IsWarping = false; // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp MMOWarpMessage message = new MMOWarpMessage(); message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameNetworkingConsts.Warp, message); } }
/// <summary> /// Warp to different map. if `forceChangeMap` is `TRUE` it will change map server, even if it is same map /// </summary> /// <param name="playerCharacterEntity"></param> /// <param name="mapName"></param> /// <param name="position"></param> /// <param name="forceChangeMap"></param> /// <returns></returns> private IEnumerator WarpCharacterRoutine(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position, bool forceChangeMap) { // If warping to different map long connectionId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; MapInfo mapInfo; if (!string.IsNullOrEmpty(mapName) && (!mapName.Equals(playerCharacterEntity.CurrentMapName) || forceChangeMap) && playerCharacters.ContainsKey(connectionId) && mapServerConnectionIdsBySceneName.TryGetValue(mapName, out peerInfo) && GameInstance.MapInfos.TryGetValue(mapName, out mapInfo) && mapInfo.IsSceneSet()) { // Add this character to warping list playerCharacterEntity.IsWarping = true; // Unregister player character UnregisterPlayerCharacter(connectionId); // Clone character data to save PlayerCharacterData savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); savingCharacterData.CurrentMapName = mapName; savingCharacterData.CurrentPosition = position; while (savingCharacters.Contains(savingCharacterData.Id)) { yield return(0); } yield return(StartCoroutine(SaveCharacterRoutine(savingCharacterData))); // Remove this character from warping list playerCharacterEntity.IsWarping = false; // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp MMOWarpMessage message = new MMOWarpMessage(); message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; message.connectKey = peerInfo.connectKey; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MsgTypes.Warp, message); } }
private IEnumerator WarpCharacterToInstanceRoutine(BasePlayerCharacterEntity playerCharacterEntity, string instanceId) { // If warping to different map long connectionId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; KeyValuePair <string, Vector3> warpingLocation; MapInfo mapInfo; if (playerCharacters.ContainsKey(connectionId) && instanceMapWarpingLocations.TryGetValue(instanceId, out warpingLocation) && instanceMapServerConnectionIdsByInstanceId.TryGetValue(instanceId, out peerInfo) && GameInstance.MapInfos.TryGetValue(warpingLocation.Key, out mapInfo) && mapInfo.IsSceneSet()) { // Add this character to warping list playerCharacterEntity.IsWarping = true; // Unregister player character UnregisterPlayerCharacter(connectionId); // Clone character data to save PlayerCharacterData savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); while (savingCharacters.Contains(savingCharacterData.Id)) { yield return(0); } yield return(StartCoroutine(SaveCharacterRoutine(savingCharacterData))); // Remove this character from warping list playerCharacterEntity.IsWarping = false; // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp MMOWarpMessage message = new MMOWarpMessage(); message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; message.connectKey = peerInfo.connectKey; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, MsgTypes.Warp, message); } }
private async UniTaskVoid WarpCharacterToInstanceRoutine(BasePlayerCharacterEntity playerCharacterEntity, string instanceId) { // If warping to different map long connectionId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; InstanceMapWarpingLocation warpingLocation; BaseMapInfo mapInfo; if (ServerUserHandlers.TryGetPlayerCharacter(connectionId, out _) && instanceMapWarpingLocations.TryGetValue(instanceId, out warpingLocation) && instanceMapServerConnectionIdsByInstanceId.TryGetValue(instanceId, out peerInfo) && GameInstance.MapInfos.TryGetValue(warpingLocation.mapName, out mapInfo) && mapInfo.IsSceneSet()) { // Add this character to warping list playerCharacterEntity.IsWarping = true; // Unregister player character UnregisterPlayerCharacter(connectionId); // Clone character data to save PlayerCharacterData savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); // Wait to save character before move to instance map while (savingCharacters.Contains(savingCharacterData.Id)) { await UniTask.Yield(); } await SaveCharacterRoutine(savingCharacterData, playerCharacterEntity.UserId); // Remove this character from warping list playerCharacterEntity.IsWarping = false; // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp MMOWarpMessage message = new MMOWarpMessage(); message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; ServerSendPacket(connectionId, DeliveryMethod.ReliableOrdered, GameNetworkingConsts.Warp, message); } }
private IEnumerator WarpCharacterRoutine(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position) { // If warping to different map var connectId = playerCharacterEntity.ConnectionId; CentralServerPeerInfo peerInfo; if (!string.IsNullOrEmpty(mapName) && !mapName.Equals(playerCharacterEntity.CurrentMapName) && playerCharacters.ContainsKey(connectId) && mapServerConnectionIdsBySceneName.TryGetValue(mapName, out peerInfo)) { // Unregister player character UnregisterPlayerCharacter(connectId); // Clone character data to save var savingCharacterData = new PlayerCharacterData(); playerCharacterEntity.CloneTo(savingCharacterData); // Save character current map / position savingCharacterData.CurrentMapName = mapName; savingCharacterData.CurrentPosition = position; while (savingCharacters.Contains(savingCharacterData.Id)) { yield return(0); } yield return(StartCoroutine(SaveCharacterRoutine(savingCharacterData))); // Destroy character from server playerCharacterEntity.NetworkDestroy(); // Send message to client to warp var message = new MMOWarpMessage(); message.sceneName = mapName; message.networkAddress = peerInfo.networkAddress; message.networkPort = peerInfo.networkPort; message.connectKey = peerInfo.connectKey; ServerSendPacket(connectId, SendOptions.ReliableOrdered, MsgTypes.Warp, message); } }