public override void Handle(User sender, InPacket packetReader)
        {
            uint userId = packetReader.ReadUint();
            int  nxCode = packetReader.ReadInt(); // Unused.

            string username    = packetReader.ReadString();
            string displayname = packetReader.ReadString();

            uint sessionId = packetReader.ReadUint(); // Login session Id -> Doesn't seem to be correct? -> We'll use it like this for now.

            //ushort gender = GetUShort(4);
            //ushort age = GetUShort(5);

            //ushort wrPointScore = GetUShort(6); // WR Point System -> The score of your computer performance.
            //ushort accessCode = GetUShort(7); // Permissions.

            /*int clanId = GetInt(8);
             * int clanUserLevel = GetInt(9);
             * int clanIcon = GetInt(10);
             * string clanName = GetString(11);*/

            if (userId > 0 && username.Length > 2 && displayname.Length > 2 && sessionId > 0)
            {
                if (Managers.UserManager.Instance.Add(sessionId, sender))
                {
                    Program.AuthServer.Send(new Packets.Internal.PlayerAuthorization(sessionId, userId, username));
                }
                else
                {
                    sender.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure));
                    sender.Disconnect();
                }
            }
            else
            {
                sender.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure));
                sender.Disconnect();
            }
        }
Beispiel #2
0
        public override void Handle(Server sender, InPacket packetReader)
        {
            uint ErrorCode = packetReader.ReadUint();

            if (ErrorCode != 1)
            {
                sender.Disconnect();
                return;
            }

            string globalKey  = packetReader.ReadString();
            string serverName = packetReader.ReadString();
            string ipAddress  = packetReader.ReadString();
            int    port       = packetReader.ReadInt();
            byte   type       = packetReader.ReadByte();

            if (!Enum.IsDefined(typeof(ServerTypes), type))
            {
                sender.Disconnect();
                return;
            }

            ServerTypes enumType = (ServerTypes)type;

            byte serverId = Managers.ServerManager.Instance.Add(sender, serverName, ipAddress, port, enumType);

            if (serverId > 0)
            {
                Log.Instance.WriteLine($"Added Server: {serverName} @ {ipAddress}:{port} with Id: {serverId}");
                sender.Send(new Packets.Internal.Authorize(serverId));
            }
            else
            {
                Log.Instance.WriteError($"Failed to add Server: {serverName} @ {ipAddress}:{port}. Reason: Server Limit reached.");
                sender.Send(new Packets.Internal.Authorize(Core.Enums.Internal.AuthorizationErrorCodes.MaxServersReached));
                sender.Disconnect();
            }
        }
Beispiel #3
0
        public override void Handle(User sender, InPacket packetReader)
        {
            ushort actionType = packetReader.ReadUshort();

            if (actionType >= (ushort)Enums.ItemAction.BuyItem && actionType <= (ushort)Enums.ItemAction.UseItem)
            {
                if (actionType == (ushort)Enums.ItemAction.BuyItem)
                {
                    string itemCode = packetReader.ReadString().ToUpper();

                    if (itemCode.Length == 4)
                    {
                        if (Managers.ItemManager.Instance.Items.ContainsKey(itemCode))
                        {
                            ItemData item = Managers.ItemManager.Instance.Items[itemCode];
                            if (item != null)
                            {
                                uint dbId = packetReader.ReadUint(2);
                                //if (item.dbId == dbId) {
                                byte length = packetReader.ReadByte(4);
                                if (length < 4)
                                {
                                    if (item.Shop.IsBuyable)
                                    {
                                        //TODO: Level check.
                                        //TODO: Add add dinar function.

                                        if (sender.Inventory.Items.Count < Objects.Inventory.Inventory.MAX_ITEMS)
                                        {
                                            if (!item.Shop.RequiresPremium || (item.Shop.RequiresPremium && sender.Premium != Enums.Premium.Free2Play))
                                            {
                                                int price = item.Shop.Cost[length];
                                                if (price >= 0)
                                                {
                                                    int moneyCalc = (int)sender.Money - price;
                                                    if (moneyCalc >= 0)
                                                    {
                                                        var invItem = (Objects.Inventory.Item)null;
                                                        try
                                                        {
                                                            invItem = sender.Inventory.Items.Select(n => n.Value).Where(n => n.ItemCode == item.Code).First();
                                                        }
                                                        catch { invItem = null; }

                                                        uint utcTime    = (uint)DateTime.Now.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
                                                        uint itemLength = (uint)(86400 * days[length]);
                                                        sender.Money = (uint)moneyCalc;

                                                        if (invItem != null)
                                                        { // Has item in inventory.
                                                          // Extend & insert into db :)
                                                            Databases.Game.Query(string.Concat("INSERT INTO user_inventory (`id`, `owner`, `code`, `startdate`, `length`, `price`, `expired`, `deleted`) VALUES (NULL, '", sender.ID, "', '", item.Code.ToUpper(), "', '", utcTime, "', '", itemLength, "', '", price, "', '0', '0'); UPDATE user_details SET money='", sender.Money, "' WHERE id = ", sender.ID, ";"));
                                                            invItem.ExpireDate = invItem.ExpireDate.AddSeconds(itemLength);
                                                            sender.Inventory.Rebuild();
                                                            sender.Send(new Packets.Itemshop(sender));
                                                        }
                                                        else
                                                        { // No item in invetory
                                                          // Insert & fetch id
                                                            uint itemdbId = 0;
                                                            MySql.Data.MySqlClient.MySqlCommand cmd;

                                                            try
                                                            {
                                                                cmd = new MySql.Data.MySqlClient.MySqlCommand(string.Concat("INSERT INTO user_inventory (`id`, `owner`, `code`, `startdate`, `length`, `price`, `expired`, `deleted`) VALUES (NULL, '", sender.ID, "', '", item.Code.ToUpper(), "', '", utcTime, "', '", itemLength, "', '", price, "', '0', '0');"), Databases.Game.OpenConnection());
                                                                cmd.ExecuteNonQuery();
                                                                itemdbId = (uint)cmd.LastInsertedId;
                                                            }
                                                            catch { itemdbId = 0; }

                                                            if (itemdbId > 0)
                                                            {
                                                                Databases.Game.Query(string.Concat("UPDATE user_details SET money='", sender.Money, "' WHERE id = ", sender.ID, ";"));
                                                                sender.Inventory.Add(new Objects.Inventory.Item(-1, itemdbId, item.Code, (utcTime + itemLength)));
                                                                sender.Inventory.Rebuild();
                                                                sender.Send(new Packets.Itemshop(sender));
                                                            }
                                                            else
                                                            {
                                                                sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.CannotBeBougth));
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.NotEnoughDinar));
                                                    }
                                                }
                                                else
                                                {
                                                    sender.Disconnect(); // Item can't be bought for this period. - Cheating?
                                                }
                                            }
                                            else
                                            {
                                                sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.PremiumOnly));
                                            }
                                        }
                                        else
                                        {
                                            sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.InventoryFull)); // Inventory is full.
                                        }
                                    }
                                    else
                                    {
                                        sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.CannotBeBougth)); // Buying an item that isn't for sale? - Cheating?
                                    }
                                }
                                else
                                {
                                    sender.Disconnect(); // Cheating?
                                }
                            }
                            else
                            {
                                sender.Disconnect(); // Invalid id for the item - Cheating?
                            }
                        }
                        else
                        {
                            sender.Disconnect(); // Server error.
                        }
                    }
                    else
                    {
                        sender.Disconnect(); // Code doesn't exist - Cheating?
                    }
                }
                else
                {
                    sender.Disconnect(); // Wrong Code - Cheating?
                }
            }

            /*else if (actionType == (ushort)Enums.ItemAction.UseItem)
             * {
             *  sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.InvalidItem));
             * }*/
            else
            {
                sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.InvalidItem));
            }

            /*} else {
             *  sender.Disconnect(); // Invalid Action type - Cheating?
             * }*/
        }
Beispiel #4
0
        public override void Handle(Server sender, InPacket packetReader)
        {
            ushort errorCode = packetReader.ReadUshort();

            if (Enum.IsDefined(typeof(PlayerAuthorizationErrorCodes), errorCode))
            {
                PlayerAuthorizationErrorCodes enumErrorCode = (PlayerAuthorizationErrorCodes)errorCode;
                uint targetId = packetReader.ReadUint();

                switch (enumErrorCode)
                {
                // A new player logs in.
                case PlayerAuthorizationErrorCodes.Login:
                {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        if (!session.IsActivated)
                        {
                            session.Activate((byte)sender.ID);

                            sender.Send(new Packets.Internal.PlayerAuthorization(session));
                        }
                        else
                        {
                            sender.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.SessionAlreadyActivated, targetId));
                        }
                    }
                    else
                    {
                        sender.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.InvalidSession, targetId));
                    }

                    break;
                }

                // Update the information of a player.
                case PlayerAuthorizationErrorCodes.Update:
                {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        /* Packet Structure v2
                         *
                         * Connection Time
                         * Ping
                         *
                         * [Sub Type]
                         *  - 1 - Update Channel
                         *  - 2 - Update Session Information
                         *  - 3 - Update Action
                         *  - 4 - Update Lobby Room information
                         *  - 5 - Update Ingame Room information
                         *
                         * [Data Blocks]
                         *  - [1] - Update Channel
                         *      - Current channel Id
                         *      - Channel Slot
                         *
                         *  - [2] - Update Session Information
                         *      - Session - Kills
                         *      - Session - Deaths
                         *      - Session - Xp Earned
                         *      - Session - Dinar Earned
                         *      - Session - Dinar Spend
                         *
                         *  - [3] - Update Action
                         *      - Update Type:
                         *
                         *          [1]: Join Room
                         *               - Room ID
                         *               - Room Slot
                         *               - Room Is Master
                         *
                         *          [2]: Leave Room
                         *              - Room ID
                         *              - Room Old Slot
                         *              - Room Was Master?
                         *                  - New master slot
                         *
                         *          [3]: Room Start
                         *              - Team
                         *
                         *          [4]: Room Stop
                         *              - Kills
                         *              - Deaths
                         *              - Flags
                         *              - Points
                         *              - Xp Earned
                         *              - Dinar Earned
                         *              - xp Bonusses (%-Name:%-Name)
                         *              - dinar bonusses (%-Name:%-Name)
                         *
                         *  - [4] - Update Lobby Room information
                         *      - Update Type:
                         *
                         *          [1]: Switch Side
                         *               - Room ID
                         *               - Room Slot
                         *               - Room Is Master
                         *
                         *          [2]:
                         *
                         *  - [5] - Update Ingame Room information
                         *      - Update Type:
                         *
                         *          [1]: Score Update (Player Kill/Player Death)
                         *               - Room ID
                         *               - Room Kills
                         *               - Room Deaths
                         *               - Room Flags
                         *               - Room Points
                         *
                         *          [2]:
                         */
                    }
                    else
                    {
                        // Force a closure of the connection.
                        sender.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.InvalidSession, targetId));
                    }

                    break;
                }

                // A player logs out of the server.
                case PlayerAuthorizationErrorCodes.Logout:
                {
                    Session session = Managers.SessionManager.Instance.Get(targetId);
                    if (session != null)
                    {
                        if (session.IsActivated)
                        {
                            session.End();
                        }
                    }
                    break;
                }

                default:
                {
                    // Unused.
                    break;
                }
                }
            }
            else
            {
                Console.WriteLine(string.Concat("Unknown PlayerAuthorization error: ", errorCode));
            }
        }
Beispiel #5
0
        public override void Handle(ServerClient sender, InPacket packetReader)
        {
            ushort errorCode = packetReader.ReadUshort();

            if (Enum.IsDefined(typeof(PlayerAuthorizationErrorCodes), errorCode))
            {
                PlayerAuthorizationErrorCodes enumErrorCode = (PlayerAuthorizationErrorCodes)errorCode;
                uint targetId = packetReader.ReadUint();

                switch (enumErrorCode)
                {
                // A new player logs in.
                case PlayerAuthorizationErrorCodes.Login:
                {
                    Entities.User u = Managers.UserManager.Instance.Get(targetId);
                    if (u != null)
                    {
                        uint   userId      = packetReader.ReadUint();
                        string username    = packetReader.ReadString();
                        string displayname = packetReader.ReadString();
                        u.OnAuthorize(userId, username, displayname);
                    }
                    break;
                }

                // Update the information of a player.
                case PlayerAuthorizationErrorCodes.Update:
                {
                    break;
                }

                // A player logs out of the server.
                case PlayerAuthorizationErrorCodes.Logout:
                {
                    break;
                }

                case PlayerAuthorizationErrorCodes.InvalidSession:
                {
                    Entities.User u = Managers.UserManager.Instance.Get(targetId);
                    if (u != null)
                    {
                        if (!u.Authenticated)
                        {
                            u.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure));
                        }
                        u.Disconnect();
                    }
                    break;
                }

                case PlayerAuthorizationErrorCodes.IvalidMatch:
                {
                    Entities.User u = Managers.UserManager.Instance.Get(targetId);
                    if (u != null)
                    {
                        u.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure));
                        u.Disconnect();
                    }
                    break;
                }

                case PlayerAuthorizationErrorCodes.SessionAlreadyActivated:
                {
                    Entities.User u = Managers.UserManager.Instance.Get(targetId);
                    if (u != null)
                    {
                        u.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure));
                        u.Disconnect();
                    }
                    break;
                }

                default:
                {
                    // Unused.
                    break;
                }
                }
            }
            else
            {
                Log.Instance.WriteLine(string.Concat("Unknown PlayerAuthorization error: ", errorCode));
            }
        }
Beispiel #6
0
        public override void Handle(User sender, InPacket packetReader)
        {
            if (sender.Authenticated)
            {
                byte type = packetReader.ReadByte();

                if (Enum.IsDefined(typeof(ChatType), type))
                {
                    // TODO: Read everything correctly.
                    ChatType chatType = (ChatType)type;
                    uint nowTimeStamp = (uint)DateTime.Now.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;

                    uint targetId = packetReader.ReadUint();
                    string targetName = packetReader.ReadString();
                    string message = packetReader.ReadString();
                    string realMessage = message.Split(new string[] { ">>" }, StringSplitOptions.None)[1].Trim();

                    if (realMessage.Length <= 55)
                    {
                        realMessage = realMessage.Trim();
                        switch (chatType)
                        {
                            case ChatType.LobbyToChannel:
                                {
                                    if (sender.Room == null)
                                    {
                                        Databases.Game.AsyncInsert("chat_public_lobby", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "target_all", 0 }, { "message", realMessage }, { "timestamp", nowTimeStamp } });
                                        OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName);
                                        Managers.ChannelManager.Instance.SendLobby(sender.Channel, p.BuildEncrypted());
                                    }
                                    else
                                    {
                                        sender.Disconnect(); // Sending lobby messages when in a room?
                                    }
                                    break;
                                }
                            case ChatType.LobbyToAll:
                                {
                                    if (sender.Room == null)
                                    {
                                        Databases.Game.AsyncInsert("chat_public_lobby", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "target_all", 1 }, { "message", realMessage }, { "timestamp", nowTimeStamp } });
                                        OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName);
                                        Managers.ChannelManager.Instance.SendAllLobbies(p.BuildEncrypted());
                                    }
                                    else
                                    {
                                        sender.Disconnect(); // Sending lobby messages when in a room?
                                    }
                                    break;
                                }
                            case ChatType.RoomToAll:
                                {
                                    if (sender.Room != null)
                                    {
                                        if (sender.Room.State == RoomState.Waiting && sender.RoomSlot == sender.Room.Master)
                                        {
                                            if (sender.Room.Supermaster)
                                            {
                                                targetId = 998;
                                            }
                                        }
                                        Databases.Game.AsyncInsert("chat_public_room", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "room_id", sender.Room.ID }, { "team_side", (byte)sender.Room.Players[sender.RoomSlot].Team }, { "target_all", 1 }, { "message", realMessage }, { "timestamp", nowTimeStamp } });
                                        OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName);
                                        sender.Room.Send(p.BuildEncrypted());
                                    }
                                    else
                                    {
                                        sender.Disconnect();
                                    }
                                    break;
                                }
                            case ChatType.RoomToTeam:
                                {
                                    if (sender.Room != null)
                                    {
                                        if (sender.Room.Mode != Mode.Free_For_All && sender.Room.State == RoomState.Playing)
                                        {
                                            Databases.Game.AsyncInsert("chat_public_room", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "room_id", sender.Room.ID }, { "team_side", (byte)sender.Room.Players[sender.RoomSlot].Team }, { "target_all", 0 }, { "message", realMessage }, { "timestamp", nowTimeStamp } });
                                            OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName);
                                            byte[] buffer = p.BuildEncrypted();
                                            sender.Room.Players.Values.Where(n => n.Team == sender.Room.Players[sender.RoomSlot].Team).ToList().ForEach(n => n.Send(buffer));
                                        }
                                        else
                                        {
                                            sender.Disconnect(); // NO team CHAT IN FFA or in the lobby.
                                        }
                                    }
                                    break;
                                }

                            default:
                                {

                                    break;
                                }
                        }
                    }
                    else
                    {
                        sender.Disconnect(); // Message is to long?
                    }
                }
            }
            else
            {
                sender.Disconnect();
            }
        }