public override void WarpCharacterToInstance(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position, bool overrideRotation, Vector3 rotation) { #if UNITY_STANDALONE && !CLIENT_BUILD if (!CanWarpCharacter(playerCharacterEntity)) { return; } // Generate instance id string instanceId = GenericUtils.GetUniqueId(); // Prepare data for warp character later when instance map server registered to this map server HashSet <uint> instanceMapWarpingCharacters = new HashSet <uint>(); PartyData party; if (ServerPartyHandlers.TryGetParty(playerCharacterEntity.PartyId, out party)) { // If character is party leader, will bring party member to join instance if (party.IsLeader(playerCharacterEntity.Id)) { List <BasePlayerCharacterEntity> aliveAllies = playerCharacterEntity.FindAliveCharacters <BasePlayerCharacterEntity>(CurrentGameInstance.joinInstanceMapDistance, true, false, false); foreach (BasePlayerCharacterEntity aliveAlly in aliveAllies) { if (!party.IsMember(aliveAlly.Id)) { continue; } instanceMapWarpingCharacters.Add(aliveAlly.ObjectId); aliveAlly.IsWarping = true; } instanceMapWarpingCharacters.Add(playerCharacterEntity.ObjectId); playerCharacterEntity.IsWarping = true; } else { ServerGameMessageHandlers.SendGameMessage(playerCharacterEntity.ConnectionId, UITextKeys.UI_ERROR_PARTY_MEMBER_CANNOT_ENTER_INSTANCE); return; } } else { // If no party enter instance alone instanceMapWarpingCharacters.Add(playerCharacterEntity.ObjectId); playerCharacterEntity.IsWarping = true; } instanceMapWarpingCharactersByInstanceId.TryAdd(instanceId, instanceMapWarpingCharacters); instanceMapWarpingLocations.TryAdd(instanceId, new InstanceMapWarpingLocation() { mapName = mapName, position = position, overrideRotation = overrideRotation, rotation = rotation, }); ClusterClient.SendRequest(MMORequestTypes.RequestSpawnMap, new RequestSpawnMapMessage() { mapId = mapName, instanceId = instanceId, instanceWarpPosition = position, instanceWarpOverrideRotation = overrideRotation, instanceWarpRotation = rotation, }, responseDelegate: (responseHandler, responseCode, response) => OnRequestSpawnMap(responseHandler, responseCode, response, instanceId), millisecondsTimeout: mapSpawnMillisecondsTimeout); #endif }
private void OnRequestSpawnMap(ResponseHandlerData requestHandler, AckResponseCode responseCode, INetSerializable response, string instanceId) { if (responseCode == AckResponseCode.Error || responseCode == AckResponseCode.Timeout) { // Remove warping characters who warping to instance map HashSet <uint> instanceMapWarpingCharacters; if (instanceMapWarpingCharactersByInstanceId.TryGetValue(instanceId, out instanceMapWarpingCharacters)) { BasePlayerCharacterEntity playerCharacterEntity; foreach (uint warpingCharacter in instanceMapWarpingCharacters) { if (Assets.TryGetSpawnedObject(warpingCharacter, out playerCharacterEntity)) { playerCharacterEntity.IsWarping = false; ServerGameMessageHandlers.SendGameMessage(playerCharacterEntity.ConnectionId, UITextKeys.UI_ERROR_SERVICE_NOT_AVAILABLE); } } instanceMapWarpingCharactersByInstanceId.TryRemove(instanceId, out _); } instanceMapWarpingLocations.TryRemove(instanceId, out _); } }