private void HandleChat(MessageHandlerData messageHandler) { long connectionId = messageHandler.ConnectionId; ChatMessage message = messageHandler.ReadMessage <ChatMessage>(); switch (message.channel) { case ChatChannel.Local: case ChatChannel.Global: case ChatChannel.System: case ChatChannel.Party: case ChatChannel.Guild: // Send message to all map servers, let's map servers filter messages SendPacketToAllConnections(0, DeliveryMethod.ReliableOrdered, MMOMessageTypes.Chat, (writer) => writer.PutValue(message)); break; case ChatChannel.Whisper: long senderConnectionId = 0; long receiverConnectionId = 0; // Send message to map server which have the character if (!string.IsNullOrEmpty(message.sender) && ConnectionIdsByCharacterName.TryGetValue(message.sender, out senderConnectionId)) { SendPacket(senderConnectionId, 0, DeliveryMethod.ReliableOrdered, MMOMessageTypes.Chat, (writer) => writer.PutValue(message)); } if (!string.IsNullOrEmpty(message.receiver) && ConnectionIdsByCharacterName.TryGetValue(message.receiver, out receiverConnectionId) && (receiverConnectionId != senderConnectionId)) { SendPacket(receiverConnectionId, 0, DeliveryMethod.ReliableOrdered, MMOMessageTypes.Chat, (writer) => writer.PutValue(message)); } break; } }
protected override void OnStopServer() { base.OnStopServer(); MapUsersByCharacterId.Clear(); ConnectionIdsByCharacterId.Clear(); ConnectionIdsByCharacterName.Clear(); MapSpawnServerPeers.Clear(); MapServerPeers.Clear(); MapServerPeersByMapId.Clear(); MapServerPeersByInstanceId.Clear(); }
private void RemoveMapUsers(long connectionId) { List <KeyValuePair <string, SocialCharacterData> > mapUsers = MapUsersByCharacterId.ToList(); foreach (KeyValuePair <string, SocialCharacterData> entry in mapUsers) { // Find characters which connected to disconnecting map server long tempConnectionId; if (!ConnectionIdsByCharacterId.TryGetValue(entry.Key, out tempConnectionId) || connectionId != tempConnectionId) { continue; } // Send remove messages to other map servers UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Remove, entry.Value, connectionId); // Clear disconnecting map users data MapUsersByCharacterId.Remove(entry.Key); ConnectionIdsByCharacterId.Remove(entry.Key); ConnectionIdsByCharacterName.Remove(entry.Value.characterName); } }
private void HandleUpdateMapUser(MessageHandlerData messageHandler) { long connectionId = messageHandler.ConnectionId; UpdateUserCharacterMessage message = messageHandler.ReadMessage <UpdateUserCharacterMessage>(); SocialCharacterData userData; switch (message.type) { case UpdateUserCharacterMessage.UpdateType.Add: if (!MapUsersByCharacterId.ContainsKey(message.character.id)) { MapUsersByCharacterId[message.character.id] = message.character; ConnectionIdsByCharacterId[message.character.id] = connectionId; ConnectionIdsByCharacterName[message.character.characterName] = connectionId; UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Add, message.character, connectionId); } break; case UpdateUserCharacterMessage.UpdateType.Remove: if (MapUsersByCharacterId.TryGetValue(message.character.id, out userData)) { MapUsersByCharacterId.Remove(userData.id); ConnectionIdsByCharacterId.Remove(userData.id); ConnectionIdsByCharacterName.Remove(userData.characterName); UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Remove, userData, connectionId); } break; case UpdateUserCharacterMessage.UpdateType.Online: if (MapUsersByCharacterId.ContainsKey(message.character.id)) { MapUsersByCharacterId[message.character.id] = message.character; UpdateMapUser(UpdateUserCharacterMessage.UpdateType.Online, message.character, connectionId); } break; } }