Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
                    }
                }
            }
        }