예제 #1
0
        public void SendNotif(string message, int type = 0)
        {
            ServerMessage message_ = null;

            switch (type)
            {
            case 0:
                message_ = BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NotifFromMod).Handle(new ValueHolder().AddValue("Message", message));
                break;

            case 1:
                message_ = BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NotifFromAdmin).Handle(new ValueHolder().AddValue("Message", message));
                break;

            case 2:
                message_ = BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.MOTD).Handle(new ValueHolder().AddValue("Message", new List <string>()
                {
                    message
                }));
                break;

            default:
                message_ = BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NotifFromMod).Handle(new ValueHolder().AddValue("Message", message));
                break;
            }
            this.SendMessage(message_);
        }
예제 #2
0
        public byte[] GetBytes(Revision revision)
        {
            byte[] bytes = null;
            if (!this.Bytes.TryGetValue(revision, out bytes))
            {
                OutgoingPacket packet_ = null;
                if (BasicUtilies.GetRevisionPacketManager(revision).HandleOutgoing(this.Packet, out packet_))
                {
                    ServerMessage message = packet_.Handle(this.ValueHolder);
                    if (message == null || message is EmptyServerMessage)
                    {
                        bytes = null;
                    }
                    else
                    {
                        bytes = message.GetBytes();
                    }
                }
                else
                {
                    throw new Exception("Unable to find packet id: " + this.Packet + ", from: " + revision);
                }

                this.Bytes.Add(revision, bytes);
            }

            return(bytes);
        }
예제 #3
0
        public void Handle(GameClient session, ClientMessage message)
        {
            if (session != null && session.GetHabbo() != null && session.GetHabbo().GetRoomSession() != null)
            {
                Room room = session.GetHabbo().GetRoomSession().GetRoom();
                if (room != null)
                {
                    RoomItem item = room.RoomItemManager.TryGetFloorItem(message.PopWiredUInt());
                    if (room.GaveRoomRights(session))
                    {
                        if (item != null)
                        {
                            int x   = message.PopWiredInt32();
                            int y   = message.PopWiredInt32();
                            int rot = message.PopWiredInt32();

                            if (room.RoomItemManager.MoveFloorItemOnRoom(session, item, x, y, rot))
                            {
                                return;
                            }
                        }
                    }

                    //ServerMessage msg = BasicUtilies.GetRevisionServerMessage(Revision.PRODUCTION_201601012205_226667486);
                    //msg.Init(2419);
                    //msg.AppendString("furni_placement_error");
                    //msg.AppendInt32(1);
                    //msg.AppendString("message");
                    //msg.AppendString("${room.error.cant_set_item}");
                    //session.SendMessage(msg);
                    session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.UpdateFloorItem).Handle(new ValueHolder("Item", item)));
                }
            }
        }
예제 #4
0
 public void Handle(GameClient session, ClientMessage message)
 {
     if (session != null && session.GetHabbo() != null)
     {
         session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.CatalogIndexes).Handle(new ValueHolder("Rank", session.GetHabbo().Rank)));
     }
 }
예제 #5
0
        public void AddBadge(string badgeId, int slotId, bool saveToDB)
        {
            if (!this.HaveBadge(badgeId))
            {
                if (saveToDB)
                {
                    using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                    {
                        dbClient.AddParamWithValue("userId", this.HabboID);
                        dbClient.AddParamWithValue("badge", badgeId);
                        dbClient.AddParamWithValue("slotId", slotId);

                        dbClient.ExecuteQuery("INSERT INTO user_badges(user_id, badge_id, badge_slot) VALUES(@userId, @badge, @slotId)");
                    }
                }

                this.Badges.Add(badgeId, new Badge(badgeId, slotId));

                if (this.Habbo.GetSession().Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
                {
                    this.Habbo.GetSession().SendMessage(BasicUtilies.GetRevisionPacketManager(this.Habbo.GetSession().Revision).GetOutgoing(OutgoingPacketsEnum.UnseenItem).Handle(new ValueHolder().AddValue("Type", 4).AddValue("ID", BadgeManager.GetBadgeID(badgeId))));
                }
                this.SendAllBadges();
            }
        }
예제 #6
0
파일: Habbo.cs 프로젝트: aromaa/Skylight
        private void HandleActivityPointsUpdate(int id)
        {
            this.ActivityPoints.TryGetValue(id, out int points);

            if (this.GetSession().Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
            {
                this.GetSession().SendMessage(BasicUtilies.GetRevisionPacketManager(this.GetSession().Revision).GetOutgoing(OutgoingPacketsEnum.UpdateActivityPoints).Handle(new ValueHolder().AddValue("ID", id).AddValue("Points", points)));
            }
        }
예제 #7
0
파일: Habbo.cs 프로젝트: aromaa/Skylight
 public void SendOnlineUsersCount()
 {
     if (this.GetSession().Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
     {
         this.GetSession().SendMessage(BasicUtilies.GetRevisionPacketManager(this.GetSession().Revision).GetOutgoing(OutgoingPacketsEnum.UpdateActivityPointsSilence).Handle(new ValueHolder().AddValue("ActivityPoints", this.ActivityPoints.Concat(new Dictionary <int, int>()
         {
             { 69, Skylight.GetGame().GetGameClientManager().OnlineCount }
         }).ToDictionary(k => k.Key, v => v.Value))));
     }
 }
예제 #8
0
        public void LeaveRoom(GameClient session, bool sendLeavePacket)
        {
            this.LeaveRoom(session.GetHabbo().GetRoomSession().GetRoomUser());

            session.GetHabbo().GetRoomSession().LeavedRoom();

            if (sendLeavePacket)
            {
                session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.LeaveRoom).Handle());
            }
        }
예제 #9
0
        public override bool HandleMessage(GameClient session, ClientMessage message)
        {
            IncomingPacket incomingPacket;

            if (BasicUtilies.GetRevisionPacketManager(session.Revision).HandleIncoming(message.GetID(), out incomingPacket))
            {
                incomingPacket.Handle(session, message);

                try
                {
                    if (Skylight.GetConfig()["debug.incoming"] == "1")
                    {
                        Logging.WriteLine(string.Concat(new object[]
                        {
                            "[",
                            session.ID,
                            "] --> [",
                            message.GetID(),
                            "] ",
                            message.GetHeader(),
                            message.GetBody()
                        }));
                    }
                }
                catch
                {
                }
            }
            else
            {
                try
                {
                    if (Skylight.GetConfig()["show.unhandled.packets"] == "1")
                    {
                        Logging.WriteLine(string.Concat(new object[]
                        {
                            "[",
                            session.ID,
                            "] --> Packet dosen't exit: [",
                            message.GetID(),
                            "] ",
                            message.GetHeader(),
                            message.GetBody()
                        }));
                    }
                }
                catch
                {
                }
            }

            return(true);
        }
예제 #10
0
        public void Handle(GameClient session, ClientMessage message)
        {
            //if (session.SecurityNumber[0] == 0) //should be called once so this shouldn meter
            //{
            if (ServerConfiguration.EnableCrypto)
            {
                int cryptoType = message.PopWiredInt32();
                if (cryptoType == 0 && ServerConfiguration.CryptoType == 0) //banner data requested & server using this type encryption
                {
                    //session.SecurityNumber[0] = 1;
                    //session.SecurityNumber[1] = 1;

                    ServerMessage message_ = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                    message_.Init(r63aOutgoing.Crypto);
                    message_.AppendString(Skylight.GetPublicToken());
                    message_.AppendInt32(0); //not used
                    session.SendMessage(message_);
                }
                else
                {
                    session.Stop("Invalid crypto type");
                }
            }
            else
            {
                if (!ServerConfiguration.RequireMachineID)
                {
                    IncomingPacket incoming;
                    if (BasicUtilies.GetRevisionPacketManager(Revision.RELEASE63_35255_34886_201108111108).HandleIncoming(r63aIncoming.GetSessionParameters, out incoming))
                    {
                        incoming.Handle(session, null);
                    }
                }
                else //REQUIRED EDITED HABBO.SWF
                {
                    //session.SecurityNumber[0] = 1;
                    //session.SecurityNumber[1] = 1;

                    ServerMessage message_ = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                    message_.Init(r63aOutgoing.Crypto);
                    message_.AppendBoolean(false);
                    //message_.AppendString("");
                    //message_.AppendInt32(0); //not used
                    session.SendMessage(message_);
                }
            }
            //}
            //else
            //{
            //    session.Stop("Crypto error");
            //}
        }
예제 #11
0
        public void AddInventoryItemToHand(InventoryItem inventoryItem)
        {
            if (inventoryItem.GetItem().IsWallItem)
            {
                this.WallItems.Add(inventoryItem.ID, inventoryItem);
            }
            else
            {
                this.FloorItems.Add(inventoryItem.ID, inventoryItem);
            }

            this.SendData(BasicUtilies.GetRevisionPacketManager(this.Session.Revision).GetOutgoing(OutgoingPacketsEnum.AddItemToInventory).Handle(new ValueHolder("InventoryManager", this, "Item", inventoryItem)));
        }
예제 #12
0
파일: Habbo.cs 프로젝트: aromaa/Skylight
        public void UpdateCredits(bool save)
        {
            this.GetSession().SendMessage(BasicUtilies.GetRevisionPacketManager(this.GetSession().Revision).GetOutgoing(OutgoingPacketsEnum.UpdateCredits).Handle(new ValueHolder().AddValue("Credits", this.Credits)));

            if (save)
            {
                using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                {
                    dbClient.AddParamWithValue("credits", this.Credits);
                    dbClient.AddParamWithValue("userId", this.ID);

                    dbClient.ExecuteQuery("UPDATE users SET credits = @credits WHERE id = @userId LIMIT 1");
                }
            }
        }
예제 #13
0
        public void RemoveItemFromHand(uint id, bool delete)
        {
            if (delete)
            {
                using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                {
                    dbClient.AddParamWithValue("itemId", id);
                    dbClient.ExecuteQuery("DELETE FROM items WHERE id = @itemId LIMIT 1;");
                }
            }

            this.SendData(BasicUtilies.GetRevisionPacketManager(this.Session.Revision).GetOutgoing(OutgoingPacketsEnum.RemoveItemFromHand).Handle(new ValueHolder("InventoryManager", this, "ID", id)));

            this.FloorItems.Remove(id);
            this.WallItems.Remove(id);
        }
예제 #14
0
 public void UpdateAchievement(GameClient session, string group)
 {
     if (session.Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
     {
         if (this.Achievements.ContainsKey(group))
         {
             Achievement achievement = this.Achievements[group];
             if (achievement != null)
             {
                 AchievementLevel level = session.GetHabbo().GetUserAchievements().GetAchievementLevel(achievement.GroupName) == achievement.LevelsCount ? achievement.GetLevel(session.GetHabbo().GetUserAchievements().GetAchievementLevel(achievement.GroupName)) : achievement.GetLevel(session.GetHabbo().GetUserAchievements().GetAchievementLevel(achievement.GroupName) + 1); //next level progress
                 if (level != null)
                 {
                     session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.UpdateAchievement).Handle(new ValueHolder().AddValue("Session", session).AddValue("Achievement", achievement).AddValue("Level", level).AddValue("LastLevel", achievement.GetLevel(level.Level - 1))));
                 }
             }
         }
     }
 }
예제 #15
0
        public ServerMessage SearchRooms(string entry, Revision revision)
        {
            DataTable results = null;

            using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
            {
                if (entry.Length > 0)
                {
                    if (entry.StartsWith("owner:"))
                    {
                        dbClient.AddParamWithValue("owner", Skylight.GetGame().GetGameClientManager().GetIDByUsername(entry.Substring(6)));
                        results = dbClient.ReadDataTable("SELECT * FROM rooms WHERE type = 'private' AND ownerid = @owner ORDER BY users_now LIMIT 50");
                    }
                    else if (entry.StartsWith("tag:"))
                    {
                        dbClient.AddParamWithValue("query", "%" + entry.Substring(4).Replace("%", "\\%") + "%");
                        results = dbClient.ReadDataTable("SELECT * FROM rooms WHERE type = 'private' AND tags LIKE @query ORDER BY users_now LIMIT 50");
                    }
                    else
                    {
                        dbClient.AddParamWithValue("query", "%" + entry.Replace("%", "\\%") + "%");
                        results = dbClient.ReadDataTable("SELECT r.* FROM rooms r LEFT JOIN users u ON r.ownerid = u.id WHERE r.type = 'private' AND (r.name LIKE @query OR u.username LIKE @query) ORDER BY r.users_now LIMIT 50");
                    }
                }
            }

            List <RoomData> rooms = new List <RoomData>();

            if (results != null && results.Rows.Count > 0)
            {
                foreach (DataRow dataRow in results.Rows)
                {
                    RoomData room = Skylight.GetGame().GetRoomManager().TryGetAndLoadRoomData((uint)dataRow["id"], dataRow);
                    if (room != null)
                    {
                        rooms.Add(room);
                    }
                }
            }

            return(BasicUtilies.GetRevisionPacketManager(revision).GetOutgoing(OutgoingPacketsEnum.RoomSearch).Handle(new ValueHolder("Entry", entry, "Rooms", rooms, "PublicRoom", this.PublicRooms.Count > 0 ? this.PublicRooms.Values.ElementAt(new Random().Next(0, this.PublicRooms.Count)) : null)));
        }
예제 #16
0
        public void AddAchievement(GameClient session, string group, int level)
        {
            if (this.Achievements.ContainsKey(group))
            {
                Achievement achievement = this.Achievements[group];
                if (achievement != null)
                {
                    AchievementLevel currentLevel = achievement.GetLevel(session.GetHabbo().GetUserAchievements().GetAchievementLevel(group));
                    AchievementLevel nextLevel    = achievement.GetLevel(level);
                    if (nextLevel != null && nextLevel.Level > session.GetHabbo().GetUserAchievements().GetAchievementLevel(group))
                    {
                        session.GetHabbo().GetUserAchievements().AchievementUnlocked(group, level);
                        if (currentLevel != null)
                        {
                            session.GetHabbo().GetBadgeManager().RemoveBadge(currentLevel.LevelBadge);
                        }
                        session.GetHabbo().GetBadgeManager().AddBadge(nextLevel.LevelBadge, 0, true);
                        session.GetHabbo().AddActivityPoints(nextLevel.ActivityPointsType, nextLevel.ActivityPoints);
                        session.GetHabbo().UpdateActivityPoints(nextLevel.ActivityPointsType, true);
                        session.GetHabbo().GetUserStats().AchievementPoints += nextLevel.Score;

                        if (session.Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
                        {
                            session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.AchievementUnlocked).Handle(new ValueHolder().AddValue("Achievement", achievement).AddValue("NextLevel", nextLevel).AddValue("CurrentLevel", currentLevel)));
                        }

                        this.UpdateAchievement(session, group);

                        using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                        {
                            if (session.GetHabbo().GetUserSettings().FriendStream)
                            {
                                dbClient.AddParamWithValue("userId", session.GetHabbo().ID);
                                dbClient.AddParamWithValue("badge", nextLevel.LevelBadge);
                                dbClient.ExecuteQuery("INSERT INTO user_friend_stream(type, user_id, timestamp, extra_data) VALUES('2', @userId, UNIX_TIMESTAMP(), @badge)");
                            }
                        }
                    }
                }
            }
        }
예제 #17
0
        public void Handle(GameClient session, ClientMessage message)
        {
            if (session != null && session.GetHabbo() != null && session.GetHabbo().GetRoomSession() != null)
            {
                Room room = session.GetHabbo().GetRoomSession().GetRoom();
                if (room != null && room.GaveRoomRights(session))
                {
                    RoomItem item = room.RoomItemManager.TryGetFloorItem(message.PopWiredUInt());
                    if (item != null)
                    {
                        int x   = message.PopWiredInt32();
                        int y   = message.PopWiredInt32();
                        int rot = message.PopWiredInt32();

                        if (!room.RoomItemManager.MoveFloorItemOnRoom(session, item, x, y, rot))
                        {
                            session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.UpdateFloorItem).Handle(new ValueHolder("Item", item)));
                        }
                    }
                }
            }
        }
예제 #18
0
 public byte[] GetHeightmap(Revision revision, RoomTile[,] tiles)
 {
     return(BasicUtilies.GetRevisionPacketManager(revision).GetOutgoing(OutgoingPacketsEnum.Heightmap).Handle(new ValueHolder().AddValue("Heightmap", this.BuildHeightmap(tiles))).GetBytes());
 }
예제 #19
0
        public void Handle(GameClient session, ClientMessage message)
        {
            if (session != null && session.GetHabbo() != null && session.GetHabbo().GetRoomSession().RequestedRoomID > 0 && session.GetHabbo().GetRoomSession().LoadingRoom)
            {
                Room room = Skylight.GetGame().GetRoomManager().TryGetRoom(session.GetHabbo().GetRoomSession().RequestedRoomID);
                session.GetHabbo().GetRoomSession().ResetRequestedRoom();
                if (room != null)
                {
                    if (room.RoomGamemapManager.Model != null)
                    {
                        session.SendData(room.RoomGamemapManager.Model.GetHeightmap(session.Revision, room.RoomGamemapManager.Tiles));
                        session.SendData(room.RoomGamemapManager.Model.GetRelativeHeightmap(session.Revision));
                        session.SendData(room.RoomGamemapManager.Model.GetPublicItems(session.Revision), true);

                        if (room.RoomData.Type == "private")
                        {
                            ServerMessage floorItems = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            floorItems.Init(r63aOutgoing.FloorItems);
                            floorItems.AppendInt32(room.RoomItemManager.FloorItems.Count);
                            foreach (RoomItem item in room.RoomItemManager.FloorItems.Values)
                            {
                                item.Serialize(floorItems);
                            }
                            session.SendMessage(floorItems);

                            ServerMessage wallItems = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            wallItems.Init(r63aOutgoing.WallItems);
                            wallItems.AppendInt32(room.RoomItemManager.WallItems.Count);
                            foreach (RoomItem item in room.RoomItemManager.WallItems.Values)
                            {
                                item.Serialize(wallItems);
                            }
                            session.SendMessage(wallItems);
                        }

                        room.RoomUserManager.EnterRoom(session);

                        ICollection <RoomUnit> users        = room.RoomUserManager.GetRoomUsers();
                        ServerMessage          setRoomUsers = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                        setRoomUsers.Init(r63aOutgoing.SetRoomUser);
                        setRoomUsers.AppendInt32(users.Count);
                        foreach (RoomUnit user in users)
                        {
                            user.Serialize(setRoomUsers);
                        }
                        session.SendMessage(setRoomUsers);

                        ServerMessage roomVIPsetting = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                        roomVIPsetting.Init(r63aOutgoing.RoomVIPSettings);
                        roomVIPsetting.AppendBoolean(room.RoomData.Hidewalls);
                        roomVIPsetting.AppendInt32(room.RoomData.Wallthick);
                        roomVIPsetting.AppendInt32(room.RoomData.Floorthick);
                        session.SendMessage(roomVIPsetting);

                        if (room.RoomData.Type == "private")
                        {
                            ServerMessage roomOwner = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            roomOwner.Init(r63aOutgoing.RoomOwner);
                            roomOwner.AppendBoolean(true);                          //is private room
                            roomOwner.AppendUInt(room.ID);
                            roomOwner.AppendBoolean(room.HaveOwnerRights(session)); //is roomowner
                            session.SendMessage(roomOwner);

                            ServerMessage roomData = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            roomData.Init(r63aOutgoing.RoomData);
                            roomData.AppendBoolean(false);                     //entered room
                            room.RoomData.Serialize(roomData, false);
                            roomData.AppendBoolean(false);                     //forward
                            roomData.AppendBoolean(room.RoomData.IsStaffPick); //is staff pick
                            session.SendMessage(roomData);
                        }
                        else
                        {
                            ServerMessage roomOwner = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            roomOwner.Init(r63aOutgoing.RoomOwner);
                            roomOwner.AppendBoolean(false); //is private room
                            roomOwner.AppendString(room.RoomGamemapManager.Model.ID);
                            roomOwner.AppendInt32(0);       //unknwown
                            session.SendMessage(roomOwner);
                        }

                        MultiRevisionServerMessage usersStatuses = room.RoomUserManager.GetUserStatus(true);
                        if (usersStatuses != null)
                        {
                            session.SendData(usersStatuses.GetBytes(session.Revision));
                        }

                        foreach (RoomUnitUser user in room.RoomUserManager.GetRealUsers())
                        {
                            if (user.Dancing)
                            {
                                ServerMessage danceMessage = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                                danceMessage.Init(r63aOutgoing.Dance);
                                danceMessage.AppendInt32(user.VirtualID);
                                danceMessage.AppendInt32(user.DanceID);
                                session.SendMessage(danceMessage);
                            }

                            if (user.Sleeps)
                            {
                                ServerMessage sleeps = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                                sleeps.Init(r63aOutgoing.Sleeps);
                                sleeps.AppendInt32(user.VirtualID);
                                sleeps.AppendBoolean(true);
                                session.SendMessage(sleeps);
                            }

                            if (user.Handitem > 0 && user.HanditemTimer > 0)
                            {
                                ServerMessage message_ = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                                message_.Init(r63aOutgoing.Handitem);
                                message_.AppendInt32(user.VirtualID);
                                message_.AppendInt32(user.Handitem);
                                session.SendMessage(message_);
                            }

                            if (user.ActiveEffect > 0)
                            {
                                session.SendMessage(BasicUtilies.GetRevisionPacketManager(Revision.PRODUCTION_201601012205_226667486).GetOutgoing(OutgoingPacketsEnum.Effect).Handle(new ValueHolder("VirtualID", user.VirtualID, "EffectID", user.ActiveEffect)));
                            }
                        }

                        room.RoomWiredManager.UserEnterRoom(session.GetHabbo().GetRoomSession().GetRoomUser());

                        if (session.GetHabbo().IsMuted())
                        {
                            ServerMessage flood = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            flood.Init(r63aOutgoing.Flood);
                            flood.AppendInt32(session.GetHabbo().MuteTimeLeft());
                            session.SendMessage(flood);
                        }
                    }
                    else
                    {
                        session.SendNotif("Failed load room model!");
                    }
                }
                else
                {
                    session.SendNotif("Room not found!");
                }
            }
        }
예제 #20
0
 public void Handle(GameClient session, ClientMessage message)
 {
     session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.InfoRetrieve).Handle(new ValueHolder().AddValue("Session", session)));
 }
예제 #21
0
        public void Initialize()
        {
            Logging.WriteLine("█▀▀▀█ █ █ █  █ █    ▀  █▀▀▀ █  █ ▀▀█▀▀", ConsoleColor.Yellow);
            Logging.WriteLine("▀▀▀▄▄ █▀▄ █▄▄█ █   ▀█▀ █ ▀█ █▀▀█   █  ", ConsoleColor.Yellow);
            Logging.WriteLine("█▄▄▄█ ▀ ▀ ▄▄▄█ ▀▀▀ ▀▀▀ ▀▀▀▀ ▀  ▀   ▀  ", ConsoleColor.Yellow);
            Logging.WriteLine(Skylight.Version, ConsoleColor.Yellow);
            Logging.WriteBlank();

            Logging.WriteLine(Licence.WelcomeMessage, ConsoleColor.Green);
            Logging.WriteBlank();

            try
            {
                Skylight.ServerStarted     = Stopwatch.StartNew();
                Skylight.ConfigurationData = new ConfigurationData("config.conf");

                Logging.Write("Connecting to database... ", ConsoleColor.White);
                try
                {
                    DatabaseServer DatabaseServer = new DatabaseServer(Skylight.GetConfig()["db.hostname"], uint.Parse(Skylight.GetConfig()["db.port"]), Skylight.GetConfig()["db.username"], Skylight.GetConfig()["db.password"]);
                    Database       Database       = new Database(Skylight.GetConfig()["db.name"], uint.Parse(Skylight.GetConfig()["db.pool.minsize"]), uint.Parse(Skylight.GetConfig()["db.pool.maxsize"]));
                    Skylight.DatabaseManager = new DatabaseManager(DatabaseServer, Database);

                    using (DatabaseClient dbClient = Skylight.DatabaseManager.GetClient())
                    {
                        //WHAT AN LOVLY COMMAND WE HAVE OVER HERE! =D
                        dbClient.ExecuteQuery(@"DROP PROCEDURE IF EXISTS parse_activity_points;
CREATE PROCEDURE parse_activity_points(bound VARCHAR(255), bound2 VARCHAR(255))
  BEGIN
    DECLARE id INT DEFAULT 0;
    DECLARE value TEXT;
    DECLARE occurance INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE splitted_value TEXT;
    DECLARE splitted_value_2 TEXT;
    DECLARE splitted_value_3 TEXT;
    DECLARE done INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT users.id, users.activity_points FROM users;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    DROP TEMPORARY TABLE IF EXISTS activity_points_parsed_data;
    CREATE TEMPORARY TABLE activity_points_parsed_data(`id` INT NOT NULL,`value` VARCHAR(255) NOT NULL,`value2` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`,`value`)) ENGINE=Memory;
    OPEN cur1;
      read_loop: LOOP
        FETCH cur1 INTO id, value;
        IF done THEN LEAVE read_loop;
        END IF;
        SET occurance = (SELECT LENGTH(value) - LENGTH(REPLACE(value, bound, '')) +1);
        SET i=1;
        WHILE i <= occurance DO
          SET splitted_value = (SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(value, bound, i), LENGTH(SUBSTRING_INDEX(value, bound, i - 1)) + 1), bound, ''));
					SET splitted_value_2 = (SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(splitted_value, bound2, 1), LENGTH(SUBSTRING_INDEX(splitted_value, bound2, 1 - 1)) + 1), bound2, ''));
					SET splitted_value_3 = (SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(splitted_value, bound2, 2), LENGTH(SUBSTRING_INDEX(splitted_value, bound2, 2 - 1)) + 1), bound2, ''));
                    IF splitted_value_3 = '' THEN SET splitted_value_3 = splitted_value_2, splitted_value_2 = '0'; END IF;
          INSERT INTO activity_points_parsed_data VALUES (id, splitted_value_2, splitted_value_3) ON DUPLICATE KEY UPDATE value2 = value2 + splitted_value_3;
          SET i = i + 1;
        END WHILE;
      END LOOP;
    CLOSE cur1;
  END;");
                    }
                }
                catch (MySqlException ex)
                {
                    Logging.WriteLine("failed!", ConsoleColor.Red);

                    Skylight.ExceptionShutdown(ex);
                    return;
                }
                Logging.WriteLine("completed!", ConsoleColor.Green);

                Skylight.LateQueryManager = new LateQueryManager();

                Skylight.PublicToken = new BigInteger(DiffieHellman.GenerateRandomHexString(15), 16).ToString();
                Skylight.HabboCrypto = new HabboCrypto(n, e, d);

                using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                {
                    dbClient.AddParamWithValue("bannerData", Skylight.HabboCrypto.Prime + ":" + Skylight.HabboCrypto.Generator);
                    dbClient.ExecuteQuery("UPDATE users SET online = '0'; UPDATE rooms SET users_now = '0'; UPDATE server_settings SET banner_data = @bannerData;");
                }

                Skylight.TargetRevision       = RevisionUtilies.StringToRevision(Skylight.GetConfig()["game.revision"]);
                Skylight.MultiRevisionSupport = TextUtilies.StringToBool(Skylight.GetConfig()["game.mrs.enabled"]);

                Skylight.PacketManager = BasicUtilies.GetRevisionPacketManager(Skylight.Revision); //needed for stuff
                Skylight.PacketManager.Initialize();

                Skylight.Game = new Game();
                Skylight.Game.Init();

                if (Skylight.GetConfig()["game.efpfr.enabled"] == "1")
                {
                    Skylight.ExternalFlashPolicyFileRequestPort = true;
                    Skylight.FlashPolicyFileRequestListener     = new FlashPolicyFileRequestListener(Skylight.GetConfig()["game.efpfr.bindip"], int.Parse(Skylight.GetConfig()["game.efpfr.port"]));
                    Skylight.FlashPolicyFileRequestListener.Start();
                }

                Skylight.SocketsManager = new SocketsManager(Skylight.GetConfig()["game.tcp.bindip"], int.Parse(Skylight.GetConfig()["game.tcp.port"]), int.Parse(Skylight.GetConfig()["game.tcp.conlimit"]));
                foreach (string key in Skylight.ConfigurationData.GetChildKeys("game.tcp.extra"))
                {
                    Skylight.SocketsManager.AddListener(new SocketsListener(Skylight.SocketsManager, Skylight.GetConfig()["game.tcp.extra." + key + ".bindip"], int.Parse(Skylight.GetConfig()["game.tcp.extra." + key + ".port"]), RevisionUtilies.StringToRevision(Skylight.GetConfig()["game.tcp.extra." + key + ".revision"]), RevisionUtilies.StringToCrypto(Skylight.GetConfig().TryGet("game.tcp.extra." + key + ".crypto"))));
                }
                Skylight.SocketsManager.Start();

                if (Skylight.GetConfig()["rcon.tcp.enabled"] == "1")
                {
                    Skylight.RCONListener = new RCONListener(Skylight.GetConfig()["rcon.tcp.bindip"], int.Parse(Skylight.GetConfig()["rcon.tcp.port"]), Skylight.GetConfig()["rcon.tcp.allowedips"]);
                    Skylight.RCONListener.Start();
                }

                if (Skylight.GetConfig()["mus.tcp.enabled"] == "1")
                {
                    Skylight.MUSListener = new MUSListener(Skylight.GetConfig()["mus.tcp.bindip"], int.Parse(Skylight.GetConfig()["mus.tcp.port"]));
                    Skylight.MUSListener.Start();
                }

                TimeSpan bootTime = Skylight.Uptime;
                Logging.WriteLine("READY! (" + bootTime.Seconds + " s, " + bootTime.Milliseconds + " ms)", ConsoleColor.Green);
            }
            catch (Exception ex)
            {
                Logging.WriteLine("FAILED TO BOOT! ", ConsoleColor.Red);

                Skylight.ExceptionShutdown(ex);
            }
        }
예제 #22
0
 public ServerMessage GetFlatCatsMessage(GameClient session)
 {
     return(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.FlatCats).Handle(new ValueHolder().AddValue("FlatCats", this.FlatCats.Values.ToList()).AddValue("Rank", session.GetHabbo().Rank)));
 }
예제 #23
0
 public ServerMessage SerializeModTool(GameClient session)
 {
     return(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.ModTool).Handle(new ValueHolder().AddValue("Session", session)));
 }
예제 #24
0
        public override bool HandlePacket(GameClient session, ref byte[] packet)
        {
            try
            {
                ClientMessage message = this.TryParseAsOldCrypto(packet);
                if (message is OldCryptoClientMessage)
                {
                    if (this.State == 0 && message.GetID() == r63aIncoming.InitCryptoMessage) //same on r26 and r63a
                    {
                        IncomingPacket packet_ = null;
                        if (BasicUtilies.GetRevisionPacketManager(Revision.RELEASE63_35255_34886_201108111108).HandleIncoming(message.GetID(), out packet_))
                        {
                            packet_.Handle(session, message);
                            this.State = 1;
                        }
                    }
                    else if (this.State == 1 && message.GetID() == r26Outgoing.SecretKey && ServerConfiguration.RequireMachineID)
                    {
                        session.RemoveDataHandler(this.Identifier());
                        session.Revision = Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169;
                    }
                    else if (this.State == 1 && message.GetID() == 204 /* NO CLUE WTF IS THIS */ && !ServerConfiguration.RequireMachineID)
                    {
                        session.RemoveDataHandler(this.Identifier());
                        session.Revision = Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169;
                    }
                    else if (this.State == 1 && message.GetID() == r63aIncoming.Variables && ServerConfiguration.RequireMachineID)
                    {
                        session.RemoveDataHandler(this.Identifier());
                        session.Revision = Revision.RELEASE63_35255_34886_201108111108;
                    }
                    else if (this.State == 1 && message.GetID() == r63aIncoming.SSOTicket && !ServerConfiguration.RequireMachineID)
                    {
                        session.RemoveDataHandler(this.Identifier());
                        session.Revision = Revision.RELEASE63_35255_34886_201108111108;
                    }
                    else
                    {
                        session.Stop("Old crypto, unable to find revision #1");
                    }
                }
                else
                {
                    message = this.TryParseAsNewCrypto(packet);
                    if (message is NewCryptoClientMessage)
                    {
                        if (message.GetID() == r63bIncoming.VersionCheck)
                        {
                            session.RemoveDataHandler(this.Identifier());

                            string version = message.PopFixedString();
                            if (version == "RELEASE63-201211141113-913728051")
                            {
                                session.Revision = Revision.RELEASE63_201211141113_913728051;
                            }
                            else if (version == "PRODUCTION-201601012205-226667486")
                            {
                                session.Revision = Revision.PRODUCTION_201601012205_226667486;
                            }
                            else if (version == "PRODUCTION-201611291003-338511768")
                            {
                                session.Revision = Revision.PRODUCTION_201611291003_338511768;
                            }
                            else
                            {
                                session.Stop("New crypto, revision not supported");
                            }
                        }
                        else
                        {
                            session.Stop("New crypto, unable to find revision");
                        }
                    }
                    else
                    {
                        if (Skylight.ExternalFlashPolicyFileRequestPortEnabled) //If the emulator just booted the policy file may have fallen here, lets just send it
                        {
                            if (packet[0] == 60)
                            {
                                string data = Encoding.ASCII.GetString(packet); //decode and figure it out
                                if (data == "<policy-file-request/>\0")         //yes! it is privacy policy request, send response
                                {
                                    session.SendData(DetectRevisionHandler.XmlPolicy);
                                    if (!MonoUtils.IsMonoRunning)
                                    {
                                        session.Stop("Policy privacy file request response");
                                    }
                                    else
                                    {
                                        session.ClosePending = true;
                                    }
                                }
                            }
                        }

                        session.Stop("Unable to revision");
                    }
                }

                return(false);
            }
            finally
            {
                if (!session.Disconnected && session.GetDataHandler(DetectRevisionHandler.Identifier_) == null)
                {
                    session.EnableDecodeHandlers();
                    session.HandleData(packet);
                }
            }
        }
예제 #25
0
        private void LetUserIn()
        {
            //if (this.Revision == Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
            //{
            //    ServerMessage weirdKeys = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
            //    weirdKeys.Init(r26Outgoing.SomeKeysMaybe);
            //    weirdKeys.AppendString("QBHIIIKHJIPAIQAdd-MM-yyyy");
            //    weirdKeys.AppendString("SAHPB/client");
            //    weirdKeys.AppendString("QBH");
            //    this.SendMessage(weirdKeys);
            //}

            //send effects

            if (this.Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.AvaiblityStatus).Handle());
            }
            this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.AuthOk).Handle());
            this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.Fuserights).Handle(new ValueHolder().AddValue("Session", this)));
            this.SendMessage(new NewbieIdentityComposerHandler(false)); //Removes all the anonying shit

            if (this.GetHabbo().HasPermission("acc_supporttool"))
            {
                this.SendMessage(Skylight.GetGame().GetModerationToolManager().SerializeModTool(this));
            }

            if (this.Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.ShowNotifications).Handle());
            }

            if (this.Habbo.NewbieStatus == 0)
            {
                Room newbieRoom = Skylight.GetGame().GetRoomManager().NewbieRooms.Count > 0 ? Skylight.GetGame().GetRoomManager().CreateNewbieRoom(this, Skylight.GetGame().GetRoomManager().NewbieRooms.Keys.ElementAt(RandomUtilies.GetRandom(0, Skylight.GetGame().GetRoomManager().NewbieRooms.Count - 1))) : null;
                if (newbieRoom != null)
                {
                    using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                    {
                        dbClient.AddParamWithValue("userId", this.Habbo.ID);
                        dbClient.AddParamWithValue("roomId", newbieRoom.ID);
                        dbClient.ExecuteQuery("UPDATE users SET newbie_status = '1', " + (this.Habbo.HomeRoom == 0 ? "home_room = @roomId, " : "") + "newbie_room = @roomId WHERE id = @userId LIMIT 1");
                    }

                    this.Habbo.NewbieStatus = 1;
                    if (this.Habbo.HomeRoom == 0)
                    {
                        this.Habbo.HomeRoom = newbieRoom.ID;
                    }
                    this.Habbo.NewbieRoom = newbieRoom.ID;
                }
                else
                {
                    //no welcome room, no shit :(
                    using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                    {
                        dbClient.AddParamWithValue("userId", this.Habbo.ID);
                        dbClient.ExecuteQuery("UPDATE users SET newbie_status = '2' WHERE id = @userId LIMIT 1");
                    }

                    this.Habbo.NewbieStatus = 2;
                }
            }

            if (this.Revision >= Revision.RELEASE63_201211141113_913728051)
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.HomeRoom).Handle(new ValueHolder().AddValue("HomeRoom", this.Habbo.HomeRoom).AddValue("ForwardID", this.Habbo.NewbieStatus == 1 ? this.Habbo.NewbieRoom : this.Habbo.HomeRoom)));
            }
            else
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.HomeRoom).Handle(new ValueHolder().AddValue("HomeRoom", this.Habbo.NewbieStatus == 1 ? this.Habbo.NewbieRoom : this.Habbo.HomeRoom)));
            }

            if (this.Revision > Revision.R26_20080915_0408_7984_61ccb5f8b8797a3aba62c1fa2ca80169)
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.FavouriteRooms).Handle(new ValueHolder().AddValue("Max", 50).AddValue("FavouriteRooms", this.Habbo.FavouriteRooms)));
            }

            if (this.GetHabbo().CanReceiveActivityBonus())
            {
                this.GetHabbo().ReceiveActivityBonus();
            }

            if (!string.IsNullOrEmpty(ServerConfiguration.MOTD))
            {
                this.SendNotif(ServerConfiguration.MOTD, 2);
            }

            foreach (KeyValuePair <int, string> data in Skylight.GetGame().GetPermissionManager().GetBadges())
            {
                if (!string.IsNullOrEmpty(data.Value))
                {
                    if (this.GetHabbo().Rank >= data.Key)
                    {
                        this.GetHabbo().GetBadgeManager().AddBadge(data.Value, 0, true);
                    }
                    else
                    {
                        this.GetHabbo().GetBadgeManager().RemoveBadge(data.Value);
                    }
                }
            }

            this.GetHabbo().CheckDailyStuff(false); //daily respect, regular visitor
            this.GetHabbo().CheckHappyHour();       //happy hour achievement
            this.GetHabbo().GetUserAchievements().CheckAchievement("RegistrationDuration");
            this.GetHabbo().GetUserAchievements().CheckAchievement("OnlineTime");
            this.GetHabbo().GetUserAchievements().CheckAchievement("HCMember");
            this.GetHabbo().GetUserAchievements().CheckAchievement("VIPMember");
            this.GetHabbo().GetUserAchievements().CheckAchievement("Tags");
            this.GetHabbo().GetUserAchievements().CheckAchievement("GuideEnrollmentLifetime");
            this.GetHabbo().GetUserAchievements().CheckAchievement("GuideOnDutyPresence");
            if (this.GetHabbo().MailConfirmed)
            {
                Skylight.GetGame().GetAchievementManager().AddAchievement(this, "EmailVerification", 1);
            }

            foreach (uint roomId in this.GetHabbo().UserRooms)
            {
                Room room = Skylight.GetGame().GetRoomManager().TryGetRoom(roomId);
                if (room != null)
                {
                    room.EquestrianTrackHost(0);
                    room.FootballGoalHost(0);
                    room.RoomHost(0);
                }
            }

            if (this.Revision >= Revision.RELEASE63_201211141113_913728051)
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.UserPerks).Handle(new ValueHolder("Session", this)));
            }

            if (this.Revision >= Revision.PRODUCTION_201601012205_226667486)
            {
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NewNavigatorMetaData).Handle());
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NewNavigatorLiftedRooms).Handle());
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NewNavigatorSavedSearches).Handle());
                this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NewNavigatorEventCategories).Handle());
            }
        }
예제 #26
0
 public void SendNotifWithLink(string message, string link)
 {
     this.SendMessage(BasicUtilies.GetRevisionPacketManager(this.Revision).GetOutgoing(OutgoingPacketsEnum.NotifFromMod).Handle(new ValueHolder("Message", message, "Link", link)));
 }
예제 #27
0
        public void AddItem(GameClient session, Item item, int amount, string extraData, bool newFurni, bool queueBytes = false)
        {
            if (queueBytes)
            {
                session.GetHabbo().GetInventoryManager().SetQueueBytes(true);
            }

            List <uint> newFloorItems = new List <uint>();
            List <uint> newWallItems  = new List <uint>();
            List <uint> newPets       = new List <uint>();

            switch (item.Type)
            {
            case "i":     //wall item
            {
                switch (item.InteractionType.ToLower())
                {
                case "dimmer":
                default:
                {
                    foreach (uint itemId_ in DatabaseUtils.CreateItems(session.GetHabbo().ID, item, extraData, amount))
                    {
                        newWallItems.Add(itemId_);
                        session.GetHabbo().GetInventoryManager().AddInventoryItemToHand(new InventoryItem(itemId_, item.ID, extraData));
                    }
                }
                break;
                }
            }
            break;

            case "s":     //floor item
            {
                switch (item.InteractionType.ToLower())
                {
                case "pet":
                {
                    string[] data      = extraData.Split('\n');
                    string   petName   = data[0];
                    string   petRace   = data[1];
                    string   petColor  = data[2];
                    double   timestamp = TimeUtilies.GetUnixTimestamp();
                    foreach (uint petId in DatabaseUtils.CreatePets(session.GetHabbo().ID, petName, petRace, petColor, int.Parse(item.ItemName.Split('t')[1]), timestamp, amount))
                    {
                        newPets.Add(petId);

                        Pet pet = new Pet(petId, session.GetHabbo().ID, int.Parse(item.ItemName.Split('t')[1]), petName, petRace, petColor, 0, 120, 100, 0, timestamp);
                        session.GetHabbo().GetInventoryManager().AddPet(pet);
                        session.GetHabbo().Pets.Add(petId, pet);
                    }
                }
                break;

                case "teleport":
                default:
                {
                    foreach (uint itemId_ in DatabaseUtils.CreateItems(session.GetHabbo().ID, item, extraData, amount))
                    {
                        newFloorItems.Add(itemId_);
                        session.GetHabbo().GetInventoryManager().AddInventoryItemToHand(new InventoryItem(itemId_, item.ID, extraData));
                    }
                }
                break;
                }
            }
            break;

            case "h":
            {
                double hcLenghtInSecounds = (2678400.0 * amount);

                string clubType = "habbo_club";
                if (item.ItemName.StartsWith("DEAL_VIP"))         //bought vip days
                {
                    clubType = "habbo_vip";

                    if (!session.GetHabbo().IsVIP() && session.GetHabbo().IsHC())         //is upgrade
                    {
                        hcLenghtInSecounds += session.GetHabbo().GetSubscriptionManager().TryGetSubscription("habbo_club", false, true).SecoundsLeft() / 1.67;

                        session.GetHabbo().GetSubscriptionManager().EndSubscription("habbo_club");         //R.I.P. HC
                    }

                    Skylight.GetGame().GetAchievementManager().AddAchievement(session, "HCMember", 1);
                    Skylight.GetGame().GetAchievementManager().AddAchievement(session, "VIPMember", 1);

                    session.GetHabbo().GetUserAchievements().CheckAchievement("HCMember");
                    session.GetHabbo().GetUserAchievements().CheckAchievement("VIPMember");
                }
                else                                                              //bought hc days
                {
                    if (session.GetHabbo().IsVIP() && !session.GetHabbo().IsHC()) //is downgrade
                    {
                        hcLenghtInSecounds += session.GetHabbo().GetSubscriptionManager().TryGetSubscription("habbo_vip", false, true).SecoundsLeft() * 1.67;

                        session.GetHabbo().GetSubscriptionManager().EndSubscription("habbo_vip");         //R.I.P. VIP
                    }

                    Skylight.GetGame().GetAchievementManager().AddAchievement(session, "HCMember", 1);

                    session.GetHabbo().GetUserAchievements().CheckAchievement("HCMember");
                }

                session.GetHabbo().GetSubscriptionManager().AddSubscription(clubType, hcLenghtInSecounds);

                session.SendMessage(OutgoingPacketsEnum.ClubMembership, new ValueHolder("Session", session, "ClubType", clubType));
                session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.Fuserights).Handle(new ValueHolder().AddValue("Session", session)));
                break;
            }

            default:
            {
                session.SendNotif("Invalid item type... (" + item.Type + ") Please don't try buy this item again!");
                break;
            }
            }

            if (newPets.Count > 0)
            {
                session.GetHabbo().GetUserAchievements().CheckAchievement("PetOwner");
            }

            session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.NewItems).Handle(new ValueHolder("Floors", newFloorItems, "Walls", newWallItems, "Pets", newPets)));
            if (queueBytes)
            {
                session.GetHabbo().GetInventoryManager().SetQueueBytes(false);
            }
        }
예제 #28
0
        public void BuyItem(GameClient session, int pageId, uint itemId, string extraData, int amountMultiplayer, bool asGift, string receiverUsername = "", string giftMessage = "", int giftSpriteId = 0, int giftBoxId = 0, int giftRibbonId = 0)
        {
            CatalogPage page = this.GetCatalogPage(pageId);

            if (page != null && page.Visible & page.Enabled && page.MinRank <= session.GetHabbo().Rank)
            {
                CatalogItem item = page.GetItem(itemId);
                if (item != null)
                {
                    if (item.IsDeal)
                    {
                        if (amountMultiplayer > 1)
                        {
                            session.SendNotif("You can't buy multiple deals at once!");
                            return;
                        }
                    }

                    Tuple <Item, int>[] products = item.GetItems();
                    uint giftReceiverId          = 0;
                    if (asGift)
                    {
                        foreach (Tuple <Item, int> data in products)
                        {
                            if (!data.Item1.AllowGift)
                            {
                                return;
                            }
                        }

                        giftReceiverId = Skylight.GetGame().GetGameClientManager().GetIDByUsername(receiverUsername);
                        if (giftReceiverId == 0) //not valid user
                        {
                            ServerMessage receiverNotFound = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                            receiverNotFound.Init(r63aOutgoing.GiftReceiverNotFound);
                            session.SendMessage(receiverNotFound);
                            return;
                        }
                    }

                    if (amountMultiplayer > 1 && products[0].Item2 * amountMultiplayer > 100)
                    {
                        session.SendNotif("You can't buy more then 100 at once with the buy command");
                        return;
                    }

                    int finalCredits = item.CostCredits * amountMultiplayer;
                    int finalPixels  = item.CostActivityPoints * amountMultiplayer;

                    if (asGift && giftSpriteId > 0) //special gifts costs one credit more
                    {
                        finalCredits++;
                    }

                    bool noCredits        = false;
                    bool noActivityPoints = false;

                    if (session.GetHabbo().Credits < finalCredits)
                    {
                        noCredits = true;
                    }

                    if (session.GetHabbo().TryGetActivityPoints(item.ActivityPointsType) < finalPixels)
                    {
                        noActivityPoints = true;
                    }

                    if (noCredits || noActivityPoints)
                    {
                        ServerMessage noEnoughtCash = BasicUtilies.GetRevisionServerMessage(Revision.RELEASE63_35255_34886_201108111108);
                        noEnoughtCash.Init(r63aOutgoing.NoEnoughtCash);
                        noEnoughtCash.AppendBoolean(noCredits);
                        noEnoughtCash.AppendBoolean(noActivityPoints);
                        session.SendMessage(noEnoughtCash);
                    }
                    else
                    {
                        if (asGift)
                        {
                            foreach (Tuple <Item, int> data in products)
                            {
                                if (data.Item1.Type == "e")
                                {
                                    session.SendNotif("You can not send this item as a gift.");
                                    return;
                                }
                            }
                        }

                        if (!item.IsDeal)
                        {
                            switch (products[0].Item1.InteractionType.ToLower())
                            {
                            case "pet":
                            {
                                string[] data    = extraData.Split('\n');
                                string   petName = data[0];
                                int      petRace = int.Parse(data[1]);
                                string   color   = data[2];

                                Regex regex = new Regex(@"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase);
                                if (petName.Length >= 2 && petName.Length <= 16 && regex.IsMatch(petName) && !TextUtilies.HaveBlacklistedWords(petName))
                                {
                                    //buy
                                }
                                else
                                {
                                    return;
                                }

                                if (color.Length != 6)
                                {
                                    return;
                                }
                                break;
                            }

                            case "roomeffect":
                            {
                                extraData = TextUtilies.DoubleWithDotDecimal(double.Parse(extraData));
                            }
                            break;

                            case "postit":
                            {
                                extraData = "FFFF33";         //if you leave extra data empty same result, but for sure
                            }
                            break;

                            case "dimmer":
                            {
                                extraData = "1,1,1,#000000,255";         //current mode
                            }
                            break;

                            case "trophy":
                            {
                                extraData = session.GetHabbo().ID.ToString() + (char)9 + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + (char)9 + TextUtilies.FilterString(extraData, false, true);
                            }
                            break;

                            default:
                            {
                                extraData = "";
                                break;
                            }
                            }
                        }

                        if (finalCredits > 0)
                        {
                            session.GetHabbo().Credits -= finalCredits;
                            session.GetHabbo().UpdateCredits(true);
                        }

                        if (finalPixels > 0)
                        {
                            session.GetHabbo().RemoveActivityPoints(item.ActivityPointsType, finalPixels);
                            session.GetHabbo().UpdateActivityPoints(item.ActivityPointsType, true);
                        }

                        session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.BuyInfo).Handle(new ValueHolder("Item", item, "Products", products, "Credits", finalCredits, "Pixels", finalPixels)));

                        if (asGift)
                        {
                            Item gift = this.GetGiftLook(giftSpriteId);

                            using (DatabaseClient dbClient = Skylight.GetDatabaseManager().GetClient())
                            {
                                string giftData = TextUtilies.FilterString(giftMessage, false, true) + (char)9 + session.GetHabbo().ID + (char)9 + giftBoxId + (char)9 + giftRibbonId;
                                dbClient.AddParamWithValue("giftData", giftData);
                                dbClient.AddParamWithValue("receiverId", giftReceiverId);
                                dbClient.AddParamWithValue("giftBaseItem", gift.ID);
                                uint giftItemId = (uint)dbClient.ExecuteQuery("INSERT INTO items(user_id, base_item, extra_data) VALUES(@receiverId, @giftBaseItem, @giftData)");

                                string baseItems = "";
                                string amounts   = "";
                                foreach (Tuple <Item, int> data in products)
                                {
                                    if (baseItems.Length > 0)
                                    {
                                        baseItems += ",";
                                        amounts   += ",";
                                    }

                                    baseItems += data.Item1.ID;
                                    amounts   += data.Item2 * amountMultiplayer;
                                }

                                dbClient.AddParamWithValue("itemId", giftItemId);
                                dbClient.AddParamWithValue("baseItems", baseItems);
                                dbClient.AddParamWithValue("amounts", amounts);
                                dbClient.AddParamWithValue("extraData", extraData);
                                dbClient.ExecuteQuery("INSERT INTO items_presents(item_id, base_ids, amounts, extra_data) VALUES(@itemId, @baseItems, @amounts, @extraData)");

                                GameClient receiver = Skylight.GetGame().GetGameClientManager().GetGameClientById(giftReceiverId);
                                if (receiver != null)
                                {
                                    if (giftReceiverId != session.GetHabbo().ID) //do achievement progress
                                    {
                                        receiver.GetHabbo().GetUserStats().GiftsReceived++;
                                        receiver.GetHabbo().GetUserAchievements().CheckAchievement("GiftReceiver");
                                    }

                                    receiver.GetHabbo().GetInventoryManager().AddItem(giftItemId, gift.ID, giftData, false);                                                                                       //add it to inventory first

                                    session.SendMessage(BasicUtilies.GetRevisionPacketManager(session.Revision).GetOutgoing(OutgoingPacketsEnum.UnseenItem).Handle(new ValueHolder("Type", 1, "ID", giftItemId))); //receiver one item in this case the gift

                                    //receiver.GetHabbo().GetInventoryManager().UpdateInventoryItems(true); //update inv
                                }
                                else
                                {
                                    if (giftReceiverId != session.GetHabbo().ID) //do achievement progress
                                    {
                                        dbClient.ExecuteQuery("UPDATE user_stats SET gifts_received = gifts_received + 1 WHERE user_id = @receiverId LIMIT 1");
                                    }
                                }
                            }

                            if (giftReceiverId != session.GetHabbo().ID) //do achievement progress
                            {
                                session.GetHabbo().GetUserStats().GiftsGived++;
                                session.GetHabbo().GetUserAchievements().CheckAchievement("GiftGiver");
                            }
                        }
                        else
                        {
                            session.GetHabbo().GetInventoryManager().SetQueueBytes(true);
                            foreach (Tuple <Item, int> data in products)
                            {
                                this.AddItem(session, data.Item1, data.Item2 * amountMultiplayer, extraData, true, false);
                            }
                            session.GetHabbo().GetInventoryManager().SetQueueBytes(false);
                        }
                    }
                }
            }
        }
예제 #29
0
 public ServerMessage BadgePointLimits(Revision revision)
 {
     return(BasicUtilies.GetRevisionPacketManager(revision).GetOutgoing(OutgoingPacketsEnum.BadgePointLimits).Handle(new ValueHolder().AddValue("Achievements", this.Achievements.Values.ToList())));
 }
예제 #30
0
 public PacketManager GetPacketManager()
 {
     return(BasicUtilies.GetRevisionPacketManager(this.Revision));
 }