protected override void WarpCharacterToInstance(BasePlayerCharacterEntity playerCharacterEntity, string mapName, Vector3 position) { if (!CanWarpCharacter(playerCharacterEntity)) { return; } // Generate instance id string instanceId = GenericUtils.GetUniqueId(); RequestSpawnMapMessage requestSpawnMapMessage = new RequestSpawnMapMessage(); requestSpawnMapMessage.mapId = mapName; requestSpawnMapMessage.instanceId = instanceId; // Prepare data for warp character later when instance map server registered to this map server HashSet <uint> instanceMapWarpingCharacters = new HashSet <uint>(); PartyData party; if (parties.TryGetValue(playerCharacterEntity.PartyId, out party)) { // If character is party member, will bring party member to join instance if (party.IsLeader(playerCharacterEntity)) { List <BasePlayerCharacterEntity> aliveAllies = playerCharacterEntity.FindAliveCharacters <BasePlayerCharacterEntity>(gameInstance.joinInstanceMapDistance, true, false, false); foreach (BasePlayerCharacterEntity aliveAlly in aliveAllies) { if (!party.IsMember(aliveAlly)) { continue; } instanceMapWarpingCharacters.Add(aliveAlly.ObjectId); aliveAlly.IsWarping = true; } instanceMapWarpingCharacters.Add(playerCharacterEntity.ObjectId); playerCharacterEntity.IsWarping = true; } } else { // If no party enter instance alone instanceMapWarpingCharacters.Add(playerCharacterEntity.ObjectId); playerCharacterEntity.IsWarping = true; } instanceMapWarpingCharactersByInstanceId.Add(instanceId, instanceMapWarpingCharacters); instanceMapWarpingLocations.Add(instanceId, new KeyValuePair <string, Vector3>(mapName, position)); CentralAppServerRegister.ClientSendAckPacket(DeliveryMethod.ReliableOrdered, MMOMessageTypes.RequestSpawnMap, requestSpawnMapMessage, OnRequestSpawnMap); }