예제 #1
0
        public override void Handle(ServerClient sender, InPacket packetReader)
        {
            ushort errorCode = packetReader.ReadUshort();

            if (sender.Authorized)
            {
                return;                    // Ignore other packets.
            }
            if (Enum.IsDefined(typeof(AuthorizationErrorCodes), errorCode))
            {
                AuthorizationErrorCodes enumErrorCode = (AuthorizationErrorCodes)errorCode;
                switch (enumErrorCode)
                {
                case AuthorizationErrorCodes.OK:
                {
                    sender.OnAuthorize(packetReader.ReadByte());
                    Console.Title = "AlterEmu - Game Server: " + Config.SERVER_NAME;
                    break;
                }

                case AuthorizationErrorCodes.InvalidKey:
                {
                    DisconnectErrorLog(sender, "Error while authorizing: the authorization key didn't match.");
                    break;
                }

                case AuthorizationErrorCodes.Duplicate:
                {
                    DisconnectErrorLog(sender, "Error while authorizing: a server with the same ip address is already online.");
                    break;
                }

                case AuthorizationErrorCodes.MaxServersReached:
                {
                    DisconnectErrorLog(sender, "Error while authorizing: maximum amount of servers reached.");
                    break;
                }

                case AuthorizationErrorCodes.NameAlreadyUsed:
                {
                    DisconnectErrorLog(sender, "Error while authorizing: the server name is already in use.");
                    break;
                }

                default:
                {
                    DisconnectErrorLog(sender, string.Concat("An unknown(", errorCode.ToString("x2"), ") error occured while authorizing the server."));
                    break;
                }
                }
            }
            else
            {
                // Unknown error
                Log.Instance.WriteLine(string.Concat("An unknown(", errorCode.ToString("x2"), ") error occured while authorizing the server."));
                sender.Disconnect(true);
            }
        }
예제 #2
0
 public override void Handle(User sender, InPacket packetReader)
 {
     if (sender.Authenticated && sender.Room != null)
     {
         // [0] = ROOM SLOT
         // [1] = ROOM ID
         byte roomSlot = packetReader.ReadByte(0);
         if (roomSlot < sender.Room.MaximumPlayers)
         {
             ushort roomId = packetReader.ReadUshort(1);
             if (roomId == sender.Room.ID)
             {
                 byte   unknown = packetReader.ReadByte(2); // Seems to be 2 or 0?
                 ushort subType = packetReader.ReadUshort(3);
                 // HANDLE PACKET IN A SEPERATED CLASS //
                 GameDataHandler handler = NetworkTable.Instance.GetHandler(subType);
                 if (handler != null)
                 {
                     try
                     {
                         handler.Process(sender, packetReader);
                     }
                     catch { /* error? */ }
                 }
                 else
                 {
                     Log.Instance.WriteLine("UNKNOWN SUBPACKET :: " + packetReader);
                 }
             }
             else
             {
                 sender.Disconnect(); // Wrong room targeted - Cheating?
             }
         }
         else
         {
             sender.Disconnect(); // Room slot over maximum players - Cheating?
         }
     }
 }
예제 #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?
             * }*/
        }
예제 #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));
            }
        }
예제 #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));
            }
        }
예제 #6
0
        public override void Handle(User sender, InPacket packetReader)
        {
            if (sender.Authenticated)
            {
                if (sender.Room == null)
                {
                    Objects.Channel channel = Managers.ChannelManager.Instance.Get(sender.Channel);

                    ushort roomId       = packetReader.ReadUshort();
                    string roomPassword = packetReader.ReadString();

                    if (channel.Rooms.ContainsKey(roomId))
                    {
                        Room r = null;
                        if (channel.Rooms.TryGetValue(roomId, out r))
                        {
                            bool validPassword = true;
                            bool validPremium  = true;

                            if (r.HasPassword && r.Password != roomPassword)
                            {
                                validPassword = false;
                            }

                            if (r.PremiumOnly && sender.Premium == Enums.Premium.Free2Play)
                            {
                                validPremium = false;
                            }

                            // TODO: Validate the level limit.

                            if (validPassword)
                            {
                                if (validPremium)
                                {
                                    if (!r.Add(sender))
                                    {
                                        sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.GenericError));
                                    }
                                }
                                else
                                {
                                    sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.OnlyPremium));
                                }
                            }
                            else
                            {
                                sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.InvalidPassword));
                            }
                        }
                        else
                        {
                            sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.GenericError));
                        }
                    }
                    else
                    {
                        sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.GenericError));
                    }
                }
            }
            else
            {
                sender.Disconnect();
            }
        }