/// <summary> /// Creates a new packet based on the typeID and the received content /// inside the buffer. The user has to create an own implementation /// of this interface. /// </summary> public PacketBase createPacket(NetworkClient client, ushort typeID, byte[] buffer, int offset, int size) { //Ready our packet base PacketBase packet = null; size--; //Was it a system packet? if (buffer[offset++] == 0) { //Yes, find the appropriate type return(createSystemPacket(typeID, buffer, offset, size)); } //So what was the typeid? switch (typeID) { case CS_Auth <T> .TypeID: packet = new CS_Auth <T>(typeID, buffer, offset, size); break; case CS_PlayerLogin <T> .TypeID: packet = new CS_PlayerLogin <T>(typeID, buffer, offset, size); break; case CS_PlayerUpdate <T> .TypeID: packet = new CS_PlayerUpdate <T>(typeID, buffer, offset, size); break; case CS_PlayerLeave <T> .TypeID: packet = new CS_PlayerLeave <T>(typeID, buffer, offset, size); break; case CS_PlayerBanner <T> .TypeID: packet = new CS_PlayerBanner <T>(typeID, buffer, offset, size); break; case CS_PlayerStatsRequest <T> .TypeID: packet = new CS_PlayerStatsRequest <T>(typeID, buffer, offset, size); break; case CS_Whisper <T> .TypeID: packet = new CS_Whisper <T>(typeID, buffer, offset, size); break; case CS_JoinChat <T> .TypeID: packet = new CS_JoinChat <T>(typeID, buffer, offset, size); break; case CS_LeaveChat <T> .TypeID: packet = new CS_LeaveChat <T>(typeID, buffer, offset, size); break; case CS_PrivateChat <T> .TypeID: packet = new CS_PrivateChat <T>(typeID, buffer, offset, size); break; case CS_ModCommand <T> .TypeID: packet = new CS_ModCommand <T>(typeID, buffer, offset, size); break; case CS_Squads <T> .TypeID: packet = new CS_Squads <T>(typeID, buffer, offset, size); break; case CS_ChatQuery <T> .TypeID: packet = new CS_ChatQuery <T>(typeID, buffer, offset, size); break; case Disconnect <T> .TypeID: packet = new Disconnect <T>(typeID, buffer, offset, size); break; case CS_Ban <T> .TypeID: packet = new CS_Ban <T>(typeID, buffer, offset, size); break; case CS_SquadMatch <T> .TypeID: packet = new CS_SquadMatch <T>(typeID, buffer, offset, size); break; case CS_ModQuery <T> .TypeID: packet = new CS_ModQuery <T>(typeID, buffer, offset, size); break; case CS_ChatCommand <T> .TypeID: packet = new CS_ChatCommand <T>(typeID, buffer, offset, size); break; case CS_StatsUpdate <T> .TypeID: packet = new CS_StatsUpdate <T>(typeID, buffer, offset, size); break; case CS_ArenaUpdate <T> .TypeID: packet = new CS_ArenaUpdate <T>(typeID, buffer, offset, size); break; default: //An undefined packet. packet = new PacketDummy(typeID, buffer, offset, size); break; } return(packet); }
static public void Handle_CS_JoinChat(CS_JoinChat <Zone> pkt, Zone zone) { DBServer server = zone._server; Zone.Player player = server.getPlayer(pkt.from); char[] splitArr = { ',' }; List <string> chats = new List <string>(); //Hey, how'd you get here?! if (player == null) { Log.write(TLog.Error, "Handle_CS_JoinChat(): Unable to find player."); return; } //He wants to see the player list of each chat.. if (String.IsNullOrWhiteSpace(pkt.chat)) { if (player.chats.Count > 0) { foreach (var chat in player.chats) { if (String.IsNullOrEmpty(chat)) { continue; } Chat _chat = server.getChat(chat); if (_chat != null && _chat.hasPlayer(player)) { server.sendMessage(zone, pkt.from, String.Format("{0}: {1}", _chat._name, _chat.List())); } } } return; } //Split and trim our chats chats = pkt.chat.Split(splitArr, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Trim()).ToList(); foreach (string chat in chats) { if (String.IsNullOrEmpty(chat)) { continue; } string name = chat.ToLower(); //Remove him from everything.. if (name == "off") { foreach (var c in server._chats.Values.ToList()) { if (c == null) { continue; } if (c.hasPlayer(player)) { c.lostPlayer(player); } } server.sendMessage(zone, pkt.from, "No Chat Channels Defined"); return; } Chat _chat = server.getChat(chat); //New chat if (_chat == null) { Log.write(TLog.Normal, "Opened chat: '{0}'", chat); _chat = new Chat(server, chat); } //Add him if (!_chat.hasPlayer(player)) { _chat.newPlayer(player); } //Send him the updated list.. server.sendMessage(zone, pkt.from, String.Format("{0}: {1}", chat, _chat.List())); } //Remove him from any chats that didn't come over in the packet. //Rewrite me! Just make sure I'm case-insensitive foreach (Chat c in server._chats.Values.ToList()) { if (c == null) { continue; } if (!chats.Contains(c._name, StringComparer.OrdinalIgnoreCase)) { if (c.hasPlayer(player)) { c.lostPlayer(player); } } } }