From b4fc005c1885f542e46f45987a972ebfe5fcfcca Mon Sep 17 00:00:00 2001 From: capheus <20739601+capheus@users.noreply.github.com> Date: Fri, 6 Jul 2018 13:30:00 +0000 Subject: [PATCH] Arcturus 1.9.0 Sourcecode. --- .gitignore | 14 + README.md | 45 + examples/RCON.php | 39 + pom.xml | 166 + sql-updates.sql | 4 + sqlupdates/1_0.10_TO_1_1.sql | 27 + sqlupdates/1_0_0_TO_1_0_1.sql | 79 + sqlupdates/1_0_1_TO_1_0_2.sql | 22 + sqlupdates/1_0_2_TO_1_0_3.sql | 9 + sqlupdates/1_0_3_TO_1_0_4.sql | 12 + sqlupdates/1_0_4_TO_1_0_5.sql | 54 + sqlupdates/1_0_5_TO_1_0_6.sql | 12 + sqlupdates/1_0_6_TO_1_0_7.sql | 6 + sqlupdates/1_0_7_TO_1_0_8.sql | 176 + sqlupdates/1_0_8_TO_1_0_9.sql | 134 + sqlupdates/1_0_9_TO_1_0_10.sql | 92 + sqlupdates/1_1_0_TO_1_2_0.sql | 21 + sqlupdates/1_2_0_TO_1_3_0.sql | 58 + sqlupdates/1_3_0_TO_1_4_0.sql | 191 + sqlupdates/1_4_0_TO_1_5_0.sql | 107 + sqlupdates/1_5_0_TO_1_6_0.sql | 26 + sqlupdates/1_6_0_TO_1_7_0.sql | 22 + sqlupdates/1_7_0_TO_1_8_0.sql | 100 + sqlupdates/1_8_0_TO_1_9_0.sql | 139 + sqlupdates/1_9_0_TO_1_10_0.sql | 63 + src/main/java/com/eu/habbo/Emulator.java | 499 ++ .../java/com/eu/habbo/core/CleanerThread.java | 225 + .../java/com/eu/habbo/core/CommandLog.java | 38 + .../eu/habbo/core/ConfigurationManager.java | 282 + .../com/eu/habbo/core/CreditsScheduler.java | 81 + .../java/com/eu/habbo/core/Disposable.java | 7 + src/main/java/com/eu/habbo/core/Easter.java | 27 + src/main/java/com/eu/habbo/core/ErrorLog.java | 56 + src/main/java/com/eu/habbo/core/Loggable.java | 9 + src/main/java/com/eu/habbo/core/Logging.java | 444 ++ .../com/eu/habbo/core/PixelScheduler.java | 111 + .../com/eu/habbo/core/PointsScheduler.java | 111 + .../eu/habbo/core/RoomUserPetComposer.java | 52 + .../java/com/eu/habbo/core/Scheduler.java | 43 + .../java/com/eu/habbo/core/TextsManager.java | 172 + .../core/consolecommands/ConsoleCommand.java | 110 + .../consolecommands/ConsoleInfoCommand.java | 37 + .../ConsoleReconnectCameraCommand.java | 18 + .../ConsoleShutdownCommand.java | 17 + .../consolecommands/ConsoleTestCommand.java | 19 + .../java/com/eu/habbo/database/Database.java | 80 + .../com/eu/habbo/database/DatabasePool.java | 61 + .../eu/habbo/habbohotel/GameEnvironment.java | 193 + .../habbohotel/achievements/Achievement.java | 108 + .../achievements/AchievementCategories.java | 64 + .../achievements/AchievementLevel.java | 41 + .../achievements/AchievementManager.java | 478 ++ .../achievements/TalentTrackLevel.java | 92 + .../achievements/TalentTrackType.java | 14 + .../com/eu/habbo/habbohotel/bots/Bot.java | 713 +++ .../eu/habbo/habbohotel/bots/BotManager.java | 320 ++ .../eu/habbo/habbohotel/bots/ButlerBot.java | 118 + .../eu/habbo/habbohotel/bots/VisitorBot.java | 84 + .../catalog/CalendarRewardObject.java | 99 + .../catalog/CatalogFeaturedPage.java | 61 + .../habbo/habbohotel/catalog/CatalogItem.java | 547 ++ .../catalog/CatalogLimitedConfiguration.java | 113 + .../habbohotel/catalog/CatalogManager.java | 1414 +++++ .../habbo/habbohotel/catalog/CatalogPage.java | 237 + .../catalog/CatalogPageLayouts.java | 187 + .../habbohotel/catalog/CatalogPageType.java | 14 + .../habbo/habbohotel/catalog/ClothItem.java | 35 + .../habbo/habbohotel/catalog/ClubOffer.java | 99 + .../habbo/habbohotel/catalog/TargetOffer.java | 71 + .../eu/habbo/habbohotel/catalog/Voucher.java | 52 + .../catalog/layouts/BadgeDisplayLayout.java | 31 + .../catalog/layouts/BotsLayout.java | 31 + .../layouts/BuildersClubAddonsLayout.java | 32 + .../layouts/BuildersClubFrontPageLayout.java | 32 + .../layouts/BuildersClubLoyaltyLayout.java | 32 + .../catalog/layouts/CatalogRootLayout.java | 32 + .../catalog/layouts/ClubBuyLayout.java | 25 + .../catalog/layouts/ClubGiftsLayout.java | 25 + .../catalog/layouts/ColorGroupingLayout.java | 28 + .../catalog/layouts/Default_3x3Layout.java | 29 + .../layouts/FrontPageFeaturedLayout.java | 82 + .../catalog/layouts/FrontpageLayout.java | 27 + .../catalog/layouts/GuildForumLayout.java | 28 + .../catalog/layouts/GuildFrontpageLayout.java | 28 + .../catalog/layouts/GuildFurnitureLayout.java | 28 + .../catalog/layouts/InfoDucketsLayout.java | 26 + .../catalog/layouts/InfoLoyaltyLayout.java | 26 + .../catalog/layouts/InfoPetsLayout.java | 29 + .../catalog/layouts/InfoRentablesLayout.java | 29 + .../catalog/layouts/LoyaltyVipBuyLayout.java | 29 + .../catalog/layouts/MarketplaceLayout.java | 23 + .../catalog/layouts/MarketplaceOwnItems.java | 24 + .../layouts/PetCustomizationLayout.java | 29 + .../catalog/layouts/Pets2Layout.java | 29 + .../catalog/layouts/Pets3Layout.java | 29 + .../catalog/layouts/PetsLayout.java | 29 + .../catalog/layouts/ProductPage1Layout.java | 29 + .../layouts/RecentPurchasesLayout.java | 28 + .../catalog/layouts/RecyclerInfoLayout.java | 29 + .../catalog/layouts/RecyclerLayout.java | 28 + .../catalog/layouts/RecyclerPrizesLayout.java | 29 + .../catalog/layouts/RoomAdsLayout.java | 27 + .../catalog/layouts/RoomBundleLayout.java | 288 + .../catalog/layouts/SingleBundle.java | 30 + .../catalog/layouts/SoldLTDItemsLayout.java | 26 + .../catalog/layouts/SpacesLayout.java | 29 + .../catalog/layouts/TraxLayout.java | 27 + .../catalog/layouts/TrophiesLayout.java | 29 + .../catalog/layouts/VipBuyLayout.java | 29 + .../catalog/marketplace/MarketPlace.java | 595 ++ .../catalog/marketplace/MarketPlaceOffer.java | 201 + .../catalog/marketplace/MarketPlaceState.java | 50 + .../habbohotel/commands/AboutCommand.java | 58 + .../habbohotel/commands/AlertCommand.java | 50 + .../commands/AllowTradingCommand.java | 69 + .../habbohotel/commands/ArcturusCommand.java | 30 + .../habbohotel/commands/BadgeCommand.java | 112 + .../habbo/habbohotel/commands/BanCommand.java | 106 + .../commands/BlockAlertCommand.java | 29 + .../habbohotel/commands/BotsCommand.java | 36 + .../commands/ChangeNameCommand.java | 21 + .../habbohotel/commands/ChatTypeCommand.java | 69 + .../eu/habbo/habbohotel/commands/Command.java | 35 + .../habbohotel/commands/CommandHandler.java | 357 ++ .../habbohotel/commands/CommandsCommand.java | 33 + .../commands/ConnectCameraCommand.java | 25 + .../habbohotel/commands/ControlCommand.java | 66 + .../habbohotel/commands/CoordsCommand.java | 54 + .../habbohotel/commands/CreditsCommand.java | 74 + .../habbohotel/commands/DiagonalCommand.java | 40 + .../commands/DisconnectCommand.java | 51 + .../habbohotel/commands/EjectAllCommand.java | 29 + .../commands/EmptyBotsInventoryCommand.java | 73 + .../commands/EmptyInventoryCommand.java | 69 + .../commands/EmptyPetsInventoryCommand.java | 72 + .../habbohotel/commands/EnableCommand.java | 67 + .../habbohotel/commands/EventCommand.java | 61 + .../habbohotel/commands/FacelessCommand.java | 57 + .../habbohotel/commands/FastwalkCommand.java | 37 + .../commands/FreezeBotsCommand.java | 36 + .../habbohotel/commands/FreezeCommand.java | 53 + .../habbohotel/commands/GiftCommand.java | 105 + .../habbohotel/commands/GiveRankCommand.java | 87 + .../habbohotel/commands/HabnamCommand.java | 26 + .../habbohotel/commands/HandItemCommand.java | 34 + .../habbohotel/commands/HappyHourCommand.java | 31 + .../commands/HotelAlertCommand.java | 47 + .../commands/HotelAlertLinkCommand.java | 35 + .../habbohotel/commands/IPBanCommand.java | 90 + .../habbo/habbohotel/commands/LayCommand.java | 43 + .../commands/MachineBanCommand.java | 86 + .../habbohotel/commands/MassBadgeCommand.java | 68 + .../commands/MassCreditsCommand.java | 56 + .../habbohotel/commands/MassGiftCommand.java | 105 + .../commands/MassPixelsCommand.java | 55 + .../commands/MassPointsCommand.java | 96 + .../habbohotel/commands/MimicCommand.java | 59 + .../habbohotel/commands/MoonwalkCommand.java | 35 + .../habbohotel/commands/MultiCommand.java | 20 + .../habbohotel/commands/MuteBotsCommand.java | 23 + .../habbohotel/commands/MuteCommand.java | 72 + .../habbohotel/commands/MutePetsCommand.java | 23 + .../habbohotel/commands/PetInfoCommand.java | 69 + .../habbohotel/commands/PickallCommand.java | 32 + .../habbohotel/commands/PixelCommand.java | 61 + .../habbohotel/commands/PluginsCommand.java | 29 + .../habbohotel/commands/PointsCommand.java | 80 + .../habbohotel/commands/PullCommand.java | 68 + .../habbohotel/commands/PushCommand.java | 70 + .../habbohotel/commands/RedeemCommand.java | 124 + .../commands/ReloadRoomCommand.java | 46 + .../habbohotel/commands/RoomAlertCommand.java | 47 + .../commands/RoomBundleCommand.java | 90 + .../commands/RoomCreditsCommand.java | 50 + .../habbohotel/commands/RoomDanceCommand.java | 59 + .../commands/RoomEffectCommand.java | 57 + .../habbohotel/commands/RoomGiftCommand.java | 87 + .../habbohotel/commands/RoomItemCommand.java | 64 + .../habbohotel/commands/RoomKickCommand.java | 44 + .../habbohotel/commands/RoomMuteCommand.java | 30 + .../commands/RoomPixelsCommand.java | 50 + .../commands/RoomPointsCommand.java | 88 + .../habbohotel/commands/SayAllCommand.java | 47 + .../habbo/habbohotel/commands/SayCommand.java | 56 + .../habbohotel/commands/SetMaxCommand.java | 49 + .../habbohotel/commands/SetPollCommand.java | 58 + .../habbohotel/commands/SetSpeedCommand.java | 53 + .../habbohotel/commands/ShoutAllCommand.java | 47 + .../habbohotel/commands/ShoutCommand.java | 58 + .../habbohotel/commands/ShutdownCommand.java | 62 + .../habbo/habbohotel/commands/SitCommand.java | 19 + .../habbohotel/commands/SitDownCommand.java | 36 + .../commands/StaffAlertCommand.java | 41 + .../commands/StaffOnlineCommand.java | 88 + .../habbohotel/commands/StalkCommand.java | 65 + .../habbohotel/commands/SummonCommand.java | 76 + .../commands/SummonRankCommand.java | 56 + .../habbohotel/commands/SuperPullCommand.java | 57 + .../habbohotel/commands/SuperbanCommand.java | 76 + .../habbohotel/commands/TakeBadgeCommand.java | 61 + .../habbohotel/commands/TeleportCommand.java | 32 + .../habbohotel/commands/TestCommand.java | 622 ++ .../habbohotel/commands/TransformCommand.java | 85 + .../habbohotel/commands/TrashCommand.java | 23 + .../habbohotel/commands/UnbanCommand.java | 39 + .../commands/UnloadRoomCommand.java | 26 + .../habbohotel/commands/UnmuteCommand.java | 64 + .../commands/UpdateBotsCommand.java | 18 + .../commands/UpdateCatalogCommand.java | 31 + .../commands/UpdateConfigCommand.java | 25 + .../commands/UpdateGuildPartsCommand.java | 21 + .../commands/UpdateHotelViewCommand.java | 23 + .../commands/UpdateItemsCommand.java | 40 + .../commands/UpdateNavigatorCommand.java | 26 + .../commands/UpdatePermissionsCommand.java | 25 + .../commands/UpdatePetDataCommand.java | 25 + .../commands/UpdatePluginsCommand.java | 24 + .../commands/UpdatePollsCommand.java | 23 + .../commands/UpdateTextsCommand.java | 32 + .../commands/UpdateWordFilterCommand.java | 25 + .../habbohotel/commands/UserInfoCommand.java | 136 + .../habbohotel/commands/WordQuizCommand.java | 46 + .../habbohotel/crafting/CraftingAltar.java | 194 + .../habbohotel/crafting/CraftingManager.java | 171 + .../habbohotel/crafting/CraftingRecipe.java | 105 + .../habbohotel/gameclients/GameClient.java | 179 + .../gameclients/GameClientManager.java | 209 + .../com/eu/habbo/habbohotel/games/Game.java | 324 ++ .../eu/habbo/habbohotel/games/GamePlayer.java | 83 + .../eu/habbo/habbohotel/games/GameTeam.java | 158 + .../habbohotel/games/GameTeamColors.java | 63 + .../games/battlebanzai/BattleBanzaiGame.java | 408 ++ .../battlebanzai/BattleBanzaiGamePlayer.java | 13 + .../battlebanzai/BattleBanzaiGameTeam.java | 38 + .../games/football/FootballGame.java | 64 + .../habbohotel/games/freeze/FreezeGame.java | 458 ++ .../games/freeze/FreezeGamePlayer.java | 267 + .../games/freeze/FreezeGameTeam.java | 37 + .../habbohotel/games/tag/BunnyrunGame.java | 44 + .../habbohotel/games/tag/IceTagGame.java | 203 + .../habbohotel/games/tag/RollerskateGame.java | 43 + .../habbo/habbohotel/games/tag/TagGame.java | 237 + .../habbohotel/games/tag/TagGamePlayer.java | 19 + .../habbohotel/games/wired/WiredGame.java | 77 + .../habbohotel/guides/GuardianTicket.java | 338 ++ .../habbo/habbohotel/guides/GuardianVote.java | 41 + .../habbohotel/guides/GuardianVoteType.java | 25 + .../habbohotel/guides/GuideChatMessage.java | 15 + .../habbo/habbohotel/guides/GuideManager.java | 567 ++ .../guides/GuideRecommendStatus.java | 8 + .../eu/habbo/habbohotel/guides/GuideTour.java | 118 + .../com/eu/habbo/habbohotel/guilds/Guild.java | 331 ++ .../habbo/habbohotel/guilds/GuildManager.java | 782 +++ .../habbo/habbohotel/guilds/GuildMember.java | 77 + .../eu/habbo/habbohotel/guilds/GuildPart.java | 29 + .../habbohotel/guilds/GuildPartType.java | 21 + .../eu/habbo/habbohotel/guilds/GuildRank.java | 29 + .../habbo/habbohotel/guilds/GuildState.java | 27 + .../habbohotel/guilds/SettingsState.java | 39 + .../habbohotel/guilds/forums/GuildForum.java | 199 + .../guilds/forums/GuildForumComment.java | 183 + .../guilds/forums/GuildForumManager.java | 85 + .../guilds/forums/GuildForumState.java | 33 + .../guilds/forums/GuildForumThread.java | 313 + .../helper/TalentTrackTalentState.java | 20 + .../habbohotel/hotelview/HallOfFame.java | 65 + .../hotelview/HallOfFameWinner.java | 73 + .../hotelview/HotelViewManager.java | 33 + .../habbo/habbohotel/hotelview/NewsList.java | 48 + .../habbohotel/hotelview/NewsWidget.java | 109 + .../habbohotel/items/CrackableReward.java | 74 + .../habbo/habbohotel/items/FurnitureType.java | 43 + .../eu/habbo/habbohotel/items/ICycleable.java | 8 + .../habbohotel/items/IEventTriggers.java | 14 + .../com/eu/habbo/habbohotel/items/Item.java | 233 + .../habbohotel/items/ItemInteraction.java | 40 + .../habbo/habbohotel/items/ItemManager.java | 947 +++ .../habbo/habbohotel/items/NewUserGift.java | 99 + .../habbo/habbohotel/items/PostItColor.java | 47 + .../eu/habbo/habbohotel/items/SoundTrack.java | 54 + .../habbohotel/items/YoutubeManager.java | 126 + .../InteractionBackgroundToner.java | 109 + .../interactions/InteractionBadgeDisplay.java | 83 + .../interactions/InteractionBlackHole.java | 19 + .../items/interactions/InteractionCannon.java | 98 + .../interactions/InteractionClothing.java | 51 + .../interactions/InteractionColorPlate.java | 72 + .../interactions/InteractionColorWheel.java | 90 + .../InteractionCostumeHopper.java | 35 + .../interactions/InteractionCrackable.java | 135 + .../interactions/InteractionCustomValues.java | 95 + .../interactions/InteractionDefault.java | 169 + .../items/interactions/InteractionDice.java | 100 + .../interactions/InteractionEffectTile.java | 26 + .../interactions/InteractionEffectToggle.java | 46 + .../InteractionExternalImage.java | 58 + .../items/interactions/InteractionFXBox.java | 65 + .../interactions/InteractionFireworks.java | 69 + .../items/interactions/InteractionGate.java | 87 + .../items/interactions/InteractionGift.java | 159 + .../interactions/InteractionGuildFurni.java | 127 + .../interactions/InteractionGuildGate.java | 69 + .../InteractionHabboClubGate.java | 88 + .../InteractionHabboClubHopper.java | 35 + .../InteractionHabboClubTeleportTile.java | 36 + .../items/interactions/InteractionHopper.java | 122 + .../InteractionInformationTerminal.java | 32 + .../interactions/InteractionJukeBox.java | 94 + .../interactions/InteractionLoveLock.java | 140 + .../interactions/InteractionMannequin.java | 118 + .../InteractionMonsterPlantSeed.java | 58 + .../interactions/InteractionMoodLight.java | 70 + .../interactions/InteractionMultiHeight.java | 187 + .../interactions/InteractionMusicDisc.java | 99 + .../interactions/InteractionMuteArea.java | 46 + .../items/interactions/InteractionNest.java | 98 + .../interactions/InteractionObstacle.java | 181 + .../interactions/InteractionOneWayGate.java | 145 + .../InteractionPetBreedingNest.java | 109 + .../interactions/InteractionPetDrink.java | 106 + .../interactions/InteractionPetFood.java | 105 + .../items/interactions/InteractionPetToy.java | 114 + .../items/interactions/InteractionPostIt.java | 50 + .../items/interactions/InteractionPoster.java | 50 + .../InteractionPressurePlate.java | 79 + .../interactions/InteractionPushable.java | 298 + .../interactions/InteractionPuzzleBox.java | 100 + .../interactions/InteractionPyramid.java | 57 + .../InteractionRentableSpace.java | 314 + .../items/interactions/InteractionRoller.java | 69 + .../interactions/InteractionRoomAds.java | 43 + .../interactions/InteractionRoomOMatic.java | 31 + .../interactions/InteractionStackHelper.java | 50 + .../interactions/InteractionStickyPole.java | 19 + .../items/interactions/InteractionSwitch.java | 34 + .../InteractionTalkingFurniture.java | 19 + .../interactions/InteractionTeleport.java | 218 + .../interactions/InteractionTeleportTile.java | 34 + .../InteractionTileEffectProvider.java | 71 + .../items/interactions/InteractionTrophy.java | 68 + .../InteractionVendingMachine.java | 135 + .../interactions/InteractionVikingCotie.java | 60 + .../items/interactions/InteractionWater.java | 160 + .../interactions/InteractionWaterItem.java | 82 + .../items/interactions/InteractionWired.java | 104 + .../InteractionWiredCondition.java | 73 + .../interactions/InteractionWiredEffect.java | 128 + .../interactions/InteractionWiredExtra.java | 46 + .../InteractionWiredHighscore.java | 202 + .../interactions/InteractionWiredTrigger.java | 90 + .../interactions/InteractionYoutubeTV.java | 56 + .../games/InteractionGameGate.java | 44 + .../games/InteractionGameScoreboard.java | 37 + .../games/InteractionGameTeamItem.java | 27 + .../games/InteractionGameTimer.java | 210 + .../InteractionBattleBanzaiSphere.java | 49 + .../InteractionBattleBanzaiTeleporter.java | 89 + .../InteractionBattleBanzaiTile.java | 121 + .../InteractionBattleBanzaiTimer.java | 48 + .../gates/InteractionBattleBanzaiGate.java | 85 + .../InteractionBattleBanzaiGateBlue.java | 22 + .../InteractionBattleBanzaiGateGreen.java | 22 + .../gates/InteractionBattleBanzaiGateRed.java | 22 + .../InteractionBattleBanzaiGateYellow.java | 22 + .../InteractionBattleBanzaiScoreboard.java | 41 + ...InteractionBattleBanzaiScoreboardBlue.java | 22 + ...nteractionBattleBanzaiScoreboardGreen.java | 22 + .../InteractionBattleBanzaiScoreboardRed.java | 22 + ...teractionBattleBanzaiScoreboardYellow.java | 22 + .../games/football/InteractionFootball.java | 251 + .../football/InteractionFootballGate.java | 173 + .../goals/InteractionFootballGoal.java | 51 + .../goals/InteractionFootballGoalBlue.java | 20 + .../goals/InteractionFootballGoalGreen.java | 20 + .../goals/InteractionFootballGoalRed.java | 20 + .../goals/InteractionFootballGoalYellow.java | 20 + .../InteractionFootballScoreboard.java | 170 + .../InteractionFootballScoreboardBlue.java | 20 + .../InteractionFootballScoreboardGreen.java | 20 + .../InteractionFootballScoreboardRed.java | 20 + .../InteractionFootballScoreboardYellow.java | 20 + .../games/freeze/InteractionFreezeBlock.java | 131 + .../freeze/InteractionFreezeExitTile.java | 56 + .../games/freeze/InteractionFreezeTile.java | 73 + .../games/freeze/InteractionFreezeTimer.java | 59 + .../freeze/gates/InteractionFreezeGate.java | 87 + .../gates/InteractionFreezeGateBlue.java | 22 + .../gates/InteractionFreezeGateGreen.java | 22 + .../gates/InteractionFreezeGateRed.java | 22 + .../gates/InteractionFreezeGateYellow.java | 22 + .../InteractionFreezeScoreboard.java | 41 + .../InteractionFreezeScoreboardBlue.java | 22 + .../InteractionFreezeScoreboardGreen.java | 22 + .../InteractionFreezeScoreboardRed.java | 22 + .../InteractionFreezeScoreboardYellow.java | 22 + .../games/tag/InteractionTagField.java | 95 + .../games/tag/InteractionTagPole.java | 56 + .../bunnyrun/InteractionBunnyrunField.java | 21 + .../tag/bunnyrun/InteractionBunnyrunPole.java | 20 + .../tag/icetag/InteractionIceTagField.java | 21 + .../tag/icetag/InteractionIceTagPole.java | 20 + .../InteractionRollerskateField.java | 21 + .../interactions/wired/WiredTriggerReset.java | 6 + .../WiredConditionBattleBanzaiGameActive.java | 83 + .../WiredConditionDateRangeActive.java | 79 + .../WiredConditionFreezeGameActive.java | 83 + .../WiredConditionFurniHaveFurni.java | 210 + .../WiredConditionFurniHaveHabbo.java | 189 + .../WiredConditionFurniTypeMatch.java | 164 + .../conditions/WiredConditionGroupMember.java | 85 + .../conditions/WiredConditionHabboCount.java | 95 + .../WiredConditionHabboHasEffect.java | 85 + .../WiredConditionHabboHasHandItem.java | 94 + .../WiredConditionHabboWearsBadge.java | 102 + .../WiredConditionLessTimeElapsed.java | 97 + .../WiredConditionMatchStatePosition.java | 229 + .../WiredConditionMoreTimeElapsed.java | 97 + .../WiredConditionMottoContains.java | 94 + ...redConditionNotBattleBanzaiGameActive.java | 83 + .../WiredConditionNotFreezeGameActive.java | 83 + .../WiredConditionNotFurniHaveFurni.java | 199 + .../WiredConditionNotFurniHaveHabbo.java | 187 + .../WiredConditionNotFurniTypeMatch.java | 163 + .../WiredConditionNotHabboCount.java | 94 + .../WiredConditionNotHabboHasEffect.java | 85 + .../WiredConditionNotHabboWearsBadge.java | 102 + .../conditions/WiredConditionNotInGroup.java | 85 + .../conditions/WiredConditionNotInTeam.java | 109 + .../WiredConditionNotMatchStatePosition.java | 229 + .../WiredConditionNotTriggerOnFurni.java | 171 + .../conditions/WiredConditionTeamMember.java | 109 + .../WiredConditionTriggerOnFurni.java | 173 + .../wired/effects/WiredEffectAlert.java | 41 + .../wired/effects/WiredEffectBotClothes.java | 135 + .../effects/WiredEffectBotFollowHabbo.java | 152 + .../effects/WiredEffectBotGiveHandItem.java | 157 + .../wired/effects/WiredEffectBotTalk.java | 166 + .../effects/WiredEffectBotTalkToHabbo.java | 174 + .../wired/effects/WiredEffectBotTeleport.java | 188 + .../effects/WiredEffectBotWalkToFurni.java | 197 + .../WiredEffectChangeFurniDirection.java | 92 + .../effects/WiredEffectForwardToRoom.java | 154 + .../wired/effects/WiredEffectGiveBadge.java | 154 + .../wired/effects/WiredEffectGiveCredits.java | 157 + .../effects/WiredEffectGiveDiamonds.java | 176 + .../wired/effects/WiredEffectGiveDuckets.java | 159 + ...redEffectGiveHotelviewBonusRarePoints.java | 159 + .../WiredEffectGiveHotelviewHofPoints.java | 157 + .../wired/effects/WiredEffectGiveRespect.java | 159 + .../wired/effects/WiredEffectGiveReward.java | 235 + .../wired/effects/WiredEffectGiveScore.java | 193 + .../effects/WiredEffectGiveScoreToTeam.java | 145 + .../wired/effects/WiredEffectJoinTeam.java | 156 + .../wired/effects/WiredEffectKickHabbo.java | 167 + .../wired/effects/WiredEffectLeaveTeam.java | 129 + .../wired/effects/WiredEffectLowerFurni.java | 172 + .../wired/effects/WiredEffectMatchFurni.java | 267 + .../effects/WiredEffectMoveFurniAway.java | 244 + .../wired/effects/WiredEffectMoveFurniTo.java | 248 + .../effects/WiredEffectMoveFurniTowards.java | 249 + .../effects/WiredEffectMoveRotateFurni.java | 317 + .../wired/effects/WiredEffectMuteHabbo.java | 130 + .../wired/effects/WiredEffectRaiseFurni.java | 163 + .../wired/effects/WiredEffectResetTimers.java | 134 + .../wired/effects/WiredEffectRollerSpeed.java | 143 + .../wired/effects/WiredEffectTeleport.java | 231 + .../wired/effects/WiredEffectToggleFurni.java | 256 + .../effects/WiredEffectToggleRandom.java | 210 + .../effects/WiredEffectTriggerStacks.java | 219 + .../wired/effects/WiredEffectWhisper.java | 154 + .../wired/extra/WiredExtraRandom.java | 59 + .../wired/extra/WiredExtraUnseen.java | 105 + .../wired/triggers/WiredTriggerAtSetTime.java | 138 + .../triggers/WiredTriggerAtTimeLong.java | 137 + .../triggers/WiredTriggerBotReachedFurni.java | 207 + .../triggers/WiredTriggerBotReachedHabbo.java | 103 + .../wired/triggers/WiredTriggerCollision.java | 87 + .../WiredTriggerFurniStateToggled.java | 187 + .../wired/triggers/WiredTriggerGameEnds.java | 107 + .../triggers/WiredTriggerGameStarts.java | 107 + .../triggers/WiredTriggerHabboEntersRoom.java | 106 + .../WiredTriggerHabboSaysCommand.java | 123 + .../WiredTriggerHabboSaysKeyword.java | 118 + .../WiredTriggerHabboWalkOffFurni.java | 187 + .../WiredTriggerHabboWalkOnFurni.java | 186 + .../wired/triggers/WiredTriggerRepeater.java | 150 + .../triggers/WiredTriggerRepeaterLong.java | 143 + .../triggers/WiredTriggerScoreAchieved.java | 104 + .../habbohotel/messenger/FriendRequest.java | 40 + .../habbo/habbohotel/messenger/Message.java | 67 + .../habbo/habbohotel/messenger/Messenger.java | 472 ++ .../habbohotel/messenger/MessengerBuddy.java | 179 + .../habbohotel/modtool/CfhActionType.java | 39 + .../habbo/habbohotel/modtool/CfhCategory.java | 34 + .../eu/habbo/habbohotel/modtool/CfhTopic.java | 24 + .../habbo/habbohotel/modtool/ModToolBan.java | 92 + .../habbohotel/modtool/ModToolBanType.java | 35 + .../habbohotel/modtool/ModToolCategory.java | 32 + .../habbohotel/modtool/ModToolChatLog.java | 23 + .../modtool/ModToolChatRecordDataContext.java | 27 + .../modtool/ModToolChatRecordDataType.java | 19 + .../modtool/ModToolChatlogType.java | 15 + .../habbohotel/modtool/ModToolIssue.java | 108 + .../habbohotel/modtool/ModToolManager.java | 859 +++ .../habbohotel/modtool/ModToolPreset.java | 24 + .../habbohotel/modtool/ModToolRoomVisit.java | 37 + .../modtool/ModToolTicketState.java | 31 + .../habbohotel/modtool/ModToolTicketType.java | 32 + .../habbo/habbohotel/modtool/WordFilter.java | 217 + .../habbohotel/modtool/WordFilterWord.java | 31 + .../habbohotel/navigation/DisplayMode.java | 7 + .../habbo/habbohotel/navigation/ListMode.java | 28 + .../navigation/NavigatorFavoriteFilter.java | 29 + .../navigation/NavigatorFilter.java | 156 + .../navigation/NavigatorFilterComparator.java | 8 + .../navigation/NavigatorFilterField.java | 19 + .../navigation/NavigatorHotelFilter.java | 69 + .../navigation/NavigatorManager.java | 139 + .../navigation/NavigatorPublicCategory.java | 31 + .../navigation/NavigatorPublicFilter.java | 37 + .../navigation/NavigatorRoomAdsFilter.java | 26 + .../navigation/NavigatorUserFilter.java | 62 + .../habbohotel/navigation/SearchAction.java | 15 + .../navigation/SearchResultList.java | 82 + .../habbohotel/permissions/Permission.java | 13 + .../permissions/PermissionSetting.java | 22 + .../permissions/PermissionsManager.java | 144 + .../eu/habbo/habbohotel/permissions/Rank.java | 120 + .../eu/habbo/habbohotel/pets/AbstractPet.java | 238 + .../eu/habbo/habbohotel/pets/GnomePet.java | 108 + .../eu/habbo/habbohotel/pets/HorsePet.java | 113 + .../eu/habbo/habbohotel/pets/IPetLook.java | 6 + .../habbohotel/pets/MonsterplantPet.java | 432 ++ .../com/eu/habbo/habbohotel/pets/Pet.java | 1096 ++++ .../habbohotel/pets/PetBreedingReward.java | 18 + .../eu/habbo/habbohotel/pets/PetCommand.java | 30 + .../com/eu/habbo/habbohotel/pets/PetData.java | 294 + .../eu/habbo/habbohotel/pets/PetGestures.java | 28 + .../eu/habbo/habbohotel/pets/PetManager.java | 545 ++ .../com/eu/habbo/habbohotel/pets/PetRace.java | 22 + .../eu/habbo/habbohotel/pets/PetTasks.java | 65 + .../eu/habbo/habbohotel/pets/PetVocal.java | 11 + .../habbo/habbohotel/pets/PetVocalsType.java | 20 + .../com/eu/habbo/habbohotel/polls/Poll.java | 73 + .../habbo/habbohotel/polls/PollManager.java | 98 + .../habbo/habbohotel/polls/PollQuestion.java | 112 + .../habbohotel/rooms/CustomRoomLayout.java | 54 + .../com/eu/habbo/habbohotel/rooms/Room.java | 5103 +++++++++++++++++ .../eu/habbo/habbohotel/rooms/RoomBan.java | 61 + .../habbo/habbohotel/rooms/RoomCategory.java | 73 + .../habbohotel/rooms/RoomChatMessage.java | 298 + .../rooms/RoomChatMessageBubbles.java | 89 + .../habbo/habbohotel/rooms/RoomChatType.java | 8 + .../eu/habbo/habbohotel/rooms/RoomLayout.java | 636 ++ .../habbo/habbohotel/rooms/RoomManager.java | 1727 ++++++ .../habbohotel/rooms/RoomMoodlightData.java | 93 + .../habbo/habbohotel/rooms/RoomPromotion.java | 93 + .../habbohotel/rooms/RoomRightLevels.java | 61 + .../habbohotel/rooms/RoomSpecialTypes.java | 933 +++ .../eu/habbo/habbohotel/rooms/RoomState.java | 21 + .../eu/habbo/habbohotel/rooms/RoomTile.java | 227 + .../habbo/habbohotel/rooms/RoomTileState.java | 10 + .../eu/habbo/habbohotel/rooms/RoomTrade.java | 313 + .../habbo/habbohotel/rooms/RoomTradeUser.java | 62 + .../eu/habbo/habbohotel/rooms/RoomUnit.java | 663 +++ .../habbohotel/rooms/RoomUnitEffect.java | 227 + .../habbo/habbohotel/rooms/RoomUnitType.java | 21 + .../habbohotel/rooms/RoomUserAction.java | 37 + .../habbohotel/rooms/RoomUserRotation.java | 51 + .../habbo/habbohotel/rooms/TraxManager.java | 295 + .../eu/habbo/habbohotel/users/DanceType.java | 22 + .../com/eu/habbo/habbohotel/users/Habbo.java | 558 ++ .../eu/habbo/habbohotel/users/HabboBadge.java | 112 + .../habbo/habbohotel/users/HabboGender.java | 7 + .../eu/habbo/habbohotel/users/HabboInfo.java | 491 ++ .../habbohotel/users/HabboInventory.java | 205 + .../eu/habbo/habbohotel/users/HabboItem.java | 420 ++ .../habbo/habbohotel/users/HabboManager.java | 405 ++ .../HabboNavigatorPersonalDisplayMode.java | 25 + .../users/HabboNavigatorWindowSettings.java | 149 + .../eu/habbo/habbohotel/users/HabboStats.java | 613 ++ .../eu/habbo/habbohotel/users/SignType.java | 36 + .../users/inventory/BadgesComponent.java | 198 + .../users/inventory/BotsComponent.java | 89 + .../users/inventory/EffectsComponent.java | 248 + .../users/inventory/ItemsComponent.java | 215 + .../users/inventory/PetsComponent.java | 114 + .../users/inventory/WardrobeComponent.java | 194 + .../habbohotel/wired/WiredConditionType.java | 36 + .../habbohotel/wired/WiredEffectType.java | 38 + .../habbohotel/wired/WiredGiveRewardItem.java | 38 + .../habbo/habbohotel/wired/WiredHandler.java | 459 ++ .../wired/WiredHighscoreClearType.java | 16 + .../habbohotel/wired/WiredHighscoreData.java | 18 + .../wired/WiredHighscoreScoreType.java | 15 + .../wired/WiredMatchFurniSetting.java | 33 + .../habbohotel/wired/WiredTriggerType.java | 27 + .../com/eu/habbo/messages/ClientMessage.java | 106 + .../com/eu/habbo/messages/ISerialize.java | 6 + .../com/eu/habbo/messages/PacketManager.java | 596 ++ .../eu/habbo/messages/PacketManager_1006.java | 429 ++ .../com/eu/habbo/messages/ServerMessage.java | 272 + .../eu/habbo/messages/incoming/Incoming.java | 369 ++ .../messages/incoming/Incoming_1006.java | 676 +++ .../messages/incoming/Incoming_20160101.java | 299 + .../messages/incoming/Incoming_Back.java | 718 +++ .../messages/incoming/MessageHandler.java | 13 + .../RequestAchievementConfigurationEvent.java | 13 + .../RequestAchievementsEvent.java | 13 + .../AmbassadorAlertCommandEvent.java | 24 + .../AmbassadorVisitCommandEvent.java | 28 + .../camera/CameraPublishToWebEvent.java | 64 + .../incoming/camera/CameraPurchaseEvent.java | 46 + .../camera/CameraRoomPictureEvent.java | 51 + .../camera/CameraRoomThumbnailEvent.java | 44 + .../RequestCameraConfigurationEvent.java | 14 + .../catalog/CatalogBuyItemAsGiftEvent.java | 437 ++ .../incoming/catalog/CatalogBuyItemEvent.java | 222 + .../catalog/CatalogSearchedItemEvent.java | 42 + .../incoming/catalog/CheckPetNameEvent.java | 35 + .../catalog/JukeBoxRequestTrackCodeEvent.java | 22 + .../catalog/JukeBoxRequestTrackDataEvent.java | 30 + .../incoming/catalog/RedeemVoucherEvent.java | 30 + .../catalog/RequestCatalogIndexEvent.java | 13 + .../catalog/RequestCatalogModeEvent.java | 25 + .../catalog/RequestCatalogPageEvent.java | 37 + .../catalog/RequestClubDataEvent.java | 13 + .../catalog/RequestClubGiftsEvent.java | 13 + .../catalog/RequestDiscountEvent.java | 13 + .../RequestGiftConfigurationEvent.java | 13 + .../RequestMarketplaceConfigEvent.java | 13 + .../catalog/RequestPetBreedsEvent.java | 15 + .../catalog/marketplace/BuyItemEvent.java | 15 + .../marketplace/RequestCreditsEvent.java | 13 + .../marketplace/RequestItemInfoEvent.java | 16 + .../marketplace/RequestOffersEvent.java | 51 + .../marketplace/RequestOwnItemsEvent.java | 13 + .../marketplace/RequestSellItemEvent.java | 18 + .../catalog/marketplace/SellItemEvent.java | 59 + .../marketplace/TakeBackItemEvent.java | 14 + .../catalog/recycler/OpenRecycleBoxEvent.java | 75 + .../catalog/recycler/RecycleEvent.java | 82 + .../catalog/recycler/ReloadRecyclerEvent.java | 13 + .../recycler/RequestRecyclerLogicEvent.java | 13 + .../crafting/CraftingAddRecipeEvent.java | 28 + .../crafting/CraftingCraftItemEvent.java | 91 + .../crafting/CraftingCraftSecretEvent.java | 104 + .../RequestCraftingRecipesAvailableEvent.java | 68 + .../crafting/RequestCraftingRecipesEvent.java | 28 + .../AdventCalendarForceOpenEvent.java | 13 + .../calendar/AdventCalendarOpenDayEvent.java | 17 + ...oorPlanEditorRequestBlockedTilesEvent.java | 16 + ...oorPlanEditorRequestDoorSettingsEvent.java | 18 + .../FloorPlanEditorSaveEvent.java | 123 + .../friends/AcceptFriendRequestEvent.java | 50 + .../incoming/friends/ChangeRelationEvent.java | 28 + .../friends/DeclineFriendRequestEvent.java | 27 + .../incoming/friends/FindNewFriendsEvent.java | 44 + .../friends/FriendPrivateMessageEvent.java | 69 + .../incoming/friends/FriendRequestEvent.java | 98 + .../incoming/friends/InviteFriendsEvent.java | 41 + .../incoming/friends/RemoveFriendEvent.java | 43 + .../friends/RequestFriendRequestsEvent.java | 13 + .../incoming/friends/RequestFriendsEvent.java | 23 + .../friends/RequestInitFriendsEvent.java | 21 + .../incoming/friends/SearchUserEvent.java | 45 + .../incoming/friends/StalkFriendEvent.java | 57 + .../incoming/gamecenter/GameCenterEvent.java | 11 + .../gamecenter/GameCenterJoinGameEvent.java | 29 + .../gamecenter/GameCenterLeaveGameEvent.java | 13 + .../gamecenter/GameCenterLoadGameEvent.java | 16 + .../GameCenterRequestAccountStatusEvent.java | 13 + .../GameCenterRequestGameStatusEvent.java | 13 + .../GameCenterRequestGamesEvent.java | 13 + .../guardians/GuardianAcceptRequestEvent.java | 13 + .../GuardianNoUpdatesWantedEvent.java | 12 + .../incoming/guardians/GuardianVoteEvent.java | 41 + .../guides/GuideCancelHelpRequestEvent.java | 20 + .../guides/GuideCloseHelpRequestEvent.java | 19 + .../guides/GuideHandleHelpRequestEvent.java | 30 + .../incoming/guides/GuideInviteUserEvent.java | 23 + .../guides/GuideRecommendHelperEvent.java | 23 + .../guides/GuideReportHelperEvent.java | 51 + .../guides/GuideUserMessageEvent.java | 26 + .../incoming/guides/GuideUserTypingEvent.java | 29 + .../incoming/guides/GuideVisitUserEvent.java | 20 + .../guides/RequestGuideAssistanceEvent.java | 29 + .../guides/RequestGuideToolEvent.java | 48 + .../GetHabboGuildBadgesMessageEvent.java | 12 + .../guilds/GuildAcceptMembershipEvent.java | 79 + .../guilds/GuildChangeBadgeEvent.java | 73 + .../guilds/GuildChangeColorsEvent.java | 54 + .../guilds/GuildChangeNameDescEvent.java | 49 + .../guilds/GuildChangeSettingsEvent.java | 45 + .../guilds/GuildConfirmRemoveMemberEvent.java | 37 + .../guilds/GuildDeclineMembershipEvent.java | 52 + .../incoming/guilds/GuildDeleteEvent.java | 39 + .../guilds/GuildRemoveAdminEvent.java | 53 + .../guilds/GuildRemoveFavoriteEvent.java | 29 + .../guilds/GuildRemoveMemberEvent.java | 73 + .../incoming/guilds/GuildSetAdminEvent.java | 56 + .../guilds/GuildSetFavoriteEvent.java | 43 + .../incoming/guilds/RequestGuildBuyEvent.java | 110 + .../guilds/RequestGuildBuyRoomsEvent.java | 28 + .../guilds/RequestGuildFurniWidgetEvent.java | 26 + .../guilds/RequestGuildInfoEvent.java | 23 + .../guilds/RequestGuildJoinEvent.java | 44 + .../guilds/RequestGuildManageEvent.java | 17 + .../guilds/RequestGuildMembersEvent.java | 34 + .../guilds/RequestGuildPartsEvent.java | 13 + .../guilds/RequestOwnGuildsEvent.java | 31 + .../guilds/forums/GuildForumDataEvent.java | 16 + .../guilds/forums/GuildForumListEvent.java | 28 + .../GuildForumModerateMessageEvent.java | 46 + .../forums/GuildForumModerateThreadEvent.java | 33 + .../forums/GuildForumPostThreadEvent.java | 55 + .../guilds/forums/GuildForumThreadsEvent.java | 22 + .../GuildForumThreadsMessagesEvent.java | 40 + .../forums/GuildForumUpdateSettingsEvent.java | 42 + .../handshake/GenerateSecretKeyEvent.java | 11 + .../incoming/handshake/MachineIDEvent.java | 26 + .../incoming/handshake/PingEvent.java | 13 + .../handshake/ReleaseVersionEvent.java | 12 + .../handshake/RequestBannerToken.java | 13 + .../incoming/handshake/SecureLoginEvent.java | 153 + .../handshake/SecureLoginEvent_BACKUP.java | 153 + .../incoming/handshake/UnknownComposer4.java | 16 + .../incoming/handshake/UnknownComposer5.java | 16 + .../incoming/handshake/UsernameEvent.java | 109 + .../helper/RequestTalentTrackEvent.java | 14 + .../HotelViewClaimBadgeRewardEvent.java | 30 + .../hotelview/HotelViewDataEvent.java | 68 + .../incoming/hotelview/HotelViewEvent.java | 41 + .../HotelViewRequestBadgeRewardEvent.java | 15 + .../HotelViewRequestBonusRareEvent.java | 16 + .../hotelview/RequestNewsListEvent.java | 15 + .../RequestInventoryBadgesEvent.java | 14 + .../inventory/RequestInventoryBotsEvent.java | 13 + .../inventory/RequestInventoryItemsEvent.java | 62 + .../inventory/RequestInventoryPetsEvent.java | 13 + .../inventory/TestInventoryEvent.java | 13 + .../incoming/modtool/ModToolAlertEvent.java | 20 + .../ModToolChangeRoomSettingsEvent.java | 33 + .../modtool/ModToolCloseTicketEvent.java | 46 + .../modtool/ModToolIssueChangeTopicEvent.java | 29 + .../ModToolIssueDefaultSanctionEvent.java | 57 + .../incoming/modtool/ModToolKickEvent.java | 15 + .../modtool/ModToolPickTicketEvent.java | 44 + .../modtool/ModToolReleaseTicketEvent.java | 43 + .../ModToolRequestIssueChatlogEvent.java | 58 + .../ModToolRequestRoomChatlogEvent.java | 26 + .../modtool/ModToolRequestRoomInfoEvent.java | 30 + .../ModToolRequestRoomUserChatlogEvent.java | 35 + .../ModToolRequestRoomVisitsEvent.java | 23 + .../ModToolRequestUserChatlogEvent.java | 26 + .../modtool/ModToolRequestUserInfoEvent.java | 21 + .../modtool/ModToolRoomAlertEvent.java | 29 + .../modtool/ModToolSanctionAlertEvent.java | 31 + .../modtool/ModToolSanctionBanEvent.java | 50 + .../modtool/ModToolSanctionMuteEvent.java | 33 + .../ModToolSanctionTradeLockEvent.java | 33 + .../incoming/modtool/ReportBullyEvent.java | 69 + .../incoming/modtool/ReportEvent.java | 150 + .../modtool/ReportFriendPrivateChatEvent.java | 62 + .../modtool/RequestReportRoomEvent.java | 13 + .../RequestReportUserBullyingEvent.java | 36 + .../modtool/StartSafetyQuizEvent.java | 16 + .../NavigatorCategoryListModeEvent.java | 20 + .../NavigatorCollapseCategoryEvent.java | 16 + .../NavigatorUncollapseCategoryEvent.java | 14 + .../navigator/NewNavigatorActionEvent.java | 33 + .../navigator/RequestCanCreateRoomEvent.java | 17 + .../navigator/RequestCreateRoomEvent.java | 68 + .../navigator/RequestDeleteRoomEvent.java | 98 + .../RequestHighestScoreRoomsEvent.java | 14 + .../navigator/RequestMyRoomsEvent.java | 14 + .../RequestNavigatorSettingsEvent.java | 20 + .../RequestNewNavigatorDataEvent.java | 20 + .../RequestNewNavigatorRoomsEvent.java | 301 + .../navigator/RequestPopularRoomsEvent.java | 14 + .../navigator/RequestPromotedRoomsEvent.java | 14 + .../navigator/RequestPublicRoomsEvent.java | 10 + .../navigator/RequestRoomCategoriesEvent.java | 22 + .../incoming/navigator/RequestTagsEvent.java | 14 + .../navigator/SaveWindowSettingsEvent.java | 22 + .../navigator/SearchRoomsByTagEvent.java | 16 + .../incoming/navigator/SearchRoomsEvent.java | 83 + .../navigator/SearchRoomsFriendsNowEvent.java | 14 + .../navigator/SearchRoomsFriendsOwnEvent.java | 14 + .../navigator/SearchRoomsInGroupEvent.java | 14 + .../SearchRoomsMyFavouriteEvent.java | 14 + .../navigator/SearchRoomsVisitedEvent.java | 14 + .../navigator/SearchRoomsWithRightsEvent.java | 14 + .../incoming/polls/AnswerPollEvent.java | 74 + .../incoming/polls/CancelPollEvent.java | 38 + .../incoming/polls/GetPollDataEvent.java | 23 + .../incoming/rooms/HandleDoorbellEvent.java | 41 + .../incoming/rooms/RequestHeightmapEvent.java | 23 + .../incoming/rooms/RequestRoomDataEvent.java | 30 + .../rooms/RequestRoomHeightmapEvent.java | 28 + .../incoming/rooms/RequestRoomLoadEvent.java | 34 + .../rooms/RequestRoomRightsEvent.java | 22 + .../rooms/RequestRoomSettingsEvent.java | 29 + .../rooms/RequestRoomWordFilterEvent.java | 23 + .../incoming/rooms/RoomBackgroundEvent.java | 47 + .../incoming/rooms/RoomFavoriteEvent.java | 36 + .../incoming/rooms/RoomMuteEvent.java | 23 + .../incoming/rooms/RoomPlacePaintEvent.java | 61 + .../rooms/RoomRemoveAllRightsEvent.java | 44 + .../incoming/rooms/RoomRemoveRightsEvent.java | 15 + .../rooms/RoomRequestBannedUsersEvent.java | 28 + .../incoming/rooms/RoomSettingsSaveEvent.java | 145 + .../incoming/rooms/RoomStaffPickEvent.java | 41 + .../incoming/rooms/RoomVoteEvent.java | 13 + .../rooms/RoomWordFilterModifyEvent.java | 35 + .../incoming/rooms/SetHomeRoomEvent.java | 19 + .../incoming/rooms/bots/BotPickupEvent.java | 22 + .../incoming/rooms/bots/BotPlaceEvent.java | 28 + .../rooms/bots/BotSaveSettingsEvent.java | 129 + .../incoming/rooms/bots/BotSettingsEvent.java | 30 + .../rooms/items/AdvertisingSaveEvent.java | 49 + .../incoming/rooms/items/CloseDiceEvent.java | 45 + .../items/FootballGateSaveLookEvent.java | 40 + .../rooms/items/MannequinSaveLookEvent.java | 54 + .../rooms/items/MannequinSaveNameEvent.java | 36 + .../items/MoodLightSaveSettingsEvent.java | 52 + .../rooms/items/MoodLightSettingsEvent.java | 14 + .../rooms/items/MoodLightTurnOnEvent.java | 39 + .../rooms/items/MoveWallItemEvent.java | 41 + .../rooms/items/PostItDeleteEvent.java | 32 + .../rooms/items/PostItPlaceEvent.java | 43 + .../rooms/items/PostItRequestDataEvent.java | 28 + .../rooms/items/PostItSaveDataEvent.java | 61 + .../rooms/items/RedeemClothingEvent.java | 72 + .../incoming/rooms/items/RedeemItemEvent.java | 147 + .../rooms/items/RoomPickupItemEvent.java | 59 + .../rooms/items/RoomPlaceItemEvent.java | 283 + .../rooms/items/RotateMoveItemEvent.java | 251 + .../items/SavePostItStickyPoleEvent.java | 34 + .../items/SetStackHelperHeightEvent.java | 75 + .../rooms/items/ToggleFloorItemEvent.java | 136 + .../rooms/items/ToggleWallItemEvent.java | 34 + .../rooms/items/TriggerColorWheelEvent.java | 27 + .../rooms/items/TriggerDiceEvent.java | 36 + .../rooms/items/TriggerOneWayGateEvent.java | 30 + .../jukebox/JukeBoxAddSoundTrackEvent.java | 96 + .../rooms/items/jukebox/JukeBoxEventOne.java | 19 + .../rooms/items/jukebox/JukeBoxEventTwo.java | 19 + .../jukebox/JukeBoxRemoveSoundTrackEvent.java | 20 + .../jukebox/JukeBoxRequestPlayListEvent.java | 23 + .../lovelock/LoveLockStartConfirmEvent.java | 55 + .../rentablespace/RentSpaceCancelEvent.java | 33 + .../items/rentablespace/RentSpaceEvent.java | 31 + .../youtube/YoutubeRequestNextVideoEvent.java | 33 + .../youtube/YoutubeRequestPlayListEvent.java | 26 + .../youtube/YoutubeRequestVideoDataEvent.java | 33 + .../incoming/rooms/pets/BreedPetsEvent.java | 31 + .../rooms/pets/CompostMonsterplantEvent.java | 68 + .../incoming/rooms/pets/HorseRideEvent.java | 74 + .../rooms/pets/HorseRideSettingsEvent.java | 28 + .../rooms/pets/HorseUseItemEvent.java | 179 + .../incoming/rooms/pets/MovePetEvent.java | 39 + .../rooms/pets/PetPackageNameEvent.java | 93 + .../incoming/rooms/pets/PetPickupEvent.java | 66 + .../incoming/rooms/pets/PetPlaceEvent.java | 114 + .../pets/RequestPetInformationEvent.java | 27 + .../pets/RequestPetTrainingPanelEvent.java | 22 + .../incoming/rooms/pets/ScratchPetEvent.java | 30 + .../ToggleMonsterplantBreedableEvent.java | 27 + .../promotions/BuyRoomPromotionEvent.java | 67 + .../RequestPromotionRoomsEvent.java | 20 + .../promotions/UpdateRoomPromotionEvent.java | 42 + .../rooms/users/IgnoreRoomUserEvent.java | 36 + .../rooms/users/RequestRoomUserTagsEvent.java | 24 + .../rooms/users/RoomUserActionEvent.java | 70 + .../rooms/users/RoomUserBanEvent.java | 18 + .../rooms/users/RoomUserDanceEvent.java | 54 + .../users/RoomUserDropHandItemEvent.java | 20 + .../users/RoomUserGiveHandItemEvent.java | 36 + .../rooms/users/RoomUserGiveRespectEvent.java | 37 + .../rooms/users/RoomUserGiveRightsEvent.java | 33 + .../rooms/users/RoomUserKickEvent.java | 53 + .../rooms/users/RoomUserLookAtPoint.java | 72 + .../rooms/users/RoomUserMuteEvent.java | 36 + .../users/RoomUserRemoveRightsEvent.java | 28 + .../rooms/users/RoomUserShoutEvent.java | 38 + .../rooms/users/RoomUserSignEvent.java | 19 + .../rooms/users/RoomUserSitEvent.java | 32 + .../rooms/users/RoomUserStartTypingEvent.java | 23 + .../rooms/users/RoomUserStopTypingEvent.java | 23 + .../rooms/users/RoomUserTalkEvent.java | 43 + .../rooms/users/RoomUserWalkEvent.java | 91 + .../rooms/users/RoomUserWhisperEvent.java | 38 + .../rooms/users/UnIgnoreRoomUserEvent.java | 31 + .../rooms/users/UnbanRoomUserEvent.java | 26 + .../incoming/trading/TradeAcceptEvent.java | 20 + .../incoming/trading/TradeCancelEvent.java | 27 + .../trading/TradeCancelOfferItemEvent.java | 24 + .../incoming/trading/TradeCloseEvent.java | 27 + .../incoming/trading/TradeConfirmEvent.java | 20 + .../incoming/trading/TradeOfferItemEvent.java | 27 + .../trading/TradeOfferMultipleItemsEvent.java | 35 + .../incoming/trading/TradeStartEvent.java | 77 + .../incoming/trading/TradeUnAcceptEvent.java | 20 + .../unknown/RequestResolutionEvent.java | 19 + .../incoming/unknown/UnknownEvent1.java | 13 + .../incoming/unknown/UnknownEvent2.java | 12 + .../incoming/users/ActivateEffectEvent.java | 17 + .../users/ChangeNameCheckUsernameEvent.java | 80 + .../users/ConfirmChangeNameEvent.java | 104 + .../incoming/users/EnableEffectEvent.java | 29 + .../incoming/users/PickNewUserGiftEvent.java | 32 + .../users/RequestMeMenuSettingsEvent.java | 13 + .../users/RequestProfileFriendsEvent.java | 22 + .../users/RequestUserCitizinShipEvent.java | 13 + .../incoming/users/RequestUserClubEvent.java | 14 + .../users/RequestUserCreditsEvent.java | 17 + .../incoming/users/RequestUserDataEvent.java | 157 + .../users/RequestUserProfileEvent.java | 22 + .../users/RequestUserWardrobeEvent.java | 13 + .../users/RequestWearingBadgesEvent.java | 22 + .../users/SaveBlockCameraFollowEvent.java | 15 + .../users/SaveIgnoreRoomInvitesEvent.java | 15 + .../incoming/users/SaveMottoEvent.java | 33 + .../users/SavePreferOldChatEvent.java | 15 + .../incoming/users/SaveUserVolumesEvent.java | 22 + .../incoming/users/SaveWardrobeEvent.java | 37 + .../incoming/users/UserActivityEvent.java | 24 + .../messages/incoming/users/UserNuxEvent.java | 55 + .../incoming/users/UserSaveLookEvent.java | 53 + .../incoming/users/UserWearBadgeEvent.java | 49 + .../wired/WiredConditionSaveDataEvent.java | 38 + .../wired/WiredEffectSaveDataEvent.java | 46 + .../wired/WiredTriggerSaveDataEvent.java | 38 + .../messages/outgoing/MessageComposer.java | 15 + .../eu/habbo/messages/outgoing/Outgoing.java | 613 ++ .../messages/outgoing/Outgoing_1006.java | 850 +++ .../messages/outgoing/Outgoing_Back.java | 853 +++ .../habbo/messages/outgoing/TestComposer.java | 26 + .../achievements/AchievementListComposer.java | 79 + .../AchievementProgressComposer.java | 62 + .../AchievementUnlockedComposer.java | 41 + .../TalentLevelUpdateComposer.java | 41 + .../talenttrack/TalentTrackComposer.java | 153 + .../CameraCompetitionStatusComposer.java | 26 + .../outgoing/camera/CameraPriceComposer.java | 29 + .../CameraPublishWaitMessageComposer.java | 33 + .../CameraPurchaseSuccesfullComposer.java | 16 + .../CameraRoomThumbnailSavedComposer.java | 15 + .../outgoing/camera/CameraURLComposer.java | 23 + .../catalog/AlertLimitedSoldOutComposer.java | 15 + .../catalog/AlertPurchaseFailedComposer.java | 26 + .../AlertPurchaseUnavailableComposer.java | 26 + .../outgoing/catalog/CatalogModeComposer.java | 23 + .../outgoing/catalog/CatalogPageComposer.java | 81 + .../catalog/CatalogPagesListComposer.java | 83 + .../catalog/CatalogSearchResultComposer.java | 24 + .../catalog/CatalogUpdatedComposer.java | 16 + .../catalog/ClubCenterDataComposer.java | 43 + .../outgoing/catalog/ClubGiftsComposer.java | 88 + .../outgoing/catalog/DiscountComposer.java | 24 + .../catalog/GiftConfigurationComposer.java | 58 + .../catalog/GiftReceiverNotFoundComposer.java | 16 + .../catalog/NotEnoughPointsTypeComposer.java | 29 + .../PetBoughtNotificationComposer.java | 27 + .../outgoing/catalog/PetBreedsComposer.java | 38 + .../catalog/PetNameErrorComposer.java | 32 + .../outgoing/catalog/PurchaseOKComposer.java | 51 + .../catalog/RecyclerCompleteComposer.java | 27 + .../catalog/RecyclerLogicComposer.java | 34 + .../catalog/RedeemVoucherErrorComposer.java | 26 + .../catalog/RedeemVoucherOKComposer.java | 17 + .../catalog/ReloadRecyclerComposer.java | 17 + .../MarketplaceBuyErrorComposer.java | 37 + .../MarketplaceCancelSaleComposer.java | 27 + .../MarketplaceConfigComposer.java | 25 + .../MarketplaceItemInfoComposer.java | 24 + .../MarketplaceItemPostedComposer.java | 27 + .../MarketplaceOffersComposer.java | 58 + .../MarketplaceOwnItemsComposer.java | 77 + .../MarketplaceSellItemComposer.java | 33 + .../crafting/CraftableProductsComposer.java | 43 + .../crafting/CraftingRecipeComposer.java | 33 + .../CraftingRecipesAvailableComposer.java | 26 + .../crafting/CraftingResultComposer.java | 32 + .../calendar/AdventCalendarDataComposer.java | 79 + .../AdventCalendarProductComposer.java | 29 + .../mysticbox/MysticBoxCloseComposer.java | 16 + .../mysticbox/MysticBoxPrizeComposer.java | 26 + .../mysticbox/MysticBoxStartOpenComposer.java | 16 + .../NewYearResolutionCompletedComposer.java | 24 + .../resolution/NewYearResolutionComposer.java | 34 + .../NewYearResolutionProgressComposer.java | 38 + .../FloorPlanEditorBlockedTilesComposer.java | 35 + .../FloorPlanEditorDoorSettingsComposer.java | 26 + .../friends/FriendChatMessageComposer.java | 58 + .../friends/FriendFindingRoomComposer.java | 26 + .../friends/FriendNotificationComposer.java | 37 + .../friends/FriendRequestComposer.java | 28 + .../friends/FriendRequestErrorComposer.java | 28 + .../outgoing/friends/FriendsComposer.java | 77 + .../friends/LoadFriendRequestsComposer.java | 38 + .../friends/MessengerInitComposer.java | 28 + .../friends/RemoveFriendComposer.java | 38 + .../outgoing/friends/RoomInviteComposer.java | 26 + .../friends/RoomInviteErrorComposer.java | 38 + .../outgoing/friends/StalkErrorComposer.java | 28 + .../friends/UpdateFriendComposer.java | 77 + .../friends/UserSearchResultComposer.java | 78 + .../GameCenterAccountInfoComposer.java | 27 + ...nterAchievementsConfigurationComposer.java | 29 + .../gamecenter/GameCenterGameComposer.java | 29 + .../GameCenterGameListComposer.java | 38 + .../basejump/BaseJumpJoinQueueComposer.java | 23 + .../basejump/BaseJumpLeaveQueueComposer.java | 16 + .../basejump/BaseJumpLoadGameComposer.java | 60 + .../basejump/BaseJumpLoadGameURLComposer.java | 18 + .../basejump/BaseJumpUnloadGameComposer.java | 17 + .../generic/MinimailCountComposer.java | 18 + ...ckMonthlyClubGiftNotificationComposer.java | 23 + .../generic/alerts/BotErrorComposer.java | 29 + .../generic/alerts/BubbleAlertComposer.java | 47 + .../generic/alerts/BubbleAlertKeys.java | 42 + .../alerts/CustomNotificationComposer.java | 29 + .../generic/alerts/GenericAlertComposer.java | 31 + .../alerts/GenericErrorMessagesComposer.java | 30 + .../HotelClosesAndWillOpenAtComposer.java | 29 + ...elWillCloseInMinutesAndBackInComposer.java | 27 + .../HotelWillCloseInMinutesComposer.java | 23 + .../alerts/MessagesForYouComposer.java | 44 + .../generic/alerts/PetErrorComposer.java | 30 + .../StaffAlertAndOpenHabboWayComposer.java | 23 + ...fAlertWIthLinkAndOpenHabboWayComposer.java | 26 + .../alerts/StaffAlertWithLinkComposer.java | 26 + .../generic/alerts/UpdateFailedComposer.java | 23 + .../alerts/WiredRewardAlertComposer.java | 33 + .../outgoing/generic/testcomposer.java | 29 + .../GuardianNewReportReceivedComposer.java | 25 + .../GuardianVotingRequestedComposer.java | 55 + .../GuardianVotingResultComposer.java | 41 + .../guardians/GuardianVotingTimeEnded.java | 16 + .../GuardianVotingVotesComposer.java | 39 + .../guides/BullyReportClosedComposer.java | 26 + .../guides/GuideSessionAttachedComposer.java | 31 + .../guides/GuideSessionDetachedComposer.java | 15 + .../guides/GuideSessionEndedComposer.java | 26 + .../guides/GuideSessionErrorComposer.java | 27 + ...uideSessionInvitedToGuideRoomComposer.java | 26 + .../guides/GuideSessionMessageComposer.java | 25 + .../GuideSessionPartnerIsPlayingComposer.java | 23 + .../GuideSessionPartnerIsTypingComposer.java | 23 + .../GuideSessionRequesterRoomComposer.java | 23 + .../guides/GuideSessionStartedComposer.java | 34 + .../outgoing/guides/GuideToolsComposer.java | 28 + .../GuildAcceptMemberErrorComposer.java | 30 + .../outgoing/guilds/GuildBoughtComposer.java | 25 + .../guilds/GuildBuyRoomsComposer.java | 56 + .../GuildConfirmRemoveMemberComposer.java | 26 + .../guilds/GuildEditFailComposer.java | 28 + .../GuildFavoriteRoomUserUpdateComposer.java | 30 + .../guilds/GuildFurniWidgetComposer.java | 36 + .../outgoing/guilds/GuildInfoComposer.java | 58 + .../guilds/GuildJoinErrorComposer.java | 31 + .../outgoing/guilds/GuildListComposer.java | 40 + .../outgoing/guilds/GuildManageComposer.java | 67 + .../guilds/GuildMemberUpdateComposer.java | 32 + .../outgoing/guilds/GuildMembersComposer.java | 64 + .../outgoing/guilds/GuildPartsComposer.java | 54 + .../GuildRefreshMembersListComposer.java | 25 + .../guilds/RemoveGuildFromRoomComposer.java | 23 + .../forums/GuildForumAddCommentComposer.java | 26 + .../forums/GuildForumCommentsComposer.java | 39 + .../guilds/forums/GuildForumDataComposer.java | 48 + .../guilds/forums/GuildForumListComposer.java | 39 + .../GuildForumThreadMessagesComposer.java | 25 + .../forums/GuildForumThreadsComposer.java | 28 + ...uildForumsUnreadMessagesCountComposer.java | 23 + .../forums/UnknownGuildForumComposer6.java | 30 + .../forums/UnknownGuildForumComposer7.java | 25 + .../habboway/HabboWayQuizComposer1.java | 30 + .../habboway/HabboWayQuizComposer2.java | 30 + .../handshake/BannerTokenComposer.java | 27 + .../handshake/DebugConsoleComposer.java | 21 + .../handshake/ForumsTestComposer.java | 15 + .../outgoing/handshake/MachineIDComposer.java | 24 + .../outgoing/handshake/PongComposer.java | 23 + .../handshake/SecureLoginOKComposer.java | 17 + .../handshake/SessionRightsComposer.java | 23 + .../handshake/SomeConnectionComposer.java | 16 + .../outgoing/hotelview/BonusRareComposer.java | 31 + .../hotelview/HallOfFameComposer.java | 41 + .../HotelViewBadgeButtonConfigComposer.java | 26 + .../HotelViewCatalogPageExpiringComposer.java | 29 + .../HotelViewCommunityGoalComposer.java | 64 + .../outgoing/hotelview/HotelViewComposer.java | 15 + .../HotelViewConcurrentUsersComposer.java | 33 + .../HotelViewCustomTimerComposer.java | 26 + .../hotelview/HotelViewDataComposer.java | 28 + .../HotelViewNextLTDAvailableComposer.java | 32 + .../outgoing/hotelview/NewsListComposer.java | 33 + .../outgoing/inventory/AddBotComposer.java | 29 + .../inventory/AddHabboItemComposer.java | 47 + .../outgoing/inventory/AddPetComposer.java | 25 + .../inventory/EffectsListAddComposer.java | 27 + .../EffectsListEffectEnableComposer.java | 26 + .../inventory/EffectsListRemoveComposer.java | 24 + .../InventoryAchievementsComposer.java | 44 + .../inventory/InventoryBadgesComposer.java | 49 + .../inventory/InventoryBotsComposer.java | 37 + .../inventory/InventoryItemsComposer.java | 94 + .../inventory/InventoryPetsComposer.java | 47 + .../inventory/InventoryRefreshComposer.java | 15 + .../InventoryUpdateItemComposer.java | 64 + .../outgoing/inventory/RemoveBotComposer.java | 24 + .../inventory/RemoveHabboItemComposer.java | 23 + .../outgoing/inventory/RemovePetComposer.java | 29 + .../inventory/UserEffectsListComposer.java | 45 + .../modtool/BullyReportRequestComposer.java | 49 + .../modtool/BullyReportedMessageComposer.java | 29 + .../modtool/CfhTopicsMessageComposer.java | 44 + .../HelperRequestDisabledComposer.java | 16 + .../outgoing/modtool/ModToolComposer.java | 104 + .../modtool/ModToolIssueChatlogComposer.java | 82 + .../modtool/ModToolIssueHandledComposer.java | 34 + ...ModToolIssueHandlerDimensionsComposer.java | 32 + .../modtool/ModToolIssueInfoComposer.java | 23 + .../ModToolIssueResponseAlertComposer.java | 23 + .../modtool/ModToolIssueUpdateComposer.java | 24 + .../ModToolReportReceivedAlertComposer.java | 27 + .../modtool/ModToolRoomChatlogComposer.java | 50 + .../modtool/ModToolRoomInfoComposer.java | 39 + .../modtool/ModToolSanctionInfoComposer.java | 29 + .../modtool/ModToolUserChatlogComposer.java | 58 + .../modtool/ModToolUserInfoComposer.java | 52 + .../ModToolUserRoomVisitsComposer.java | 44 + .../modtool/ReportRoomFormComposer.java | 39 + .../navigator/CanCreateEventComposer.java | 17 + .../navigator/CanCreateRoomComposer.java | 28 + ...NewNavigatorCategoryUserCountComposer.java | 33 + ...wNavigatorCollapsedCategoriesComposer.java | 62 + .../NewNavigatorEventCategoriesComposer.java | 49 + .../NewNavigatorLiftedRoomsComposer.java | 16 + .../NewNavigatorMetaDataComposer.java | 26 + .../NewNavigatorSavedSearchesComposer.java | 36 + .../NewNavigatorSearchResultsComposer.java | 52 + .../NewNavigatorSettingsComposer.java | 29 + .../OpenRoomCreationWindowComposer.java | 16 + .../navigator/PrivateRoomsComposer.java | 54 + .../navigator/RoomCategoriesComposer.java | 47 + .../navigator/RoomCreatedComposer.java | 25 + .../outgoing/navigator/TagsComposer.java | 33 + .../outgoing/polls/PollQuestionsComposer.java | 35 + .../outgoing/polls/PollStartComposer.java | 27 + .../infobus/SimplePollAnswerComposer.java | 35 + .../infobus/SimplePollAnswersComposer.java | 34 + .../infobus/SimplePollStartComposer.java | 33 + .../outgoing/rooms/BotSettingsComposer.java | 50 + .../rooms/DoorbellAddUserComposer.java | 23 + .../rooms/FavoriteRoomChangedComposer.java | 26 + .../outgoing/rooms/FloodCounterComposer.java | 23 + .../outgoing/rooms/ForwardToRoomComposer.java | 23 + .../outgoing/rooms/FreezeLivesComposer.java | 25 + .../outgoing/rooms/HideDoorbellComposer.java | 23 + .../rooms/KnockKnockUnknownComposer.java | 24 + .../rooms/RoomAccessDeniedComposer.java | 24 + .../rooms/RoomAddRightsListComposer.java | 30 + .../rooms/RoomBannedUsersComposer.java | 62 + .../rooms/RoomChatSettingsComposer.java | 27 + .../outgoing/rooms/RoomDataComposer.java | 129 + .../rooms/RoomEditSettingsErrorComposer.java | 37 + .../rooms/RoomEnterErrorComposer.java | 43 + .../outgoing/rooms/RoomEntryInfoComposer.java | 25 + .../rooms/RoomFilterWordsComposer.java | 34 + .../RoomFloorThicknessUpdatedComposer.java | 26 + .../outgoing/rooms/RoomHeightMapComposer.java | 27 + .../outgoing/rooms/RoomModelComposer.java | 25 + .../outgoing/rooms/RoomMutedComposer.java | 24 + .../outgoing/rooms/RoomNoRightsComposer.java | 15 + .../outgoing/rooms/RoomOpenComposer.java | 16 + .../outgoing/rooms/RoomOwnerComposer.java | 15 + .../outgoing/rooms/RoomPaintComposer.java | 27 + .../outgoing/rooms/RoomPaneComposer.java | 27 + .../rooms/RoomRelativeMapComposer.java | 40 + .../rooms/RoomRemoveRightsListComposer.java | 28 + .../outgoing/rooms/RoomRightsComposer.java | 25 + .../rooms/RoomRightsListComposer.java | 38 + .../outgoing/rooms/RoomScoreComposer.java | 27 + .../outgoing/rooms/RoomSettingsComposer.java | 65 + .../rooms/RoomSettingsSavedComposer.java | 24 + .../rooms/RoomSettingsUpdatedComposer.java | 23 + .../outgoing/rooms/RoomThicknessComposer.java | 27 + .../rooms/UpdateStackHeightComposer.java | 53 + .../rooms/items/AddFloorItemComposer.java | 34 + .../rooms/items/AddWallItemComposer.java | 27 + .../items/FloorItemOnRollerComposer.java | 62 + .../rooms/items/FloorItemUpdateComposer.java | 31 + .../rooms/items/ItemStateComposer.java | 34 + .../rooms/items/MoodLightDataComposer.java | 69 + .../rooms/items/PostItDataComposer.java | 33 + .../items/PostItStickyPoleOpenComposer.java | 25 + .../items/PresentItemOpenedComposer.java | 34 + .../rooms/items/RemoveFloorItemComposer.java | 38 + .../rooms/items/RemoveWallItemComposer.java | 26 + .../rooms/items/RoomFloorItemsComposer.java | 62 + .../rooms/items/RoomWallItemsComposer.java | 64 + .../UpdateStackHeightTileHeightComposer.java | 31 + .../rooms/items/WallItemUpdateComposer.java | 24 + .../items/jukebox/JukeBoxMySongsComposer.java | 36 + .../JukeBoxNowPlayingMessageComposer.java | 44 + .../JukeBoxPlayListAddSongComposer.java | 27 + .../jukebox/JukeBoxPlayListComposer.java | 41 + .../JukeBoxPlayListUpdatedComposer.java | 43 + .../jukebox/JukeBoxPlaylistFullComposer.java | 16 + .../jukebox/JukeBoxTrackCodeComposer.java | 25 + .../jukebox/JukeBoxTrackDataComposer.java | 37 + .../LoveLockFurniFinishedComposer.java | 24 + .../LoveLockFurniFriendConfirmedComposer.java | 24 + .../lovelock/LoveLockFurniStartComposer.java | 25 + .../RentableSpaceInfoComposer.java | 58 + .../RentableSpaceUnknown2Composer.java | 23 + .../RentableSpaceUnknownComposer.java | 23 + .../youtube/YoutubeDisplayListComposer.java | 38 + .../items/youtube/YoutubeVideoComposer.java | 30 + .../CantScratchPetNotOldEnoughComposer.java | 26 + .../rooms/pets/PetInformationComposer.java | 87 + .../rooms/pets/PetLevelUpComposer.java | 33 + .../rooms/pets/PetPackageComposer.java | 24 + .../PetPackageNameValidationComposer.java | 35 + .../rooms/pets/PetStatusUpdateComposer.java | 31 + .../rooms/pets/PetTrainingPanelComposer.java | 53 + .../outgoing/rooms/pets/RoomPetComposer.java | 73 + .../rooms/pets/RoomPetExperienceComposer.java | 28 + .../pets/RoomPetHorseFigureComposer.java | 57 + .../rooms/pets/RoomPetRespectComposer.java | 37 + .../pets/breeding/PetBreedingCompleted.java | 26 + .../breeding/PetBreedingFailedComposer.java | 26 + .../breeding/PetBreedingResultComposer.java | 79 + .../breeding/PetBreedingStartComposer.java | 35 + .../PetBreedingStartFailedComposer.java | 30 + .../PromoteOwnRoomsListComposer.java | 38 + .../RoomPromotionMessageComposer.java | 66 + .../users/ChangeNameUpdatedComposer.java | 26 + .../rooms/users/RoomUnitIdleComposer.java | 25 + .../rooms/users/RoomUnitOnRollerComposer.java | 75 + .../users/RoomUnitUpdateUsernameComposer.java | 28 + .../rooms/users/RoomUserActionComposer.java | 28 + .../rooms/users/RoomUserDanceComposer.java | 26 + .../rooms/users/RoomUserDataComposer.java | 28 + .../rooms/users/RoomUserEffectComposer.java | 26 + .../rooms/users/RoomUserHandItemComposer.java | 25 + .../rooms/users/RoomUserIgnoredComposer.java | 31 + .../users/RoomUserNameChangedComposer.java | 36 + .../RoomUserReceivedHandItemComposer.java | 27 + .../rooms/users/RoomUserRemoveComposer.java | 24 + .../users/RoomUserRemoveRightsComposer.java | 27 + .../rooms/users/RoomUserRespectComposer.java | 25 + .../rooms/users/RoomUserShoutComposer.java | 28 + .../rooms/users/RoomUserStatusComposer.java | 104 + .../rooms/users/RoomUserTagsComposer.java | 30 + .../rooms/users/RoomUserTalkComposer.java | 29 + .../rooms/users/RoomUserTypingComposer.java | 27 + .../rooms/users/RoomUserUnbannedComposer.java | 27 + .../rooms/users/RoomUserWhisperComposer.java | 27 + .../users/RoomUsersAddGuildBadgeComposer.java | 26 + .../rooms/users/RoomUsersComposer.java | 173 + .../users/RoomUsersGuildBadgesComposer.java | 36 + .../eu/habbo/messages/outgoing/trading.zip | Bin 0 -> 3385 bytes .../trading/OtherTradingDisabledComposer.java | 15 + .../trading/TradeAcceptedComposer.java | 25 + .../trading/TradeCloseWindowComposer.java | 16 + .../outgoing/trading/TradeClosedComposer.java | 29 + .../trading/TradeCompleteComposer.java | 16 + .../outgoing/trading/TradeStartComposer.java | 35 + .../trading/TradeStartFailComposer.java | 38 + .../outgoing/trading/TradeUpdateComposer.java | 51 + .../TradingWaitingConfirmComposer.java | 15 + .../trading/YouTradingDisabledComposer.java | 15 + .../unknown/BuildersClubExpiredComposer.java | 20 + .../unknown/CloseWebPageComposer.java | 16 + .../outgoing/unknown/ClubDataComposer.java | 81 + .../CompetitionEntrySubmitResultComposer.java | 46 + .../ConvertedForwardToRoomComposer.java | 26 + .../unknown/EpicPopupFrameComposer.java | 24 + .../outgoing/unknown/ErrorLoginComposer.java | 23 + .../unknown/ExtendClubMessageComposer.java | 97 + .../outgoing/unknown/HabboMallComposer.java | 16 + .../unknown/HabboNameChangedComposer.java | 36 + .../unknown/HotelClosedAndOpensComposer.java | 26 + ...HotelViewExpiringCatalogPageCommposer.java | 28 + ...elViewHideCommunityVoteButtonComposer.java | 23 + .../HotelViewNextLTDAvailableComposer.java | 32 + .../unknown/ItemExtraDataComposer.java | 25 + .../outgoing/unknown/ItemStateComposer2.java | 26 + .../unknown/ItemsDataUpdateComposer.java | 30 + .../unknown/MessengerErrorComposer.java | 30 + .../unknown/MinimailNewMessageComposer.java | 15 + .../outgoing/unknown/ModToolComposerOne.java | 17 + .../unknown/ModToolSanctionDataComposer.java | 61 + .../MostUselessErrorAlertComposer.java | 16 + .../unknown/MysteryPrizeComposer.java | 21 + .../outgoing/unknown/NewUserGiftComposer.java | 38 + .../unknown/NewUserIdentityComposer.java | 16 + .../outgoing/unknown/NuxAlertComposer.java | 23 + .../unknown/PetLevelUpdatedComposer.java | 28 + .../unknown/QuestCompletedComposer.java | 68 + .../unknown/QuestExpiredComposer.java | 23 + .../unknown/QuestionInfoComposer.java | 42 + .../unknown/RemoveRoomEventComposer.java | 16 + .../RentableItemBuyOutPriceComposer.java | 38 + .../outgoing/unknown/RoomAdErrorComposer.java | 26 + .../RoomCategoryUpdateMessageComposer.java | 23 + .../RoomMessagesPostedCountComposer.java | 28 + .../unknown/RoomUnknown2Composer.java | 26 + .../unknown/RoomUnknown3Composer.java | 16 + .../RoomUserQuestionAnsweredComposer.java | 36 + .../unknown/SnowWarsAddUserComposer.java | 27 + .../outgoing/unknown/SnowWarsCompose1.java | 46 + .../SnowWarsFullGameStatusComposer.java | 38 + .../SnowWarsGameStartedErrorComposer.java | 15 + .../unknown/SnowWarsGenericErrorComposer.java | 15 + .../unknown/SnowWarsInitGameArena.java | 15 + .../unknown/SnowWarsJoinErrorComposer.java | 19 + .../unknown/SnowWarsLevelDataComposer.java | 89 + .../unknown/SnowWarsLoadingArenaComposer.java | 23 + .../unknown/SnowWarsLongDataComposer.java | 41 + .../unknown/SnowWarsOnGameEnding.java | 54 + .../unknown/SnowWarsOnStageEnding.java | 15 + .../SnowWarsOnStageRunningComposer.java | 15 + .../unknown/SnowWarsOnStageStartComposer.java | 67 + .../SnowWarsPlayNowWindowComposer.java | 18 + .../unknown/SnowWarsPreviousRoomComposer.java | 15 + .../unknown/SnowWarsQuePositionComposer.java | 15 + .../unknown/SnowWarsQuickJoinComposer.java | 39 + .../unknown/SnowWarsRemoveUserComposer.java | 19 + .../unknown/SnowWarsResetTimerComposer.java | 16 + .../unknown/SnowWarsStartLobbyCounter.java | 16 + .../unknown/SnowWarsUnknownComposer.java | 24 + .../unknown/SnowWarsUserChatComposer.java | 16 + .../SnowWarsUserEnteredArenaComposer.java | 37 + .../SnowWarsUserExitArenaComposer.java | 16 + .../TalentTrackEmailFailedComposer.java | 23 + .../TalentTrackEmailVerifiedComposer.java | 29 + .../unknown/TargetedOfferComposer.java | 26 + .../unknown/UnknownAdManagerComposer.java | 23 + .../unknown/UnknownAvatarEditorComposer.java | 23 + .../UnknownCatalogPageOfferComposer.java | 27 + .../unknown/UnknownCompetitionComposer.java | 32 + .../outgoing/unknown/UnknownComposer4.java | 16 + .../outgoing/unknown/UnknownComposer5.java | 16 + .../outgoing/unknown/UnknownComposer6.java | 16 + .../outgoing/unknown/UnknownComposer8.java | 29 + .../unknown/UnknownFurniModelComposer.java | 27 + .../unknown/UnknownGuild2Composer.java | 23 + .../unknown/UnknownGuildComposer.java | 27 + .../unknown/UnknownGuildComposer3.java | 23 + .../unknown/UnknownHabboWayQuizComposer.java | 32 + .../unknown/UnknownHelperComposer.java | 16 + .../outgoing/unknown/UnknownHintComposer.java | 23 + .../UnknownMessengerErrorComposer.java | 29 + .../unknown/UnknownPollQuestionComposer.java | 33 + .../unknown/UnknownRoomDesktopComposer.java | 33 + .../unknown/UnknownRoomViewerComposer.java | 30 + .../unknown/UnknownStatusComposer.java | 26 + .../unknown/UnknownTradeComposer.java | 16 + .../unknown/UnknownWiredComposer.java | 24 + .../unknown/UnkownPetPackageComposer.java | 30 + .../unknown/VerifyMobileNumberComposer.java | 16 + .../VerifyMobilePhoneCodeWindowComposer.java | 26 + .../VerifyMobilePhoneDoneComposer.java | 26 + .../VerifyMobilePhoneWindowComposer.java | 29 + .../unknown/VipTutorialsStartComposer.java | 16 + .../unknown/WatchAndEarnRewardComposer.java | 29 + .../outgoing/unknown/WelcomeGiftComposer.java | 35 + .../unknown/WelcomeGiftErrorComposer.java | 28 + .../outgoing/users/AddUserBadgeComposer.java | 25 + .../users/ChangeNameCheckResultComposer.java | 42 + .../users/ClubGiftReceivedComposer.java | 36 + .../users/FavoriteRoomsCountComposer.java | 38 + .../users/MeMenuSettingsComposer.java | 33 + .../outgoing/users/MutedWhisperComposer.java | 23 + .../users/ProfileFriendsComposer.java | 127 + .../users/UpdateUserLookComposer.java | 25 + .../users/UserAchievementScoreComposer.java | 24 + .../outgoing/users/UserBCLimitsComposer.java | 21 + .../outgoing/users/UserBadgesComposer.java | 39 + .../users/UserCitizinShipComposer.java | 27 + .../outgoing/users/UserClothesComposer.java | 57 + .../outgoing/users/UserClubComposer.java | 86 + .../outgoing/users/UserCreditsComposer.java | 26 + .../outgoing/users/UserCurrencyComposer.java | 81 + .../outgoing/users/UserDataComposer.java | 40 + .../outgoing/users/UserHomeRoomComposer.java | 29 + .../outgoing/users/UserPerksComposer.java | 87 + .../users/UserPermissionsComposer.java | 31 + .../outgoing/users/UserPointsComposer.java | 29 + .../outgoing/users/UserProfileComposer.java | 134 + .../outgoing/users/UserWardrobeComposer.java | 32 + .../wired/WiredConditionDataComposer.java | 28 + .../wired/WiredEffectDataComposer.java | 28 + .../outgoing/wired/WiredSavedComposer.java | 16 + .../wired/WiredTriggerDataComposer.java | 28 + .../com/eu/habbo/messages/rcon/AlertUser.java | 36 + .../habbo/messages/rcon/ChangeRoomOwner.java | 35 + .../messages/rcon/CreateModToolTicket.java | 32 + .../habbo/messages/rcon/DisconnectUser.java | 52 + .../habbo/messages/rcon/ExecuteCommand.java | 46 + .../eu/habbo/messages/rcon/ForwardUser.java | 53 + .../eu/habbo/messages/rcon/FriendRequest.java | 66 + .../com/eu/habbo/messages/rcon/GiveBadge.java | 114 + .../eu/habbo/messages/rcon/GiveCredits.java | 54 + .../eu/habbo/messages/rcon/GivePixels.java | 54 + .../eu/habbo/messages/rcon/GivePoints.java | 57 + .../eu/habbo/messages/rcon/HotelAlert.java | 27 + .../habbo/messages/rcon/ImageHotelAlert.java | 34 + .../com/eu/habbo/messages/rcon/MuteUser.java | 58 + .../messages/rcon/ProgressAchievement.java | 49 + .../eu/habbo/messages/rcon/RCONMessage.java | 65 + .../com/eu/habbo/messages/rcon/SendGift.java | 110 + .../habbo/messages/rcon/SendRoomBundle.java | 52 + .../com/eu/habbo/messages/rcon/SetRank.java | 52 + .../eu/habbo/messages/rcon/StaffAlert.java | 23 + .../com/eu/habbo/messages/rcon/StalkUser.java | 60 + .../com/eu/habbo/messages/rcon/TalkUser.java | 47 + .../eu/habbo/messages/rcon/UpdateCatalog.java | 35 + .../eu/habbo/messages/rcon/UpdateUser.java | 119 + .../habbo/messages/rcon/UpdateWordfilter.java | 25 + .../habbo/networking/camera/CameraClient.java | 110 + .../networking/camera/CameraDecoder.java | 33 + .../networking/camera/CameraHandler.java | 68 + .../camera/CameraIncomingMessage.java | 83 + .../networking/camera/CameraMessage.java | 21 + .../camera/CameraOutgoingMessage.java | 179 + .../camera/CameraPacketHandler.java | 55 + .../messages/CameraOutgoingHeaders.java | 7 + .../CameraAuthenticationTicketEvent.java | 25 + .../incoming/CameraLoginStatusEvent.java | 71 + .../incoming/CameraResultURLEvent.java | 66 + .../CameraRoomThumbnailGeneratedEvent.java | 29 + .../incoming/CameraUpdateNotification.java | 42 + .../outgoing/CameraLoginComposer.java | 22 + .../outgoing/CameraRenderImageComposer.java | 39 + .../gameserver/GameByteDecoder.java | 60 + .../gameserver/GameMessageHandler.java | 67 + .../networking/gameserver/GameServer.java | 141 + .../networking/rconserver/RCONServer.java | 155 + .../rconserver/RCONServerHandler.java | 66 + src/main/java/com/eu/habbo/plugin/Event.java | 16 + .../com/eu/habbo/plugin/EventHandler.java | 41 + .../com/eu/habbo/plugin/EventListener.java | 5 + .../com/eu/habbo/plugin/EventPriority.java | 46 + .../java/com/eu/habbo/plugin/HabboPlugin.java | 37 + .../plugin/HabboPluginConfiguration.java | 8 + .../com/eu/habbo/plugin/PluginManager.java | 369 ++ .../plugin/events/bots/BotChatEvent.java | 22 + .../eu/habbo/plugin/events/bots/BotEvent.java | 20 + .../plugin/events/bots/BotPickUpEvent.java | 22 + .../plugin/events/bots/BotPlacedEvent.java | 30 + .../plugin/events/bots/BotSavedChatEvent.java | 47 + .../plugin/events/bots/BotSavedLookEvent.java | 37 + .../plugin/events/bots/BotSavedNameEvent.java | 23 + .../events/bots/BotServerItemEvent.java | 31 + .../plugin/events/bots/BotShoutEvent.java | 15 + .../plugin/events/bots/BotTalkEvent.java | 15 + .../plugin/events/bots/BotWhisperEvent.java | 24 + .../emulator/EmulatorConfigUpdatedEvent.java | 5 + .../plugin/events/emulator/EmulatorEvent.java | 7 + .../EmulatorLoadCatalogManagerEvent.java | 11 + .../EmulatorLoadItemsManagerEvent.java | 14 + .../events/emulator/EmulatorLoadedEvent.java | 13 + .../emulator/EmulatorStartShutdownEvent.java | 11 + .../events/emulator/EmulatorStoppedEvent.java | 11 + .../furniture/FurnitureDiceRolledEvent.java | 25 + .../events/furniture/FurnitureEvent.java | 21 + .../events/furniture/FurnitureMovedEvent.java | 33 + .../furniture/FurniturePickedUpEvent.java | 17 + .../furniture/FurniturePlacedEvent.java | 27 + .../furniture/FurnitureRedeemedEvent.java | 37 + .../furniture/FurnitureRolledEvent.java | 31 + .../furniture/FurnitureRoomTonerEvent.java | 27 + .../furniture/FurnitureRotatedEvent.java | 25 + .../events/furniture/FurnitureUserEvent.java | 24 + .../wired/WiredConditionFailedEvent.java | 34 + .../wired/WiredStackExecutedEvent.java | 44 + .../wired/WiredStackTriggeredEvent.java | 44 + .../habbo/plugin/events/games/GameEvent.java | 20 + .../events/games/GameHabboJoinEvent.java | 16 + .../events/games/GameHabboLeaveEvent.java | 16 + .../plugin/events/games/GameStartedEvent.java | 15 + .../plugin/events/games/GameStoppedEvent.java | 15 + .../plugin/events/games/GameUserEvent.java | 23 + .../guilds/GuildAcceptedMembershipEvent.java | 32 + .../events/guilds/GuildChangedBadgeEvent.java | 23 + .../guilds/GuildChangedColorsEvent.java | 30 + .../events/guilds/GuildChangedNameEvent.java | 29 + .../guilds/GuildChangedSettingsEvent.java | 28 + .../guilds/GuildDeclinedMembershipEvent.java | 38 + .../events/guilds/GuildDeletedEvent.java | 24 + .../plugin/events/guilds/GuildEvent.java | 20 + .../events/guilds/GuildFavoriteSetEvent.java | 24 + .../events/guilds/GuildGivenAdminEvent.java | 37 + .../events/guilds/GuildPurchasedEvent.java | 23 + .../events/guilds/GuildRemovedAdminEvent.java | 29 + .../guilds/GuildRemovedFavoriteEvent.java | 22 + .../guilds/GuildRemovedMemberEvent.java | 29 + .../events/inventory/InventoryEvent.java | 14 + .../inventory/InventoryItemAddedEvent.java | 12 + .../events/inventory/InventoryItemEvent.java | 16 + .../inventory/InventoryItemRemovedEvent.java | 12 + .../inventory/InventoryItemsAddedEvent.java | 16 + .../events/marketplace/MarketPlaceEvent.java | 7 + .../MarketPlaceItemCancelledEvent.java | 13 + .../MarketPlaceItemOfferedEvent.java | 18 + .../marketplace/MarketPlaceItemSoldEvent.java | 20 + .../navigator/NavigatorPopularRoomsEvent.java | 25 + .../navigator/NavigatorRoomCreatedEvent.java | 26 + .../navigator/NavigatorRoomDeletedEvent.java | 20 + .../events/navigator/NavigatorRoomsEvent.java | 26 + .../navigator/NavigatorSearchResultEvent.java | 33 + .../eu/habbo/plugin/events/pets/PetEvent.java | 21 + .../plugin/events/pets/PetTalkEvent.java | 19 + .../habbo/plugin/events/rooms/RoomEvent.java | 21 + .../plugin/events/rooms/RoomLoadedEvent.java | 16 + .../events/rooms/RoomUncachedEvent.java | 16 + .../events/rooms/RoomUnloadedEvent.java | 16 + .../events/rooms/RoomUnloadingEvent.java | 16 + .../plugin/events/roomunit/RoomUnitEvent.java | 27 + .../roomunit/RoomUnitLookAtPointEvent.java | 25 + .../events/roomunit/RoomUnitSetGoalEvent.java | 30 + .../plugin/events/support/SupportEvent.java | 20 + .../support/SupportRoomActionEvent.java | 45 + .../events/support/SupportTicketEvent.java | 20 + .../support/SupportUserAlertedEvent.java | 30 + .../support/SupportUserBannedEvent.java | 30 + .../events/support/SupportUserKickEvent.java | 30 + .../plugin/events/users/UserCommandEvent.java | 29 + .../plugin/events/users/UserCreditsEvent.java | 23 + .../events/users/UserDisconnectEvent.java | 14 + .../events/users/UserEnterRoomEvent.java | 26 + .../habbo/plugin/events/users/UserEvent.java | 20 + .../events/users/UserExecuteCommandEvent.java | 32 + .../events/users/UserExitRoomEvent.java | 32 + .../plugin/events/users/UserIdleEvent.java | 32 + .../plugin/events/users/UserKickEvent.java | 21 + .../plugin/events/users/UserLoginEvent.java | 26 + .../events/users/UserPickGiftEvent.java | 24 + .../plugin/events/users/UserPointsEvent.java | 30 + .../events/users/UserPublishPictureEvent.java | 35 + .../users/UserPurchasePictureEvent.java | 36 + .../events/users/UserRegisteredEvent.java | 15 + .../events/users/UserRightsGivenEvent.java | 18 + .../events/users/UserRightsTakenEvent.java | 22 + .../plugin/events/users/UserRolledEvent.java | 32 + .../events/users/UserSavedLookEvent.java | 24 + .../events/users/UserSavedMottoEvent.java | 21 + .../events/users/UserSavedSettingsEvent.java | 19 + .../events/users/UserSavedWardrobeEvent.java | 19 + .../events/users/UserTakeStepEvent.java | 31 + .../plugin/events/users/UserTalkEvent.java | 22 + .../users/UserTriggerWordFilterEvent.java | 23 + .../events/users/UserWiredRewardReceived.java | 40 + .../achievements/UserAchievementEvent.java | 24 + .../UserAchievementLeveledEvent.java | 32 + .../UserAchievementProgressEvent.java | 24 + .../users/catalog/UserCatalogEvent.java | 24 + .../UserCatalogFurnitureBoughtEvent.java | 29 + .../UserCatalogItemPurchasedEvent.java | 49 + .../friends/UserAcceptFriendRequestEvent.java | 17 + .../users/friends/UserFriendChatEvent.java | 25 + .../events/users/friends/UserFriendEvent.java | 21 + .../users/friends/UserRelationShipEvent.java | 20 + .../friends/UserRequestFriendshipEvent.java | 31 + .../habbo/threading/HabboExecutorService.java | 31 + .../RejectedExecutionHandlerImpl.java | 16 + .../com/eu/habbo/threading/ThreadPooling.java | 87 + .../runnables/AchievementUpdater.java | 42 + .../runnables/BackgroundAnimation.java | 37 + .../runnables/BanzaiRandomTeleport.java | 33 + .../runnables/BattleBanzaiTilesFlicker.java | 63 + .../threading/runnables/BotFollowHabbo.java | 55 + .../runnables/CameraClientAutoReconnect.java | 44 + .../threading/runnables/CannonKickAction.java | 49 + .../runnables/CannonResetCooldownAction.java | 22 + .../runnables/ChannelReadHandler.java | 31 + .../threading/runnables/ClearRentedSpace.java | 57 + .../habbo/threading/runnables/CloseGate.java | 36 + .../threading/runnables/CrackableExplode.java | 44 + .../habbo/threading/runnables/GameStop.java | 19 + .../runnables/GuardianNotAccepted.java | 33 + .../GuardianTicketFindMoreSlaves.java | 20 + .../runnables/GuardianVotingFinish.java | 27 + .../runnables/GuideFindNewHelper.java | 34 + .../runnables/HabboGiveHandItemToHabbo.java | 38 + .../runnables/HabboItemNewState.java | 30 + .../runnables/InsertModToolIssue.java | 46 + .../threading/runnables/KickBallAction.java | 83 + .../runnables/LoadCustomHeightMap.java | 20 + .../runnables/OneWayGateActionOne.java | 59 + .../runnables/OneWayGateActionTwo.java | 25 + .../habbo/threading/runnables/OpenGift.java | 67 + .../threading/runnables/PetClearPosture.java | 42 + .../threading/runnables/PetEatAction.java | 73 + .../threading/runnables/PetFollowHabbo.java | 62 + .../runnables/QueryDeleteHabboBadge.java | 34 + .../runnables/QueryDeleteHabboItem.java | 32 + .../runnables/QueryDeleteHabboItems.java | 43 + .../threading/runnables/RandomDiceNumber.java | 50 + .../runnables/RemoveFloorItemTask.java | 26 + .../threading/runnables/RoomTrashing.java | 173 + .../runnables/RoomUnitGiveHanditem.java | 30 + .../threading/runnables/RoomUnitKick.java | 30 + .../runnables/RoomUnitRideHorse.java | 44 + .../threading/runnables/RoomUnitTeleport.java | 38 + .../RoomUnitTeleportWalkToAction.java | 59 + .../RoomUnitVendingMachineAction.java | 58 + .../runnables/RoomUnitWalkToRoomUnit.java | 103 + .../threading/runnables/SaveScoreForTeam.java | 47 + .../threading/runnables/ShutdownEmulator.java | 30 + .../runnables/TeleportInteraction.java | 146 + .../runnables/UpdateModToolIssue.java | 36 + .../threading/runnables/WiredExecuteTask.java | 49 + .../runnables/WiredRepeatEffectTask.java | 33 + .../threading/runnables/WiredResetTimers.java | 24 + .../threading/runnables/YouAreAPirate.java | 108 + .../runnables/freeze/FreezeClearEffects.java | 25 + .../freeze/FreezeHandleSnowballExplosion.java | 110 + .../freeze/FreezeResetExplosionTiles.java | 27 + .../runnables/freeze/FreezeThrowSnowball.java | 37 + .../runnables/hopper/HopperActionFive.java | 35 + .../runnables/hopper/HopperActionFour.java | 30 + .../runnables/hopper/HopperActionOne.java | 45 + .../runnables/hopper/HopperActionThree.java | 68 + .../runnables/hopper/HopperActionTwo.java | 68 + .../teleport/TeleportActionFive.java | 48 + .../teleport/TeleportActionFour.java | 39 + .../runnables/teleport/TeleportActionOne.java | 43 + .../teleport/TeleportActionThree.java | 69 + .../runnables/teleport/TeleportActionTwo.java | 104 + .../java/com/eu/habbo/util/FigureUtil.java | 64 + .../eu/habbo/util/callback/HTTPPostError.java | 62 + .../habbo/util/callback/HTTPPostStatus.java | 40 + .../habbo/util/callback/HTTPVersionCheck.java | 77 + .../java/com/eu/habbo/util/crypto/ZIP.java | 33 + .../com/eu/habbo/util/figure/FigureUtil.java | 64 + .../habbo/util/imager/badges/BadgeImager.java | 340 ++ .../eu/habbo/util/pathfinding/Rotation.java | 27 + 1645 files changed, 116832 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 examples/RCON.php create mode 100644 pom.xml create mode 100644 sql-updates.sql create mode 100644 sqlupdates/1_0.10_TO_1_1.sql create mode 100644 sqlupdates/1_0_0_TO_1_0_1.sql create mode 100644 sqlupdates/1_0_1_TO_1_0_2.sql create mode 100644 sqlupdates/1_0_2_TO_1_0_3.sql create mode 100644 sqlupdates/1_0_3_TO_1_0_4.sql create mode 100644 sqlupdates/1_0_4_TO_1_0_5.sql create mode 100644 sqlupdates/1_0_5_TO_1_0_6.sql create mode 100644 sqlupdates/1_0_6_TO_1_0_7.sql create mode 100644 sqlupdates/1_0_7_TO_1_0_8.sql create mode 100644 sqlupdates/1_0_8_TO_1_0_9.sql create mode 100644 sqlupdates/1_0_9_TO_1_0_10.sql create mode 100644 sqlupdates/1_1_0_TO_1_2_0.sql create mode 100644 sqlupdates/1_2_0_TO_1_3_0.sql create mode 100644 sqlupdates/1_3_0_TO_1_4_0.sql create mode 100644 sqlupdates/1_4_0_TO_1_5_0.sql create mode 100644 sqlupdates/1_5_0_TO_1_6_0.sql create mode 100644 sqlupdates/1_6_0_TO_1_7_0.sql create mode 100644 sqlupdates/1_7_0_TO_1_8_0.sql create mode 100644 sqlupdates/1_8_0_TO_1_9_0.sql create mode 100644 sqlupdates/1_9_0_TO_1_10_0.sql create mode 100644 src/main/java/com/eu/habbo/Emulator.java create mode 100644 src/main/java/com/eu/habbo/core/CleanerThread.java create mode 100644 src/main/java/com/eu/habbo/core/CommandLog.java create mode 100644 src/main/java/com/eu/habbo/core/ConfigurationManager.java create mode 100644 src/main/java/com/eu/habbo/core/CreditsScheduler.java create mode 100644 src/main/java/com/eu/habbo/core/Disposable.java create mode 100644 src/main/java/com/eu/habbo/core/Easter.java create mode 100644 src/main/java/com/eu/habbo/core/ErrorLog.java create mode 100644 src/main/java/com/eu/habbo/core/Loggable.java create mode 100644 src/main/java/com/eu/habbo/core/Logging.java create mode 100644 src/main/java/com/eu/habbo/core/PixelScheduler.java create mode 100644 src/main/java/com/eu/habbo/core/PointsScheduler.java create mode 100644 src/main/java/com/eu/habbo/core/RoomUserPetComposer.java create mode 100644 src/main/java/com/eu/habbo/core/Scheduler.java create mode 100644 src/main/java/com/eu/habbo/core/TextsManager.java create mode 100644 src/main/java/com/eu/habbo/core/consolecommands/ConsoleCommand.java create mode 100644 src/main/java/com/eu/habbo/core/consolecommands/ConsoleInfoCommand.java create mode 100644 src/main/java/com/eu/habbo/core/consolecommands/ConsoleReconnectCameraCommand.java create mode 100644 src/main/java/com/eu/habbo/core/consolecommands/ConsoleShutdownCommand.java create mode 100644 src/main/java/com/eu/habbo/core/consolecommands/ConsoleTestCommand.java create mode 100644 src/main/java/com/eu/habbo/database/Database.java create mode 100644 src/main/java/com/eu/habbo/database/DatabasePool.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/GameEnvironment.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/achievements/Achievement.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/achievements/AchievementCategories.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/achievements/AchievementLevel.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackLevel.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/bots/Bot.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CalendarRewardObject.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogFeaturedPage.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogLimitedConfiguration.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPage.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/ClothItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/ClubOffer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/TargetOffer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/Voucher.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BadgeDisplayLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BotsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubAddonsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubFrontPageLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubLoyaltyLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CatalogRootLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubBuyLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubGiftsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ColorGroupingLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Default_3x3Layout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontPageFeaturedLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontpageLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildForumLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFrontpageLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFurnitureLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoDucketsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoLoyaltyLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoPetsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoRentablesLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/LoyaltyVipBuyLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceOwnItems.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetCustomizationLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets2Layout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets3Layout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ProductPage1Layout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecentPurchasesLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerInfoLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerPrizesLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomAdsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomBundleLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SingleBundle.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SoldLTDItemsLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SpacesLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TraxLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TrophiesLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/layouts/VipBuyLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/AboutCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/AlertCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/AllowTradingCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ArcturusCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/BadgeCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/BanCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/BlockAlertCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/BotsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ChangeNameCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ChatTypeCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/Command.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/CommandsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ConnectCameraCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ControlCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/CoordsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/CreditsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/DiagonalCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/DisconnectCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/EjectAllCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/EmptyBotsInventoryCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/EmptyInventoryCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/EmptyPetsInventoryCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/EnableCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/EventCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/FacelessCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/FastwalkCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/FreezeBotsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/FreezeCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/GiftCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/GiveRankCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/HabnamCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/HandItemCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/HappyHourCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertLinkCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/IPBanCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/LayCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MachineBanCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MassBadgeCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MassCreditsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MassGiftCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MassPixelsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MassPointsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MimicCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MoonwalkCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MultiCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MuteBotsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MuteCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/MutePetsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PetInfoCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PickallCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PixelCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PluginsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PointsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PullCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/PushCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RedeemCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomAlertCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomBundleCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomCreditsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomDanceCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomEffectCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomGiftCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomItemCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomKickCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomMuteCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomPixelsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/RoomPointsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SayAllCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SayCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SetMaxCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SetPollCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SetSpeedCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ShoutAllCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ShoutCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/ShutdownCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SitCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SitDownCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/StaffAlertCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/StaffOnlineCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/StalkCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SummonCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SummonRankCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SuperPullCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/SuperbanCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/TakeBadgeCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/TeleportCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/TestCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/TransformCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/TrashCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UnbanCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UnloadRoomCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UnmuteCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateBotsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateCatalogCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateConfigCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateGuildPartsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateHotelViewCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateItemsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdatePermissionsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdatePetDataCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdatePluginsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdatePollsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateTextsCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UpdateWordFilterCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/UserInfoCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/commands/WordQuizCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/crafting/CraftingAltar.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/crafting/CraftingManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/crafting/CraftingRecipe.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/gameclients/GameClientManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/Game.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/GamePlayer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/GameTeamColors.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGamePlayer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGameTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/football/FootballGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGamePlayer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGameTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/tag/BunnyrunGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/tag/IceTagGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/tag/RollerskateGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/tag/TagGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/tag/TagGamePlayer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/games/wired/WiredGame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuardianTicket.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuardianVote.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuardianVoteType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuideChatMessage.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuideManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuideRecommendStatus.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guides/GuideTour.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/Guild.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/GuildMember.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/GuildPart.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/GuildPartType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/GuildRank.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/GuildState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/SettingsState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForum.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumComment.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumThread.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/helper/TalentTrackTalentState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFame.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFameWinner.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/hotelview/HotelViewManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/hotelview/NewsList.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/hotelview/NewsWidget.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/CrackableReward.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/FurnitureType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/ICycleable.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/IEventTriggers.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/Item.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/ItemInteraction.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/NewUserGift.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/PostItColor.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/SoundTrack.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBackgroundToner.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBadgeDisplay.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBlackHole.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionClothing.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorPlate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorWheel.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCostumeHopper.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCustomValues.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDefault.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDice.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectToggle.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionExternalImage.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFXBox.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGift.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubHopper.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubTeleportTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionInformationTerminal.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionJukeBox.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionLoveLock.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMannequin.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMoodLight.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMusicDisc.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPostIt.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPoster.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPressurePlate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPushable.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPyramid.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoller.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomAds.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomOMatic.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStackHelper.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStickyPole.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTalkingFurniture.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTileEffectProvider.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVikingCotie.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWater.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWaterItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWired.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredCondition.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredEffect.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredExtra.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredHighscore.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredTrigger.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionYoutubeTV.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameScoreboard.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTeamItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTimer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiSphere.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTimer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateBlue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateGreen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateRed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateYellow.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboard.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardBlue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardGreen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardRed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardYellow.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootball.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootballGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoal.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalBlue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalGreen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalRed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalYellow.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboard.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardBlue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardGreen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardRed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardYellow.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeBlock.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeExitTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTimer.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGate.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateBlue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateGreen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateRed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateYellow.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboard.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardBlue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardGreen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardRed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardYellow.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagField.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagPole.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunField.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunPole.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagField.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagPole.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/rollerskate/InteractionRollerskateField.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/WiredTriggerReset.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionBattleBanzaiGameActive.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFreezeGameActive.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniTypeMatch.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionGroupMember.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboCount.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasEffect.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasHandItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboWearsBadge.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionLessTimeElapsed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMatchStatePosition.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMoreTimeElapsed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMottoContains.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotBattleBanzaiGameActive.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFreezeGameActive.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniTypeMatch.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboCount.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboHasEffect.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboWearsBadge.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInGroup.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotMatchStatePosition.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotTriggerOnFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamMember.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTriggerOnFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectAlert.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotClothes.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotFollowHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalk.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalkToHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectForwardToRoom.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveBadge.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveCredits.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDiamonds.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDuckets.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewBonusRarePoints.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewHofPoints.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveRespect.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveReward.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScore.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScoreToTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectJoinTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectKickHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLeaveTeam.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLowerFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniAway.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTowards.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveRotateFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMuteHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRaiseFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectResetTimers.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRollerSpeed.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTeleport.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleRandom.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTriggerStacks.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectWhisper.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraRandom.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraUnseen.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtSetTime.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtTimeLong.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedHabbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerCollision.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerFurniStateToggled.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameEnds.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameStarts.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboEntersRoom.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysKeyword.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOffFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOnFurni.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeater.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeaterLong.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerScoreAchieved.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/messenger/FriendRequest.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/messenger/Message.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/messenger/Messenger.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/messenger/MessengerBuddy.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/CfhActionType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/CfhCategory.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/CfhTopic.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBan.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBanType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolCategory.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatLog.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataContext.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatlogType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolIssue.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolPreset.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolRoomVisit.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/WordFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/modtool/WordFilterWord.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/DisplayMode.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/ListMode.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFavoriteFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterComparator.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterField.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorHotelFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicCategory.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorRoomAdsFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorUserFilter.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/SearchAction.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/navigation/SearchResultList.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/permissions/PermissionSetting.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/permissions/PermissionsManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/permissions/Rank.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/AbstractPet.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/GnomePet.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/HorsePet.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/IPetLook.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/MonsterplantPet.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/Pet.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetBreedingReward.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetData.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetGestures.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetRace.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetTasks.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetVocal.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/pets/PetVocalsType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/polls/Poll.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/polls/PollManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/polls/PollQuestion.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/CustomRoomLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/Room.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomBan.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomCategory.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessageBubbles.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomMoodlightData.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightLevels.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomTileState.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomTrade.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomTradeUser.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitEffect.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserAction.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserRotation.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/DanceType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/Habbo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboBadge.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboGender.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboManager.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorPersonalDisplayMode.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorWindowSettings.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/HabboStats.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/SignType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/inventory/BadgesComponent.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/inventory/EffectsComponent.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/inventory/PetsComponent.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/users/inventory/WardrobeComponent.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredConditionType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredEffectType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredGiveRewardItem.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreClearType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreData.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreScoreType.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredMatchFurniSetting.java create mode 100644 src/main/java/com/eu/habbo/habbohotel/wired/WiredTriggerType.java create mode 100644 src/main/java/com/eu/habbo/messages/ClientMessage.java create mode 100644 src/main/java/com/eu/habbo/messages/ISerialize.java create mode 100644 src/main/java/com/eu/habbo/messages/PacketManager.java create mode 100644 src/main/java/com/eu/habbo/messages/PacketManager_1006.java create mode 100644 src/main/java/com/eu/habbo/messages/ServerMessage.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/Incoming.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/Incoming_1006.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/Incoming_20160101.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/Incoming_Back.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementConfigurationEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorAlertCommandEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorVisitCommandEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/camera/CameraPublishToWebEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/camera/CameraPurchaseEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomPictureEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomThumbnailEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/camera/RequestCameraConfigurationEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemAsGiftEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogSearchedItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/CheckPetNameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackCodeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RedeemVoucherEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogIndexEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogModeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogPageEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubGiftsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestDiscountEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestGiftConfigurationEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestMarketplaceConfigEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/RequestPetBreedsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestItemInfoEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOffersEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOwnItemsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestSellItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/SellItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/OpenRecycleBoxEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/ReloadRecyclerEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RequestRecyclerLogicEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingAddRecipeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesAvailableEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarForceOpenEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarOpenDayEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestBlockedTilesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestDoorSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/AcceptFriendRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/ChangeRelationEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/DeclineFriendRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/FindNewFriendsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/FriendPrivateMessageEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/FriendRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/InviteFriendsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/RemoveFriendEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendRequestsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/RequestInitFriendsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/SearchUserEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/friends/StalkFriendEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterJoinGameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLeaveGameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLoadGameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestAccountStatusEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGameStatusEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGamesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianAcceptRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianNoUpdatesWantedEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianVoteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideCancelHelpRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideCloseHelpRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideHandleHelpRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideInviteUserEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideRecommendHelperEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideReportHelperEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserMessageEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserTypingEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/GuideVisitUserEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideAssistanceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideToolEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GetHabboGuildBadgesMessageEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildAcceptMembershipEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeBadgeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeColorsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeNameDescEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildConfirmRemoveMemberEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeclineMembershipEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeleteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveAdminEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveFavoriteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveMemberEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetAdminEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetFavoriteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildFurniWidgetEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildInfoEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildJoinEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildManageEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildMembersEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildPartsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/RequestOwnGuildsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateMessageEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateThreadEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumPostThreadEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsMessagesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumUpdateSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/GenerateSecretKeyEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/MachineIDEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/PingEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/ReleaseVersionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/RequestBannerToken.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent_BACKUP.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer4.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer5.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/handshake/UsernameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/helper/RequestTalentTrackEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewClaimBadgeRewardEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBadgeRewardEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBonusRareEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/hotelview/RequestNewsListEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBadgesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBotsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryItemsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryPetsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/inventory/TestInventoryEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolAlertEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolChangeRoomSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolCloseTicketEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueChangeTopicEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolPickTicketEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolReleaseTicketEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestIssueChatlogEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomChatlogEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomInfoEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomUserChatlogEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomVisitsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserChatlogEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserInfoEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRoomAlertEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ReportBullyEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ReportEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/ReportFriendPrivateChatEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportUserBullyingEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/modtool/StartSafetyQuizEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCategoryListModeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCollapseCategoryEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorUncollapseCategoryEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/NewNavigatorActionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCanCreateRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestDeleteRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestHighestScoreRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestMyRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNavigatorSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPopularRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPromotedRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPublicRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestRoomCategoriesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/RequestTagsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SaveWindowSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsByTagEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsNowEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsOwnEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsInGroupEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsMyFavouriteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsVisitedEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsWithRightsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/polls/AnswerPollEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/polls/CancelPollEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/polls/GetPollDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/HandleDoorbellEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestHeightmapEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomHeightmapEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomLoadEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomRightsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomWordFilterEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomBackgroundEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomFavoriteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomMuteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomPlacePaintEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveAllRightsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveRightsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRequestBannedUsersEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomSettingsSaveEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomStaffPickEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomVoteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/RoomWordFilterModifyEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/SetHomeRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPickupEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPlaceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSaveSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/AdvertisingSaveEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/CloseDiceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/FootballGateSaveLookEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveLookEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveNameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightTurnOnEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoveWallItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItDeleteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItRequestDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItSaveDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemClothingEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPickupItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/RotateMoveItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/SavePostItStickyPoleEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/SetStackHelperHeightEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleWallItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerColorWheelEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerDiceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerOneWayGateEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxAddSoundTrackEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventOne.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventTwo.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRemoveSoundTrackEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRequestPlayListEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/lovelock/LoveLockStartConfirmEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceCancelEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestNextVideoEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlayListEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestVideoDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedPetsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CompostMonsterplantEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseUseItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPackageNameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPickupEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPlaceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetInformationEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetTrainingPanelEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ScratchPetEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ToggleMonsterplantBreedableEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/RequestPromotionRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/UpdateRoomPromotionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/IgnoreRoomUserEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RequestRoomUserTagsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserActionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserBanEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDanceEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDropHandItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveHandItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRespectEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRightsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserKickEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserLookAtPoint.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserMuteEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserRemoveRightsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserShoutEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSignEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSitEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStartTypingEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStopTypingEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserTalkEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWhisperEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnIgnoreRoomUserEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnbanRoomUserEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeAcceptEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelOfferItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeCloseEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeConfirmEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferItemEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferMultipleItemsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeStartEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/trading/TradeUnAcceptEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/unknown/RequestResolutionEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent1.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent2.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/ActivateEffectEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/ChangeNameCheckUsernameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/ConfirmChangeNameEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/EnableEffectEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/PickNewUserGiftEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestMeMenuSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestProfileFriendsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCitizinShipEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestUserClubEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCreditsEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestUserDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestUserProfileEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestUserWardrobeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/RequestWearingBadgesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/SaveBlockCameraFollowEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/SaveIgnoreRoomInvitesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/SaveMottoEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/SavePreferOldChatEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/SaveUserVolumesEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/UserActivityEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/UserNuxEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/UserSaveLookEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/users/UserWearBadgeEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/wired/WiredConditionSaveDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/wired/WiredEffectSaveDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/incoming/wired/WiredTriggerSaveDataEvent.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/MessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/Outgoing_1006.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/Outgoing_Back.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/TestComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementProgressComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementUnlockedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentLevelUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentTrackComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/camera/CameraCompetitionStatusComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPriceComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPublishWaitMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPurchaseSuccesfullComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/camera/CameraRoomThumbnailSavedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/camera/CameraURLComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertLimitedSoldOutComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseFailedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseUnavailableComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogModeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPagesListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogSearchResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogUpdatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubCenterDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/DiscountComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftConfigurationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftReceiverNotFoundComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/NotEnoughPointsTypeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBoughtNotificationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBreedsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/PetNameErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/PurchaseOKComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerCompleteComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerLogicComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherOKComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/ReloadRecyclerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceBuyErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceCancelSaleComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceConfigComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemPostedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOffersComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOwnItemsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceSellItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftableProductsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipesAvailableComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarProductComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxCloseComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxPrizeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxStartOpenComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionCompletedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionProgressComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorBlockedTilesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorDoorSettingsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/FriendChatMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/FriendFindingRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/FriendNotificationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/FriendsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/LoadFriendRequestsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/MessengerInitComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/RemoveFriendComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/StalkErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/UpdateFriendComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/friends/UserSearchResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAccountInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAchievementsConfigurationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpJoinQueueComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLeaveQueueComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameURLComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpUnloadGameComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/MinimailCountComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/PickMonthlyClubGiftNotificationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BotErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertKeys.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/CustomNotificationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericErrorMessagesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelClosesAndWillOpenAtComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesAndBackInComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/MessagesForYouComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/PetErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertAndOpenHabboWayComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWIthLinkAndOpenHabboWayComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWithLinkComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/UpdateFailedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/WiredRewardAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/generic/testcomposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianNewReportReceivedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingRequestedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingTimeEnded.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingVotesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/BullyReportClosedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionAttachedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionDetachedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionEndedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionInvitedToGuideRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsPlayingComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsTypingComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionRequesterRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionStartedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guides/GuideToolsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildAcceptMemberErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBoughtComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBuyRoomsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildConfirmRemoveMemberComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildEditFailComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFavoriteRoomUserUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFurniWidgetComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildJoinErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildManageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMemberUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMembersComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildPartsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildRefreshMembersListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/RemoveGuildFromRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumAddCommentComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumCommentsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadMessagesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumsUnreadMessagesCountComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer6.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer7.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer1.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer2.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/BannerTokenComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/DebugConsoleComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/ForumsTestComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/MachineIDComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/PongComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/SecureLoginOKComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/SessionRightsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/handshake/SomeConnectionComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/BonusRareComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HallOfFameComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewBadgeButtonConfigComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCatalogPageExpiringComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCommunityGoalComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewConcurrentUsersComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCustomTimerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewNextLTDAvailableComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/hotelview/NewsListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/AddBotComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/AddHabboItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/AddPetComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListAddComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListEffectEnableComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListRemoveComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryAchievementsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBadgesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBotsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryPetsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryRefreshComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveBotComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveHabboItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/RemovePetComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/inventory/UserEffectsListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportRequestComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportedMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/CfhTopicsMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/HelperRequestDisabledComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueChatlogComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandledComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandlerDimensionsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueResponseAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolReportReceivedAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomChatlogComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolSanctionInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserChatlogComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserRoomVisitsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/modtool/ReportRoomFormComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateEventComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCategoryUserCountComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCollapsedCategoriesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorLiftedRoomsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorMetaDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSavedSearchesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSearchResultsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSettingsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/OpenRoomCreationWindowComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/PrivateRoomsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCategoriesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCreatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/navigator/TagsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/polls/PollQuestionsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/polls/PollStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswersComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/BotSettingsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/DoorbellAddUserComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/FavoriteRoomChangedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/FloodCounterComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/ForwardToRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/FreezeLivesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/HideDoorbellComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/KnockKnockUnknownComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAccessDeniedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAddRightsListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomBannedUsersComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomChatSettingsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEditSettingsErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEnterErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEntryInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFilterWordsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFloorThicknessUpdatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomHeightMapComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomModelComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomMutedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomNoRightsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOpenComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOwnerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaintComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaneComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRelativeMapComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRemoveRightsListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomScoreComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsSavedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsUpdatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomThicknessComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/UpdateStackHeightComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddFloorItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddWallItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemOnRollerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/ItemStateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/MoodLightDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItStickyPoleOpenComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveFloorItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveWallItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomFloorItemsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomWallItemsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/UpdateStackHeightTileHeightComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/WallItemUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxMySongsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxNowPlayingMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListAddSongComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListUpdatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlaylistFullComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackCodeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFinishedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFriendConfirmedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknown2Composer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknownComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeDisplayListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeVideoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/CantScratchPetNotOldEnoughComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetInformationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetLevelUpComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageNameValidationComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetStatusUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetTrainingPanelComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetExperienceComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetHorseFigureComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetRespectComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingCompleted.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingFailedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartFailedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/PromoteOwnRoomsListComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/ChangeNameUpdatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitIdleComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitUpdateUsernameComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserActionComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDanceComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserEffectComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserHandItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserIgnoredComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserNameChangedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserReceivedHandItemComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveRightsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRespectComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserShoutComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserStatusComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTagsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTalkComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTypingComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserUnbannedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserWhisperComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersAddGuildBadgeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersGuildBadgesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading.zip create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/OtherTradingDisabledComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeAcceptedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCloseWindowComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeClosedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCompleteComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartFailComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradeUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/TradingWaitingConfirmComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/trading/YouTradingDisabledComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/BuildersClubExpiredComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/CloseWebPageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ClubDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/CompetitionEntrySubmitResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ConvertedForwardToRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/EpicPopupFrameComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ErrorLoginComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ExtendClubMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboMallComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboNameChangedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelClosedAndOpensComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewExpiringCatalogPageCommposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewHideCommunityVoteButtonComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewNextLTDAvailableComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemExtraDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemStateComposer2.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemsDataUpdateComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/MessengerErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/MinimailNewMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolComposerOne.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolSanctionDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/MostUselessErrorAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/MysteryPrizeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserGiftComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserIdentityComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/NuxAlertComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/PetLevelUpdatedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestCompletedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestExpiredComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestionInfoComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RemoveRoomEventComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RentableItemBuyOutPriceComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomAdErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomCategoryUpdateMessageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomMessagesPostedCountComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown2Composer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown3Composer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUserQuestionAnsweredComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsAddUserComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsCompose1.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsFullGameStatusComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGameStartedErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGenericErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsInitGameArena.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsJoinErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLevelDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLoadingArenaComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLongDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnGameEnding.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageEnding.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageRunningComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPlayNowWindowComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPreviousRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuePositionComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuickJoinComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsRemoveUserComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsResetTimerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsStartLobbyCounter.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUnknownComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserChatComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserEnteredArenaComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserExitArenaComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailFailedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailVerifiedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/TargetedOfferComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAdManagerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAvatarEditorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCatalogPageOfferComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCompetitionComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer4.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer5.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer6.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer8.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownFurniModelComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuild2Composer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer3.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHabboWayQuizComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHelperComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHintComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownMessengerErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownPollQuestionComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomDesktopComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomViewerComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownStatusComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownTradeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownWiredComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/UnkownPetPackageComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobileNumberComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneCodeWindowComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneDoneComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneWindowComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/VipTutorialsStartComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/WatchAndEarnRewardComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftErrorComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/AddUserBadgeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/ChangeNameCheckResultComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/ClubGiftReceivedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/FavoriteRoomsCountComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/MeMenuSettingsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/MutedWhisperComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/ProfileFriendsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UpdateUserLookComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserAchievementScoreComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserBCLimitsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserBadgesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserCitizinShipComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserClothesComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserClubComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserCreditsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserCurrencyComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserHomeRoomComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserPerksComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserPermissionsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserPointsComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/users/UserWardrobeComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/wired/WiredConditionDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/wired/WiredEffectDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/wired/WiredSavedComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/outgoing/wired/WiredTriggerDataComposer.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/AlertUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/ChangeRoomOwner.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/CreateModToolTicket.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/DisconnectUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/ExecuteCommand.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/ForwardUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/FriendRequest.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/GiveBadge.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/GivePixels.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/GivePoints.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/HotelAlert.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/ImageHotelAlert.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/MuteUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/ProgressAchievement.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/RCONMessage.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/SendGift.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/SendRoomBundle.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/SetRank.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/StaffAlert.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/StalkUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/TalkUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/UpdateCatalog.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/UpdateUser.java create mode 100644 src/main/java/com/eu/habbo/messages/rcon/UpdateWordfilter.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraClient.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraDecoder.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraHandler.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraIncomingMessage.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraMessage.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraOutgoingMessage.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/CameraPacketHandler.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/CameraOutgoingHeaders.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraAuthenticationTicketEvent.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraLoginStatusEvent.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraResultURLEvent.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraRoomThumbnailGeneratedEvent.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraUpdateNotification.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraLoginComposer.java create mode 100644 src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraRenderImageComposer.java create mode 100644 src/main/java/com/eu/habbo/networking/gameserver/GameByteDecoder.java create mode 100644 src/main/java/com/eu/habbo/networking/gameserver/GameMessageHandler.java create mode 100644 src/main/java/com/eu/habbo/networking/gameserver/GameServer.java create mode 100644 src/main/java/com/eu/habbo/networking/rconserver/RCONServer.java create mode 100644 src/main/java/com/eu/habbo/networking/rconserver/RCONServerHandler.java create mode 100644 src/main/java/com/eu/habbo/plugin/Event.java create mode 100644 src/main/java/com/eu/habbo/plugin/EventHandler.java create mode 100644 src/main/java/com/eu/habbo/plugin/EventListener.java create mode 100644 src/main/java/com/eu/habbo/plugin/EventPriority.java create mode 100644 src/main/java/com/eu/habbo/plugin/HabboPlugin.java create mode 100644 src/main/java/com/eu/habbo/plugin/HabboPluginConfiguration.java create mode 100644 src/main/java/com/eu/habbo/plugin/PluginManager.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotChatEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotPickUpEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotPlacedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotSavedChatEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotSavedLookEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotSavedNameEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotServerItemEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotShoutEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotTalkEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/bots/BotWhisperEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorConfigUpdatedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadCatalogManagerEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadItemsManagerEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStartShutdownEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStoppedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureDiceRolledEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureMovedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePickedUpEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePlacedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRedeemedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRolledEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRoomTonerEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRotatedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureUserEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredConditionFailedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackExecutedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackTriggeredEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/games/GameEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/games/GameHabboJoinEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/games/GameHabboLeaveEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/games/GameStartedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/games/GameStoppedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/games/GameUserEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildAcceptedMembershipEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedBadgeEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedColorsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedNameEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeclinedMembershipEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeletedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildFavoriteSetEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildGivenAdminEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildPurchasedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedAdminEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedFavoriteEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedMemberEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/inventory/InventoryEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemAddedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemRemovedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemsAddedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemCancelledEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemOfferedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemSoldEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorPopularRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomCreatedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomDeletedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorSearchResultEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/pets/PetEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/pets/PetTalkEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/rooms/RoomEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/rooms/RoomLoadedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/rooms/RoomUncachedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadingEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitLookAtPointEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/support/SupportEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/support/SupportRoomActionEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/support/SupportTicketEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/support/SupportUserAlertedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/support/SupportUserBannedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/support/SupportUserKickEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserCommandEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserCreditsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserDisconnectEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserEnterRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserExecuteCommandEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserExitRoomEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserIdleEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserKickEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserLoginEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserPickGiftEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserPointsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserPublishPictureEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserPurchasePictureEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserRegisteredEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserRightsGivenEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserRightsTakenEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserRolledEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserSavedLookEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserSavedMottoEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserSavedSettingsEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserSavedWardrobeEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserTakeStepEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserTalkEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserTriggerWordFilterEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/UserWiredRewardReceived.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementLeveledEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementProgressEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogFurnitureBoughtEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogItemPurchasedEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/friends/UserAcceptFriendRequestEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendChatEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/friends/UserRelationShipEvent.java create mode 100644 src/main/java/com/eu/habbo/plugin/events/users/friends/UserRequestFriendshipEvent.java create mode 100644 src/main/java/com/eu/habbo/threading/HabboExecutorService.java create mode 100644 src/main/java/com/eu/habbo/threading/RejectedExecutionHandlerImpl.java create mode 100644 src/main/java/com/eu/habbo/threading/ThreadPooling.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/AchievementUpdater.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/BackgroundAnimation.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/BanzaiRandomTeleport.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/BattleBanzaiTilesFlicker.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/CameraClientAutoReconnect.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/CannonKickAction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/CannonResetCooldownAction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/ChannelReadHandler.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/CloseGate.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/GameStop.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/GuardianNotAccepted.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/GuardianTicketFindMoreSlaves.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/GuardianVotingFinish.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/GuideFindNewHelper.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/HabboGiveHandItemToHabbo.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/HabboItemNewState.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/InsertModToolIssue.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/KickBallAction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/LoadCustomHeightMap.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionTwo.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/OpenGift.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/PetClearPosture.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboBadge.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItem.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItems.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RandomDiceNumber.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RemoveFloorItemTask.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomTrashing.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitGiveHanditem.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitKick.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitRideHorse.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/SaveScoreForTeam.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/ShutdownEmulator.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/UpdateModToolIssue.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/WiredExecuteTask.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/WiredRepeatEffectTask.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/WiredResetTimers.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/YouAreAPirate.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeClearEffects.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeHandleSnowballExplosion.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeResetExplosionTiles.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeThrowSnowball.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFour.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionTwo.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFour.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionOne.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java create mode 100644 src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionTwo.java create mode 100644 src/main/java/com/eu/habbo/util/FigureUtil.java create mode 100644 src/main/java/com/eu/habbo/util/callback/HTTPPostError.java create mode 100644 src/main/java/com/eu/habbo/util/callback/HTTPPostStatus.java create mode 100644 src/main/java/com/eu/habbo/util/callback/HTTPVersionCheck.java create mode 100644 src/main/java/com/eu/habbo/util/crypto/ZIP.java create mode 100644 src/main/java/com/eu/habbo/util/figure/FigureUtil.java create mode 100644 src/main/java/com/eu/habbo/util/imager/badges/BadgeImager.java create mode 100644 src/main/java/com/eu/habbo/util/pathfinding/Rotation.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1af1b635 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.idea/ +target/** +TODO.txt +packet.pkt +plugins/** +src/main/resources/ +src/test/ +logging/ +target/ +config.ini +*.txt +logging/** +logging/ diff --git a/README.md b/README.md new file mode 100644 index 00000000..5261d776 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# **Arcturus Emulator is released under the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.txt). Modifications are allowed but must disclosed. Changes in the about menu are forbidden as they are part of the license.** # + +# Arcturus Emulator # + +## **To Get The Camera To Work Visit http://arcturus.wf and register.** ## +## **TUTORIAL FOR PLUGINS http://arcturus.wf/thread-2415.html** ## +# **DO NOT EDIT THE SOURCE. USE THE PLUGIN API.** # +## Current Stable Version: 1.9.0 ## +Arcturus Emulator is a Habbo emulator written in Java aiming to be an exact clone of the offical server. + +Targeting PRODUCTION-201611291003-338511768 + +Download SWF: http://arcturus.wf/mirrors/asmd_PRODUCTION-201611291003-338511768.swf + +# **Compiled version (Including Database): http://arcturus.wf/mirrors/ArcturusEmulator_1.9.0.zip** # + +Latest Compiled Version: http://arcturus.wf:8080 + +Older Files: http://arcturus.wf/mirrors/ + +Icons: http://arcturus.wf/mirrors/icons.zip + +JavaDoc: http://arcturus.wf/doc/ + +SCRIPTS for developers: http://arcturus.wf/mirrors/PRODUCTION-201611291003-338511768_scripts.txt +### Contributing ### + +Anyone is allowed to contribute to the project. Reporting bugs and issues goes via the issue tracker. + +You can request features in the issue tracker. + +### Plugins ### +An example plugin can be found here: https://bitbucket.org/Wesley12312/pluginexample + +Here is a list of cool plugins you can download: + +* Kickwars: https://bitbucket.org/Wesley12312/kickwars-plugin +* Bubble Alerts: https://bitbucket.org/Wesley12312/arcturus-bubble-alerts-plugin +* Essentials: https://bitbucket.org/Wesley12312/arcturus-essentials-plugin + +If you want the link to your plugin repository to be added, create an issue. + +### Contact ### + +* http://arcturus.wf/ | Main forums. \ No newline at end of file diff --git a/examples/RCON.php b/examples/RCON.php new file mode 100644 index 00000000..dcb34c18 --- /dev/null +++ b/examples/RCON.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..ccb86419 --- /dev/null +++ b/pom.xml @@ -0,0 +1,166 @@ + + + 4.0.0 + + com.eu.habbo + Habbo + 1.10.0 + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4.1 + + + jar-with-dependencies + + + + com.eu.habbo.Emulator + + + + + + make-assembly + package + + single + + + + + + + + + + central + http://repo1.maven.org/maven2/ + + + + + + + io.netty + netty-all + 4.1.15.Final + + + + io.netty + netty-codec-http + 4.1.15.Final + compile + + + + io.netty + netty-codec-http2 + 4.1.15.Final + compile + + + + io.netty + netty-handler + 4.1.15.Final + compile + + + + + com.google.code.gson + gson + 2.3.1 + + + + + mysql + mysql-connector-java + 5.1.37 + runtime + + + + + net.sf.trove4j + trove4j + 3.0.3 + compile + + + + + com.zaxxer + HikariCP + 2.6.0 + compile + + + + org.apache.commons + commons-lang3 + 3.4 + compile + + + org.apache.commons + commons-math + 2.2 + compile + + + + org.jsoup + jsoup + 1.8.3 + compile + + + + mysql + mysql-connector-java + 5.1.32 + + + + org.slf4j + slf4j-api + 1.7.21 + + + + org.slf4j + slf4j-simple + 1.7.21 + + + + joda-time + joda-time + 2.5 + + + + \ No newline at end of file diff --git a/sql-updates.sql b/sql-updates.sql new file mode 100644 index 00000000..89cebc63 --- /dev/null +++ b/sql-updates.sql @@ -0,0 +1,4 @@ +ALTER TABLE `achievements` +CHANGE COLUMN `pixels` `reward_amount` int(11) NOT NULL DEFAULT 100 AFTER `level`, +ADD COLUMN `reward_currency` int(11) NOT NULL DEFAULT 0 AFTER `level`; + diff --git a/sqlupdates/1_0.10_TO_1_1.sql b/sqlupdates/1_0.10_TO_1_1.sql new file mode 100644 index 00000000..eb543e7d --- /dev/null +++ b/sqlupdates/1_0.10_TO_1_1.sql @@ -0,0 +1,27 @@ +#DATABASE UPDATE: 1.0.10 -> 1.1.0 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.error.cmd_unmute.not_specified', 'No user specified to unmute!'), + ('commands.error.cmd_unmute.not_found', '%user% is not online!'), + ('commands.succes.cmd_unmute', '%user% has been unmuted!'), + ('commands.keys.cmd_unmute', 'unmute'), + ('commands.description.cmd_unmute', ':unmute '); + +ALTER TABLE `permissions` ADD `cmd_unmute` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_unload`; + +ALTER TABLE `bans` ADD `timestamp` INT NOT NULL AFTER `user_staff_id`; + +ALTER TABLE `permissions` ADD `cmd_give_rank` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_gift`; + +INSERT INTO`emulator_texts` (`key`, `value`) VALUES + ('commands.keys.cmd_give_rank', 'giverank;setrank;give_rank;set_rank'), + ('commands.description.cmd_give_rank', ':giverank '), + ('commands.error.cmd_give_rank.not_found', 'Rank %id% was not found!'), + ('commands.succes.cmd_give_rank.updated', '%username% has been given the rank %id%'), + ('commands.error.cmd_give_rank.higher', 'You cannot rank %username% to a higher rank than you are!'), + ('commands.error.cmd_give_rank.user_offline', '%username% is not online!'), + ('commands.error.cmd_give_rank.missing_rank', 'Missing rank. Usage: '), + ('commands.error.cmd_give_rank.missing_username', 'Missing username. Usage: '), + ('commands.generic.cmd_give_rank.new_rank', 'Your rank has been updated. Your rank is now %id%'); + +#END DATABASE UPDATE: 1.0.10 -> 1.1.0 \ No newline at end of file diff --git a/sqlupdates/1_0_0_TO_1_0_1.sql b/sqlupdates/1_0_0_TO_1_0_1.sql new file mode 100644 index 00000000..aadb1740 --- /dev/null +++ b/sqlupdates/1_0_0_TO_1_0_1.sql @@ -0,0 +1,79 @@ +#DATABASE UPDATE: 1.0.0 -> 1.0.1 + +#IF YOU GET ERRORS ON THIS PROCEDURE, JUST DROP THE acc_kickwars COLUMN FROM THE permissions TABLE!! + +drop procedure if exists drop_acc_kickwars; +delimiter ';;' +create procedure drop_acc_kickwars() begin + + if exists (select * from information_schema.columns where table_name = 'permissions' and column_name = 'acc_kickwars') then + alter table permissions drop column `acc_kickwars`; + end if; + +end;; + +delimiter ';' +call drop_acc_kickwars(); + +drop procedure if exists drop_acc_kickwars; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.navigator.camera', '1'); +ALTER TABLE `navigator_flatcats` ADD `max_user_count` INT( 11 ) NOT NULL DEFAULT '100'; +ALTER TABLE `navigator_flatcats` ADD `public` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; +DELETE FROM `navigator_flatcats`; +ALTER TABLE `navigator_flatcats` AUTO_INCREMENT = 1; +INSERT INTO `navigator_flatcats` (`id`, `min_rank`, `caption`, `can_trade`, `max_user_count`, `public`) VALUES + (NULL, '1', '${navigator.flatcategory.global.BC}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.BUILDING}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.CHAT}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.FANSITE}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.GAMES}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.HELP}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.LIFE}', '0', '100', '0'), + (NULL, '7', '${navigator.flatcategory.global.OFFICIAL}', '0', '100', '1'), + (NULL, '1', '${navigator.flatcategory.global.PARTY}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.PERSONAL}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.REVIEWS}', '0', '100', '0'), + (NULL, '1', '${navigator.flatcategory.global.TRADING}', '1', '100', '0'); + +CREATE TABLE `navigator_publiccats` ( +`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , +`name` VARCHAR( 32 ) NOT NULL DEFAULT 'Staff Picks', +`visible` ENUM( '0', '1' ) NOT NULL DEFAULT '1' +) ENGINE = MYISAM ; + +INSERT INTO `navigator_publiccats` (`id`, `name`) VALUES + ('1', 'Staff Picks'), + ('2', 'Official Games'), + ('3', 'Official Fansites'), + ('4', 'BAW: Builders at Work'), + ('5', 'Room Bundles'), + ('6', 'Safety'); + +DROP TABLE `navigator_publics`; + +CREATE TABLE `navigator_publics` ( +`public_cat_id` INT NOT NULL , +`room_id` INT NOT NULL, +`visible` ENUM( '0', '1' ) NOT NULL DEFAULT '1' +) ENGINE = MYISAM ; + +CREATE TABLE `navigator_filter` ( +`field` VARCHAR( 32 ) NOT NULL , +`compare` ENUM( 'equals', 'equals_ignore_case', 'contains' ) NOT NULL +) ENGINE = MYISAM ; + +INSERT INTO `navigator_filter` (`field`, `compare`) VALUES + ('ownerName', 'equals'), + ('description', 'contains'), + ('name', 'contains'), + ('tags', 'equals'); + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.keys.cmd_update_hotel_view', 'update_view;update_hotel_view;update_hotelview'), + ('commands.description.cmd_update_hotel_view', ':update_hotel_view'), + ('commands.succes.cmd_update_hotel_view', 'Hotelview reloaded!'); + +ALTER TABLE `permissions` ADD `cmd_update_hotel_view` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_update_guildparts`; + +#END DATABASE UPDATE 1.0.0 -> 1.0.1 \ No newline at end of file diff --git a/sqlupdates/1_0_1_TO_1_0_2.sql b/sqlupdates/1_0_1_TO_1_0_2.sql new file mode 100644 index 00000000..00750fe3 --- /dev/null +++ b/sqlupdates/1_0_1_TO_1_0_2.sql @@ -0,0 +1,22 @@ +#DATABASE UPDATE: 1.0.1 -> 1.0.2 + +CREATE TABLE `users_clothing` ( +`user_id` INT NOT NULL , +`clothing_id` INT NOT NULL , +UNIQUE ( +`user_id` , +`clothing_id` +) +) ENGINE = MYISAM ; + +#FILLING PERMISSIONS TABLE TILL RANK 7. + +INSERT INTO permissions (id, rank_name) VALUES (1, 'rank_1'); +INSERT INTO permissions (id, rank_name) VALUES (2, 'rank_2'); +INSERT INTO permissions (id, rank_name) VALUES (3, 'rank_3'); +INSERT INTO permissions (id, rank_name) VALUES (4, 'rank_4'); +INSERT INTO permissions (id, rank_name) VALUES (5, 'rank_5'); +INSERT INTO permissions (id, rank_name) VALUES (6, 'rank_6'); +INSERT INTO permissions (id, rank_name) VALUES (7, 'rank_7'); + +#END DATABASE UPDATE: 1.0.1 -> 1.0.2 \ No newline at end of file diff --git a/sqlupdates/1_0_2_TO_1_0_3.sql b/sqlupdates/1_0_2_TO_1_0_3.sql new file mode 100644 index 00000000..4b12effc --- /dev/null +++ b/sqlupdates/1_0_2_TO_1_0_3.sql @@ -0,0 +1,9 @@ +#DATABASE UPDATE: 1.0.2 -> 1.0.3 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_bundle', 'Roombundle succesfully created with page id %id%'); +ALTER TABLE `users_settings` CHANGE `can_trade` `can_trade` ENUM( '0', '1' ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '1'; +UPDATE `users_settings` SET `can_trade` = '1'; +ALTER TABLE `rooms` ADD `trade_mode` INT NOT NULL DEFAULT '2'; +ALTER TABLE `permissions` ADD `acc_trade_anywhere` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; + +#END DATABASE UPDATE: 1.0.2 -> 1.0.3 \ No newline at end of file diff --git a/sqlupdates/1_0_3_TO_1_0_4.sql b/sqlupdates/1_0_3_TO_1_0_4.sql new file mode 100644 index 00000000..903138a8 --- /dev/null +++ b/sqlupdates/1_0_3_TO_1_0_4.sql @@ -0,0 +1,12 @@ +#DATABASE UPDATE: 1.0.3 -> 1.0.4 + +ALTER TABLE `navigator_publiccats` ADD `image` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `name`; + +ALTER IGNORE TABLE pet_breeds +ADD UNIQUE INDEX idx_name (race, color_one, color_two, has_color_one, has_color_two); + +#Removing favourite guilds for deleted guilds: +UPDATE users_settings SET guild_id = 0 WHERE guild_id NOT IN (SELECT id FROM guilds) and guild_id > 0; +UPDATE achievements SET category = 'explore' WHERE name LIKE 'CameraPhotoCount'; + +#END DATABASE UPDATE: 1.0.3 -> 1.0.4 \ No newline at end of file diff --git a/sqlupdates/1_0_4_TO_1_0_5.sql b/sqlupdates/1_0_4_TO_1_0_5.sql new file mode 100644 index 00000000..b97a61a4 --- /dev/null +++ b/sqlupdates/1_0_4_TO_1_0_5.sql @@ -0,0 +1,54 @@ +#DATABASE UPDATE: 1.0.4 -> 1.0.5 + +INSERT INTO emulator_settings (`key`, `value`) VALUES + ('camera.enabled', '1'), + ('camera.price.credits', '100'), + ('camera.price.points', '100'), + ('camera.price.points.publish', '1000'), + ('camera.item_id', '23425'), + ('camera.extradata', '{"t":%timestamp%, "u":"%id%", "s":%room_id%, "w":"%url%"}'), + ('hotel.navigator.search.maxresults', '35'), + ('hotel.rooms.max.favorite', '30'); + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.error.cmd_kick.unkickable', '%username% is unkickable!'), + ('camera.disabled', 'Sorry! Camera is disabled :('); + +DROP TABLE navigator_filter; +CREATE TABLE IF NOT EXISTS `navigator_filter` ( + `key` varchar(11) NOT NULL, + `field` varchar(32) NOT NULL, + `compare` enum('equals','equals_ignore_case','contains') NOT NULL, + `database_query` varchar(256) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +INSERT INTO `navigator_filter` (`key`, `field`, `compare`, `database_query`) VALUES + ('owner', 'getOwnerName', 'equals_ignore_case', 'SELECT * FROM rooms WHERE owner_name LIKE ?'), + ('anything', 'filterAnything', 'contains', 'SELECT rooms.* FROM rooms INNER JOIN guilds ON rooms.guild_id = guilds.id = WHERE CONCAT(rooms.owner_name, rooms.name, rooms.description, rooms.tags, guilds.name, guilds.description) LIKE ?'), + ('roomname', 'getName', 'equals_ignore_case', 'SELECT * FROM rooms WHERE name LIKE ?'), + ('tag', 'getTags', 'equals', 'SELECT * FROM rooms WHERE tags LIKE ?'), + ('group', 'getGuildName', 'contains', 'SELECT rooms.* FROM guilds INNER JOIN rooms ON guilds.room_id = rooms.id WHERE CONCAT(guilds.name, guilds.description) LIKE ?'), + ('desc', 'getDescription', 'contains', 'SELECT * FROM rooms WHERE description LIKE ?'), + ('promo', 'getPromotionDesc', 'contains', 'SELECT rooms.* FROM rooms INNER JOIN room_promotions ON rooms.id = room_promotions.id WHERE room_promotions.end_timestamp >= UNIX_TIMESTAMP() AND CONCAT (room_promotions.title, room_promotions.description) LIKE ?'); + + +ALTER TABLE `rooms` ADD `users` INT NOT NULL DEFAULT '0' AFTER `state`; + +CREATE TABLE `users_favorite_rooms` ( + `user_id` INT NOT NULL , + `room_id` INT NOT NULL , + UNIQUE ( + `user_id` , + `room_id` + ) +) ENGINE = MYISAM ; + +ALTER TABLE `catalog_pages` CHANGE `page_headline` `page_headline` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +ALTER TABLE `catalog_pages` CHANGE `page_teaser` `page_teaser` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +ALTER TABLE `catalog_pages` CHANGE `page_special` `page_special` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +ALTER TABLE `catalog_pages` CHANGE `page_text1` `page_text1` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +ALTER TABLE `catalog_pages` CHANGE `page_text2` `page_text2` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +ALTER TABLE `catalog_pages` CHANGE `page_text_details` `page_text_details` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +ALTER TABLE `catalog_pages` CHANGE `page_text_teaser` `page_text_teaser` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; + +#END DATABASE UPDATE: 1.0.4 -> 1.0.5 \ No newline at end of file diff --git a/sqlupdates/1_0_5_TO_1_0_6.sql b/sqlupdates/1_0_5_TO_1_0_6.sql new file mode 100644 index 00000000..7cf33442 --- /dev/null +++ b/sqlupdates/1_0_5_TO_1_0_6.sql @@ -0,0 +1,12 @@ +#DATABASE UPDATE: 1.0.5 -> 1.0.6 + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES + ('catalog.guild.price', '10'); + +ALTER TABLE `permissions` ADD `cmd_update_navigator` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_update_items`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.keys.cmd_update_navigator', 'update_navigator;update_nav'), + ('commands.succes.cmd_update_navigator', 'Navigator succesfully reloaded!'); + +#END DATABASE UPDATE: 1.0.5 -> 1.0.6 \ No newline at end of file diff --git a/sqlupdates/1_0_6_TO_1_0_7.sql b/sqlupdates/1_0_6_TO_1_0_7.sql new file mode 100644 index 00000000..7b15a7fa --- /dev/null +++ b/sqlupdates/1_0_6_TO_1_0_7.sql @@ -0,0 +1,6 @@ +#DATABASE UPDATE: 1.0.6 -> 1.0.7 + +ALTER TABLE `permissions` ADD `acc_update_notifications` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; +DELETE FROM emulator_settings WHERE `key` LIKE 'emulator.version'; + +#END DATABASE UPDATE: 1.0.5 -> 1.0.6 \ No newline at end of file diff --git a/sqlupdates/1_0_7_TO_1_0_8.sql b/sqlupdates/1_0_7_TO_1_0_8.sql new file mode 100644 index 00000000..4b78df60 --- /dev/null +++ b/sqlupdates/1_0_7_TO_1_0_8.sql @@ -0,0 +1,176 @@ +#DATABASE UPDATE: 1.0.7 -> 1.0.8 + +DROP TABLE `crafting_recipes`; + +CREATE TABLE IF NOT EXISTS `crafting_altars_recipes` ( + `altar_id` int(11) NOT NULL, + `recipe_id` int(11) NOT NULL, + UNIQUE KEY `altar_id` (`altar_id`,`recipe_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +INSERT INTO `crafting_altars_recipes` (`altar_id`, `recipe_id`) VALUES +(22319, 1), +(22319, 2), +(22319, 3), +(22319, 4), +(22319, 5), +(22319, 6), +(22319, 7), +(22319, 8), +(22319, 9), +(22319, 10), +(22319, 11), +(22319, 12), +(22319, 13), +(22319, 14), +(22319, 15), +(22319, 16), +(22319, 17), +(22319, 18), +(22319, 19), +(22319, 20), +(22319, 21), +(22319, 22), +(22319, 23), +(22319, 24); + +CREATE TABLE IF NOT EXISTS `crafting_recipes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `product_name` varchar(32) NOT NULL COMMENT 'WARNING! This field must match a entry in your productdata or crafting WILL NOT WORK!', + `reward` int(11) NOT NULL, + `enabled` enum('0','1') NOT NULL DEFAULT '1', + `achievement` varchar(255) NOT NULL DEFAULT '', + `secret` enum('0','1') NOT NULL DEFAULT '1', + `limited` enum('0','1') NOT NULL DEFAULT '0', + `remaining` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + UNIQUE KEY `name` (`product_name`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ; + +INSERT INTO `crafting_recipes` (`id`, `product_name`, `reward`, `enabled`, `achievement`, `secret`, `limited`, `remaining`) VALUES +(1, 'clothing_firehelm', 22273, '1', '', '0', '0', 0), +(2, 'clothing_airhelm', 22271, '1', '', '0', '0', 0), +(3, 'clothing_waterhelm', 22267, '1', '', '0', '0', 0), +(4, 'clothing_earthhelm', 22277, '1', '', '0', '0', 0), +(5, 'hween_c15_purecrystal2', 22294, '1', '', '1', '0', 0), +(6, 'hween_c15_purecrystal3', 22304, '1', '', '1', '0', 0), +(7, 'hween_c15_evilcrystal2', 22293, '1', '', '1', '0', 0), +(8, 'hween_c15_evilcrystal3', 22296, '1', '', '1', '0', 0), +(9, 'gothic_c15_chandelier', 22161, '1', '', '1', '0', 0), +(10, 'hween12_guillotine', 18669, '1', '', '1', '0', 0), +(11, 'hween14_mariachi', 20110, '1', '', '1', '0', 0), +(12, 'hween14_doll3', 20134, '1', '', '1', '0', 0), +(13, 'hween14_doll4', 20135, '1', '', '1', '0', 0), +(14, 'clothing_wavy2', 20217, '1', '', '1', '0', 0), +(15, 'guitar_skull', 22953, '1', '', '1', '0', 0), +(16, 'fxbox_fx152', 20253, '1', '', '1', '0', 0), +(17, 'LT_skull', 17136, '1', '', '1', '0', 0), +(18, 'hween14_skelepieces', 20109, '1', '', '1', '0', 0), +(19, 'hween13_bldtrail', 19231, '1', '', '1', '0', 0), +(20, 'penguin_glow', 16940, '1', '', '1', '0', 0), +(21, 'skullcandle', 15722, '1', '', '1', '0', 0), +(22, 'fxbox_fx125', 20255, '1', '', '1', '0', 0), +(23, 'deadduck', 15723, '1', '', '1', '0', 0), +(24, 'qt_xm10_iceduck', 17670, '1', '', '1', '0', 0); + +CREATE TABLE IF NOT EXISTS `crafting_recipes_ingredients` ( + `recipe_id` int(11) NOT NULL, + `item_id` int(11) NOT NULL, + `amount` int(11) NOT NULL DEFAULT '1' +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +INSERT INTO `crafting_recipes_ingredients` (`recipe_id`, `item_id`, `amount`) VALUES +(6, 22294, 3), +(5, 22335, 3), +(7, 22301, 3), +(8, 22293, 3), +(2, 22294, 4), +(2, 22304, 4), +(4, 22335, 4), +(4, 22294, 4), +(1, 22304, 4), +(3, 22294, 8), +(9, 17136, 6), +(9, 22293, 1), +(9, 17237, 1), +(9, 17177, 2), +(10, 18248, 2), +(10, 19231, 1), +(10, 18231, 4), +(10, 22296, 1), +(11, 20109, 3), +(11, 22294, 1), +(11, 18022, 1), +(11, 17136, 1), +(12, 20109, 3), +(12, 22294, 1), +(12, 18933, 1), +(13, 20109, 3), +(13, 22294, 1), +(13, 15696, 1), +(14, 22294, 1), +(14, 19800, 1), +(14, 20084, 2), +(15, 18933, 1), +(15, 22335, 1), +(15, 17191, 1), +(16, 18669, 1), +(16, 22296, 1), +(16, 20122, 1), +(17, 15724, 2), +(17, 22335, 1), +(18, 22335, 1), +(18, 15723, 3), +(19, 15723, 2), +(19, 22335, 1), +(20, 22293, 1), +(20, 16893, 1), +(20, 16924, 1), +(21, 17136, 1), +(21, 17181, 1), +(22, 18207, 1), +(22, 22293, 1), +(23, 15696, 1), +(24, 15696, 1), +(23, 22301, 1), +(24, 22335, 1); + +UPDATE achievements SET category = 'explore' WHERE name LIKE 'CameraPhotoCount'; + +CREATE TABLE `room_mutes` ( + `room_id` INT NOT NULL , + `user_id` INT NOT NULL , + `ends` INT NOT NULL +) ENGINE = MYISAM ; + +CREATE TABLE `catalog_items_limited` ( + `catalog_item_id` INT NOT NULL , + `number` INT NOT NULL , + `user_id` INT NOT NULL DEFAULT '0', + `timestamp` INT NOT NULL DEFAULT '0', + `item_id` INT NOT NULL DEFAULT '0', +UNIQUE ( + `catalog_item_id` , + `number` + ) +) ENGINE = MYISAM ; + +ALTER TABLE `items_crackable` CHANGE `prizes` `prizes` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT 'Used in the format of item_id:chance;item_id_2:chance. item_id must be id in the items_base table. Default value for chance is 100.'; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.trading.enabled', '1'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.catalog.recycler.enabled', '1'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('debug.show.errors', '1'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.wired.furni.selection.count', '5'); + +UPDATE `emulator_settings` SET `key` = 'hotel.catalog.discounts.amount' WHERE `emulator_settings`.`key` = 'hotel.catalogue.discounts.amount'; + +DELETE FROM emulator_settings WHERE `key` LIKE 'emulator.log%'; + +CREATE TABLE IF NOT EXISTS `users_recipes` ( + `user_id` int(11) NOT NULL, + `recipe` int(11) NOT NULL, + UNIQUE KEY `user_id` (`user_id`,`recipe`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +#END DATABASE UPDATE: 1.0.7 -> 1.0.8 \ No newline at end of file diff --git a/sqlupdates/1_0_8_TO_1_0_9.sql b/sqlupdates/1_0_8_TO_1_0_9.sql new file mode 100644 index 00000000..8a13bb3d --- /dev/null +++ b/sqlupdates/1_0_8_TO_1_0_9.sql @@ -0,0 +1,134 @@ +#DATABASE UPDATE: 1.0.8 -> 1.0.9 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_plugins', ':plugins'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_massbadge', ':massbadge '); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_update_bots', ':update_bots'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_update_navigator', ':update_navigator'); + +ALTER TABLE `bans` ADD `type` ENUM( 'account', 'ip', 'machine', 'super' ) NOT NULL DEFAULT 'account'; +ALTER TABLE `bans` ADD `ip` VARCHAR( 50 ) NOT NULL DEFAULT '' AFTER `user_id`; +ALTER TABLE `bans` ADD `machine_id` VARCHAR( 255 ) NOT NULL AFTER `ip`; +ALTER TABLE `bans` CHANGE `type` `type` ENUM( 'account', 'ip', 'machine', 'super' ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'account' COMMENT 'Account is the entry in the users table banned. +IP is any client that connects with that IP. +Machine is the computer that logged in. +Super is all of the above.'; + +ALTER TABLE `permissions` ADD `cmd_ip_ban` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_ha`; +ALTER TABLE `permissions` ADD `cmd_machine_ban` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_ip_ban`; +ALTER TABLE `permissions` ADD `cmd_super_ban` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_summonrank`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_ip_ban', 'ipban;banip;ip_ban;ban_ip'), ('commands.description.cmd_ip_ban', ':ipban [reason]'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_machine_ban', 'machineban;banmachine;banmac;macban'), ('commands.description.cmd_machine_ban', ':machineban [reason]'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_super_ban', 'superban;megaban'), ('commands.description.cmd_super_ban', ':superban [reason]'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_machine_ban', '%count% accounts have been MAC banned!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_ip_ban', '%count% accounts have been IP banned!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_super_ban', '%count% accounts have been Super banned!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_ip_ban.ban_self', 'You cannot IP Ban yourself!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_machine_ban.ban_self', 'You cannot issue yourself a MAC Ban!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_super_ban.ban_self', 'You cannot superban yourself!'); + +ALTER TABLE `items` CHANGE `extra_data` `extra_data` VARCHAR(1024) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('runtime.threads', '8'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('io.bossgroup.threads', '1'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('io.workergroup.threads', '5'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.teleport.locked.allowed', '1'); + +ALTER TABLE `users` CHANGE `ip_register` `ip_register` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , + CHANGE `ip_current` `ip_current` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; + +ALTER TABLE `items` CHANGE `z` `z` DOUBLE( 10, 5 ) NOT NULL DEFAULT '0.0'; + +ALTER TABLE `catalog_pages` ADD `includes` VARCHAR( 32 ) NOT NULL DEFAULT '' COMMENT 'Example usage: 1;2;3 + This will include page 1, 2 and 3 in the current page. + Note that permissions are only used for the current entry.'; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('pathfinder.step.maximum.height', '1.1'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('pathfinder.step.allow.falling', '1'); + +ALTER TABLE `guilds` +ADD `forum` ENUM( '0', '1' ) NOT NULL DEFAULT '0', +ADD `read_forum` ENUM( 'EVERYONE', 'MEMBERS', 'ADMINS' ) NOT NULL DEFAULT 'EVERYONE', +ADD `post_messages` ENUM( 'EVERYONE', 'MEMBERS', 'ADMINS', 'OWNER' ) NOT NULL DEFAULT 'EVERYONE', +ADD `post_threads` ENUM( 'EVERYONE', 'MEMBERS', 'ADMINS', 'OWNER' ) NOT NULL DEFAULT 'EVERYONE', +ADD `mod_forum` ENUM( 'ADMINS', 'OWNER' ) NOT NULL DEFAULT 'ADMINS'; + +CREATE TABLE `guilds_forums` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `guild_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `subject` mediumtext NOT NULL, + `message` longtext NOT NULL, + `state` enum('OPEN','CLOSED','HIDDEN_BY_ADMIN','HIDDEN_BY_STAFF') NOT NULL DEFAULT 'OPEN', + `admin_id` int(11) NOT NULL DEFAULT '0', + `pinned` enum('0','1') NOT NULL DEFAULT '0', + `locked` enum('0','1') NOT NULL DEFAULT '0', + `timestamp` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; + +CREATE TABLE `guilds_forums_comments` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `thread_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `timestamp` int(11) NOT NULL, + `message` longtext NOT NULL, + `state` enum('OPEN','CLOSED','HIDDEN_BY_ADMIN','HIDDEN_BY_STAFF') NOT NULL DEFAULT 'OPEN', + `admin_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_alert.cmd_connect_camera', 'Camera reconnected!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_connect_camera', 'connectcamera;connect_camera;cameraconnect'); + +ALTER TABLE `permissions` ADD `cmd_connect_camera` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_commands`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_disconnect.higher_rank', 'The Habbo you wanted to disconnect is more important than you are.'); + +ALTER TABLE `catalog_pages` CHANGE `page_layout` `page_layout` ENUM( +'default_3x3', 'club_buy', 'club_gift', 'frontpage', 'spaces', 'recycler', 'recycler_info', +'recycler_prizes', 'trophies', 'marketplace', 'marketplace_own_items', 'pets', +'spaces_new', 'soundmachine', 'guilds', 'guild_furni', 'info_duckets', 'info_rentables', +'info_pets', 'roomads', 'single_bundle', 'sold_ltd_items', 'badge_display', 'bots', 'pets2', +'pets3', 'room_bundle', 'recent_purchases', 'pets2', 'pets3', 'default_3x3_color_grouping', +'guild_forum', 'vip_buy', 'loyalty_info', 'loyalty_vip_buy', 'collectibles' ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'default_3x3'; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.rooms.handitem.time', '100'); + +ALTER TABLE `permissions` ADD `cmd_diagonal` ENUM( '0', '1' ) NOT NULL DEFAULT '1' AFTER `cmd_danceall`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_diagonal', 'diagonal;disablediagonal;diagonally'), ('commands.description.cmd_diagonal', ':diagonal'); +ALTER TABLE `rooms` ADD `move_diagonally` ENUM( '0', '1' ) NOT NULL DEFAULT '1'; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_diagonal.disabled', 'You can no longer walk diagonally!'), ('commands.succes.cmd_diagonal.disabled', 'You can now walk diagonally!'); + +CREATE TABLE `youtube_items` ( +`id` INT NOT NULL , +`video` VARCHAR( 128 ) NOT NULL , +`title` VARCHAR( 128 ) NOT NULL , +`description` VARCHAR( 128 ) NOT NULL , +`start_time` INT( 5 ) NOT NULL DEFAULT '0', +`end_time` INT( 5 ) NOT NULL DEFAULT '0' +) ENGINE = MYISAM ; + +CREATE TABLE `youtube_playlists` ( +`item_id` INT NOT NULL , +`video_id` INT NOT NULL , +`order` INT NOT NULL , +UNIQUE ( +`item_id` , +`video_id` , +`order` +) +) ENGINE = MYISAM ; + +ALTER TABLE `youtube_items` ADD PRIMARY KEY ( `id` ); +ALTER TABLE `youtube_items` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT; + +INSERT INTO `emulator_settings` ( +`key` , +`value` +) +VALUES ( +'imager.url.youtube', 'imager.php?url=http://img.youtube.com/vi/%video%/default.jpg' +); + +ALTER TABLE `permissions` ADD `room_effect` INT NOT NULL DEFAULT '0' AFTER `rank_name`; + +#END DATABASE UPDATE: 1.0.8 -> 1.0.9 \ No newline at end of file diff --git a/sqlupdates/1_0_9_TO_1_0_10.sql b/sqlupdates/1_0_9_TO_1_0_10.sql new file mode 100644 index 00000000..f3a41346 --- /dev/null +++ b/sqlupdates/1_0_9_TO_1_0_10.sql @@ -0,0 +1,92 @@ +#DATABASE UPDATE: 1.0.9 -> 1.0.10 + +ALTER TABLE `polls_questions` ADD `parent_id` INT( 11 ) NOT NULL DEFAULT '0' AFTER `id`; +ALTER TABLE `polls_questions` CHANGE `question_number` `order` INT( 11 ) NOT NULL; +ALTER TABLE `permissions` ADD `cmd_word_quiz` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_userinfo`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES +('commands.keys.cmd_word_quiz', 'wordquiz;quiz'), +('commands.description.cmd_word_quiz', ':wordquiz '); + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('scripter.warning.marketplace.forbidden', '%username% tried to sell an %itemname% for %credits% which is not allowed to be sold on the marketplace!'); + +ALTER TABLE `permissions` +ADD `acc_helper_use_guide_tool` ENUM('0','1') NOT NULL DEFAULT '0', +ADD `acc_helper_give_guide_tours` ENUM('0','1') NOT NULL DEFAULT '0', +ADD `acc_helper_judge_chat_reviews` ENUM('0','1') NOT NULL DEFAULT '0'; + +ALTER TABLE `achievements_talents` ADD `reward_badges` VARCHAR( 100 ) NOT NULL DEFAULT ''; + +ALTER TABLE `pet_actions` ADD `pet_name` VARCHAR( 32 ) NOT NULL AFTER `pet_type`; + +CREATE TABLE `pet_breeding` ( +`pet_id` INT( 2 ) NOT NULL , +`offspring_id` INT( 2 ) NOT NULL +) ENGINE = MYISAM ; + +CREATE TABLE `pet_breeding_races` ( +`pet_type` INT( 2 ) NOT NULL , +`rarity_level` INT( 2 ) NOT NULL , +`breed` INT( 2 ) NOT NULL +) ENGINE = MYISAM ; + +ALTER TABLE `users_settings` ADD `talent_track_citizenship_level` INT( 2 ) NOT NULL DEFAULT '0', +ADD `talent_track_helpers_level` INT( 2 ) NOT NULL DEFAULT '0'; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.navigator.popular.amount', '35'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.navigator.popular.listtype', '1'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('inventory.max.items', '7500'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('inventory.full', 'You''ve reached the inventory limit. Move furniture out of your inventory before buying more!'); + +ALTER TABLE `navigator_flatcats` ADD `list_type` INT NOT NULL DEFAULT '0' COMMENT 'Display mode in the navigator. 0 for list, 1 for thumbnails.'; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_setmax.invalid_number', 'Invalid number. Specify a number between 0 and 9999'), ('commands.error.cmd_setmax.forgot_number', 'No number specified. Dork.'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_setmax', 'setmax;set_max'), ('commands.description.cmd_setmax', ':setmax '), ('commands.description.cmd_staffalert', ':sA '); +ALTER TABLE `permissions` ADD `cmd_setmax` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_say_all`; + +ALTER TABLE `catalog_pages` ADD `room_id` INT( 11 ) NOT NULL DEFAULT '0'; + +ALTER TABLE `permissions` ADD `cmd_take_badge` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_superpull`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.description.cmd_take_badge', ':takebadge '), + ('commands.keys.cmd_take_badge', 'takebadge;take_badge;remove_badge;removebadge'), + ('commands.error.cmd_take_badge.forgot_badge', 'No badge specified!'), + ('commands.error.cmd_take_badge.forgot_username', 'No username specified!'), + ('commands.error.cmd_take_badge.no_badge', '%username% does not have %badge%!'), + ('commands.succes.cmd_take_badge', 'Badge has been taken!'); + +ALTER TABLE `permissions` + ADD `acc_floorplan_editor` ENUM( '0', '1' ) NOT NULL DEFAULT '0', + ADD `acc_camera` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('camera.permission', 'You don''t have permission to use the camera!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('floorplan.permission', 'You don''t have permission to use the floorplan editor!'); + +ALTER TABLE `room_wordfilter` CHANGE `word` `word` VARCHAR( 25 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.keys.cmd_update_polls', 'update_polls;reload_polls'), + ('commands.description.cmd_update_polls', ':update_polls'), + ('commands.keys.cmd_set_poll', 'setpoll;set_poll'), + ('commands.description.cmd_set_poll', ':setpoll '), + ('commands.succes.cmd_set_poll', 'Room poll has been updated!'), + ('commands.error.cmd_set_poll.invalid_number', 'Please specify a valid number. Use 0 to remove the poll.'), + ('commands.error.cmd_set_poll.missing_arg', 'Missing poll id. Use 0 to remove the poll from this room.'), + ('commands.keys.cmd_roomcredits', 'roomcredits;room_credits;roomcoins;room_coins'), + ('commands.description.cmd_roomcredits', ':roomcredits '), + ('commands.keys.cmd_roompixels', 'roompixels;room_pixels;roomduckets;room_duckets'), + ('commands.description.cmd_roompixels', ':roompixels '), + ('commands.keys.cmd_roompoints', 'roompoints;room_points'), + ('commands.description.cmd_roompoints', ':roompoints '), + ('commands.keys.cmd_roomgift', 'roomgift;room_gift'), + ('commands.description.cmd_roomgift', ':roomgift [message]'), + ('commands.succes.cmd_update_polls', 'Room polls have been reloaded!'), + ('commands.error.cmd_set_poll.not_found', 'Poll %id% not found!'); + +ALTER TABLE `permissions` ADD `cmd_set_poll` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_setmax`; +ALTER TABLE `permissions` ADD `cmd_update_polls` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_update_plugins`; +ALTER TABLE `permissions` ADD `cmd_roomcredits` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_redeem`; +ALTER TABLE `permissions` ADD `cmd_roompixels` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_roomitem` , ADD `cmd_roompoints` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_roompixels`; +ALTER TABLE `permissions` ADD `cmd_roomgift` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_roomeffect`; + +#END DATABASE UPDATE: 1.0.9 -> 1.0.10 \ No newline at end of file diff --git a/sqlupdates/1_1_0_TO_1_2_0.sql b/sqlupdates/1_1_0_TO_1_2_0.sql new file mode 100644 index 00000000..755a2d55 --- /dev/null +++ b/sqlupdates/1_1_0_TO_1_2_0.sql @@ -0,0 +1,21 @@ +#DATABASE UPDATE: 1.1.0 -> 1.2.0 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.keys.cmd_roommute', 'roommute;room_mute'), + ('commands.description.cmd_roommute', ':roommute'), + ('commands.succes.cmd_roommute.unmuted', 'The room has been unmuted!'), + ('commands.succes.cmd_roommute.muted', 'The room has been muted!'), + ('commands.keys.cmd_lay', 'lay'), + ('commands.description.cmd_lay', ':lay'); + +#This is your backup table. Just incase you mess things up. +CREATE TABLE catalog_pages_1_1_0 SELECT * FROM catalog_pages; + +ALTER TABLE `catalog_pages` CHANGE `page_layout` `page_layout` ENUM('default_3x3','club_buy','club_gift','frontpage','spaces','recycler','recycler_info','recycler_prizes','trophies','plasto','marketplace','marketplace_own_items','pets','spaces_new','soundmachine','guilds','guild_furni','info_duckets','info_rentables','info_pets','roomads','single_bundle','sold_ltd_items','badge_display','bots','pets2','pets3','productpage1','room_bundle','recent_purchases','default_3x3_color_grouping','guild_forum','vip_buy','info_loyalty','loyalty_vip_buy','collectibles','frontpage_featured') CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'default_3x3'; + +INSERT INTO `catalog_pages` (`id`, `parent_id`, `caption_save`, `caption`, `icon_color`, `icon_image`, `visible`, `enabled`, `min_rank`, `club_only`, `order_num`, `page_layout`, `page_headline`, `page_teaser`, `page_special`, `page_text1`, `page_text2`, `page_text_details`, `page_text_teaser`, `vip_only`, `includes`, `room_id`) VALUES (NULL, '-1', 'furni', 'Furni', '1', '1', '1', '0', '1', '0', '1', 'default_3x3', '', '', '', '', '', '', '', '0', '', '0'); +UPDATE catalog_pages, (SELECT id FROM catalog_pages ORDER BY id DESC LIMIT 1) new_id SET parent_id = new_id.id WHERE parent_id = -1; +UPDATE catalog_pages SET parent_id = -1, page_layout = 'frontpage_featured' WHERE caption LIKE 'frontpage'; +UPDATE catalog_pages SET parent_id = -1 ORDER BY id DESC LIMIT 1; + +#END DATABASE UPDATE: 1.1.0 -> 1.2.0 \ No newline at end of file diff --git a/sqlupdates/1_2_0_TO_1_3_0.sql b/sqlupdates/1_2_0_TO_1_3_0.sql new file mode 100644 index 00000000..2fa97183 --- /dev/null +++ b/sqlupdates/1_2_0_TO_1_3_0.sql @@ -0,0 +1,58 @@ +#DATABASE UPDATE: 1.2.0 -> 1.3.0 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('camera.wait', 'Please wait %seconds% seconds before making another picture.'); + +ALTER TABLE `rooms` CHANGE `name` `name` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ''; +ALTER TABLE `rooms` CHANGE `description` `description` VARCHAR( 512 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `rooms` CHANGE `password` `password` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; + +UPDATE `items_base` SET `interaction_type` = 'switch' WHERE `item_name` LIKE 'wf_floor_switch%'; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.bot.chat.minimum.interval', '5'); +DELETE FROM `emulator_settings` WHERE `key` LIKE 'hotel.home.room'; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.home.room', '0'); + +ALTER TABLE `users` CHANGE `ip_current` `ip_current` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'Have your CMS update this IP. If you do not do this IP banning won''t work!'; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('loggedin.elsewhere', 'You have been disconnected as you logged in from somewhere else.'); + +CREATE TABLE `catalog_featured_pages` ( + `slot_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , + `image` VARCHAR( 64 ) NOT NULL DEFAULT '', + `caption` VARCHAR( 128 ) NOT NULL DEFAULT '', + `type` ENUM( 'page_name', 'page_id', 'product_name' ) NOT NULL DEFAULT 'page_name', + `expire_timestamp` INT NOT NULL DEFAULT '-1', + `page_name` VARCHAR( 16 ) NOT NULL DEFAULT '', + `page_id` INT NOT NULL DEFAULT '0', + `product_name` VARCHAR( 32 ) NOT NULL DEFAULT '' +) ENGINE = MYISAM ; + +INSERT INTO `catalog_featured_pages` (`slot_id`, `image`, `caption`, `type`, `expire_timestamp`, `page_name`, `page_id`, `product_name`) VALUES +('1', 'catalogue/feature_cata_vert_oly16bundle4.png', 'New Olympic 2016 bundle!', 'page_name', '-1', 'olympic_2016', '0', ''), +('2', 'catalogue/feature_cata_hort_habbergerbundle.png', 'Get your own Habbo FASTFOOD restaurant!', 'page_name', '-1', 'fastfood', '0', ''), +('3', 'catalogue/feature_cata_hort_olympic16.png', 'HabboLympix are here!', 'page_name', '-1', 'habbo_lympix', '0', ''), +('4', 'catalogue/feature_cata_hort_HC_b.png', 'Obtain Habbo Club Today!', 'page_name', '-1', 'habbo_club', '0', ''); + +ALTER TABLE `users_settings` ADD `ignore_bots` ENUM( '0', '1' ) NOT NULL DEFAULT '0', +ADD `ignore_pets` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.keys.cmd_mute_pets', 'mutepets;ignorepets;mute_pets;ignore_pets'), + ('commands.succes.cmd_mute_pets.ignored', 'You''re now ignoring pets.'), + ('commands.succes.cmd_mute_pets.unignored', 'You''re no longer ignoring pets.'), + ('commands.keys.cmd_mute_bots', 'mutebots;ignorebots;mute_bots;ignore_bots'), + ('commands.succes.cmd_mute_bots.ignored', 'You are now ignoring bots.'), + ('commands.succes.cmd_mute_bots.unignored', 'You are no longer ignoring bots.'); + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.daily.respect', '3'), ('hotel.daily.respect.pets', '3'), ('hotel.refill.daily', '86400'); + +CREATE TABLE `commandlogs` ( + `user_id` INT NOT NULL , + `timestamp` INT NOT NULL , + `command` VARCHAR( 32 ) NOT NULL DEFAULT '', + `params` VARCHAR( 100 ) NOT NULL DEFAULT '', + `succes` ENUM( 'no', 'yes' ) NOT NULL DEFAULT 'yes', +INDEX ( `user_id` ) +) ENGINE = MYISAM ; + +ALTER TABLE `permissions` ADD `log_commands` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `room_effect`; + +#END DATABASE UPDATE: 1.2.0 -> 1.3.0 \ No newline at end of file diff --git a/sqlupdates/1_3_0_TO_1_4_0.sql b/sqlupdates/1_3_0_TO_1_4_0.sql new file mode 100644 index 00000000..78d04998 --- /dev/null +++ b/sqlupdates/1_3_0_TO_1_4_0.sql @@ -0,0 +1,191 @@ +#DATABASE UPDATE: 1.3.0 -> 1.4.0 + +ALTER TABLE `users_pets` ADD `mp_nose_color` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `mp_nose`; +ALTER TABLE `users_pets` ADD `mp_eyes_color` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `mp_eyes`; +ALTER TABLE `users_pets` ADD `mp_mouth_color` TINYINT( 2 ) NOT NULL DEFAULT '0' AFTER `mp_mouth`; +ALTER TABLE `users_pets` ADD `mp_death_timestamp` INT NOT NULL DEFAULT '0' AFTER `mp_mouth_color`; +ALTER TABLE `users_pets` ADD `mp_breedable` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; +ALTER TABLE `users_pets` ADD `mp_allow_breed` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; + +#This configuration option defines the monsterplant seed item id. +#Note that it will automatically be set if there is an mnstr_seed item in the items_base table. +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('monsterplant.seed.item_id', '1337'); +UPDATE emulator_settings SET `value` = (SELECT id FROM items_base WHERE item_name LIKE 'mnstr_seed') WHERE `key` LIKE 'monsterplant.seed.item_id'; + +#This configuration option defines the rare monsterplant seed item id. +#Note that it will automatically be set if there is an mnstr_seed_rare item in the items_base table. +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('monsterplant.seed_rare.item_id', '1337'); +UPDATE emulator_settings SET `value` = (SELECT id FROM items_base WHERE item_name LIKE 'mnstr_seed_rare') WHERE `key` LIKE 'monsterplant.seed_rare.item_id'; + +UPDATE `items_base` SET `interaction_type` = 'monsterplant_seed' WHERE `items_base`.`item_name` LIKE 'mnstr_seed%'; + +INSERT INTO `pet_actions` (`pet_type`, `pet_name`, `happy_actions`, `tired_actions`, `random_actions`) VALUES ('0', '', '', '', ''); + +ALTER TABLE `permissions` CHANGE `cmd_word_quiz` `cmd_word_quiz` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` ADD `cmd_roomalert` ENUM( '0', '1', '2' ) NOT NULL DEFAULT '0' AFTER `cmd_redeem`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.description.cmd_roomalert', ':roomalert '), + ('commands.error.cmd_roomalert.empty', 'Please specify an message!'), + ('commands.keys.cmd_roomalert', 'roomalert;room_alert;ra'); + +ALTER TABLE `users_pets` ADD `gnome_data` VARCHAR( 80 ) NOT NULL DEFAULT ''; + +#This configuration option defines whether players will get kicked from public rooms when they walk on the door tile. +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.room.public.doortile.kick', '0'), ('info.shown', '1'); + +INSERT INTO `pet_actions` (`pet_type`, `pet_name`, `happy_actions`, `tired_actions`, `random_actions`) VALUES ('33', '', '', '', ''), ('34', '', '', '', ''); +INSERT INTO `pet_breeds` (`race`, `color_one`, `color_two`, `has_color_one`, `has_color_two`) VALUES + ('33', '0', '0', '1', '0'), + ('33', '1', '1', '1', '0'), + ('33', '2', '2', '1', '0'), + ('33', '3', '3', '1', '0'), + ('33', '4', '4', '1', '0'), + ('33', '5', '5', '1', '0'), + ('33', '6', '6', '1', '0'), + ('33', '7', '7', '1', '0'), + ('33', '8', '8', '1', '0'), + ('33', '9', '9', '1', '0'), + ('33', '10', '10', '1', '0'), + ('33', '11', '11', '1', '0'), + ('33', '12', '12', '1', '0'), + ('33', '13', '13', '1', '0'), + ('33', '14', '14', '1', '0'), + ('33', '15', '15', '1', '0'), + ('33', '16', '16', '1', '0'), + ('33', '17', '17', '1', '0'), + ('33', '18', '18', '1', '0'), + ('33', '19', '19', '1', '0'), + ('33', '20', '20', '1', '0'); + +INSERT INTO `pet_breeds` (`race`, `color_one`, `color_two`, `has_color_one`, `has_color_two`) VALUES + ('34', '0', '0', '1', '0'), + ('34', '1', '1', '1', '0'), + ('34', '2', '2', '1', '0'), + ('34', '3', '3', '1', '0'), + ('34', '4', '4', '1', '0'), + ('34', '5', '5', '1', '0'), + ('34', '6', '6', '1', '0'), + ('34', '7', '7', '1', '0'), + ('34', '8', '8', '1', '0'), + ('34', '9', '9', '1', '0'), + ('34', '10', '10', '1', '0'), + ('34', '11', '11', '1', '0'), + ('34', '12', '12', '1', '0'), + ('34', '13', '13', '1', '0'), + ('34', '14', '14', '1', '0'), + ('34', '15', '15', '1', '0'), + ('34', '16', '16', '1', '0'), + ('34', '17', '17', '1', '0'), + ('34', '18', '18', '1', '0'), + ('34', '19', '19', '1', '0'); + +DELETE FROM emulator_texts WHERE `key` LIKE 'commands.keys.cmd_roompoints'; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_roompoints', 'roompoints;room_points'); + +CREATE TABLE `camera_web` ( + `id` INT NOT NULL AUTO_INCREMENT, + `user_id` INT NOT NULL, + `timestamp` INT NOT NULL, + `url` VARCHAR(128) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + INDEX (`user_id`), + UNIQUE (`id`) +) ENGINE = INNODB; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('camera.publish.delay', '180'); + +CREATE TABLE `room_trade_log` ( + `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , + `user_one_id` INT NOT NULL , + `user_two_id` INT NOT NULL , + `user_one_ip` VARCHAR( 45 ) NOT NULL , + `user_two_ip` VARCHAR( 45 ) NOT NULL , + `timestamp` INT NOT NULL , + `user_one_item_count` INT NOT NULL , + `user_two_item_count` INT NOT NULL , + INDEX ( `user_one_id`) , INDEX ( `user_two_id` ) +) ENGINE = INNODB ; + +CREATE TABLE `room_trade_log_items` ( + `id` INT NOT NULL , + `item_id` INT NOT NULL , + `user_id` INT NOT NULL , + UNIQUE (`id` , `item_id` , `user_id` ), + INDEX (`id`), + INDEX (`user_id`), + INDEX (`id`, `user_id`) +) ENGINE = INNODB ; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.log.trades', '1'); + +#Dropping the badges column. Badges are now done via the items_base table. +INSERT INTO items_base (sprite_id, public_name, item_name, type) SELECT DISTINCT '0' as e, badge as c, badge as b, 'b' as d FROM catalog_items WHERE badge NOT LIKE ''; +UPDATE catalog_items SET item_ids = CONCAT(item_ids, ';', (SELECT id FROM items_base WHERE item_name LIKE badge)) WHERE badge NOT LIKE ''; +ALTER TABLE catalog_items DROP COLUMN badge; + +#This will update the heightmap models to add the missing doors. +DELETE FROM `room_models` WHERE name IN ('name','cinema_a','custom_model','dusty_lounge','infobus_bus','model_0','model_1','model_2','model_3','model_4','model_5','model_6','model_7','model_8','model_9','model_a','model_b','model_b2g','model_basa','model_c','model_d','model_e','model_f','model_g','model_h','model_i','model_j','model_k','model_l','model_m','model_n','model_o','model_opening','model_oscar','model_p','model_q','model_r','model_room_15','model_s','model_t','model_u','model_v','model_w','model_x','model_y','model_z','netcafe','newbie_lobby','old_skool','orient','park_a','park_b','picnic','pizza','pub_a','rooftop','rooftop_2','star_lounge','tearoom','theater','the_den'); +INSERT INTO `room_models` (`name`, `door_x`, `door_y`, `door_dir`, `heightmap`, `public_items`, `club_only`) VALUES + ('model_a', 3, 5, 2, 'xxxxxxxxxxxx\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxx000000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxx00000000\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '0'), + ('model_b', 0, 5, 2, 'xxxxxxxxxxxx\r\nxxxxx0000000\r\nxxxxx0000000\r\nxxxxx0000000\r\nxxxxx0000000\r\n000000000000\r\nx00000000000\r\nx00000000000\r\nx00000000000\r\nx00000000000\r\nx00000000000\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '0'), + ('model_c', 4, 7, 2, 'xxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxx0000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '0'), + ('model_d', 4, 7, 2, 'xxxxxxxxxxxx\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxx0000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxxxxxxxxxxx', '', '0'), + ('model_e', 1, 5, 2, 'xxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxx0000000000\r\nxx0000000000\r\nx00000000000\r\nxx0000000000\r\nxx0000000000\r\nxx0000000000\r\nxx0000000000\r\nxx0000000000\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '0'), + ('model_f', 2, 5, 2, 'xxxxxxxxxxxx\r\nxxxxxxx0000x\r\nxxxxxxx0000x\r\nxxx00000000x\r\nxxx00000000x\r\nxx000000000x\r\nxxx00000000x\r\nx0000000000x\r\nx0000000000x\r\nx0000000000x\r\nx0000000000x\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '0'), + ('model_i', 0, 10, 2, 'xxxxxxxxxxxxxxxxx\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\n00000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nx0000000000000000\r\nxxxxxxxxxxxxxxxxx', '', '0'), + ('model_j', 0, 10, 2, 'xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxx0000000000\r\nxxxxxxxxxxx0000000000\r\nxxxxxxxxxxx0000000000\r\nxxxxxxxxxxx0000000000\r\nxxxxxxxxxxx0000000000\r\nxxxxxxxxxxx0000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\n000000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx0000000000xxxxxxxxxx\r\nx0000000000xxxxxxxxxx\r\nx0000000000xxxxxxxxxx\r\nx0000000000xxxxxxxxxx\r\nx0000000000xxxxxxxxxx\r\nx0000000000xxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_k', 0, 13, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxx00000000\r\nxxxxxxxxxxxxxxxxx00000000\r\nxxxxxxxxxxxxxxxxx00000000\r\nxxxxxxxxxxxxxxxxx00000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nx000000000000000000000000\r\nx000000000000000000000000\r\nx000000000000000000000000\r\nx000000000000000000000000\r\n0000000000000000000000000\r\nx000000000000000000000000\r\nx000000000000000000000000\r\nx000000000000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_l', 0, 16, 2, 'xxxxxxxxxxxxxxxxxxxxx\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\n000000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nx00000000xxxx00000000\r\nxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_m', 0, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nx0000000000000000000000000000\r\nx0000000000000000000000000000\r\nx0000000000000000000000000000\r\nx0000000000000000000000000000\r\n00000000000000000000000000000\r\nx0000000000000000000000000000\r\nx0000000000000000000000000000\r\nx0000000000000000000000000000\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxx00000000xxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_n', 0, 16, 2, 'xxxxxxxxxxxxxxxxxxxxx\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx000000xxxxxxxx000000\r\nx000000x000000x000000\r\nx000000x000000x000000\r\nx000000x000000x000000\r\nx000000x000000x000000\r\nx000000x000000x000000\r\nx000000x000000x000000\r\nx000000xxxxxxxx000000\r\nx00000000000000000000\r\n000000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nx00000000000000000000\r\nxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_g', 1, 7, 2, 'xxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxx00000\r\nxxxxxxx00000\r\nxxxxxxx00000\r\nxx1111000000\r\nxx1111000000\r\nx11111000000\r\nxx1111000000\r\nxx1111000000\r\nxxxxxxx00000\r\nxxxxxxx00000\r\nxxxxxxx00000\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '1'), + ('model_q', 10, 4, 2, 'xxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxx22222222\r\nxxxxxxxxxxx22222222\r\nxxxxxxxxxxx22222222\r\nxxxxxxxxxx222222222\r\nxxxxxxxxxxx22222222\r\nxxxxxxxxxxx22222222\r\nx222222222222222222\r\nx222222222222222222\r\nx222222222222222222\r\nx222222222222222222\r\nx222222222222222222\r\nx222222222222222222\r\nx2222xxxxxxxxxxxxxx\r\nx2222xxxxxxxxxxxxxx\r\nx2222211111xx000000\r\nx222221111110000000\r\nx222221111110000000\r\nx2222211111xx000000\r\nxx22xxx1111xxxxxxxx\r\nxx11xxx1111xxxxxxxx\r\nx1111xx1111xx000000\r\nx1111xx111110000000\r\nx1111xx111110000000\r\nx1111xx1111xx000000\r\nxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_o', 0, 18, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx11111111xxxx\r\nxxxxxxxxxxxxx00000000xxxx\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nx111111100000000000000000\r\nx111111100000000000000000\r\nx111111100000000000000000\r\n1111111100000000000000000\r\nx111111100000000000000000\r\nx111111100000000000000000\r\nx111111100000000000000000\r\nx111111100000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxx0000000000000000\r\nxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_r', 10, 4, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxx33333333333333\r\nxxxxxxxxxxx33333333333333\r\nxxxxxxxxxxx33333333333333\r\nxxxxxxxxxx333333333333333\r\nxxxxxxxxxxx33333333333333\r\nxxxxxxxxxxx33333333333333\r\nxxxxxxx333333333333333333\r\nxxxxxxx333333333333333333\r\nxxxxxxx333333333333333333\r\nxxxxxxx333333333333333333\r\nxxxxxxx333333333333333333\r\nxxxxxxx333333333333333333\r\nx4444433333xxxxxxxxxxxxxx\r\nx4444433333xxxxxxxxxxxxxx\r\nx44444333333222xx000000xx\r\nx44444333333222xx000000xx\r\nxxx44xxxxxxxx22xx000000xx\r\nxxx33xxxxxxxx11xx000000xx\r\nxxx33322222211110000000xx\r\nxxx33322222211110000000xx\r\nxxxxxxxxxxxxxxxxx000000xx\r\nxxxxxxxxxxxxxxxxx000000xx\r\nxxxxxxxxxxxxxxxxx000000xx\r\nxxxxxxxxxxxxxxxxx000000xx\r\nxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_p', 0, 23, 2, 'xxxxxxxxxxxxxxxxxxx\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx22222222xxxx\r\nxxxxxxx11111111xxxx\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx2222xx11111111xxxx\r\nx2222xx00000000xxxx\r\nx2222xx000000000000\r\nx2222xx000000000000\r\nx2222xx000000000000\r\nx2222xx000000000000\r\n22222xx000000000000\r\nx2222xx000000000000\r\nxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_h', 4, 4, 2, 'xxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxx111111x\r\nxxxxx111111x\r\nxxxx1111111x\r\nxxxxx111111x\r\nxxxxx111111x\r\nxxxxx000000x\r\nxxxxx000000x\r\nxxx00000000x\r\nxxx00000000x\r\nxxx00000000x\r\nxxx00000000x\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx\r\nxxxxxxxxxxxx', '', '1'), + ('old_skool', 2, 1, 2, 'xx0xxxxxxxxxxxxxx\r\n0000000xxx00000xx\r\n0000000x0000000xx\r\n0000000xxxxxxxxxx\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n00000000000000000\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x\r\n0000000000000000x', 'SLHk49mobiles_chair3QBPAHHHk410mobiles_chair3RBPAHHHk411mobiles_chair3SBPAHHHk412mobiles_chair3PCPAHHHe101mobiles_chair1IRBHPAHe1010mobiles_chair1RBRBHPAHe110mobiles_chair1HSBHJHb111mobiles_table2ISBHHHc112mobiles_table3JSBHHHe113mobiles_chair1KSBHRAHb1110mobiles_table2RBSBHHHc1111mobiles_table3SBSBHHHa121mobiles_table1IPCHHHd122mobiles_table4JPCHHHe129mobiles_chair1QBPCHJHa1210mobiles_table1RBPCHHHd1211mobiles_table4SBPCHHHe1212mobiles_chair1PCPCHRAHe131mobiles_chair1IQCHHHe1311mobiles_chair1SBQCHHHe150mobiles_chair1HSCHPAHe170mobiles_chair1HQDHJHb171mobiles_table2IQDHHHc172mobiles_table3JQDHHHe173mobiles_chair1KQDHRAHa181mobiles_table1IRDHHHd182mobiles_table4JRDHHHe192mobiles_chair1JSDHHHe211mobiles_chair1IQEHPAHb216mobiles_table2RAQEHHHc217mobiles_table3SAQEHHHe2112mobiles_chair1PCQEHPAHe220mobiles_chair1HREHJHb221mobiles_table2IREHHHc222mobiles_table3JREHHHe223mobiles_chair1KREHRAHe225mobiles_chair1QAREHJHa226mobiles_table1RAREHHHd227mobiles_table4SAREHHHe228mobiles_chair1PBREHRAHe2211mobiles_chair1SBREHJHb2212mobiles_table2PCREHHHc2213mobiles_table3QCREHHHe2214mobiles_chair1RCREHRAHa231mobiles_table1ISEHHHd232mobiles_table4JSEHHHa2312mobiles_table1PCSEHHHd2313mobiles_table4QCSEHHHe241mobiles_chair1IPFHHHe247mobiles_chair1SAPFHPAHe2413mobiles_chair1QCPFHH', '0'), + ('pizza', 5, 27, 2, 'xxxxxxxxx0000000\r\nx11111x1xx000000\r\n11xxxxx111x00000\r\n11x1111111xx0000\r\n11x1111111100000\r\nxxx1111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n1111111111100000\r\n11111111111xxxxx\r\n1111111111xxxxxx\r\n1111111111111111\r\n1111111111111111\r\n1111111111111111\r\n1111111111111111\r\n1111111111111111\r\n1111111111111111\r\n11xx11xx11111111\r\nxxxx11xxxxxxxxxx\r\nxxxx11xxxxxxxxxx', 'QGHa015pizza_plant1SCHHJHe314pizza_sofa1RCKHPAHE315pizza_sofa2SCKHPAHc515pizza_tableSCQAHJHb60pizza_plant2HRAIJHf614pizza_sofa3RCRAHHHF615pizza_sofa4SCRAHHHd81pizza_chairIPBIPAHd82pizza_chairJPBIPAHc102pizza_tableJRBIJHe1014pizza_sofa1RCRBHPAHE1015pizza_sofa2SCRBHPAHd111pizza_chairISBIHHd112pizza_chairJSBIHHc1215pizza_tableSCPCHJHf1314pizza_sofa3RCQCHHHF1315pizza_sofa4SCQCHHHd161pizza_chairIPDIPAHd162pizza_chairJPDIPAHc182pizza_tableJRDIJHd191pizza_chairISDIHHd192pizza_chairJSDIHHd2111pizza_chairSBQEIJHd2114pizza_chairRCQEIRAHd2211pizza_chairSBREIJHc2213pizza_tableQCREIHHd2214pizza_chairRCREIRAHa250pizza_plant1HQFIJHa2515pizza_plant1SCQFIJ', '0'), + ('pub_a', 15, 25, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx2222222211111xxx\r\nxxxxxxxxx2222222211111xxx\r\nxxxxxxxxx2222222211111xxx\r\nxxxxxxxxx2222222211111xxx\r\nxxxxxxxxx2222222222111xxx\r\nxxxxxxxxx2222222222111xxx\r\nxxxxxxxxx2222222222000xxx\r\nxxxxxxxxx2222222222000xxx\r\nxxxxxxxxx2222222222000xxx\r\nxxxxxxxxx2222222222000xxx\r\nx333333332222222222000xxx\r\nx333333332222222222000xxx\r\nx333333332222222222000xxx\r\nx333333332222222222000xxx\r\nx333333332222222222000xxx\r\nx333332222222222222000xxx\r\nx333332222222222222000xxx\r\nx333332222222222222000xxx\r\nx333332222222222222000xxx\r\nx333333332222222222000xxx\r\nxxxxx31111112222222000xxx\r\nxxxxx31111111000000000xxx\r\nxxxxx31111111000000000xxx\r\nxxxxx31111111000000000xxx\r\nxxxxx31111111000000000xxx\r\nxxxxxxxxxxxxxxx00xxxxxxxx\r\nxxxxxxxxxxxxxxx00xxxxxxxx\r\nxxxxxxxxxxxxxxx00xxxxxxxx\r\nxxxxxxxxxxxxxxx00xxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxx', 'SWHS119pub_sofa2SDIIPAHs120pub_sofaPEIIPAHs121pub_sofaQEIIPAHq211bardesk1SBJJHHc212pub_chairPCJJRAHQ311bardesk2SBKJHHq411bardesk1SBPAJHHc412pub_chairPCPAJRAHQ511bardesk2SBQAJHHf518pub_fenceRDQAJIHq611bardesk1SBRAJHHc612pub_chairPCRAJRAHf618pub_fenceRDRAJHHQ711bardesk2SBSAJHHf718pub_fenceRDSAJHHq811bardesk1SBPBJHHc812pub_chairPCPBJRAHf818pub_fenceRDPBJHHw910bardesk4RBQBJHHW911bardesk3SBQBJHHf918pub_fenceRDQBJHHf1018pub_fenceRDRBJHHC112pub_chair2JSBKPAHC113pub_chair2KSBKPAHC115pub_chair2QASBKPAHC116pub_chair2RASBKPAHf118pub_fencePBSBKIHf1118pub_fenceRDSBJHHf128pub_fencePBPCKHHf1218pub_fenceRDPCJHHf138pub_fencePBQCKHHC139pub_chair2QBQCJJHk1314pub_chair3RCQCJJHT1315pub_table2SCQCJIHk1316pub_chair3PDQCJRAHf1318pub_fenceRDQCJHHf148pub_fencePBRCKJHC149pub_chair2QBRCJJHk1414pub_chair3RCRCJJHT1415pub_table2SCRCJJHk1416pub_chair3PDRCJRAHf1418pub_fenceRDRCJHHt151pub_tableISCKHHf155pub_fenceQASCKIHf1518pub_fenceRDSCJHHS161pub_sofa2IPDKJHf165pub_fenceQAPDKHHf1618pub_fenceRDPDJHHs171pub_sofaIQDKJHf175pub_fenceQAQDKHHk1713pub_chair3QCQDJPAHk1714pub_chair3RCQDJPAHk1715pub_chair3SCQDJPAHk1716pub_chair3PDQDJPAHf1718pub_fenceRDQDJHHs181pub_sofaIRDKJHf185pub_fenceQARDKHHT1813pub_table2QCRDJQAHT1814pub_table2RCRDJRAHT1815pub_table2SCRDJRAHT1816pub_table2PDRDJPAHf1818pub_fenceRDRDJHHs192pub_sofaJSDKHHS193pub_sofa2KSDKHHf195pub_fenceQASDKHHk1913pub_chair3QCSDJHHk1914pub_chair3RCSDJHHk1915pub_chair3SCSDJHHk1916pub_chair3PDSDJHHf1918pub_fenceRDSDJHHf201pub_fenceIPEKQAHf202pub_fenceJPEKRAHf203pub_fenceKPEKRAHf204pub_fencePAPEKRAHf205pub_fenceQAPEKKHf2018pub_fenceRDPEJHHS217pub_sofa2SAQEIPAHs218pub_sofaPBQEIPAHf2112pub_fencePCQEJQAHf2113pub_fenceQCQEJRAHf2114pub_fenceRCQEJRAHf2115pub_fenceSCQEJRAHf2116pub_fencePDQEJRAHf2117pub_fenceQDQEJRAHf2118pub_fenceRDQEJKHS226pub_sofa2RAREIJHt2215pub_tableSCREHHHC2216pub_chair2PDREHPAHC2217pub_chair2QDREHPAHs236pub_sofaRASEIJHT238pub_table2PBSEIIHs246pub_sofaRAPFIJHT248pub_table2PBPFIHHs256pub_sofaRAQFIJHT258pub_table2PBQFIJ', '0'), + ('newbie_lobby', 2, 11, 2, 'xxxxxxxxxxxxxxxx000000\r\nxxxxx0xxxxxxxxxx000000\r\nxxxxx00000000xxx000000\r\nxxxxx000000000xx000000\r\n0000000000000000000000\r\n0000000000000000000000\r\n0000000000000000000000\r\n0000000000000000000000\r\n0000000000000000000000\r\nxxxxx000000000000000xx\r\nxxxxx000000000000000xx\r\nx0000000000000000000xx\r\nx0000000000000000xxxxx\r\nxxxxxx00000000000xxxxx\r\nxxxxxxx0000000000xxxxx\r\nxxxxxxxx000000000xxxxx\r\nxxxxxxxx000000000xxxxx\r\nxxxxxxxx000000000xxxxx\r\nxxxxxxxx000000000xxxxx\r\nxxxxxxxx000000000xxxxx\r\nxxxxxxxx000000000xxxxx\r\nxxxxxx00000000000xxxxx\r\nxxxxxx00000000000xxxxx\r\nxxxxxx00000000000xxxxx\r\nxxxxxx00000000000xxxxx\r\nxxxxxx00000000000xxxxx\r\nxxxxx000000000000xxxxx\r\nxxxxx000000000000xxxxx', 'SOHa016crl_lampPDHHHHy017crl_sofa2cQDHHPAHw018crl_sofa2bRDHHPAHv019crl_sofa2aSDHHPAHa020crl_lampPEHHHHb116crl_chairPDIHJHa27crl_lampSAJHHHa211crl_lampSBJHHHb216crl_chairPDJHJHc35crl_pillarQAKHHHb37crl_chairSAKHJHu39crl_table1bQBKHHHs311crl_sofa1cSBKHRAHb316crl_chairPDKHJHA319crl_table2bSDKHHHz320crl_table2aPEKHHHa40crl_lampHPAHHHy41crl_sofa2cIPAHPAHw42crl_sofa2bJPAHPAHv43crl_sofa2aKPAHPAHa44crl_lampPAPAHHHt49crl_table1aQBPAHHHr411crl_sofa1bSBPAHRAHh415crl_wall2aSCPAHHHa416crl_lampPDPAHHHb50crl_chairHQAHJHb57crl_chairSAQAHJHq511crl_sofa1aSBQAHRAHA62crl_table2bJRAHHHz63crl_table2aKRAHHHa611crl_lampSBRAHHHb70crl_chairHSAHJHa80crl_lampHPBHHHD81crl_sofa3cIPBHHHC82crl_sofa3bJPBHHHB83crl_sofa3aKPBHHHa84crl_lampPAPBHHHo819crl_barchair2SDPBHHHp820crl_tablebarPEPBHHHo821crl_barchair2QEPBHHHE95crl_pillar2QAQBHHHc99crl_pillarQBQBHHHP158crl_desk1aPBSCHHHO159crl_deskiQBSCHHHN1510crl_deskhRBSCHHHM1610crl_deskgRBPDHHHL1710crl_deskfRBQDHHHK1810crl_deskeRBRDHHHK1910crl_deskeRBSDHHHK2010crl_deskeRBPEHHHK2110crl_deskeRBQEHHHK2210crl_deskeRBREHHHK2310crl_deskeRBSEHHHG247crl_wallbSAPFHHHK2410crl_deskeRBPFHHHF257crl_wallaSAQFHHHH258crl_desk1bPBQFHHHI259crl_desk1cQBQFHHHJ2510crl_desk1dRBQFHHHd2712crl_lamp2PCSFHHHf2713crl_cabinet2QCSFHHHe2714crl_cabinet1RCSFHHHd2715crl_lamp2SCSFHH', '0'), + ('tearoom', 21, 19, 6, 'xxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxx3333x33333333x\r\n333333xx3333x33333333x\r\n3333333x3333x33333333x\r\n3333333x3333x33333333x\r\n3333333xxxxxx33333333x\r\n333333333333333333333x\r\n333333333333333333333x\r\n333333333333333333333x\r\n333333333333333333333x\r\n33333333222x333333333x\r\n33333333222x333333333x\r\n33333333222x333333333x\r\n33333333222x333333333x\r\n33333333111x333333333x\r\n33333333111x333333333x\r\n33333333111x333333333x\r\nxxxxxxxx111xxxxxxxxxxx\r\n11111111111111111111xx\r\n1111111111111111111111\r\n1111111111111111111111\r\n11111111111111111111xx', 'QIHh113hardwoodsofa1QCIKPAHi114hardwoodsofa2RCIKPAHj115hardwoodsofa3SCIKPAHc116teabambooPDIKHHh118hardwoodsofa1RDIKPAHi119hardwoodsofa2SDIKPAHj120hardwoodsofa3PEIKPAHl313teasmalltable1QCKKHHk315teasmalltable2SCKKHHl318teasmalltable1RDKKHHk320teasmalltable2PEKKHHe62teastoolJRAKPAHe63teastoolKRAKPAHf68chinastoolredPBRAKPAHf69chinastoolredQBRAKPAHf610chinastoolredRBRAKPAHf611chinastoolredSBRAKPAHa82teatable1JPBKHHb83teatable2KPBKHHm92teastool2JQBKHHm93teastool2KQBKHHe916teastoolPDQBKPAHe917teastoolQDQBKPAHa1116teatable1PDSBKHHb1117teatable2QDSBKHHe122teastoolJPCKPAHe123teastoolKPCKPAHm1216teastool2PDPCKHHm1217teastool2QDPCKHHa142teatable1JRCKHHb143teatable2KRCKHHm152teastool2JSCKHHm153teastool2KSCKHHd180teavaseHRDIHHg190chinastoolgreenHSDIJHg200chinastoolgreenHPEIJHd210teavaseHQEIH', '0'), + ('rooftop', 17, 12, 2, '44xxxxxxxxxxxxxxxxxx\r\n444xxxxxxxxxxx444444\r\n4444xxxxxxxxxx444444\r\n44444xxxx4xxxx444444\r\n444444xxx44xxx444444\r\n44444444444444444444\r\n44444444444444444444\r\n44444444444444444444\r\n44444444xx44xx44xx44\r\n44444444xx44xx44xx44\r\n44444444444444444444\r\n44444444444444444444\r\n44444444444444444444\r\nx444444x444444xx4444\r\nx444444x444444xx333x\r\nx444444x444444xx222x\r\nx444444x444444xx11xx\r\nx444444x444444xxxxxx', 'PKHa10rooftop_minichairHIPAPAHd116rooftop_flatcurbPDIPAPAHe117rooftop_flatcurb2QDIPAPAHc20rooftop_rodtableHJPAHHa21rooftop_minichairIJPARAHa30rooftop_minichairHKPAHHd416rooftop_flatcurbPDPAPAHHe417rooftop_flatcurb2QDPAPAHHa62rooftop_minichairJRAPAPAHa71rooftop_minichairISAPAJHc72rooftop_rodtableJSAPAHHa73rooftop_minichairKSAPARAHa82rooftop_minichairJPBPAHHa90rooftop_minichairHQBPAPAHb100rooftop_emptytableHRBPAHHa110rooftop_minichairHSBPAHHd131rooftop_flatcurbIQCPAJHd136rooftop_flatcurbRAQCPARAHd138rooftop_flatcurbPBQCPAJHd1313rooftop_flatcurbQCQCPARAHf141rooftop_flatcurb3IRCPAJHf146rooftop_flatcurb3RARCPARAHf148rooftop_flatcurb3PBRCPAJHf1413rooftop_flatcurb3QCRCPARAHf151rooftop_flatcurb3ISCPAJHf156rooftop_flatcurb3RASCPARAHf158rooftop_flatcurb3PBSCPAJHf1513rooftop_flatcurb3QCSCPARAHf161rooftop_flatcurb3IPDPAJHf166rooftop_flatcurb3RAPDPARAHf168rooftop_flatcurb3PBPDPAJHf1613rooftop_flatcurb3QCPDPARAHg171rooftop_flatcurb4IQDPAHHf172rooftop_flatcurb3JQDPAHHf173rooftop_flatcurb3KQDPAHHf174rooftop_flatcurb3PAQDPAHHf175rooftop_flatcurb3QAQDPAHHh176rooftop_flatcurb5RAQDPAHHg178rooftop_flatcurb4PBQDPAHHf179rooftop_flatcurb3QBQDPAHHf1710rooftop_flatcurb3RBQDPAHHf1711rooftop_flatcurb3SBQDPAHHf1712rooftop_flatcurb3PCQDPAHHh1713rooftop_flatcurb5QCQDPAH', '0'), + ('rooftop_2', 4, 9, 2, 'x0000x000\r\nxxxxxx000\r\n000000000\r\n000000000\r\n000000000\r\n000000000\r\n000000000\r\n000000000\r\n000000000\r\n000000000\r\nxxx000xxx\r\nxxx000xxx', 'RDHk08rooftop_bigchairPBHHPAHl18rooftop_bigtablePBIHHHj20rooftop_sofabHJHPAHi21rooftop_sofaIJHPAHk28rooftop_bigchairPBJHHHk38rooftop_bigchairPBKHPAHl48rooftop_bigtablePBPAHHHj50rooftop_sofabHQAHHHi51rooftop_sofaIQAHHHk58rooftop_bigchairPBQAHHHj60rooftop_sofabHRAHPAHi61rooftop_sofaIRAHPAHj67rooftop_sofabSARAHPAHi68rooftop_sofaPBRAHPAHj90rooftop_sofabHQBHHHi91rooftop_sofaIQBHHHj97rooftop_sofabSAQBHHHi98rooftop_sofaPBQBHH', '0'), + ('star_lounge', 37, 36, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx2222x4444442222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222x444x32222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222xx4xx22222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222222222222222111xxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxx22222222222222222111xxxxxxxxx\r\nxxxxxxxxxxxxxxxx3333x22222222222222xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxx3333x22222222222222xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxx3333x22222222221111xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxx3333xx2x22222220000xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxx333333332222222000000xxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxx333333332222222x0000000xxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxx33333332222222x0000000xxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxx222222000000xxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'PXHk1521star_tableQESCJHHa1522star_sofaRESCJPAHb1523star_sofa2SESCJPAHz1524palmPFSCJHHb1621star_sofa2QEPDJJHQ1632dj1PHPDJHHW1633dj2QHPDJHHE1634dj3RHPDJHHa1721star_sofaQEQDJJHm1728star_microphonePGQDPAHHb1821star_sofa2QERDJJHa1835star_sofaSHRDJRAHa1921star_sofaQESDJJHb1935star_sofa2SHSDJRAHb2021star_sofa2QEPEJJHb2024star_sofa2PFPEJJHa2032star_sofaPHPEJRAHa2035star_sofaSHPEJRAHa2121star_sofaQEQEJJHa2124star_sofaPFQEJJHb2132star_sofa2PHQEJRAHb2135star_sofa2SHQEJRAHc2221star_sofachairQEREJJHk2224star_tablePFREJHHb2225star_sofa2QFREJHHa2226star_sofaRFREJHHb2230star_sofa2RGREJHHa2231star_sofaSGREJHHk2232star_tablePHREJHHk2235star_tableSHREJHHz2321palmQESEJHHa2335star_sofaSHSEJRAHp2422bar10REPFJHHb2435star_sofa2SHPFJRAHa2437star_sofaQIPFIPAHb2438star_sofa2RIPFIPAHa2439star_sofaSIPFIPAHb2440star_sofa2PJPFIPAHo2522bar9REQFJHHb2525star_sofa2QFQFJHHa2526star_sofaRFQFJHHb2530star_sofa2RGQFJHHa2531star_sofaSGQFJHHa2535star_sofaSHQFJRAHb2536star_sofa2PIQFIJHi2622bar8RERFJHHX2625palm1QFRFJHHV2626palm3RFRFJHHC2630palm2RGRFJHHB2631palm4SGRFJHHb2635star_sofa2SHRFJRAHa2636star_sofaPIRFIJHk2639star_tableSIRFIHHk2640star_tablePJRFIHHu2722bar7RESFJHHa2725star_sofaQFSFJPAHb2726star_sofa2RFSFJPAHa2730star_sofaRGSFJPAHb2731star_sofa2SGSFJPAHk2735star_tableSHSFJHHz2736palmPISFIHHk2737star_tableQISFIHHy2822bar6REPGJHHt2922bar5REQGJHHk2925star_tableQFQGJHHk2926star_tableRFQGJHHk3016star_tablePDRGKHHr3022bar4RERGJHHb3116star_sofa2PDSGKJHe3122bar3RESGJHHb3125star_sofa2QFSGJHHa3126star_sofaRFSGJHHa3130star_sofaRGSGJRAHa3216star_sofaPDPHKJHw3222bar2REPHJHHB3225palm4QFPHJHHX3226palm1RFPHJHHb3230star_sofa2RGPHJRAHb3316star_sofa2PDQHKJHq3322bar1REQHJHHa3325star_sofaQFQHJPAHb3326star_sofa2RFQHJPAHa3330star_sofaRGQHJRAHa3416star_sofaPDRHKJHb3430star_sofa2RGRHJRAHV3435palm3SHRHHHHC3436palm2PIRHHHHk3516star_tablePDSHKHHa3530star_sofaRGSHJRAHb3630star_sofa2RGPIJRAHc3725star_sofachairQFQIJHHb3726star_sofa2RFQIJHHa3727star_sofaSFQIJHHb3728star_sofa2PGQIJHHa3729star_sofaQGQIJHHk3730star_tableRGQIJH', '0'), + ('netcafe', 22, 12, 2, 'xxxxx1111xxxxxxxxxxx1xxxx\r\nxxxxx1111111111111111xxxx\r\nxxxxx1111111111111111xxxx\r\nxxxxx1111111111111111xxxx\r\nxxxxxxxx0000000000000xxxx\r\n111111100000000000000xxxx\r\n111111100000000000000xxxx\r\n111111100000000000000xxxx\r\nxxxx11100000000000000xxxx\r\nx1xx11100000000000000xxxx\r\nx1xx11100000000000000xxxx\r\nx1xx111000000000000000000\r\nx1xx111000000000000000000\r\nxxxx111000000000000000000\r\nxxxx11100000000000000xxxx\r\nxxxx1110000000xx11111xxxx\r\nxxxxx111110000x111111xxxx\r\nxxxxxx111100001111111xxxx\r\nxxxxxx111100001111111xxxx\r\nxxxxxx111100001111111xxxx\r\nxxxxxx111100001111111xxxx\r\nxxxxxx111100001111111xxxx\r\nxxxxxx111100001111111xxxx\r\nxxxxx1111100001111111xxxx', 'RRHi06shift1RAHIPAHj07shift2SAHIPAHm110mRBIIHHl113lQCIIHHk116kPDIIHHk119kSDIIHHh35kukat6QAKIHHg36kukat5RAKIHHc312kukat2PCKIHHb313kukat1QCKIHHc319kukat2SDKIHHb320kukat1PEKIHHi412shift1PCPAHPAHj413shift2QCPAHPAHi419shift1SDPAHPAHj420shift2PEPAHPAHi50shift1HQAIPAHj51shift2IQAIPAHi52shift1JQAIPAHj53shift2KQAIPAHk715kSCSAHJHo716table2PDSAHRAHz717tablecornerQDSAHHHm718mRDSAHRAHl815lSCPBHJHo816table2PDPBHPAHl818lRDPBHRAHm94mPAQBIRAHk99kQBQBHJHp910table3RBQBHRAHz911tablecornerSBQBHHHm912mPCQBHRAHk915kSCQBHJHo916table2PDQBHJHk918kRDQBHRAHk104kPARBIRAHm109mQBRBHJHp1010table3RBRBHPAHm1012mPCRBHRAHm1015mSCRBHJHo1016table2PDRBHHHk1018kRDRBHRAHl114lPASBIRAHl119lQBSBHJHp1110table3RBSBHJHl1112lPCSBHRAHk124kPAPCIRAHl129lQBPCHJHp1210table3RBPCHHHk1212kPCPCHRAHm134mPAQCIRAHc165kukat2QAPDIHHb166kukat1RAPDIHHc167kukat2SAPDIHHb168kukat1PBPDIHHe169kukat3QBPDIHHd1615kukka2SCPDIHHf179kukat4QBQDIHHk186kRARDIRAHe189kukat3QBRDIHHs1820sofabig3PERDIRAHf199kukat4QBSDIHHn1917table1QDSDIPAHz1918tablecornerRDSDIHHr1920sofabig2PESDIRAHn2017table1QDPEIJHr2020sofabig2PEPEIRAHm216mRAQEIRAHn2117table1QDQEIHHq2120sofabig1PEQEIRAHv2316sofalittle3PDSEIHHu2317sofalittle2QDSEIHHt2318sofalittle1RDSEIHHa2320kukkaPESEIH', '0'), + ('dusty_lounge', 14, 1, 4, 'xxxxxxxxxxxxxx22xxxxxxxxxxxxx\r\nxxxxxxxxxx222x222x2xxxxxxxxxx\r\nxxxxxxx33322222222223xxxxxxx3\r\nxxxxxxx33322222222223xxxxxxx3\r\nxxxxxxx33322222222223x33333x3\r\nxxxxxxx33322222222223x33333x3\r\nxx111xx33322222222223xxxxxxx3\r\nxx111xxx332222222222333333333\r\nxx111xxxx32222222222333333333\r\nxx111xxxxxx222222222333333333\r\nxx111xxxxxxx1111111x333333333\r\nxx111xxxxxxx1111111x222222222\r\nxx111xxxxxx111111111111111111\r\nxx111xxxxxx111111111111111111\r\n11111xxxxxx111111111111111111\r\n11111xxxxxx111111111111111111\r\n11x11xxxxxx111111111111111111\r\n11xxxxxxxxx11111111111111111x\r\nx11xxxxxxxxx1111111x1111111xx\r\nxx11xxxxxxx111111111111111xxx\r\nxxx11xxxxxx11111111111111xxxx\r\nxxxx11111111111111111111xxxxx\r\nxxxxx11111111111111xxxxxxxxxx\r\nxxxxxxxxxxx11111111xxxxxxxxxx\r\nxxxxxxxxxxx11111111xxxxxxxxxx', 'QHHc48greenchair2PBPAKPAHd49greenchair1QBPAKPAHc68greenchair2PBRAKHHd69greenchair1QBRAKHHa620dustylampPERAKJHa628dustylampPGRAKJHc73greenchair2KSAIPAHd74greenchair1PASAIPAHc93greenchair2KQBIHHd94greenchair1PAQBIHHb1021yellowchairQERBKJHb1023yellowchairSERBKRAHb1026yellowchairRFRBKJHb1028yellowchairPGRBKRAHc1211greenchair2SBPCIJHc133greenchair2KQCIPAHd134greenchair1PAQCIPAHd1311greenchair1SBQCIJHa1411dustylampSBRCIJHc153greenchair2KSCIHHd154greenchair1PASCIHHc1511greenchair2SBSCIJHb1524yellowchairPFSCIPAHd1611greenchair1SBPDIJHb1722yellowchairREQDIJHa1724dustylampPFQDIJHb1726yellowchairRFQDIRAHa1911dustylampSBSDIJHb1924yellowchairPFSDIHHc2312greenchair2PCSEIJHc2314greenchair2RCSEIRAHd2412greenchair1PCPFIJHd2414greenchair1RCPFIRA', '0'), + ('orient', 35, 22, 6, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxx00000000xxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1000000000xxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxx1xx000x000xx111x111xxx\r\nxxxxxxxxxxxxxx1xx000x000xxxxxx1111xx\r\nxxxxxxxxxxxxxx1xx000x000x111111111xx\r\nxxxxxxxxxxxxxx1xx000x000x111111111xx\r\nxxx111111111111xx000x000x111111111xx\r\nxxx1xxxxxxxxxxxxx000x000x111111111xx\r\nxxx1x1111111111000000000x111111111xx\r\nxxx1x1111111111000000000xx1111111xxx\r\nxxx1x11xxxxxx11000000000xx1111111100\r\nxxx111xxxxxxx11000000000011111111100\r\nxxx111xxxxxxx11000000000011111111100\r\nxxxxx1xxxxxxx11000000000011111111100\r\nxxxxx11xxxxxx11000000000xx1111111100\r\nxxxxx1111111111000000000xx1111111xxx\r\nxxxxx1111111111xx000x000x111111111xx\r\nxxxxxxxxxxxxxxxxx000x000x111111111xx\r\nxxxxxxxxxxxxxxxxx000x000x111111111xx\r\nxxxxxxxxxxxxxxxxx000x000x111111111xx\r\nxxxxxxxxxxxxxxxxx000x000x111111111xx\r\nxxxxxxxxxxxxxxxxx000x00xx11xxxx111xx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxx11111111xx', 'SOHd1017benchQDRBHJHd1019benchSDRBHRAHd1021benchQERBHJHd1023benchSERBHRAHd1117benchQDSBHJHd1119benchSDSBHRAHd1121benchQESBHJHd1123benchSESBHRAHb1132koc_chairPHSBIPAHd1217benchQDPCHJHd1219benchSDPCHRAHd1221benchQEPCHJHd1223benchSEPCHRAHb1231koc_chairSGPCIJHa1232koc_tablePHPCIHHb1233koc_chairQHPCIRAHd1317benchQDQCHJHd1319benchSDQCHRAHd1321benchQEQCHJHd1323benchSEQCHRAHb1325koc_chairQFQCIPAHb1332koc_chairPHQCIHHd1417benchQDRCHJHd1419benchSDRCHRAHd1421benchQERCHJHd1423benchSERCHRAHa1425koc_tableQFRCIHHb1426koc_chairRFRCIRAHd1517benchQDSCHJHd1519benchSDSCHRAHd1521benchQESCHJHd1523benchSESCHRAHb1525koc_chairQFSCIHHb1529koc_chairQGSCIJHa1530koc_tableRGSCIHHb1531koc_chairSGSCIRAHb1630koc_chairRGPDIHHc2425chairf1QFPFIJHc2433chairf1QHPFIRAHd2517benchQDQFHJHd2519benchSDQFHRAHd2521benchQEQFHJHd2523benchSEQFHRAHc2525chairf1QFQFIJHc2533chairf1QHQFIRAHd2617benchQDRFHJHd2619benchSDRFHRAHd2621benchQERFHJHd2623benchSERFHRAHc2625chairf1QFRFIJHc2633chairf1QHRFIRAHd2717benchQDSFHJHd2719benchSDSFHRAHd2721benchQESFHJHd2723benchSESFHRAHd2817benchQDPGHJHd2819benchSDPGHRAHd2821benchQEPGHJHd2823benchSEPGHRAHd2917benchQDQGHJHd2919benchSDQGHRAHd2921benchQEQGHJHd2923benchSEQG`hFFRA', '0'), + ('custom_model', 0, 0, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxx0000000000000xxxx\r\nxxxxxxxxxxx000000000000000xxx\r\nxxxxxxxxxx00000000000000000xx\r\nxxxxxxxxxx00000000000000000xx\r\nxxxxxxxxxx00000000000000000xx\r\nxxxxxxxxxx11111111111111111xx\r\nxxxxxxxxxx22222222222222222xx\r\nxxxxxxxxxx22222222222222222xx\r\nxxxxxxxxxx22222222222222222xx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('theater', 20, 27, 0, 'XXXXXXXXXXXXXXXXXXXXXXX\r\nXXXXXXXXXXXXXXXXXXXXXXX\r\nXXXXXXXXXXXXXXXXXXXXXXX\r\nXXXXXXXXXXXXXXXXXXXXXXX\r\nXXXXXXXXXXXXXXXXXXXXXXX\r\nXXXXXXXXXXXXXXXXXXXXXXX\r\nXXXXXXX111111111XXXXXXX\r\nXXXXXXX11111111100000XX\r\nXXXX00X11111111100000XX\r\nXXXX00x11111111100000XX\r\n4XXX00X11111111100000XX\r\n4440000XXXXXXXXX00000XX\r\n444000000000000000000XX\r\n4XX000000000000000000XX\r\n4XX0000000000000000000X\r\n44400000000000000000000\r\n44400000000000000000000\r\n44X00000000000000000000\r\n44X11111111111111111000\r\n44X11111111111111111000\r\n33X11111111111111111000\r\n22X11111111111111111000\r\n22X11111111111111111000\r\n22X11111111111111111000\r\n22X11111111111111111000\r\n22X11111111111111111000\r\n22211111111111111111000\r\n22211111111111111111000\r\nXXXXXXXXXXXXXXXXXXXX00X\r\nXXXXXXXXXXXXXXXXXXXX00X', 'QKHm1011micSBRBIHHd112thchair2JSBPAJHd122thchair2JPCPAJHd152thchair2JSCPAJHc156thchair1RASCHHHc157thchair1SASCHHHc158thchair1PBSCHHHc159thchair1QBSCHHHc1510thchair1RBSCHHHc1512thchair1PCSCHHHc1513thchair1QCSCHHHc1514thchair1RCSCHHHc1515thchair1SCSCHHHc1516thchair1PDSCHHHd162thchair2JPDPAJHc206thchair1RAPEIHHc207thchair1SAPEIHHc208thchair1PBPEIHHc209thchair1QBPEIHHc2010thchair1RBPEIHHc2012thchair1PCPEIHHc2013thchair1QCPEIHHc2014thchair1RCPEIHHc2015thchair1SCPEIHHc2016thchair1PDPEIHHc236thchair1RASEIHHc237thchair1SASEIHHc238thchair1PBSEIHHc239thchair1QBSEIHHc2310thchair1RBSEIHHc2312thchair1PCSEIHHc2313thchair1QCSEIHHc2314thchair1RCSEIHHc2315thchair1SCSEIHHc2316thchair1PDSEIHHc266thchair1RARFIHHc267thchair1SARFIHHc268thchair1PBRFIHHc269thchair1QBRFIHHc2610thchair1RBRFIHHc2612thchair1PCRFIHHc2613thchair1QCRFIHHc2614thchair1RCRFIHHc2615thchair1SCRFIHHc2616thchair1PDRFIH', '0'), + ('picnic', 16, 5, 4, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxx22222xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n22xxxxxxxxxxxxx22xxxxxxxxxxxxxxxxxxxxx\r\n2222222222222222222x222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222xxx222222222222222222222222\r\n2222222222xx33x22222222222222222222222\r\n222222222xx3333x2222222222222222222222\r\n222222222x333333x222222222222222222222\r\n222222222x333333x222222222222222222222\r\n2222222222x3332x2222222222222222222222\r\n22222222222x33x22222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222x22222xxxx22222222222222222222\r\n22222222222222xxxx22222222222222222222\r\n22222222222222xxx222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222\r\n22222222222222222222222222222222222222', 'PcHh710hedge7RBSAJPAHh711hedge7SBSAJPAHh712hedge7PCSAJPAHh713hedge7QCSAJPAHy714hedge8RCSAJPAHs718hedge2RDSAJPAHh719hedge7SDSAJPAHh720hedge7PESAJPAHh721hedge7QESAJPAHz814hedge9RCPBJPAHz818hedge9RDPBJPAHv93hedge5KQBJPAHz103hedge9KRBJPAHc1112picnic_dummychair1PCSBKPAHc1113picnic_dummychair1QCSBKPAHc1114picnic_dummychair1RCSB`hFFPAHc1310picnic_dummychair1RBQCKJHc1315picnic_dummychair1SCQCKRAHb1321picnic_groundQEQCJPAHb147picnic_groundSARCJPAHc1410picnic_dummychair1RBRCKJHc1415picnic_dummychair1SCRCKRAHb1519picnic_groundSDSCJJHb1523picnic_groundSESCJRAHb165picnic_groundQAPDJJHb169picnic_groundQBPDJRAHL1620picnic_cloth1PEPDJJHL176picnic_cloth1RAQDJJHb1721picnic_groundQEQDJHHb187picnic_groundSARDJHHa190picnic_redbench2HSDJJHA200picnic_redbench1HPEJJHw2011hedge6SBPEJPAHh2012hedge7PCPEJPAHh2013hedge7QCPEJPAHt2014hedge3RCPEJPAHu2017hedge4QDPEJPAHh2018hedge7RDPEJPAHh2019hedge7SDPEJPAHy2020hedge8PEPEJPAHv2111hedge5SBQEJPAHM2112picnic_bench1PCQEJPAHN2113picnic_bench2QCQEJPAHO2114picnic_bench3RCQEJPAHM2117picnic_bench1QDQEJPAHN2118picnic_bench2RDQEJPAHO2119picnic_bench3SDQEJPAHv2120hedge5PEQEJPAHa220picnic_redbench2HREJJHv2211hedge5SBREJPAHv2220hedge5PEREJPAHb2225picnic_groundQFREJPAHA230picnic_redbench1HSEJJHv2311hedge5SBSEJPAHM2312picnic_bench1PCSEJJHM2319picnic_bench1SDSEJRAHv2320hedge5PESEJPAHc246picnic_dummychair1RAPFJPAHd247picnic_dummychair4SAPFJPAHe248picnic_dummychair6PBPFJPAHv2411hedge5SBPFJPAHN2412picnic_bench2PCPFJJHN2419picnic_bench2SDPFJRAHv2420hedge5PEPFJPAHb2423picnic_groundSEPFJJHb2427picnic_groundSFPFJRAHK255picnic_stumpQAQFJJHv2511hedge5SBQFJPAHN2512picnic_bench2PCQFJJHN2519picnic_bench2SDQFJRAHv2520hedge5PEQFJPAHG2524picnic_cloth2PFQFJJHK267picnic_stumpSARFJHHv2611hedge5SBRFJPAHO2612picnic_bench3PCRFJJHH2614picnic_fireplace1RCRFJHHI2616picnic_fireplace2PDRFJJHO2619picnic_bench3SDRFJRAHv2620hedge5PERFJPAHb2625picnic_groundQFRFJHHz2711hedge9SBSFJPAHQ2712picnic_lemonadePCSFJPAHz2720hedge9PESFJPAHE298picnic_firewood2PBQGJHHa300picnic_redbench2HRGJJHD308picnic_firewood1PBRGJHHA310picnic_redbench1HSGJJHD318picnic_firewood1PBSGJHHM3112picnic_bench1PCSGJPAHN3113picnic_bench2QCSGJPAHO3114picnic_bench3RCSGJPAHM3118picnic_bench1RDSGJPAHN3119picnic_bench2SDSGJPAHO3120picnic_bench3PESGJPAHf3127picnic_carrotSFSGJHHf3128picnic_carrotPGSGJHHf3129picnic_carrotQGSGJHHf3130picnic_carrotRGSGJHHf3131picnic_carrotSGSGJHHD328picnic_firewood1PBPHJHHF3212picnic_table2PCPHJJHP3214picnic_tableRCPHJJHF3218picnic_table2RDPHJJHP3220picnic_tablePEPHJJHr333hedge1KQHJPAHD338picnic_firewood1PBQHJHHM3312picnic_bench1PCQHJHHN3313picnic_bench2QCQHJHHO3314picnic_bench3RCQHJHHM3318picnic_bench1RDQHJHHN3319picnic_bench2SDQHJHHO3320picnic_bench3PEQHJHHg3327picnic_cabbageSFQHJHHg3328picnic_cabbagePGQHJHHg3329picnic_cabbageQGQHJHHv343hedge5KRHJPAHD348picnic_firewood1PBRHJHHv353hedge5KSHJPAHD358picnic_firewood1PBSHJHHv363hedge5KPIJPAHD368picnic_firewood1PBPIJHHD378picnic_firewood1PBQIJHHM3712picnic_bench1PCQIJPAHN3713picnic_bench2QCQIJPAHO3714picnic_bench3RCQIJPAHM3718picnic_bench1RDQIJPAHN3719picnic_bench2SDQIJPAHO3720picnic_bench3PEQIJPAHD388picnic_firewood1PBRIJHHF3812picnic_table2PCRIJJHP3814picnic_tableRCRIJJHF3818picnic_table2RDRIJJHP3820picnic_tablePERIJJHJ398picnic_firewood3PBSIJHHM3912picnic_bench1PCSIJHHN3913picnic_bench2QCSIJHHO3914picnic_bench3RCSIJHHM3918picnic_bench1RDSIJHHN3919picnic_bench2SDSIJHHO3920picnic_bench3PESIJH', '0'), + ('cinema_a', 20, 27, 0, 'xxxxxxx1xx11111111xxxxxx\r\nxxx1111111111111111xxxxx\r\nxxx111xxxx1111111111xxxx\r\nxxxx2xxxxxxxxxxxxxxxxxxx\r\nxx3x3x333311xxxxxxxxxx11\r\nxx3333333311111111111111\r\nxx3333333311111111111111\r\nxx3333333311111111122111\r\nxx3333333311x22222222111\r\nxx3333333311x22222222111\r\nxx3333333311xxxxxxxxx111\r\nxx3333333311111111111111\r\nxx3333333311111111111111\r\nxx3333333311111111111111\r\nxx3333333311111xxxx11111\r\nxx3333333311111xxxx11111\r\nxx3333333311111xxxx11111\r\nxx3333333311111xxxx11111\r\nxx3333333311111xxxx11111\r\nxx3333333311111xxxx11111\r\nxx3333333311111xxxx11111\r\n333333332111111xxxx11111\r\n333333332111111111111111\r\n333333332111111111111111\r\n333333332111111111111111\r\nxx3333332111111111111111\r\nxxxxxxxxxxxxxxxxxxx11111\r\nxxxxxxxxxxxxxxxxxxx11111\r\nxxxxxxxxxxxxxxxxxxx11111', 'PUHC42orangeJPAKHHA47loungey_chairSAPAKJHV48loungey_tablebigbPBPAKHHA49loungey_chairQBPAKRAHA52loungey_chairJQAKPAHA57loungey_chairSAQAKJHU58loungey_tablebigaPBQAKHHA59loungey_chairQBQAKRAHB62loungey_tableJRAKHHA72loungey_chairJSAKHHh713theater_chairQCSAIHHh714theater_chairRCSAIHHh715theater_chairSCSAIHHh716theater_chairPDSAIHHh717theater_chairQDSAIHHh718theater_chairRDSAIHHz721stairQESAIHHL89lightpoleQBPBKHHq813pomomaskiQCPBJJHq814pomomaskiRCPBJHHq815pomomaskiSCPBJHHq816pomomaskiPDPBJHHq817pomomaskiQDPBJHHq818pomomaskiRDPBJHHq819pomomaskiSDPBJIHz821stairQEPBIHHC92orangeJQBKHHh913theater_chairQCQBJHHh914theater_chairRCQBJHHh915theater_chairSCQBJHHh916theater_chairPDQBJHHh917theater_chairQDQBJHHh918theater_chairRDQBJHHh919theater_chairSDQBJHHh920theater_chairPEQBJHHz921stairQEQBIHHA102loungey_chairJRBKPAHA109loungey_chairQBRBKPAHB112loungey_tableJSBKHHB119loungey_tableQBSBKHHA122loungey_chairJPCKHHA129loungey_chairQBPCKHHd1217cubicb_chairQDPCIRAHc1219cubico_chairSDPCIJHd1315cubicb_chairSCQCIJHL1319lightpoleSDQCIHHd1320cubicb_chairPEQCIRAHL149lightpoleQBRCKHHA152loungey_chairJSCKPAHd1514cubicb_chairRCSCIPAHc1519cubico_chairSDSCIPAHB162loungey_tableJPDKHHA167loungey_chairSAPDKJHB168loungey_tablePBPDKJHA169loungey_chairQBPDKRAHd1613cubicb_chairQCPDIJHd1614cubicb_chairRCPDIRAHC1619orangeSDPDIHHA172loungey_chairJQDKHHA177loungey_chairSAQDKJHB178loungey_tablePBQDKJHA179loungey_chairQBQDKRAHd1719cubicb_chairSDQDIJHC182orangeJRDKHHd1814cubicb_chairRCRDIPAHK192bardesqueJSDKHHK202bardesqueJPEKIHb203bar_chairKPEKRAHL209lightpoleQBPEKHHd2014cubicb_chairRCPEIHHd2019cubicb_chairSDPEIJHc2020cubico_chairPEPEIRAHK212bardesqueJQEKIHb213bar_chairKQEKRAHd2119cubicb_chairSDQEIHHK222bardesqueJREKIHb223bar_chairKREKRAHL2216lightpolePDREIHHc2218cubico_chairRDREIHHK232bardesqueJSEKIHb233bar_chairKSEKRAHK242bardesqueJPFKIHb243bar_chairKPFKRAHK252bardesqueJQFKJ', '0'), + ('the_den', 3, 22, 0, '00000000xxxxxxxx\r\n0000000000000000\r\n0000000000000000\r\n000000000000xx00\r\n0000000000000000\r\n0000000000000000\r\n0000000000000000\r\nx000000000000000\r\n0000000000000000\r\n0000000000000000\r\n0000000000000000\r\n0000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nxxx00xxxxxxxxxxx\r\nxxx00xxxxxxxxxxx\r\nxxx00xxxxxxxxxxx\r\nGV00000000xxxxxxxx\r\n0000000000000000\r\n0000000000000000\r\n000000000000xx00\r\n0000000000000000\r\n0000000000000000\r\n0000000000000000\r\nx000000000000000\r\n0000000000000000\r\n0000000000000000\r\n0000000000000000\r\n0000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nx000000000000000\r\nxxx00xxxxxxxxxxx\r\nxxx00xxxxxxxxxxx\r\nxxx00xxxxxxxxxxx', '', '0'), + ('model_s', 0, 3, 2, 'xxxxxx\r\nx00000\r\nx00000\r\n000000\r\nx00000\r\nx00000\r\nx00000\r\nx00000', '', '0'), + ('park_a', 2, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0xxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxx\r\nxxxxxxxxxxxxx0x00xxxxxxxxxxx0x000xxxxxxxxxxx\r\nxxxxxxxxxxxx0000000000000000000000xxxxxxxxxx\r\nxxxxxxxxxxx000000000000000000000000xxxxxxxxx\r\nxxxxxxxxxxx0000000000000000000000000xxxxxxxx\r\nxxxxxxxxxxx00000000000000000000000000xxxxxxx\r\nxxxxxxxx000000000000000000000000000000xxxxxx\r\nxxxxxxx00000000000000000000000000000000xxxxx\r\nxxxxxxx000000000000000000000000000000000xxxx\r\nxxxxxxx0000000000000000000000000000000000xxx\r\nxxxxxxxxx000000000000000000000000000000000xx\r\n00000000000000000000xx00000000000000000000xx\r\n0000000000000000000xxxx00000000000xxxxxxx0xx\r\n0000000000000000000xxxx00000000000x00000xxxx\r\nxxxxx00x0000000000xxxxx0xxxxxx0000x0000000xx\r\nxxxxx0000000000000xxxxx0xx000x0000x000000xxx\r\nxxxxx0000000000000xxxxx0x000000000x00000xxxx\r\nxxxxx000000x0000000xxxx0x000000000xxx00xxxxx\r\nxxxxxxxx000x0000000xxx00xxx000000x0000xxxxxx\r\nxxxxxxxx000x000000xxxx0x0000000000000xxxxxxx\r\nxxxxxxxx000x000000011100000000000000xxxxxxxx\r\nxxxxxxxx000x00000001110000000000000xxxxxxxxx\r\nxxxxxxxxx00x0000000111x00000000x00xxxxxxxxxx\r\nxxxxxxxxxx0x0000000xxx0000000xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxx000000xxxx0000000xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxx000000xxx00xxxxx00xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxx0xxx0xx000x00xxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxx0xxx0x000000xxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxx0xxxxx00000xxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxx0xxxxx00xxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxx0xxxxxxxxxxxxxxxxxxxx', 'RPHN527parkfence2SFQAHHHN529parkfence2QGQAHHHM619parkfence1SDRAHHHO620parkfence3PERAHPAHO621parkfence3QERAHPAHO622parkfence3RERAHPAHN623parkfence2SERAHPAHO624parkfence3PFRAHPAHO625parkfence3QFRAHPAHO626parkfence3RFRAHPAHM627parkfence1SFRAHJHO629parkfence3QGRAHJHN717parkfence2QDSAHHHO719parkfence3SDSAHJHO723parkfence3SESAHJHO727parkfence3SFSAHJHO729parkfence3QGSAHJHO817parkfence3QDPBHJHO819parkfence3SDPBHJHN821parkfence2QEPBHHHO823parkfence3SEPBHJHN825parkfence2QFPBHHHO827parkfence3SFPBHJHO829parkfence3QGPBHJHL98bench2PBQBHPAHK99benchQBQBHPAHO917parkfence3QDQBHJHN919parkfence2SDQBHRAHO921parkfence3QEQBHJHN923parkfence2SEQBHRAHO925parkfence3QFQBHJHN927parkfence2SFQBHRAHO929parkfence3QGQBHJHO1017parkfence3QDRBHJHO1021parkfence3QERBHJHO1025parkfence3QFRBHJHO1029parkfence3QGRBHJHL117bench2SASBHJHM1117parkfence1QDSBHPAHO1118parkfence3RDSBHPAHO1119parkfence3SDSBHPAHO1120parkfence3PESBHPAHN1121parkfence2QESBHJHO1122parkfence3RESBHPAHO1123parkfence3SESBHPAHO1124parkfence3PFSBHPAHN1125parkfence2QFSBHJHO1126parkfence3RFSBHPAHO1127parkfence3SFSBHPAHO1128parkfence3PGSBHPAHM1129parkfence1QGSBHRAHK127benchSAPCHJHL1635bench2SHPDHJHL1637bench2QIPDHPAHK1638benchRIPDHPAHK1735benchSHQDHJHL1827bench2SFRDHPAHK1828benchPGRDHPAHL1835bench2SHRDHJHL1925bench2QFSDHJHK1935benchSHSDHJHK2025benchQFPEHJHL2925bench2QFQGHPAHK2926benchRFQGHPAHL3023bench2SERGHJHK3123benchSESGHJ@`SGSBMRDPBPA0.0I2Mqueue_tile2JMPGRAH0.0I2Mqueue_tile2SAMPFSAJ0.0I2Mqueue_tile2QBMRFSAPA0.0I2Mqueue_tile2SFMSERBJ0.0I2Mqueue_tile2SCMRFPBPA0.0I2Mqueue_tile2REMPGQBH0.0I2Mqueue_tile2PGMPFRBH0.0I2Mqueue_tile2PCMPEPBH0.0I2Mqueue_tile2QGMRFRBJ0.0I2Mqueue_tile2QDMRDQBPA0.0I2Mqueue_tile2RFMRERBJ0.0I2Mqueue_tile2PFMSDRBJ0.0I2Mqueue_tile2PDMPGPBH0.0I2Mqueue_tile2RGMSFRBJ0.0I2Mqueue_tile2RAMRESAPA0.0I2Mqueue_tile2RBMPGSAH0.0I2Mqueue_tile2SDMREQBPA0.0I2Mqueue_tile2QEMRFQBPA0.0I2Mqueue_tile2RCMPFPBH0.0I2Mqueue_tile2KMRDSAPA0.0I2Mqueue_tile2PAMPESAJ0.0I2Mqueue_tile2PBMQFSAJ0.0I2Mqueue_tile2IMPGQAH0.0I2Mqueue_tile2SEMRDRBJ0.0I2Mqueue_tile2QCMREPBPA0.0I2Mqueue_tile2SGMPGRBH0.0I2Mqueue_tile2QAMQESAJ0.0I2Mqueue_tile2QFMPERBH0.0I2Mqueue_tile2RDMPEQBH0.0I2Mqueue_tile2PEMPFQBH0.0I2Mqueue_tile2', '0'), + ('park_b', 11, 2, 6, '0000x0000000\r\n0000xx000000\r\n000000000000\r\n00000000000x\r\n000000000000\r\n00x0000x0000', '', '0'), + ('model_0', 0, 4, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000\r\n000000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx00000000xx00000000xx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_v', 0, 3, 2, 'xxxxxxxxxxxxxxxxxxxx\r\nx222221111111111111x\r\nx222221111111111111x\r\n2222221111111111111x\r\nx222221111111111111x\r\nx222221111111111111x\r\nx222221111111111111x\r\nxxxxxxxx1111xxxxxxxx\r\nxxxxxxxx0000xxxxxxxx\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx00000000000x000000x\r\nx00000000000x000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nxxxxxxxx00000000000x\r\nx000000x00000000000x\r\nx000000x0000xxxxxxxx\r\nx00000000000x000000x\r\nx00000000000x000000x\r\nx00000000000x000000x\r\nx00000000000x000000x\r\nxxxxxxxx0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_t', 0, 3, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx222222222222222222222222222x\r\nx222222222222222222222222222x\r\n2222222222222222222222222222x\r\nx222222222222222222222222222x\r\nx2222xxxxxx222222xxxxxxx2222x\r\nx2222xxxxxx111111xxxxxxx2222x\r\nx2222xx111111111111111xx2222x\r\nx2222xx111111111111111xx2222x\r\nx2222xx11xxx1111xxxx11xx2222x\r\nx2222xx11xxx0000xxxx11xx2222x\r\nx22222111x00000000xx11xx2222x\r\nx22222111x00000000xx11xx2222x\r\nx22222111x00000000xx11xx2222x\r\nx22222111x00000000xx11xx2222x\r\nx22222111x00000000xx11xx2222x\r\nx22222111x00000000xx11xx2222x\r\nx2222xx11xxxxxxxxxxx11xx2222x\r\nx2222xx11xxxxxxxxxxx11xx2222x\r\nx2222xx111111111111111xx2222x\r\nx2222xx111111111111111xx2222x\r\nx2222xxxxxxxxxxxxxxxxxxx2222x\r\nx2222xxxxxxxxxxxxxxxxxxx2222x\r\nx222222222222222222222222222x\r\nx222222222222222222222222222x\r\nx222222222222222222222222222x\r\nx222222222222222222222222222x\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_x', 0, 12, 2, 'xxxxxxxxxxxxxxxxxxxx\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nxxx00xxx0000xxx00xxx\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\n0000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000x0000x000000x\r\nx000000xxxxxx000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nx000000000000000000x\r\nxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_w', 0, 3, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx2222xx1111111111xx11111111\r\nx2222xx1111111111xx11111111\r\n222222111111111111111111111\r\nx22222111111111111111111111\r\nx22222111111111111111111111\r\nx22222111111111111111111111\r\nx2222xx1111111111xx11111111\r\nx2222xx1111111111xx11111111\r\nx2222xx1111111111xxxx1111xx\r\nx2222xx1111111111xxxx0000xx\r\nxxxxxxx1111111111xx00000000\r\nxxxxxxx1111111111xx00000000\r\nx22222111111111111000000000\r\nx22222111111111111000000000\r\nx22222111111111111000000000\r\nx22222111111111111000000000\r\nx2222xx1111111111xx00000000\r\nx2222xx1111111111xx00000000\r\nx2222xxxx1111xxxxxxxxxxxxxx\r\nx2222xxxx0000xxxxxxxxxxxxxx\r\nx2222x0000000000xxxxxxxxxxx\r\nx2222x0000000000xxxxxxxxxxx\r\nx2222x0000000000xxxxxxxxxxx\r\nx2222x0000000000xxxxxxxxxxx\r\nx2222x0000000000xxxxxxxxxxx\r\nx2222x0000000000xxxxxxxxxxx', '', '1'), + ('model_z', 0, 9, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxx00000000000000000000\r\nxxxxxxxxxxx00000000000000000000\r\nxxxxxxxxxxx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\n000000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nx00000000xx00000000000000000000\r\nxxxxxxxxxxx00000000000000000000\r\nxxxxxxxxxxx00000000000000000000\r\nxxxxxxxxxxx00000000000000000000\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_u', 0, 17, 2, 'xxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\n11111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nx1111100000000000000000x\r\nxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_y', 0, 3, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx00000000xx0000000000xx0000x\r\nx00000000xx0000000000xx0000x\r\n000000000xx0000000000xx0000x\r\nx00000000xx0000000000xx0000x\r\nx00000000xx0000xx0000xx0000x\r\nx00000000xx0000xx0000xx0000x\r\nx00000000xx0000xx0000000000x\r\nx00000000xx0000xx0000000000x\r\nxxxxx0000xx0000xx0000000000x\r\nxxxxx0000xx0000xx0000000000x\r\nxxxxx0000xx0000xxxxxxxxxxxxx\r\nxxxxx0000xx0000xxxxxxxxxxxxx\r\nx00000000xx0000000000000000x\r\nx00000000xx0000000000000000x\r\nx00000000xx0000000000000000x\r\nx00000000xx0000000000000000x\r\nx0000xxxxxxxxxxxxxxxxxx0000x\r\nx0000xxxxxxxxxxxxxxxxxx0000x\r\nx00000000000000000000000000x\r\nx00000000000000000000000000x\r\nx00000000000000000000000000x\r\nx00000000000000000000000000x\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_oscar', 0, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx11111111xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxx11xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111x11111111x00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111x11111111x00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111x11111111x00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111111111111100000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111111111111100000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111x11111111x00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111x11111111x00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx1111111x11111111x00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxx11xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_b2g', 0, 0, 2, 'xxxxxxxxxxxxxx\r\nx00000x000000x\r\nx000000000000x\r\nx00000x000000x\r\nx00000x000000x\r\nx00000x000000x\r\nx00000x000000x\r\nxxx0xxx000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx000000000000x\r\nx00000xx00000x\r\nxxxxxxxxxxxxxx', '', '1'), + ('model_opening', 0, 23, 2, 'xxxxxxxxxxxxxxxxxxx\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx222222222222\r\nxxxxxxx111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx222221111111111111\r\nx2222xx111111111111\r\nx2222xx000000000000\r\nx2222xx000000000000\r\nx2222xx000000000000\r\nx2222xx000000000000\r\nx2222xx000000000000\r\n22222xx000000000000\r\nx2222xx000000000000\r\nxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_3', 0, 10, 2, 'XXXXXXXXXXXXXXXXX\r\nXXX0000000000000X\r\nXXX0000000000000X\r\nXXX0000000000000X\r\nXXX0000000000000X\r\nXXX0000000000000X\r\nXXX0000000000000X\r\nX000000000000000X\r\nX000000000000000X\r\nX000000000000000X\r\n0000000000000000X\r\nX000000000000000X\r\nX000000000000000X\r\nX000000000000000X\r\nXXXXXXXXXXXXXXXXX', '', '1'), + ('model_4', 0, 12, 2, 'xxxxxxxxxxxxxxxxxxxxxxx\r\nxXXXXXXXX9999999999999x\r\nxXXXXXXXX9999999999999x\r\nxXXXXXXXX9999999999999x\r\nxXXXXXXXX9999999999999x\r\nx00000000XXXXXXX999999x\r\nx00000000XXXXXXX999999x\r\nx00000000XXXXXXX999999x\r\nx00000000XXXXXXX999999x\r\nx000000000000000999999x\r\nx000000000000000999999x\r\nx000000000000000999999x\r\n0000000000000000999999x\r\nx000000000000000XXXXXXx\r\nx000000000000000XXXXXXx\r\nx000000000000000XXXXXXx\r\nx000000000000000XXXXXXx\r\nx000000000000000XXXXXXx\r\nx000000000000000XXXXXXx\r\nxxxxxxxxxxxxxxxxxxxxxxx', '', '1'), + ('model_basa', 0, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxx\r\nx22222222222222222222x\r\nx22222222222222222222x\r\nx22222222222222222222x\r\nx22222222222222222222x\r\nx22222222222222222222x\r\nx22222222222222222222x\r\nx22222222222222222222x\r\nx000x11xxxxxxxx11x000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nx00000000000000000000x\r\nxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_room_15', 3, 3, 2, 'xxxxxxxxxxxxxxxxxxxxxxxx\r\nx11111xXXXXXXXXXXXXXXXXx\r\nx11111xxxxxxxxxxxxxxxxxx\r\nx11111xYYYYYYYYYYYYYYYYx\r\nx11111xYYYYYYYYYYYYYYYYx\r\nx11111xxxxxxxxxxxxxxxxxx\r\nx11111xUUUUUUUUUUUUUUUUx\r\nx11111xUUUUUUUUUUUUUUUUx\r\nx11111xxxxxxxxxxxxxxxxxx\r\nx11111xVVVVVVVVVVVVVVVVx\r\nx11111xxxxxxxxxxxxxxxxxx\r\nx11111xWWWWWWWWWWWWWWWWx\r\nx11111xxxxxxxxxxxxxxxxxx\r\nx1111100000000000000008x\r\nx1111100000000000000009x\r\nx111110000000000000000ax\r\nx111110000000000000000bx\r\n1111110000000000000000cx\r\nx111110000000000000000dx\r\nx111110000000000000000ex\r\nx111110000000000000000fx\r\nx111110000000000000000gx\r\nx111110000000000000000hx\r\nx111110000000000000000ix\r\nx111110000000000000000jx\r\nx111110000000000000000kx\r\nx111110000000000000000lx\r\nx111110000000000000000mx\r\nx111110000000000000000nx\r\nx111110xxxxxxxxxxxxxxxxx\r\nx111110xzzzzzzzzzzzzzzzx\r\nx111110xzzzzzzzzzzzzzzzx\r\nx111110xzzzzzzzzzzzzzzzx\r\nx111110xzzzzzzzzzzzzzzzx\r\nx111110xzzzzzzzzzzzzzzzx\r\nxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_1', 0, 10, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxeeeeeeeeeeeeeeeedcba9888888888888\r\nxeeeeeeeeeeeeeeeexxxxxx88888888888\r\nxeeeeeeeeeeeeeeeexxxxxx88888888888\r\nxeeeeeeeeeeeeeeeexxxxxx88888888888\r\nxeeeeeeeeeeeeeeeexxxxxx88888888888\r\nxdxxxxxxxxxxxxxxxxxxxxx88888888888\r\nxcxxxxxxxxxxxxxxxxxxxxx88888888888\r\nxbxxxxxxxxxxxxxxxxxxxxx88888888888\r\nxaxxxxxxxxxxxxxxxxxxxxx88888888888\r\naaaaaaaaaaaaaaaaaxxxxxxxxxxxxxxxxx\r\nxaaaaaaaaaaaaaaaaxxxxxxxxxxxxxxxxx\r\nxaaaaaaaaaaaaaaaaxxxxxxxxxxxxxxxxx\r\nxaaaaaaaaaaaaaaaaxxxx6666666666666\r\nxaaaaaaaaaaaaaaaaxxxx6666666666666\r\nxaaaaaaaaaaaaaaaaxxxx6666666666666\r\nxaaaaaaaaaaaaaaaaxxxx6666666666666\r\nxaaaaaaaaaaaaaaaaxxxx6666666666666\r\nxaaaaaaaaaaaaaaaa98766666666666666\r\nxaaaaaaaaaaaaaaaaxxxxxxxxxxxx5xxxx\r\nxaaaaaaaaaaaaaaaaxxxxxxxxxxxx4xxxx\r\nxaaaaaaaaaaaaaaaaxxxxxxxxxxxx3xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxaaaaaaaaaaaaaaaaxxx3333333333xxxx\r\nxxxxxxxxxxxxxxxx9xxx3333333333xxxx\r\nxxxxxxxxxxxxxxxx8xxx3333333333xxxx\r\nxxxxxxxxxxxxxxxx7xxx3333333333xxxx\r\nxxx777777777xxxx6xxx3333333333xxxx\r\nxxx777777777xxxx5xxxxxxxxxxxxxxxxx\r\nxxx777777777xxxx4xxxxxxxxxxxxxxxxx\r\nxxx777777777xxxx3xxxxxxxxxxxxxxxxx\r\nxxx777777777xxxx2xxxxxxxxxxxxxxxxx\r\nxfffffffffxxxxxx1xxxxxxxxxxxxxxxxx\r\nxfffffffffxxxxxx111111111111111111\r\nxfffffffffxxxxxx111111111111111111\r\nxfffffffffxxxxxx111111111111111111\r\nxfffffffffxxxxxx111111111111111111\r\nxfffffffffxxxxxx111111111111111111\r\nxfffffffffxxxxxx111111111111111111\r\nxxxxxxxxxxxxxxxx111111111111111111\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_2', 0, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxjjjjjjjjjjjjjx0000xxxxxxxxxx\r\nxxxxxxxxxxxxiix0000xxxxxxxxxx\r\nxxxxxxxxxxxxhhx0000xxxxxxxxxx\r\nxxxxxxxxxxxxggx0000xxxxxxxxxx\r\nxxxxxxxxxxxxffx0000xxxxxxxxxx\r\nxxxxxxxxxxxxeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\neeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxeeeeeeeeeeeeex0000xxxxxxxxxx\r\nxxxxxxxxxxxxddx00000000000000\r\nxxxxxxxxxxxxccx00000000000000\r\nxxxxxxxxxxxxbbx00000000000000\r\nxxxxxxxxxxxxaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxaaaaaaaaaaaaax00000000000000\r\nxxxxxxxxxxxx99x0000xxxxxxxxxx\r\nxxxxxxxxxxxx88x0000xxxxxxxxxx\r\nxxxxxxxxxxxx77x0000xxxxxxxxxx\r\nxxxxxxxxxxxx66x0000xxxxxxxxxx\r\nxxxxxxxxxxxx55x0000xxxxxxxxxx\r\nxxxxxxxxxxxx44x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nx4444444444444x0000xxxxxxxxxx\r\nxxxxxxxxxxxx33x0000xxxxxxxxxx\r\nxxxxxxxxxxxx22x0000xxxxxxxxxx\r\nxxxxxxxxxxxx11x0000xxxxxxxxxx\r\nxxxxxxxxxxxx00x0000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nx000000000000000000xxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_5', 0, 10, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\n000000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nx00000000000000000000000000000000x\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_6', 0, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x000000000000000000000000xxxx\r\nx222222222x00000000xxxxxxxx00000000xxxx\r\nx11xxxxxxxx00000000xxxxxxxx00000000xxxx\r\nx00x000000000000000xxxxxxxx00000000xxxx\r\nx00x000000000000000xxxxxxxx00000000xxxx\r\nx000000000000000000xxxxxxxx00000000xxxx\r\nx000000000000000000xxxxxxxx00000000xxxx\r\n0000000000000000000xxxxxxxx00000000xxxx\r\nx000000000000000000xxxxxxxx00000000xxxx\r\nx00x000000000000000xxxxxxxx00000000xxxx\r\nx00x000000000000000xxxxxxxx00000000xxxx\r\nx00xxxxxxxxxxxxxxxxxxxxxxxx00000000xxxx\r\nx00xxxxxxxxxxxxxxxxxxxxxxxx00000000xxxx\r\nx00x0000000000000000000000000000000xxxx\r\nx00x0000000000000000000000000000000xxxx\r\nx0000000000000000000000000000000000xxxx\r\nx0000000000000000000000000000000000xxxx\r\nx0000000000000000000000000000000000xxxx\r\nx0000000000000000000000000000000000xxxx\r\nx00x0000000000000000000000000000000xxxx\r\nx00x0000000000000000000000000000000xxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_7', 0, 17, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx\r\nx222222xx00000000xxxxxxxx\r\nx222222xx00000000xxxxxxxx\r\nx2222221000000000xxxxxxxx\r\nx2222221000000000xxxxxxxx\r\nx222222xx00000000xxxxxxxx\r\nx222222xx00000000xxxxxxxx\r\nx222222xxxxxxxxxxxxxxxxxx\r\nx222222xkkkkkkxxiiiiiiiix\r\nx222222xkkkkkkxxiiiiiiiix\r\nx222222xkkkkkkjiiiiiiiiix\r\nx222222xkkkkkkjiiiiiiiiix\r\nx222222xkkkkkkxxiiiiiiiix\r\nxxx11xxxkkkkkkxxiiiiiiiix\r\nxxx00xxxkkkkkkxxxxxxxxxxx\r\nx000000xkkkkkkxxxxxxxxxxx\r\nx000000xkkkkkkxxxxxxxxxxx\r\n0000000xkkkkkkxxxxxxxxxxx\r\nx000000xkkkkkkxxxxxxxxxxx\r\nx000000xkkkkkkxxxxxxxxxxx\r\nx000000xxxjjxxxxxxxxxxxxx\r\nx000000xxxiixxxxxxxxxxxxx\r\nx000000xiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx\r\nxxxxxxxxiiiiiixxxxxxxxxxx', '', '0'), + ('model_8', 0, 15, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\nx5555555555555555555555555xxxxxxxxx\r\nx5555555555555555555555555xxxxxxxxx\r\nx5555555555555555555555555xxxxxxxxx\r\nx5555555555555555555555555xxxxxxxxx\r\nx5555555555555555555555555xxxxxxxxx\r\nx5555555555555555555555555xxxxxxxxx\r\nx5555555555xxxxxxxxxxxxxxxxxxxxxxxx\r\nx55555555554321000000000000000000xx\r\nx55555555554321000000000000000000xx\r\nx5555555555xxxxx00000000000000000xx\r\nx555555x44x0000000000000000000000xx\r\nx555555x33x0000000000000000000000xx\r\nx555555x22x0000000000000000000000xx\r\nx555555x11x0000000000000000000000xx\r\n5555555x00x0000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nx555555x0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxx0000000000000000000000000xx\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('model_9', 0, 17, 2, 'xxxxxxxxxxxxxxxxxxxxxxxx\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\n00000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nx0000000000000000000000x\r\nxxxxxxxxxxxxxxxxxxxxxxxx', '', '0'), + ('infobus_bus', 16, 11, 2, 'xxxxxxxxxxxxxxxxxxx\r\nxxxxxxxxxxxxx0xxxxx\r\nxxxxxxxxxxxxxxxxxxx\r\nxx00000000000000000\r\nxx00000000000000000\r\nxx00000000000000000\r\nxx00000000000000000\r\nxx00000000000000000\r\nxx00000000000000000\r\nxx00000000000000000\r\nxx00000000000000000\r\nxxxxxxxxxxxxxxxx0xx', ' ', '0'); + +#END DATABASE UPDATE: 1.3.0 -> 1.4.0 \ No newline at end of file diff --git a/sqlupdates/1_4_0_TO_1_5_0.sql b/sqlupdates/1_4_0_TO_1_5_0.sql new file mode 100644 index 00000000..23354812 --- /dev/null +++ b/sqlupdates/1_4_0_TO_1_5_0.sql @@ -0,0 +1,107 @@ +#DATABASE UPDATE: 1.4.0 -> 1.5.0 + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.bot.butler.servedistance', '5'); +UPDATE items_base SET interaction_type = 'fx_box' WHERE item_name LIKE 'fxbox_fx%'; + +ALTER TABLE `rooms` CHANGE `paper_floor` `paper_floor` VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `rooms` CHANGE `paper_wall` `paper_wall` VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `rooms` CHANGE `paper_landscape` `paper_landscape` VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; + +ALTER TABLE `permissions` ADD `cmd_transform` ENUM( '0', '1', '2' ) NOT NULL DEFAULT '0' AFTER `cmd_trash`; +ALTER IGNORE TABLE `pet_actions` ADD PRIMARY KEY ( `pet_type` ); +ALTER TABLE `pet_actions` CHANGE `pet_type` `pet_type` INT( 2 ) NOT NULL AUTO_INCREMENT; +ALTER TABLE `pet_actions` AUTO_INCREMENT=0; +SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO'; +INSERT IGNORE INTO `pet_actions` (`pet_type`) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35); +UPDATE `pet_actions` SET `pet_name` = 'Dog' WHERE `pet_actions`.`pet_type` = 0; +UPDATE `pet_actions` SET `pet_name` = 'Cat' WHERE `pet_actions`.`pet_type` = 1; +UPDATE `pet_actions` SET `pet_name` = 'Crocodile' WHERE `pet_actions`.`pet_type` = 2; +UPDATE `pet_actions` SET `pet_name` = 'Terrier' WHERE `pet_actions`.`pet_type` = 3; +UPDATE `pet_actions` SET `pet_name` = 'Bear' WHERE `pet_actions`.`pet_type` = 4; +UPDATE `pet_actions` SET `pet_name` = 'Pig' WHERE `pet_actions`.`pet_type` = 5; +UPDATE `pet_actions` SET `pet_name` = 'Lion' WHERE `pet_actions`.`pet_type` = 6; +UPDATE `pet_actions` SET `pet_name` = 'Rhino' WHERE `pet_actions`.`pet_type` = 7; +UPDATE `pet_actions` SET `pet_name` = 'Spider' WHERE `pet_actions`.`pet_type` = 8; +UPDATE `pet_actions` SET `pet_name` = 'Turtle' WHERE `pet_actions`.`pet_type` = 9; +UPDATE `pet_actions` SET `pet_name` = 'Chicken' WHERE `pet_actions`.`pet_type` = 10; +UPDATE `pet_actions` SET `pet_name` = 'Frog' WHERE `pet_actions`.`pet_type` = 11; +UPDATE `pet_actions` SET `pet_name` = 'Dragon' WHERE `pet_actions`.`pet_type` = 12; +UPDATE `pet_actions` SET `pet_name` = '' WHERE `pet_actions`.`pet_type` = 13; +UPDATE `pet_actions` SET `pet_name` = 'Monkey' WHERE `pet_actions`.`pet_type` = 14; +UPDATE `pet_actions` SET `pet_name` = 'Horse' WHERE `pet_actions`.`pet_type` = 15; +UPDATE `pet_actions` SET `pet_name` = 'Monsterplant' WHERE `pet_actions`.`pet_type` = 16; +UPDATE `pet_actions` SET `pet_name` = 'Bunny' WHERE `pet_actions`.`pet_type` = 17; +UPDATE `pet_actions` SET `pet_name` = 'Evil Bunny' WHERE `pet_actions`.`pet_type` = 18; +UPDATE `pet_actions` SET `pet_name` = 'Bored Bunny' WHERE `pet_actions`.`pet_type` = 19; +UPDATE `pet_actions` SET `pet_name` = 'Love Bunny' WHERE `pet_actions`.`pet_type` = 20; +UPDATE `pet_actions` SET `pet_name` = 'Wise Pidgeon' WHERE `pet_actions`.`pet_type` = 21; +UPDATE `pet_actions` SET `pet_name` = 'Cunning Pidgeon' WHERE `pet_actions`.`pet_type` = 22; +UPDATE `pet_actions` SET `pet_name` = 'Evil Monkey' WHERE `pet_actions`.`pet_type` = 23; +UPDATE `pet_actions` SET `pet_name` = 'Baby Bear' WHERE `pet_actions`.`pet_type` = 24; +UPDATE `pet_actions` SET `pet_name` = 'Baby Terrier' WHERE `pet_actions`.`pet_type` = 25; +UPDATE `pet_actions` SET `pet_name` = 'Gnome' WHERE `pet_actions`.`pet_type` = 26; +UPDATE `pet_actions` SET `pet_name` = 'Leprechaun' WHERE `pet_actions`.`pet_type` = 27; +UPDATE `pet_actions` SET `pet_name` = 'Baby Cat' WHERE `pet_actions`.`pet_type` = 28; +UPDATE `pet_actions` SET `pet_name` = 'Baby Dog' WHERE `pet_actions`.`pet_type` = 29; +UPDATE `pet_actions` SET `pet_name` = 'Baby Pig' WHERE `pet_actions`.`pet_type` = 30; +UPDATE `pet_actions` SET `pet_name` = 'Haloompa' WHERE `pet_actions`.`pet_type` = 31; +UPDATE `pet_actions` SET `pet_name` = 'Fools' WHERE `pet_actions`.`pet_type` = 32; +UPDATE `pet_actions` SET `pet_name` = 'Pterodactyl' WHERE `pet_actions`.`pet_type` = 33; +UPDATE `pet_actions` SET `pet_name` = 'Velociraptor' WHERE `pet_actions`.`pet_type` = 34; +UPDATE `pet_actions` SET `pet_name` = 'Cow' WHERE `pet_actions`.`pet_type` = 35; + +INSERT INTO `pet_breeds` (`race`, `color_one`, `color_two`, `has_color_one`, `has_color_two`) VALUES ('26', '0', '0', '0', '0'), ('27', '0', '0', '0', '0'); + +ALTER IGNORE TABLE `emulator_texts` ADD PRIMARY KEY(`key`); +INSERT IGNORE INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.generic.cmd_transform.title', 'The following pets are available:'), + ('commands.generic.cmd_transform.line', '%name%'), + ('commands.description.cmd_transform', ':transform '), + ('commands.keys.cmd_transform', 'transform;becomepet'), + ('commands.description.cmd_connect_camera', ':connectcamera'), + ('commands.description.cmd_roompoints', ':roompoints '), + ('commands.description.cmd_setmax', ':setmax '), + ('commands.description.cmd_staffalert', ':sa '); + +ALTER TABLE `permissions` CHANGE `cmd_bots` `cmd_bots` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; +ALTER TABLE `permissions` CHANGE `cmd_control` `cmd_control` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_coords` `cmd_coords` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '2'; +ALTER TABLE `permissions` CHANGE `cmd_danceall` `cmd_danceall` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_diagonal` `cmd_diagonal` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; +ALTER TABLE `permissions` CHANGE `cmd_ejectall` `cmd_ejectall` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '2'; +ALTER TABLE `permissions` CHANGE `cmd_enable` `cmd_enable` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; +ALTER TABLE `permissions` CHANGE `cmd_fastwalk` `cmd_fastwalk` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_freeze_bots` `cmd_freeze_bots` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; +ALTER TABLE `permissions` CHANGE `cmd_hand_item` `cmd_hand_item` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; +ALTER TABLE `permissions` CHANGE `cmd_kickall` `cmd_kickall` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '2'; +ALTER TABLE `permissions` CHANGE `cmd_moonwalk` `cmd_moonwalk` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_multi` `cmd_multi` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_pet_info` `cmd_pet_info` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '2'; +ALTER TABLE `permissions` CHANGE `cmd_pull` `cmd_pull` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_push` `cmd_push` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_roomalert` `cmd_roomalert` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_roomeffect` `cmd_roomeffect` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_roomitem` `cmd_roomitem` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_say` `cmd_say` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_say_all` `cmd_say_all` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_setmax` `cmd_setmax` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_setspeed` `cmd_setspeed` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; +ALTER TABLE `permissions` CHANGE `cmd_shout` `cmd_shout` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_shout_all` `cmd_shout_all` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_sitdown` `cmd_sitdown` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_superpull` `cmd_superpull` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_teleport` `cmd_teleport` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `cmd_unload` `cmd_unload` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` ADD `cmd_wordquiz` ENUM('0','1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `permissions` CHANGE `acc_unlimited_bots` `acc_unlimited_bots` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT 'Overrides the bot restriction to the inventory and room.'; +ALTER TABLE `permissions` CHANGE `acc_unlimited_pets` `acc_unlimited_pets` ENUM( '0', '1', '2' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT 'Overrides the pet restriction to the inventory and room.'; + +DROP TABLE support_chatlogs; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('generic.gift.received.anonymous', 'You''ve received a gift!'), ('generic.gift.received', '%username% gave you a gift!'); + +ALTER TABLE `emulator_settings` CHANGE `value` `value` VARCHAR( 300 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL; + +#When changing the query make sure the look, username, id and hof_points are available. +INSERT INTO `emulator_settings` (`key`,`value`) VALUES ('hotelview.halloffame.query', 'SELECT users.look, users.username, users.id, users_settings.hof_points FROM users_settings INNER JOIN users ON users_settings.user_id = users.id WHERE hof_points > 0 ORDER BY hof_points DESC, users.id ASC LIMIT 10'); +#END DATABASE UPDATE: 1.4.0 -> 1.5.0 \ No newline at end of file diff --git a/sqlupdates/1_5_0_TO_1_6_0.sql b/sqlupdates/1_5_0_TO_1_6_0.sql new file mode 100644 index 00000000..2c84941a --- /dev/null +++ b/sqlupdates/1_5_0_TO_1_6_0.sql @@ -0,0 +1,26 @@ +#DATABASE UPDATE: 1.5.0 -> 1.6.0 + +ALTER TABLE `users` ADD `machine_id` VARCHAR( 64 ) NOT NULL DEFAULT '' AFTER `ip_current`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('generic.user.not_found', '%user% not found.'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.name', 'Habbo Hotel'), ('hotel.player.name', 'Habbo'); +UPDATE `emulator_texts` SET `key` = 'commands.succes.cmd_ban.ban_issued' WHERE `emulator_texts`.`key` = 'commands.succes.cmd_about.ban_issued'; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('catalog.page.vipgifts', '0'); + +CREATE TABLE `users_achievements_queue` ( + `user_id` INT NOT NULL , + `achievement_id` INT NOT NULL , + `amount` INT NOT NULL +) ENGINE = MYISAM ; +ALTER TABLE users_achievements_queue ADD UNIQUE `unique_index` (`user_id`, `achievement_id`); + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.rollers.speed.maximum', '100'); + +ALTER TABLE `vouchers` ADD `catalog_item_id` INT NOT NULL DEFAULT '0'; + +ALTER TABLE `permissions` ADD `cmd_reload_room` ENUM( '0', '1', '2' ) NOT NULL DEFAULT '2' AFTER `cmd_redeem`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.keys.cmd_reload_room', 'reload_room;reload;reloadroom'), ('commands.description.cmd_reload_room', ':reload_room'); +ALTER TABLE `bots` ADD `effect` INT( 3 ) NOT NULL DEFAULT '0'; + +UPDATE `emulator_texts` SET `key` = 'commands.error.cmd_ban.forgot_user' WHERE `emulator_texts`.`key` = 'commands.error.cmd_ban.forgot_message'; + +#END DATABASE UPDATE: 1.5.0 -> 1.6.0 \ No newline at end of file diff --git a/sqlupdates/1_6_0_TO_1_7_0.sql b/sqlupdates/1_6_0_TO_1_7_0.sql new file mode 100644 index 00000000..77f181cf --- /dev/null +++ b/sqlupdates/1_6_0_TO_1_7_0.sql @@ -0,0 +1,22 @@ +#DATABASE UPDATE: 1.6.0 -> 1.7.0 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('scripter.warning.packet.closedice', '%username% tried to change furniture state on non dice using the close dice packet on item %id% %itemname%'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.succes.cmd_update_guildparts', 'Succes! Guild badgeparts and guild badge imager has been reloaded!'); + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('ban.info.user_id', 'User ID: '), ('ban.info.type', 'Ban Type: '), ('ban.info.reason', 'Reason: '), ('ban.info.staff_id', 'Staff ID: '), ('ban.info.date_issued', 'Date: '), ('ban.info.date_expire', 'Expire Date: '), ('ban.info.ip', 'IP: '), ('ban.info.machine', 'Machine: '); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('command.cmd_userinfo.user_id', 'ID'), ('command.cmd_userinfo.user_name', 'Username'), ('command.cmd_userinfo.motto', 'Motto'), ('command.cmd_userinfo.rank', 'Rank'), ('command.cmd_userinfo.online', 'Online'), ('command.cmd_userinfo.email', 'Email'), ('command.cmd_userinfo.ip_register', 'Register IP'), ('command.cmd_userinfo.ip_current', 'Current IP'), ('command.cmd_userinfo.banned', 'Banned'), ('command.cmd_userinfo.currencies', 'Currencies'), ('command.cmd_userinfo.achievement_score', 'Score'), ('command.cmd_userinfo.credits', 'Credits'), ('command.cmd_userinfo.current_activity', 'Current Activity'), ('command.cmd_userinfo.room', 'Room'), ('command.cmd_userinfo.respect_left', 'Respect Left'), ('command.cmd_userinfo.pet_respect_left', 'Pet Respect Left'), ('command.cmd_userinfo.allow_trade', 'Allow Trade'), ('command.cmd_userinfo.allow_follow', 'Allow Follow'), ('command.cmd_userinfo.allow_friend_request', 'Allow Friend Request'), ('command.cmd_userinfo.total_bans', 'Total bans'), ('command.cmd_userinfo.ban_info', 'Recent Ban Info'), ('command.cmd_userinfo.userinfo', 'Userinfo'); + +ALTER TABLE `users_wardrobe` CHANGE `look` `look` VARCHAR( 256 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; +UPDATE `items_base` SET `interaction_type` = 'football_goal_blue', stack_height = '0.01' WHERE item_name LIKE 'fball_goal_b'; +UPDATE `items_base` SET `interaction_type` = 'football_goal_green', stack_height = '0.01' WHERE item_name LIKE 'fball_goal_g'; +UPDATE `items_base` SET `interaction_type` = 'football_goal_red', stack_height = '0.01' WHERE item_name LIKE 'fball_goal_r'; +UPDATE `items_base` SET `interaction_type` = 'football_goal_yellow', stack_height = '0.01' WHERE item_name LIKE 'fball_goal_y'; +UPDATE `items_base` SET `interaction_type` = 'football_counter_blue' WHERE item_name LIKE 'fball_score_b'; +UPDATE `items_base` SET `interaction_type` = 'football_counter_green' WHERE item_name LIKE 'fball_score_g'; +UPDATE `items_base` SET `interaction_type` = 'football_counter_red' WHERE item_name LIKE 'fball_score_r'; +UPDATE `items_base` SET `interaction_type` = 'football_counter_yellow' WHERE item_name LIKE 'fball_score_y'; +UPDATE `items_base` SET `interaction_type` = 'football_gate' WHERE item_name LIKE 'fball_gate'; + +ALTER TABLE `achievements` CHANGE `pixels` `reward_amount` INT( 11 ) NOT NULL DEFAULT '100'; +ALTER TABLE `achievements` ADD `reward_type` INT( 2 ) NOT NULL DEFAULT '0' AFTER `reward_amount`; +#END DATABASE UPDATE: 1.6.0 -> 1.7.0 \ No newline at end of file diff --git a/sqlupdates/1_7_0_TO_1_8_0.sql b/sqlupdates/1_7_0_TO_1_8_0.sql new file mode 100644 index 00000000..5739da46 --- /dev/null +++ b/sqlupdates/1_7_0_TO_1_8_0.sql @@ -0,0 +1,100 @@ +#DATABASE UPDATE: 1.7.0 -> 1.8.0 + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_pet_info.pet_not_found', '"Please provide a petname!"'); +ALTER TABLE `bans` ADD `cfh_topic` INT( 4 ) NOT NULL DEFAULT '-1'; +ALTER TABLE `rooms` CHANGE `paper_floor` `paper_floor` VARCHAR( 5 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0.0'; +ALTER TABLE `rooms` CHANGE `paper_wall` `paper_wall` VARCHAR( 5 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0.0'; +ALTER TABLE `rooms` CHANGE `paper_landscape` `paper_landscape` VARCHAR( 5 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0.0'; + +UPDATE rooms SET paper_floor = '0.0' WHERE paper_floor = '0'; +UPDATE rooms SET paper_wall = '0.0' WHERE paper_wall = '0'; +UPDATE rooms SET paper_landscape = '0.0' WHERE paper_landscape = '0'; + +UPDATE items_base SET interaction_type = item_name WHERE item_name LIKE 'wf_xtra_%'; +UPDATE items_base SET interaction_type = item_name WHERE item_name LIKE 'wf_act_move_furni_to'; +UPDATE items_base SET allow_walk = '0' WHERE interaction_type LIKE 'gate'; + + +#Thanks Beny +DROP TABLE IF EXISTS `support_cfh_categories`; +CREATE TABLE `support_cfh_categories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name_internal` varchar(255) DEFAULT NULL, + `name_external` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; + +INSERT INTO `support_cfh_categories` VALUES ('1', 'cyber', 'Cyber sex'); +INSERT INTO `support_cfh_categories` VALUES ('2', 'scamming', 'Scamming'); +INSERT INTO `support_cfh_categories` VALUES ('3', 'badwords', 'Inappropriate words'); +INSERT INTO `support_cfh_categories` VALUES ('4', 'badbehavior', 'Bad behavior'); +INSERT INTO `support_cfh_categories` VALUES ('5', 'account', 'Account Issues'); +INSERT INTO `support_cfh_categories` VALUES ('6', 'hacking', 'Hacking'); + +DROP TABLE IF EXISTS `support_cfh_topics`; +CREATE TABLE `support_cfh_topics` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `category_id` int(11) DEFAULT NULL, + `name_internal` varchar(255) DEFAULT NULL, + `name_external` varchar(255) DEFAULT NULL, + `action` enum('mods','auto_ignore','auto_reply') DEFAULT 'mods', + `auto_reply` text DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=latin1; + +INSERT INTO `support_cfh_topics` VALUES ('1', '1', 'cyber.sextalk', 'Sexual talk', 'auto_ignore', 'Thank you for reporting someone for sexual talk. We have put this user on ignore for you. This means that you can no longer see what they are saying. To turn ignore off for this person you need to click on them and press \'Listen\'. We will take a look at this.'); +INSERT INTO `support_cfh_topics` VALUES ('2', '1', 'cyber.asking', 'Asking for cyber sex', 'auto_ignore', 'Thank you for reporting someone for sexual talk. We have put this user on ignore for you. This means that you can no longer see what they are saying. To turn ignore off for this person you need to click on them and press \'Listen\'. We will take a look at this.'); +INSERT INTO `support_cfh_topics` VALUES ('3', '1', 'cyber.offering', 'Offering cyber sex', 'auto_ignore', 'Thank you for reporting someone for sexual talk. We have put this user on ignore for you. This means that you can no longer see what they are saying. To turn ignore off for this person you need to click on them and press \'Listen\'. We will take a look at this.'); +INSERT INTO `support_cfh_topics` VALUES ('4', '1', 'cyber.porn', 'Sending porn', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('5', '2', 'scamming.scamsite', 'Promoting scam sites', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('6', '2', 'scamming.sellingirl', 'Selling virtual items for real money', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('7', '2', 'scamming.stealingfurni', 'Stealing furni or coins', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('8', '2', 'scamming.account', 'Stealing account information', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('9', '2', 'scamming.casino', 'Casino scamming', 'auto_reply', 'Habbo does not get involved with the casino community due to cases being complex and hard to track. Players gamble at their own risk. When the fun stops, stop.'); +INSERT INTO `support_cfh_topics` VALUES ('10', '3', 'badwords.roomname', 'Room name', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('11', '3', 'badwords.roomdesc', 'Room description', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('12', '3', 'badwords.username', 'Username', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('13', '3', 'badwords.motto', 'Moto', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('14', '3', 'badwords.grouporevent', 'Group or event name', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('15', '4', 'badbehavior.trolling', 'Trolling', 'auto_reply', 'Thanks for your report. Please call a moderator to the room by following these steps.\r\n1. Under the Help window click on \'Get immediate help\'.\r\n2. Then click on \'Chat to a Moderator\'.\r\n3. Let them know that somebody is trolling in the room.\r\n4. A moderator will open a chat session with you to resolve the problem.'); +INSERT INTO `support_cfh_topics` VALUES ('16', '4', 'badbehavior.blocking', 'Blocking', 'auto_reply', 'Thanks for your report. Please call a moderator to the room by following these steps.\r\n1. Under the Help window click on \'Get immediate help\'.\r\n2. Then click on \'Chat to a Moderator\'.\r\n3. Let them know that somebody is blocking in the room.\r\n4. A moderator will open a chat session with you to resolve the problem.'); +INSERT INTO `support_cfh_topics` VALUES ('17', '4', 'badbehavior.flooding', 'Flooding', 'auto_reply', 'Thanks for your report. Please call a moderator to the room by following these steps.\r\n1. Under the Help window click on \'Get immediate help\'.\r\n2. Then click on \'Chat to a Moderator\'.\r\n3. Let them know that somebody is flooding the room.\r\n4. A moderator will open a chat session with you to resolve the problem.'); +INSERT INTO `support_cfh_topics` VALUES ('18', '4', 'badbehavior.young', 'Too young for Habbo', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('19', '4', 'badbehavior.staffimpersonation', 'Staff impersonation', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('20', '4', 'badbehavior.offensive', 'Offensive language', 'auto_ignore', 'We have put this user on ignore for you. This means that you can no longer see what they are saying. To turn ignore off for this person you need to click on them and press \'Listen\''); +INSERT INTO `support_cfh_topics` VALUES ('21', '4', 'badbehavior.hate', 'Hate speech', 'auto_ignore', 'We have put this user on ignore for you. This means that you can no longer see what they are saying. To turn ignore off for this person you need to click on them and press \'Listen\''); +INSERT INTO `support_cfh_topics` VALUES ('22', '4', 'badbehavior.violence', 'Violence', 'auto_ignore', 'We have put this user on ignore for you. This means that you can no longer see what they are saying. To turn ignore off for this person you need to click on them and press \'Listen\''); +INSERT INTO `support_cfh_topics` VALUES ('23', '5', 'account.username', 'Change username', 'auto_reply', 'It is currently not possible to change your username in Habbo. When that feature becomes available you\'ll be sure to know! :)'); +INSERT INTO `support_cfh_topics` VALUES ('24', '5', 'accunt.payment', 'Payment issues', 'auto_reply', 'Thanks for your report. Unfortunately Game Moderators cannot help with payment issues. Please report your payment issue to us at the help desk on the website where our team of specialists will get back to you.'); +INSERT INTO `support_cfh_topics` VALUES ('25', '5', 'account.earn', 'Earn gems', 'auto_reply', 'Thanks for your report. Unfortunately Game Moderators cannot help with payment issues. Please report your payment issue to us at the help desk on the website where our team of specialists will get back to you.'); +INSERT INTO `support_cfh_topics` VALUES ('26', '5', 'account.other', 'Something else', 'auto_reply', 'Please use the helpdesk on the website for help with this matter.'); +INSERT INTO `support_cfh_topics` VALUES ('27', '6', 'hacking.game', 'Threat to hack Habbo', 'auto_reply', 'We work very hard to ensure that Habbo is safe for all that play. This involves using only the best security technology. We would like to thank you for reporting this to us, but we don\'t think this person is capable of hacking Habbo :)'); +INSERT INTO `support_cfh_topics` VALUES ('28', '6', 'hacking.player', 'Threat to hack a player', 'auto_reply', 'There is no way that another Habbo can hack you without knowing your Habbo password or Habbo email address. Please make sure that you are using a secure password which is not easy to remember. We recommend passwords which include letters and numbers such as fl0w3rs. If you wanted to be even more secure you could include a special letter, such as fl0w3r$.\r\n\r\nTo change your Habbo password go to your profile on the website.'); +INSERT INTO `support_cfh_topics` VALUES ('29', '6', 'hacking.furni', 'Scripted furniture', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('30', '6', 'hacking.room', 'Scripted room', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('31', '6', 'hacking.character', 'Scripted character', 'mods', null); +INSERT INTO `support_cfh_topics` VALUES ('32', '6', 'hacking.other', 'Other hacking', 'mods', null); + +ALTER TABLE `camera_web` ADD `room_id` INT( 11 ) NOT NULL DEFAULT '0' AFTER `user_id`; + +ALTER TABLE `commandlogs` CHANGE `command` `command` VARCHAR( 256 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; +UPDATE emulator_settings SET `value` = '0' WHERE `key` LIKE 'debug.show.%'; +DELETE FROM emulator_errors; +DELETE FROM gift_wrappers; +INSERT INTO gift_wrappers (sprite_id, item_id) SELECT sprite_id, id FROM items_base WHERE item_name LIKE 'present_gen%'; +UPDATE gift_wrappers SET type = 'gift'; +INSERT INTO gift_wrappers (sprite_id, item_id) SELECT sprite_id, id FROM items_base WHERE item_name LIKE 'present_wrap%'; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES +('seasonal.currency.ducket', '0'), +('seasonal.currency.pixel', '0'), +('seasonal.currency.diamond', '5'), +('seasonal.currency.shell', '4'), +('seasonal.currency.names', 'ducket;pixel;shell;diamond'); + +ALTER TABLE `permissions` ADD `cmd_hal` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_ha`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_hal', ':hal '), ('commands.keys.cmd_hal', 'hal;halink'); +ALTER TABLE `permissions` ADD `acc_enable_others` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `acc_empty_others`; +ALTER TABLE `rooms` CHANGE `chat_mode` `chat_mode` INT( 11 ) NOT NULL DEFAULT '0'; +UPDATE `emulator_settings` SET `value` = '0' WHERE `emulator_settings`.`key` = 'debug.show.packets'; +UPDATE `emulator_settings` SET `value` = '0' WHERE `emulator_settings`.`key` = 'debug.show.packets.undefined'; +#END DATABASE UPDATE: 1.7.0 -> 1.8.0 \ No newline at end of file diff --git a/sqlupdates/1_8_0_TO_1_9_0.sql b/sqlupdates/1_8_0_TO_1_9_0.sql new file mode 100644 index 00000000..a30264cb --- /dev/null +++ b/sqlupdates/1_8_0_TO_1_9_0.sql @@ -0,0 +1,139 @@ +#DATABASE UPDATE: 1.8.0 -> 1.9.0 + +ALTER TABLE `permissions` ADD `cmd_empty_bots` ENUM( '0', '1' ) NOT NULL DEFAULT '1' AFTER `cmd_empty`; +ALTER TABLE `permissions` ADD `cmd_empty_pets` ENUM( '0', '1' ) NOT NULL DEFAULT '1' AFTER `cmd_empty_bots`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES + ('commands.succes.cmd_empty_bots.cleared', 'Bots inventory cleared!'), + ('commands.succes.cmd_empty_bots.verify', 'This will remove all bots from your inventory. Type :emptybots %generic.yes% to continue!'), + ('commands.keys.cmd_empty_bots', 'emptybots;empty_bots;deletebots'), + ('commands.description.cmd_empty_bots', ':emptybots'), + ('commands.succes.cmd_empty_pets.cleared', 'Pets inventory cleared!'), + ('commands.succes.cmd_empty_pets.verify', 'This will remove all pets from your inventory. Type :emptypets %generic.yes% to continue!'), + ('commands.keys.cmd_empty_pets', 'emptypets;empty_pets;deletepets'), + ('commands.description.cmd_empty_pets', ':emptypets'); + +CREATE TABLE `users_effects` ( + `user_id` INT NOT NULL, + `effect` INT(5) NOT NULL, + `duration` INT NOT NULL DEFAULT '86400', + `activation_timestamp` INT NOT NULL DEFAULT '-1', + `total` INT(2) NOT NULL DEFAULT '1', + UNIQUE(user_id, effect) +) ENGINE = MyISAM; + +ALTER TABLE `users_settings` CHANGE `talent_track_citizenship_level` `talent_track_citizenship_level` INT( 2 ) NOT NULL DEFAULT '-1', +CHANGE `talent_track_helpers_level` `talent_track_helpers_level` INT( 2 ) NOT NULL DEFAULT '-1'; +UPDATE users_settings SET talent_track_citizenship_level = -1; +UPDATE users_settings SET talent_track_helpers_level = -1; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.room.tags.staff', 'staff;official;habbo'); +ALTER TABLE `permissions` ADD `acc_room_staff_tags` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; + +CREATE TABLE `catalog_club_offers` ( + `id` INT NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY , + `enabled` ENUM( '0', '1' ) NOT NULL DEFAULT '1', + `name` VARCHAR( 35 ) NOT NULL , + `days` INT( 7 ) NOT NULL , + `credits` INT( 5 ) NOT NULL DEFAULT '10', + `points` INT( 5 ) NOT NULL DEFAULT '0', + `points_type` INT( 3 ) NOT NULL DEFAULT '0', + `type` ENUM( 'HC', 'VIP' ) NOT NULL DEFAULT 'HC', + `deal` ENUM( '0', '1' ) NOT NULL DEFAULT '0' +) ENGINE = MYISAM ; + +INSERT INTO `catalog_club_offers` (`id`, `enabled`, `name`, `days`, `credits`, `points`, `points_type`, `type`, `deal`) VALUES + (NULL, '1', 'HABBO_CLUB_7_DAY', '7', '5', '0', '0', 'VIP', '0'), + (NULL, '1', 'HABBO_CLUB_1_MONTH', '31', '20', '0', '0', 'VIP', '0'); + +UPDATE catalog_pages SET page_layout = 'vip_buy' WHERE page_layout = 'club_buy'; + +ALTER TABLE `support_cfh_topics` ADD `ignore_target` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `action`; + +ALTER TABLE `users_settings` ADD `nux` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES +('nux.step.1', 'This is the reception button, it will take you to the hotelview.'), +('nux.step.2', 'This is the navigator button, from here you can visit other rooms.'), +('nux.step.3', 'To talk, just enter your message here.'), +('nux.step.4', 'The chat history window lets you read back your previous conversations.'), +('nux.step.5', 'If you want to change your looks, you can use the wardrobe.'), +('nux.step.6', 'In the catalog you can purchase furniture to decorate your own room.'), +('nux.step.7', 'Furniture can be bought with a combination of credits...'), +('nux.step.8', '...duckets,'), ('nux.step.9', 'or diamonds.'), +('nux.step.10', 'All your friends are located down here.'), +('nux.step.11', 'Lets have some fun and start exploring the hotel!'); +ALTER TABLE `commandlogs` CHANGE `params` `params` VARCHAR( 256 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ''; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('alert.superwired.invalid', 'Invalid superwired configuration. Make sure to NOT use ; in the product field!'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.navigator.popular.category.maxresults', '10'); + +ALTER TABLE `navigator_flatcats` ADD `caption_save` VARCHAR( 32 ) NOT NULL DEFAULT 'caption_save' AFTER `min_rank`; +CREATE TABLE `users_navigator_settings` ( + `user_id` INT NOT NULL , + `caption` VARCHAR( 128 ) NOT NULL , + `list_type` ENUM( 'list', 'thumbnails' ) NOT NULL DEFAULT 'list', + `display` ENUM( 'visible', 'collapsed' ) NOT NULL DEFAULT 'visible' +) ENGINE = MYISAM ; + +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_building' WHERE `navigator_flatcats`.`id` =2; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_chat' WHERE `navigator_flatcats`.`id` =3; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_fansite' WHERE `navigator_flatcats`.`id` =4; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_games' WHERE `navigator_flatcats`.`id` =5; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_help' WHERE `navigator_flatcats`.`id` =6; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_life' WHERE `navigator_flatcats`.`id` =7; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_official' WHERE `navigator_flatcats`.`id` =8; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_party' WHERE `navigator_flatcats`.`id` =9; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_personal' WHERE `navigator_flatcats`.`id` =10; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_reviews' WHERE `navigator_flatcats`.`id` =11; +UPDATE `navigator_flatcats` SET `caption_save` = 'caption_save_trading' WHERE `navigator_flatcats`.`id` =12; + +ALTER TABLE `permissions` ADD `cmd_allow_trading` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_alert`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES +('commands.description.cmd_allow_trading', ":blocktrading - Enables / Disables the tradelock for a user."), +('commands.keys.cmd_allow_trading', 'tradelock;blocktrading;disabletrade'), +('commands.error.cmd_allow_trading.forgot_username', 'Please specify the user to enable / disable trading for.'), +('commands.error.cmd_allow_trading.forgot_trade', 'Please specify if you want to enable trading for %username%.'), +('commands.succes.cmd_allow_trading.enabled', 'Trading has been enabled for %username%!'), +('commands.succes.cmd_allow_trading.disabled', 'Trading has been disabled for %username%!'), +('commands.error.cmd_allow_trading.user_not_found', 'Target Habbo does not exist.'), +('commands.error.cmd_allow_trading.incorrect_setting', 'Please use %enabled% to enable trading. Use %disabled% to disable trading.'); + +ALTER TABLE `rooms` CHANGE `allow_walkthrough` `allow_walkthrough` ENUM( '0', '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('debug.show.users', '1'); + +#This is work in progress. +CREATE TABLE IF NOT EXISTS `nux_gifts` ( + `id` int(3) NOT NULL AUTO_INCREMENT, + `type` enum('item','room') NOT NULL DEFAULT 'item', + `value` varchar(32) NOT NULL COMMENT 'If type item then items.item_name. If type room then room id to copy.', + `image` varchar(256) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ; + +INSERT INTO `nux_gifts` (`id`, `type`, `value`, `image`) VALUES +(1, 'item', 'rare_daffodil_rug', 'notifications/rare_daffodil_rug.png'), +(2, 'item', 'rare_moonrug', 'notifications/rare_moonrug.png'), +(3, 'item', 'sandrug', 'notifications/sandrug.png'); + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('room.chat.delay', '0'); +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('room.chat.prefix.format', '[%prefix%] '); + +ALTER TABLE `permissions` ADD `cmd_roommute` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_roomitem`; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('camera.use.https', '1'); + +ALTER TABLE `permissions` ADD `prefix` VARCHAR( 5 ) NOT NULL AFTER `log_commands` , + ADD `prefix_color` VARCHAR( 7 ) NOT NULL AFTER `prefix`; + +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_give_rank.higher.other', '%username% has an higher rank than you and thus cannot change it!'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_unmute.not_muted', '%user% is not muted.'); + +ALTER TABLE `navigator_filter` ADD PRIMARY KEY ( `key` ); +ALTER TABLE `navigator_filter` CHANGE `database_query` `database_query` VARCHAR( 1024 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL; +UPDATE `navigator_filter` SET `compare` = 'contains' WHERE `navigator_filter`.`key` = 'roomname'; +UPDATE `navigator_filter` SET `database_query` = 'SELECT * FROM rooms WHERE name COLLATE UTF8_GENERAL_CI LIKE ? ', `compare` = 'contains' WHERE `navigator_filter`.`key` = 'roomname'; +UPDATE `navigator_filter` SET `database_query` = 'SELECT rooms.*, CONCAT_WS(rooms.owner_name, rooms.name, rooms.description, rooms.tags, guilds.name, guilds.description) as whole FROM rooms LEFT JOIN guilds ON rooms.guild_id = guilds.id HAVING whole LIKE ? ' WHERE `navigator_filter`.`key` = 'anything'; +ALTER TABLE `users_settings` ADD `mute_end_timestamp` INT( 11 ) NOT NULL DEFAULT '0' AFTER `nux`; +ALTER TABLE `wordfilter` ADD `mute` INT( 3 ) NOT NULL DEFAULT '0' COMMENT 'Time user gets muted for mentioning this word.' AFTER `report`; + +#END DATABASE UPDATE: 1.7.0 -> 1.8.0 \ No newline at end of file diff --git a/sqlupdates/1_9_0_TO_1_10_0.sql b/sqlupdates/1_9_0_TO_1_10_0.sql new file mode 100644 index 00000000..4c76dea6 --- /dev/null +++ b/sqlupdates/1_9_0_TO_1_10_0.sql @@ -0,0 +1,63 @@ +ALTER TABLE `support_tickets` ADD `category` INT( 3 ) NOT NULL DEFAULT '0' AFTER `issue`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('supporttools.not_ticket_owner', 'You are not the moderator currently handling the ticket.'); +ALTER TABLE `support_cfh_topics` ADD `default_sanction` INT( 3 ) NOT NULL DEFAULT '0' AFTER `auto_reply`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.success.cmd_setmax', 'Success! Maximum users in this room changed to %value%.'); + +CREATE TABLE `calendar_rewards` ( + `id` INT( 11 ) NOT NULL AUTO_INCREMENT , + `name` VARCHAR( 128 ) NOT NULL , + `custom_image` VARCHAR( 128 ) NOT NULL , + `credits` INT( 11 ) NOT NULL DEFAULT '0', + `points` INT( 11 ) NOT NULL DEFAULT '0', + `points_type` INT( 3 ) NOT NULL DEFAULT '0', + `badge` VARCHAR( 25 ) NOT NULL DEFAULT '', + `catalog_item_id` INT( 11 ) NOT NULL DEFAULT '0', +PRIMARY KEY ( `id` ) +) ENGINE = MYISAM ; + +CREATE TABLE `calendar_rewards_claimed` ( + `user_id` INT NOT NULL , + `reward_id` INT NOT NULL , + `timestamp` INT NOT NULL +) ENGINE = MYISAM ; + +ALTER TABLE `permissions` ADD `cmd_changename` ENUM( '0', '1' ) NOT NULL DEFAULT '0' AFTER `cmd_bundle`; +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_changename', ':changename'), ('commands.keys.cmd_changename', 'changename;flagme;change_name;namechange'); +ALTER TABLE `users_settings` ADD `allow_name_change` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; + +CREATE TABLE `namechange_log` ( + `user_id` INT( 11 ) NOT NULL , + `old_name` VARCHAR( 32 ) NOT NULL , + `new_name` VARCHAR( 32 ) NOT NULL , + `timestamp` INT( 11 ) NOT NULL +) ENGINE = MYISAM ; + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES +('basejump.url', 'http://localhost/game/BaseJump.swf'), +('basejump.assets.url', 'http://localhost/gamecenter/gamecenter_basejump/BasicAssets.swf'); + +DROP INDEX `user_id` ON users_recipes; +ALTER TABLE `users_recipes` ADD UNIQUE KEY ( `user_id`, `recipe` ); + +DELETE FROM emulator_settings WHERE `key` LIKE 'hotel.max.bots.inventory'; +UPDATE `emulator_settings` SET `key` = 'hotel.inventory.max.items' WHERE `emulator_settings`.`key` = 'inventory.max.items'; +INSERT INTO `emulator_texts` (`key` , `value` ) VALUES +('commands.error.cmd_credits.user_not_found', 'Could net send %amount% credits to %user%. %user% does not exist.'); + +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('hotel.marketplace.currency', '0'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_pull.invalid', 'You cannot pull %username% to there.'); +INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.error.cmd_push.invalid', 'You cannot push %username% to there.'); +ALTER TABLE `marketplace_items` ADD `sold_timestamp` INT( 11 ) NOT NULL DEFAULT '0' AFTER `timestamp`; +UPDATE permissions SET acc_debug = '0'; + +ALTER TABLE `permissions` ADD `level` INT( 2 ) NOT NULL DEFAULT '1' AFTER `rank_name`; +UPDATE permissions SET `level` = `id`; +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('networking.tcp.proxy', '0'); + +CREATE TABLE `room_trax_playlist` ( +`room_id` INT NOT NULL , +`item_id` INT NOT NULL , +INDEX ( `room_id` ) +) ENGINE = INNODB ; + +ALTER TABLE `rooms` ADD `jukebox_active` ENUM( '0', '1' ) NOT NULL DEFAULT '0'; \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/Emulator.java b/src/main/java/com/eu/habbo/Emulator.java new file mode 100644 index 00000000..b9c44566 --- /dev/null +++ b/src/main/java/com/eu/habbo/Emulator.java @@ -0,0 +1,499 @@ +package com.eu.habbo; + +import com.eu.habbo.core.*; +import com.eu.habbo.core.consolecommands.ConsoleCommand; +import com.eu.habbo.database.Database; +import com.eu.habbo.habbohotel.GameEnvironment; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.networking.camera.CameraClient; +import com.eu.habbo.networking.gameserver.GameServer; +import com.eu.habbo.networking.rconserver.RCONServer; +import com.eu.habbo.plugin.PluginManager; +import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; +import com.eu.habbo.plugin.events.emulator.EmulatorLoadedEvent; +import com.eu.habbo.plugin.events.emulator.EmulatorStartShutdownEvent; +import com.eu.habbo.plugin.events.emulator.EmulatorStoppedEvent; +import com.eu.habbo.threading.ThreadPooling; +import com.eu.habbo.threading.runnables.CameraClientAutoReconnect; +import com.eu.habbo.util.imager.badges.BadgeImager; +import io.netty.util.internal.logging.InternalLoggerFactory; +import io.netty.util.internal.logging.Slf4JLoggerFactory; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; +import java.util.regex.Pattern; + +public final class Emulator +{ + /** + * Major version of the emulator. + */ + public final static int MAJOR = 1; + + /** + * Minor version of the emulator. + */ + public final static int MINOR = 10; + + /** + * Stable build version of the emulator. + */ + public final static int BUILD = 0; + + /** + * Version as string. + */ + public static final String version = "Version: " + MAJOR + "." + MINOR + "." + BUILD; + + /** + * Public chat, used for staffchat for now. + */ + public static MessengerBuddy publicChatBuddy; + + /** + * The emulator is fully loaded and ready to handle players. + */ + public static boolean isReady = false; + + /** + * The emulator is shutting down. + */ + public static boolean isShuttingDown = false; + + /** + * The emulator has fully shutdown. + */ + public static boolean stopped = false; + + /** + * The emulator is in debugging mode. + */ + public static boolean debugging = false; + + private static int timeStarted = 0; + private static Runtime runtime; + private static ConfigurationManager config; + private static TextsManager texts; + private static GameServer gameServer; + private static RCONServer rconServer; + private static CameraClient cameraClient; + private static Database database; + private static Logging logging; + private static ThreadPooling threading; + private static GameEnvironment gameEnvironment; + private static PluginManager pluginManager; + private static Random random; + private static BadgeImager badgeImager; + + static + { + Thread hook = new Thread(new Runnable() + { + public synchronized void run() + { + Emulator.dispose(); + } + }); + hook.setPriority(10); + Runtime.getRuntime().addShutdownHook(hook); + } + + /** + * Entry point for Arcturus Emulator. + * @param args Unused + * @throws Exception Failed to start the emulator. + */ + public static void main(String[] args) throws Exception + { + try + { + Emulator.stopped = false; + ConsoleCommand.load(); + Emulator.logging = new Logging(); + Emulator.getLogging().logStart("\r" + Emulator.logo); + random = new Random(); + publicChatBuddy = new MessengerBuddy(-1, "Staff Chat", "", (short) 0, 0); + long startTime = System.nanoTime(); + + Emulator.runtime = Runtime.getRuntime(); + Emulator.config = new ConfigurationManager("config.ini"); + + if (Emulator.getConfig().getValue("username").isEmpty()) + { + Emulator.getLogging().logErrorLine("Please make sure you enter your forum login details!"); + Thread.sleep(2000); + } + + Emulator.database = new Database(Emulator.getConfig()); + Emulator.config.loaded = true; + Emulator.config.loadFromDatabase(); + Emulator.threading = new ThreadPooling(Emulator.getConfig().getInt("runtime.threads")); + Emulator.getDatabase().getDataSource().setMaximumPoolSize(Emulator.getConfig().getInt("runtime.threads") * 2); + Emulator.getDatabase().getDataSource().setMinimumIdle(10); + Emulator.pluginManager = new PluginManager(); + Emulator.pluginManager.reload(); + Emulator.getPluginManager().fireEvent(new EmulatorConfigUpdatedEvent()); + Emulator.texts = new TextsManager(); + new CleanerThread(); + Emulator.gameServer = new GameServer(getConfig().getValue("game.host", "127.0.0.1"), getConfig().getInt("game.port", 30000)); + Emulator.rconServer = new RCONServer(getConfig().getValue("rcon.host", "127.0.0.1"), getConfig().getInt("rcon.port", 30001)); + Emulator.gameEnvironment = new GameEnvironment(); + Emulator.gameEnvironment.load(); + Emulator.gameServer.initialise(); + Emulator.gameServer.connect(); + Emulator.rconServer.initialise(); + Emulator.rconServer.connect(); + Emulator.badgeImager = new BadgeImager(); + if (Emulator.getConfig().getBoolean("camera.enabled")) + { + Emulator.getThreading().run(new CameraClientAutoReconnect()); + } + + Emulator.getLogging().logStart("Habbo Hotel Emulator has succesfully loaded."); + Emulator.getLogging().logStart("You're running: " + Emulator.version); + Emulator.getLogging().logStart("System launched in: " + (System.nanoTime() - startTime) / 1e6 + "ms. Using: " + (Runtime.getRuntime().availableProcessors() * 2) + " threads!"); + Emulator.getLogging().logStart("Memory: " + (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024) + "/" + (runtime.freeMemory()) / (1024 * 1024) + "MB"); + + Emulator.debugging = Emulator.getConfig().getBoolean("debug.mode"); + + if (debugging) + { + Emulator.getLogging().logDebugLine("Debugging Enabled!"); + } + + Emulator.getPluginManager().fireEvent(new EmulatorLoadedEvent()); + Emulator.isReady = true; + Emulator.timeStarted = getIntUnixTimestamp(); + + if (Emulator.getConfig().getInt("runtime.threads") < (Runtime.getRuntime().availableProcessors() * 2)) + { + Emulator.getLogging().logStart("Emulator settings runtime.threads (" + Emulator.getConfig().getInt("runtime.threads") + ") can be increased to " + (Runtime.getRuntime().availableProcessors() * 2) + " to possibly increase performance."); + } + + if (Emulator.getConfig().getValue("username").isEmpty()) + { + Emulator.getLogging().logErrorLine("No account has been found in config.ini Please create an account on Arcturus.wf and edit the config.ini in order to maximize usage of Arcturus! http://arcturus.wf"); + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + + while (!isShuttingDown && isReady) + { + try + { + String line = reader.readLine(); + + if (line != null) + { + ConsoleCommand.handle(line); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * Shutsdown the emulator. + */ + private static void dispose() + { + Emulator.isShuttingDown = true; + Emulator.isReady = false; + Emulator.getLogging().logShutdownLine("Stopping Arcturus Emulator " + version + "..."); + + try + { + if (Emulator.getPluginManager() != null) + Emulator.getPluginManager().fireEvent(new EmulatorStartShutdownEvent()); + } + catch (Exception e) {} + + try + { + if (Emulator.cameraClient != null) + Emulator.cameraClient.disconnect(); + } + catch (Exception e) {} + + try + { + if (Emulator.rconServer != null) + Emulator.rconServer.stop(); + } + catch (Exception e) {} + + + try + { + if (Emulator.gameEnvironment != null) + Emulator.gameEnvironment.dispose(); + } + catch (Exception e) {} + + try + { + if (Emulator.getPluginManager() != null) + Emulator.getPluginManager().fireEvent(new EmulatorStoppedEvent()); + } + catch (Exception e) {} + + try + { + if (Emulator.pluginManager != null) + Emulator.pluginManager.dispose(); + } + catch (Exception e) {} + + Emulator.getLogging().saveLogs(); + + try + { + if (Emulator.config != null) + { + Emulator.config.saveToDatabase(); + } + } + catch (Exception e) {} + + try + { + if (Emulator.gameServer != null) + Emulator.gameServer.stop(); + } + catch (Exception e) {} + + Emulator.getLogging().logShutdownLine("Stopped Arcturus Emulator " + version + "..."); + + if (Emulator.database != null) + { + Emulator.getDatabase().dispose(); + } + Emulator.stopped = true; + + try + { + if (Emulator.threading != null) + Emulator.threading.shutDown(); + } + catch (Exception e) {} + } + + /** + * @return The ConfigurationManager + */ + public static ConfigurationManager getConfig() + { + return config; + } + + /** + * @return The TextsManager + */ + public static TextsManager getTexts() + { + return texts; + } + + /** + * @return The Database + */ + public static Database getDatabase() + { + return database; + } + + /** + * @return Current Runtime + */ + public static Runtime getRuntime() + { + return runtime; + } + + /** + * @return The GameServer + */ + public static GameServer getGameServer() + { + return gameServer; + } + + /** + * @return The RCONServer + */ + public static RCONServer getRconServer() + { + return rconServer; + } + + /** + * @return Logging module + */ + public static Logging getLogging() + { + return logging; + } + + /** + * @return The ThreadPooling + */ + public static ThreadPooling getThreading() + { + return threading; + } + + /** + * @return The GameEnvironment + */ + public static GameEnvironment getGameEnvironment() + { + return gameEnvironment; + } + + /** + * + * @return The PluginManager + */ + public static PluginManager getPluginManager() + { + return pluginManager; + } + + public static Random getRandom() + { + return random; + } + + public static BadgeImager getBadgeImager() + { + return badgeImager; + } + + public static CameraClient getCameraClient() + { + return cameraClient; + } + + public static synchronized void setCameraClient(CameraClient client) + { + cameraClient = client; + } + + public static int getTimeStarted() + { + return timeStarted; + } + + public static void prepareShutdown() + { + System.exit(0); + } + + /** + * Converts a date to an unix timestamp + * @param date The date to convert + * @return Return unix timestamp in seconds. + */ + private static String dateToUnixTimestamp(Date date) + { + String res = ""; + Date aux = stringToDate("1970-01-01 00:00:00"); + Timestamp aux1 = dateToTimeStamp(aux); + Timestamp aux2 = dateToTimeStamp(date); + long difference = aux2.getTime() - aux1.getTime(); + long seconds = difference / 1000L; + return res + seconds; + } + + /** + * Converts a String to a Date object + * @param date The String to parse + * @return The Date of the string. + */ + private static Date stringToDate(String date) + { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date res = null; + try + { + res = format.parse(date); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + return res; + } + + public static Timestamp dateToTimeStamp(Date date) + { + return new Timestamp(date.getTime()); + } + + public static Date getDate() + { + return new Date(System.currentTimeMillis()); + } + + public static String getUnixTimestamp() + { + return dateToUnixTimestamp(getDate()); + } + + public static int getIntUnixTimestamp() + { + return (int) (System.currentTimeMillis() / 1000); + } + + public static boolean isNumeric(String string) + throws IllegalArgumentException + { + boolean isnumeric = false; + if ((string != null) && (!string.equals(""))) + { + isnumeric = true; + char[] chars = string.toCharArray(); + for (char aChar : chars) + { + isnumeric = Character.isDigit(aChar); + if (!isnumeric) + { + break; + } + } + } + return isnumeric; + } + + public int getUserCount() + { + return gameEnvironment.getHabboManager().getOnlineCount(); + } + + public int getRoomCount() + { + return gameEnvironment.getRoomManager().getActiveRooms().size(); + } + + private static final String logo = + " _ ______ _ _ _ \n" + + " /\\ | | | ____| | | | | | |\n" + + " / \\ _ __ ___| |_ _ _ _ __ _ _ ___ | |__ _ __ ___ _ _| | __ _| |_ ___ _ __| |\n" + + " / /\\ \\ | '__/ __| __| | | | '__| | | / __| | __| | '_ ` _ \\| | | | |/ _` | __/ _ \\| '__| |\n" + + " / ____ \\| | | (__| |_| |_| | | | |_| \\__ \\ | |____| | | | | | |_| | | (_| | || (_) | | |_|\n" + + " /_/ \\_\\_| \\___|\\__|\\__,_|_| \\__,_|___/ |______|_| |_| |_|\\__,_|_|\\__,_|\\__\\___/|_| (_)\n" + + " \n" + + " "; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/CleanerThread.java b/src/main/java/com/eu/habbo/core/CleanerThread.java new file mode 100644 index 00000000..abc0f0d6 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/CleanerThread.java @@ -0,0 +1,225 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.friends.SearchUserEvent; +import com.eu.habbo.messages.incoming.navigator.SearchRoomsEvent; +import com.eu.habbo.threading.runnables.AchievementUpdater; +import com.eu.habbo.util.callback.HTTPPostStatus; +import com.eu.habbo.util.callback.HTTPVersionCheck; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +public class CleanerThread implements Runnable { + + /** + * Delay between each execution of checking to clean up in MS. + */ + public static final int DELAY = 10000; + + /** + * Amount of seconds the Hall Of Fame has to be reloaded. + */ + public static final int RELOAD_HALL_OF_FAME = 1800; + + /** + * Amount of seconds the News List has to be reloaded. + */ + public static final int RELOAD_NEWS_LIST = 3600; + + /** + * Amount of seconds inactive rooms have to be cleared. + */ + public static final int REMOVE_INACTIVE_ROOMS = 120; + + /** + * Amount of seconds inactive guilds have to be cleared. + */ + public static final int REMOVE_INACTIVE_GUILDS = 60; + + /** + * Amount of seconds inactive tours have to be cleared. + */ + public static final int REMOVE_INACTIVE_TOURS = 600; + + /** + * Amount of seconds error logs have to be saved to the database. + */ + public static final int SAVE_ERROR_LOGS = 30; + + /** + * + */ + private static final int CALLBACK_TIME = 60*15; + + + /** + * Last time the Hall Of Fame was reloaded. + */ + private static int LAST_HOF_RELOAD = Emulator.getIntUnixTimestamp(); + + /** + * Last time the news list was reloaded. + */ + private static int LAST_NL_RELOAD = Emulator.getIntUnixTimestamp(); + + /** + * Last time inactive rooms have been cleared. + */ + private static int LAST_INACTIVE_ROOMS_CLEARED = Emulator.getIntUnixTimestamp(); + + /** + * Last time inactive guilds have been cleared. + */ + private static int LAST_INACTIVE_GUILDS_CLEARED = Emulator.getIntUnixTimestamp(); + + /** + * Last time inactive tours have been cleared. + */ + private static int LAST_INACTIVE_TOURS_CLEARED = Emulator.getIntUnixTimestamp(); + + /** + * Last time error logs were saved to the database. + */ + private static int LAST_ERROR_LOGS_SAVED = Emulator.getIntUnixTimestamp(); + + /** + * Last time dailys where refilled. + */ + private static int LAST_DAILY_REFILL = Emulator.getIntUnixTimestamp(); + + private static int LAST_CALLBACK = Emulator.getIntUnixTimestamp(); + + public CleanerThread() + { + databaseCleanup(); + Emulator.getThreading().run(this, DELAY); + + Emulator.getThreading().run(new AchievementUpdater()); + + Emulator.getThreading().run(new HTTPVersionCheck(), 10000); + } + + @Override + public void run() + { + Emulator.getThreading().run(this, DELAY); + + int time = Emulator.getIntUnixTimestamp(); + + if (time - LAST_HOF_RELOAD > RELOAD_HALL_OF_FAME) + { + Emulator.getGameEnvironment().getHotelViewManager().getHallOfFame().reload(); + LAST_HOF_RELOAD = time; + } + + if (time - LAST_NL_RELOAD > RELOAD_NEWS_LIST) + { + Emulator.getGameEnvironment().getHotelViewManager().getNewsList().reload(); + LAST_NL_RELOAD = time; + } + + if (time - LAST_INACTIVE_ROOMS_CLEARED > REMOVE_INACTIVE_ROOMS) + { + Emulator.getGameEnvironment().getRoomManager().clearInactiveRooms(); + LAST_INACTIVE_ROOMS_CLEARED = time; + } + + if (time - LAST_INACTIVE_GUILDS_CLEARED > REMOVE_INACTIVE_GUILDS) + { + Emulator.getGameEnvironment().getGuildManager().clearInactiveGuilds(); + Emulator.getGameEnvironment().getGuildForumManager().clearInactiveForums(); + LAST_INACTIVE_GUILDS_CLEARED = time; + } + + if (time - LAST_INACTIVE_TOURS_CLEARED > REMOVE_INACTIVE_TOURS) + { + Emulator.getGameEnvironment().getGuideManager().cleanup(); + LAST_INACTIVE_TOURS_CLEARED = time; + } + + if (time - LAST_ERROR_LOGS_SAVED > SAVE_ERROR_LOGS) + { + Emulator.getLogging().saveLogs(); + LAST_ERROR_LOGS_SAVED = time; + } + + if (time - LAST_CALLBACK > CALLBACK_TIME) + { + Emulator.getThreading().run(new HTTPPostStatus()); + LAST_CALLBACK = time; + } + + if (time - LAST_DAILY_REFILL > Emulator.getConfig().getInt("hotel.refill.daily")) + { + refillDailyRespects(); + LAST_DAILY_REFILL = time; + } + + SearchRoomsEvent.cachedResults.clear(); + SearchUserEvent.cachedResults.clear(); + } + + /** + * Cleans up the database before emulator launch to guarantee system integrity. + */ + void databaseCleanup() + { + refillDailyRespects(); + + int time = Emulator.getIntUnixTimestamp(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (Statement statement = connection.createStatement()) + { + statement.execute("UPDATE users SET online = '0' WHERE online = '1'"); + statement.execute("UPDATE rooms SET users = '0' WHERE users > 0"); + statement.execute("DELETE FROM room_mutes WHERE ends < " + time); + statement.execute("DELETE FROM room_bans WHERE ends < " + time); + statement.execute("DELETE users_favorite_rooms FROM users_favorite_rooms LEFT JOIN rooms ON room_id = rooms.id WHERE rooms.id IS NULL"); + } + + try (PreparedStatement statement = connection.prepareStatement("UPDATE users_effects SET total = total - 1 WHERE activation_timestamp < ? AND activation_timestamp != 0")) + { + statement.setInt(1, Emulator.getIntUnixTimestamp() - 86400); + statement.execute(); + } + + try (Statement statement = connection.createStatement()) + { + statement.execute("DELETE FROM users_effects WHERE total <= 0"); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + Emulator.getLogging().logStart("Database -> Cleaned!"); + } + + public void refillDailyRespects() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_settings SET daily_respect_points = ?, daily_pet_respect_points = ?")) + { + statement.setInt(1, Emulator.getConfig().getInt("hotel.daily.respect")); + statement.setInt(2, Emulator.getConfig().getInt("hotel.daily.respect.pets")); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if (Emulator.isReady) + { + for (Habbo habbo : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().values()) + { + habbo.getHabboStats().petRespectPointsToGive = Emulator.getConfig().getInt("hotel.daily.respect"); + habbo.getHabboStats().respectPointsToGive = Emulator.getConfig().getInt("hotel.daily.respect.pets"); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/core/CommandLog.java b/src/main/java/com/eu/habbo/core/CommandLog.java new file mode 100644 index 00000000..a089f543 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/CommandLog.java @@ -0,0 +1,38 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.commands.Command; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class CommandLog implements Loggable +{ + public static String insertQuery = "INSERT INTO commandlogs (`user_id`, `timestamp`, `command`, `params`, `succes`) VALUES (?, ?, ?, ?, ?)"; + + private final int userId; + private final int timestamp = Emulator.getIntUnixTimestamp(); + private final Command command; + private final String params; + private final boolean succes; + + + public CommandLog(int userId, Command command, String params, boolean succes) + { + this.userId = userId; + this.command = command; + this.params = params; + this.succes = succes; + } + + @Override + public void log(PreparedStatement statement) throws SQLException + { + statement.setInt(1, this.userId); + statement.setInt(2, this.timestamp); + statement.setString(3, this.command.getClass().getSimpleName()); + statement.setString(4, this.params); + statement.setString(5, this.succes ? "yes" : "no"); + statement.addBatch(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/ConfigurationManager.java b/src/main/java/com/eu/habbo/core/ConfigurationManager.java new file mode 100644 index 00000000..a34ef6b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/ConfigurationManager.java @@ -0,0 +1,282 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.plugin.PluginManager; +import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.sql.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class ConfigurationManager +{ + /** + * Flag for when the ConfigurationManager has fully loaded. + */ + public boolean loaded = false; + + /** + * Flag for when the ConfigurationManager is still loading. + * The configurationmanager is loaded in two parts, + * first the config.ini is read. + * After that the rest of the configuration is read from the database. + */ + public boolean isLoading = false; + + /** + * Our configurations stored in this object. + */ + private final Properties properties; + + public ConfigurationManager(String path) throws Exception + { + this.properties = new Properties(); + + this.reload(); + } + + /** + * Reloads the settings from the config file. + * @throws Exception + */ + public void reload() throws Exception + { + this.isLoading = true; + this.properties.clear(); + + InputStream input = null; + + try { + File f = new File("config.ini"); + input = new FileInputStream(f); + this.properties.load(input); + + } catch (IOException ex) { + Emulator.getLogging().logErrorLine("[CRITICAL] FAILED TO LOAD CONFIG.INI FILE!"); + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + if(loaded) + { + this.loadFromDatabase(); + } + + this.isLoading = false; + Emulator.getLogging().logStart("Configuration Manager -> Loaded!"); + + if (Emulator.getPluginManager() != null) + { + Emulator.getPluginManager().fireEvent(new EmulatorConfigUpdatedEvent()); + } + } + + /** + * Loads the settings from the database. + */ + public void loadFromDatabase() + { + Emulator.getLogging().logStart("Loading configuration from database..."); + + long millis = System.currentTimeMillis(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement()) + { + if (statement.execute("SELECT * FROM emulator_settings")) + { + try (ResultSet set = statement.getResultSet()) + { + while (set.next()) + { + this.properties.put(set.getString("key"), set.getString("value")); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + Emulator.getLogging().logStart("Configuration -> loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void saveToDatabase() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE emulator_settings SET `value` = ? WHERE `key` = ? LIMIT 1")) + { + for (Map.Entry entry : this.properties.entrySet()) + { + statement.setString(1, entry.getValue().toString()); + statement.setString(2, entry.getKey().toString()); + statement.executeUpdate(); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Gets the string value for a specific key. + * @param key The key to find the value for. + * @return The string value for the key. Returns an empty string if not found. + */ + public String getValue(String key) + { + return getValue(key, ""); + } + + /** + * Gets the string value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The string value for the key. Returns defaultValue when not found. + */ + public String getValue(String key, String defaultValue) + { + if (this.isLoading) + return defaultValue; + + if (!this.properties.containsKey(key)) { + Emulator.getLogging().logErrorLine("[CONFIG] Key not found: " + key); + } + return this.properties.getProperty(key, defaultValue); + } + + /** + * Gets the boolean value for a specific key. + * @param key The key to find the value for. + * @return The boolean value for the key. Returns false if not found. + */ + public boolean getBoolean(String key) + { + return getBoolean(key, false); + } + + /** + * Gets the boolean value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The boolean value for the key. Returns defaultValue when not found. + */ + public boolean getBoolean(String key, boolean defaultValue) + { + if (this.isLoading) + return defaultValue; + + try + { + return (getValue(key, "0").equals("1")) || (getValue(key, "false").equals("true")); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse key " + key + " with value " + getValue(key) + " to type boolean."); + } + return defaultValue; + } + + /** + * Gets the int value for a specific key. + * @param key The key to find the value for. + * @return The int value for the key. Returns 0 if not found. + */ + public int getInt(String key) + { + return getInt(key, 0); + } + + /** + * Gets the int value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The int value for the key. Returns defaultValue when not found. + */ + public int getInt(String key, Integer defaultValue) + { + if (this.isLoading) + return defaultValue; + + try + { + return Integer.parseInt(getValue(key, defaultValue.toString())); + } catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse key " + key + " with value " + getValue(key) + " to type integer."); + } + return defaultValue; + } + + /** + * Gets the double value for a specific key. + * @param key The key to find the value for. + * @return The double value for the key. Returns 0 if not found. + */ + public double getDouble(String key) + { + return getDouble(key, 0.0); + } + + /** + * Gets the double value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The double value for the key. Returns defaultValue when not found. + */ + public double getDouble(String key, Double defaultValue) + { + if (this.isLoading) + return defaultValue; + + try + { + return Double.parseDouble(getValue(key, defaultValue.toString())); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse key " + key + " with value " + getValue(key) + " to type double."); + } + + return defaultValue; + } + + /** + * Updates the give key. + * @param key The key to update. + * @param value The new value. + */ + public void update(String key, String value) + { + this.properties.setProperty(key, value); + } + + public void register(String key, String value) + { + if (this.properties.getProperty(key, null) != null) + return; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO emulator_settings VALUES (?, ?)")) + { + statement.setString(1, key); + statement.setString(2, value); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.update(key, value); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/CreditsScheduler.java b/src/main/java/com/eu/habbo/core/CreditsScheduler.java new file mode 100644 index 00000000..3f692ff9 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/CreditsScheduler.java @@ -0,0 +1,81 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.Map; + +public class CreditsScheduler extends Scheduler +{ + /** + * Defines if users that are not in a room should be excluded from receiving credits. + */ + public static boolean IGNORE_HOTEL_VIEW; + + /** + * Defines if users idling in rooms should be excluded from receiving credits. + */ + public static boolean IGNORE_IDLED; + + /** + * The amount of credits that will be given. + */ + public static int CREDITS; + + public CreditsScheduler() + { + super(Emulator.getConfig().getInt("hotel.auto.credits.interval")); + + if(Emulator.getConfig().getBoolean("hotel.auto.credits.enabled")) + { + IGNORE_HOTEL_VIEW = Emulator.getConfig().getBoolean("hotel.auto.credits.ignore.hotelview"); + IGNORE_IDLED = Emulator.getConfig().getBoolean("hotel.auto.credits.ignore.idled"); + + CREDITS = Emulator.getConfig().getInt("hotel.auto.credits.amount"); + } + else + { + this.disposed = true; + } + } + + @Override + public void run() + { + super.run(); + + Habbo habbo; + for(Map.Entry map : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + habbo = map.getValue(); + + try + { + if (habbo != null) + { + if (habbo.getHabboInfo().getCurrentRoom() == null && IGNORE_HOTEL_VIEW) + continue; + + if (habbo.getRoomUnit().isIdle() && IGNORE_IDLED) + continue; + + habbo.giveCredits(CREDITS); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + + public boolean isDisposed() + { + return disposed; + } + + public void setDisposed(boolean disposed) + { + this.disposed = disposed; + } +} diff --git a/src/main/java/com/eu/habbo/core/Disposable.java b/src/main/java/com/eu/habbo/core/Disposable.java new file mode 100644 index 00000000..dc53bdf0 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/Disposable.java @@ -0,0 +1,7 @@ +package com.eu.habbo.core; + +public interface Disposable +{ + public void dispose(); + public boolean disposed(); +} diff --git a/src/main/java/com/eu/habbo/core/Easter.java b/src/main/java/com/eu/habbo/core/Easter.java new file mode 100644 index 00000000..3692d672 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/Easter.java @@ -0,0 +1,27 @@ +package com.eu.habbo.core; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.users.UserSavedMottoEvent; + +public class Easter +{ + @EventHandler + public static void onUserChangeMotto(UserSavedMottoEvent event) + { + if(event.newMotto.equalsIgnoreCase("crickey!")) + { + event.habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(event.newMotto, event.habbo, event.habbo, RoomChatMessageBubbles.ALERT))); + + Room room = event.habbo.getHabboInfo().getCurrentRoom(); + + room.sendComposer(new RoomUserRemoveComposer(event.habbo.getRoomUnit()).compose()); + room.sendComposer(new RoomUserPetComposer(2, 1, "FFFFFF", event.habbo).compose()); + + } + } +} diff --git a/src/main/java/com/eu/habbo/core/ErrorLog.java b/src/main/java/com/eu/habbo/core/ErrorLog.java new file mode 100644 index 00000000..33ad4090 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/ErrorLog.java @@ -0,0 +1,56 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * Created on 12-11-2015 19:16. + */ +public class ErrorLog implements Loggable +{ + public final static String insertQuery = "INSERT INTO emulator_errors (timestamp, type, stacktrace) VALUES (?, ?, ?)"; + public final int timeStamp; + public final String type; + public final String stackTrace; + + public ErrorLog(String type, Throwable e) + { + this.timeStamp = Emulator.getIntUnixTimestamp(); + this.type = type; + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + this.stackTrace = sw.toString(); + + try + { + pw.close(); + sw.close(); + } catch (IOException e1) + { + Emulator.getLogging().logErrorLine(e1); + } + } + + public ErrorLog(String type, String message) + { + this.timeStamp = Emulator.getIntUnixTimestamp(); + this.type = type; + this.stackTrace = message; + } + + @Override + public void log(PreparedStatement statement) throws SQLException + { + statement.setInt(1, this.timeStamp); + statement.setString(2, this.type); + statement.setString(3, this.stackTrace); + statement.addBatch(); + } +} diff --git a/src/main/java/com/eu/habbo/core/Loggable.java b/src/main/java/com/eu/habbo/core/Loggable.java new file mode 100644 index 00000000..c974aac0 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/Loggable.java @@ -0,0 +1,9 @@ +package com.eu.habbo.core; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public interface Loggable +{ + void log(PreparedStatement statement) throws SQLException; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/Logging.java b/src/main/java/com/eu/habbo/core/Logging.java new file mode 100644 index 00000000..8dbe0f64 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/Logging.java @@ -0,0 +1,444 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.util.callback.HTTPPostError; +import gnu.trove.set.hash.THashSet; +import sun.rmi.runtime.Log; + +import java.io.*; +import java.nio.file.Files; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class Logging +{ + /** + * File that packetlogs will be sved to. + */ + private static File packets; + + /** + * File that undefined packetlogs will be saved to. + */ + private static File packetsUndefined; + + /** + * File that packets that were improperly handled will be saved to. + */ + private static File errorsPackets; + + /** + * File that SQL errors will be saved to. + */ + private static File errorsSQL; + + /** + * File that runtime errors will be saved to. + */ + private static File errorsRuntime; + + /** + * File that debug logs will be saved to. + */ + private static File debugFile; + + private static PrintWriter packetsWriter; + private static PrintWriter packetsUndefinedWriter; + private static PrintWriter errorsPacketsWriter; + private static PrintWriter errorsSQLWriter; + private static PrintWriter errorsRuntimeWriter; + private static PrintWriter debugFileWriter; + + /** + * Bright text. + */ + public static final String ANSI_BRIGHT = "\u001B[1m"; + + /** + * Italicized text. + */ + public static final String ANSI_ITALICS = "\u001B[3m"; + + /** + * Underlined text. + */ + public static final String ANSI_UNDERLINE = "\u001B[4m"; + + /** + * Resets all text effects to normal console font. + */ + public static final String ANSI_RESET = "\u001B[0m"; + + public static final String ANSI_BLACK = "\u001B[30m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + public static final String ANSI_BLUE = "\u001B[34m"; + public static final String ANSI_PURPLE = "\u001B[35m"; + public static final String ANSI_CYAN = "\u001B[36m"; + public static final String ANSI_WHITE = "\u001B[37m"; + + /** + * Error logging cache layer. + * Used for bulk inserting into the database. + */ + private final THashSet errorLogs = new THashSet(); + + /** + * Command log cache layer. + * Used for bulk inserting into the database. + */ + private final THashSet commandLogs = new THashSet(); + + public Logging() + { + packets = new File("logging//packets//defined.txt"); + packetsUndefined = new File("logging//packets//packets.txt"); + errorsPackets = new File("logging//errors//packets.txt"); + errorsSQL = new File("logging//errors//sql.txt"); + errorsRuntime = new File("logging//errors//runtime.txt"); + debugFile = new File("logging//debug.txt"); + + try + { + if (!packets.exists()) + { + if (!packets.getParentFile().exists()) + { + packets.getParentFile().mkdirs(); + } + + packets.createNewFile(); + } + + if (!packetsUndefined.exists()) + { + if (!packetsUndefined.getParentFile().exists()) + { + packetsUndefined.getParentFile().mkdirs(); + } + + packetsUndefined.createNewFile(); + } + + if (!errorsPackets.exists()) + { + if (!errorsPackets.getParentFile().exists()) + { + errorsPackets.getParentFile().mkdirs(); + } + + errorsPackets.createNewFile(); + } + + if (!errorsSQL.exists()) + { + if (!errorsSQL.getParentFile().exists()) + { + errorsSQL.getParentFile().mkdirs(); + } + + errorsSQL.createNewFile(); + } + + if (!errorsRuntime.exists()) + { + if (!errorsRuntime.getParentFile().exists()) + { + errorsRuntime.getParentFile().mkdirs(); + } + + errorsRuntime.createNewFile(); + } + + if (!debugFile.exists()) + { + if (!debugFile.getParentFile().exists()) + { + debugFile.getParentFile().mkdirs(); + } + + debugFile.createNewFile(); + } + } + catch(Exception e) + { + e.printStackTrace(); + } + + try + { + packetsWriter = new PrintWriter(new FileWriter(packets, true)); + packetsUndefinedWriter = new PrintWriter(new FileWriter(packetsUndefined, true)); + errorsPacketsWriter = new PrintWriter(new FileWriter(errorsPackets, true)); + errorsSQLWriter = new PrintWriter(new FileWriter(errorsSQL, true)); + errorsRuntimeWriter = new PrintWriter(new FileWriter(errorsRuntime, true)); + debugFileWriter = new PrintWriter(new FileWriter(debugFile, true)); + } + catch (IOException e) + { + System.out.println("[CRITICAL] FAILED TO LOAD LOGGING COMPONENT!"); + } + } + + /** + * Prints a starting message to the console. + * @param line The message to print. + */ + public void logStart(Object line) + { + System.out.println("[" + Logging.ANSI_BRIGHT + Logging.ANSI_GREEN + "LOADING" + Logging.ANSI_RESET + "] " + line.toString()); + } + + /** + * Prints a shutdown message to the console. + * @param line The message to print. + */ + public void logShutdownLine(Object line) + { + if(Emulator.getConfig().getBoolean("logging.debug")) + { + write(debugFileWriter, line.toString()); + } + System.out.println("[" + Logging.ANSI_BRIGHT + Logging.ANSI_GREEN + "SHUTDOWN" + Logging.ANSI_RESET + "] " + line.toString()); + } + + public void logUserLine(Object line) + { + if(Emulator.getConfig().getBoolean("logging.debug")) + { + write(debugFileWriter, line.toString()); + } + + if (Emulator.getConfig().getBoolean("debug.show.users")) + { + System.out.println("[USER] " + line.toString()); + } + } + + public synchronized void logDebugLine(Object line) + { + if (line instanceof Throwable) + { + logErrorLine(line); + return; + } + if (Emulator.getConfig().getBoolean("debug.mode")) { + System.out.println("[DEBUG] " + line.toString()); + } + + if(Emulator.getConfig().getBoolean("logging.debug")) + { + write(debugFileWriter, line.toString()); + } + } + + public synchronized void logPacketLine(Object line) + { + if (Emulator.getConfig().getBoolean("debug.show.packets")) { + System.out.println("[" + Logging.ANSI_BLUE + "PACKET" + Logging.ANSI_RESET + "]" + line.toString()); + } + + if(Emulator.getConfig().getBoolean("logging.packets")) + { + write(packetsWriter, line.toString()); + } + } + + public synchronized void logUndefinedPacketLine(Object line) + { + if (Emulator.getConfig().getBoolean("debug.show.packets.undefined")) + { + System.out.println("[PACKET] [UNDEFINED] " + line.toString()); + } + + if (Emulator.getConfig().getBoolean("logging.packets.undefined")) + { + write(packetsUndefinedWriter, line.toString()); + } + } + + public synchronized void logErrorLine(Object line) + { + if (Emulator.isReady && Emulator.getConfig().getBoolean("debug.show.errors")) + { + System.err.println("[ERROR] " + line.toString()); + } + + if (Emulator.getConfig().loaded && Emulator.getConfig().getBoolean("logging.errors.runtime")) + { + write(errorsRuntimeWriter, line); + } + + if(line instanceof Throwable) + { + ((Throwable) line).printStackTrace(); + if (line instanceof SQLException) + { + this.logSQLException((SQLException) line); + return; + } + Emulator.getThreading().run(new HTTPPostError((Throwable) line)); + + this.errorLogs.add(new ErrorLog("Exception", (Throwable) line)); + + return; + } + + this.errorLogs.add(new ErrorLog("Emulator", line.toString())); + } + + public void logSQLException(SQLException e) + { + if(Emulator.getConfig().getBoolean("logging.errors.sql")) + { + e.printStackTrace(); + write(errorsSQLWriter, e); + + Emulator.getThreading().run(new HTTPPostError(e)); + } + } + + public void logPacketError(Object e) + { + if(Emulator.getConfig().getBoolean("logging.errors.packets")) + { + if(e instanceof Throwable) + ((Exception) e).printStackTrace(); + + write(errorsPacketsWriter, e); + } + + if(e instanceof Throwable) + { + ((Throwable) e).printStackTrace(); + if (e instanceof SQLException) + { + this.logSQLException((SQLException) e); + return; + } + + Emulator.getThreading().run(new HTTPPostError((Throwable) e)); + } + } + + public void handleException(Exception e) + { + e.printStackTrace(); + } + + private synchronized void write(PrintWriter printWriter, Object message) + { + if(printWriter != null && message != null) + { + if(message instanceof Throwable) + { + ((Exception) message).printStackTrace(printWriter); + } + else + { + printWriter.write("MSG: " + message.toString() + "\r\n"); + } + + printWriter.flush(); + } + } + + public void addLog(Loggable log) + { + if (log instanceof ErrorLog) + { + synchronized (this.errorLogs) + { + this.errorLogs.add(log); + } + } + else if (log instanceof CommandLog) + { + synchronized (this.commandLogs) + { + this.commandLogs.add(log); + } + } + } + + public void saveLogs() + { + if (Emulator.getDatabase() != null && Emulator.getDatabase().getDataSource() != null) + { + if (!this.errorLogs.isEmpty() || !this.commandLogs.isEmpty()) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + if (!this.errorLogs.isEmpty()) + { + synchronized (this.errorLogs) + { + try (PreparedStatement statement = connection.prepareStatement(ErrorLog.insertQuery)) + { + for (Loggable log : this.errorLogs) + { + log.log(statement); + } + statement.executeBatch(); + } + this.errorLogs.clear(); + } + } + + if (!this.commandLogs.isEmpty()) + { + synchronized (this.commandLogs) + { + try (PreparedStatement statement = connection.prepareStatement(CommandLog.insertQuery)) + { + for (Loggable log : this.commandLogs) + { + log.log(statement); + } + + statement.executeBatch(); + } + this.commandLogs.clear(); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + + public static PrintWriter getPacketsWriter() + { + return packetsWriter; + } + + public static PrintWriter getPacketsUndefinedWriter() + { + return packetsUndefinedWriter; + } + + public static PrintWriter getErrorsPacketsWriter() + { + return errorsPacketsWriter; + } + + public static PrintWriter getErrorsSQLWriter() + { + return errorsSQLWriter; + } + + public static PrintWriter getErrorsRuntimeWriter() + { + return errorsRuntimeWriter; + } + + public static PrintWriter getDebugFileWriter() + { + return debugFileWriter; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/PixelScheduler.java b/src/main/java/com/eu/habbo/core/PixelScheduler.java new file mode 100644 index 00000000..00018148 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/PixelScheduler.java @@ -0,0 +1,111 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.Map; + +public class PixelScheduler extends Scheduler +{ + /** + * Defines if users that are not in a room should be excluded from receiving pixels. + */ + public static boolean IGNORE_HOTEL_VIEW; + + /** + * Defines if users idling in rooms should be excluded from receiving pixels. + */ + public static boolean IGNORE_IDLED; + + /** + * The amount of pixels to give. + */ + private static int PIXELS; + + public PixelScheduler() + { + super(Emulator.getConfig().getInt("hotel.auto.pixels.interval")); + + if(Emulator.getConfig().getBoolean("hotel.auto.pixels.enabled")) + { + IGNORE_HOTEL_VIEW = Emulator.getConfig().getBoolean("hotel.auto.pixels.ignore.hotelview"); + IGNORE_IDLED = Emulator.getConfig().getBoolean("hotel.auto.pixels.ignore.idled"); + + PIXELS = Emulator.getConfig().getInt("hotel.auto.pixels.amount"); + } + else + { + this.disposed = true; + } + } + + @Override + public void run() + { + super.run(); + + Habbo habbo = null; + for(Map.Entry map : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + habbo = map.getValue(); + + try + { + if (habbo != null) + { + if (habbo.getHabboInfo().getCurrentRoom() == null && IGNORE_HOTEL_VIEW) + continue; + + if (habbo.getRoomUnit().isIdle() && IGNORE_IDLED) + continue; + + habbo.givePixels(PIXELS); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + + public static boolean isIgnoreHotelView() + { + return IGNORE_HOTEL_VIEW; + } + + public static void setIgnoreHotelView(boolean ignoreHotelView) + { + IGNORE_HOTEL_VIEW = ignoreHotelView; + } + + public static boolean isIgnoreIdled() + { + return IGNORE_IDLED; + } + + public static void setIgnoreIdled(boolean ignoreIdled) + { + IGNORE_IDLED = ignoreIdled; + } + + public static int getPIXELS() + { + return PIXELS; + } + + public static void setPIXELS(int PIXELS) + { + PixelScheduler.PIXELS = PIXELS; + } + + public boolean isDisposed() + { + return disposed; + } + + public void setDisposed(boolean disposed) + { + this.disposed = disposed; + } +} diff --git a/src/main/java/com/eu/habbo/core/PointsScheduler.java b/src/main/java/com/eu/habbo/core/PointsScheduler.java new file mode 100644 index 00000000..21719193 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/PointsScheduler.java @@ -0,0 +1,111 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.Map; + +public class PointsScheduler extends Scheduler +{ + /** + * Defines if users that are not in a room should be excluded from receiving points. + */ + public static boolean IGNORE_HOTEL_VIEW; + + /** + * Defines if users idling in rooms should be excluded from receiving points. + */ + public static boolean IGNORE_IDLED; + + /** + * The amount of points to give. + */ + private static int POINTS; + + public PointsScheduler() + { + super(Emulator.getConfig().getInt("hotel.auto.points.interval")); + + if(Emulator.getConfig().getBoolean("hotel.auto.points.enabled")) + { + IGNORE_HOTEL_VIEW = Emulator.getConfig().getBoolean("hotel.auto.points.ignore.hotelview"); + IGNORE_IDLED = Emulator.getConfig().getBoolean("hotel.auto.points.ignore.idled"); + + POINTS = Emulator.getConfig().getInt("hotel.auto.points.amount"); + } + else + { + this.disposed = true; + } + } + + @Override + public void run() + { + super.run(); + + Habbo habbo = null; + for(Map.Entry map : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + habbo = map.getValue(); + + try + { + if (habbo != null) + { + if (habbo.getHabboInfo().getCurrentRoom() == null && IGNORE_HOTEL_VIEW) + continue; + + if (habbo.getRoomUnit().isIdle() && IGNORE_IDLED) + continue; + + habbo.givePoints(POINTS); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + + public static boolean isIgnoreHotelView() + { + return IGNORE_HOTEL_VIEW; + } + + public static void setIgnoreHotelView(boolean ignoreHotelView) + { + IGNORE_HOTEL_VIEW = ignoreHotelView; + } + + public static boolean isIgnoreIdled() + { + return IGNORE_IDLED; + } + + public static void setIgnoreIdled(boolean ignoreIdled) + { + IGNORE_IDLED = ignoreIdled; + } + + public static int getPOINTS() + { + return POINTS; + } + + public static void setPOINTS(int POINTS) + { + PointsScheduler.POINTS = POINTS; + } + + public boolean isDisposed() + { + return disposed; + } + + public void setDisposed(boolean disposed) + { + this.disposed = disposed; + } +} diff --git a/src/main/java/com/eu/habbo/core/RoomUserPetComposer.java b/src/main/java/com/eu/habbo/core/RoomUserPetComposer.java new file mode 100644 index 00000000..9edc7b13 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/RoomUserPetComposer.java @@ -0,0 +1,52 @@ +package com.eu.habbo.core; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserPetComposer extends MessageComposer +{ + private final int petType; + private final int race; + private final String color; + private final Habbo habbo; + + public RoomUserPetComposer(int petType, int race, String color, Habbo habbo) + { + this.petType = petType; + this.race = race; + this.color = color; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUsersComposer); + this.response.appendInt(1); + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendString(""); + this.response.appendString(this.petType + " " + this.race + " " + this.color + " 2 2 -1 0 3 -1 0"); + this.response.appendInt(habbo.getRoomUnit().getId()); + this.response.appendInt32(habbo.getRoomUnit().getX()); + this.response.appendInt32(habbo.getRoomUnit().getY()); + this.response.appendString(habbo.getRoomUnit().getZ() + ""); + this.response.appendInt(habbo.getRoomUnit().getBodyRotation().getValue()); + this.response.appendInt(2); + this.response.appendInt(this.petType); + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendInt(1); + this.response.appendBoolean(false); + this.response.appendBoolean(true); + this.response.appendBoolean(true); //Can toggle breeding permissions. + this.response.appendBoolean(true); + this.response.appendBoolean(true); //Can treat? + this.response.appendBoolean(true); //Can breed + this.response.appendInt(0); + this.response.appendString(""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/core/Scheduler.java b/src/main/java/com/eu/habbo/core/Scheduler.java new file mode 100644 index 00000000..431710a1 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/Scheduler.java @@ -0,0 +1,43 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; + +public class Scheduler implements Runnable +{ + protected boolean disposed; + protected int interval; + + public Scheduler(int interval) + { + this.interval = interval; + } + + public boolean isDisposed() + { + return this.disposed; + } + + public void setDisposed(boolean disposed) + { + this.disposed = disposed; + } + + public int getInterval() + { + return this.interval; + } + + public void setInterval(int interval) + { + this.interval = interval; + } + + @Override + public void run() + { + if (this.disposed) + return; + + Emulator.getThreading().run(this, this.interval * 1000); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/TextsManager.java b/src/main/java/com/eu/habbo/core/TextsManager.java new file mode 100644 index 00000000..7edae3b6 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/TextsManager.java @@ -0,0 +1,172 @@ +package com.eu.habbo.core; + +import com.eu.habbo.Emulator; + +import java.sql.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class TextsManager +{ + /** + * All emulator texts are stored in this object. + */ + private final Properties texts; + + public TextsManager() + { + long millis = System.currentTimeMillis(); + + this.texts = new Properties(); + + try + { + + this.reload(); + + Emulator.getLogging().logStart("Texts Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * Reloads all texts from the database. + * @throws Exception + */ + public void reload() throws Exception + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM emulator_texts")) + { + while(set.next()) + { + if(this.texts.containsKey(set.getString("key"))) + { + this.texts.setProperty(set.getString("key"), set.getString("value")); + } + else + { + this.texts.put(set.getString("key"), set.getString("value")); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Gets the string value for a specific key. + * @param key The key to find the value for. + * @return The string value for the key. Returns an empty string if not found. + */ + public String getValue(String key) + { + return getValue(key, ""); + } + + /** + * Gets the string value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The string value for the key. Returns defaultValue when not found. + */ + public String getValue(String key, String defaultValue) + { + if (!this.texts.containsKey(key)) { + Emulator.getLogging().logErrorLine("[TEXTS] Text key not found: " + key); + } + return this.texts.getProperty(key, defaultValue); + } + + /** + * Gets the boolean value for a specific key. + * @param key The key to find the value for. + * @return The boolean value for the key. Returns false if not found. + */ + public boolean getBoolean(String key) + { + return getBoolean(key, false); + } + + /** + * Gets the boolean value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The boolean value for the key. Returns defaultValue when not found. + */ + public boolean getBoolean(String key, Boolean defaultValue) + { + try + { + return (getValue(key, "0").equals("1")) || (getValue(key, "false").equals("true")); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + return defaultValue; + } + + /** + * Gets the int value for a specific key. + * @param key The key to find the value for. + * @return The int value for the key. Returns 0 if not found. + */ + public int getInt(String key) + { + return getInt(key, 0); + } + + /** + * Gets the int value for a specific key. + * @param key The key to find the value for. + * @param defaultValue The value that will be returned when the key is not found. + * @return The int value for the key. Returns defaultValue when not found. + */ + public int getInt(String key, Integer defaultValue) + { + try + { + return Integer.parseInt(getValue(key, defaultValue.toString())); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + return defaultValue; + } + + /** + * Updates the give key. + * @param key The key to update. + * @param value The new value. + */ + public void update(String key, String value) + { + this.texts.setProperty(key, value); + } + + public void register(String key, String value) + { + if (this.texts.getProperty(key, null) != null) + return; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO emulator_texts VALUES (?, ?)")) + { + statement.setString(1, key); + statement.setString(2, value); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.update(key, value); + } +} diff --git a/src/main/java/com/eu/habbo/core/consolecommands/ConsoleCommand.java b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleCommand.java new file mode 100644 index 00000000..4ba15ded --- /dev/null +++ b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleCommand.java @@ -0,0 +1,110 @@ +package com.eu.habbo.core.consolecommands; + +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +public abstract class ConsoleCommand +{ + /** + * Holds all console commands. + */ + public static THashMap commands = new THashMap(); + + /** + * The key of the command. First word. + */ + public final String key; + + /** + * Usage of the command (Arguments). + */ + public final String usage; + + /** + * Constructs a new ConsoleCommand. + * @param key The key of the command. First word. + * @param usage Usage of the command (Arguments). + */ + public ConsoleCommand(String key, String usage) + { + this.key = key; + this.usage = usage; + } + + /** + * Loads all default ConsoleCommands. + */ + public static void load() + { + addCommand(new ConsoleShutdownCommand()); + addCommand(new ConsoleInfoCommand()); + addCommand(new ConsoleTestCommand()); + addCommand(new ConsoleReconnectCameraCommand()); + } + + /** + * Handles a command + * @param args The arguments entered in the console including the key at index 0. + * @throws Exception + */ + public abstract void handle(String[] args) throws Exception; + + /** + * Add a new consolecommand. + * @param command The consolecommand to add. + */ + public static void addCommand(ConsoleCommand command) + { + commands.put(command.key, command); + } + + /** + * Searches for the consolecommand using a given key. + * @param key The key to find the associated ConsoleCommand for. + * @return The ConsoleCommand associated with the key. return null if not found. + */ + public static ConsoleCommand findCommand(String key) + { + return commands.get(key); + } + + /** + * Handles a line entered in the console. + * @param line The line entered in the console. + * @return True if the command was succesfully handled. Otherwise false. + */ + public static boolean handle(String line) + { + String[] message = line.split(" "); + + if (message.length > 0) + { + ConsoleCommand command = ConsoleCommand.findCommand(message[0]); + + if (command != null) + { + try + { + command.handle(message); + return true; + } + catch (Exception e) + { + e.printStackTrace(); + } + } + else + { + System.out.println("Unknown Console Command " + message[0]); + System.out.println("Commands Available (" + commands.size() + "): "); + + for (ConsoleCommand c : commands.values()) + { + System.out.println(c.key + " " + c.usage); + } + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/consolecommands/ConsoleInfoCommand.java b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleInfoCommand.java new file mode 100644 index 00000000..b93bb3a4 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleInfoCommand.java @@ -0,0 +1,37 @@ +package com.eu.habbo.core.consolecommands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogManager; + +import java.util.concurrent.TimeUnit; + +public class ConsoleInfoCommand extends ConsoleCommand +{ + public ConsoleInfoCommand() + { + super("info", ""); + } + + @Override + public void handle(String[] args) throws Exception + { + int seconds = Emulator.getIntUnixTimestamp() - Emulator.getTimeStarted(); + int day = (int) TimeUnit.SECONDS.toDays(seconds); + long hours = TimeUnit.SECONDS.toHours(seconds) - (day *24); + long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds)* 60); + long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) *60); + + System.out.println("Emulator version: " + Emulator.version); + System.out.println("Hotel Statistics"); + System.out.println("- Users: " + Emulator.getGameEnvironment().getHabboManager().getOnlineCount()); + System.out.println("- Rooms: " + Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size()); + System.out.println("- Shop: " + Emulator.getGameEnvironment().getCatalogManager().catalogPages.size() + " pages and " + CatalogManager.catalogItemAmount + " items."); + System.out.println("- Furni: " + Emulator.getGameEnvironment().getItemManager().getItems().size() + " items."); + System.out.println(""); + System.out.println("Server Statistics"); + System.out.println("- Uptime: " + day + (day > 1 ? " days, " : " day, ") + hours + (hours > 1 ? " hours, " : " hour, ") + minute + (minute > 1 ? " minutes, " : " minute, ") + second + (second > 1 ? " seconds!" : " second!")); + System.out.println("- RAM Usage: " + (Emulator.getRuntime().totalMemory() - Emulator.getRuntime().freeMemory()) / (1024 * 1024) + "/" + (Emulator.getRuntime().freeMemory()) / (1024 * 1024) + "MB"); + System.out.println("- CPU Cores: " + Emulator.getRuntime().availableProcessors()); + System.out.println("- Total Memory: " + Emulator.getRuntime().maxMemory() / (1024 * 1024) + "MB"); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/consolecommands/ConsoleReconnectCameraCommand.java b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleReconnectCameraCommand.java new file mode 100644 index 00000000..c2c5c9f2 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleReconnectCameraCommand.java @@ -0,0 +1,18 @@ +package com.eu.habbo.core.consolecommands; + +import com.eu.habbo.networking.camera.CameraClient; + +public class ConsoleReconnectCameraCommand extends ConsoleCommand +{ + public ConsoleReconnectCameraCommand() + { + super("camera", ""); + } + + @Override + public void handle(String[] args) throws Exception + { + System.out.println("Connecting to the camera..."); + CameraClient.attemptReconnect = true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/consolecommands/ConsoleShutdownCommand.java b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleShutdownCommand.java new file mode 100644 index 00000000..684816bc --- /dev/null +++ b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleShutdownCommand.java @@ -0,0 +1,17 @@ +package com.eu.habbo.core.consolecommands; + +import com.eu.habbo.habbohotel.commands.ShutdownCommand; + +public class ConsoleShutdownCommand extends ConsoleCommand +{ + public ConsoleShutdownCommand() + { + super("stop", ""); + } + + @Override + public void handle(String[] args) throws Exception + { + new ShutdownCommand().handle(null, args); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/core/consolecommands/ConsoleTestCommand.java b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleTestCommand.java new file mode 100644 index 00000000..175a6546 --- /dev/null +++ b/src/main/java/com/eu/habbo/core/consolecommands/ConsoleTestCommand.java @@ -0,0 +1,19 @@ +package com.eu.habbo.core.consolecommands; + + +public class ConsoleTestCommand extends ConsoleCommand +{ + public ConsoleTestCommand() + { + super("test", "test"); + } + + @Override + public void handle(String[] args) throws Exception + { + System.out.println("This is a test command for live debugging."); + + + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/database/Database.java b/src/main/java/com/eu/habbo/database/Database.java new file mode 100644 index 00000000..d491cb15 --- /dev/null +++ b/src/main/java/com/eu/habbo/database/Database.java @@ -0,0 +1,80 @@ +package com.eu.habbo.database; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.ConfigurationManager; +import com.zaxxer.hikari.HikariDataSource; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +public class Database +{ + /** + * Database datasource. + */ + private HikariDataSource dataSource; + + /** + * Database connection pool. + */ + private DatabasePool databasePool; + + public Database(ConfigurationManager config) + { + + long millis = System.currentTimeMillis(); + + boolean SQLException = false; + + try + { + this.databasePool = new DatabasePool(); + if (!this.databasePool.getStoragePooling(config)) + { + Emulator.getLogging().logStart("Failed to connect to the database. Shutting down..."); + SQLException = true; + return; + } + this.dataSource = this.databasePool.getDatabase(); + } + catch (Exception e) + { + SQLException = true; + e.printStackTrace(); + Emulator.getLogging().logStart("Failed to connect to your database."); + Emulator.getLogging().logStart(e.getMessage()); + } + finally + { + if (SQLException) + Emulator.prepareShutdown(); + } + + Emulator.getLogging().logStart("Database -> Connected! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + /** + * Disposes the database and closes all connections to the database. + */ + public void dispose() + { + if (this.databasePool != null) + { + this.databasePool.getDatabase().close(); + } + + this.dataSource.close(); + } + + public HikariDataSource getDataSource() + { + return this.dataSource; + } + + public DatabasePool getDatabasePool() + { + return this.databasePool; + } +} + diff --git a/src/main/java/com/eu/habbo/database/DatabasePool.java b/src/main/java/com/eu/habbo/database/DatabasePool.java new file mode 100644 index 00000000..d403fac1 --- /dev/null +++ b/src/main/java/com/eu/habbo/database/DatabasePool.java @@ -0,0 +1,61 @@ +package com.eu.habbo.database; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.ConfigurationManager; +import com.eu.habbo.core.Logging; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.PrintWriter; + +class DatabasePool +{ + private final Logger log = LoggerFactory.getLogger(DatabasePool.class); + private HikariDataSource database; + + public boolean getStoragePooling(ConfigurationManager config) + { + try + { + HikariConfig databaseConfiguration = new HikariConfig(); + databaseConfiguration.setMaximumPoolSize(config.getInt("db.pool.maxsize", 50)); + databaseConfiguration.setMinimumIdle(config.getInt("db.pool.minsize", 10)); + databaseConfiguration.setJdbcUrl("jdbc:mysql://" + config.getValue("db.hostname", "localhost") + ":" + config.getValue("db.port", "3306") + "/" + config.getValue("db.database", "habbo") + config.getValue("db.params")); + databaseConfiguration.addDataSourceProperty("serverName", config.getValue("db.hostname", "localhost")); + databaseConfiguration.addDataSourceProperty("port", config.getValue("db.port", "3306")); + databaseConfiguration.addDataSourceProperty("databaseName", config.getValue("db.database", "habbo")); + databaseConfiguration.addDataSourceProperty("user", config.getValue("db.username")); + databaseConfiguration.addDataSourceProperty("password", config.getValue("db.password")); + databaseConfiguration.addDataSourceProperty("dataSource.logger", "com.mysql.jdbc.log.StandardLogger"); + databaseConfiguration.addDataSourceProperty("dataSource.logSlowQueries", "true"); + databaseConfiguration.addDataSourceProperty("dataSource.dumpQueriesOnException", "true"); + databaseConfiguration.addDataSourceProperty("prepStmtCacheSize", "500"); + databaseConfiguration.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + databaseConfiguration.addDataSourceProperty("dataSource.logWriter", Logging.getErrorsSQLWriter()); + databaseConfiguration.addDataSourceProperty("cachePrepStmts", "true"); + databaseConfiguration.addDataSourceProperty("useServerPrepStmts", "true"); + databaseConfiguration.addDataSourceProperty("rewriteBatchedStatements", "true"); + databaseConfiguration.addDataSourceProperty("useUnicode","true"); + databaseConfiguration.setAutoCommit(true); + databaseConfiguration.setConnectionTimeout(300000L); + databaseConfiguration.setValidationTimeout(5000L); + databaseConfiguration.setLeakDetectionThreshold(20000L); + databaseConfiguration.setMaxLifetime(1800000L); + databaseConfiguration.setIdleTimeout(600000L); + //databaseConfiguration.setDriverClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource"); + this.database = new HikariDataSource(databaseConfiguration); + } + catch (Exception e) + { + return false; + } + return true; + } + + public HikariDataSource getDatabase() + { + return this.database; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/GameEnvironment.java b/src/main/java/com/eu/habbo/habbohotel/GameEnvironment.java new file mode 100644 index 00000000..314b3317 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/GameEnvironment.java @@ -0,0 +1,193 @@ +package com.eu.habbo.habbohotel; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.CreditsScheduler; +import com.eu.habbo.core.PixelScheduler; +import com.eu.habbo.core.PointsScheduler; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.bots.BotManager; +import com.eu.habbo.habbohotel.catalog.CatalogManager; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.habbohotel.crafting.CraftingManager; +import com.eu.habbo.habbohotel.guides.GuideManager; +import com.eu.habbo.habbohotel.guilds.GuildManager; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumManager; +import com.eu.habbo.habbohotel.hotelview.HotelViewManager; +import com.eu.habbo.habbohotel.items.ItemManager; +import com.eu.habbo.habbohotel.modtool.ModToolManager; +import com.eu.habbo.habbohotel.modtool.WordFilter; +import com.eu.habbo.habbohotel.navigation.NavigatorManager; +import com.eu.habbo.habbohotel.permissions.PermissionsManager; +import com.eu.habbo.habbohotel.pets.PetManager; +import com.eu.habbo.habbohotel.polls.PollManager; +import com.eu.habbo.habbohotel.rooms.RoomManager; +import com.eu.habbo.habbohotel.users.HabboManager; + +public class GameEnvironment +{ + private HabboManager habboManager; + private NavigatorManager navigatorManager; + private GuildManager guildManager; + private GuildForumManager guildForumManager; + private ItemManager itemManager; + private CatalogManager catalogManager; + private HotelViewManager hotelViewManager; + private RoomManager roomManager; + private CommandHandler commandHandler; + private PermissionsManager permissionsManager; + private BotManager botManager; + private ModToolManager modToolManager; + private PetManager petManager; + private AchievementManager achievementManager; + private GuideManager guideManager; + private WordFilter wordFilter; + private CraftingManager craftingManager; + private PollManager pollManager; + + public CreditsScheduler creditsScheduler; + public PixelScheduler pixelScheduler; + public PointsScheduler pointsScheduler; + + public void load() + { + Emulator.getLogging().logStart("GameEnvironment -> Loading..."); + + this.permissionsManager = new PermissionsManager(); + this.habboManager = new HabboManager(); + this.hotelViewManager = new HotelViewManager(); + this.itemManager = new ItemManager(); + this.itemManager.load(); + this.botManager = new BotManager(); + this.petManager = new PetManager(); + this.guildManager = new GuildManager(); + this.guildForumManager = new GuildForumManager(); + this.catalogManager = new CatalogManager(); + this.roomManager = new RoomManager(); + this.navigatorManager = new NavigatorManager(); + this.commandHandler = new CommandHandler(); + this.modToolManager = new ModToolManager(); + this.achievementManager = new AchievementManager(); + this.achievementManager.reload(); + this.guideManager = new GuideManager(); + this.wordFilter = new WordFilter(); + this.craftingManager = new CraftingManager(); + this.pollManager = new PollManager(); + + this.roomManager.loadPublicRooms(); + + this.creditsScheduler = new CreditsScheduler(); + Emulator.getThreading().run(this.creditsScheduler); + this.pixelScheduler = new PixelScheduler(); + Emulator.getThreading().run(this.pixelScheduler); + this.pointsScheduler = new PointsScheduler(); + Emulator.getThreading().run(this.pointsScheduler); + + Emulator.getLogging().logStart("GameEnvironment -> Loaded!"); + } + + public void dispose() + { + this.pointsScheduler.setDisposed(true); + this.pixelScheduler.setDisposed(true); + this.creditsScheduler.setDisposed(true); + this.craftingManager.dispose(); + this.habboManager.dispose(); + this.commandHandler.dispose(); + this.guildManager.dispose(); + this.catalogManager.dispose(); + this.roomManager.dispose(); + this.itemManager.dispose(); + this.hotelViewManager.dispose(); + Emulator.getLogging().logShutdownLine("GameEnvironment -> Disposed!"); + } + + public HabboManager getHabboManager() + { + return this.habboManager; + } + + public NavigatorManager getNavigatorManager() + { + return this.navigatorManager; + } + + public GuildManager getGuildManager() + { + return this.guildManager; + } + + public GuildForumManager getGuildForumManager() + { + return this.guildForumManager; + } + + public ItemManager getItemManager() + { + return this.itemManager; + } + + public CatalogManager getCatalogManager() + { + return this.catalogManager; + } + + public HotelViewManager getHotelViewManager() + { + return this.hotelViewManager; + } + + public RoomManager getRoomManager() + { + return this.roomManager; + } + + public CommandHandler getCommandHandler() + { + return this.commandHandler; + } + + public PermissionsManager getPermissionsManager() + { + return this.permissionsManager; + } + + public BotManager getBotManager() + { + return this.botManager; + } + + public ModToolManager getModToolManager() + { + return this.modToolManager; + } + + public PetManager getPetManager() + { + return this.petManager; + } + + public AchievementManager getAchievementManager() + { + return this.achievementManager; + } + + public GuideManager getGuideManager() + { + return this.guideManager; + } + + public WordFilter getWordFilter() + { + return this.wordFilter; + } + + public CraftingManager getCraftingManager() + { + return this.craftingManager; + } + + public PollManager getPollManager() + { + return this.pollManager; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/achievements/Achievement.java b/src/main/java/com/eu/habbo/habbohotel/achievements/Achievement.java new file mode 100644 index 00000000..c0b8ef38 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/achievements/Achievement.java @@ -0,0 +1,108 @@ +package com.eu.habbo.habbohotel.achievements; + +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Achievement +{ + /** + * Id of the Achievement. + */ + public final int id; + + /** + * Name of the Achievement; + */ + public final String name; + + /** + * Category of the achievement. + */ + public final AchievementCategories category; + + /** + * The levels this achievement has. + */ + public final THashMap levels; + + /** + * Creates an new achievement. + * @param set The ResultSet it should fetch the data from. + * @throws SQLException + */ + public Achievement(ResultSet set) throws SQLException + { + levels = new THashMap(); + + id = set.getInt("id"); + this.name = set.getString("name"); + this.category = AchievementCategories.valueOf(set.getString("category").toUpperCase()); + + this.addLevel(new AchievementLevel(set)); + } + + /** + * Adds an new AchievementLevel to the Achievement. + * @param level The AchievementLevel to be added. + */ + public void addLevel(AchievementLevel level) + { + synchronized (this.levels) + { + this.levels.put(level.level, level); + } + } + + /** + * Calculates the AchievementLevel for the given progress. + * @param progress The amount of progress. + * @return The AchievementLevel that matches the amount of progress. + */ + public AchievementLevel getLevelForProgress(int progress) + { + AchievementLevel l = null; + + for(AchievementLevel level : this.levels.values()) + { + if (l == null && level.level == 1) + { + l = level; + } + + if (progress >= level.progress) + { + if (l != null) + { + if (l.level > level.level) + { + continue; + } + } + + l = level; + } + } + + return l; + } + + /** + * Calculates the next level compared to the current level. + * @param currentLevel The current level to calculate the next level for. + * @return The next level. Return null if there is no next level. + */ + public AchievementLevel getNextLevel(int currentLevel) + { + AchievementLevel l = null; + + for(AchievementLevel level : this.levels.values()) + { + if(level.level == (currentLevel + 1)) + return level; + } + + return null; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementCategories.java b/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementCategories.java new file mode 100644 index 00000000..04f8a2e0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementCategories.java @@ -0,0 +1,64 @@ +package com.eu.habbo.habbohotel.achievements; + +public enum AchievementCategories +{ + /** + * Achievements like looks that kill, email registered etc. + */ + IDENTITY, + + /** + * Achievements like room raider. + */ + EXPLORE, + + /** + * Related to playing music, created music and so on. + */ + MUSIC, + + /** + * Achievements like giving respect, hanging out in other peoples room etc. + */ + SOCIAL, + + /** + * Games! Banzai! Freeze! + */ + GAMES, + + /** + * Stacking, builder, everthing related to furntiure. + */ + ROOM_BUILDER, + + /** + * Cat scratch fever. + */ + PETS, + + /** + * Could be used for achievements related to floorplan editor. Not sure. + */ + TOOLS, + + /** + * Whatever floats your boat goes in here. + */ + OTHER, + + /** + * Please referain from using. + */ + TEST, + + /** + * Achievements that you don't want to showup in the achievements window. + */ + INVISIBLE, + + /** + * Events, anything you want to add. + */ + EVENTS +} diff --git a/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementLevel.java b/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementLevel.java new file mode 100644 index 00000000..640ef906 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementLevel.java @@ -0,0 +1,41 @@ +package com.eu.habbo.habbohotel.achievements; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class AchievementLevel +{ + /** + * level of the achievement. + */ + public final int level; + + /** + * Amount of currency to give upon achieving this level. + */ + public final int rewardAmount; + + /** + * Currency type to give upon achieving this level. + */ + public final int rewardType; + + /** + * Amount of achievement points to add upon achieving this level. + */ + public final int points; + + /** + * Amount of progress needed to achieve this level. + */ + public final int progress; + + public AchievementLevel(ResultSet set) throws SQLException + { + this.level = set.getInt("level"); + this.rewardAmount = set.getInt("reward_amount"); + this.rewardType = set.getInt("reward_type"); + this.points = set.getInt("points"); + this.progress = set.getInt("progress_needed"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java b/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java new file mode 100644 index 00000000..70238134 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/achievements/AchievementManager.java @@ -0,0 +1,478 @@ +package com.eu.habbo.habbohotel.achievements; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.achievements.AchievementProgressComposer; +import com.eu.habbo.messages.outgoing.achievements.AchievementUnlockedComposer; +import com.eu.habbo.messages.outgoing.achievements.talenttrack.TalentLevelUpdateComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; +import com.eu.habbo.messages.outgoing.users.UserBadgesComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.users.achievements.UserAchievementLeveledEvent; +import com.eu.habbo.plugin.events.users.achievements.UserAchievementProgressEvent; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectIntProcedure; + +import java.sql.*; +import java.util.LinkedHashMap; +import java.util.Map; + +public class AchievementManager +{ + /** + * All the achievements in the hotel are stored in this map where: + * String = name of the achievement (Without ACH_ & Roman number. + * Achievement = Instance of the Achievement class. + */ + private final THashMap achievements; + + private final THashMap> talentTrackLevels; + + /** + * The AchievementManager, shit happens here. + */ + public AchievementManager() + { + this.achievements = new THashMap<>(); + this.talentTrackLevels = new THashMap<>(); + } + + /** + * Reloads the achievement manager. + */ + public void reload() + { + long millis = System.currentTimeMillis(); + synchronized (this.achievements) + { + this.achievements.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM achievements")) + { + while (set.next()) + { + if (!this.achievements.containsKey(set.getString("name"))) + { + this.achievements.put(set.getString("name"), new Achievement(set)); + } + else + { + this.achievements.get(set.getString("name")).addLevel(new AchievementLevel(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + + synchronized (this.talentTrackLevels) + { + this.talentTrackLevels.clear(); + + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM achievements_talents ORDER BY level ASC")) + { + while (set.next()) + { + TalentTrackLevel level = new TalentTrackLevel(set); + + if (!this.talentTrackLevels.containsKey(level.type)) + { + this.talentTrackLevels.put(level.type, new LinkedHashMap()); + } + + this.talentTrackLevels.get(level.type).put(level.level, level); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + Emulator.getLogging().logErrorLine("Achievement Manager -> Failed to load!"); + return; + } + } + + Emulator.getLogging().logStart("Achievement Manager -> Loaded! ("+(System.currentTimeMillis() - millis)+" MS)"); + } + + /** + * Find an achievement by name. + * @param name The achievement to find. + * @return The achievement + */ + public Achievement getAchievement(String name) + { + return this.achievements.get(name); + } + + /** + * Find an achievement by id + * @param id The achievement id to find. + * @return The achievement + */ + public Achievement getAchievement(int id) + { + synchronized (this.achievements) + { + for (Map.Entry set : this.achievements.entrySet()) + { + if (set.getValue().id == id) + { + return set.getValue(); + } + } + } + + return null; + } + + public THashMap getAchievements() + { + return this.achievements; + } + + public static void progressAchievement(int habboId, Achievement achievement) + { + progressAchievement(habboId, achievement, 1); + } + + public static void progressAchievement(int habboId, Achievement achievement, int amount) + { + if (achievement != null) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(habboId); + + if (habbo != null) + { + progressAchievement(habbo, achievement, amount); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("" + + "INSERT INTO users_achievements_queue (user_id, achievement_id, amount) VALUES (?, ?, ?) " + + "ON DUPLICATE KEY UPDATE amount = amount + ?")) + { + statement.setInt(1, habboId); + statement.setInt(2, achievement.id); + statement.setInt(3, amount); + statement.setInt(4, amount); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + + + /** + * Progresses an Habbo's achievement by 1. + * @param habbo The Habbo whose achievement should be progressed. + * @param achievement The Achievement to be progressed. + */ + public static void progressAchievement(Habbo habbo, Achievement achievement) + { + progressAchievement(habbo, achievement, 1); + } + + /** + * Progresses an Habbo's achievement by an given amount. + * @param habbo The Habbo whose achievement should be progressed. + * @param achievement The Achievement to be progressed. + * @param amount The amount that should be progressed. + */ + public static void progressAchievement(Habbo habbo, Achievement achievement, int amount) + { + if (achievement == null) + return; + + if (habbo == null) + return; + + if (!habbo.isOnline()) + return; + + int currentProgress = habbo.getHabboStats().getAchievementProgress(achievement); + + if(currentProgress == -1) + { + currentProgress = 0; + createUserEntry(habbo, achievement); + habbo.getHabboStats().setProgress(achievement, 0); + } + + if(Emulator.getPluginManager().isRegistered(UserAchievementProgressEvent.class, true)) + { + Event userAchievementProgressedEvent = new UserAchievementProgressEvent(habbo, achievement, amount); + Emulator.getPluginManager().fireEvent(userAchievementProgressedEvent); + + if(userAchievementProgressedEvent.isCancelled()) + return; + } + + AchievementLevel oldLevel = achievement.getLevelForProgress(currentProgress); + + if(oldLevel == null) + return; + + if(oldLevel.level == achievement.levels.size() && currentProgress == oldLevel.progress) //Maximum achievement gotten. + return; + + habbo.getHabboStats().setProgress(achievement, currentProgress + amount); + + AchievementLevel newLevel = achievement.getLevelForProgress(currentProgress + amount); + + if(oldLevel.level == newLevel.level && newLevel.level < achievement.levels.size()) + { + habbo.getClient().sendResponse(new AchievementProgressComposer(habbo, achievement)); + } + else + { + if(Emulator.getPluginManager().isRegistered(UserAchievementLeveledEvent.class, true)) + { + Event userAchievementLeveledEvent = new UserAchievementLeveledEvent(habbo, achievement, oldLevel, newLevel); + Emulator.getPluginManager().fireEvent(userAchievementLeveledEvent); + + if(userAchievementLeveledEvent.isCancelled()) + return; + } + + habbo.getClient().sendResponse(new AchievementProgressComposer(habbo, achievement)); + habbo.getClient().sendResponse(new AchievementUnlockedComposer(habbo, achievement)); + + //Exception could possibly arise when the user disconnects while being in tour. + //The achievement is then progressed but the user is already disposed so fetching + //the badge would result in an nullpointer exception. This is normal behaviour. + HabboBadge badge = null; + try + { + badge = habbo.getInventory().getBadgesComponent().getBadge(("ACH_" + achievement.name + oldLevel.level).toLowerCase()); + } + catch (Exception e) + { + return; + } + + if (badge != null) + { + badge.setCode("ACH_" + achievement.name + newLevel.level); + badge.needsInsert(false); + badge.needsUpdate(true); + } else + { + badge = new HabboBadge(0, "ACH_" + achievement.name + newLevel.level, 0, habbo); + habbo.getClient().sendResponse(new AddUserBadgeComposer(badge)); + badge.needsInsert(true); + badge.needsUpdate(true); + habbo.getInventory().getBadgesComponent().addBadge(badge); + } + + Emulator.getThreading().run(badge); + + if(badge.getSlot() > 0) + { + if(habbo.getHabboInfo().getCurrentRoom() != null) + { + habbo.getHabboInfo().getCurrentRoom().sendComposer(new UserBadgesComposer(habbo.getInventory().getBadgesComponent().getWearingBadges(), habbo.getHabboInfo().getId()).compose()); + } + } + + habbo.getHabboStats().addAchievementScore(newLevel.points); + + if (habbo.getHabboInfo().getCurrentRoom() != null) + { + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(habbo).compose()); + } + + for (TalentTrackType type : TalentTrackType.values()) + { + if (Emulator.getGameEnvironment().getAchievementManager().talentTrackLevels.containsKey(type)) + { + for (Map.Entry entry : Emulator.getGameEnvironment().getAchievementManager().talentTrackLevels.get(type).entrySet()) + { + if (entry.getValue().achievements.containsKey(achievement)) + { + Emulator.getGameEnvironment().getAchievementManager().handleTalentTrackAchievement(habbo, type, achievement); + } + } + } + } + } + } + + /** + * Checks wether the given Habbo has achieved a certain Achievement. + * @param habbo The Habbo to check. + * @param achievement The Achievement to check. + * @return True when the given Habbo has achieved the Achievement. + */ + public static boolean hasAchieved(Habbo habbo, Achievement achievement) + { + int currentProgress = habbo.getHabboStats().getAchievementProgress(achievement); + + if(currentProgress == -1) + { + return false; + } + + AchievementLevel level = achievement.getLevelForProgress(currentProgress); + + if(level == null) + return false; + + AchievementLevel nextLevel = achievement.levels.get(level.level + 1); + + if (nextLevel == null && currentProgress >= level.progress) + { + return true; + } + + return false; + } + + /** + * Creates an new Achievement entry in the database. + * @param habbo The Habbo the achievement should be saved for. + * @param achievement The Achievement that should be inserted. + */ + public static void createUserEntry(Habbo habbo, Achievement achievement) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_achievements (user_id, achievement_name, progress) VALUES (?, ?, ?)")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setString(2, achievement.name); + statement.setInt(3, 1); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Saves all the Achievements for the given Habbo to the database. + * @param habbo The Habbo whose Achievements should be saved. + */ + public static void saveAchievements(Habbo habbo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_achievements SET progress = ? WHERE achievement_name = ? AND user_id = ? LIMIT 1")) + { + statement.setInt(3, habbo.getHabboInfo().getId()); + for(Map.Entry map : habbo.getHabboStats().getAchievementProgress().entrySet()) + { + statement.setInt(1, map.getValue()); + statement.setString(2, map.getKey().name); + statement.addBatch(); + } + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public LinkedHashMap getTalenTrackLevels(TalentTrackType type) + { + return this.talentTrackLevels.get(type); + } + + public TalentTrackLevel calculateTalenTrackLevel(Habbo habbo, TalentTrackType type) + { + TalentTrackLevel level = null; + + for (Map.Entry entry : this.talentTrackLevels.get(type).entrySet()) + { + final boolean[] allCompleted = {true}; + entry.getValue().achievements.forEachEntry(new TObjectIntProcedure() + { + @Override + public boolean execute(Achievement a, int b) + { + if (habbo.getHabboStats().getAchievementProgress(a) < b) + { + allCompleted[0] = false; + } + + return allCompleted[0]; + } + }); + + if (allCompleted[0]) + { + if (level == null || level.level < entry.getValue().level) + { + level = entry.getValue(); + } + } + else + { + break; + } + } + + return level; + } + + public void handleTalentTrackAchievement(Habbo habbo, TalentTrackType type, Achievement achievement) + { + TalentTrackLevel currentLevel = this.calculateTalenTrackLevel(habbo, type); + + if (currentLevel.level > habbo.getHabboStats().talentTrackLevel(type)) + { + for (int i = habbo.getHabboStats().talentTrackLevel(type); i <= currentLevel.level; i++) + { + TalentTrackLevel level = this.getTalentTrackLevel(type, i); + + if (level != null) + { + for (Item item : level.items) + { + HabboItem rewardItem = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getHabboInfo().getId(), item, 0, 0, ""); + habbo.getInventory().getItemsComponent().addItem(rewardItem); + habbo.getClient().sendResponse(new AddHabboItemComposer(rewardItem)); + } + + for (String badge : level.badges) + { + if (!badge.isEmpty()) + { + HabboBadge b = new HabboBadge(0, badge, 0, habbo); + Emulator.getThreading().run(b); + habbo.getInventory().getBadgesComponent().addBadge(b); + habbo.getClient().sendResponse(new AddUserBadgeComposer(b)); + } + } + + habbo.getClient().sendResponse(new TalentLevelUpdateComposer(type, level)); + } + } + } + + + habbo.getHabboStats().setTalentLevel(type, currentLevel.level); + } + + public TalentTrackLevel getTalentTrackLevel(TalentTrackType type, int level) + { + return this.talentTrackLevels.get(type).get(level); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackLevel.java b/src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackLevel.java new file mode 100644 index 00000000..08d822fc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackLevel.java @@ -0,0 +1,92 @@ +package com.eu.habbo.habbohotel.achievements; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import gnu.trove.map.TIntIntMap; +import gnu.trove.map.TObjectIntMap; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TalentTrackLevel +{ + /** + * Type of this talen track level. + */ + public TalentTrackType type; + + /** + * The level of this TalenTrackLevel. + */ + public int level; + + /** + * Achievements required to achieve this level. + */ + public TObjectIntMap achievements; + + /** + * Items that will be rewarded upon achieving this level. + */ + public THashSet items; + + /** + * Perks unlocked upon achieving this level. + */ + public String[] perks; + + /** + * Badges received upon achieving this level. + */ + public String[] badges; + + public TalentTrackLevel(ResultSet set) throws SQLException + { + this.type = TalentTrackType.valueOf(set.getString("type").toUpperCase()); + this.level = set.getInt("level"); + this.achievements = new TObjectIntHashMap(); + this.items = new THashSet(); + + String[] achievements = set.getString("achievement_ids").split(","); + String[] achievementLevels = set.getString("achievement_levels").split(","); + if (achievementLevels.length == achievements.length) + { + for (int i = 0; i < achievements.length; i++) + { + if (achievements[i].isEmpty() || achievementLevels[i].isEmpty()) + continue; + + Achievement achievement = Emulator.getGameEnvironment().getAchievementManager().getAchievement(Integer.valueOf(achievements[i])); + + if (achievement != null) + { + this.achievements.put(achievement, Integer.valueOf(achievementLevels[i])); + } + else + { + Emulator.getLogging().logErrorLine("Could not find achievement with ID " + achievements[i] + " for talenttrack level " + this.level + " of type " + this.type); + } + } + } + + for (String s : set.getString("reward_furni").split(",")) + { + Item item = Emulator.getGameEnvironment().getItemManager().getItem(Integer.valueOf(s)); + + if (item != null) + { + items.add(item); + } + else + { + Emulator.getLogging().logStart("Incorrect reward furni (ID: " + s + ") for talent track level " + this.level); + } + } + + this.perks = set.getString("reward_perks").split(","); + this.badges = set.getString("reward_badges").split(","); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackType.java b/src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackType.java new file mode 100644 index 00000000..99d25585 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/achievements/TalentTrackType.java @@ -0,0 +1,14 @@ +package com.eu.habbo.habbohotel.achievements; + +public enum TalentTrackType +{ + /** + * Talent track for citizenship. + */ + CITIZENSHIP, + + /** + * Talent track for helpers and guardians. + */ + HELPER +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java b/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java new file mode 100644 index 00000000..c1771d2b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java @@ -0,0 +1,713 @@ +package com.eu.habbo.habbohotel.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.outgoing.rooms.users.*; +import com.eu.habbo.plugin.events.bots.BotChatEvent; +import com.eu.habbo.plugin.events.bots.BotShoutEvent; +import com.eu.habbo.plugin.events.bots.BotTalkEvent; +import com.eu.habbo.plugin.events.bots.BotWhisperEvent; +import com.eu.habbo.threading.runnables.BotFollowHabbo; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; + +public class Bot implements Runnable +{ + /** + * Bot id. + */ + private int id; + + /** + * Bot name. + */ + private String name; + + /** + * Bot motto. + */ + private String motto; + + /** + * Bot look. + */ + private String figure; + + /** + * Bot gender. + */ + private HabboGender gender; + + /** + * Bot owner id. + */ + private int ownerId; + + /** + * Bot owner name. + */ + private String ownerName; + + /** + * Current room the bot is in. + */ + private Room room; + + /** + * Current roomUnit that is linked to this bot. + */ + private RoomUnit roomUnit; + + /** + * Should auto talk. + */ + private boolean chatAuto; + + /** + * Should talk random. + */ + private boolean chatRandom; + + /** + * Delay between each sentence. + */ + private short chatDelay; + + /** + * Next timestamp the bot can talk. + */ + private int chatTimeOut; + + /** + * All chatlines the bot has. + */ + private final ArrayList chatLines; + + /** + * Last chatline the bot spoke. + */ + private short lastChatIndex; + + /** + * Type of this bot. Used to define custom behaviour. + * See API docs on how to use this. + */ + private String type; + + /** + * Enable effect id. + */ + private int effect; + + /** + * Wether the bot has to be saved to the database. + */ + private boolean needsUpdate; + + /** + * Which roomunit is this bot following. + */ + private int followingHabboId; + + public Bot(int id, String name, String motto, String figure, HabboGender gender, int ownerId, String ownerName) + { + this.id = id; + this.name = name; + this.motto = motto; + this.figure = figure; + this.gender = gender; + this.ownerId = ownerId; + this.ownerName = ownerName; + this.chatAuto = false; + this.chatRandom = false; + this.chatDelay = 1000; + this.chatLines = new ArrayList(); + this.type = "generic_bot"; + this.room = null; + } + + public Bot(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + this.motto = set.getString("motto"); + this.figure = set.getString("figure"); + this.gender = HabboGender.valueOf(set.getString("gender")); + this.ownerId = set.getInt("user_id"); + this.ownerName = set.getString("owner_name"); + this.chatAuto = set.getString("chat_auto").equals("1"); + this.chatRandom = set.getString("chat_random").equals("1"); + this.chatDelay = set.getShort("chat_delay"); + this.chatLines = new ArrayList(Arrays.asList(set.getString("chat_lines").split("\r"))); + this.type = set.getString("type"); + this.effect = set.getInt("effect"); + this.room = null; + this.roomUnit = null; + this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; + this.needsUpdate = false; + this.lastChatIndex = 0; + } + + public Bot(Bot bot) + { + this.name = bot.getName(); + this.motto = bot.getMotto(); + this.figure = bot.getFigure(); + this.gender = bot.getGender(); + this.ownerId = bot.getOwnerId(); + this.ownerName = bot.getOwnerName(); + this.chatAuto = true; + this.chatRandom = false; + this.chatDelay = 10; + this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; + this.chatLines = new ArrayList(Arrays.asList(new String[] {"Default Message :D"})); + this.type = bot.getType(); + this.effect = bot.getEffect(); + this.room = null; + this.roomUnit = null; + this.lastChatIndex = 0; + + this.needsUpdate = false; + } + + /** + * Sets wheter the bot has to be updated in the database. + * @param needsUpdate Should the bot be updated in the database. + */ + public void needsUpdate(boolean needsUpdate) + { + this.needsUpdate = needsUpdate; + } + + /** + * @return Wether the bot has to be updated in the database. + */ + public boolean needsUpdate() + { + return this.needsUpdate; + } + + @Override + public void run() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE bots SET name = ?, motto = ?, figure = ?, gender = ?, user_id = ?, room_id = ?, x = ?, y = ?, z = ?, rot = ?, dance = ?, freeroam = ?, chat_lines = ?, chat_auto = ?, chat_random = ?, chat_delay = ? WHERE id = ?")) + { + statement.setString(1, this.name); + statement.setString(2, this.motto); + statement.setString(3, this.figure); + statement.setString(4, this.gender.toString()); + statement.setInt(5, this.ownerId); + statement.setInt(6, this.room == null ? 0 : this.room.getId()); + statement.setInt(7, this.roomUnit == null ? 0 : this.roomUnit.getX()); + statement.setInt(8, this.roomUnit == null ? 0 : this.roomUnit.getY()); + statement.setDouble(9, this.roomUnit == null ? 0 : this.roomUnit.getZ()); + statement.setInt(10, this.roomUnit == null ? 0 : this.roomUnit.getBodyRotation().getValue()); + statement.setInt(11, this.roomUnit == null ? 0 : this.roomUnit.getDanceType().getType()); + statement.setString(12, this.roomUnit == null ? "0" : this.roomUnit.canWalk() ? "1" : "0"); + String text = ""; + for(String s : this.chatLines) + { + text += s + "\r"; + } + statement.setString(13, text); + statement.setString(14, this.chatAuto ? "1" : "0"); + statement.setString(15, this.chatRandom ? "1" : "0"); + statement.setInt(16, this.chatDelay); + statement.setInt(17, this.id); + statement.execute(); + this.needsUpdate = false; + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + /** + * Cycles through the bot checking if the bot should perform a certain action: + * + * -> Look for a new tile to walk to. + * -> Speak + * + * Override to implement custom behaviour. Make sure to call super.cycle() first. + */ + public void cycle(boolean canWalk) + { + if(this.roomUnit != null) + { + if(canWalk && this.getRoomUnit().canWalk()) + { + if (!this.roomUnit.isWalking()) + { + if (this.roomUnit.getWalkTimeOut() < Emulator.getIntUnixTimestamp() && this.followingHabboId == 0) + { + this.roomUnit.setGoalLocation(this.room.getRandomWalkableTile()); + int timeOut = Emulator.getRandom().nextInt(20) * 2; + this.roomUnit.setWalkTimeOut((timeOut < 10 ? 5 : timeOut) + Emulator.getIntUnixTimestamp()); + } + } else + { + for (RoomTile t : this.room.getLayout().getTilesAround(this.room.getLayout().getTile(this.getRoomUnit().getX(), this.getRoomUnit().getY()))) + { + WiredHandler.handle(WiredTriggerType.BOT_REACHED_STF, this.roomUnit, this.room, room.getItemsAt(t).toArray()); + } + } + } + + if(!this.chatLines.isEmpty() && this.chatTimeOut <= Emulator.getIntUnixTimestamp() && this.chatAuto) + { + if(this.room != null) + { + this.lastChatIndex = (this.chatRandom ? (short)Emulator.getRandom().nextInt(this.chatLines.size()) : (this.lastChatIndex == (this.chatLines.size() - 1) ? 0 : this.lastChatIndex++)); + this.talk(this.chatLines.get(this.lastChatIndex) + .replace("%owner%", this.room.getOwnerName()) + .replace("%item_count%", this.room.itemCount() + "") + .replace("%name%", this.name) + .replace("%roomname%", this.room.getName()) + .replace("%user_count%", this.room.getUserCount() + "")); + this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; + } + } + } + } + + /** + * Have the bot say something in the room it currently is in. + * @param message The message the bot has to say. + */ + public void talk(String message) + { + if(this.room != null) + { + BotChatEvent event = new BotTalkEvent(this, message); + if(Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + this.room.botChat(new RoomUserTalkComposer(new RoomChatMessage(event.message, this.roomUnit, RoomChatMessageBubbles.BOT)).compose()); + } + } + + /** + * Have the bot shout something in the room it currently is in. + * @param message The message the bot has to shout. + */ + public void shout(String message) + { + if(this.room != null) + { + BotChatEvent event = new BotShoutEvent(this, message); + if(Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + this.room.botChat(new RoomUserShoutComposer(new RoomChatMessage(event.message, this.roomUnit, RoomChatMessageBubbles.BOT)).compose()); + } + } + + /** + * Have the bot whisper something to a habbo. + * @param message The message the bot has to whisper. + * @param habbo The Habbo it should whisper to. + */ + public void whisper(String message, Habbo habbo) + { + if(this.room != null && habbo != null) + { + BotWhisperEvent event = new BotWhisperEvent(this, message, habbo); + if(Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + event.target.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(event.message, this.roomUnit, RoomChatMessageBubbles.BOT))); + } + } + + /** + * This event is triggered whenever a Habbo places a bot. + * @param habbo The Habbo who placed this bot. + * @param room The room this bot was placed in. + */ + public void onPlace(Habbo habbo, Room room) + { + + } + + /** + * This event is triggered whenever a Habbo picks a bot. + * @param habbo The Habbo who picked up this bot. + * @param room The Room this bot was placed in. + */ + public void onPickUp(Habbo habbo, Room room) + { + + } + + /** + * This event is triggered whenever a Habbo talks or shouts in a room. + * @param message The message that has been said. + */ + public void onUserSay(final RoomChatMessage message) + { + + } + + /** + * @return The id of the bot. + */ + public int getId() + { + return this.id; + } + + /** + * Sets the id of the bot. + * @param id The new id of the bot. + */ + public void setId(int id) + { + this.id = id; + } + + /** + * @return The name of the bot + */ + public String getName() + { + return this.name; + } + + /** + * Sets the name of the bot. + * @param name The new name of the bot. + */ + public void setName(String name) + { + this.name = name; + this.needsUpdate = true; + + //if(this.room != null) + //this.room.sendComposer(new ChangeNameUpdatedComposer(this.getRoomUnit(), this.getName()).compose()); + } + + /** + * @return The motto of the bot. + */ + public String getMotto() + { + return this.motto; + } + + /** + * Sets a new motto for the bot. + * @param motto The new motto for the bot. + */ + public void setMotto(String motto) + { + this.motto = motto; + this.needsUpdate = true; + } + + /** + * @return The figure of the bot. + */ + public String getFigure() + { + return this.figure; + } + + /** + * Sets a new figure of the bot and updates it in the room. + * @param figure The new figure of the bot. + */ + public void setFigure(String figure) + { + this.figure = figure; + this.needsUpdate = true; + + if(this.room != null) + this.room.sendComposer(new RoomUsersComposer(this).compose()); + } + + /** + * @return The gender of the bot. + */ + public HabboGender getGender() + { + return this.gender; + } + + /** + * Sets a new Gender of the bot and updates it in the room. + * @param gender The new gender of the bot. + */ + public void setGender(HabboGender gender) + { + this.gender = gender; + this.needsUpdate = true; + + if(this.room != null) + this.room.sendComposer(new RoomUsersComposer(this).compose()); + } + + /** + * @return The owner id of the bot. + */ + public int getOwnerId() + { + return this.ownerId; + } + + /** + * @param ownerId The new owner id of the bot. + */ + public void setOwnerId(int ownerId) + { + this.ownerId = ownerId; + this.needsUpdate = true; + + if(this.room != null) + this.room.sendComposer(new RoomUsersComposer(this).compose()); + } + + /** + * @return The owner name of the bot. + */ + public String getOwnerName() + { + return this.ownerName; + } + + /** + * @param ownerName The new owner name of the bot. + */ + public void setOwnerName(String ownerName) + { + this.ownerName = ownerName; + this.needsUpdate = true; + + if(this.room != null) + this.room.sendComposer(new RoomUsersComposer(this).compose()); + } + + /** + * @return The room this bot is in. Returns NULL when in inventory. + */ + public Room getRoom() + { + return this.room; + } + + /** + * @param room The room this bot is in. + */ + public void setRoom(Room room) + { + this.room = room; + } + + /** + * @return The RoomUnit of the bot. + */ + public RoomUnit getRoomUnit() + { + return this.roomUnit; + } + + /** + * @param roomUnit The RoomUnit of the bot. + */ + public void setRoomUnit(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + /** + * @return Wether the bot has auto chat enabled. + */ + public boolean isChatAuto() + { + return this.chatAuto; + } + + /** + * @param chatAuto Sets wheter the bot has auto chat enabled. + */ + public void setChatAuto(boolean chatAuto) + { + this.chatAuto = chatAuto; + this.needsUpdate = true; + } + + /** + * @return Wheter the chatter is randomly selected. + */ + public boolean isChatRandom() + { + return this.chatRandom; + } + + /** + * @param chatRandom Sets wheter the chatter is randomly selected. + */ + public void setChatRandom(boolean chatRandom) + { + this.chatRandom = chatRandom; + this.needsUpdate = true; + } + + /** + * @return The minimum interval between two messages spoken by the bot. + */ + public int getChatDelay() + { + return this.chatDelay; + } + + /** + * @param chatDelay Sets the minimum interval between two messages spoken by the bot. + */ + public void setChatDelay(short chatDelay) + { + this.chatDelay = chatDelay; + this.needsUpdate = true; + } + + /** + * Removes all chatlines from the bot. + */ + public void clearChat() + { + synchronized (this.chatLines) + { + this.chatLines.clear(); + this.needsUpdate = true; + } + } + + /** + * @return The bot type. + */ + public String getType() + { + return this.type; + } + + /** + * @return The current enable effect. + */ + public int getEffect() + { + return this.effect; + } + + /** + * Sets the effect for a bot and also updates it to the room. + * @param effect The effect to give to the bot. + */ + public void setEffect(int effect) + { + this.effect = effect; + this.needsUpdate = true; + + if (this.roomUnit != null) + { + this.roomUnit.setEffectId(this.effect); + + if (this.room != null) + { + this.room.sendComposer(new RoomUserEffectComposer(this.roomUnit).compose()); + } + } + } + + /** + * Adds new chatlines to the bot. Does not erase existing chatlines. + * @param chatLines The chatlines to add. + */ + public void addChatLines(ArrayList chatLines) + { + synchronized (this.chatLines) + { + this.chatLines.addAll(chatLines); + this.needsUpdate = true; + } + } + + /** + * Adds a new chatline to the bot. Does not erase existing chatlines. + * @param chatLine The chatline to add. + */ + public void addChatLine(String chatLine) + { + synchronized (this.chatLines) + { + this.chatLines.add(chatLine); + this.needsUpdate = true; + } + } + + /** + * @return The chatlines this bot can speak. + */ + public ArrayList getChatLines() + { + return this.chatLines; + } + + /** + * @return The HabboInfo.id of the Habbo it is following. + */ + public int getFollowingHabboId() + { + return this.followingHabboId; + } + + /** + * Starts following a specific Habbo. Action may get interrupted when: + *
  • The bot is triggered with WiredEffectBotFollowHabbo.
  • + *
  • The bot is triggered with WiredEffectBotGiveHandItem.
  • + *
  • The bots in the room are frozen
  • + * + * @param habbo The Habbo to follow. + */ + public void startFollowingHabbo(Habbo habbo) + { + this.followingHabboId = habbo.getHabboInfo().getId(); + + Emulator.getThreading().run(new BotFollowHabbo(this, habbo, habbo.getHabboInfo().getCurrentRoom())); + } + + public void stopFollowingHabbo() + { + this.followingHabboId = 0; + } + + /** + * Used to load in custom data. + * Implement this method whenever you want data to be loaded from the database + * upon the loading of the BotManager. This is to guarantee database integrity. + * This method must be implemented. Failing to do so will result into a runtime error. + */ + public static void initialise() + { + + } + + /** + * Called upon Emulator shutdown. + */ + public static void dispose() + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java b/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java new file mode 100644 index 00000000..46077369 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java @@ -0,0 +1,320 @@ +package com.eu.habbo.habbohotel.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.BotErrorComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.inventory.AddBotComposer; +import com.eu.habbo.messages.outgoing.inventory.RemoveBotComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUsersComposer; +import com.eu.habbo.plugin.events.bots.BotPickUpEvent; +import com.eu.habbo.plugin.events.bots.BotPlacedEvent; +import gnu.trove.map.hash.THashMap; + +import java.lang.reflect.Method; +import java.sql.*; +import java.util.Map; + +public class BotManager +{ + //Configuration. Loaded from database & updated accordingly. + public static int MINIMUM_CHAT_SPEED = 7; + + final private static THashMap> botDefenitions = new THashMap>(); + + /** + * Loads up the BotManager. Do NOT initialise this class yourself. + * + * Extend from the Bot class and implement 'public static void initialise()' to load data as you see fit. + */ + public BotManager() + { + long millis = System.currentTimeMillis(); + + botDefenitions.put("generic", Bot.class); + botDefenitions.put("bartender", ButlerBot.class); + botDefenitions.put("visitor_log", VisitorBot.class); + + this.reload(); + + Emulator.getLogging().logStart("Bot Manager -> Loaded! ("+(System.currentTimeMillis() - millis)+" MS)"); + } + + /** + * Reloads the bot manager + * @return Returns true if the BotManager has been succesfully reloaded. + */ + public boolean reload() + { + for(Map.Entry> set : botDefenitions.entrySet()) + { + try + { + Method m = set.getValue().getMethod("initialise"); + m.setAccessible(true); + m.invoke(null); + } + catch (NoSuchMethodException e) + { + Emulator.getLogging().logStart("Bot Manager -> Failed to execute initialise method upon bot type '" + set.getKey() + "'. No Such Method!"); + return false; + } + catch (Exception e) + { + Emulator.getLogging().logStart("Bot Manager -> Failed to execute initialise method upon bot type '" + set.getKey() + "'. Error: " + e.getMessage()); + return false; + } + } + + return true; + } + + /** + * Creates a new Bot and inserts it into the database. + * @param data A key-value set of details of the bot (name, motto, figure, gender) + * @param type The type of the bot that must be initialised. + * @return The initialised bot. Returns NULL upon Exception; + */ + public Bot createBot(THashMap data, String type) + { + Bot bot = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO bots (user_id, room_id, name, motto, figure, gender, type) VALUES (0, 0, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setString(1, data.get("name")); + statement.setString(2, data.get("motto")); + statement.setString(3, data.get("figure")); + statement.setString(4, data.get("gender").toUpperCase()); + statement.setString(5, type); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + try (PreparedStatement stmt = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots LEFT JOIN users ON bots.user_id = users.id WHERE bots.id = ? LIMIT 1")) + { + stmt.setInt(1, set.getInt(1)); + try (ResultSet resultSet = stmt.executeQuery()) + { + if (resultSet.next()) + { + bot = this.loadBot(resultSet); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return bot; + } + + /** + * Places a bot at the given location in the given room. + * @param bot The Bot that is being placed. + * @param habbo The Habbo that owns the Bot. + * @param room The Room this Bot is being placed in. + * @param location The given location of the Bot. + */ + public void placeBot(Bot bot, Habbo habbo, Room room, RoomTile location) + { + BotPlacedEvent event = new BotPlacedEvent(bot, location, habbo); + Emulator.getPluginManager().fireEvent(event); + + if(event.isCancelled()) + return; + + if(room != null && bot != null && habbo != null) + { + if (room.getOwnerId() == habbo.getHabboInfo().getId() || habbo.hasPermission("acc_anyroomowner") || habbo.hasPermission("acc_placefurni")) + { + if (room.getCurrentBots().size() >= Room.MAXIMUM_BOTS && !habbo.hasPermission("acc_unlimited_bots")) + { + habbo.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_MAX_BOTS)); + return; + } + + if (!room.tileWalkable(location.x, location.y)) + return; + + RoomUnit roomUnit = new RoomUnit(); + roomUnit.setRotation(RoomUserRotation.SOUTH); + roomUnit.setLocation(location); + roomUnit.setZ(room.getStackHeight(location.x, location.y, false)); + roomUnit.setPathFinderRoom(room); + roomUnit.setRoomUnitType(RoomUnitType.BOT); + roomUnit.setCanWalk(room.isAllowBotsWalk()); + bot.setRoomUnit(roomUnit); + bot.setRoom(room); + bot.needsUpdate(true); + room.addBot(bot); + Emulator.getThreading().run(bot); + room.sendComposer(new RoomUsersComposer(bot).compose()); + habbo.getInventory().getBotsComponent().removeBot(bot); + habbo.getClient().sendResponse(new RemoveBotComposer(bot)); + bot.onPlace(habbo, room); + bot.cycle(false); + } + else + { + habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + } + } + } + + /** + * Removes a bot from the room. + * Note the owner is being set to the Habbo. + * @param botId The id of the Bot that is being picked up. + * @param habbo The Habbo who picks it. + */ + public void pickUpBot(int botId, Habbo habbo) + { + if(habbo.getHabboInfo().getCurrentRoom() != null) + { + this.pickUpBot(habbo.getHabboInfo().getCurrentRoom().getBot(Math.abs(botId)), habbo); + } + } + + /** + * Removes a bot from the room. + * Note the owner is being set to the Habbo. + * @param bot The Bot that is being picked up. + * @param habbo The Habbo who picks it. + */ + public void pickUpBot(Bot bot, Habbo habbo) + { + if(bot != null && habbo != null) + { + BotPickUpEvent pickedUpEvent = new BotPickUpEvent(bot, habbo); + Emulator.getPluginManager().fireEvent(pickedUpEvent); + + if(pickedUpEvent.isCancelled()) + return; + + if (bot.getOwnerId() == habbo.getHabboInfo().getId() || habbo.hasPermission("acc_anyroomowner")) + { + if (!habbo.hasPermission("acc_unlimited_bots") && habbo.getInventory().getBotsComponent().getBots().size() >= 15) + return; + + bot.onPickUp(habbo, habbo.getHabboInfo().getCurrentRoom()); + habbo.getHabboInfo().getCurrentRoom().removeBot(bot); + bot.stopFollowingHabbo(); + bot.setOwnerId(habbo.getHabboInfo().getId()); + bot.setOwnerName(habbo.getHabboInfo().getUsername()); + bot.needsUpdate(true); + Emulator.getThreading().run(bot); + + habbo.getInventory().getBotsComponent().addBot(bot); + habbo.getClient().sendResponse(new AddBotComposer(bot)); + } + } + } + + /** + * Loads a bot from the given ResultSet. + * @param set The set this bot must be initialised from. + * @return The initialised bot. Returns NULL upon SQLException being thrown. + */ + public Bot loadBot(ResultSet set) + { + try + { + String type = set.getString("type"); + Class botClazz = botDefenitions.get(type); + + if(botClazz != null) + return botClazz.getDeclaredConstructor(ResultSet.class).newInstance(set); + else + Emulator.getLogging().logErrorLine("Unknown Bot Type: " + type); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return null; + } + + /** + * Deletes a bot from the database. + * @param bot The bot to delete. + * @return true if the bot has been deleted. + */ + public boolean deleteBot(Bot bot) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM bots WHERE id = ? LIMIT 1")) + { + statement.setInt(1, bot.getId()); + return statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + /** + * Add a new bot type in order to implement custom behaviour. + * + * Make sure to extend the Bot class and make the constructor match Bot(ResultSet) + * @param type The name of the bot type. + * @param botClazz The class that needs to be initialised. + * @throws Exception If the bot type already exists. + * If the bot class has no constructor matchin Bot(ResultSet) + */ + public static void addBotDefinition(String type, Class botClazz) throws Exception + { + if(botClazz.getDeclaredConstructor(ResultSet.class) == null) + { + throw new Exception("Missing Bot(ResultSet) constructor!"); + } + else + { + botClazz.getDeclaredConstructor(ResultSet.class).setAccessible(true); + + botDefenitions.put(type, botClazz); + } + } + + /** + * Called upon Emulator shutdown. + * Implement 'public static void dispose()' to pass on this event + * to your custom bot class. + */ + public void dispose() + { + for(Map.Entry> set : botDefenitions.entrySet()) + { + try + { + Method m = set.getValue().getMethod("dispose"); + m.setAccessible(true); + m.invoke(null); + } + catch (NoSuchMethodException e) + { + Emulator.getLogging().logStart("Bot Manager -> Failed to execute dispose method upon bot type '" + set.getKey() + "'. No Such Method!"); + } + catch (Exception e) + { + Emulator.getLogging().logStart("Bot Manager -> Failed to execute dispose method upon bot type '" + set.getKey() + "'. Error: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java b/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java new file mode 100644 index 00000000..2856cb16 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java @@ -0,0 +1,118 @@ +package com.eu.habbo.habbohotel.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.plugin.events.bots.BotServerItemEvent; +import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem; +import com.eu.habbo.threading.runnables.RoomUnitWalkToRoomUnit; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ButlerBot extends Bot +{ + public static THashMap, Integer> serveItems = new THashMap, Integer>(); + + /** + * This class is a bot that will hand out handitems upon triggering with the correct keys. + * @param set + * @throws SQLException + */ + public ButlerBot(ResultSet set) throws SQLException + { + super(set); + } + + public ButlerBot(Bot bot) + { + super(bot); + } + + public static void initialise() + { + if(serveItems == null) + serveItems = new THashMap, Integer>(); + + serveItems.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM bot_serves")) + { + while (set.next()) + { + String[] keys = set.getString("keys").split(";"); + THashSet ks = new THashSet(); + for(String key : keys) + { + ks.add(key); + } + serveItems.put(ks, set.getInt("item")); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public static void dispose() + { + serveItems.clear(); + } + + @Override + public void onUserSay(final RoomChatMessage message) + { + if(this.getRoomUnit().isWalking()) + return; + + if (this.getRoomUnit().getCurrentLocation().distance(message.getHabbo().getRoomUnit().getCurrentLocation()) <= Emulator.getConfig().getInt("hotel.bot.butler.servedistance")) + if(message.getUnfilteredMessage() != null) + { + for(Map.Entry, Integer> set : serveItems.entrySet()) + { + for(String s : set.getKey()) + { + if(message.getUnfilteredMessage().toLowerCase().contains(s)) + { + BotServerItemEvent serveEvent = new BotServerItemEvent(this, message.getHabbo(), set.getValue()); + if (Emulator.getPluginManager().fireEvent(serveEvent).isCancelled()) + { + return; + } + + if (this.getRoomUnit().canWalk()) + { + final String key = s; + final Bot b = this; + + List tasks = new ArrayList(); + tasks.add(new RoomUnitGiveHanditem(serveEvent.habbo.getRoomUnit(), serveEvent.habbo.getHabboInfo().getCurrentRoom(), serveEvent.itemId)); + tasks.add(new RoomUnitGiveHanditem(this.getRoomUnit(), serveEvent.habbo.getHabboInfo().getCurrentRoom(), 0)); + + tasks.add(new Runnable() + { + @Override + public void run() + { + b.talk(Emulator.getTexts().getValue("bots.butler.given").replace("%key%", key).replace("%username%", serveEvent.habbo.getHabboInfo().getUsername())); + } + }); + Emulator.getThreading().run(new RoomUnitGiveHanditem(this.getRoomUnit(), serveEvent.habbo.getHabboInfo().getCurrentRoom(), serveEvent.itemId)); + Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(this.getRoomUnit(), serveEvent.habbo.getRoomUnit(), serveEvent.habbo.getHabboInfo().getCurrentRoom(), tasks, null)); + } + else + { + this.getRoom().giveHandItem(serveEvent.habbo, serveEvent.itemId); + this.talk(Emulator.getTexts().getValue("bots.butler.given").replace("%key%", s).replace("%username%", serveEvent.habbo.getHabboInfo().getUsername())); + } + return; + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java b/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java new file mode 100644 index 00000000..50b5ea89 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java @@ -0,0 +1,84 @@ +package com.eu.habbo.habbohotel.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolRoomVisit; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class VisitorBot extends Bot +{ + private static SimpleDateFormat formatDate; + private boolean showedLog = false; + private THashSet visits = new THashSet(); + + public VisitorBot(ResultSet set) throws SQLException + { + super(set); + } + + public VisitorBot(Bot bot) + { + super(bot); + } + + @Override + public void onUserSay(final RoomChatMessage message) + { + if(!this.showedLog) + { + if(message.getMessage().equalsIgnoreCase(Emulator.getTexts().getValue("generic.yes"))) + { + this.showedLog = true; + + String visitMessage = Emulator.getTexts().getValue("bots.visitor.list").replace("%count%", this.visits.size() + ""); + + String list = ""; + for(ModToolRoomVisit visit : this.visits) + { + list += "\r"; + list += visit.roomName + " "; + list += Emulator.getTexts().getValue("generic.time.at") + " "; + list += formatDate.format(new Date((visit.timestamp * 1000L))); + } + + visitMessage = visitMessage.replace("%list%", list); + + this.talk(visitMessage); + + this.visits.clear(); + } + } + } + + public void onUserEnter(Habbo habbo) + { + if(!this.showedLog) + { + if(habbo.getHabboInfo().getCurrentRoom() != null) + { + this.visits = Emulator.getGameEnvironment().getModToolManager().getVisitsForRoom(habbo.getHabboInfo().getCurrentRoom(), 10, true, habbo.getHabboInfo().getLastOnline(), Emulator.getIntUnixTimestamp()); + + if(this.visits.isEmpty()) + { + this.talk(Emulator.getTexts().getValue("bots.visitor.no_visits")); + } + else + { + this.talk(Emulator.getTexts().getValue("bots.visitor.visits").replace("%count%", this.visits.size() + "").replace("%positive%", Emulator.getTexts().getValue("generic.yes"))); + } + } + } + } + + public static void initialise() + { + formatDate = new SimpleDateFormat(Emulator.getConfig().getValue("bots.visitor.dateformat")); + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CalendarRewardObject.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CalendarRewardObject.java new file mode 100644 index 00000000..270ff4c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CalendarRewardObject.java @@ -0,0 +1,99 @@ +package com.eu.habbo.habbohotel.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CalendarRewardObject +{ + private final int id; + private final String name; + private final String customImage; + private final int credits; + private final int points; + private final int pointsType; + private final String badge; + private final int catalogItemId; + + public CalendarRewardObject(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + this.customImage = set.getString("custom_image"); + this.credits = set.getInt("credits"); + this.points = set.getInt("points"); + this.pointsType = set.getInt("points_type"); + this.badge = set.getString("badge"); + this.catalogItemId = set.getInt("catalog_item_id"); + } + + public void give(Habbo habbo) + { + if (this.credits > 0) + { + habbo.giveCredits(this.credits); + } + + if (this.points > 0) + { + habbo.givePoints(this.pointsType, this.points); + } + + if (!this.badge.isEmpty()) + { + habbo.addBadge(this.badge); + } + + if (this.catalogItemId > 0) + { + CatalogItem item = this.getCatalogItem(); + + if (item != null) + { + Emulator.getGameEnvironment().getCatalogManager().purchaseItem(null, item, habbo, 1, "", true); + } + } + } + + public int getId() + { + return this.id; + } + + public String getName() + { + return this.name; + } + + public String getCustomImage() + { + return this.customImage; + } + + public int getCredits() + { + return this.credits; + } + + public int getPoints() + { + return this.points; + } + + public int getPointsType() + { + return this.pointsType; + } + + public String getBadge() + { + return this.badge; + } + + public CatalogItem getCatalogItem() + { + return Emulator.getGameEnvironment().getCatalogManager().getCatalogItem(this.catalogItemId); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogFeaturedPage.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogFeaturedPage.java new file mode 100644 index 00000000..67b7843f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogFeaturedPage.java @@ -0,0 +1,61 @@ +package com.eu.habbo.habbohotel.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; + +public class CatalogFeaturedPage implements ISerialize +{ + public enum Type + { + PAGE_NAME(0), + PAGE_ID(1), + PRODUCT_NAME(2); + + public final int type; + Type(int type) + { + this.type = type; + } + } + + private final int slotId; + private final String caption; + private final String image; + private final Type type; + private final int expireTimestamp; + private final String pageName; + private final int pageId; + private final String productName; + + public CatalogFeaturedPage(int slotId, String caption, String image, Type type, int expireTimestamp, String pageName, int pageId, String productName) + { + this.slotId = slotId; + this.caption = caption; + this.image = image; + this.type = type; + this.expireTimestamp = expireTimestamp; + this.pageName = pageName; + this.pageId = pageId; + this.productName = productName; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.slotId); + message.appendString(this.caption); + message.appendString(this.image); + message.appendInt(this.type.type); + switch (this.type) + { + case PAGE_NAME: + message.appendString(this.pageName); break; + case PAGE_ID: + message.appendInt(this.pageId); break; + case PRODUCT_NAME: + message.appendString(this.productName); break; + } + message.appendInt(Emulator.getIntUnixTimestamp() - this.expireTimestamp); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogItem.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogItem.java new file mode 100644 index 00000000..b566132f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogItem.java @@ -0,0 +1,547 @@ +package com.eu.habbo.habbohotel.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; + +public class CatalogItem implements ISerialize, Runnable, Comparable +{ + /** + * Unique identifier. + */ + protected int id; + + /** + * Page where this item will be displayed. + */ + protected int pageId; + + /** + * String representation of the items that are displayed. + */ + protected String itemId; + + /** + * Catalog item name. + */ + protected String name; + + /** + * The amount of credits this item can be purchased for. + */ + protected int credits; + + /** + * The amount of points this item can be purchased for. + */ + protected int points; + + /** + * The seasonal currency that is used in order to buy this item. + * Defaults to pixels at 0. + */ + protected short pointsType; + + /** + * The amount of times this item will be given when purchased. + */ + protected int amount; + + /** + * If this item can be gifted. + */ + protected boolean allowGift = false; + + /** + * The total limited stack of this catalog item. + */ + protected int limitedStack; + + /** + * The amount of items that have been sold in this limited stack. + */ + protected int limitedSells; + + /** + * Extradata can be used to hold more data or set default data for the items bought. + */ + protected String extradata; + + /** + * Determines if this item can only be bought by people that have Habbo Club. + */ + protected boolean clubOnly; + + /** + * Determines if multiple purchases and thus discount is available. + */ + protected boolean haveOffer; + + /** + * The search offer id linked to this catalog item. + */ + protected int offerId; + + /** + * Flag to mark this item requiring an update to the database. + */ + protected boolean needsUpdate; + + /** + * Contains the amount of items in the bundle. + */ + protected HashMap bundle; + + public CatalogItem(ResultSet set) throws SQLException + { + this.load(set); + this.needsUpdate = false; + } + + /** + * Updaes the CatalogItem with the given resultset. + * @param set The ResultSet to update the CatalogItem with. + * @throws SQLException + */ + public void update(ResultSet set) throws SQLException + { + this.load(set); + } + + private void load(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.pageId = set.getInt("page_id"); + this.itemId = set.getString("item_Ids"); + this.name = set.getString("catalog_name"); + this.credits = set.getInt("cost_credits"); + this.points = set.getInt("cost_points"); + this.pointsType = set.getShort("points_type"); + this.amount = set.getInt("amount"); + this.limitedStack = set.getInt("limited_stack"); + this.limitedSells = set.getInt("limited_sells"); + this.extradata = set.getString("extradata"); + this.clubOnly = set.getBoolean("club_only"); + this.haveOffer = set.getBoolean("have_offer"); + this.offerId = set.getInt("offer_id"); + + this.bundle = new HashMap<>(); + this.loadBundle(); + } + + /** + * @return Unique identifier. + */ + public int getId() + { + return this.id; + } + + /** + * @return Page where this item will be displayed. + */ + public int getPageId() + { + return this.pageId; + } + + /** + * @param pageId Thenew page id to set for the item of where it will be displayed. + */ + public void setPageId(int pageId) + { + this.pageId = pageId; + } + + /** + * @return String representation of the items that are displayed. + */ + public String getItemId() + { + return this.itemId; + } + + /** + * @param itemId String representation of the items that are displayed. + */ + public void setItemId(String itemId) + { + this.itemId = itemId; + } + + /** + * @return Catalog item name. + */ + public String getName() + { + return this.name; + } + + /** + * @return The amount of credits this item can be purchased for. + */ + public int getCredits() + { + return this.credits; + } + + /** + * @return The amount of points this item can be purchased for. + */ + public int getPoints() + { + return this.points; + } + + /** + * @return The seasonal currency that is used in order to buy this item. + * Defaults to pixels at 0. + */ + public int getPointsType() + { + return this.pointsType; + } + + /** + * @return The amount of times this item will be given when purchased. + */ + public int getAmount() + { + return this.amount; + } + + /** + * @return The total limited stack of this catalog item. + */ + public int getLimitedStack() + { + return this.limitedStack; + } + + /** + * @return The amount of items that have been sold in this limited stack. + */ + public int getLimitedSells() + { + CatalogLimitedConfiguration ltdConfig = Emulator.getGameEnvironment().getCatalogManager().getLimitedConfig(this); + + if (ltdConfig != null) + { + return this.limitedStack - ltdConfig.available(); + } + + return this.limitedStack; + } + + /** + * @return Extradata can be used to hold more data or set default data for the items bought. + */ + public String getExtradata() + { + return this.extradata; + } + + /** + * @return Determines if this item can only be bought by people that have Habbo Club. + */ + public boolean isClubOnly() + { + return this.clubOnly; + } + + /** + * @return Determines if multiple purchases and thus discount is available. + */ + public boolean isHaveOffer() + { + return this.haveOffer; + } + + /** + * @return The search offer id linked to this catalog item. + */ + public int getOfferId() + { + return this.offerId; + } + + /** + * @return Returns True if this item has a limited stack. + */ + public boolean isLimited() + { + return this.limitedStack > 0; + } + + /** + * Sell a limited item. + */ + public synchronized void sellRare() + { + this.limitedSells++; + + this.needsUpdate = true; + + if(this.limitedSells == this.limitedStack) + { + Emulator.getGameEnvironment().getCatalogManager().moveCatalogItem(this, Emulator.getConfig().getInt("catalog.ltd.page.soldout")); + } + + Emulator.getThreading().run(this); + } + + /** + * @return Return all BaseItems being sold. + */ + public THashSet getBaseItems() + { + THashSet items = new THashSet<>(); + + if(!this.itemId.isEmpty()) + { + String[] itemIds = this.itemId.split(";"); + + for (String itemId : itemIds) + { + if (itemId.isEmpty()) + continue; + + if (itemId.contains(":")) + { + itemId = itemId.split(":")[0]; + } + + int identifier = Integer.parseInt(itemId); + if (identifier > 0) + { + Item item = Emulator.getGameEnvironment().getItemManager().getItem(identifier); + + if (item != null) + items.add(item); + } + } + } + + return items; + } + + /** + * @return The amount of items being sold. + */ + public int getItemAmount(int id) + { + if(this.bundle.containsKey(id)) + return this.bundle.get(id); + else + return this.amount; + } + + /** + * @return The bundle items. + */ + public HashMap getBundle() + { + return this.bundle; + } + + /** + * Loads the items in a bundle. + */ + public void loadBundle() + { + int intItemId; + + if(this.itemId.contains(";")) + { + try + { + String[] itemIds = this.itemId.split(";"); + + for (String itemId : itemIds) + { + if (itemId.contains(":")) + { + String[] data = itemId.split(":"); + if (data.length > 1 && Integer.parseInt(data[0]) > 0 && Integer.parseInt(data[1]) > 0) + { + this.bundle.put(Integer.parseInt(data[0]), Integer.parseInt(data[1])); + } + } else + { + if (!itemId.isEmpty()) + { + intItemId = (Integer.parseInt(itemId)); + this.bundle.put(intItemId, 1); + } + } + } + } catch (Exception e) + { + Emulator.getLogging().logDebugLine("Failed to load " + itemId); + e.printStackTrace(); + } + } + else + { + try + { + Item item = Emulator.getGameEnvironment().getItemManager().getItem(Integer.valueOf(this.itemId)); + + if (item != null) + { + this.allowGift = item.allowGift(); + } + } + catch (Exception e) + {} + } + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.getId()); + message.appendString(this.getName()); + message.appendBoolean(false); + message.appendInt(this.getCredits()); + message.appendInt(this.getPoints()); + message.appendInt(this.getPointsType()); + message.appendBoolean(this.allowGift); //Can gift + + THashSet items = this.getBaseItems(); + + message.appendInt(items.size()); + + for(Item item : items) + { + message.appendString(item.getType().code.toLowerCase()); + + if(item.getType() == FurnitureType.BADGE) + { + message.appendString(item.getName()); + } + else + { + message.appendInt(item.getSpriteId()); + + if(this.getName().contains("wallpaper_single") || this.getName().contains("floor_single") || this.getName().contains("landscape_single")) + { + message.appendString(this.getName().split("_")[2]); + } + else if(item.getName().contains("bot") && item.getType() == FurnitureType.ROBOT) + { + boolean lookFound = false; + for (String s : this.getExtradata().split(";")) + { + if (s.startsWith("figure:")) + { + lookFound = true; + message.appendString(s.replace("figure:", "")); + break; + } + } + + if (!lookFound) + { + message.appendString(this.getExtradata()); + } + } + else if(item.getType() == FurnitureType.ROBOT) + { + message.appendString(this.getExtradata()); + } + else if(item.getName().equalsIgnoreCase("poster")) + { + message.appendString(this.getExtradata()); + } + else if(this.getName().startsWith("SONG ")) + { + message.appendString(this.getExtradata()); + } + else + { + message.appendString(""); + } + message.appendInt(this.getItemAmount(item.getId())); + message.appendBoolean(this.isLimited()); + if(this.isLimited()) + { + message.appendInt(this.getLimitedStack()); + message.appendInt(this.getLimitedStack() - this.getLimitedSells()); + } + } + } + + message.appendInt32(this.clubOnly); + message.appendBoolean(haveOffer(this)); + message.appendBoolean(false); //unknown + message.appendString(this.name + ".png"); + } + + @Override + public void run() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE catalog_items SET limited_sells = ?, page_id = ? WHERE id = ?")) + { + statement.setInt(1, this.getLimitedSells()); + statement.setInt(2, this.pageId); + statement.setInt(3, this.getId()); + statement.execute(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.needsUpdate = false; + } + } + + @SuppressWarnings("NullableProblems") + @Override + public int compareTo(CatalogItem catalogItem) { + return this.getId() - catalogItem.getId(); + } + + /** + * Does additional checks to see if an item has offers enabled. + * @param item The item to check + * @return True if the item has offers enabled. + */ + private static boolean haveOffer(CatalogItem item) + { + if(!item.haveOffer) + return false; + + for(Item i : item.getBaseItems()) + { + if(i.getName().toLowerCase().startsWith("cf_") || i.getName().toLowerCase().startsWith("cfc_") || i.getName().toLowerCase().startsWith("rentable_bot")) + return false; + } + + if(item.getName().toLowerCase().startsWith("cf_") || item.getName().toLowerCase().startsWith("cfc_")) + return false; + + if(item.isLimited()) + return false; + + if(item.getName().toLowerCase().startsWith("rentable_bot_")) + return false; + + if(item.getAmount() != 1) + return false; + + return item.bundle.size() <= 1; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogLimitedConfiguration.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogLimitedConfiguration.java new file mode 100644 index 00000000..17e54a31 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogLimitedConfiguration.java @@ -0,0 +1,113 @@ +package com.eu.habbo.habbohotel.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Collections; +import java.util.LinkedList; + +public class CatalogLimitedConfiguration implements Runnable +{ + private final int itemId; + private int totalSet; + private final LinkedList limitedNumbers; + + public CatalogLimitedConfiguration(int itemId, LinkedList availableNumbers, int totalSet) + { + this.itemId = itemId; + this.totalSet = totalSet; + this.limitedNumbers = availableNumbers; + Collections.shuffle(this.limitedNumbers); + } + + public int getNumber() + { + synchronized (this.limitedNumbers) + { + int num = this.limitedNumbers.pop(); + return num; + } + } + + public void limitedSold(int catalogItemId, Habbo habbo, HabboItem item) + { + synchronized (this.limitedNumbers) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE catalog_items_limited SET user_id = ?, timestamp = ?, item_id = ? WHERE catalog_item_id = ? AND number = ? AND user_id = 0 LIMIT 1")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, Emulator.getIntUnixTimestamp()); + statement.setInt(3, item.getId()); + statement.setInt(4, catalogItemId); + statement.setInt(5, item.getLimitedSells()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public void generateNumbers(int starting, int amount) + { + synchronized (this.limitedNumbers) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO catalog_items_limited (catalog_item_id, number) VALUES (?, ?)")) + { + statement.setInt(1, this.itemId); + + for (int i = starting; i <= amount; i++) + { + statement.setInt(2, i); + statement.addBatch(); + this.limitedNumbers.push(i); + } + + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.totalSet += amount; + Collections.shuffle(this.limitedNumbers); + } + } + + public int available() + { + return this.limitedNumbers.size(); + } + + public int getTotalSet() + { + return this.totalSet; + } + + public void setTotalSet(int totalSet) + { + this.totalSet = totalSet; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE catalog_items SET limited_stack = ?, limited_sells = ? WHERE id = ?")) + { + statement.setInt(1, this.totalSet); + statement.setInt(2, this.totalSet - this.available()); + statement.setInt(3, this.itemId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java new file mode 100644 index 00000000..ca2f4cca --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java @@ -0,0 +1,1414 @@ +package com.eu.habbo.habbohotel.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.catalog.layouts.*; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.catalog.*; +import com.eu.habbo.messages.outgoing.events.calendar.AdventCalendarDataComposer; +import com.eu.habbo.messages.outgoing.events.calendar.AdventCalendarProductComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.AddBotComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.AddPetComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.unknown.NuxAlertComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; +import com.eu.habbo.plugin.events.emulator.EmulatorLoadCatalogManagerEvent; +import com.eu.habbo.plugin.events.users.catalog.UserCatalogFurnitureBoughtEvent; +import com.eu.habbo.plugin.events.users.catalog.UserCatalogItemPurchasedEvent; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.*; + +public class CatalogManager +{ + /** + * All the CatalogPages are stored in here. + */ + public final TIntObjectMap catalogPages; + + /** + * All featured items on the frontpage. + */ + public final TIntObjectMap catalogFeaturedPages; + + /** + * All the recycler prizes are stored in here. + */ + public final THashMap> prizes; + + /** + * All the new gift wrappers are stored in here. + */ + public final THashMap giftWrappers; + + /** + * All the old gift wrappers (Seperate furnis) are stored in here. + */ + public final THashMap giftFurnis; + + /** + * All the items that can be claimed as club rewards are stored in here. + */ + public final THashSet clubItems; + + /** + * All Habbo Club subcription offers. + */ + public final THashMap clubOffers; + + /** + * All clothing definitions + */ + public final THashMap clothing; + + /** + * Offer definitions. + */ + public final TIntIntHashMap offerDefs; + + /** + * All vouchers are stored in here. + */ + private final List vouchers; + + /** + * The box that should be given as ecotron reward. + */ + public final Item ecotronItem; + + /** + * The numbers available for limited furniture. + */ + public final THashMap limitedNumbers; + + /** + * The amount of items that are on sale. + */ + public static int catalogItemAmount; + + public final THashMap calendarRewards; + + /** + * Mapped all page definitions. + */ + public static final THashMap> pageDefinitions = new THashMap>() + { + { + for (CatalogPageLayouts layout : CatalogPageLayouts.values()) + { + switch(layout) + { + case frontpage: put(layout.name().toLowerCase(), FrontpageLayout.class); break; + case badge_display: put(layout.name().toLowerCase(), BadgeDisplayLayout.class); break; + case spaces_new: put(layout.name().toLowerCase(), SpacesLayout.class); break; + case trophies: put(layout.name().toLowerCase(), TrophiesLayout.class); break; + case bots: put(layout.name().toLowerCase(), BotsLayout.class); break; + case club_buy: put(layout.name().toLowerCase(), ClubBuyLayout.class); break; + case club_gift: put(layout.name().toLowerCase(), ClubGiftsLayout.class); break; + case sold_ltd_items: put(layout.name().toLowerCase(), SoldLTDItemsLayout.class); break; + case single_bundle: put(layout.name().toLowerCase(), SingleBundle.class); break; + case roomads: put(layout.name().toLowerCase(), RoomAdsLayout.class); break; + case recycler: if (Emulator.getConfig().getBoolean("hotel.ecotron.enabled")) put(layout.name().toLowerCase(), RecyclerLayout.class); break; + case recycler_info: if (Emulator.getConfig().getBoolean("hotel.ecotron.enabled")) put(layout.name().toLowerCase(), RecyclerInfoLayout.class); + case recycler_prizes: if (Emulator.getConfig().getBoolean("hotel.ecotron.enabled")) put(layout.name().toLowerCase(), RecyclerPrizesLayout.class); break; + case marketplace: if (Emulator.getConfig().getBoolean("hotel.marketplace.enabled")) put(layout.name().toLowerCase(), MarketplaceLayout.class); break; + case marketplace_own_items: if (Emulator.getConfig().getBoolean("hotel.marketplace.enabled")) put(layout.name().toLowerCase(), MarketplaceOwnItems.class); break; + case info_duckets: put(layout.name().toLowerCase(), InfoDucketsLayout.class); break; + case info_pets: put(layout.name().toLowerCase(), InfoPetsLayout.class); break; + case info_rentables: put(layout.name().toLowerCase(), InfoRentablesLayout.class); break; + case info_loyalty: put(layout.name().toLowerCase(), InfoLoyaltyLayout.class); break; + case loyalty_vip_buy: put(layout.name().toLowerCase(), LoyaltyVipBuyLayout.class); break; + case guilds: put(layout.name().toLowerCase(), GuildFrontpageLayout.class); break; + case guild_furni: put(layout.name().toLowerCase(), GuildFurnitureLayout.class); break; + case guild_forum: put(layout.name().toLowerCase(), GuildForumLayout.class); break; + case pets: put(layout.name().toLowerCase(), PetsLayout.class); break; + case pets2: put(layout.name().toLowerCase(), Pets2Layout.class); break; + case pets3: put(layout.name().toLowerCase(), Pets3Layout.class); break; + case soundmachine: put(layout.name().toLowerCase(), TraxLayout.class); break; + case default_3x3_color_grouping: put(layout.name().toLowerCase(), ColorGroupingLayout.class); break; + case recent_purchases: put(layout.name().toLowerCase(), RecentPurchasesLayout.class); break; + case room_bundle: put(layout.name().toLowerCase(), RoomBundleLayout.class); break; + case petcustomization: put(layout.name().toLowerCase(), PetCustomizationLayout.class); break; + case vip_buy: put(layout.name().toLowerCase(), VipBuyLayout.class); break; + case frontpage_featured: put(layout.name().toLowerCase(), FrontPageFeaturedLayout.class); break; + case builders_club_addons: put(layout.name().toLowerCase(), BuildersClubAddonsLayout.class); break; + case builders_club_frontpage: put(layout.name().toLowerCase(), BuildersClubFrontPageLayout.class); break; + case builders_club_loyalty: put(layout.name().toLowerCase(), BuildersClubLoyaltyLayout.class); break; + case default_3x3: + default: put("default_3x3", Default_3x3Layout.class); break; + } + } + } + }; + + public CatalogManager() + { + long millis = System.currentTimeMillis(); + this.catalogPages = TCollections.synchronizedMap(new TIntObjectHashMap()); + this.catalogFeaturedPages = new TIntObjectHashMap(); + this.prizes = new THashMap>(); + this.giftWrappers = new THashMap(); + this.giftFurnis = new THashMap(); + this.clubItems = new THashSet(); + this.clubOffers = new THashMap<>(); + this.clothing = new THashMap(); + this.offerDefs = new TIntIntHashMap(); + this.vouchers = new ArrayList(); + this.limitedNumbers = new THashMap(); + this.calendarRewards = new THashMap<>(); + + this.initialize(); + + this.ecotronItem = Emulator.getGameEnvironment().getItemManager().getItem("ecotron_box"); + + Emulator.getLogging().logStart("Catalog Manager -> Loaded! ("+(System.currentTimeMillis() - millis)+" MS)"); + } + + /** + * Initializes the CatalogManager. + */ + public synchronized void initialize() + { + Emulator.getPluginManager().fireEvent(new EmulatorLoadCatalogManagerEvent()); + + try + { + loadLimitedNumbers(); + loadCatalogPages(); + loadCatalogFeaturedPages(); + loadCatalogItems(); + loadClubOffers(); + loadVouchers(); + loadClothing(); + loadRecycler(); + loadGiftWrappers(); + loadCalendarRewards(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private synchronized void loadLimitedNumbers() throws SQLException + { + this.limitedNumbers.clear(); + + THashMap> limiteds = new THashMap>(); + TIntIntHashMap totals = new TIntIntHashMap(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM catalog_items_limited")) + { + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (!limiteds.containsKey(set.getInt("catalog_item_id"))) + { + limiteds.put(set.getInt("catalog_item_id"), new LinkedList()); + } + + totals.adjustOrPutValue(set.getInt("catalog_item_id"), 1, 1); + + if (set.getInt("user_id") == 0) + { + limiteds.get(set.getInt("catalog_item_id")).push(set.getInt("number")); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + for (Map.Entry> set : limiteds.entrySet()) + { + this.limitedNumbers.put(set.getKey(), new CatalogLimitedConfiguration(set.getKey(), set.getValue(), totals.get(set.getKey()))); + } + } + + /** + * Load all CatalogPages + * @throws SQLException + */ + private synchronized void loadCatalogPages() throws SQLException + { + this.catalogPages.clear(); + + final THashMap pages = new THashMap(); + pages.put(-1, new CatalogRootLayout(null)); + ResultSet set = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM catalog_pages ORDER BY parent_id, id")) + { + set = statement.executeQuery(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + while(set.next()) + { + Class pageClazz = pageDefinitions.get(set.getString("page_layout")); + + if (pageClazz == null) + { + Emulator.getLogging().logStart("Unknown Page Layout: " + set.getString("page_layout")); + continue; + } + + try + { + CatalogPage page = pageClazz.getConstructor(ResultSet.class).newInstance(set); + pages.put(page.getId(), page); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to load layout: " + set.getString("page_layout")); + } + } + + set.close(); + + pages.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CatalogPage object) + { + CatalogPage page = pages.get(object.parentId); + + if (page != null) + { + if (page.id != object.id) + { + page.addChildPage(object); + } + } + else + { + if (object.parentId != -2) + { + Emulator.getLogging().logStart("Parent Page not found for " + object.getPageName() + " (ID: " + object.id + ", parent_id: " + object.parentId + ")"); + } + } + return true; + } + }); + + this.catalogPages.putAll(pages); + + Emulator.getLogging().logStart("Loaded " + this.catalogPages.size() + " Catalog Pages!"); + } + + /** + * Loads the featured catalog pages. + * @throws SQLException + */ + private synchronized void loadCatalogFeaturedPages() throws SQLException + { + this.catalogFeaturedPages.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM catalog_featured_pages ORDER BY slot_id ASC")) + { + while (set.next()) + { + this.catalogFeaturedPages.put(set.getInt("slot_id"), new CatalogFeaturedPage( + set.getInt("slot_id"), + set.getString("caption"), + set.getString("image"), + CatalogFeaturedPage.Type.valueOf(set.getString("type").toUpperCase()), + set.getInt("expire_timestamp"), + set.getString("page_name"), + set.getInt("page_id"), + set.getString("product_name") + )); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + /** + * Load all CatalogItems + * @throws SQLException + */ + private synchronized void loadCatalogItems() throws SQLException + { + this.clubItems.clear(); + catalogItemAmount = 0; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM catalog_items")) + { + CatalogItem item; + while (set.next()) + { + if (set.getString("item_ids").equals("0")) + continue; + + if(set.getString("catalog_name").contains("HABBO_CLUB_")) + { + this.clubItems.add(new CatalogItem(set)); + continue; + } + + CatalogPage page = this.catalogPages.get(set.getInt("page_id")); + + if (page == null) + continue; + + item = page.getCatalogItem(set.getInt("id")); + + if (item == null) + { + catalogItemAmount++; + item = new CatalogItem(set); + page.addItem(item); + + if(item.getOfferId() != -1) + { + page.addOfferId(item.getOfferId()); + + this.offerDefs.put(item.getOfferId(), page.getId()); + } + } + else + item.update(set); + + if (item.isLimited()) + { + this.createOrUpdateLimitedConfig(item); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + for (CatalogPage page : this.catalogPages.valueCollection()) + { + for (Integer id : page.getIncluded()) + { + CatalogPage p = this.catalogPages.get(id); + + if (p != null) + { + page.getCatalogItems().putAll(p.getCatalogItems()); + } + } + } + } + + private void loadClubOffers() throws SQLException + { + synchronized (this.clubOffers) + { + this.clubOffers.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM catalog_club_offers WHERE enabled = ?")) + { + statement.setString(1, "1"); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.clubOffers.put(set.getInt("id"), new ClubOffer(set)); + } + } + } + } + } + + /** + * Load all vouchers. + * @throws SQLException + */ + private void loadVouchers() throws SQLException + { + synchronized (this.vouchers) + { + this.vouchers.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM vouchers")) + { + while (set.next()) + { + this.vouchers.add(new Voucher(set)); + } + } + } + } + + /** + * Load the recycler. + * @throws SQLException + */ + public void loadRecycler() throws SQLException + { + synchronized (this.prizes) + { + this.prizes.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM recycler_prizes")) + { + while (set.next()) + { + Item item = Emulator.getGameEnvironment().getItemManager().getItem(set.getInt("item_id")); + + if (item != null) + { + if (this.prizes.get(set.getInt("rarity")) == null) + { + this.prizes.put(set.getInt("rarity"), new THashSet()); + } + + this.prizes.get(set.getInt("rarity")).add(item); + } + else + { + Emulator.getLogging().logErrorLine("Cannot load item with ID:" + set.getInt("item_id") + " as recycler reward!"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + /** + * Load all gift wrappers (And old gift furnis) + * @throws SQLException + */ + public void loadGiftWrappers() throws SQLException + { + synchronized (this.giftWrappers) + { + synchronized (this.giftFurnis) + { + this.giftWrappers.clear(); + this.giftFurnis.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM gift_wrappers ORDER BY sprite_id DESC")) + { + while (set.next()) + { + switch (set.getString("type")) + { + case "wrapper": + this.giftWrappers.put(set.getInt("sprite_id"), set.getInt("item_id")); + break; + + case "gift": + this.giftFurnis.put(set.getInt("sprite_id"), set.getInt("item_id")); + break; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + + private void loadCalendarRewards() + { + synchronized (this.calendarRewards) + { + this.calendarRewards.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM calendar_rewards")) + { + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.calendarRewards.put(set.getInt("id"), new CalendarRewardObject(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + /** + * Loads all clothing. + */ + private void loadClothing() + { + synchronized (this.clothing) + { + this.clothing.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM catalog_clothing")) + { + while (set.next()) + { + this.clothing.put(set.getInt("id"), new ClothItem(set)); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public ClothItem getClothing(String name) + { + for (ClothItem item : this.clothing.values()) + { + if (item.name.equalsIgnoreCase(name)) + { + return item; + } + } + + return null; + } + + /** + * Looks up the given code for any voucher that matches it. + * @param code The code to look up. + * @return The voucher that uses the code. NULL when not found. + */ + public Voucher getVoucher(String code) + { + synchronized (this.vouchers) + { + for (Voucher voucher : this.vouchers) + { + if (voucher.code.equals(code)) + { + return voucher; + } + } + } + return null; + } + + /** + * Redeem a vouchercode for the given GameClient. + * @param client The GameClient that receives the rewards. + * @param voucherCode The voucher code. + */ + public void redeemVoucher(GameClient client, String voucherCode) + { + Voucher voucher = Emulator.getGameEnvironment().getCatalogManager().getVoucher(voucherCode); + + if(voucher != null) + { + if(Emulator.getGameEnvironment().getCatalogManager().deleteVoucher(voucher)) + { + client.getHabbo().getHabboInfo().addCredits(voucher.credits); + + if(voucher.points > 0) + { + client.getHabbo().getHabboInfo().addCurrencyAmount(voucher.pointsType, voucher.points); + client.sendResponse(new UserPointsComposer(client.getHabbo().getHabboInfo().getCurrencyAmount(voucher.pointsType), voucher.points, voucher.pointsType)); + } + + if(voucher.credits > 0) + { + client.getHabbo().getHabboInfo().addCredits(voucher.credits); + client.sendResponse(new UserCreditsComposer(client.getHabbo())); + } + + if (voucher.catalogItemId > 0) + { + CatalogItem item = this.getCatalogItem(voucher.catalogItemId); + + if (item != null) + { + this.purchaseItem(null, item, client.getHabbo(), 1, "", true); + } + } + + client.sendResponse(new RedeemVoucherOKComposer()); + + return; + } + } + + client.sendResponse(new RedeemVoucherErrorComposer(RedeemVoucherErrorComposer.INVALID_CODE)); + } + + /** + * Deletes an voucher from the database and emulator cache. + * @param voucher The voucher to delete. + * @return True when the voucher has been deleted. + */ + public boolean deleteVoucher(Voucher voucher) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM vouchers WHERE code = ?")) + { + statement.setString(1, voucher.code); + + synchronized (this.vouchers) + { + this.vouchers.remove(voucher); + } + + return statement.executeUpdate() >= 1; + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + /** + * Gets the CatalogPage for the given page Id + * @param pageId The page Id to lookup. + * @return The CatalogPage matching the page Id. NULL When not found. + */ + public CatalogPage getCatalogPage(int pageId) + { + return this.catalogPages.get(pageId); + } + + public CatalogPage getCatalogPage(final String captionSafe) + { + final CatalogPage[] page = {null}; + + synchronized (this.catalogPages) + { + this.catalogPages.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CatalogPage object) + { + if(object.getPageName().equalsIgnoreCase(captionSafe)) + { + page[0] = object; + return false; + } + + return true; + } + }); + + return page[0]; + } + } + + /** + * Finds the catalog item associated with the id. + * @param id + * @return + */ + public CatalogItem getCatalogItem(int id) + { + final CatalogItem[] item = {null}; + synchronized (this.catalogPages) + { + this.catalogPages.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CatalogPage object) + { + item[0] = object.getCatalogItem(id); + + return item[0] == null; + } + }); + } + + return item[0]; + } + + /** + * Gets all the sub pages for the given CatalogPage. + * @param parentId The page the sub pages have to bee looked up for. + * @param habbo The Habbo that has access to these pages. + * @return The selected pages. + */ + public List getCatalogPages(int parentId, final Habbo habbo) + { + final List pages = new ArrayList(); + + this.catalogPages.get(parentId).childPages.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CatalogPage object) + { + if (object.getRank() <= habbo.getHabboInfo().getRank().getId() && object.visible) + { + pages.add(object); + } + + return true; + } + }); + Collections.sort(pages); + + return pages; + } + + public TIntObjectMap getCatalogFeaturedPages() + { + return this.catalogFeaturedPages; + } + + /** + * @param itemId The CatalogItem that should be lookup. + * @return The CatalogItem for the id. NULL when not found. + */ + public CatalogItem getClubItem(int itemId) + { + synchronized (this.clubItems) + { + for (CatalogItem item : this.clubItems) + { + if (item.getId() == itemId) + return item; + } + } + + return null; + } + + /** + * Moves a catalog item to the a different CatalogPage. + * @param item The CatalogItem to move. + * @param pageId The unique identifier of the page. + * @return True if the move has been succesfully. + */ + public boolean moveCatalogItem(CatalogItem item, int pageId) + { + CatalogPage page = this.getCatalogPage(item.getPageId()); + + if(page == null) + return false; + + page.getCatalogItems().remove(item.getId()); + + page = this.getCatalogPage(pageId); + + page.getCatalogItems().put(item.getId(), item); + + item.setPageId(pageId); + + return true; + } + + /** + * @return Random recycler reward. + */ + public Item getRandomRecyclerPrize() + { + int level = 1; + + if(Emulator.getRandom().nextInt(Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.5")) + 1 == Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.5")) + { + level = 5; + } + else if(Emulator.getRandom().nextInt(Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.4")) + 1 == Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.4")) + { + level = 4; + } + else if(Emulator.getRandom().nextInt(Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.3")) + 1 == Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.3")) + { + level = 3; + } + else if(Emulator.getRandom().nextInt(Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.2")) + 1 == Emulator.getConfig().getInt("hotel.ecotron.rarity.chance.2")) + { + level = 2; + } + + if (this.prizes.containsKey(level) && !this.prizes.get(level).isEmpty()) + { + return (Item) this.prizes.get(level).toArray()[Emulator.getRandom().nextInt(this.prizes.get(level).size())]; + } + else + { + Emulator.getLogging().logErrorLine("[Recycler] No rewards specified for rarity level " + level); + } + + return null; + } + + /** + * Creates a new catalog page. + * @param caption The caption of the page. + * @param captionSave Save caption. + * @param roomId The id of the room if the page is a room bundle. + * @param icon The icon of the page. + * @param layout The layout of the page. + * @param minRank The minimum rank that is required to view the page. + * @param parentId The id of the parent page. + * @return The created CatalogPage. + */ + public CatalogPage createCatalogPage(String caption, String captionSave, int roomId, int icon, CatalogPageLayouts layout, int minRank, int parentId) + { + CatalogPage catalogPage = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO catalog_pages (parent_id, caption, caption_save, icon_image, visible, enabled, min_rank, page_layout, room_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, parentId); + statement.setString(2, caption); + statement.setString(3, captionSave); + statement.setInt(4, icon); + statement.setString(5, "1"); + statement.setString(6, "1"); + statement.setInt(7, minRank); + statement.setString(8, layout.name()); + statement.setInt(9, roomId); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + try (PreparedStatement stmt = connection.prepareStatement("SELECT * FROM catalog_pages WHERE id = ?")) + { + stmt.setInt(1, set.getInt(1)); + try (ResultSet page = stmt.executeQuery()) + { + if (page.next()) + { + Class pageClazz = pageDefinitions.get(page.getString("page_layout")); + + if (pageClazz != null) + { + try + { + catalogPage = pageClazz.getConstructor(ResultSet.class).newInstance(page); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + else + { + Emulator.getLogging().logErrorLine("Unknown Page Layout: " + page.getString("page_layout")); + } + } + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if(catalogPage != null) + { + this.catalogPages.put(catalogPage.getId(), catalogPage); + } + + return catalogPage; + } + + /** + * @param item The CatalogItem to find the limited configuration for. + * @return The limited configuration for the CatalogItem. + */ + public CatalogLimitedConfiguration getLimitedConfig(CatalogItem item) + { + synchronized (this.limitedNumbers) + { + return this.limitedNumbers.get(item.getId()); + } + } + + /** + * Creates or updates the CatalogLimitedConfiguration for the given CatalogItem. + * @param item The CatalogItem to create or update hte CatalogLimitedConfiguration for. + * @return The created or updated CatalogLimitedConfiguration. + */ + public CatalogLimitedConfiguration createOrUpdateLimitedConfig(CatalogItem item) + { + if (item.isLimited()) + { + CatalogLimitedConfiguration limitedConfiguration = this.limitedNumbers.get(item.getId()); + + if (limitedConfiguration == null) + { + limitedConfiguration = new CatalogLimitedConfiguration(item.getId(), new LinkedList(), 0); + limitedConfiguration.generateNumbers(1, item.limitedStack); + this.limitedNumbers.put(item.getId(), limitedConfiguration); + } + else + { + if (limitedConfiguration.getTotalSet() != item.limitedStack) + { + if (limitedConfiguration.getTotalSet() == 0) + { + limitedConfiguration.setTotalSet(item.limitedStack); + } + else if (item.limitedStack > limitedConfiguration.getTotalSet()) + { + limitedConfiguration.generateNumbers(item.limitedStack + 1, item.limitedStack - limitedConfiguration.getTotalSet()); + } + else + { + item.limitedStack = limitedConfiguration.getTotalSet(); + } + } + } + + return limitedConfiguration; + } + + return null; + } + + /** + * Disposes the CatalogManager. + */ + public void dispose() + { + TIntObjectIterator pageIterator = this.catalogPages.iterator(); + + while (pageIterator.hasNext()) + { + pageIterator.advance(); + + for(CatalogItem item : pageIterator.value().getCatalogItems().valueCollection()) + { + item.run(); + if(item.isLimited()) + { + this.limitedNumbers.get(item.getId()).run(); + } + } + } + + Emulator.getLogging().logShutdownLine("Catalog Manager -> Disposed!"); + } + + /** + * Purchases a catalog item. + * @param page The page to purchase from. + * @param item The CatalogItem to purchase. + * @param habbo The Habbo that purchased this CatalogItem. + * @param amount The amount of times the item should be bought. + * @param extradata Any extradataassociated. + * @param free Determines if this purchase is free and thus no credits / points will be deducted. + */ + public void purchaseItem(CatalogPage page, CatalogItem item, Habbo habbo, int amount, String extradata, boolean free) + { + Item cBaseItem = null; + + if(item == null) + { + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + if(item.isClubOnly() && !habbo.getClient().getHabbo().getHabboStats().hasActiveClub()) + { + habbo.getClient().sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.REQUIRES_CLUB)); + return; + } + + if (amount <= 0) + { + habbo.getClient().sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.ILLEGAL)); + return; + } + + try + { + CatalogLimitedConfiguration limitedConfiguration = null; + int limitedStack = 0; + int limitedNumber = 0; + if (item.isLimited()) + { + amount = 1; + if (this.getLimitedConfig(item).available() == 0) + { + habbo.getClient().sendResponse(new AlertLimitedSoldOutComposer()); + return; + } + } + + if(amount > 1) + { + if(amount == item.getAmount()) + { + amount = 1; + } + else + { + if(amount * item.getAmount() > 100) + { + habbo.getClient().sendResponse(new GenericAlertComposer("Whoops! You tried to buy this " + (amount * item.getAmount()) + " times. This must've been a mistake.")); + habbo.getClient().sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.ILLEGAL)); + return; + } + } + } + + int totalCredits = 0; + int totalPoints = 0; + + THashSet itemsList = new THashSet(); + + /* + Scripting protection that prevents users from buying multiple items + when offer is not enabled for the item. + + Automatically creates a new ModToolIssue and sends it to the online moderators. + */ + if(amount > 1 && !item.isHaveOffer()) + { + String message = Emulator.getTexts().getValue("scripter.warning.catalog.amount").replace("%username%", habbo.getHabboInfo().getUsername()).replace("%itemname%", item.getName()).replace("%pagename%", page.getCaption()); + Emulator.getGameEnvironment().getModToolManager().quickTicket(habbo.getClient().getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + habbo.getClient().sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.ILLEGAL)); + return; + } + + if (item.isLimited()) + { + limitedConfiguration = this.getLimitedConfig(item); + + if (limitedConfiguration == null) + { + limitedConfiguration = this.createOrUpdateLimitedConfig(item); + } + + limitedNumber = limitedConfiguration.getNumber(); + limitedStack = limitedConfiguration.getTotalSet(); + } + + List badges = new ArrayList<>(); + boolean badgeFound = false; + for(int i = 0; i < amount; i++) + { + if (free || (item.getCredits() <= habbo.getClient().getHabbo().getHabboInfo().getCredits() - totalCredits)) + { + if(free || + item.getPoints() <= habbo.getClient().getHabbo().getHabboInfo().getCurrencyAmount(item.getPointsType()) - totalPoints) + { + if (((i + 1) % 6 != 0 && item.isHaveOffer()) || !item.isHaveOffer()) + { + totalCredits += item.getCredits(); + totalPoints += item.getPoints(); + } + + //for (int j = 0; j < item.getAmount(); j++) + //{ + for (Item baseItem : item.getBaseItems()) + { + for(int k = 0; k < item.getItemAmount(baseItem.getId()); k++) + { + cBaseItem = baseItem; + if(baseItem.getName().startsWith("rentable_bot_") || baseItem.getName().startsWith("bot_")) + { + String type = item.getName().replace("rentable_bot_", ""); + type = type.replace("bot_", ""); + + THashMap data = new THashMap(); + + for(String s : item.getExtradata().split(";")) + { + if(s.contains(":")) + { + data.put(s.split(":")[0], s.split(":")[1]); + } + } + + Bot bot = Emulator.getGameEnvironment().getBotManager().createBot(data, type); + + if(bot != null) + { + bot.setOwnerId(habbo.getClient().getHabbo().getHabboInfo().getId()); + bot.setOwnerName(habbo.getClient().getHabbo().getHabboInfo().getUsername()); + bot.needsUpdate(true); + Emulator.getThreading().run(bot); + habbo.getClient().getHabbo().getInventory().getBotsComponent().addBot(bot); + habbo.getClient().sendResponse(new AddBotComposer(bot)); + } + else + { + throw new Exception("Failed to create bot of type: " + type); + } + } + else if (baseItem.getType() == FurnitureType.EFFECT) + { + int effectId = baseItem.getEffectM(); + + if (habbo.getHabboInfo().getGender().equals(HabboGender.F)) + { + effectId = baseItem.getEffectF(); + } + + if (effectId > 0) + { + habbo.getInventory().getEffectsComponent().createEffect(effectId); + } + } + else if(Item.isPet(baseItem)) + { + String[] data = extradata.split("\n"); + + if (data.length < 3) + { + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + Pet pet = null; + try + { + pet = Emulator.getGameEnvironment().getPetManager().createPet(baseItem, data[0], data[1], data[2], habbo.getClient()); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + } + + if(pet == null) + return; + + habbo.getClient().getHabbo().getInventory().getPetsComponent().addPet(pet); + habbo.getClient().sendResponse(new AddPetComposer(pet)); + habbo.getClient().sendResponse(new PetBoughtNotificationComposer(pet, false)); + + AchievementManager.progressAchievement(habbo.getClient().getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("PetLover")); + } + else if (baseItem.getType() == FurnitureType.BADGE) + { + if(!habbo.getInventory().getBadgesComponent().hasBadge(baseItem.getName())) + { + if (!badges.contains(baseItem.getName())) + { + badges.add(baseItem.getName()); + } + } + else + { + badgeFound = true; + } + } + else + { + if (baseItem.getInteractionType().getType() == InteractionTrophy.class || baseItem.getInteractionType().getType() == InteractionBadgeDisplay.class) + { + if(baseItem.getInteractionType().getType() == InteractionBadgeDisplay.class && !habbo.getClient().getHabbo().getInventory().getBadgesComponent().hasBadge(extradata)) + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(habbo.getClient().getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.catalog.badge_display").replace("%username%", habbo.getClient().getHabbo().getHabboInfo().getUsername()).replace("%badge%", extradata)); + extradata = "UMAD"; + } + + extradata = habbo.getClient().getHabbo().getHabboInfo().getUsername() + (char) 9 + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + (Calendar.getInstance().get(Calendar.MONTH) + 1) + "-" + Calendar.getInstance().get(Calendar.YEAR) + (char) 9 + extradata; + } + + if (InteractionTeleport.class.isAssignableFrom(baseItem.getInteractionType().getType())) + { + HabboItem teleportOne = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getClient().getHabbo().getHabboInfo().getId(), baseItem, limitedStack, limitedNumber, extradata); + HabboItem teleportTwo = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getClient().getHabbo().getHabboInfo().getId(), baseItem, limitedStack, limitedNumber, extradata); + Emulator.getGameEnvironment().getItemManager().insertTeleportPair(teleportOne.getId(), teleportTwo.getId()); + itemsList.add(teleportOne); + itemsList.add(teleportTwo); + } + else if(baseItem.getInteractionType().getType() == InteractionHopper.class) + { + HabboItem hopper = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getClient().getHabbo().getHabboInfo().getId(), baseItem, limitedStack, limitedNumber, extradata); + + Emulator.getGameEnvironment().getItemManager().insertHopper(hopper); + + itemsList.add(hopper); + } + else if(baseItem.getInteractionType().getType() == InteractionGuildFurni.class || baseItem.getInteractionType().getType() == InteractionGuildGate.class) + { + InteractionGuildFurni habboItem = (InteractionGuildFurni)Emulator.getGameEnvironment().getItemManager().createItem(habbo.getClient().getHabbo().getHabboInfo().getId(), baseItem, limitedStack, limitedNumber, extradata); + habboItem.setExtradata(""); + habboItem.needsUpdate(true); + int guildId; + try + { + guildId = Integer.parseInt(extradata); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + Emulator.getThreading().run(habboItem); + Emulator.getGameEnvironment().getGuildManager().setGuild(habboItem, guildId); + itemsList.add(habboItem); + } + else if(baseItem.getInteractionType().getType() == InteractionMusicDisc.class) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(item.getExtradata()); + + if(track == null) + { + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + InteractionMusicDisc habboItem = (InteractionMusicDisc)Emulator.getGameEnvironment().getItemManager().createItem(habbo.getClient().getHabbo().getHabboInfo().getId(), baseItem, limitedStack, limitedNumber, habbo.getClient().getHabbo().getHabboInfo().getUsername() + "\n" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "\n" + (Calendar.getInstance().get(Calendar.MONTH) + 1) + "\n" + Calendar.getInstance().get(Calendar.YEAR) + "\n" + track.getLength() + "\n" + track.getName() + "\n" + track.getId()); + habboItem.needsUpdate(true); + + Emulator.getThreading().run(habboItem); + itemsList.add(habboItem); + } + else + { + HabboItem habboItem = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getClient().getHabbo().getHabboInfo().getId(), baseItem, limitedStack, limitedNumber, extradata); + itemsList.add(habboItem); + } + } + } + } + //} + } + } + } + + UserCatalogItemPurchasedEvent purchasedEvent = new UserCatalogItemPurchasedEvent(habbo, item, itemsList, totalCredits, totalPoints, badges); + Emulator.getPluginManager().fireEvent(purchasedEvent); + + if (badgeFound) + { + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.ALREADY_HAVE_BADGE)); + + if (item.getBaseItems().size() == 1) + { + return; + } + } + + if(!free && !habbo.getClient().getHabbo().hasPermission("acc_infinite_credits")) + { + if (purchasedEvent.totalCredits > 0) + { + habbo.getClient().getHabbo().getHabboInfo().addCredits(-purchasedEvent.totalCredits); + habbo.getClient().sendResponse(new UserCreditsComposer(habbo.getClient().getHabbo())); + } + } + + if(!free && !habbo.getClient().getHabbo().hasPermission("acc_infinite_points")) + { + if (purchasedEvent.totalPoints > 0) + { + habbo.getClient().getHabbo().getHabboInfo().addCurrencyAmount(item.getPointsType(), -purchasedEvent.totalPoints); + habbo.getClient().sendResponse(new UserPointsComposer(habbo.getClient().getHabbo().getHabboInfo().getCurrencyAmount(item.getPointsType()), -purchasedEvent.totalPoints, item.getPointsType())); + } + } + + if (purchasedEvent.itemsList != null) + { + habbo.getClient().sendResponse(new AddHabboItemComposer(purchasedEvent.itemsList)); + habbo.getClient().getHabbo().getInventory().getItemsComponent().addItems(purchasedEvent.itemsList); + habbo.getClient().sendResponse(new PurchaseOKComposer(purchasedEvent.catalogItem)); + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + + Emulator.getPluginManager().fireEvent(new UserCatalogFurnitureBoughtEvent(habbo, item, purchasedEvent.itemsList)); + + if (limitedConfiguration != null) + { + for (HabboItem itm : purchasedEvent.itemsList) + { + limitedConfiguration.limitedSold(item.getId(), habbo, itm); + } + } + } + + for (String b : purchasedEvent.badges) + { + HabboBadge badge = new HabboBadge(0, b, 0, habbo); + Emulator.getThreading().run(badge); + habbo.getInventory().getBadgesComponent().addBadge(badge); + habbo.getClient().sendResponse(new AddUserBadgeComposer(badge)); + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}album1584/" + badge.getCode() + ".gif"); + keys.put("message", Emulator.getTexts().getValue("commands.generic.cmd_badge.received")); + habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys)); + } + habbo.getClient().getHabbo().getHabboStats().addPurchase(purchasedEvent.catalogItem); + + } + catch(Exception e) + { + Emulator.getLogging().logPacketError(e); + habbo.getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + } + } + + public List getClubOffers() + { + List offers = new ArrayList<>(); + + for (Map.Entry entry : this.clubOffers.entrySet()) + { + if (!entry.getValue().isDeal()) + { + offers.add(entry.getValue()); + } + } + + return offers; + } + + public void claimCalendarReward(Habbo habbo, int day) + { + if (!habbo.getHabboStats().calendarRewardsClaimed.contains(day)) + { + habbo.getHabboStats().calendarRewardsClaimed.add(day); + CalendarRewardObject object = this.calendarRewards.get(day); + + if (object != null) + { + object.give(habbo); + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + habbo.getClient().sendResponse(new AdventCalendarProductComposer(true, object)); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO calendar_rewards_claimed (user_id, reward_id, timestamp) VALUES (?, ?, ?)")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, day); + statement.setInt(3, Emulator.getIntUnixTimestamp()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPage.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPage.java new file mode 100644 index 00000000..1b65d7b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPage.java @@ -0,0 +1,237 @@ +package com.eu.habbo.habbohotel.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.TCollections; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; + +public abstract class CatalogPage implements Comparable, ISerialize +{ + protected int id; + protected int parentId; + protected int rank; + protected String caption; + protected String pageName; + protected int iconColor; + protected int iconImage; + protected int orderNum; + protected boolean visible; + protected boolean enabled; + protected boolean clubOnly; + protected String layout; + protected String headerImage; + protected String teaserImage; + protected String specialImage; + protected String textOne; + protected String textTwo; + protected String textDetails; + protected String textTeaser; + protected TIntArrayList offerIds = new TIntArrayList(); + protected THashMap childPages = new THashMap();; + private TIntObjectMap catalogItems = TCollections.synchronizedMap(new TIntObjectHashMap()); + private ArrayList included = new ArrayList(); + + public CatalogPage(ResultSet set) throws SQLException + { + if (set == null) + return; + + this.id = set.getInt("id"); + this.parentId = set.getInt("parent_id"); + this.rank = set.getInt("min_rank"); + this.caption = set.getString("caption"); + this.pageName = set.getString("caption_save"); + this.iconColor = set.getInt("icon_color"); + this.iconImage = set.getInt("icon_image"); + this.orderNum = set.getInt("order_num"); + this.visible = set.getBoolean("visible"); + this.enabled = set.getBoolean("enabled"); + this.clubOnly = set.getBoolean("club_only"); + this.layout = set.getString("page_layout"); + this.headerImage = set.getString("page_headline"); + this.teaserImage = set.getString("page_teaser"); + this.specialImage = set.getString("page_special"); + this.textOne = set.getString("page_text1"); + this.textTwo = set.getString("page_text2"); + this.textDetails = set.getString("page_text_details"); + this.textTeaser = set.getString("page_text_teaser"); + + if (!set.getString("includes").isEmpty()) + { + for (String id : set.getString("includes").split(";")) + { + try + { + this.included.add(Integer.valueOf(id)); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + } + + public int getId() + { + return this.id; + } + + public int getParentId() + { + return this.parentId; + } + + public int getRank() + { + return this.rank; + } + + public void setRank(int rank) + { + this.rank = rank; + } + + public String getCaption() + { + return this.caption; + } + + public String getPageName() + { + return this.pageName; + } + + public int getIconColor() + { + return this.iconColor; + } + + public int getIconImage() + { + return this.iconImage; + } + + public int getOrderNum() + { + return this.orderNum; + } + + public boolean isVisible() + { + return this.visible; + } + + public boolean isEnabled() + { + return this.enabled; + } + + public boolean isClubOnly() + { + return this.clubOnly; + } + + public String getLayout() + { + return this.layout; + } + + public String getHeaderImage() + { + return this.headerImage; + } + + public String getTeaserImage() + { + return this.teaserImage; + } + + public String getSpecialImage() + { + return this.specialImage; + } + + public String getTextOne() + { + return this.textOne; + } + + public String getTextTwo() + { + return this.textTwo; + } + + public String getTextDetails() + { + return this.textDetails; + } + + public String getTextTeaser() + { + return this.textTeaser; + } + + public TIntArrayList getOfferIds() + { + return this.offerIds; + } + + public void addOfferId(int offerId) + { + this.offerIds.add(offerId); + } + + public void addItem(CatalogItem item) + { + this.catalogItems.put(item.getId(), item); + } + + public TIntObjectMap getCatalogItems() + { + return this.catalogItems; + } + + public CatalogItem getCatalogItem(int id) + { + return this.catalogItems.get(id); + } + + public ArrayList getIncluded() + { + return this.included; + } + + public THashMap getChildPages() + { + return this.childPages; + } + + public void addChildPage(CatalogPage page) + { + this.childPages.put(page.getId(), page); + + if (page.getRank() < this.getRank()) + { + page.setRank(this.getRank()); + } + } + + @SuppressWarnings("NullableProblems") + @Override + public int compareTo(CatalogPage page) { + return this.getOrderNum() - page.getOrderNum(); + } + + @Override + public abstract void serialize(ServerMessage message); +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java new file mode 100644 index 00000000..916a30d0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java @@ -0,0 +1,187 @@ +package com.eu.habbo.habbohotel.catalog; + +public enum CatalogPageLayouts +{ + /** + * Default page, used most of the time. + */ + default_3x3, + + /** + * The page that you can buy Guild furniture from. + */ + guild_furni, + + /** + * The page that allows you to buy a Guild. + */ + guilds, + + /** + * The page that allows you to buy a forum for your Guild. + */ + guild_forum, + + /** + * The page with information about duckets. + */ + info_duckets, + + /** + * The page with information about rentables. + */ + info_rentables, + + /** + * The page with information about loyalty programme. + */ + info_loyalty, + + /** + * The page you can buy VIP with loyalty points. + */ + loyalty_vip_buy, + + /** + * The page where you can buy bots from. + */ + bots, + + /** + * Pets + */ + pets, + + /** + * Petss + */ + pets2, + + /** + * Petsss + */ + pets3, + + /** + * The page where you can claim club gifts. + */ + club_gift, + + /** + * The front page. Without it, there is nothing. /s + */ + frontpage, + + /** + * The page where you can buy those fancy badge displays. + */ + badge_display, + + /** + * The new spaces layout. + */ + spaces_new, + + /** + * Trax + */ + soundmachine, + + /** + * Info about pets. + */ + info_pets, + + /** + * The page where you can buy Habbo Club from. + */ + club_buy, + + /** + * Roomads are being sold here. + */ + roomads, + + /** + * Trophies page. + */ + trophies, + + /** + * Single bundle for single people. + */ + single_bundle, + + /** + * The Marketplace. + */ + marketplace, + + /** + * Lists your own Marketplace items. + */ + marketplace_own_items, + + /** + * The Recycler (Or ecotron) + */ + recycler, + + /** + * Info, for the people that don't know how to drag 'n drop. + */ + recycler_info, + + /** + * All the rewards you can get from the Recycler (Or ecotron) + */ + recycler_prizes, + + /** + * The page where all the sold out LTDs go. + */ + sold_ltd_items, + + /** + * This is gone in the newer PRODUCTION versions, unfortunately. + */ + plasto, + + /** + * Color grouping using the default page. + */ + default_3x3_color_grouping, + + /** + * Page where your recent purchases reside. + */ + recent_purchases, + + /** + * Room Bundles + */ + room_bundle, + + /** + * Pet Customization like pet color dyes + */ + petcustomization, + + /** + * Root page. Do not use! + */ + root, + + /** + * The page where you can buy Habbo VIP from. + */ + vip_buy, + + frontpage_featured, + + builders_club_addons, + + builders_club_frontpage, + + builders_club_loyalty +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageType.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageType.java new file mode 100644 index 00000000..0163a344 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageType.java @@ -0,0 +1,14 @@ +package com.eu.habbo.habbohotel.catalog; + +public enum CatalogPageType +{ + /** + * NORMAL Catalog + */ + NORMAL, + + /** + * BUILDER Catalog (Not implemented yet!) + */ + BUILDER +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/ClothItem.java b/src/main/java/com/eu/habbo/habbohotel/catalog/ClothItem.java new file mode 100644 index 00000000..f8c10c24 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/ClothItem.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.catalog; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ClothItem +{ + /** + * Identifier. + */ + public int id; + + /** + * Name + */ + public String name; + + /** + * Set + */ + public int[] setId; + + public ClothItem(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + String[] parts = set.getString("setid").split(","); + + this.setId = new int[parts.length]; + for (int i = 0; i < this.setId.length; i++) + { + this.setId[i] = Integer.valueOf(parts[i]); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/ClubOffer.java b/src/main/java/com/eu/habbo/habbohotel/catalog/ClubOffer.java new file mode 100644 index 00000000..4023e4b2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/ClubOffer.java @@ -0,0 +1,99 @@ +package com.eu.habbo.habbohotel.catalog; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ClubOffer +{ + /** + * Id of the offer. + */ + private final int id; + + /** + * Name of the offer + */ + private final String name; + + /** + * Total days + */ + private final int days; + + /** + * Price in credits. + */ + private final int credits; + + /** + * Price in points. + */ + private final int points; + + /** + * Points type. + */ + private final int pointsType; + + /** + * Is VIP (Legacy) + */ + private final boolean vip; + + /** + * If the ClubOffer is an extension deal. + */ + private final boolean deal; + + public ClubOffer(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + this.days = set.getInt("days"); + this.credits = set.getInt("credits"); + this.points = set.getInt("points"); + this.pointsType = set.getInt("points_type"); + this.vip = set.getString("type").equalsIgnoreCase("vip"); + this.deal = set.getString("deal").equals("1"); + } + + public int getId() + { + return this.id; + } + + public String getName() + { + return this.name; + } + + public int getDays() + { + return this.days; + } + + public int getCredits() + { + return this.credits; + } + + public int getPoints() + { + return this.points; + } + + public int getPointsType() + { + return this.pointsType; + } + + public boolean isVip() + { + return this.vip; + } + + public boolean isDeal() + { + return this.deal; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/TargetOffer.java b/src/main/java/com/eu/habbo/habbohotel/catalog/TargetOffer.java new file mode 100644 index 00000000..d69f3660 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/TargetOffer.java @@ -0,0 +1,71 @@ +package com.eu.habbo.habbohotel.catalog; + + +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class TargetOffer implements ISerialize +{ + private final int unknownInt1; + private final int id; + private final String identifier; + private final String unknownString1; + private final int priceInCredits; + private final int priceInActivityPoints; + private final int activityPointsType; + private final int purchaseLimit; + private final int expirationTime; + private final String title; + private final String description; + private final String imageUrl; + private final String unknownString2; + private final int type; + private final List unknownStringList; + + public TargetOffer(int unknownInt1, int id, String identifier, String unknownString1, int priceInCredits, int priceInActivityPoints, int activityPointsType, int purchaseLimit, int expirationTime, String title, String description, String imageUrl, String unknownString2, int type, List unknownStringList) + { + this.unknownInt1 = unknownInt1; + this.id = id; + this.identifier = identifier; + this.unknownString1 = unknownString1; + this.priceInCredits = priceInCredits; + this.priceInActivityPoints = priceInActivityPoints; + this.activityPointsType = activityPointsType; + this.purchaseLimit = purchaseLimit; + this.expirationTime = expirationTime; + this.title = title; + this.description = description; + this.imageUrl = imageUrl; + this.unknownString2 = unknownString2; + this.type = type; + this.unknownStringList = unknownStringList; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.unknownInt1); + message.appendInt(this.id); + message.appendString(this.identifier); + message.appendString(this.unknownString1); + message.appendInt(this.priceInCredits); + message.appendInt(this.priceInActivityPoints); + message.appendInt(this.activityPointsType); + message.appendInt(this.purchaseLimit); + message.appendInt(this.expirationTime); + message.appendString(this.title); + message.appendString(this.description); + message.appendString(this.imageUrl); + message.appendString(this.unknownString2); + message.appendInt(this.type); + message.appendInt(this.unknownStringList.size()); + for (String s : this.unknownStringList) + { + message.appendString(s); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/Voucher.java b/src/main/java/com/eu/habbo/habbohotel/catalog/Voucher.java new file mode 100644 index 00000000..8dc0de80 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/Voucher.java @@ -0,0 +1,52 @@ +package com.eu.habbo.habbohotel.catalog; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Voucher +{ + /** + * Voucher ID + */ + private final int id; + + /** + * Code + */ + public final String code; + + /** + * Reward credits. + */ + public final int credits; + + /** + * Reward points. + */ + public final int points; + + /** + * Points type + */ + public final int pointsType; + + /** + * Item from the catalog. + */ + public final int catalogItemId; + + /** + * Constructs a new Voucher. + * @param set The ResultSet to read the data from. + * @throws SQLException + */ + public Voucher(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.code = set.getString("code"); + this.credits = set.getInt("credits"); + this.points = set.getInt("points"); + this.pointsType = set.getInt("points_type"); + this.catalogItemId = set.getInt("catalog_item_id"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BadgeDisplayLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BadgeDisplayLayout.java new file mode 100644 index 00000000..ad094f30 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BadgeDisplayLayout.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Class for the interactive badge display catalog page. + */ +public class BadgeDisplayLayout extends CatalogPage +{ + public BadgeDisplayLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) { + message.appendString("badge_display"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BotsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BotsLayout.java new file mode 100644 index 00000000..58b5eec0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BotsLayout.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Class for the bots page. + */ +public class BotsLayout extends CatalogPage +{ + public BotsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("bots"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTwo()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubAddonsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubAddonsLayout.java new file mode 100644 index 00000000..4c208d77 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubAddonsLayout.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Class for the page where additional buildersclub addons can be bought. + */ +public class BuildersClubAddonsLayout extends CatalogPage +{ + public BuildersClubAddonsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("builders_club_addons"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubFrontPageLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubFrontPageLayout.java new file mode 100644 index 00000000..374f1f14 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubFrontPageLayout.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Class for the frontpage of the buildersclub. + */ +public class BuildersClubFrontPageLayout extends CatalogPage +{ + public BuildersClubFrontPageLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("builders_club_frontpage"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubLoyaltyLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubLoyaltyLayout.java new file mode 100644 index 00000000..11003b02 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/BuildersClubLoyaltyLayout.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Class for the buildersclub rewards page. + */ +public class BuildersClubLoyaltyLayout extends CatalogPage +{ + public BuildersClubLoyaltyLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("builders_club_loyalty"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CatalogRootLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CatalogRootLayout.java new file mode 100644 index 00000000..c303ef78 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CatalogRootLayout.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CatalogRootLayout extends CatalogPage +{ + public CatalogRootLayout(ResultSet set) throws SQLException + { + super(null); + + this.id = -1; + this.parentId = -2; + this.rank = 0; + this.caption = "root"; + this.pageName = "root"; + this.iconColor = 0; + this.iconImage = 0; + this.orderNum = -10; + this.visible = true; + this.enabled = true; + } + + @Override + public void serialize(ServerMessage message) + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubBuyLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubBuyLayout.java new file mode 100644 index 00000000..6eb9e399 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubBuyLayout.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ClubBuyLayout extends CatalogPage +{ + public ClubBuyLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("club_buy"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubGiftsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubGiftsLayout.java new file mode 100644 index 00000000..2c78f6a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ClubGiftsLayout.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ClubGiftsLayout extends CatalogPage +{ + public ClubGiftsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("club_gifts"); + message.appendInt(1); + message.appendString(super.getHeaderImage()); + message.appendInt(1); + message.appendString(super.getTextOne()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ColorGroupingLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ColorGroupingLayout.java new file mode 100644 index 00000000..9254c26f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ColorGroupingLayout.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ColorGroupingLayout extends CatalogPage +{ + public ColorGroupingLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) { + message.appendString("default_3x3_color_grouping"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Default_3x3Layout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Default_3x3Layout.java new file mode 100644 index 00000000..f2cc92be --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Default_3x3Layout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Default_3x3Layout extends CatalogPage { + + public Default_3x3Layout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("default_3x3"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontPageFeaturedLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontPageFeaturedLayout.java new file mode 100644 index 00000000..77996fa1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontPageFeaturedLayout.java @@ -0,0 +1,82 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogFeaturedPage; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class FrontPageFeaturedLayout extends CatalogPage +{ + public FrontPageFeaturedLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("frontpage_featured"); + String[] teaserImages = super.getTeaserImage().split(";"); + String[] specialImages = super.getSpecialImage().split(";"); + + message.appendInt(1 + teaserImages.length + specialImages.length); + message.appendString(super.getHeaderImage()); + for (String s : teaserImages) + { + message.appendString(s); + } + + for (String s : specialImages) + { + message.appendString(s); + } + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } + + public void serializeExtra(ServerMessage message) + { + + message.appendInt(Emulator.getGameEnvironment().getCatalogManager().getCatalogFeaturedPages().size()); // count + + for (CatalogFeaturedPage page : Emulator.getGameEnvironment().getCatalogManager().getCatalogFeaturedPages().valueCollection()) + { + page.serialize(message); + } + message.appendInt(1); //Position + message.appendString("NUOVO: Affare Stanza di Rilassamento"); // Text + message.appendString("catalogue/feature_cata_vert_oly16bundle4.png"); // Image + message.appendInt(0); //Type + //0 : String //Page Name + //1 : Int //Page ID + //2 : String //Productdata + message.appendString(""); // page link? + message.appendInt(-1); // page id? + + message.appendInt(2); + message.appendString("Il RITORNO di Habburgers! (TUTTI furni nuovi)"); + message.appendString("catalogue/feature_cata_hort_habbergerbundle.png"); + message.appendInt(0); + message.appendString(""); + message.appendInt(-1); + + message.appendInt(3); + message.appendString("Habbolympics"); + message.appendString("catalogue/feature_cata_hort_olympic16.png"); + message.appendInt(0); + message.appendString(""); + message.appendInt(-1); + + message.appendInt(4); + message.appendString("Diventa un Membro HC"); + message.appendString("catalogue/feature_cata_hort_HC_b.png"); + message.appendInt(0); + message.appendString("habbo_club"); + message.appendInt(-1); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontpageLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontpageLayout.java new file mode 100644 index 00000000..bf999366 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/FrontpageLayout.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class FrontpageLayout extends CatalogPage { + + public FrontpageLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) { + message.appendString("frontpage4"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextTwo()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildForumLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildForumLayout.java new file mode 100644 index 00000000..3672cf25 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildForumLayout.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GuildForumLayout extends CatalogPage +{ + public GuildForumLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("guild_forum"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFrontpageLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFrontpageLayout.java new file mode 100644 index 00000000..f31eada9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFrontpageLayout.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GuildFrontpageLayout extends CatalogPage +{ + public GuildFrontpageLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("guild_frontpage"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFurnitureLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFurnitureLayout.java new file mode 100644 index 00000000..a994db34 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/GuildFurnitureLayout.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GuildFurnitureLayout extends CatalogPage +{ + public GuildFurnitureLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("guild_custom_furni"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoDucketsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoDucketsLayout.java new file mode 100644 index 00000000..44e2ba8f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoDucketsLayout.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InfoDucketsLayout extends CatalogPage +{ + public InfoDucketsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("info_duckets"); + message.appendInt(1); + message.appendString(getHeaderImage()); + message.appendInt(1); + message.appendString(getTextOne()); + message.appendInt(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoLoyaltyLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoLoyaltyLayout.java new file mode 100644 index 00000000..0f97b0c4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoLoyaltyLayout.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InfoLoyaltyLayout extends CatalogPage +{ + public InfoLoyaltyLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("info_loyalty"); + message.appendInt(1); + message.appendString(getHeaderImage()); + message.appendInt(1); + message.appendString(getTextOne()); + message.appendInt(0); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoPetsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoPetsLayout.java new file mode 100644 index 00000000..664a7580 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoPetsLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InfoPetsLayout extends CatalogPage +{ + public InfoPetsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("info_pets"); + message.appendInt(2); + message.appendString(getHeaderImage()); + message.appendString(getTeaserImage()); + message.appendInt(3); + message.appendString(getTextOne()); + message.appendString(""); + message.appendString(getTextTeaser()); + message.appendInt(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoRentablesLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoRentablesLayout.java new file mode 100644 index 00000000..d4e42310 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/InfoRentablesLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InfoRentablesLayout extends CatalogPage +{ + public InfoRentablesLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + String[] data = getTextOne().split("\\|\\|"); + message.appendString("info_rentables"); + message.appendInt(1); + message.appendString(getHeaderImage()); + message.appendInt(data.length); + for (String d : data) { + message.appendString(d); + } + message.appendInt(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/LoyaltyVipBuyLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/LoyaltyVipBuyLayout.java new file mode 100644 index 00000000..c8d04ca5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/LoyaltyVipBuyLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class LoyaltyVipBuyLayout extends CatalogPage +{ + public LoyaltyVipBuyLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("loyalty_vip_buy"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceLayout.java new file mode 100644 index 00000000..57a3786d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceLayout.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class MarketplaceLayout extends CatalogPage +{ + public MarketplaceLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("marketplace"); + message.appendInt(0); + message.appendInt(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceOwnItems.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceOwnItems.java new file mode 100644 index 00000000..aada7a1e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/MarketplaceOwnItems.java @@ -0,0 +1,24 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class MarketplaceOwnItems extends CatalogPage +{ + public MarketplaceOwnItems(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("marketplace_own_items"); + message.appendInt(0); + message.appendInt(0); + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetCustomizationLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetCustomizationLayout.java new file mode 100644 index 00000000..0944be35 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetCustomizationLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PetCustomizationLayout extends CatalogPage +{ + public PetCustomizationLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("petcustomization"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets2Layout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets2Layout.java new file mode 100644 index 00000000..1f0fd39b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets2Layout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Pets2Layout extends CatalogPage +{ + public Pets2Layout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("pets2"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(4); + message.appendString(super.getTextOne()); + message.appendString(super.getTextTwo()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets3Layout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets3Layout.java new file mode 100644 index 00000000..bdcd86f0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/Pets3Layout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Pets3Layout extends CatalogPage +{ + public Pets3Layout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("pets3"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(4); + message.appendString(super.getTextOne()); + message.appendString(super.getTextTwo()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetsLayout.java new file mode 100644 index 00000000..cf35e04f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/PetsLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PetsLayout extends CatalogPage +{ + public PetsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("pets"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(4); + message.appendString(super.getTextOne()); + message.appendString(super.getTextTwo()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ProductPage1Layout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ProductPage1Layout.java new file mode 100644 index 00000000..eb5c2c0f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/ProductPage1Layout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ProductPage1Layout extends CatalogPage +{ + public ProductPage1Layout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("productpage1"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(4); + message.appendString(super.getTextOne()); + message.appendString(super.getTextTwo()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecentPurchasesLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecentPurchasesLayout.java new file mode 100644 index 00000000..48a13e80 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecentPurchasesLayout.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RecentPurchasesLayout extends CatalogPage +{ + public RecentPurchasesLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) { + message.appendString("default_3x3"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerInfoLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerInfoLayout.java new file mode 100644 index 00000000..8da70fb4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerInfoLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RecyclerInfoLayout extends CatalogPage +{ + public RecyclerInfoLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("recycler_info"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerLayout.java new file mode 100644 index 00000000..a863b34c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerLayout.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RecyclerLayout extends CatalogPage +{ + public RecyclerLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("recycler"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(1); + message.appendString(super.getTextOne()); + message.appendInt(-1); + message.appendBoolean(false); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerPrizesLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerPrizesLayout.java new file mode 100644 index 00000000..67332037 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RecyclerPrizesLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RecyclerPrizesLayout extends CatalogPage +{ + public RecyclerPrizesLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("recycler_prizes"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomAdsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomAdsLayout.java new file mode 100644 index 00000000..647a8947 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomAdsLayout.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RoomAdsLayout extends CatalogPage +{ + public RoomAdsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("roomads"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(2); + message.appendString(super.getTextOne()); + message.appendString(super.getTextTwo()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomBundleLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomBundleLayout.java new file mode 100644 index 00000000..e0db3f18 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/RoomBundleLayout.java @@ -0,0 +1,288 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer; +import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseUnavailableComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.navigator.CanCreateRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.Map; + +public class RoomBundleLayout extends SingleBundle +{ + public int roomId = 0; + public Room room; + private int lastUpdate = 0; + private boolean loaded = false; + + public RoomBundleLayout(ResultSet set) throws SQLException + { + super(set); + + this.roomId = set.getInt("room_id"); + } + + @Override + public TIntObjectMap getCatalogItems() + { + if(Emulator.getIntUnixTimestamp() - this.lastUpdate < 120) + { + this.lastUpdate = Emulator.getIntUnixTimestamp(); + return super.getCatalogItems(); + } + + if(this.room == null) + { + if (this.roomId > 0) + { + this.room = Emulator.getGameEnvironment().getRoomManager().loadRoom(this.roomId); + + if (this.room != null) + this.room.preventUnloading = true; + } + else + { + Emulator.getLogging().logErrorLine("No room id specified for room bundle " + this.getPageName() + "(" + this.getId() + ")"); + } + } + + if(this.room == null) + { + return super.getCatalogItems(); + } + + final CatalogItem[] item = {null}; + + super.getCatalogItems().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CatalogItem object) + { + if(object == null) + return true; + + item[0] = object; + return false; + } + }); + + if(item[0] != null) + { + item[0].getBundle().clear(); + + THashMap items = new THashMap(); + + for(HabboItem i : this.room.getFloorItems()) + { + if(!items.contains(i.getBaseItem())) + { + items.put(i.getBaseItem(), 0); + } + + items.put(i.getBaseItem(), items.get(i.getBaseItem()) + 1); + } + + for(HabboItem i : this.room.getWallItems()) + { + if(!items.contains(i.getBaseItem())) + { + items.put(i.getBaseItem(), 0); + } + + items.put(i.getBaseItem(), items.get(i.getBaseItem()) + 1); + } + + if (!item[0].getExtradata().isEmpty()) + { + items.put(Emulator.getGameEnvironment().getItemManager().getItem(Integer.valueOf(item[0].getExtradata())), 1); + } + + String data = ""; + + for(Map.Entry set : items.entrySet()) + { + data += set.getKey().getId() + ":" + set.getValue() + ";"; + } + + item[0].setItemId(data); + item[0].loadBundle(); + } + + return super.getCatalogItems(); + } + + public void loadItems(Room room) + { + if(this.room != null) + { + this.room.preventUnloading = false; + } + + this.room = room; + this.room.preventUnloading = true; + this.getCatalogItems(); + this.loaded = true; + } + + public void buyRoom(Habbo habbo) + { + this.buyRoom(habbo, habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername()); + } + + public void buyRoom(Habbo habbo, int userId, String userName) + { + if (!this.loaded) + { + this.loadItems(Emulator.getGameEnvironment().getRoomManager().loadRoom(this.roomId)); + } + + if (habbo != null) + { + int count = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(habbo).size(); + int max = habbo.getHabboStats().hasActiveClub() ? Emulator.getConfig().getInt("hotel.max.rooms.vip") : Emulator.getConfig().getInt("hotel.max.rooms.user"); + + if (count >= max) + { + habbo.getClient().sendResponse(new CanCreateRoomComposer(count, max)); + return; + } + } + + if(this.room == null) + return; + + this.room.save(); + + for(HabboItem item : this.room.getFloorItems()) + { + item.run(); + } + + for(HabboItem item : this.room.getWallItems()) + { + item.run(); + } + + this.getCatalogItems(); + int roomId = 0; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO rooms (owner_id, owner_name, name, description, model, password, state, users_max, category, paper_floor, paper_wall, paper_landscape, thickness_wall, thickness_floor, moodlight_data, override_model) (SELECT ?, ?, name, description, model, password, state, users_max, category, paper_floor, paper_wall, paper_landscape, thickness_wall, thickness_floor, moodlight_data, override_model FROM rooms WHERE id = ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, userId); + statement.setString(2, userName); + statement.setInt(3, this.room.getId()); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + roomId = set.getInt(1); + } + } + } + + if (roomId == 0) + return; + + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO items (user_id, room_id, item_id, wall_pos, x, y, z, rot, extra_data, wired_data, limited_data, guild_id) (SELECT ?, ?, item_id, wall_pos, x, y, z, rot, extra_data, wired_data, ?, ? FROM items WHERE room_id = ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, userId); + statement.setInt(2, roomId); + statement.setString(3, "0:0"); + statement.setInt(4, 0); + statement.setInt(5, this.room.getId()); + statement.execute(); + } + + if (this.room.hasCustomLayout()) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO room_models_custom (id, name, door_x, door_y, door_dir, heightmap) (SELECT ?, ?, door_x, door_y, door_dir, heightmap FROM room_models_custom WHERE id = ? LIMIT 1)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, roomId); + statement.setString(2, "custom_" + roomId); + statement.setInt(3, this.room.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + if (Emulator.getConfig().getBoolean("bundle.bots.enabled")) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO bots (user_id, room_id, name, motto, figure, gender, x, y, z, chat_lines, chat_auto, chat_random, chat_delay, dance, type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + synchronized (this.room.getCurrentBots()) + { + statement.setInt(1, userId); + statement.setInt(2, roomId); + for (Bot bot : this.room.getCurrentBots().valueCollection()) + { + statement.setString(3, bot.getName()); + statement.setString(4, bot.getMotto()); + statement.setString(5, bot.getFigure()); + statement.setString(6, bot.getGender().name()); + statement.setInt(7, bot.getRoomUnit().getX()); + statement.setInt(8, bot.getRoomUnit().getY()); + statement.setDouble(9, bot.getRoomUnit().getZ()); + String text = ""; + for (String s : bot.getChatLines()) + { + text += s + "\r"; + } + statement.setString(10, text); + statement.setString(11, bot.isChatAuto() ? "1" : "0"); + statement.setString(12, bot.isChatRandom() ? "1" : "0"); + statement.setInt(13, bot.getChatDelay()); + statement.setInt(14, bot.getRoomUnit().getDanceType().getType()); + statement.setString(15, bot.getType()); + statement.addBatch(); + } + } + statement.executeBatch(); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + Room r = Emulator.getGameEnvironment().getRoomManager().loadRoom(roomId); + r.setWallHeight(this.room.getWallHeight()); + r.setFloorSize(this.room.getFloorSize()); + r.setWallPaint(this.room.getWallPaint()); + r.setFloorPaint(this.room.getFloorPaint()); + r.setScore(0); + r.setNeedsUpdate(true); + THashMap keys = new THashMap(); + keys.put("ROOMNAME", r.getName()); + keys.put("ROOMID", r.getId() + ""); + keys.put("OWNER", r.getOwnerName()); + keys.put("image", "${image.library.url}/notifications/room_bundle_" + this.getId() + ".png"); + + if (habbo != null) + { + habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.PURCHASING_ROOM.key, keys)); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SingleBundle.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SingleBundle.java new file mode 100644 index 00000000..77baa8ff --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SingleBundle.java @@ -0,0 +1,30 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SingleBundle extends CatalogPage +{ + public SingleBundle(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("single_bundle"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(""); + message.appendInt(4); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + message.appendString(super.getTextTwo()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SoldLTDItemsLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SoldLTDItemsLayout.java new file mode 100644 index 00000000..28fa8a90 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SoldLTDItemsLayout.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SoldLTDItemsLayout extends CatalogPage +{ + public SoldLTDItemsLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("sold_ltd_items"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SpacesLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SpacesLayout.java new file mode 100644 index 00000000..9aac02ca --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/SpacesLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SpacesLayout extends CatalogPage { + + public SpacesLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("spaces_new"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TraxLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TraxLayout.java new file mode 100644 index 00000000..56dfd6d4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TraxLayout.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TraxLayout extends CatalogPage +{ + public TraxLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("soundmachine"); + message.appendInt(2); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendInt(2); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TrophiesLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TrophiesLayout.java new file mode 100644 index 00000000..01018020 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/TrophiesLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TrophiesLayout extends CatalogPage { + + public TrophiesLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("trophies"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/VipBuyLayout.java b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/VipBuyLayout.java new file mode 100644 index 00000000..6ab0c3e4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/VipBuyLayout.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.catalog.layouts; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class VipBuyLayout extends CatalogPage +{ + public VipBuyLayout(ResultSet set) throws SQLException + { + super(set); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString("vip_buy"); + message.appendInt(3); + message.appendString(super.getHeaderImage()); + message.appendString(super.getTeaserImage()); + message.appendString(super.getSpecialImage()); + message.appendInt(3); + message.appendString(super.getTextOne()); + message.appendString(super.getTextDetails()); + message.appendString(super.getTextTeaser()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java new file mode 100644 index 00000000..780ec838 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java @@ -0,0 +1,595 @@ +package com.eu.habbo.habbohotel.catalog.marketplace; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.catalog.marketplace.RequestOffersEvent; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceBuyErrorComposer; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceCancelSaleComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; +import com.eu.habbo.plugin.events.marketplace.MarketPlaceItemCancelledEvent; +import com.eu.habbo.plugin.events.marketplace.MarketPlaceItemOfferedEvent; +import com.eu.habbo.plugin.events.marketplace.MarketPlaceItemSoldEvent; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * Note: A lot of data in here is not cached in the emulator but rather loaded from the database. + * If you have a big hotel and the marketplace is used frequently this may cause some lagg. + * If you have issues with that please let us know so we can see if we need to modify the Marketplace so + * it caches the data in the Emulator. + */ +public class MarketPlace +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean MARKETPLACE_ENABLED = true; + + //Currency to use. + public static int MARKETPLACE_CURRENCY = 0; + + /** + * @param habbo The Habbo to lookup items for. + * @return The items that are put on marketplace by the given Habbo. + */ + public static THashSet getOwnOffers(Habbo habbo) + { + THashSet offers = new THashSet(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT items_base.type AS type, items.item_id AS base_item_id, items.limited_data AS ltd_data, marketplace_items.* FROM marketplace_items INNER JOIN items ON marketplace_items.item_id = items.id INNER JOIN items_base ON items.item_id = items_base.id WHERE marketplace_items.user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + offers.add(new MarketPlaceOffer(set, true)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return offers; + } + + /** + * Removes an offer from the marketplace. + * @param habbo The Habbo that owns the item. + * @param offerId The offer id. + */ + public static void takeBackItem(Habbo habbo, int offerId) + { + MarketPlaceOffer offer = habbo.getInventory().getOffer(offerId); + + if (!Emulator.getPluginManager().fireEvent(new MarketPlaceItemCancelledEvent(offer)).isCancelled()) + { + takeBackItem(habbo, offer); + } + } + + /** + * Removes an offer from the marketplace. + * @param habbo The Habbo that owns the item. + * @param offer The offer. + */ + private static void takeBackItem(Habbo habbo, MarketPlaceOffer offer) + { + if(offer != null && habbo.getInventory().getMarketplaceItems().contains(offer)) + { + RequestOffersEvent.cachedResults.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement ownerCheck = connection.prepareStatement("SELECT user_id FROM marketplace_items WHERE id = ?")) + { + ownerCheck.setInt(1, offer.getOfferId()); + try (ResultSet ownerSet = ownerCheck.executeQuery()) + { + ownerSet.last(); + + if (ownerSet.getRow() == 0) + { + return; + } + + habbo.getInventory().removeMarketplaceOffer(offer); + + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM marketplace_items WHERE id = ? AND state != 2")) + { + statement.setInt(1, offer.getOfferId()); + int count = statement.executeUpdate(); + + if (count != 0) + { + try (PreparedStatement updateItems = connection.prepareStatement("UPDATE items SET user_id = ? WHERE id = ? LIMIT 1")) + { + updateItems.setInt(1, habbo.getHabboInfo().getId()); + updateItems.setInt(2, offer.getSoldItemId()); + updateItems.execute(); + + try (PreparedStatement selectItem = connection.prepareStatement("SELECT * FROM items WHERE id = ? LIMIT 1")) + { + selectItem.setInt(1, offer.getSoldItemId()); + try (ResultSet set = selectItem.executeQuery()) + { + while (set.next()) + { + HabboItem item = Emulator.getGameEnvironment().getItemManager().loadHabboItem(set); + habbo.getInventory().getItemsComponent().addItem(item); + habbo.getClient().sendResponse(new MarketplaceCancelSaleComposer(offer, true)); + habbo.getClient().sendResponse(new AddHabboItemComposer(item)); + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + } + } + } + } + } + } + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + habbo.getClient().sendResponse(new MarketplaceCancelSaleComposer(offer, false)); + } + } + } + + /** + * Searches the marketplace for specific items in the given price range. + * @param minPrice The minimum price of the offers. + * @param maxPrice The maximum price of the offers + * @param search The search criteria for the offers. + * @param sort The sort criteria for the offers. + * @return The result of the search. + */ + public static List getOffers(int minPrice, int maxPrice, String search, int sort) + { + List offers = new ArrayList<>(10); + + //String query = "SELECT items_base.type AS type, items.item_id AS base_item_id, items.limited_data AS ltd_data, marketplace_items.*, COUNT(*) as number, AVG(price) as avg, MIN(price) as minPrice FROM marketplace_items INNER JOIN items ON marketplace_items.item_id = items.id INNER JOIN items_base ON items.item_id = items_base.id WHERE state = ? AND timestamp >= ?"; + /*String query = "SELECT " + + "B.* FROM marketplace_items a " + + "INNER JOIN (SELECT " + + "items_base.type AS type, " + + "items.item_id AS base_item_id, " + + "items.limited_data AS ltd_data, " + + "marketplace_items.*, " + + "AVG(price) as avg, " + + "MIN(marketplace_items.price) as minPrice, " + + "MAX(marketplace_items.price) as maxPrice, " + + "COUNT(*) as number " + + "FROM marketplace_items " + + "INNER JOIN items ON marketplace_items.item_id = items.id " + + "INNER JOIN items_base ON items.item_id = items_base.id " + + "WHERE state = 1 AND timestamp > ?";*/ + + String query = "SELECT " + + "B.* FROM marketplace_items a " + + "INNER JOIN (" + + "SELECT " + + "items.item_id AS base_item_id, " + + "items.limited_data AS ltd_data, " + + "marketplace_items.*, " + + "AVG(price) as avg, " + + "MIN(marketplace_items.price) as minPrice, " + + "MAX(marketplace_items.price) as maxPrice, " + + "COUNT(*) as number, " + + //"SUM(DATE(from_unixtime(timestamp)) >= (NOW() - INTERVAL 1 DAY)) as offer_count_today, " + + "(SELECT COUNT(*) FROM marketplace_items c INNER JOIN items as items_b ON c.item_id = items_b.id WHERE state = 2 AND items_b.item_id = base_item_id AND DATE(from_unixtime(sold_timestamp)) = CURDATE()) as sold_count_today " + + "FROM marketplace_items " + + "INNER JOIN items ON marketplace_items.item_id = items.id " + + "WHERE state = 1 AND timestamp > ?"; + if(minPrice > 0) + { + query += " AND CEIL(price + (price / 100)) >= " + minPrice; + } + if(maxPrice > 0 && maxPrice > minPrice) + { + query += " AND CEIL(price + (price / 100)) <= " + maxPrice; + } + if(search.length() > 0) + { + query += " AND items_base.public_name LIKE ?"; + } + + query += " GROUP BY base_item_id, ltd_data"; + + switch (sort) + { + case 6: + query += " ORDER BY number ASC"; + break; + case 5: + query += " ORDER BY number DESC"; + break; + case 4: + query += " ORDER BY sold_count_today ASC"; + break; + case 3: + query += " ORDER BY sold_count_today DESC"; + break; + case 2: + query += " ORDER BY minPrice ASC"; + break; + default: + case 1: + query += " ORDER BY minPrice DESC"; + break; + } + if (sort == 3) + { + + } + if (sort == 2) + { + } + else + { + } + + query += ")"; + + query += " AS B ON a.id = B.id"; + + query += " LIMIT 100"; + + System.out.println(query); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement(query)) + { + statement.setInt(1, Emulator.getIntUnixTimestamp() - 172800); + if(search.length() > 0) + statement.setString(3, "%"+search+"%"); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + offers.add(new MarketPlaceOffer(set, false)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return offers; + } + + /** + * Serializes the item info. + * @param itemId The item id that should be looked up. + * @param message The message the data should be appended to. + */ + public static void serializeItemInfo(int itemId, ServerMessage message) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT avg(price) as price, COUNT(*) as sold, (datediff(NOW(), DATE(from_unixtime(timestamp)))) as day FROM marketplace_items INNER JOIN items ON items.id = marketplace_items.item_id INNER JOIN items_base ON items.item_id = items_base.id WHERE items.limited_data = '0:0' AND state = 2 AND items_base.sprite_id = ? AND DATE(from_unixtime(timestamp)) >= NOW() - INTERVAL 30 DAY GROUP BY DATE(from_unixtime(timestamp))")) + { + statement.setInt(1, itemId); + + message.appendInt(avarageLastXDays(itemId, 7)); + message.appendInt(itemsOnSale(itemId)); + message.appendInt(30); + + try (ResultSet set = statement.executeQuery()) + { + set.last(); + message.appendInt(set.getRow()); + set.beforeFirst(); + + while (set.next()) + { + message.appendInt(-set.getInt("day")); + message.appendInt(MarketPlace.calculateCommision(set.getInt("price"))); + message.appendInt(set.getInt("sold")); + } + } + + message.appendInt(1); + message.appendInt(itemId); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * @param baseItemId The base item id that should be looked up. (items_base table) + * @return The amount of items of this type are on sale. + */ + public static int itemsOnSale(int baseItemId) + { + int number = 0; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) as number, AVG(price) as avg FROM marketplace_items INNER JOIN items ON marketplace_items.item_id = items.id INNER JOIN items_base ON items.item_id = items_base.id WHERE state = 1 AND timestamp >= ? AND items_base.sprite_id = ?")) + { + statement.setInt(1, Emulator.getIntUnixTimestamp() - 172800); + statement.setInt(2, baseItemId); + try (ResultSet set = statement.executeQuery()) + { + set.first(); + number = set.getInt("number"); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return number; + } + + /** + * @param baseItemId The base item id that should be looked up. (items_base table) + * @param days The amount of days. + * @return The average amount of coins this item was over the given amount of days. + */ + private static int avarageLastXDays(int baseItemId, int days) + { + int avg = 0; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT AVG(price) as avg FROM marketplace_items INNER JOIN items ON marketplace_items.item_id = items.id INNER JOIN items_base ON items.item_id = items_base.id WHERE state = 2 AND DATE(from_unixtime(timestamp)) >= NOW() - INTERVAL ? DAY AND items_base.sprite_id = ?")) + { + statement.setInt(1, days); + statement.setInt(2, baseItemId); + + try (ResultSet set = statement.executeQuery()) + { + set.first(); + avg = set.getInt("avg"); + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return calculateCommision(avg); + } + + /** + * Buys an item from the marketplace. + * @param offerId The offer id that should be bought. + * @param client The GameClient that buys it. + */ + public static void buyItem(int offerId, GameClient client) + { + RequestOffersEvent.cachedResults.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM marketplace_items WHERE id = ? LIMIT 1")) + { + statement.setInt(1, offerId); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + try (PreparedStatement itemStatement = connection.prepareStatement("SELECT * FROM items WHERE id = ? LIMIT 1")) + { + itemStatement.setInt(1, set.getInt("item_id")); + try (ResultSet itemSet = itemStatement.executeQuery()) + { + itemSet.first(); + + if (itemSet.getRow() > 0) + { + int price = MarketPlace.calculateCommision(set.getInt("price")); + if (set.getInt("state") != 1) + { + sendErrorMessage(client, set.getInt("item_id"), offerId); + } + else if ((MARKETPLACE_CURRENCY == 0 && price > client.getHabbo().getHabboInfo().getCredits()) || (MARKETPLACE_CURRENCY > 0 && price > client.getHabbo().getHabboInfo().getCurrencyAmount(MARKETPLACE_CURRENCY))) + { + client.sendResponse(new MarketplaceBuyErrorComposer(MarketplaceBuyErrorComposer.NOT_ENOUGH_CREDITS, 0, offerId, price)); + } + else + { + try (PreparedStatement updateOffer = connection.prepareStatement("UPDATE marketplace_items SET state = 2, sold_timestamp = ? WHERE id = ?")) + { + updateOffer.setInt(1, Emulator.getIntUnixTimestamp()); + updateOffer.setInt(2, offerId); + updateOffer.execute(); + } + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(set.getInt("user_id")); + HabboItem item = Emulator.getGameEnvironment().getItemManager().loadHabboItem(itemSet); + + MarketPlaceItemSoldEvent event = new MarketPlaceItemSoldEvent(habbo, client.getHabbo(), item, set.getInt("price")); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + { + return; + } + event.price = calculateCommision(event.price); + + item.setUserId(client.getHabbo().getHabboInfo().getId()); + item.needsUpdate(true); + Emulator.getThreading().run(item); + + client.getHabbo().getInventory().getItemsComponent().addItem(item); + + if (MARKETPLACE_CURRENCY == 0) + { + client.getHabbo().getHabboInfo().addCredits(-event.price); + } + else + { + client.getHabbo().givePoints(MARKETPLACE_CURRENCY, -event.price); + } + + client.sendResponse(new UserCreditsComposer(client.getHabbo())); + client.sendResponse(new AddHabboItemComposer(item)); + client.sendResponse(new InventoryRefreshComposer()); + client.sendResponse(new MarketplaceBuyErrorComposer(MarketplaceBuyErrorComposer.REFRESH, 0, offerId, price)); + + if (habbo != null) + { + habbo.getInventory().getOffer(offerId).setState(MarketPlaceState.SOLD); + } + } + } + } + } + } + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Sends an error message to the client. If the items was sold out or + * if the previous one isn't on sale anymore then it shows the new price. + * @param client The GameClient the messages should be send to. + * @param baseItemId The Item id data selected from the marketplace_offers table. + * @param offerId The id of the offer that was bought. + * @throws SQLException + */ + public static void sendErrorMessage(GameClient client, int baseItemId, int offerId) throws SQLException + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT marketplace_items.*, COUNT( * ) AS count\n" + + "FROM marketplace_items\n" + + "INNER JOIN items ON marketplace_items.item_id = items.id\n" + + "INNER JOIN items_base ON items.item_id = items_base.id\n" + + "WHERE items_base.sprite_id = ( \n" + + "SELECT items_base.sprite_id\n" + + "FROM items_base\n" + + "WHERE items_base.id = ? LIMIT 1)\n" + + "ORDER BY price DESC\n" + + "LIMIT 1")) + { + statement.setInt(1, baseItemId); + try (ResultSet countSet = statement.executeQuery()) + { + countSet.last(); + if (countSet.getRow() == 0) + client.sendResponse(new MarketplaceBuyErrorComposer(MarketplaceBuyErrorComposer.SOLD_OUT, 0, offerId, 0)); + else + { + countSet.first(); + client.sendResponse(new MarketplaceBuyErrorComposer(MarketplaceBuyErrorComposer.UPDATES, countSet.getInt("count"), countSet.getInt("id"), MarketPlace.calculateCommision(countSet.getInt("price")))); + } + } + } + } + + /** + * Sells an item to the marketplace. + * @param client The GameClient that sells it. + * @param item The HabboItem that is being sold. + * @param price The price it is being sold for. + * @return Whether it has succesfully been posted to the marketplace. + */ + public static boolean sellItem(GameClient client, HabboItem item, int price) + { + if(item == null || client == null) + return false; + + if (!item.getBaseItem().allowMarketplace() || price < 0) + return false; + + MarketPlaceItemOfferedEvent event = new MarketPlaceItemOfferedEvent(client.getHabbo(), item, price); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + { + return false; + } + + RequestOffersEvent.cachedResults.clear(); + try + { + MarketPlaceOffer offer = new MarketPlaceOffer(event.item, event.price, client.getHabbo()); + + if(offer != null) + { + client.getHabbo().getInventory().addMarketplaceOffer(offer); + + client.getHabbo().getInventory().getItemsComponent().removeHabboItem(event.item); + client.sendResponse(new RemoveHabboItemComposer(event.item.getId())); + client.sendResponse(new InventoryRefreshComposer()); + item.setUserId(-1); + item.needsUpdate(true); + Emulator.getThreading().run(item); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return true; + } + + /** + * Claims all the credits that are gained from selling items on the marketplace. + * @param client The GameClient the credits should be checked for. + */ + public static void getCredits(GameClient client) + { + int credits = 0; + + THashSet offers = new THashSet(); + offers.addAll(client.getHabbo().getInventory().getMarketplaceItems()); + + for(MarketPlaceOffer offer : offers) + { + if(offer.getState().equals(MarketPlaceState.SOLD)) + { + client.getHabbo().getInventory().removeMarketplaceOffer(offer); + credits += offer.getPrice(); + removeUser(offer); + offer.needsUpdate(true); + Emulator.getThreading().run(offer); + } + } + + offers.clear(); + + if (MARKETPLACE_CURRENCY == 0) + { + client.getHabbo().getHabboInfo().addCredits(credits); + } + else + { + client.getHabbo().givePoints(MARKETPLACE_CURRENCY, credits); + } + client.sendResponse(new UserCreditsComposer(client.getHabbo())); + } + + private static void removeUser(MarketPlaceOffer offer) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE marketplace_items SET user_id = ? WHERE id = ?")) + { + statement.setInt(1, -1); + statement.setInt(2, offer.getOfferId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Calculates the commission that is being added for the given price. + * @param price The price to calculate the commission for. + * @return The new price including the commission. + */ + public static int calculateCommision(int price) + { + return price + (int)Math.ceil(price / 100.0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java new file mode 100644 index 00000000..52c87d58 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java @@ -0,0 +1,201 @@ +package com.eu.habbo.habbohotel.catalog.marketplace; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +import java.sql.*; + +public class MarketPlaceOffer implements Runnable +{ + private int offerId; + private Item baseItem; + private int itemId; + private int price; + private int limitedStack; + private int limitedNumber; + private int timestamp = Emulator.getIntUnixTimestamp(); + private int soldTimestamp = 0; + private MarketPlaceState state = MarketPlaceState.OPEN; + private boolean needsUpdate = false; + + public int avarage; + public int count; + + public MarketPlaceOffer(ResultSet set, boolean privateOffer) throws SQLException + { + this.offerId = set.getInt("id"); + this.price = set.getInt("price"); + this.timestamp = set.getInt("timestamp"); + this.soldTimestamp = set.getInt("sold_timestamp"); + this.baseItem = Emulator.getGameEnvironment().getItemManager().getItem(set.getInt("base_item_id")); + this.state = MarketPlaceState.getType(set.getInt("state")); + this.itemId = set.getInt("item_id"); + + if(!set.getString("ltd_data").split(":")[1].equals("0")) + { + this.limitedStack = Integer.valueOf(set.getString("ltd_data").split(":")[0]); + this.limitedNumber = Integer.valueOf(set.getString("ltd_data").split(":")[1]); + } + + if(!privateOffer) + { + this.avarage = set.getInt("avg"); + this.count = set.getInt("number"); + this.price = set.getInt("minPrice"); + } + } + + public MarketPlaceOffer(HabboItem item, int price, Habbo habbo) throws SQLException + { + this.price = price; + this.baseItem = item.getBaseItem(); + this.itemId = item.getId(); + if(item.getLimitedSells() > 0) + { + this.limitedNumber = item.getLimitedSells(); + this.limitedStack = item.getLimitedStack(); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO marketplace_items (item_id, user_id, price, timestamp, state) VALUES (?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, item.getId()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.setInt(3, this.price); + statement.setInt(4, this.timestamp); + statement.setString(5, this.state.getState() + ""); + statement.execute(); + + try (ResultSet id = statement.getGeneratedKeys()) + { + while (id.next()) + { + this.offerId = id.getInt(1); + } + } + } + } + + public int getOfferId() + { + return this.offerId; + } + + public void setOfferId(int offerId) + { + this.offerId = offerId; + } + + public int getItemId() + { + return this.baseItem.getSpriteId(); + } + + public int getPrice() + { + return this.price; + } + + public MarketPlaceState getState() + { + return this.state; + } + + public void setState(MarketPlaceState state) + { + this.state = state; + } + + public int getTimestamp() + { + return this.timestamp; + } + + public int getSoldTimestamp() + { + return this.soldTimestamp; + } + + public void setSoldTimestamp(int soldTimestamp) + { + this.soldTimestamp = soldTimestamp; + } + + public int getLimitedStack() + { + return this.limitedStack; + } + + public int getLimitedNumber() + { + return this.limitedNumber; + } + + public int getSoldItemId() + { + return this.itemId; + } + + public void needsUpdate(boolean value) + { + this.needsUpdate = value; + } + + public int getType() + { + if (this.limitedStack > 0) + { + return 3; + } + + return this.baseItem.getType().equals(FurnitureType.WALL) ? 2 : 1; + } + + @Override + public void run() + { + if(this.needsUpdate) + { + this.needsUpdate = false; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE marketplace_items SET state = ?, sold_timestamp = ? WHERE id = ?")) + { + statement.setInt(1, this.state.getState()); + statement.setInt(2, this.soldTimestamp); + statement.setInt(3, this.offerId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public static void insert(MarketPlaceOffer offer, Habbo habbo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO marketplace_items VALUES (?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, offer.getItemId()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.setInt(3, offer.getPrice()); + statement.setInt(4, offer.getTimestamp()); + statement.setInt(5, offer.getSoldTimestamp()); + statement.setString(6, offer.getState().getState() + ""); + statement.execute(); + + try (ResultSet id = statement.getGeneratedKeys()) + { + while (id.next()) + { + offer.setOfferId(id.getInt(1)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceState.java b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceState.java new file mode 100644 index 00000000..6ff0d521 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceState.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.catalog.marketplace; + +public enum MarketPlaceState +{ + /** + * When the offer is available to be bought. + */ + OPEN(1), + + /** + * When the offer has been sold. + */ + SOLD(2), + + /** + * When the offer has been expired. + * When the offer has been cancelled. + */ + CLOSED(3); + + private final int state; + + MarketPlaceState(int state) + { + this.state = state; + } + + public int getState() + { + return this.state; + } + + /** + * Gets the offer state for the type. + * @param type The type to look for. + * @return The offer state defaults to CLOSED + */ + public static MarketPlaceState getType(int type) + { + switch(type) + { + case 1: return OPEN; + case 2: return SOLD; + case 3: return CLOSED; + } + + return CLOSED; + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/AboutCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/AboutCommand.java new file mode 100644 index 00000000..010c2127 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/AboutCommand.java @@ -0,0 +1,58 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +import java.util.concurrent.TimeUnit; + +/** + * This is part of the open source license. Modification is prohobited. + * If you don't like it, use another emulator. Or otherwise deal with it. + * Respect the authors work. Don't be a dick. + */ +public class AboutCommand extends Command +{ + public AboutCommand() + { + super(null, new String[]{ "about", "info", "online", "server" }); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) { + Emulator.getRuntime().gc(); + + int seconds = Emulator.getIntUnixTimestamp() - Emulator.getTimeStarted(); + int day = (int)TimeUnit.SECONDS.toDays(seconds); + long hours = TimeUnit.SECONDS.toHours(seconds) - (day *24); + long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds)* 60); + long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) *60); + + String message = "" + Emulator.version + "\r\n"; + + if (Emulator.getConfig().getBoolean("info.shown", true)) + { + message += "Hotel Statistics\r" + + "- Online Users: " + Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "\r" + + "- Active Rooms: " + Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + "\r" + + "- Shop: " + Emulator.getGameEnvironment().getCatalogManager().catalogPages.size() + " pages and " + CatalogManager.catalogItemAmount + " items. \r" + + "- Furni: " + Emulator.getGameEnvironment().getItemManager().getItems().size() + " item definitions" + "\r" + + "\n" + + "Server Statistics\r" + + "- Uptime: " + day + (day > 1 ? " days, " : " day, ") + hours + (hours > 1 ? " hours, " : " hour, ") + minute + (minute > 1 ? " minutes, " : " minute, ") + second + (second > 1 ? " seconds!" : " second!") + "\r" + + "- RAM Usage: " + (Emulator.getRuntime().totalMemory() - Emulator.getRuntime().freeMemory()) / (1024 * 1024) + "/" + (Emulator.getRuntime().freeMemory()) / (1024 * 1024) + "MB\r" + + "- CPU Cores: " + Emulator.getRuntime().availableProcessors() + "\r" + + "- Total Memory: " + Emulator.getRuntime().maxMemory() / (1024 * 1024) + "MB" + "\r\n"; + } + + message += "\r" + + + "Thanks for using Arcturus. Report issues on the forums. http://arcturus.wf \r\r" + + " - The General"; + + gameClient.sendResponse(new GenericAlertComposer(message)); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/AlertCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/AlertCommand.java new file mode 100644 index 00000000..7e34ac72 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/AlertCommand.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class AlertCommand extends Command { + + public AlertCommand() + { + super("cmd_alert", Emulator.getTexts().getValue("commands.keys.cmd_alert").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_alert.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + if(params.length < 3) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_alert.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + + String targetUsername = params[1]; + String message = ""; + + for(int i = 2; i < params.length; i++) + { + message += (params[i] + " "); + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(targetUsername); + + if (habbo != null) { + habbo.getClient().sendResponse(new GenericAlertComposer(message + "\r\n -" + gameClient.getHabbo().getHabboInfo().getUsername())); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_alert.message_send").replace("%user%", targetUsername), RoomChatMessageBubbles.ALERT); + } else { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_alert.user_offline").replace("%user%", targetUsername), RoomChatMessageBubbles.ALERT); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/AllowTradingCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/AllowTradingCommand.java new file mode 100644 index 00000000..e0ac75ef --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/AllowTradingCommand.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.users.Habbo; +import java.sql.Connection; +import java.sql.PreparedStatement; + +public class AllowTradingCommand extends Command +{ + public AllowTradingCommand() + { + super("cmd_allow_trading", Emulator.getTexts().getValue("commands.keys.cmd_allow_trading").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_allow_trading.forgot_username")); + return true; + } + + if (params.length == 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_allow_trading.forgot_trade").replace("%username%", params[1])); + return true; + } + + if (params[2].equalsIgnoreCase(Emulator.getTexts().getValue("generic.yes")) || params[2].equalsIgnoreCase(Emulator.getTexts().getValue("generic.no"))) + { + String username = params[1]; + boolean enabled = params[2].equalsIgnoreCase(Emulator.getTexts().getValue("generic.yes")); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(username); + + if (habbo != null) + { + habbo.getHabboStats().allowTrade = enabled; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_allow_trading." + (enabled ? "enabled" : "disabled")).replace("%username%", params[1])); + return true; + } + else + { + boolean found = false; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_settings INNER JOIN users ON users.id = users_settings.id SET can_trade = ? WHERE users.username LIKE ?")) + { + statement.setString(1, enabled ? "1" : "0"); + statement.setString(2, username); + found = statement.executeUpdate() > 0; + } + + if (!found) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_allow_trading.user_not_found").replace("%username%", params[1])); + return true; + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_allow_trading." + (enabled ? "enabled" : "disabled")).replace("%username%", params[1])); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_allow_trading.incorrect_setting").replace("%enabled%", Emulator.getTexts().getValue("generic.yes")).replace("%disabled%", Emulator.getTexts().getValue("generic.no"))); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ArcturusCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ArcturusCommand.java new file mode 100644 index 00000000..47869a63 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ArcturusCommand.java @@ -0,0 +1,30 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class ArcturusCommand extends Command +{ + public ArcturusCommand() + { + super(null, new String[]{ "arcturus", "emulator" }); + } + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + gameClient.getHabbo().whisper("This hotel is powered by Arcturus Emulator! \r" + + "Cet hôtel est alimenté par Arcturus émulateur! \r" + + "Dit hotel draait op Arcturus Emulator! \r" + + "Este hotel está propulsado por Arcturus emulador! \r" + + "Hotellet drivs av Arcturus Emulator! \r" + + "Das Hotel gehört zu Arcturus Emulator betrieben!" + , RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/BadgeCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/BadgeCommand.java new file mode 100644 index 00000000..ec6750c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/BadgeCommand.java @@ -0,0 +1,112 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; +import gnu.trove.map.hash.THashMap; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class BadgeCommand extends Command +{ + public BadgeCommand() + { + super("cmd_badge", Emulator.getTexts().getValue("commands.keys.cmd_badge").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_badge.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + if(params.length == 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_badge.forgot_badge").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(params.length == 3) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(habbo != null) + { + if(habbo.getInventory().getBadgesComponent().hasBadge(params[2])) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_badge.already_owned").replace("%user%", params[1]).replace("%badge%", params[2]), RoomChatMessageBubbles.ALERT); + return true; + } + + HabboBadge badge = new HabboBadge(0, params[2], 0, habbo); + + badge.run(); + + habbo.getInventory().getBadgesComponent().addBadge(badge); + habbo.getClient().sendResponse(new AddUserBadgeComposer(badge)); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_badge.given").replace("%user%", params[1]).replace("%badge%", params[2]), RoomChatMessageBubbles.ALERT); + + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}album1584/" + badge.getCode() + ".gif"); + keys.put("message", Emulator.getTexts().getValue("commands.generic.cmd_badge.received")); + habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys)); + return true; + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + boolean found = false; + + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(slot_id) FROM users_badges INNER JOIN users ON users.id = user_id WHERE users.username = ? AND badge_code = ? LIMIT 1")) + { + statement.setString(1, params[1]); + statement.setString(2, params[2]); + try (ResultSet set = statement.executeQuery()) + { + found = set.next(); + } + } + + if(found) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_badge.already_owns").replace("%user%", params[1]).replace("%badge%", params[2]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO users_badges VALUES (null, (SELECT id FROM users WHERE username = ? LIMIT 1), 0, ?)")) + { + statement.setString(1, params[1]); + statement.setString(2, params[2]); + statement.execute(); + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_badge.given").replace("%user%", params[1]).replace("%badge%", params[2]), RoomChatMessageBubbles.ALERT); + return true; + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/BanCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/BanCommand.java new file mode 100644 index 00000000..9410ee73 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/BanCommand.java @@ -0,0 +1,106 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.modtool.ModToolBanType; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class BanCommand extends Command +{ + public BanCommand() + { + super("cmd_ban", Emulator.getTexts().getValue("commands.keys.cmd_ban").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.forgot_user"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(params.length < 3) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.forgot_time"), RoomChatMessageBubbles.ALERT); + return true; + } + + int banTime; + try + { + banTime = Integer.valueOf(params[2]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.invalid_time"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(banTime < 600) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.time_to_short"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(params[1].toLowerCase().equals(gameClient.getHabbo().getHabboInfo().getUsername().toLowerCase())) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.ban_self"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo t = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + HabboInfo target = null; + if (t != null) + { + target = t.getHabboInfo(); + } + else + { + target = HabboManager.getOfflineHabboInfo(params[1]); + } + + if (target == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.user_offline"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (target.getRank().getId() >= gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.target_rank_higher"), RoomChatMessageBubbles.ALERT); + return true; + } + + + String reason = ""; + + if(params.length > 3) + { + for(int i = 3; i < params.length; i++) + { + reason += params[i] + " "; + } + } + + + try + { + ModToolBan ban = Emulator.getGameEnvironment().getModToolManager().ban(target.getId(), gameClient.getHabbo(), reason, banTime, ModToolBanType.ACCOUNT, -1).get(0); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_ban.ban_issued").replace("%user%", target.getUsername()).replace("%time%", ban.expireDate - Emulator.getIntUnixTimestamp() + "").replace("%reason%", ban.reason), RoomChatMessageBubbles.ALERT); + } + catch (Exception e) + { + + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/BlockAlertCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/BlockAlertCommand.java new file mode 100644 index 00000000..958238f8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/BlockAlertCommand.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class BlockAlertCommand extends Command +{ + public BlockAlertCommand() + { + super("cmd_blockalert", Emulator.getTexts().getValue("commands.keys.cmd_blockalert").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + gameClient.getHabbo().getHabboStats().blockStaffAlerts = !gameClient.getHabbo().getHabboStats().blockStaffAlerts; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_blockalert").replace("%state%", (gameClient.getHabbo().getHabboStats().blockStaffAlerts ? Emulator.getTexts().getValue("generic.on") : Emulator.getTexts().getValue("generic.off"))), RoomChatMessageBubbles.ALERT); + + return true; + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/BotsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/BotsCommand.java new file mode 100644 index 00000000..57b05d15 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/BotsCommand.java @@ -0,0 +1,36 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +public class BotsCommand extends Command +{ + public BotsCommand() + { + super("cmd_bots", Emulator.getTexts().getValue("commands.keys.cmd_bots").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() == null || !gameClient.getHabbo().getHabboInfo().getCurrentRoom().hasRights(gameClient.getHabbo())) + return false; + + String data = Emulator.getTexts().getValue("total") + ": " + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getCurrentBots().values().length; + + for(Object bot : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getCurrentBots().values()) + { + if(bot instanceof Bot) + { + data += "\r"; + data += "" + Emulator.getTexts().getValue("generic.bot.name") + ": " + ((Bot) bot).getName() + " " + Emulator.getTexts().getValue("generic.bot.id") + ": " + ((Bot) bot).getId(); + } + } + + gameClient.sendResponse(new GenericAlertComposer(data)); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ChangeNameCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ChangeNameCommand.java new file mode 100644 index 00000000..f01cf394 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ChangeNameCommand.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.users.UserDataComposer; + +public class ChangeNameCommand extends Command +{ + public ChangeNameCommand() + { + super("cmd_changename", Emulator.getTexts().getValue("commands.keys.cmd_changename").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.getHabbo().getHabboStats().allowNameChange = !gameClient.getHabbo().getHabboStats().allowNameChange; + gameClient.sendResponse(new UserDataComposer(gameClient.getHabbo())); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ChatTypeCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ChatTypeCommand.java new file mode 100644 index 00000000..be578e51 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ChatTypeCommand.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.MeMenuSettingsComposer; + +public class ChatTypeCommand extends Command +{ + public ChatTypeCommand() + { + super("cmd_chatcolor", Emulator.getTexts().getValue("commands.keys.cmd_chatcolor").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + + if(params.length >= 2) + { + int chatColor; + try + { + chatColor = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_chatcolor.numbers"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(RoomChatMessageBubbles.values().length < chatColor) + { + chatColor = 0; + } + + if(chatColor < 0) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_chatcolor.numbers"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(!gameClient.getHabbo().hasPermission("acc_anychatcolor")) + { + for(String s : Emulator.getConfig().getValue("commands.cmd_chatcolor.banned_numbers").split(";")) + { + if(Integer.valueOf(s) == chatColor) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_chatcolor.banned"), RoomChatMessageBubbles.ALERT); + return true; + } + } + } + + gameClient.getHabbo().getHabboStats().chatColor = RoomChatMessageBubbles.getBubble(chatColor); + gameClient.sendResponse(new MeMenuSettingsComposer(gameClient.getHabbo())); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_chatcolor.set").replace("%chat%", RoomChatMessageBubbles.values()[chatColor].name().replace("_", " ").toLowerCase()), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + gameClient.getHabbo().getHabboStats().chatColor = RoomChatMessageBubbles.NORMAL; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_chatcolor.reset"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/Command.java b/src/main/java/com/eu/habbo/habbohotel/commands/Command.java new file mode 100644 index 00000000..9490e449 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/Command.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.habbohotel.gameclients.GameClient; + +public abstract class Command +{ + /** + * Permission string the executor must have in order to access the command. + */ + public final String permission; + + /** + * All keys the command can be exectuted from. + *

    + * Example: + * :userinfo TheGeneral + *

    + */ + public final String[] keys; + + public Command(String permission, String[] keys) + { + this.permission = permission; + this.keys = keys; + } + + /** + * Executes an command for a given gameClient. + * @param gameClient The GameClient who executes the command. + * @param params Array of parameters given in the command. + * @return Returns true if the user should NOT say anything in the room. + * @throws Exception + */ + public abstract boolean handle(GameClient gameClient, String[] params) throws Exception; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java b/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java new file mode 100644 index 00000000..e2603d17 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java @@ -0,0 +1,357 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.CommandLog; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetCommand; +import com.eu.habbo.habbohotel.pets.PetVocalsType; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTypingComposer; +import com.eu.habbo.plugin.events.users.UserCommandEvent; +import com.eu.habbo.plugin.events.users.UserExecuteCommandEvent; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.*; + +public class CommandHandler +{ + private final static THashMap commands = new THashMap(5); + + public CommandHandler() + { + long millis = System.currentTimeMillis(); + reloadCommands(); + Emulator.getLogging().logStart("Command Handler -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void reloadCommands() + { + addCommand(new AboutCommand()); + addCommand(new AlertCommand()); + addCommand(new AllowTradingCommand()); + addCommand(new ArcturusCommand()); + addCommand(new BadgeCommand()); + addCommand(new BanCommand()); + addCommand(new BlockAlertCommand()); + addCommand(new BotsCommand()); + addCommand(new ChangeNameCommand()); + addCommand(new ChatTypeCommand()); + addCommand(new CommandsCommand()); + addCommand(new ConnectCameraCommand()); + addCommand(new ControlCommand()); + addCommand(new CoordsCommand()); + addCommand(new CreditsCommand()); + addCommand(new DiagonalCommand()); + addCommand(new DisconnectCommand()); + addCommand(new EjectAllCommand()); + addCommand(new EmptyInventoryCommand()); + addCommand(new EmptyBotsInventoryCommand()); + addCommand(new EmptyPetsInventoryCommand()); + addCommand(new EnableCommand()); + addCommand(new EventCommand()); + addCommand(new FacelessCommand()); + addCommand(new FastwalkCommand()); + addCommand(new FreezeBotsCommand()); + addCommand(new FreezeCommand()); + addCommand(new GiftCommand()); + addCommand(new GiveRankCommand()); + addCommand(new HabnamCommand()); + addCommand(new HandItemCommand()); + addCommand(new HappyHourCommand()); + addCommand(new HotelAlertCommand()); + addCommand(new HotelAlertLinkCommand()); + addCommand(new IPBanCommand()); + addCommand(new LayCommand()); + addCommand(new MachineBanCommand()); + addCommand(new MassBadgeCommand()); + addCommand(new MassCreditsCommand()); + addCommand(new MassGiftCommand()); + addCommand(new MassPixelsCommand()); + addCommand(new MassPointsCommand()); + addCommand(new MimicCommand()); + addCommand(new MoonwalkCommand()); + addCommand(new MultiCommand()); + addCommand(new MuteBotsCommand()); + addCommand(new MuteCommand()); + addCommand(new MutePetsCommand()); + addCommand(new PetInfoCommand()); + addCommand(new PickallCommand()); + addCommand(new PixelCommand()); + addCommand(new PluginsCommand()); + addCommand(new PointsCommand()); + addCommand(new PullCommand()); + addCommand(new PushCommand()); + addCommand(new RedeemCommand()); + addCommand(new ReloadRoomCommand()); + addCommand(new RoomAlertCommand()); + addCommand(new RoomBundleCommand()); + addCommand(new RoomCreditsCommand()); + addCommand(new RoomDanceCommand()); + addCommand(new RoomEffectCommand()); + addCommand(new RoomItemCommand()); + addCommand(new RoomKickCommand()); + addCommand(new RoomMuteCommand()); + addCommand(new RoomPixelsCommand()); + addCommand(new RoomPointsCommand()); + addCommand(new SayAllCommand()); + addCommand(new SayCommand()); + addCommand(new SetMaxCommand()); + addCommand(new SetPollCommand()); + addCommand(new SetSpeedCommand()); + addCommand(new ShoutAllCommand()); + addCommand(new ShoutCommand()); + addCommand(new ShutdownCommand()); + addCommand(new SitCommand()); + addCommand(new SitDownCommand()); + addCommand(new StaffAlertCommand()); + addCommand(new StaffOnlineCommand()); + addCommand(new StalkCommand()); + addCommand(new SummonCommand()); + addCommand(new SummonRankCommand()); + addCommand(new SuperbanCommand()); + addCommand(new SuperPullCommand()); + addCommand(new TakeBadgeCommand()); + addCommand(new TeleportCommand()); + addCommand(new TransformCommand()); + addCommand(new TrashCommand()); + addCommand(new UnbanCommand()); + addCommand(new UnloadRoomCommand()); + addCommand(new UnmuteCommand()); + addCommand(new UpdateBotsCommand()); + addCommand(new UpdateCatalogCommand()); + addCommand(new UpdateConfigCommand()); + addCommand(new UpdateGuildPartsCommand()); + addCommand(new UpdateHotelViewCommand()); + addCommand(new UpdateItemsCommand()); + addCommand(new UpdateNavigatorCommand()); + addCommand(new UpdatePermissionsCommand()); + addCommand(new UpdatePetDataCommand()); + addCommand(new UpdatePluginsCommand()); + addCommand(new UpdatePollsCommand()); + addCommand(new UpdateTextsCommand()); + addCommand(new UpdateWordFilterCommand()); + addCommand(new UserInfoCommand()); + addCommand(new WordQuizCommand()); + + addCommand(new TestCommand()); + } + + /** + * Adds a new command to the commands list. + * @param command The command to be added. + */ + public static void addCommand(Command command) + { + if(command == null) + return; + + commands.put(command.getClass().getName(), command); + } + + /** + * Adds a new command to the commands list. + * @param command The command class to be added. + */ + public static void addCommand(Class command) + { + try + { + //command.getConstructor().setAccessible(true); + addCommand(command.newInstance()); + Emulator.getLogging().logDebugLine("Added command: " + command.getName()); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + /** + * Handles a command executed by the connected GameClient. + * This includes handling the petcommands aswell. + * @param gameClient The GameClient that executed the command. + * @param commandLine The whole sentence the GameClient used including the start: + * @return Wether the command has been succesfully executed. + */ + public static boolean handleCommand(GameClient gameClient, String commandLine) + { + if(gameClient != null) + { + if (commandLine.startsWith(":")) + { + commandLine = commandLine.replaceFirst(":", ""); + + String[] parts = commandLine.split(" "); + + if (parts.length >= 1) + { + for (Command command : commands.values()) + { + for (String s : command.keys) + { + if (s.toLowerCase().equals(parts[0].toLowerCase())) + { + boolean succes = false; + if (command.permission == null || gameClient.getHabbo().hasPermission(command.permission, gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null && (gameClient.getHabbo().getHabboInfo().getCurrentRoom().hasRights(gameClient.getHabbo())) || gameClient.getHabbo().hasPermission("acc_placefurni") || (gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null && gameClient.getHabbo().getHabboInfo().getCurrentRoom().getGuildId() > 0 && gameClient.getHabbo().getHabboInfo().getCurrentRoom().guildRightLevel(gameClient.getHabbo()) >= 2) )) + { + try + { + Emulator.getPluginManager().fireEvent(new UserExecuteCommandEvent(gameClient.getHabbo(), command, parts)); + + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTypingComposer(gameClient.getHabbo().getRoomUnit(), false).compose()); + + UserCommandEvent event = new UserCommandEvent(gameClient.getHabbo(), parts, command.handle(gameClient, parts)); + Emulator.getPluginManager().fireEvent(event); + + succes = event.succes; + } + catch (Exception e) + { + e.printStackTrace(); + } + + if (gameClient.getHabbo().hasPermission("log_commands")) + { + Emulator.getLogging().addLog(new CommandLog(gameClient.getHabbo().getHabboInfo().getId(), command, commandLine, succes)); + } + } + + return succes; + } + } + } + } + } + else + { + String[] args = commandLine.split(" "); + + if (args.length <= 1) + return false; + + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room.getCurrentPets().isEmpty()) + return false; + + TIntObjectIterator petIterator = room.getCurrentPets().iterator(); + + for (int j = room.getCurrentPets().size(); j-- > 0; ) + { + try + { + petIterator.advance(); + } + catch (NoSuchElementException e) + { + break; + } + + AbstractPet pet = petIterator.value(); + + if (pet instanceof Pet) + { + if (pet.getName().equalsIgnoreCase(args[0])) + { + String s = ""; + + for (int i = 1; i < args.length; i++) + { + s += args[i] + " "; + } + + s = s.substring(0, s.length() - 1); + + for (PetCommand command : pet.getPetData().getPetCommands()) + { + if (command.key.equalsIgnoreCase(s)) + { + if (command.level <= pet.getLevel()) + ((Pet) pet).handleCommand(command, gameClient.getHabbo()); + else + pet.say(pet.getPetData().randomVocal(PetVocalsType.UNKNOWN_COMMAND)); + + break; + } + } + } + } + } + } + } + } + return false; + } + + /** + * Returns an arraylist of all commands that the given rank has access to based on the permissions that have been set. + * @param rankId The rank ID to search commands for. + * @return ArrayList of commands. + */ + public List getCommandsForRank(int rankId) + { + List allowedCommands = new ArrayList(); + if (Emulator.getGameEnvironment().getPermissionsManager().rankExists(rankId)) + { + Collection permissions = Emulator.getGameEnvironment().getPermissionsManager().getRank(rankId).getPermissions().keySet(); + + for (Command command : commands.values()) + { + if (allowedCommands.contains(command)) + continue; + + if (permissions.contains(command.permission)) + { + allowedCommands.add(command); + } + } + } + + Collections.sort(allowedCommands, CommandHandler.ALPHABETICAL_ORDER); + + return allowedCommands; + } + + public static Command getCommand(String key) + { + for (Command command : commands.values()) + { + for (String k : command.keys) + { + if (key.equalsIgnoreCase(k)) + { + return command; + } + } + } + + return null; + } + + /** + * Disposes the CommandHandler. + */ + public void dispose() + { + commands.clear(); + + Emulator.getLogging().logShutdownLine("Command Handler -> Disposed!"); + } + + /** + * Sort all commands based on their permission in alphabetical order. + */ + private static final Comparator ALPHABETICAL_ORDER = new Comparator() { + public int compare(Command c1, Command c2) { + int res = String.CASE_INSENSITIVE_ORDER.compare(c1.permission, c2.permission); + return (res != 0) ? res : c1.permission.compareTo(c2.permission); + } + }; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/CommandsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/CommandsCommand.java new file mode 100644 index 00000000..7670c42c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/CommandsCommand.java @@ -0,0 +1,33 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.MessagesForYouComposer; + +import java.util.List; + +public class CommandsCommand extends Command +{ + public CommandsCommand() + { + super("cmd_commands", Emulator.getTexts().getValue("commands.keys.cmd_commands").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + String message = "Your Commands"; + List commands = Emulator.getGameEnvironment().getCommandHandler().getCommandsForRank(gameClient.getHabbo().getHabboInfo().getRank().getId()); + message += "(" + commands.size() + "):\r\n"; + + for(Command c : commands) + { + message += Emulator.getTexts().getValue("commands.description." + c.permission, "commands.description." + c.permission) + "\r"; + } + + gameClient.getHabbo().alert(new String[]{message}); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ConnectCameraCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ConnectCameraCommand.java new file mode 100644 index 00000000..05f22486 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ConnectCameraCommand.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.networking.camera.CameraClient; +import com.eu.habbo.threading.runnables.CameraClientAutoReconnect; + +public class ConnectCameraCommand extends Command +{ + public ConnectCameraCommand() + { + super("cmd_connect_camera", Emulator.getTexts().getValue("commands.keys.cmd_connect_camera").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + CameraClient.attemptReconnect = true; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_alert.cmd_connect_camera"), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ControlCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ControlCommand.java new file mode 100644 index 00000000..eef8a7ae --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ControlCommand.java @@ -0,0 +1,66 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class ControlCommand extends Command +{ + public ControlCommand() + { + super("cmd_control", Emulator.getTexts().getValue("commands.keys.cmd_control").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(params.length == 2) + { + Habbo target = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[1]); + + if(target == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_control.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(target == gameClient.getHabbo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_control.not_self"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo oldHabbo = (Habbo)gameClient.getHabbo().getRoomUnit().getCacheable().remove("control"); + + if(oldHabbo != null) + { + oldHabbo.getRoomUnit().getCacheable().remove("controller"); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_control.stopped").replace("%user%", oldHabbo.getHabboInfo().getUsername()), RoomChatMessageBubbles.ALERT); + } + gameClient.getHabbo().getRoomUnit().getCacheable().put("control", target); + target.getRoomUnit().getCacheable().put("controller", gameClient.getHabbo()); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_control.controlling").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + Object habbo = gameClient.getHabbo().getRoomUnit().getCacheable().get("control"); + + if(habbo != null) + { + gameClient.getHabbo().getRoomUnit().getCacheable().remove("control"); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_control.stopped").replace("%user%", ((Habbo)habbo).getHabboInfo().getUsername()), RoomChatMessageBubbles.ALERT); + } + return true; + } + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/CoordsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/CoordsCommand.java new file mode 100644 index 00000000..aa2f96c6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/CoordsCommand.java @@ -0,0 +1,54 @@ + package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +public class CoordsCommand extends Command { + + public CoordsCommand() + { + super("cmd_coords", Emulator.getTexts().getValue("commands.keys.cmd_coords").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getRoomUnit() == null || gameClient.getHabbo().getHabboInfo().getCurrentRoom() == null) + return false; + + if (params.length == 1) + { + gameClient.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_coords.title") + "\r\n" + + "x: " + gameClient.getHabbo().getRoomUnit().getX() + "\r" + + "y: " + gameClient.getHabbo().getRoomUnit().getY() + "\r" + + "z: " + (gameClient.getHabbo().getRoomUnit().getStatus().containsKey("sit") ? gameClient.getHabbo().getRoomUnit().getStatus().get("sit") : gameClient.getHabbo().getRoomUnit().getZ()) + "\r" + + Emulator.getTexts().getValue("generic.rotation.head") + ": " + gameClient.getHabbo().getRoomUnit().getHeadRotation() + "-" + gameClient.getHabbo().getRoomUnit().getHeadRotation().getValue() + "\r" + + Emulator.getTexts().getValue("generic.rotation.body") + ": " + gameClient.getHabbo().getRoomUnit().getBodyRotation() + "-" + gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue() + "\r" + + Emulator.getTexts().getValue("generic.sitting") + ": " + (gameClient.getHabbo().getRoomUnit().getStatus().containsKey("sit") ? Emulator.getTexts().getValue("generic.yes") : Emulator.getTexts().getValue("generic.no")) + "\r" + + "Tile State: " + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTile(gameClient.getHabbo().getRoomUnit().getX(), gameClient.getHabbo().getRoomUnit().getY()).state.name() + "\r" + + "Tile Walkable: " + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTile(gameClient.getHabbo().getRoomUnit().getX(), gameClient.getHabbo().getRoomUnit().getY()).isWalkable() + "\r" + + "Tile relative height: " + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTile(gameClient.getHabbo().getRoomUnit().getX(), gameClient.getHabbo().getRoomUnit().getY()).relativeHeight() + "\r" + + "Tile stack height: " + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTile(gameClient.getHabbo().getRoomUnit().getX(), gameClient.getHabbo().getRoomUnit().getY()).getStackHeight())); + + } + else + { + RoomTile tile = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTile(Short.valueOf(params[1]), Short.valueOf(params[2])); + + if (tile != null) + { + gameClient.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_coords.title") + "\r\n" + + "x: " + tile.x + "\r" + + "y: " + tile.y + "\r" + + "z: " + tile.z + "\r" + + "Tile State: " + tile.state.name() + "\r" + + "Tile Relative Height: " + tile.relativeHeight() + "\r" + + "Tile Stack Height: " + tile.getStackHeight() + "\r" + + "Tile Walkable: " + (tile.isWalkable() ? "Yes" : "No") + "\r")); + } + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/CreditsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/CreditsCommand.java new file mode 100644 index 00000000..75342095 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/CreditsCommand.java @@ -0,0 +1,74 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; + +public class CreditsCommand extends Command +{ + public CreditsCommand() + { + super("cmd_credits", Emulator.getTexts().getValue("commands.keys.cmd_credits").split(";")); + } + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 3) + { + HabboInfo info = HabboManager.getOfflineHabboInfo(params[1]); + + if (info != null) + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(params[1]); + + int credits = 0; + try + { + credits = Integer.parseInt(params[2]); + } catch (NumberFormatException e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_credits.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + if (habbo != null) + { + if (credits != 0) + { + habbo.giveCredits(credits); + if (habbo.getHabboInfo().getCurrentRoom() != null) + habbo.whisper(Emulator.getTexts().getValue("commands.generic.cmd_credits.received").replace("%amount%", Integer.parseInt(params[2]) + ""), RoomChatMessageBubbles.ALERT); + else + habbo.getClient().sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_credits.received").replace("%amount%", Integer.parseInt(params[2]) + ""))); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_credits.send").replace("%amount%", Integer.parseInt(params[2]) + "").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + + } else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_credits.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + } else + { + Emulator.getGameEnvironment().getHabboManager().giveCredits(info.getId(), credits); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_credits.send").replace("%amount%", Integer.parseInt(params[2]) + "").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_credits.user_not_found").replace("%amount%", Integer.parseInt(params[2]) + "").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_credits.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/DiagonalCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/DiagonalCommand.java new file mode 100644 index 00000000..94ab612a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/DiagonalCommand.java @@ -0,0 +1,40 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class DiagonalCommand extends Command +{ + public DiagonalCommand() + { + super("cmd_diagonal", Emulator.getTexts().getValue("commands.keys.cmd_diagonal").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom().hasRights(gameClient.getHabbo())) + { + gameClient.getHabbo().getHabboInfo().getCurrentRoom().moveDiagonally(!gameClient.getHabbo().getHabboInfo().getCurrentRoom().moveDiagonally()); + + if (!gameClient.getHabbo().getHabboInfo().getCurrentRoom().moveDiagonally()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_diagonal.disabled"), RoomChatMessageBubbles.ALERT); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_diagonal.enabled"), RoomChatMessageBubbles.ALERT); + } + + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/DisconnectCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/DisconnectCommand.java new file mode 100644 index 00000000..fcb8cad0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/DisconnectCommand.java @@ -0,0 +1,51 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class DisconnectCommand extends Command +{ + public DisconnectCommand() + { + super("cmd_disconnect", Emulator.getTexts().getValue("commands.keys.cmd_disconnect").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_disconnect.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(params[1].toLowerCase().equals(gameClient.getHabbo().getHabboInfo().getUsername().toLowerCase())) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_disconnect.disconnect_self"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(target == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_disconnect.user_offline"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (target.getHabboInfo().getRank().getId() > gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_disconnect.higher_rank"), RoomChatMessageBubbles.ALERT); + return true; + } + + target.getClient().getChannel().close(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_disconnect.disconnected").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/EjectAllCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/EjectAllCommand.java new file mode 100644 index 00000000..3cf22758 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/EjectAllCommand.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; + +public class EjectAllCommand extends Command +{ + public EjectAllCommand() + { + super("cmd_ejectall", Emulator.getTexts().getValue("commands.keys.cmd_ejectall").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if(room.isOwner(gameClient.getHabbo()) || (room.hasGuild() && room.guildRightLevel(gameClient.getHabbo()) == 3)) + { + room.ejectAll(gameClient.getHabbo()); + } + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/EmptyBotsInventoryCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/EmptyBotsInventoryCommand.java new file mode 100644 index 00000000..2a733e06 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/EmptyBotsInventoryCommand.java @@ -0,0 +1,73 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; + +public class EmptyBotsInventoryCommand extends Command +{ + public EmptyBotsInventoryCommand() + { + super("cmd_empty_bots", Emulator.getTexts().getValue("commands.keys.cmd_empty_bots").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1 || (params.length >= 2 && !params[1].equals(Emulator.getTexts().getValue("generic.yes")))) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom().getUserCount() > 10) + { + gameClient.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.succes.cmd_empty_bots.verify").replace("%generic.yes%", Emulator.getTexts().getValue("generic.yes")))); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_empty_bots.verify").replace("%generic.yes%", Emulator.getTexts().getValue("generic.yes")), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } + + if(params.length >= 2 && params[1].equalsIgnoreCase(Emulator.getTexts().getValue("generic.yes"))) + { + Habbo habbo = gameClient.getHabbo(); + if (params.length == 3 && gameClient.getHabbo().hasPermission("acc_empty_others")) + { + habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[2]); + } + + if (habbo != null) + { + TIntObjectHashMap bots = new TIntObjectHashMap<>(); + bots.putAll(habbo.getInventory().getBotsComponent().getBots()); + habbo.getInventory().getBotsComponent().getBots().clear(); + bots.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(Bot object) + { + Emulator.getGameEnvironment().getBotManager().deleteBot(object); + return true; + } + }); + + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_empty_bots.cleared"), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/EmptyInventoryCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/EmptyInventoryCommand.java new file mode 100644 index 00000000..e9139a97 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/EmptyInventoryCommand.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryItemsComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItems; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +public class EmptyInventoryCommand extends Command +{ + public EmptyInventoryCommand() + { + super("cmd_empty", Emulator.getTexts().getValue("commands.keys.cmd_empty").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1 || (params.length >= 2 && !params[1].equals(Emulator.getTexts().getValue("generic.yes")))) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom().getUserCount() > 10) + { + gameClient.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.succes.cmd_empty.verify").replace("%generic.yes%", Emulator.getTexts().getValue("generic.yes")))); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_empty.verify").replace("%generic.yes%", Emulator.getTexts().getValue("generic.yes")), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } + + if(params.length >= 2 && params[1].equalsIgnoreCase(Emulator.getTexts().getValue("generic.yes"))) + { + Habbo habbo = gameClient.getHabbo(); + if (params.length == 3 && gameClient.getHabbo().hasPermission("acc_empty_others")) + { + habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[2]); + } + + if (habbo != null) + { + + TIntObjectMap items = new TIntObjectHashMap(); + items.putAll(habbo.getInventory().getItemsComponent().getItems()); + habbo.getInventory().getItemsComponent().getItems().clear(); + Emulator.getThreading().run(new QueryDeleteHabboItems(items)); + + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + habbo.getClient().sendResponse(new InventoryItemsComposer(0, 1, gameClient.getHabbo().getInventory().getItemsComponent().getItems())); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_empty.cleared"), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/EmptyPetsInventoryCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/EmptyPetsInventoryCommand.java new file mode 100644 index 00000000..21f8cf12 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/EmptyPetsInventoryCommand.java @@ -0,0 +1,72 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; + +public class EmptyPetsInventoryCommand extends Command +{ + public EmptyPetsInventoryCommand() + { + super("cmd_empty_pets", Emulator.getTexts().getValue("commands.keys.cmd_empty_pets").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1 || (params.length >= 2 && !params[1].equals(Emulator.getTexts().getValue("generic.yes")))) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom().getUserCount() > 10) + { + gameClient.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.succes.cmd_empty_pets.verify").replace("%generic.yes%", Emulator.getTexts().getValue("generic.yes")))); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_empty_pets.verify").replace("%generic.yes%", Emulator.getTexts().getValue("generic.yes")), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } + + if(params.length >= 2 && params[1].equalsIgnoreCase(Emulator.getTexts().getValue("generic.yes"))) + { + Habbo habbo = gameClient.getHabbo(); + if (params.length == 3 && gameClient.getHabbo().hasPermission("acc_empty_others")) + { + habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[2]); + } + + if (habbo != null) + { + TIntObjectHashMap pets = new TIntObjectHashMap<>(); + pets.putAll(habbo.getInventory().getPetsComponent().getPets()); + habbo.getInventory().getPetsComponent().getPets().clear(); + pets.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(AbstractPet object) + { + Emulator.getGameEnvironment().getPetManager().deletePet(object); + return true; + } + }); + + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_empty_pets.cleared"), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/EnableCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/EnableCommand.java new file mode 100644 index 00000000..f68db57f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/EnableCommand.java @@ -0,0 +1,67 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class EnableCommand extends Command +{ + public EnableCommand() + { + super("cmd_enable", Emulator.getTexts().getValue("commands.keys.cmd_enable").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length >= 2) + { + int effectId = 0; + try + { + effectId = Integer.parseInt(params[1]); + } + catch (Exception e) + { + return false; + } + Habbo target = gameClient.getHabbo(); + if (params.length == 3) + { + target = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[2]); + } + + if (target != null) + { + if (target == gameClient.getHabbo() || gameClient.getHabbo().hasPermission("acc_enable_others")) + { + try + { + if (target.getHabboInfo().getCurrentRoom() != null) + { + if (target.getHabboInfo().getRiding() == null) + { + if (Emulator.getGameEnvironment().getPermissionsManager().isEffectBlocked(effectId, target.getHabboInfo().getRank().getId())) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_enable.not_allowed"), RoomChatMessageBubbles.ALERT); + return true; + } + + target.getHabboInfo().getCurrentRoom().giveEffect(target, effectId); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/EventCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/EventCommand.java new file mode 100644 index 00000000..7de1b487 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/EventCommand.java @@ -0,0 +1,61 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import gnu.trove.map.hash.THashMap; + +import java.util.ArrayList; +import java.util.Map; + +public class EventCommand extends Command +{ + public EventCommand() + { + super("cmd_event", Emulator.getTexts().getValue("commands.keys.cmd_event").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if (params.length >= 2) + { + String message = ""; + + for (int i = 1; i < params.length; i++) + { + message += params[i]; + message += " "; + } + + THashMap codes = new THashMap(); + codes.put("ROOMNAME", gameClient.getHabbo().getHabboInfo().getCurrentRoom().getName()); + codes.put("ROOMID", gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId() + ""); + codes.put("USERNAME", gameClient.getHabbo().getHabboInfo().getUsername()); + codes.put("LOOK", gameClient.getHabbo().getHabboInfo().getLook()); + codes.put("TIME", Emulator.getDate().toString()); + codes.put("MESSAGE", message); + + ServerMessage msg = new BubbleAlertComposer("hotel.event", codes).compose(); + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + if(habbo.getHabboStats().blockStaffAlerts) + continue; + + habbo.getClient().sendResponse(msg); + } + + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/FacelessCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/FacelessCommand.java new file mode 100644 index 00000000..c01b5731 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/FacelessCommand.java @@ -0,0 +1,57 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; +import com.eu.habbo.messages.outgoing.users.UpdateUserLookComposer; + +/** + * Kudos to Wouto on RaGEZONE + */ +public class FacelessCommand extends Command +{ + public FacelessCommand() + { + super("cmd_faceless", Emulator.getTexts().getValue("commands.keys.cmd_faceless").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + try + { + + String[] figureParts = gameClient.getHabbo().getHabboInfo().getLook().split("\\."); + + for (String part : figureParts) + { + if (part.startsWith("hd")) + { + String[] headParts = part.split("-"); + + if (!headParts[1].equals("99999")) + headParts[1] = "99999"; + else + break; + + String newHead = "hd-" + headParts[1] + "-" + headParts[2]; + + gameClient.getHabbo().getHabboInfo().setLook(gameClient.getHabbo().getHabboInfo().getLook().replace(part, newHead)); + gameClient.sendResponse(new UpdateUserLookComposer(gameClient.getHabbo())); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(gameClient.getHabbo()).compose()); + return true; + } + } + + } + catch (Exception e) + { + + } + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/FastwalkCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/FastwalkCommand.java new file mode 100644 index 00000000..519b692b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/FastwalkCommand.java @@ -0,0 +1,37 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.users.Habbo; + +public class FastwalkCommand extends Command +{ + public FastwalkCommand() + { + super("cmd_fastwalk", Emulator.getTexts().getValue("commands.keys.cmd_fastwalk").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + Habbo habbo = gameClient.getHabbo(); + + if(params.length >= 2) + { + String username = params[1]; + + habbo = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(username); + + if(habbo == null) + return false; + } + habbo.getRoomUnit().setFastWalk(!habbo.getRoomUnit().isFastWalk()); + + return true; + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/FreezeBotsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/FreezeBotsCommand.java new file mode 100644 index 00000000..af7df319 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/FreezeBotsCommand.java @@ -0,0 +1,36 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class FreezeBotsCommand extends Command +{ + public FreezeBotsCommand() + { + super("cmd_freeze_bots", Emulator.getTexts().getValue("commands.keys.cmd_freeze_bots").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(gameClient.getHabbo().getHabboInfo().getId() == gameClient.getHabbo().getHabboInfo().getCurrentRoom().getOwnerId() || gameClient.getHabbo().hasPermission("acc_anyroomowner")) + { + gameClient.getHabbo().getHabboInfo().getCurrentRoom().setAllowBotsWalk(!gameClient.getHabbo().getHabboInfo().getCurrentRoom().isAllowBotsWalk()); + gameClient.getHabbo().whisper(gameClient.getHabbo().getHabboInfo().getCurrentRoom().isAllowBotsWalk() ? Emulator.getTexts().getValue("commands.succes.cmd_freeze_bots.unfrozen") : Emulator.getTexts().getValue("commands.succes.cmd_freeze_bots.frozen"), RoomChatMessageBubbles.ALERT); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("generic.cannot_do_that"), RoomChatMessageBubbles.ALERT); + } + + return true; + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/FreezeCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/FreezeCommand.java new file mode 100644 index 00000000..83548a75 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/FreezeCommand.java @@ -0,0 +1,53 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class FreezeCommand extends Command +{ + public FreezeCommand() + { + super("cmd_freeze", Emulator.getTexts().getValue("commands.keys.cmd_freeze").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + Habbo habbo = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_freeze.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + if(habbo.getRoomUnit().canWalk()) + { + habbo.getRoomUnit().setCanWalk(false); + habbo.whisper(Emulator.getTexts().getValue("commands.succes.cmd_freeze.frozen"), RoomChatMessageBubbles.ALERT); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_freeze.user_frozen").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + habbo.getRoomUnit().setCanWalk(true); + habbo.whisper(Emulator.getTexts().getValue("commands.succes.cmd_freeze.unfrozen"), RoomChatMessageBubbles.ALERT); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_freeze.user_unfrozen").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_freeze.not_found").replace("%user%", ""), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/GiftCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/GiftCommand.java new file mode 100644 index 00000000..15c94bb1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/GiftCommand.java @@ -0,0 +1,105 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.map.hash.THashMap; + +public class GiftCommand extends Command +{ + public GiftCommand() + { + super("cmd_gift", Emulator.getTexts().getValue("commands.keys.cmd_gift").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length >= 3) + { + try + { + String username = params[1]; + int itemId = Integer.valueOf(params[2]); + + if(itemId < 0) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"), RoomChatMessageBubbles.ALERT); + return true; + } + + Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem(itemId); + + if(baseItem == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_found").replace("%itemid%", itemId + ""), RoomChatMessageBubbles.ALERT); + return true; + } + + HabboInfo habboInfo = HabboManager.getOfflineHabboInfo(username); + + if(habboInfo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.user_not_found").replace("%username%", username), RoomChatMessageBubbles.ALERT); + return true; + } + + String message = ""; + + if(params.length > 3) + { + for (int i = 3; i < params.length; i++) + { + message += params[i] + " "; + } + } + + final String finalMessage = message; + + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, 0, 0, ""); + + Item giftItem = Emulator.getGameEnvironment().getItemManager().getItem((Integer)Emulator.getGameEnvironment().getCatalogManager().giftFurnis.values().toArray()[Emulator.getRandom().nextInt(Emulator.getGameEnvironment().getCatalogManager().giftFurnis.size())]); + + String extraData = "1\t" + item.getId(); + extraData += "\t0\t0\t0\t"+ finalMessage +"\t0\t0"; + + Emulator.getGameEnvironment().getItemManager().createGift(username, giftItem, extraData, 0, 0); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_gift").replace("%username%", username).replace("%itemname%", item.getBaseItem().getName()), RoomChatMessageBubbles.ALERT); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(habboInfo.getId()); + + if (habbo != null) + { + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}notifications/gift.gif"); + keys.put("message", Emulator.getTexts().getValue("generic.gift.received.anonymous")); + habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys)); + } + return true; + } + catch (Exception e) + { + e.printStackTrace(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/GiveRankCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/GiveRankCommand.java new file mode 100644 index 00000000..73adf6f3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/GiveRankCommand.java @@ -0,0 +1,87 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.permissions.Rank; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserPerksComposer; +import org.apache.commons.lang3.StringUtils; + +public class GiveRankCommand extends Command +{ + public GiveRankCommand() + { + super("cmd_give_rank", Emulator.getTexts().getValue("commands.keys.cmd_give_rank").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Rank rank = null; + if (params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_rank.missing_username") + Emulator.getTexts().getValue("commands.description.cmd_give_rank"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (params.length == 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_rank.missing_rank") + Emulator.getTexts().getValue("commands.description.cmd_give_rank"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (params.length == 3) + { + if (StringUtils.isNumeric(params[2])) + { + int rankId = Integer.valueOf(params[2]); + if (Emulator.getGameEnvironment().getPermissionsManager().rankExists(rankId)) + rank = Emulator.getGameEnvironment().getPermissionsManager().getRank(rankId); + } + else + { + rank = Emulator.getGameEnvironment().getPermissionsManager().getRank(params[2]); + } + + if (rank != null) + { + if (rank.getId() > gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_rank.higher").replace("%username%", params[1]).replace("%id%", rank.getName()), RoomChatMessageBubbles.ALERT); + return true; + } + + HabboInfo habbo = HabboManager.getOfflineHabboInfo(params[1]); + + if (habbo != null) + { + if (habbo.getRank().getId() > gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_rank.higher.other").replace("%username%", params[1]).replace("%id%", rank.getName()), RoomChatMessageBubbles.ALERT); + return true; + } + + Emulator.getGameEnvironment().getHabboManager().setRank(habbo.getId(), rank.getId()); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_give_rank.updated").replace("%id%", rank.getName()).replace("%username%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_rank.user_offline").replace("%id%", rank.getName()).replace("%username%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + } + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.errors.cmd_give_rank.not_found").replace("%id%", params[2]).replace("%username%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/HabnamCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/HabnamCommand.java new file mode 100644 index 00000000..9f3d811b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/HabnamCommand.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.habbohotel.gameclients.GameClient; + +public class HabnamCommand extends Command +{ + public HabnamCommand() + { + super(null, new String[]{ "habnam", "gangnam" }); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (gameClient.getHabbo().getHabboStats().hasActiveClub()) + { + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + gameClient.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(gameClient.getHabbo(), 140); + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/HandItemCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/HandItemCommand.java new file mode 100644 index 00000000..2c11fe65 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/HandItemCommand.java @@ -0,0 +1,34 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserHandItemComposer; + +public class HandItemCommand extends Command +{ + public HandItemCommand() + { + super("cmd_hand_item", Emulator.getTexts().getValue("commands.keys.cmd_hand_item").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + {if(params.length == 2) + { + try + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + int effectId = Integer.parseInt(params[1]); + gameClient.getHabbo().getRoomUnit().setHandItem(effectId); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserHandItemComposer(gameClient.getHabbo().getRoomUnit()).compose()); + } + } + catch (Exception e) + { + //Don't handle incorrect parse exceptions :P + } + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/HappyHourCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/HappyHourCommand.java new file mode 100644 index 00000000..31f6bb9d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/HappyHourCommand.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +import java.util.Collection; +import java.util.Map; + +public class HappyHourCommand extends Command +{ + public HappyHourCommand() + { + super("cmd_happyhour", Emulator.getTexts().getValue("commands.keys.cmd_happyhour").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new GenericAlertComposer("Happy Hour!")); + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + AchievementManager.progressAchievement(set.getValue(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("HappyHour")); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertCommand.java new file mode 100644 index 00000000..71644dde --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertCommand.java @@ -0,0 +1,47 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.util.Map; + +public class HotelAlertCommand extends Command { + + public HotelAlertCommand() + { + super("cmd_ha", Emulator.getTexts().getValue("commands.keys.cmd_ha").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) + { + if(params.length > 1) { + String message = ""; + for (int i = 1; i < params.length; i++) { + message += params[i] + " "; + } + + ServerMessage msg = new GenericAlertComposer(message + "\r\n-" + gameClient.getHabbo().getHabboInfo().getUsername()).compose(); + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + if(habbo.getHabboStats().blockStaffAlerts) + continue; + + habbo.getClient().sendResponse(msg); + } + + }else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ha.forgot_message"), RoomChatMessageBubbles.ALERT); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertLinkCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertLinkCommand.java new file mode 100644 index 00000000..65e74ee3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/HotelAlertLinkCommand.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.generic.alerts.StaffAlertWithLinkComposer; + +public class HotelAlertLinkCommand extends Command +{ + public HotelAlertLinkCommand() + { + super("cmd_hal", Emulator.getTexts().getValue("commands.keys.cmd_hal").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (params.length < 3) + { + return true; + } + + String url = params[1]; + String message = ""; + for (int i = 2; i < params.length; i++) + { + message += params[i]; + message += " "; + } + + message += "\r\r-" + gameClient.getHabbo().getHabboInfo().getUsername() + ""; + + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new StaffAlertWithLinkComposer(message, url).compose()); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/IPBanCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/IPBanCommand.java new file mode 100644 index 00000000..9746f2f2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/IPBanCommand.java @@ -0,0 +1,90 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.modtool.ModToolBanType; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class IPBanCommand extends Command +{ + public final static int TEN_YEARS = 315569260; + public IPBanCommand() + { + super("cmd_ip_ban", Emulator.getTexts().getValue("commands.keys.cmd_ip_ban").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + HabboInfo habbo = null; + String reason = ""; + if (params.length >= 2) + { + Habbo h = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if (h != null) + { + habbo = h.getHabboInfo(); + } + else + { + habbo = HabboManager.getOfflineHabboInfo(params[1]); + } + } + else + { + return true; + } + + if (params.length > 2) + { + for (int i = 2; i < params.length; i++) + { + reason += params[i]; + reason += " "; + } + } + + int count = 0; + if (habbo != null) + { + if (habbo == gameClient.getHabbo().getHabboInfo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ip_ban.ban_self"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (habbo.getRank().getId() >= gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.target_rank_higher"), RoomChatMessageBubbles.ALERT); + return true; + } + + Emulator.getGameEnvironment().getModToolManager().ban(habbo.getId(), gameClient.getHabbo(), reason, TEN_YEARS, ModToolBanType.IP, -1); + count++; + for (Habbo h : Emulator.getGameServer().getGameClientManager().getHabbosWithIP(habbo.getIpLogin())) + { + if (h != null) + { + count++; + Emulator.getGameEnvironment().getModToolManager().ban(h.getHabboInfo().getId(), gameClient.getHabbo(), reason, TEN_YEARS, ModToolBanType.IP, -1); + } + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.user_offline"), RoomChatMessageBubbles.ALERT); + return true; + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_ip_ban").replace("%count%", count + ""), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/LayCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/LayCommand.java new file mode 100644 index 00000000..b49d4640 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/LayCommand.java @@ -0,0 +1,43 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +public class LayCommand extends Command +{ + public LayCommand() + { + super (null, Emulator.getTexts().getValue("commands.keys.cmd_lay").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.getHabbo().getRoomUnit().cmdLay = true; + gameClient.getHabbo().getHabboInfo().getCurrentRoom().updateHabbo(gameClient.getHabbo()); + gameClient.getHabbo().getRoomUnit().cmdSit = true; + gameClient.getHabbo().getRoomUnit().setBodyRotation(RoomUserRotation.values()[gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue() - gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue() % 2]); + + RoomTile tile = gameClient.getHabbo().getRoomUnit().getCurrentLocation(); + if (tile == null) + { + return false; + } + + for (int i = 0; i < 3; i++) + { + RoomTile t = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(tile, gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue(), i); + if (t == null || !t.isWalkable()) + { + return false; + } + } + + gameClient.getHabbo().getRoomUnit().getStatus().put("lay", 0.5 + ""); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserStatusComposer(gameClient.getHabbo().getRoomUnit()).compose()); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MachineBanCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MachineBanCommand.java new file mode 100644 index 00000000..8e3e0a91 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MachineBanCommand.java @@ -0,0 +1,86 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.modtool.ModToolBanType; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.util.List; + +public class MachineBanCommand extends Command +{ + public MachineBanCommand() + { + super("cmd_machine_ban", Emulator.getTexts().getValue("commands.keys.cmd_machine_ban").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + HabboInfo habbo = null; + String reason = ""; + if (params.length >= 2) + { + Habbo h = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if (h != null) + { + habbo = h.getHabboInfo(); + } + else + { + habbo = HabboManager.getOfflineHabboInfo(params[1]); + } + } + + if (params.length > 2) + { + for (int i = 2; i < params.length; i++) + { + reason += params[i]; + reason += " "; + } + } + + int count = 0; + if (habbo != null) + { + if (habbo == gameClient.getHabbo().getHabboInfo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_machine_ban.ban_self"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (habbo.getRank().getId() >= gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.target_rank_higher"), RoomChatMessageBubbles.ALERT); + return true; + } + + count = Emulator.getGameEnvironment().getModToolManager().ban(habbo.getId(), gameClient.getHabbo(), reason, IPBanCommand.TEN_YEARS, ModToolBanType.MACHINE, -1).size(); +// for (Habbo h : Emulator.getGameServer().getGameClientManager().getHabbosWithMachineId(ban.machineId)) +// { +// if (h != null) +// { +// count++; +// Emulator.getGameEnvironment().getModToolManager().ban(h.getHabboInfo().getId(), gameClient.getHabbo(), reason, IPBanCommand.TEN_YEARS, ModToolBanType.MACHINE); +// } +// } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.user_offline"), RoomChatMessageBubbles.ALERT); + return true; + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_machine_ban").replace("%count%", count + ""), RoomChatMessageBubbles.ALERT); + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MassBadgeCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MassBadgeCommand.java new file mode 100644 index 00000000..4fc0942a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MassBadgeCommand.java @@ -0,0 +1,68 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +public class MassBadgeCommand extends Command +{ + public MassBadgeCommand() + { + super("cmd_massbadge", Emulator.getTexts().getValue("commands.keys.cmd_massbadge").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + String badge; + + badge = params[1]; + + if(!badge.isEmpty()) + { + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}album1584/" + badge + ".gif"); + keys.put("message", Emulator.getTexts().getValue("commands.generic.cmd_badge.received")); + ServerMessage message = new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys).compose(); + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + + if(habbo.isOnline()) + { + if (habbo.getInventory() != null && habbo.getInventory().getBadgesComponent() != null && !habbo.getInventory().getBadgesComponent().hasBadge(badge)) + { + HabboBadge b = BadgesComponent.createBadge(badge, habbo); + + if (b != null) + { + habbo.getClient().sendResponse(new AddUserBadgeComposer(b)); + + habbo.getClient().sendResponse(message); + } + } + } + } + } + return true; + } + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_massbadge.no_badge"), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MassCreditsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MassCreditsCommand.java new file mode 100644 index 00000000..5dccec52 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MassCreditsCommand.java @@ -0,0 +1,56 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; + +import java.util.Collection; +import java.util.Map; + +public class MassCreditsCommand extends Command +{ + public MassCreditsCommand() + { + super("cmd_masscredits", Emulator.getTexts().getValue("commands.keys.cmd_masscredits").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + int amount; + + try + { + amount = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masscredits.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(amount != 0) + { + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + + habbo.giveCredits(amount); + habbo.getClient().sendResponse(new UserCreditsComposer(habbo)); + + if(habbo.getHabboInfo().getCurrentRoom() != null) + habbo.whisper(Emulator.getTexts().getValue("commands.generic.cmd_credits.received").replace("%amount%", amount + ""), RoomChatMessageBubbles.ALERT); + } + } + return true; + } + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masscredits.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MassGiftCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MassGiftCommand.java new file mode 100644 index 00000000..4af67b99 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MassGiftCommand.java @@ -0,0 +1,105 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +public class MassGiftCommand extends Command +{ + public MassGiftCommand() + { + super("cmd_massgift", Emulator.getTexts().getValue("commands.keys.cmd_massgift").split(";")); + } + + @Override + public boolean handle(final GameClient gameClient, String[] params) throws Exception + { + if(params.length >= 2) + { + try + { + int itemId = Integer.valueOf(params[1]); + + if(itemId < 0) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"), RoomChatMessageBubbles.ALERT); + return true; + } + + final Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem(itemId); + + if(baseItem == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_found").replace("%itemid%", itemId + ""), RoomChatMessageBubbles.ALERT); + return true; + } + + String message = ""; + + if(params.length > 2) + { + for (int i = 2; i < params.length; i++) + { + message += params[i] + " "; + } + } + + final String finalMessage = message; + + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}notifications/gift.gif"); + keys.put("message", Emulator.getTexts().getValue("generic.gift.received.anonymous")); + ServerMessage giftNotificiationMessage = new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys).compose(); + + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, 0, 0, ""); + + Item giftItem = Emulator.getGameEnvironment().getItemManager().getItem((Integer) Emulator.getGameEnvironment().getCatalogManager().giftFurnis.values().toArray()[Emulator.getRandom().nextInt(Emulator.getGameEnvironment().getCatalogManager().giftFurnis.size())]); + + String extraData = "1\t" + item.getId(); + extraData += "\t0\t0\t0\t"+ finalMessage +"\t0\t0"; + + Emulator.getGameEnvironment().getItemManager().createGift(habbo.getHabboInfo().getUsername(), giftItem, extraData, 0, 0); + + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + habbo.getClient().sendResponse(giftNotificiationMessage); + } + } + }); + + + return true; + } + catch (Exception e) + { + e.printStackTrace(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MassPixelsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MassPixelsCommand.java new file mode 100644 index 00000000..2c4e67e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MassPixelsCommand.java @@ -0,0 +1,55 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; + +import java.util.Collection; +import java.util.Map; + +public class MassPixelsCommand extends Command +{ + public MassPixelsCommand() + { + super("cmd_massduckets", Emulator.getTexts().getValue("commands.keys.cmd_massduckets").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + int amount; + + try + { + amount = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_massduckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(amount != 0) + { + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + + habbo.givePixels(amount); + + if(habbo.getHabboInfo().getCurrentRoom() != null) + habbo.whisper(Emulator.getTexts().getValue("commands.generic.cmd_duckets.received").replace("%amount%", amount + ""), RoomChatMessageBubbles.ALERT); + } + } + return true; + } + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_massduckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MassPointsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MassPointsCommand.java new file mode 100644 index 00000000..d2a111a5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MassPointsCommand.java @@ -0,0 +1,96 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; + +import java.util.Collection; +import java.util.Map; + +public class MassPointsCommand extends Command +{ + public MassPointsCommand() + { + super("cmd_masspoints", Emulator.getTexts().getValue("commands.keys.cmd_masspoints").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + int type = Emulator.getConfig().getInt("seasonal.primary.type"); + String amountString = ""; + if(params.length == 3) + { + try + { + type = Integer.valueOf(params[1]); + } catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_type").replace("%types%", Emulator.getConfig().getValue("seasonal.types").replace(";", ", ")), RoomChatMessageBubbles.ALERT); + return true; + } + + amountString = params[2]; + } + else if(params.length == 2) + { + amountString = params[1]; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + boolean found = false; + for(String s : Emulator.getConfig().getValue("seasonal.types").split(";")) + { + if(s.equalsIgnoreCase(type + "")) + { + found = true; + break; + } + } + + if(!found) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_type").replace("%types%", Emulator.getConfig().getValue("seasonal.types").replace(";", ", ")), RoomChatMessageBubbles.ALERT); + return true; + } + + int amount; + + try + { + amount = Integer.valueOf(amountString); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(amount != 0) + { + String message = Emulator.getTexts().getValue("commands.generic.cmd_points.received").replace("%amount%", amount + "").replace("%type%", Emulator.getTexts().getValue("seasonal.name." + type)); + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + Habbo habbo = set.getValue(); + habbo.givePoints(type, amount); + + if(habbo.getHabboInfo().getCurrentRoom() != null) + habbo.whisper(message, RoomChatMessageBubbles.ALERT); + else + habbo.getClient().sendResponse(new GenericAlertComposer(message)); + } + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MimicCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MimicCommand.java new file mode 100644 index 00000000..cc8a4a70 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MimicCommand.java @@ -0,0 +1,59 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserDataComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; + +public class MimicCommand extends Command +{ + public MimicCommand() + { + super("cmd_mimic", Emulator.getTexts().getValue("commands.keys.cmd_mimic").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + Habbo habbo = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[1]); + + if (habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mimic.not_found").replace("%user%", ""), RoomChatMessageBubbles.ALERT); + return true; + } + + if(habbo == gameClient.getHabbo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mimic.not_self"), RoomChatMessageBubbles.ALERT); + return true; + } + else if(habbo.hasPermission("acc_not_mimiced") && !gameClient.getHabbo().hasPermission("acc_not_mimiced")) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mimic.blocked").replace("%user%", params[1]).replace("%gender_name%", (habbo.getHabboInfo().getGender().equals(HabboGender.M) ? Emulator.getTexts().getValue("gender.him") : Emulator.getTexts().getValue("gender.her"))), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + gameClient.getHabbo().getHabboInfo().setLook(habbo.getHabboInfo().getLook()); + gameClient.getHabbo().getHabboInfo().setGender(habbo.getHabboInfo().getGender()); + gameClient.sendResponse(new UserDataComposer(gameClient.getHabbo())); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(gameClient.getHabbo()).compose()); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_mimic.copied").replace("%user%", params[1]).replace("%gender_name%", (habbo.getHabboInfo().getGender().equals(HabboGender.M) ? Emulator.getTexts().getValue("gender.him") : Emulator.getTexts().getValue("gender.her"))), RoomChatMessageBubbles.ALERT); + return true; + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mimic.not_found").replace("%user%", ""), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MoonwalkCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MoonwalkCommand.java new file mode 100644 index 00000000..76290657 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MoonwalkCommand.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; + +public class MoonwalkCommand extends Command +{ + public MoonwalkCommand() + { + super("cmd_moonwalk", Emulator.getTexts().getValue("commands.keys.cmd_moonwalk").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null && gameClient.getHabbo().getHabboStats().hasActiveClub()) + { + if (gameClient.getHabbo().getRoomUnit().getEffectId() != 136) + { + gameClient.getHabbo().getRoomUnit().setEffectId(136); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserEffectComposer(gameClient.getHabbo().getRoomUnit()).compose()); + } + else + { + gameClient.getHabbo().getRoomUnit().setEffectId(0); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserEffectComposer(gameClient.getHabbo().getRoomUnit()).compose()); + } + + return true; + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MultiCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MultiCommand.java new file mode 100644 index 00000000..bcffa8d5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MultiCommand.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.rooms.items.PostItStickyPoleOpenComposer; + +public class MultiCommand extends Command +{ + public MultiCommand() + { + super("cmd_multi", Emulator.getTexts().getValue("commands.keys.cmd_multi").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.sendResponse(new PostItStickyPoleOpenComposer(null)); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MuteBotsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MuteBotsCommand.java new file mode 100644 index 00000000..8edc07ba --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MuteBotsCommand.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class MuteBotsCommand extends Command +{ + public MuteBotsCommand() + { + super(null, Emulator.getTexts().getValue("commands.keys.cmd_mute_bots").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.getHabbo().getHabboStats().ignoreBots = !gameClient.getHabbo().getHabboStats().ignoreBots; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_mute_bots." +(gameClient.getHabbo().getHabboStats().ignoreBots ? "ignored" : "unignored")), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MuteCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MuteCommand.java new file mode 100644 index 00000000..f6fcefc2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MuteCommand.java @@ -0,0 +1,72 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserIgnoredComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class MuteCommand extends Command +{ + public MuteCommand() + { + super("cmd_mute", Emulator.getTexts().getValue("commands.keys.cmd_mute").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mute.not_specified"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mute.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + if(habbo == gameClient.getHabbo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mute.self"), RoomChatMessageBubbles.ALERT); + return true; + } + + int duration = Integer.MAX_VALUE; + + if(params.length == 3) + { + try + { + duration = Integer.valueOf(params[2]); + + if(duration <= 0) + throw new Exception(""); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_mute.time"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + habbo.mute(duration); + + if(habbo.getHabboInfo().getCurrentRoom() != null) + { + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.MUTED).compose()); //: RoomUserIgnoredComposer.UNIGNORED + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_mute.muted").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/MutePetsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/MutePetsCommand.java new file mode 100644 index 00000000..f8a49e02 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/MutePetsCommand.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class MutePetsCommand extends Command +{ + public MutePetsCommand() + { + super(null, Emulator.getTexts().getValue("commands.keys.cmd_mute_pets").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.getHabbo().getHabboStats().ignorePets = !gameClient.getHabbo().getHabboStats().ignorePets; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_mute_pets." +(gameClient.getHabbo().getHabboStats().ignorePets ? "ignored" : "unignored")), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PetInfoCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PetInfoCommand.java new file mode 100644 index 00000000..e8db7061 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PetInfoCommand.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetManager; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.procedure.TIntObjectProcedure; + +public class PetInfoCommand extends Command +{ + public PetInfoCommand() + { + super("cmd_pet_info", Emulator.getTexts().getValue("commands.keys.cmd_pet_info").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length > 1) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() == null) + return false; + + String name = params[1]; + + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getCurrentPets().forEachEntry(new TIntObjectProcedure() + { + @Override + public boolean execute(int a, AbstractPet pet) + { + if(pet.getName().equalsIgnoreCase(name)) + { + if(!(pet instanceof Pet)) + return true; + + gameClient.sendResponse(new GenericAlertComposer("" + + Emulator.getTexts().getValue("commands.generic.cmd_pet_info.title") + ": " + pet.getName() + "\r\n" + + Emulator.getTexts().getValue("generic.pet.id") + ": " + pet.getId() + "\r" + + Emulator.getTexts().getValue("generic.pet.name") + ": " + pet.getName() + "\r" + + Emulator.getTexts().getValue("generic.pet.age") + ": " + pet.daysAlive() + " " + Emulator.getTexts().getValue("generic.pet.days.alive") + "\r" + + Emulator.getTexts().getValue("generic.pet.level") + ": " + pet.getLevel() + "\r" + + "\r" + + Emulator.getTexts().getValue("commands.generic.cmd_pet_info.stats") + "\r\n" + + Emulator.getTexts().getValue("generic.pet.scratches") + ": " + pet.getRespect() + "\r" + + Emulator.getTexts().getValue("generic.pet.energy") + ": " + pet.getEnergy() + "/" + PetManager.maxEnergy(pet.getLevel()) + "\r" + + Emulator.getTexts().getValue("generic.pet.happyness") + ": " + pet.getHappyness() + "\r" + + Emulator.getTexts().getValue("generic.pet.level.thirst") + ": " + ((Pet) pet).levelThirst + "\r" + + Emulator.getTexts().getValue("generic.pet.level.hunger") + ": " + ((Pet) pet).levelHunger + "\r" + + Emulator.getTexts().getValue("generic.pet.current_action") + ": " + (((Pet) pet).getTask() == null ? Emulator.getTexts().getValue("generic.nothing") : ((Pet) pet).getTask().name()) + "\r" + + Emulator.getTexts().getValue("generic.can.walk") + ": " + (pet.getRoomUnit().canWalk() ? Emulator.getTexts().getValue("generic.yes") : Emulator.getTexts().getValue("generic.no")) + "" + )); + } + + return true; + } + }); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pet_info.pet_not_found"), RoomChatMessageBubbles.ALERT); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PickallCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PickallCommand.java new file mode 100644 index 00000000..38073315 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PickallCommand.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; + +public class PickallCommand extends Command +{ + public PickallCommand() + { + super("cmd_pickall", Emulator.getTexts().getValue("commands.keys.cmd_pickall").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if(room.isOwner(gameClient.getHabbo())) + { + room.ejectAll(); + return true; + } + + room.ejectUserFurni(gameClient.getHabbo().getHabboInfo().getId()); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PixelCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PixelCommand.java new file mode 100644 index 00000000..116c0427 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PixelCommand.java @@ -0,0 +1,61 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; + +public class PixelCommand extends Command +{ + public PixelCommand() + { + super("cmd_duckets", Emulator.getTexts().getValue("commands.keys.cmd_duckets").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 3) + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(params[1]); + + if(habbo != null) + { + try + { + if (Integer.parseInt(params[2]) != 0) + { + habbo.givePixels(Integer.parseInt(params[2])); + if(habbo.getHabboInfo().getCurrentRoom() != null) + habbo.whisper(Emulator.getTexts().getValue("commands.generic.cmd_duckets.received").replace("%amount%", Integer.valueOf(params[2]) + ""), RoomChatMessageBubbles.ALERT); + else + habbo.getClient().sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_duckets.received").replace("%amount%", Integer.valueOf(params[2]) + ""))); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_duckets.send").replace("%amount%", Integer.valueOf(params[2]) + "").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + + } else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_duckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + } + catch (NumberFormatException e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_duckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_duckets.user_offline").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_duckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PluginsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PluginsCommand.java new file mode 100644 index 00000000..9f068eed --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PluginsCommand.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.plugin.HabboPlugin; + +public class PluginsCommand extends Command +{ + public PluginsCommand() + { + super("cmd_plugins", Emulator.getTexts().getValue("commands.keys.cmd_plugins").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + String message = "Plugins (" + Emulator.getPluginManager().getPlugins().size() + ")\r"; + + for (HabboPlugin plugin : Emulator.getPluginManager().getPlugins()) + { + message += "\r" + plugin.configuration.name + " By " + plugin.configuration.author; + } + + gameClient.sendResponse(new GenericAlertComposer(message)); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PointsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PointsCommand.java new file mode 100644 index 00000000..febd3908 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PointsCommand.java @@ -0,0 +1,80 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; + +public class PointsCommand extends Command +{ + public PointsCommand() + { + super("cmd_points", Emulator.getTexts().getValue("commands.keys.cmd_points").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length >= 3) + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(params[1]); + + if(habbo != null) + { + try + { + int type = Emulator.getConfig().getInt("seasonal.primary.type"); + + if(params.length == 4) + { + try + { + type = Integer.valueOf(params[3]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_points.invalid_type").replace("%types%", Emulator.getConfig().getValue("seasonal.types").replace(";", ", ")), RoomChatMessageBubbles.ALERT); + return true; + } + } + + int amount = Integer.valueOf(params[2]); + if (amount != 0) + { + habbo.givePoints(type, amount); + + if(habbo.getHabboInfo().getCurrentRoom() != null) + habbo.whisper(Emulator.getTexts().getValue("commands.generic.cmd_points.received").replace("%amount%", amount + "").replace("%type%", Emulator.getTexts().getValue("seasonal.name." + type)), RoomChatMessageBubbles.ALERT); + else + habbo.getClient().sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_points.received").replace("%amount%", amount + "").replace("%type%", Emulator.getTexts().getValue("seasonal.name." + type)))); + + habbo.getClient().sendResponse(new UserPointsComposer(habbo.getHabboInfo().getCurrencyAmount(type), amount, type)); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_points.send").replace("%amount%", amount + "").replace("%user%", params[1]).replace("%type%", Emulator.getTexts().getValue("seasonal.name." + type)), RoomChatMessageBubbles.ALERT); + + } else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_points.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + } + catch (NumberFormatException e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_points.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_points.user_offline").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_points.invalid_amount"), RoomChatMessageBubbles.ALERT); + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PullCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PullCommand.java new file mode 100644 index 00000000..7c11dd17 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PullCommand.java @@ -0,0 +1,68 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class PullCommand extends Command +{ + public PullCommand() + { + super("cmd_pull", Emulator.getTexts().getValue("commands.keys.cmd_pull").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + Habbo habbo = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else if(habbo == gameClient.getHabbo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.pull_self"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + int distanceX = habbo.getRoomUnit().getX() - gameClient.getHabbo().getRoomUnit().getX(); + int distanceY = habbo.getRoomUnit().getY() - gameClient.getHabbo().getRoomUnit().getY(); + + if(distanceX < -2 || distanceX > 2 || distanceY < -2 || distanceY > 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.cant_reach").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + RoomTile tile = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(gameClient.getHabbo().getRoomUnit().getCurrentLocation(), gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (tile != null && tile.isWalkable()) + { + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getDoorTile() == tile) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.invalid").replace("%username%", params[1])); + return true; + } + habbo.getRoomUnit().setGoalLocation(tile); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(Emulator.getTexts().getValue("commands.succes.cmd_pull.pull").replace("%user%", params[1]).replace("%gender_name%", (gameClient.getHabbo().getHabboInfo().getGender().equals(HabboGender.M) ? Emulator.getTexts().getValue("gender.him") : Emulator.getTexts().getValue("gender.her"))), gameClient.getHabbo(), gameClient.getHabbo(), RoomChatMessageBubbles.NORMAL)).compose()); + } + } + } + return true; + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/PushCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/PushCommand.java new file mode 100644 index 00000000..b6a1f9e5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/PushCommand.java @@ -0,0 +1,70 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class PushCommand extends Command +{ + public PushCommand() + { + super("cmd_push", Emulator.getTexts().getValue("commands.keys.cmd_push").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + Habbo habbo = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_push.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else if(habbo == gameClient.getHabbo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_push.push_self"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + RoomTile tFront = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(gameClient.getHabbo().getRoomUnit().getCurrentLocation(), gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (tFront != null && tFront.isWalkable()) + { + if (tFront.x == habbo.getRoomUnit().getX() && tFront.y == habbo.getRoomUnit().getY()) + { + RoomTile tFrontTarget = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(habbo.getRoomUnit().getCurrentLocation(), gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (tFrontTarget != null && tFrontTarget.isWalkable()) + { + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getDoorTile() == tFrontTarget) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_push.invalid").replace("%username%", params[1])); + return true; + } + habbo.getRoomUnit().setGoalLocation(tFrontTarget); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(Emulator.getTexts().getValue("commands.succes.cmd_push.push").replace("%user%", params[1]).replace("%gender_name%", (gameClient.getHabbo().getHabboInfo().getGender().equals(HabboGender.M) ? Emulator.getTexts().getValue("gender.him") : Emulator.getTexts().getValue("gender.her"))), gameClient.getHabbo(), gameClient.getHabbo(), RoomChatMessageBubbles.NORMAL)).compose()); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_push.cant_reach").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + } + } + return true; + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RedeemCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RedeemCommand.java new file mode 100644 index 00000000..c6baa3b0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RedeemCommand.java @@ -0,0 +1,124 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItems; +import gnu.trove.map.TIntIntMap; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TIntIntProcedure; + +import java.util.ArrayList; + +public class RedeemCommand extends Command +{ + public RedeemCommand() + { + super("cmd_redeem", Emulator.getTexts().getValue("commands.keys.cmd_redeem").split(";")); + } + + @Override + public boolean handle(final GameClient gameClient, String[] params) throws Exception + { + ArrayList items = new ArrayList(); + + int credits = 0; + int pixels = 0; + + TIntIntMap points = new TIntIntHashMap(); + + + for(HabboItem item : gameClient.getHabbo().getInventory().getItemsComponent().getItemsAsValueCollection()) + { + if (item.getBaseItem().getName().startsWith("CF_") || item.getBaseItem().getName().startsWith("CFC_") || item.getBaseItem().getName().startsWith("DF_") || item.getBaseItem().getName().startsWith("PF_")) + { + items.add(item); + if ((item.getBaseItem().getName().startsWith("CF_") || item.getBaseItem().getName().startsWith("CFC_")) && !item.getBaseItem().getName().contains("_diamond_")) + { + try + { + credits += Integer.valueOf(item.getBaseItem().getName().split("_")[1]); + } catch (Exception e) + { + } + + } else if (item.getBaseItem().getName().startsWith("PF_")) + { + try + { + pixels += Integer.valueOf(item.getBaseItem().getName().split("_")[1]); + } catch (Exception e) + { + } + } else if (item.getBaseItem().getName().startsWith("DF_")) + { + int pointsType = 0; + int pointsAmount = 0; + + pointsType = Integer.valueOf(item.getBaseItem().getName().split("_")[1]); + pointsAmount = Integer.valueOf(item.getBaseItem().getName().split("_")[2]); + + points.adjustOrPutValue(pointsType, pointsAmount, pointsAmount); + } + else if (item.getBaseItem().getName().startsWith("CF_diamond_")) + { + try + { + int amount = Integer.valueOf(item.getBaseItem().getName().split("_")[2]); + points.adjustOrPutValue(5, amount, amount); + } + catch (Exception e) + { + } + } + } + } + + TIntObjectHashMap deleted = new TIntObjectHashMap(); + for(HabboItem item : items) + { + gameClient.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); + deleted.put(item.getId(), item); + } + + Emulator.getThreading().run(new QueryDeleteHabboItems(deleted)); + + gameClient.sendResponse(new InventoryRefreshComposer()); + gameClient.getHabbo().giveCredits(credits); + gameClient.getHabbo().givePixels(pixels); + + final String[] message = {Emulator.getTexts().getValue("generic.redeemed")}; + + message[0] += Emulator.getTexts().getValue("generic.credits"); + message[0] += ": " + credits; + + if(pixels > 0) + { + message[0] += ", " + Emulator.getTexts().getValue("generic.pixels"); + message[0] += ": " + pixels + ""; + } + + if(!points.isEmpty()) + { + points.forEachEntry(new TIntIntProcedure() + { + @Override + public boolean execute(int a, int b) + { + gameClient.getHabbo().givePoints(a, b); + message[0] += " ," + Emulator.getTexts().getValue("seasonal.name." + a) + ": " + b; + return true; + } + }); + } + + gameClient.getHabbo().whisper(message[0], RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java new file mode 100644 index 00000000..aea8ea0c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ReloadRoomCommand.java @@ -0,0 +1,46 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.Collection; + +public class ReloadRoomCommand extends Command +{ + public ReloadRoomCommand() + { + super("cmd_reload_room", Emulator.getTexts().getValue("commands.keys.cmd_reload_room").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) + { + Collection habbos = new ArrayList(room.getHabbos()); + Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); + room = Emulator.getGameEnvironment().getRoomManager().loadRoom(room.getId()); + ServerMessage message = new ForwardToRoomComposer(room.getId()).compose(); + for(Habbo habbo : habbos) + { + habbo.getClient().sendResponse(message); + } + } + } + }, 100); + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomAlertCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomAlertCommand.java new file mode 100644 index 00000000..a563b54e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomAlertCommand.java @@ -0,0 +1,47 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class RoomAlertCommand extends Command +{ + public RoomAlertCommand() + { + super("cmd_roomalert", Emulator.getTexts().getValue("commands.keys.cmd_roomalert").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + String message = ""; + + if (params.length >= 2) + { + for (int i = 1; i < params.length; i++) + { + message += params[i] + " "; + } + + if (message.isEmpty()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_roomalert.empty"), RoomChatMessageBubbles.ALERT); + return true; + } + + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room != null) + { + room.sendComposer(new GenericAlertComposer(message).compose()); + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomBundleCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomBundleCommand.java new file mode 100644 index 00000000..4dd8242f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomBundleCommand.java @@ -0,0 +1,90 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.catalog.CatalogPageLayouts; +import com.eu.habbo.habbohotel.catalog.layouts.RoomBundleLayout; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.sql.*; + +public class RoomBundleCommand extends Command +{ + public RoomBundleCommand() + { + super("cmd_bundle", Emulator.getTexts().getValue("commands.keys.cmd_bundle").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + int parentId; + int credits; + int points; + int pointsType; + + if(params.length < 5) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_bundle.missing_params"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(Emulator.getGameEnvironment().getCatalogManager().getCatalogPage("room_bundle_" + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId()) != null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_bundle.duplicate"), RoomChatMessageBubbles.ALERT); + return true; + } + + parentId = Integer.valueOf(params[1]); + credits = Integer.valueOf(params[2]); + points = Integer.valueOf(params[3]); + pointsType = Integer.valueOf(params[4]); + + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().createCatalogPage("Room Bundle: " + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getName(), "room_bundle_" + gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId(), gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId(), 0, CatalogPageLayouts.room_bundle, gameClient.getHabbo().getHabboInfo().getRank().getId(), parentId); + + if(page instanceof RoomBundleLayout) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO catalog_items (page_id, item_ids, catalog_name, cost_credits, cost_points, points_type ) VALUES (?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, page.getId()); + statement.setString(2, ""); + statement.setString(3, "room_bundle"); + statement.setInt(4, credits); + statement.setInt(5, points); + statement.setInt(6, pointsType); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + try (PreparedStatement stmt = connection.prepareStatement("SELECT * FROM catalog_items WHERE id = ?")) + { + stmt.setInt(1, set.getInt(1)); + try (ResultSet st = stmt.executeQuery()) + { + if (st.next()) + { + page.addItem(new CatalogItem(st)); + } + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + ((RoomBundleLayout)page).loadItems(gameClient.getHabbo().getHabboInfo().getCurrentRoom()); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_bundle").replace("%id%", page.getId() + ""), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomCreditsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomCreditsCommand.java new file mode 100644 index 00000000..f56450ba --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomCreditsCommand.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.procedure.TObjectProcedure; + +public class RoomCreditsCommand extends Command +{ + public RoomCreditsCommand() + { + super("cmd_roomcredits", Emulator.getTexts().getValue("commands.keys.cmd_roomcredits").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + int amount; + + try + { + amount = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masscredits.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(amount != 0) + { + final String message = Emulator.getTexts().getValue("commands.generic.cmd_credits.received").replace("%amount%", amount + ""); + final int finalAmount = amount; + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.giveCredits(finalAmount); + habbo.whisper(message, RoomChatMessageBubbles.ALERT); + } + } + return true; + } + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masscredits.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomDanceCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomDanceCommand.java new file mode 100644 index 00000000..86a76404 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomDanceCommand.java @@ -0,0 +1,59 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.DanceType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDanceComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.NoSuchElementException; + +public class RoomDanceCommand extends Command +{ + public RoomDanceCommand() + { + super("cmd_danceall", Emulator.getTexts().getValue("commands.keys.cmd_danceall").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + int danceId; + + try + { + danceId = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_danceall.invalid_dance"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(danceId < 0 || danceId > 4) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_danceall.outside_bounds"), RoomChatMessageBubbles.ALERT); + return true; + } + + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.getRoomUnit().setDanceType(DanceType.values()[danceId]); + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDanceComposer(habbo.getRoomUnit()).compose()); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_danceall.no_dance"), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomEffectCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomEffectCommand.java new file mode 100644 index 00000000..fbd16ed7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomEffectCommand.java @@ -0,0 +1,57 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.NoSuchElementException; + +public class RoomEffectCommand extends Command +{ + public RoomEffectCommand() + { + super("cmd_roomeffect", Emulator.getTexts().getValue("commands.keys.cmd_roomeffect").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_roomeffect.no_effect"), RoomChatMessageBubbles.ALERT); + return true; + } + + try + { + int effectId = Integer.valueOf(params[1]); + + if(effectId >= 0) + { + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.getRoomUnit().setEffectId(effectId); + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserEffectComposer(habbo.getRoomUnit()).compose()); + } + + return true; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_roomeffect.positive"), RoomChatMessageBubbles.ALERT); + return true; + } + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_roomeffect.numbers_only"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomGiftCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomGiftCommand.java new file mode 100644 index 00000000..761fd254 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomGiftCommand.java @@ -0,0 +1,87 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.util.Map; + +public class RoomGiftCommand extends Command +{ + public RoomGiftCommand() + { + super("cmd_roomgift", Emulator.getTexts().getValue("commands.keys.cmd_roomgift").split(";")); + } + + @Override + public boolean handle(final GameClient gameClient, String[] params) throws Exception + { + if(params.length >= 2) + { + try + { + int itemId = Integer.valueOf(params[1]); + + if(itemId < 0) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"), RoomChatMessageBubbles.ALERT); + return true; + } + + final Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem(itemId); + + if(baseItem == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_found").replace("%itemid%", itemId + ""), RoomChatMessageBubbles.ALERT); + return true; + } + + String message = ""; + + if(params.length > 2) + { + for (int i = 2; i < params.length; i++) + { + message += params[i] + " "; + } + } + + final String finalMessage = message; + + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, 0, 0, ""); + + Item giftItem = Emulator.getGameEnvironment().getItemManager().getItem((Integer) Emulator.getGameEnvironment().getCatalogManager().giftFurnis.values().toArray()[Emulator.getRandom().nextInt(Emulator.getGameEnvironment().getCatalogManager().giftFurnis.size())]); + + String extraData = "1\t" + item.getId(); + extraData += "\t0\t0\t0\t"+ finalMessage +"\t0\t0"; + + Emulator.getGameEnvironment().getItemManager().createGift(habbo.getHabboInfo().getUsername(), giftItem, extraData, 0, 0); + + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_RECEIVED_ITEM)); + } + + return true; + } + catch (Exception e) + { + e.printStackTrace(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomItemCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomItemCommand.java new file mode 100644 index 00000000..6ac204eb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomItemCommand.java @@ -0,0 +1,64 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserHandItemComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.NoSuchElementException; + +public class RoomItemCommand extends Command +{ + public RoomItemCommand() + { + super("cmd_roomitem", Emulator.getTexts().getValue("commands.keys.cmd_roomitem").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + int itemId = 0; + + if(params.length >= 2) + { + try + { + itemId = Integer.valueOf(params[1]); + + if(itemId < 0) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_roomitem.positive"), RoomChatMessageBubbles.ALERT); + return true; + } + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_roomitem.no_item"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.getRoomUnit().setHandItem(itemId); + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserHandItemComposer(habbo.getRoomUnit()).compose()); + } + + if(itemId > 0) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_roomitem.given").replace("%item%", itemId + ""), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_roomitem.removed"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomKickCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomKickCommand.java new file mode 100644 index 00000000..cc79c03d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomKickCommand.java @@ -0,0 +1,44 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.procedure.TObjectProcedure; + +public class RoomKickCommand extends Command +{ + public RoomKickCommand() + { + super("cmd_kickall", Emulator.getTexts().getValue("commands.keys.cmd_kickall").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + final Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + if(room != null) + { + if(params.length > 1) + { + String message = ""; + for (int i = 1; i < params.length; i++) + { + message += params[i] + " "; + } + room.sendComposer(new GenericAlertComposer(message + "\r\n-" + gameClient.getHabbo().getHabboInfo().getUsername()).compose()); + } + + for (Habbo habbo : room.getHabbos()) + { + if (!(habbo.hasPermission("acc_unkickable") || habbo.hasPermission("acc_supporttool") || room.isOwner(habbo))) + { + room.kickHabbo(habbo, true); + } + } + } + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomMuteCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomMuteCommand.java new file mode 100644 index 00000000..7258faf8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomMuteCommand.java @@ -0,0 +1,30 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class RoomMuteCommand extends Command +{ + public RoomMuteCommand() + { + super("cmd_roommute", Emulator.getTexts().getValue("commands.keys.cmd_roommute").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room != null) + { + room.setMuted(!room.isMuted()); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_roommute." + (room.isMuted() ? "muted" : "unmuted")), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomPixelsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomPixelsCommand.java new file mode 100644 index 00000000..9aa409e6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomPixelsCommand.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.procedure.TObjectProcedure; + +public class RoomPixelsCommand extends Command +{ + public RoomPixelsCommand() + { + super("cmd_roompixels", Emulator.getTexts().getValue("commands.keys.cmd_roompixels").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + int amount; + + try + { + amount = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_massduckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(amount != 0) + { + final String message = Emulator.getTexts().getValue("commands.generic.cmd_duckets.received").replace("%amount%", amount + ""); + final int finalAmount = amount; + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.givePixels(finalAmount); + habbo.whisper(message, RoomChatMessageBubbles.ALERT); + } + } + return true; + } + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_massduckets.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/RoomPointsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/RoomPointsCommand.java new file mode 100644 index 00000000..baa6690e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/RoomPointsCommand.java @@ -0,0 +1,88 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.procedure.TObjectProcedure; + +public class RoomPointsCommand extends Command +{ + public RoomPointsCommand() + { + super("cmd_roompoints", Emulator.getTexts().getValue("commands.keys.cmd_roompoints").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + int type = Emulator.getConfig().getInt("seasonal.primary.type"); + String amountString = ""; + if(params.length == 3) + { + try + { + type = Integer.valueOf(params[1]); + } catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_type").replace("%types%", Emulator.getConfig().getValue("seasonal.types").replace(";", ", ")), RoomChatMessageBubbles.ALERT); + return true; + } + + amountString = params[2]; + } + else if(params.length == 2) + { + amountString = params[1]; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + boolean found = false; + for(String s : Emulator.getConfig().getValue("seasonal.types").split(";")) + { + if(s.equalsIgnoreCase(type + "")) + { + found = true; + break; + } + } + + if(!found) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_type").replace("%types%", Emulator.getConfig().getValue("seasonal.types").replace(";", ", ")), RoomChatMessageBubbles.ALERT); + return true; + } + + int amount; + + try + { + amount = Integer.valueOf(amountString); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_masspoints.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(amount != 0) + { + final String message = Emulator.getTexts().getValue("commands.generic.cmd_points.received").replace("%amount%", amount + "").replace("%type%", Emulator.getTexts().getValue("seasonal.name." + type)); + + final int finalType = type; + final int finalAmount = amount; + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.givePoints(finalType, finalAmount); + habbo.whisper(message, RoomChatMessageBubbles.ALERT); + } + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SayAllCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SayAllCommand.java new file mode 100644 index 00000000..b46a28e8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SayAllCommand.java @@ -0,0 +1,47 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.NoSuchElementException; + +public class SayAllCommand extends Command +{ + public SayAllCommand() + { + super("cmd_say_all", Emulator.getTexts().getValue("commands.keys.cmd_say_all").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_say_all.forgot_message"), RoomChatMessageBubbles.ALERT); + return true; + } + + String message = ""; + if(params.length > 1) + { + for(int i = 1; i < params.length; i++) + { + message += params[i] + " "; + } + } + + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.talk(message); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SayCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SayCommand.java new file mode 100644 index 00000000..0c7ddbb9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SayCommand.java @@ -0,0 +1,56 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SayCommand extends Command +{ + public SayCommand() + { + super("cmd_say", Emulator.getTexts().getValue("commands.keys.cmd_say").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_say.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(target == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_say.user_not_found"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + if(target.getHabboInfo().getCurrentRoom() == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_say.hotel_view").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + } + + String message = ""; + if(params.length > 2) + { + for(int i = 2; i < params.length; i++) + { + message += params[i] + " "; + } + } + + target.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(message, target, RoomChatMessageBubbles.NORMAL)).compose()); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_say").replace("%user%", params[1]).replace("%message%", message), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SetMaxCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SetMaxCommand.java new file mode 100644 index 00000000..1d18f942 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SetMaxCommand.java @@ -0,0 +1,49 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SetMaxCommand extends Command +{ + public SetMaxCommand() + { + super("cmd_setmax", Emulator.getTexts().getValue("commands.keys.cmd_setmax").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (params.length >= 2) + { + int max = 0; + try + { + max = Integer.valueOf(params[1]); + } + catch (Exception e) + { + return false; + } + + if (max > 0 && max < 9999) + { + gameClient.getHabbo().getHabboInfo().getCurrentRoom().setUsersMax(max); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.success.cmd_setmax").replace("%value%", max + ""), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_setmax.invalid_number"), RoomChatMessageBubbles.ALERT); + return true; + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_setmax.forgot_number"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SetPollCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SetPollCommand.java new file mode 100644 index 00000000..27420e1b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SetPollCommand.java @@ -0,0 +1,58 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SetPollCommand extends Command +{ + public SetPollCommand() + { + super("cmd_set_poll", Emulator.getTexts().getValue("commands.keys.cmd_set_poll").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (params.length >= 2) + { + if (gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + int pollId = -1; + try + { + pollId = Integer.valueOf(params[1]); + } + catch (Exception e) + { + + } + + if (pollId >= 0) + { + if (Emulator.getGameEnvironment().getPollManager().getPoll(pollId) != null) + { + gameClient.getHabbo().getHabboInfo().getCurrentRoom().setPollId(pollId); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_set_poll"), RoomChatMessageBubbles.ALERT); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_set_poll.not_found"), RoomChatMessageBubbles.ALERT); + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_set_poll.invalid_number"), RoomChatMessageBubbles.ALERT); + } + } + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_set_poll.missing_arg"), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SetSpeedCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SetSpeedCommand.java new file mode 100644 index 00000000..1615e822 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SetSpeedCommand.java @@ -0,0 +1,53 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SetSpeedCommand extends Command +{ + public SetSpeedCommand() + { + super("cmd_setspeed", Emulator.getTexts().getValue("commands.keys.cmd_setspeed").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom().hasRights(gameClient.getHabbo())) + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + int oldSpeed = room.getRollerSpeed(); + int newSpeed; + + try + { + newSpeed = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_setspeed.invalid_amount"), RoomChatMessageBubbles.ALERT); + return true; + } + + if(newSpeed < -1 || newSpeed > Emulator.getConfig().getInt("hotel.rollers.speed.maximum")) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_setspeed.bounds"), RoomChatMessageBubbles.ALERT); + return true; + } + + room.setRollerSpeed(newSpeed); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_setspeed").replace("%oldspeed%", oldSpeed + "").replace("%newspeed%", newSpeed + ""), RoomChatMessageBubbles.ALERT); + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ShoutAllCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ShoutAllCommand.java new file mode 100644 index 00000000..5496a561 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ShoutAllCommand.java @@ -0,0 +1,47 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserShoutComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.NoSuchElementException; + +public class ShoutAllCommand extends Command +{ + public ShoutAllCommand() + { + super("cmd_shout_all", Emulator.getTexts().getValue("commands.keys.cmd_shout_all").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_shout_all.forgot_message"), RoomChatMessageBubbles.ALERT); + return true; + } + + String message = ""; + if(params.length > 1) + { + for(int i = 1; i < params.length; i++) + { + message += params[i] + " "; + } + } + + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + habbo.shout(message); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ShoutCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ShoutCommand.java new file mode 100644 index 00000000..e7d2e548 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ShoutCommand.java @@ -0,0 +1,58 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserShoutComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class ShoutCommand extends Command +{ + private static String idea = "Kudo's To Droppy for this idea!"; + + public ShoutCommand() + { + super("cmd_shout", Emulator.getTexts().getValue("commands.keys.cmd_shout").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_shout.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(target == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_shout.user_not_found"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + if(target.getHabboInfo().getCurrentRoom() == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_shout.hotel_view").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + } + + String message = ""; + if(params.length > 2) + { + for(int i = 2; i < params.length; i++) + { + message += params[i] + " "; + } + } + + target.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserShoutComposer(new RoomChatMessage(message, target, RoomChatMessageBubbles.NORMAL)).compose()); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_shout").replace("%user%", params[1]).replace("%message%", message), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/ShutdownCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/ShutdownCommand.java new file mode 100644 index 00000000..ebac644e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/ShutdownCommand.java @@ -0,0 +1,62 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer; +import com.eu.habbo.threading.runnables.ShutdownEmulator; + +public class ShutdownCommand extends Command +{ + public ShutdownCommand() + { + super("cmd_shutdown", Emulator.getTexts().getValue("commands.keys.cmd_shutdown").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + String reason = "-"; + int minutes = 0; + if(params.length > 2) + { + reason = ""; + for(int i = 1; i < params.length; i++) + { + reason += params[i] + " "; + } + } + else + { + if (params.length == 2) + { + try + { + minutes = Integer.valueOf(params[1]); + } + catch (Exception e) + { + reason = params[1]; + } + } + } + + ServerMessage message = null; + if (!reason.equals("-")) + { + message = new GenericAlertComposer("" + Emulator.getTexts().getValue("generic.warning") + " \r\n" + + Emulator.getTexts().getValue("generic.shutdown").replace("%minutes%", minutes + "") + "\r\n" + + Emulator.getTexts().getValue("generic.reason.specified") + ": " + reason + "\r" + + "\r" + + "- " + gameClient.getHabbo().getHabboInfo().getUsername()).compose(); + } + else + { + message = new HotelWillCloseInMinutesComposer(minutes).compose(); + } + ShutdownEmulator.timestamp = Emulator.getIntUnixTimestamp() + (60 * minutes); + Emulator.getThreading().run(new ShutdownEmulator(message), minutes * 60 * 1000); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SitCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SitCommand.java new file mode 100644 index 00000000..b756eac6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SitCommand.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; + +public class SitCommand extends Command +{ + public SitCommand() + { + super(null, Emulator.getTexts().getValue("commands.keys.cmd_sit").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.getHabbo().getHabboInfo().getCurrentRoom().makeSit(gameClient.getHabbo()); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SitDownCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SitDownCommand.java new file mode 100644 index 00000000..c526f38b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SitDownCommand.java @@ -0,0 +1,36 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.NoSuchElementException; + +public class SitDownCommand extends Command +{ + public SitDownCommand() + { + super("cmd_sitdown", Emulator.getTexts().getValue("commands.keys.cmd_sitdown").split(";")); + } + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + for (Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + if(habbo.getRoomUnit().isWalking()) + { + habbo.getRoomUnit().stopWalking(); + } + else if(habbo.getRoomUnit().getStatus().containsKey("sit")) + { + continue; + } + + gameClient.getHabbo().getHabboInfo().getCurrentRoom().makeSit(habbo); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/StaffAlertCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/StaffAlertCommand.java new file mode 100644 index 00000000..5c5e12a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/StaffAlertCommand.java @@ -0,0 +1,41 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.messenger.Message; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.friends.FriendChatMessageComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class StaffAlertCommand extends Command +{ + public StaffAlertCommand() + { + super("cmd_staffalert", Emulator.getTexts().getValue("commands.keys.cmd_staffalert").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length > 1) + { + String message = ""; + for (int i = 1; i < params.length; i++) + { + message += params[i] + " "; + } + + Emulator.getGameEnvironment().getHabboManager().staffAlert(message + "\r\n-" + gameClient.getHabbo().getHabboInfo().getUsername()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new FriendChatMessageComposer(new Message(gameClient.getHabbo().getHabboInfo().getId(), -1, message)).compose(), "acc_staff_chat", gameClient); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_staffalert.forgot_message"), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/StaffOnlineCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/StaffOnlineCommand.java new file mode 100644 index 00000000..80a7562d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/StaffOnlineCommand.java @@ -0,0 +1,88 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Map; + +public class StaffOnlineCommand extends Command +{ + public StaffOnlineCommand() + { + super("cmd_staffonline", Emulator.getTexts().getValue("commands.keys.cmd_staffonline").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + int minRank = Emulator.getConfig().getInt("commands.cmd_staffonline.min_rank"); + + if(params.length >= 2) + { + try + { + int i = Integer.valueOf(params[1]); + + if(i < 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_staffonline.positive_only"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + minRank = i; + } + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_staffonline.numbers_only"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + synchronized (Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos()) + { + ArrayList staffs = new ArrayList(); + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + if(set.getValue().getHabboInfo().getRank().getId() >= minRank) + { + staffs.add(set.getValue()); + } + } + + Collections.sort(staffs, new Comparator() + { + @Override + public int compare(Habbo o1, Habbo o2) + { + return o1.getHabboInfo().getId() - o2.getHabboInfo().getId(); + } + }); + + String message = Emulator.getTexts().getValue("commands.generic.cmd_staffonline.staffs"); + message += "\r\n"; + + for(Habbo habbo : staffs) + { + message += habbo.getHabboInfo().getUsername(); + message += ": "; + message += habbo.getHabboInfo().getRank().getName(); + message += "\r"; + } + + gameClient.sendResponse(new GenericAlertComposer(message)); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/StalkCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/StalkCommand.java new file mode 100644 index 00000000..b21e7482 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/StalkCommand.java @@ -0,0 +1,65 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomDataComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomEntryInfoComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomOpenComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class StalkCommand extends Command +{ + public StalkCommand() + { + super("cmd_stalk", Emulator.getTexts().getValue("commands.keys.cmd_stalk").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() == null) + return true; + + if(params.length >= 2) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_stalk.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(habbo.getHabboInfo().getCurrentRoom() == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_stalk.not_room").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(gameClient.getHabbo().getHabboInfo().getUsername().equals(habbo.getHabboInfo().getUsername())) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.generic.cmd_stalk.self").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() == habbo.getHabboInfo().getCurrentRoom()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.generic.cmd_stalk.same_room").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + gameClient.sendResponse(new RoomDataComposer(habbo.getHabboInfo().getCurrentRoom(), gameClient.getHabbo(), true, false)); + //gameClient.sendResponse(new ForwardToRoomComposer(habbo.getHabboInfo().getCurrentRoom().getId())); + return true; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_summon.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SummonCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SummonCommand.java new file mode 100644 index 00000000..dd742d93 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SummonCommand.java @@ -0,0 +1,76 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.HideDoorbellComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SummonCommand extends Command +{ + public SummonCommand() + { + super("cmd_summon", Emulator.getTexts().getValue("commands.keys.cmd_summon").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() == null) + return true; + + if(params.length >= 2) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_summon.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(gameClient.getHabbo().getHabboInfo().getUsername().equals(habbo.getHabboInfo().getUsername())) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.generic.cmd_summon.self").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom() == habbo.getHabboInfo().getCurrentRoom()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.generic.cmd_summon.same_room").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.generic.cmd_summon.summoning").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + + //Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, habbo.getHabboInfo().getCurrentRoom()); + + habbo.getClient().sendResponse(new ForwardToRoomComposer(gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId())); + Emulator.getGameEnvironment().getRoomManager().enterRoom(habbo, gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId(), "", true); + habbo.getClient().sendResponse(new HideDoorbellComposer("")); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_summon.summoned").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + + RoomTile t = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(gameClient.getHabbo().getRoomUnit().getCurrentLocation(), gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if(t != null && gameClient.getHabbo().getHabboInfo().getCurrentRoom().tileWalkable(t)) + { + habbo.getRoomUnit().setGoalLocation(t); + } + + habbo.getClient().sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_summon.been_summoned").replace("%user%", gameClient.getHabbo().getHabboInfo().getUsername()))); + + return true; + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_summon.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SummonRankCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SummonRankCommand.java new file mode 100644 index 00000000..900c4d58 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SummonRankCommand.java @@ -0,0 +1,56 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.util.Map; + +public class SummonRankCommand extends Command +{ + public SummonRankCommand() + { + super("cmd_summonrank", Emulator.getTexts().getValue("commands.keys.cmd_summonrank").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + int minRank = 1; + + if(params.length >= 2) + { + try + { + minRank = Integer.valueOf(params[1]); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.generic.cmd_summonrank.error"), RoomChatMessageBubbles.ALERT); + return true; + } + + for(Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + if(set.getValue().getHabboInfo().getRank().getId() >= minRank) + { + if(set.getValue() == gameClient.getHabbo()) + continue; + + if (set.getValue().getHabboInfo().getCurrentRoom() == gameClient.getHabbo().getHabboInfo().getCurrentRoom()) + continue; + + Emulator.getGameEnvironment().getRoomManager().leaveRoom(set.getValue(), set.getValue().getHabboInfo().getCurrentRoom()); + set.getValue().getClient().sendResponse(new ForwardToRoomComposer(gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId())); + Emulator.getGameEnvironment().getRoomManager().enterRoom(set.getValue(), gameClient.getHabbo().getHabboInfo().getCurrentRoom().getId(), "", true); + } + } + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SuperPullCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SuperPullCommand.java new file mode 100644 index 00000000..ec5a48bd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SuperPullCommand.java @@ -0,0 +1,57 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SuperPullCommand extends Command +{ + public SuperPullCommand() + { + super("cmd_superpull", Emulator.getTexts().getValue("commands.keys.cmd_superpull").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 2) + { + Habbo habbo = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else if(habbo == gameClient.getHabbo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.pull_self"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + RoomTile tile = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(gameClient.getHabbo().getRoomUnit().getCurrentLocation(), gameClient.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (tile != null && tile.isWalkable()) + { + if (tile == gameClient.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getDoorTile()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_pull.invalid").replace("%username%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + habbo.getRoomUnit().setGoalLocation(tile); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(Emulator.getTexts().getValue("commands.succes.cmd_pull.pull").replace("%user%", params[1]).replace("%gender_name%", (gameClient.getHabbo().getHabboInfo().getGender().equals(HabboGender.M) ? Emulator.getTexts().getValue("gender.him") : Emulator.getTexts().getValue("gender.her"))), gameClient.getHabbo(), gameClient.getHabbo(), RoomChatMessageBubbles.NORMAL)).compose()); + } + } + return true; + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/SuperbanCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/SuperbanCommand.java new file mode 100644 index 00000000..1907291e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/SuperbanCommand.java @@ -0,0 +1,76 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.modtool.ModToolBanType; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class SuperbanCommand extends Command +{ + public SuperbanCommand() + { + super("cmd_super_ban", Emulator.getTexts().getValue("commands.keys.cmd_super_ban").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + HabboInfo habbo = null; + String reason = ""; + if (params.length >= 2) + { + Habbo h = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if (h != null) + { + habbo = h.getHabboInfo(); + } + else + { + habbo = HabboManager.getOfflineHabboInfo(params[1]); + } + } + + if (params.length > 2) + { + for (int i = 2; i < params.length; i++) + { + reason += params[i]; + reason += " "; + } + } + + int count = 0; + if (habbo != null) + { + if (habbo == gameClient.getHabbo().getHabboInfo()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_super_ban.ban_self"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (habbo.getRank().getId() >= gameClient.getHabbo().getHabboInfo().getRank().getId()) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.target_rank_higher"), RoomChatMessageBubbles.ALERT); + return true; + } + + count = Emulator.getGameEnvironment().getModToolManager().ban(habbo.getId(), gameClient.getHabbo(), reason, IPBanCommand.TEN_YEARS, ModToolBanType.SUPER, -1).size(); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_ban.user_offline"), RoomChatMessageBubbles.ALERT); + return true; + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_super_ban").replace("%count%", count + ""), RoomChatMessageBubbles.ALERT); + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/TakeBadgeCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/TakeBadgeCommand.java new file mode 100644 index 00000000..d32d35c7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/TakeBadgeCommand.java @@ -0,0 +1,61 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.outgoing.inventory.InventoryBadgesComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class TakeBadgeCommand extends Command +{ + public TakeBadgeCommand() + { + super("cmd_take_badge", Emulator.getTexts().getValue("commands.keys.cmd_take_badge").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (params.length == 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_take_badge.forgot_badge"), RoomChatMessageBubbles.ALERT); + return true; + } + else if ( params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_take_badge.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (params.length == 3) + { + String username = params[1]; + String badge = params[2]; + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(username); + + if (habbo != null) + { + HabboBadge b = habbo.getInventory().getBadgesComponent().removeBadge(badge); + + if (b == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_take_badge.no_badge").replace("%username%", username).replace("%badge%", badge), RoomChatMessageBubbles.ALERT); + return true; + } + + habbo.getClient().sendResponse(new InventoryBadgesComposer(habbo)); + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_take_badge"), RoomChatMessageBubbles.ALERT); + + BadgesComponent.deleteBadge(username, badge); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/TeleportCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/TeleportCommand.java new file mode 100644 index 00000000..2ad50840 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/TeleportCommand.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class TeleportCommand extends Command +{ + public TeleportCommand() + { + super("cmd_teleport", Emulator.getTexts().getValue("commands.keys.cmd_teleport").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getRoomUnit().cmdTeleport) + { + gameClient.getHabbo().getRoomUnit().cmdTeleport = false; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_teleport.disabled"), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + gameClient.getHabbo().getRoomUnit().cmdTeleport = true; + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_teleport.enabled"), RoomChatMessageBubbles.ALERT); + return true; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/TestCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/TestCommand.java new file mode 100644 index 00000000..a593c37e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/TestCommand.java @@ -0,0 +1,622 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.Incoming; +import com.eu.habbo.messages.incoming.gamecenter.GameCenterRequestAccountStatusEvent; +import com.eu.habbo.messages.incoming.gamecenter.GameCenterRequestGamesEvent; +import com.eu.habbo.messages.incoming.rooms.pets.MovePetEvent; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import com.eu.habbo.messages.outgoing.events.calendar.AdventCalendarDataComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.MessagesForYouComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.PetInformationComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.PetStatusUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.unknown.NuxAlertComposer; +import com.eu.habbo.messages.outgoing.users.UserDataComposer; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import gnu.trove.procedure.TObjectProcedure; +import org.joda.time.Days; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.text.Normalizer; +import java.time.Duration; +import java.time.LocalDate; +import java.time.Period; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class TestCommand extends Command +{ + public static boolean stopThreads = true; + + public TestCommand() + { + super("acc_debug", new String[]{ "test" }); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { +// if (true) +// return false; + + if (params[1].equals("ach")) + { + AchievementManager.progressAchievement(gameClient.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GiftGiver"), 100); + return true; + } + + if (params[1].equals("asddsa")) + { + gameClient.getHabbo().getHabboStats().addAchievementScore(1000); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(gameClient.getHabbo()).compose()); + return true; + } + + if (params[1].equals("gc")) + { + + Emulator.getGameServer().getPacketManager().registerHandler(Incoming.GameCenterRequestGamesEvent, GameCenterRequestGamesEvent.class); + Emulator.getGameServer().getPacketManager().registerHandler(Incoming.GameCenterRequestAccountStatusEvent, GameCenterRequestAccountStatusEvent.class); + return true; + } + + if (params[1].equals("namechange")) + { + gameClient.sendResponse(new UserDataComposer(gameClient.getHabbo())); + return true; + } + //Emulator.getGameEnvironment().getRoomManager().clearInactiveRooms(); + //gameClient.sendResponse(new RoomDataComposer(gameClient.getHabbo().getHabboInfo().getCurrentRoom(), gameClient.getHabbo(), true, false)); + + if (params[1].equals("uach")) + { + Emulator.getGameEnvironment().getAchievementManager().reload(); + } + + if(params[1].equals("units")) + { + String s = ""; + + for(Habbo habbo : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabbos()) + { + s += "Habbo ID: " + habbo.getHabboInfo().getId() + ", RoomUnit ID: " + habbo.getRoomUnit().getId() + "\r"; + } + + for (AbstractPet pet : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getCurrentPets().valueCollection()) + { + s += "Pet ID: " + pet.getId() + ", RoomUnit ID: " + pet.getRoomUnit().getId() + ", Name: " + pet.getName(); + + if (pet instanceof MonsterplantPet) + { + s += ", B:" + (((MonsterplantPet) pet).canBreed() ? "Y" : "N") + + ", PB: " + (((MonsterplantPet)pet).isPubliclyBreedable() ? "Y" : "N" ) + + ", D: " + (((MonsterplantPet) pet).isDead() ? "Y" : "N"); + } + + s += "\r"; + } + + gameClient.sendResponse(new MessagesForYouComposer(new String[]{s})); + return true; + } + + if (params[1].equalsIgnoreCase("rebr")) + { + for (AbstractPet pet : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getCurrentPets().valueCollection()) + { + if (pet instanceof MonsterplantPet) + { + ((MonsterplantPet) pet).setPubliclyBreedable(false); + ((MonsterplantPet) pet).setCanBreed(true); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new PetStatusUpdateComposer((Pet) pet).compose()); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new PetInformationComposer(pet, gameClient.getHabbo().getHabboInfo().getCurrentRoom()).compose()); + } + } + + return true; + } + + if (params[1].equalsIgnoreCase("bots")) + { + String message = ""; + + for (Bot bot : gameClient.getHabbo().getHabboInfo().getCurrentRoom().getCurrentBots().valueCollection()) + { + message += "Name: " + bot.getName() + ", ID: " + bot.getId() + ", RID: " + bot.getRoomUnit().getId() + ", Rot: " + bot.getRoomUnit().getBodyRotation() + "\r"; + } + + gameClient.sendResponse(new MessagesForYouComposer(new String[]{message})); + return true; + } + + if (params[1].equalsIgnoreCase("packu")) + { + Emulator.getGameServer().getPacketManager().registerHandler(Incoming.MovePetEvent, MovePetEvent.class); + return true; + } + + if(params[1].equals("a")) + { + int count = Integer.valueOf(params[2]); + + for(int i = 0; i < count; i++) + { + gameClient.getHabbo().whisper("" + i, RoomChatMessageBubbles.getBubble(i)); + } + + return true; + } + else if(params[1].equals("b")) + { + try + { + int itemId = Integer.valueOf(params[2]); + + HabboItem item = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item != null) + { + item.setExtradata(params[3]); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().updateItem(item); + } + } + catch (Exception e) + { + + } + return true; + } + else if(params[1].equalsIgnoreCase("pet")) + { + AbstractPet pet = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getPet(Integer.valueOf(params[2])); + + if(pet instanceof Pet) + { + String a = ""; + String b = ""; + String c = ""; + if(params[3] != null) + { + a = params[3]; + if(params.length > 4) + { + b = params[4]; + } + if(params.length > 5) + { + c = params[5]; + } + pet.getRoomUnit().getStatus().put(a, b + " " + c); + gameClient.sendResponse(new RoomUserStatusComposer(pet.getRoomUnit())); + } + } + } + else if (params[1].equalsIgnoreCase("petc")) + { + AbstractPet pet = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getPet(Integer.valueOf(params[2])); + + if (pet != null) + { + pet.getRoomUnit().getStatus().clear(); + gameClient.sendResponse(new RoomUserStatusComposer(pet.getRoomUnit())); + } + } + else if (params[1].equalsIgnoreCase("rand")) + { + Map results = new HashMap(); + + for (int i = 0; i < Integer.valueOf(params[2]); i++) + { + int random = PetManager.random(0, 12, Double.valueOf(params[3])); + + if (!results.containsKey(random)) + { + results.put(random, 0); + } + + results.put(random, results.get(random) + 1); + } + + String result = "Results : " + params[2] + "

    "; + + for (Map.Entry set : results.entrySet()) + { + result += set.getKey() + " -> " + set.getValue() + "
    "; + } + + gameClient.sendResponse(new GenericAlertComposer(result)); + } + else if (params[1].equalsIgnoreCase("threads")) + { + if (stopThreads) + { + stopThreads = false; + for (int i = 0; i < 30; i++) + { + final int finalI = i; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + try + { + Thread.sleep(500); + Emulator.getLogging().logStart("Started " + finalI + " on " + Thread.currentThread().getName()); + if (!TestCommand.stopThreads) + { + Emulator.getThreading().run(this); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + }, i * 10); + } + } + else + { + stopThreads = true; + } + } + else if (params[1].equalsIgnoreCase("pethere")) + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + List tiles = room.getLayout().getTilesAround(gameClient.getHabbo().getRoomUnit().getCurrentLocation()); + + room.getCurrentPets().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(AbstractPet object) + { + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + object.getRoomUnit().setGoalLocation(tiles.get(Emulator.getRandom().nextInt(tiles.size()))); + } + }); + return true; + } + }); + } + else if(params[1].equalsIgnoreCase("st")) + { + gameClient.getHabbo().getRoomUnit().getStatus().put(params[2], params[3]); + gameClient.sendResponse(new RoomUserStatusComposer(gameClient.getHabbo().getRoomUnit())); + } + else if (params[1].equalsIgnoreCase("filt")) + { + gameClient.sendResponse(new GenericAlertComposer(Normalizer.normalize(params[2], Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").replaceAll("\\p{M}", ""))); + } + else if (params[1].equalsIgnoreCase("nux")) + { + gameClient.sendResponse(new MessageComposer() + { + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewUserGiftComposer); + + this.response.appendInt(1); //? + this.response.appendInt(1); // element 1 + this.response.appendInt(2); // element 2 + this.response.appendInt(6); // Totaal cadeaus? + + String[] gift1 = {"throne.png", "throne"}; //Emulator.getConfig().getValue("nux.gift.1").split(";"); + String[] gift2 = {"throne.png", "throne"}; //Emulator.getConfig().getValue("nux.gift.2").split(";"); + String[] gift3 = {"throne.png", "throne"}; //Emulator.getConfig().getValue("nux.gift.3").split(";"); + + this.response.appendString(gift1[0]); + this.response.appendInt(2); + this.response.appendString(gift1[1]); + this.response.appendString(""); + this.response.appendString("typewriter"); + this.response.appendString(""); + + this.response.appendString(gift2[0]); + this.response.appendInt(1); + this.response.appendString(gift2[1]); + this.response.appendString(""); + + this.response.appendString(gift3[0]); + this.response.appendInt(1); + this.response.appendString(gift3[1]); + this.response.appendString(""); + + this.response.appendString(gift1[0]); + this.response.appendInt(2); + this.response.appendString(gift1[1]); + this.response.appendString(""); + this.response.appendString("typewriter"); + this.response.appendString(""); + + this.response.appendString(gift2[0]); + this.response.appendInt(1); + this.response.appendString(gift2[1]); + this.response.appendString(""); + + this.response.appendString(gift3[0]); + this.response.appendInt(1); + this.response.appendString(gift3[1]); + this.response.appendString(""); + + return this.response; + } + }); + } + else if (params[1].equals("adv")) + { + } + else if (params[1].equals("datb")) + { + long millis = 1; + long diff = 1; + try(Connection conn = Emulator.getDatabase().getDataSource().getConnection()) + { + millis = System.currentTimeMillis(); + for (long i = 0; i < 1000000; i++) + { + try (PreparedStatement stmt = conn.prepareStatement("SELECT 1")) + { + //PreparedStatement stmt2 = conn.prepareStatement("SELECT 2"); + stmt.close(); + } + //stmt2.close(); + } + diff = System.currentTimeMillis() - millis; + } + catch (Exception e) + { + e.printStackTrace(); + } + System.out.println("Difference " + (diff) + "MS. ops: " + ((long)1000000 / diff) + " ops/MS"); + + } + else + { + try + { + int header = Integer.valueOf(params[1]); + + ServerMessage message = new ServerMessage(header); + + for (int i = 1; i < params.length; i++) + { + String[] data = params[i].split(":"); + + if (data[0].equalsIgnoreCase("b")) + { + message.appendBoolean(data[1].equalsIgnoreCase("1")); + } else if (data[0].equalsIgnoreCase("s")) + { + if (data.length > 1) + { + message.appendString(data[1].replace("%http%", "http://")); + } else + { + message.appendString(""); + } + } else if (data[0].equals("i")) + { + message.appendInt(Integer.valueOf(data[1])); + } else if (data[0].equalsIgnoreCase("by")) + { + message.appendByte(Integer.valueOf(data[1])); + } else if (data[0].equalsIgnoreCase("sh")) + { + message.appendShort(Integer.valueOf(data[1])); + } + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo("Admin"); + + if(habbo != null) + { + habbo.getClient().sendResponse(message); + } + } catch (Exception e) + { + gameClient.sendResponse(new GenericAlertComposer("Hey, what u doing m8.")); + + return false; + } + } + + + /*if(params[1].equalsIgnoreCase("r")) + { + gameClient.getHabbo().getRoomUnit().getStatus().remove(params[2]); + return true; + } + String s = ""; + for(int i = 2; i < params.length; i++) + { + s+= params[i]; + + if(i + 1 < params.length) + { + s+= " "; + } + } + + gameClient.getHabbo().getRoomUnit().getStatus().put(params[1], s); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserStatusComposer(gameClient.getHabbo().getRoomUnit()).compose());*/ + //if(params.length >= 2) + //{ + // gameClient.sendResponse(new RoomUserActionComposer(gameClient.getHabbo().getRoomUnit(), Integer.valueOf(params[1]))); + //} + + /*if(params.length < 2) + return false; + + /* + :test 1604 i:0 s:a i:1 i:2 i:3 i: 4 s:b i:3 i:1 i:1 s:Admin s:a s:M i:0 i:0 i:0 i:0 + if(params[1].equalsIgnoreCase("purple")) + { + AbstractPet pet = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getPet(13); + + if(pet instanceof Pet) + { + String a = ""; + String b = ""; + String c = ""; + if(params[2] != null) + { + a = params[2]; + if(params.length >= 4) + { + b = params[3]; + } + if(params.length >= 5) + { + c = params[4]; + } + pet.getRoomUnit().getStatus().put(a, b + " " + c); + gameClient.sendResponse(new RoomUserStatusComposer(pet.getRoomUnit())); + } + } + } + else if(params[1].equalsIgnoreCase("clear")) + { + AbstractPet pet = gameClient.getHabbo().getHabboInfo().getCurrentRoom().getPet(13); + + if(pet instanceof Pet) + { + pet.getRoomUnit().getStatus().clear(); + gameClient.sendResponse(new RoomUserStatusComposer(pet.getRoomUnit())); + } + } + else if(params[1].equalsIgnoreCase("club")) + { + gameClient.sendResponse(new ClubDataComposer(gameClient.getHabbo(), Integer.valueOf(params[2]))); + return true; + } + int header = Integer.valueOf(params[1]); + + ServerMessage message = new ServerMessage(); + message.init(header); + + for (int i = 2; i < params.length; i++) + { + String[] data = params[i].split(":"); + System.out.println(data.length + "//"); + if (data[0].equals("i")) + { + message.appendInt(Integer.valueOf(data[1])); + } else if (data[0].equals("s")) + { + if(data[1].equalsIgnoreCase("%look%")) + { + data[1] = gameClient.getHabbo().getHabboInfo().getLook(); + } + message.appendString(data[1]); + } else if (data[0].equals("b")) + { + message.appendBoolean(data[1].equalsIgnoreCase("1")); + } + + } + gameClient.sendResponse(message);*/ + //} + + //int header = Integer.valueOf(params[1]); + + //2823 + //913 + //1604 + //gameClient.sendResponse(new SnowWarsCompose1(913)); + //gameClient.sendResponse(new SnowWarsStartLobbyCounter()); + //gameClient.sendResponse(new SnowWarsQuePositionComposer()); + //gameClient.sendResponse(new SnowWarsCompose1(1604)); + //gameClient.sendResponse(new SnowWarsLevelDataComposer()); + + /* + ServerMessage response = new ServerMessage(); + response.init(Outgoing.RoomUsersComposer); + response.appendInt(1); + response.appendInt(0); + response.appendString(""); + response.appendString(""); + response.appendString(""); + response.appendInt(0); //Room Unit ID + response.appendInt(10); + response.appendInt(10); + response.appendString(""); + response.appendInt(0); + response.appendInt(200); + response.appendString(this.habbo.getHabboInfo().getGender()); + response.appendInt(this.habbo.getHabboStats().guild != 0 ? this.habbo.getHabboStats().guild : -1); + response.appendInt(this.habbo.getHabboStats().guild != 0 ? 1 : -1); + response.appendString(this.habbo.getHabboStats().guild != 0 ? Emulator.getGameEnvironment().getGuildManager().getGuild(this.habbo.getHabboStats().guild).getName() : ""); + response.appendString(""); + response.appendInt(this.habbo.getHabboInfo().getAchievementScore()); + response.appendBoolean(true); + }*/ + return true; + } + + public void testConcurrentClose() throws Exception + { + HikariConfig config = new HikariConfig(); + config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); + + try (HikariDataSource ds = new HikariDataSource(config); + final Connection connection = ds.getConnection()) { + + ExecutorService executorService = Executors.newFixedThreadPool(10); + + List> futures = new ArrayList<>(); + + for (int i = 0; i < 500; i++) { + final PreparedStatement preparedStatement = + connection.prepareStatement(""); + + futures.add(executorService.submit(new Callable() { + + @Override + public Void call() throws Exception { + preparedStatement.close(); + + return null; + } + + })); + } + + executorService.shutdown(); + + for (Future future : futures) { + future.get(); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/TransformCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/TransformCommand.java new file mode 100644 index 00000000..bd09624c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/TransformCommand.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.RoomUserPetComposer; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.pets.PetData; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUnitType; +import com.eu.habbo.messages.outgoing.generic.alerts.MessagesForYouComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + +public class TransformCommand extends Command +{ + protected TransformCommand() + { + super("cmd_transform", new String[]{"transform"}); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (params.length == 1) + { + String petNames = ""; + petNames += (Emulator.getTexts().getValue("commands.generic.cmd_transform.title")); + petNames += "\r------------------------------------------------------------------------------\r"; + ArrayList petData = new ArrayList<>(Emulator.getGameEnvironment().getPetManager().getPetData()); + Collections.sort(petData); + String line = Emulator.getTexts().getValue("commands.generic.cmd_transform.line"); + for (PetData p : petData) + { + petNames += (line.replace("%id%", p.getType() + "").replace("%name%", p.getName())) + "\r"; + } + + gameClient.sendResponse(new MessagesForYouComposer(new String[]{petNames})); + return true; + } + else + { + String petName = params[1]; + PetData petData = Emulator.getGameEnvironment().getPetManager().getPetData(petName); + + int race = 0; + + if (params.length >= 3) + { + try + { + race = Integer.valueOf(params[2]); + } + catch (Exception e) + { + return true; + } + } + + String color = "FFFFFF"; + if (params.length >= 4) + { + color = params[3]; + } + + if (petData != null) + { + RoomUnit roomUnit = gameClient.getHabbo().getRoomUnit(); + roomUnit.setRoomUnitType(RoomUnitType.PET); + gameClient.getHabbo().getHabboStats().cache.put("pet_type", petData); + gameClient.getHabbo().getHabboStats().cache.put("pet_race", race); + gameClient.getHabbo().getHabboStats().cache.put("pet_color", color); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserRemoveComposer(gameClient.getHabbo().getRoomUnit()).compose()); + gameClient.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserPetComposer(petData.getType(), race, color, gameClient.getHabbo()).compose()); + } + else + { + //Pet Not Found + return true; + } + return true; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/TrashCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/TrashCommand.java new file mode 100644 index 00000000..95fcf658 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/TrashCommand.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.threading.runnables.RoomTrashing; + +public class TrashCommand extends Command +{ + public TrashCommand() + { + super("cmd_trash", Emulator.getTexts().getValue("commands.keys.cmd_trash").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + gameClient.getHabbo().whisper("Sorry. Lulz mode removed |"); + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UnbanCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UnbanCommand.java new file mode 100644 index 00000000..e87a8ea7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UnbanCommand.java @@ -0,0 +1,39 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.sql.SQLException; + +public class UnbanCommand extends Command +{ + public UnbanCommand() + { + super("cmd_unban", Emulator.getTexts().getValue("commands.keys.cmd_unban").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_unban.not_specified"), RoomChatMessageBubbles.ALERT); + } + else + { + if(Emulator.getGameEnvironment().getModToolManager().unban(params[1])) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_unban.success").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_unban.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UnloadRoomCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UnloadRoomCommand.java new file mode 100644 index 00000000..3d6cd9b7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UnloadRoomCommand.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; + +public class UnloadRoomCommand extends Command { + + public UnloadRoomCommand() + { + super("cmd_unload", Emulator.getTexts().getValue("commands.keys.cmd_unload").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(gameClient.getHabbo().getHabboInfo().getCurrentRoom().getOwnerId() == gameClient.getHabbo().getHabboInfo().getId() || gameClient.getHabbo().getHabboInfo().getRank().getId() > 4) + { + Room room = gameClient.getHabbo().getHabboInfo().getCurrentRoom(); + + room.dispose(); + return true; + } + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UnmuteCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UnmuteCommand.java new file mode 100644 index 00000000..ae44d582 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UnmuteCommand.java @@ -0,0 +1,64 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserIgnoredComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UnmuteCommand extends Command +{ + public UnmuteCommand() + { + super("cmd_unmute", Emulator.getTexts().getValue("commands.keys.cmd_unmute").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length == 1) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_unmute.not_specified"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_unmute.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + else + { + if (!habbo.getHabboStats().allowTalk() || habbo.getHabboInfo().getCurrentRoom().isMuted(habbo)) + { + if (!habbo.getHabboStats().allowTalk()) + { + habbo.unMute(); + } + + if (habbo.getHabboInfo().getCurrentRoom().isMuted(habbo)) + { + habbo.getHabboInfo().getCurrentRoom().muteHabbo(habbo, 1); + } + + if (habbo.getHabboInfo().getCurrentRoom() != null) + { + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.UNIGNORED).compose()); + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_unmute").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + } + else + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_unmute.not_muted").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateBotsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateBotsCommand.java new file mode 100644 index 00000000..5d6d74f0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateBotsCommand.java @@ -0,0 +1,18 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; + +public class UpdateBotsCommand extends Command +{ + public UpdateBotsCommand() + { + super("cmd_update_bots", Emulator.getTexts().getValue("commands.keys.cmd_update_bots").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + return Emulator.getGameEnvironment().getBotManager().reload(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateCatalogCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateCatalogCommand.java new file mode 100644 index 00000000..b91fdbf2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateCatalogCommand.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.catalog.*; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceConfigComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdateCatalogCommand extends Command { + + public UpdateCatalogCommand() + { + super("cmd_update_catalogue", Emulator.getTexts().getValue("commands.keys.cmd_update_catalogue").split(";")); + } + @Override + public boolean handle(GameClient gameClient, String[] params) + { + Emulator.getGameEnvironment().getCatalogManager().initialize(); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new CatalogUpdatedComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new CatalogModeComposer(0)); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new DiscountComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new MarketplaceConfigComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new GiftConfigurationComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new RecyclerLogicComposer()); + Emulator.getGameEnvironment().getCraftingManager().reload(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_catalog"), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateConfigCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateConfigCommand.java new file mode 100644 index 00000000..30ec224e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateConfigCommand.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdateConfigCommand extends Command +{ + public UpdateConfigCommand() + { + super("cmd_update_config", Emulator.getTexts().getValue("commands.keys.cmd_update_config").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getConfig().reload(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_config"), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateGuildPartsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateGuildPartsCommand.java new file mode 100644 index 00000000..02952b7e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateGuildPartsCommand.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.util.imager.badges.BadgeImager; + +public class UpdateGuildPartsCommand extends Command +{ + public UpdateGuildPartsCommand() + { + super("cmd_update_guildparts", Emulator.getTexts().getValue("commands.keys.cmd_update_guildparts").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getGuildManager().loadGuildParts(); + Emulator.getBadgeImager().reload(); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateHotelViewCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateHotelViewCommand.java new file mode 100644 index 00000000..a9a5aae5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateHotelViewCommand.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; + +public class UpdateHotelViewCommand extends Command +{ + protected UpdateHotelViewCommand() + { + super("cmd_update_hotel_view", Emulator.getTexts().getValue("commands.keys.cmd_update_hotel_view").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getHotelViewManager().getNewsList().reload(); + Emulator.getGameEnvironment().getHotelViewManager().getHallOfFame().reload(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_hotel_view")); + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateItemsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateItemsCommand.java new file mode 100644 index 00000000..fc900d9e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateItemsCommand.java @@ -0,0 +1,40 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.RoomRelativeMapComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdateItemsCommand extends Command +{ + public UpdateItemsCommand() + { + super("cmd_update_items", Emulator.getTexts().getValue("commands.keys.cmd_update_items").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getItemManager().loadItems(); + Emulator.getGameEnvironment().getItemManager().loadCrackable(); + Emulator.getGameEnvironment().getItemManager().loadSoundTracks(); + + synchronized (Emulator.getGameEnvironment().getRoomManager().getActiveRooms()) + { + for (Room room : Emulator.getGameEnvironment().getRoomManager().getActiveRooms()) + { + if (room.isLoaded() && room.getUserCount() > 0) + { + room.sendComposer(new RoomRelativeMapComposer(room).compose()); + } + } + } + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_items"), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java new file mode 100644 index 00000000..6928bf2a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdateNavigatorCommand extends Command +{ + public UpdateNavigatorCommand() + { + super("cmd_update_navigator", Emulator.getTexts().getValue("commands.keys.cmd_update_navigator").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getNavigatorManager().loadNavigator(); + Emulator.getGameEnvironment().getRoomManager().loadRoomModels(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_navigator"), RoomChatMessageBubbles.ALERT); + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePermissionsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePermissionsCommand.java new file mode 100644 index 00000000..57761d89 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePermissionsCommand.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdatePermissionsCommand extends Command +{ + public UpdatePermissionsCommand() + { + super("cmd_update_permissions", Emulator.getTexts().getValue("commands.keys.cmd_update_permissions").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getPermissionsManager().reload(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_permissions"), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePetDataCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePetDataCommand.java new file mode 100644 index 00000000..a71a08f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePetDataCommand.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdatePetDataCommand extends Command +{ + public UpdatePetDataCommand() + { + super("cmd_update_pet_data", Emulator.getTexts().getValue("commands.keys.cmd_update_pet_data").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getPetManager().reloadPetData(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_pet_data"), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePluginsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePluginsCommand.java new file mode 100644 index 00000000..5f35e2b8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePluginsCommand.java @@ -0,0 +1,24 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdatePluginsCommand extends Command +{ + public UpdatePluginsCommand() + { + super("cmd_update_plugins", Emulator.getTexts().getValue("commands.keys.cmd_update_plugins").split(";")); + } + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getPluginManager().reload(); + + gameClient.getHabbo().whisper("This is an unsafe command and could possibly lead to memory leaks.\rIt is recommended to restart the emulator in order to reload plugins."); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_plugins").replace("%count%", Emulator.getPluginManager().getPlugins().size() + ""), RoomChatMessageBubbles.ALERT); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePollsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePollsCommand.java new file mode 100644 index 00000000..3723d018 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdatePollsCommand.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdatePollsCommand extends Command +{ + public UpdatePollsCommand() + { + super("cmd_update_polls", Emulator.getTexts().getValue("commands.keys.cmd_update_polls").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getPollManager().loadPolls(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_polls"), RoomChatMessageBubbles.ALERT); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateTextsCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateTextsCommand.java new file mode 100644 index 00000000..2bc4c885 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateTextsCommand.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdateTextsCommand extends Command +{ + public UpdateTextsCommand() + { + super("cmd_update_texts", Emulator.getTexts().getValue("commands.keys.cmd_update_texts").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + try + { + Emulator.getTexts().reload(); + Emulator.getGameEnvironment().getCommandHandler().reloadCommands(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_texts"), RoomChatMessageBubbles.ALERT); + } + catch (Exception e) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_update_texts.failed"), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateWordFilterCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateWordFilterCommand.java new file mode 100644 index 00000000..566b2bdb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateWordFilterCommand.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class UpdateWordFilterCommand extends Command +{ + public UpdateWordFilterCommand() + { + super("cmd_update_wordfilter", Emulator.getTexts().getValue("commands.keys.update_wordfilter").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + Emulator.getGameEnvironment().getWordFilter().reload(); + + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_wordfilter"), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UserInfoCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UserInfoCommand.java new file mode 100644 index 00000000..a4452230 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UserInfoCommand.java @@ -0,0 +1,136 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.iterator.TIntIntIterator; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class UserInfoCommand extends Command +{ + public UserInfoCommand() + { + super("cmd_userinfo", Emulator.getTexts().getValue("commands.keys.cmd_userinfo").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if(params.length < 2) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_userinfo.forgot_username"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo onlineHabbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(params[1]); + HabboInfo habbo = (onlineHabbo != null ? onlineHabbo.getHabboInfo() : null); + + if(habbo == null) + { + habbo = HabboManager.getOfflineHabboInfo(params[1]); + } + + if(habbo == null) + { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_userinfo.not_found").replace("%user%", params[1]), RoomChatMessageBubbles.ALERT); + return true; + } + + String message = Emulator.getTexts().getValue("command.cmd_userinfo.userinfo") + ": " + " " + habbo.getUsername() + " (" + habbo.getId() + ")\r" + + Emulator.getTexts().getValue("command.cmd_userinfo.user_id") + ": " + habbo.getId() + "\r" + + Emulator.getTexts().getValue("command.cmd_userinfo.user_name") + ": " + habbo.getUsername() + "\r" + + Emulator.getTexts().getValue("command.cmd_userinfo.motto") + ": " + habbo.getMotto().replace("<", "[").replace(">", "]") + "\r" + + Emulator.getTexts().getValue("command.cmd_userinfo.rank") + ": " +habbo.getRank().getName() + " (" + habbo.getRank().getId() + ") \r" + + Emulator.getTexts().getValue("command.cmd_userinfo.online") + ": " + (onlineHabbo == null ? Emulator.getTexts().getValue("generic.no") : Emulator.getTexts().getValue("generic.yes")) + "\r" + + Emulator.getTexts().getValue("command.cmd_userinfo.email") + ": " + habbo.getMail() + "\r" + + ((habbo.getRank().hasPermission("acc_hide_ip", true))?"" : Emulator.getTexts().getValue("command.cmd_userinfo.ip_register") + ": "+ habbo.getIpRegister() + "\r") + + ((habbo.getRank().hasPermission("acc_hide_ip", true)) || onlineHabbo == null ? "" : Emulator.getTexts().getValue("command.cmd_userinfo.ip_current") + ": " + onlineHabbo.getClient().getChannel().remoteAddress().toString() + "\r") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.achievement_score") + ": " + onlineHabbo.getHabboStats().achievementScore + "\r": ""); + + ModToolBan ban = Emulator.getGameEnvironment().getModToolManager().checkForBan(habbo.getId()); + + message += Emulator.getTexts().getValue("command.cmd_userinfo.total_bans") + ": " + Emulator.getGameEnvironment().getModToolManager().totalBans(habbo.getId()) + "\r"; + message += Emulator.getTexts().getValue("command.cmd_userinfo.banned") + ": " + Emulator.getTexts().getValue(ban != null ? "generic.yes" : "generic.no") + "\r\r"; + if (ban != null) + { + message += "" + Emulator.getTexts().getValue("command.cmd_userinfo.ban_info") + "\r"; + message += ban.listInfo() + "\r"; + } + + message += "" + Emulator.getTexts().getValue("command.cmd_userinfo.currencies") + "\r"; + message += Emulator.getTexts().getValue("command.cmd_userinfo.credits") + ": " + habbo.getCredits() + "\r"; + TIntIntIterator iterator = habbo.getCurrencies().iterator(); + + for(int i = habbo.getCurrencies().size(); i-- > 0;) + { + try + { + iterator.advance(); + } + catch (Exception e) + { + break; + } + + message += (Emulator.getTexts().getValue("seasonal.name." + iterator.key()) + ": " + iterator.value() + "\r"); + } + message += "\r" + + + (onlineHabbo != null ? "" + Emulator.getTexts().getValue("command.cmd_userinfo.current_activity") + "\r" : "") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.room") + ": " + (onlineHabbo.getHabboInfo().getCurrentRoom() != null ? onlineHabbo.getHabboInfo().getCurrentRoom().getName() + "(" + onlineHabbo.getHabboInfo().getCurrentRoom().getId() + ")\r" : "-" ): "") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.respect_left") + ": " + onlineHabbo.getHabboStats().respectPointsToGive + "\r" : "") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.pet_respect_left") + ": " + onlineHabbo.getHabboStats().petRespectPointsToGive + "\r" : "") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.allow_trade") + ": " + ((onlineHabbo.getHabboStats().allowTrade) ? Emulator.getTexts().getValue("generic.yes") : Emulator.getTexts().getValue("generic.no")) + "\r" : "") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.allow_follow") + ": " + ((onlineHabbo.getHabboStats().blockFollowing) ? Emulator.getTexts().getValue("generic.no") : Emulator.getTexts().getValue("generic.yes")) + "\r" : "") + + (onlineHabbo != null ? Emulator.getTexts().getValue("command.cmd_userinfo.allow_friend_request") + ": " + ((onlineHabbo.getHabboStats().blockFriendRequests) ? Emulator.getTexts().getValue("generic.no") : Emulator.getTexts().getValue("generic.yes")) + "\r" : ""); + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + List> nameChanges = Emulator.getGameEnvironment().getHabboManager().getNameChanges(habbo.getId(), 3); + if (!nameChanges.isEmpty()) + { + message += "\rLatest name changes:
    "; + for (Map.Entry entry : nameChanges) + { + message += format.format(new Date((long)entry.getKey() * 1000L)) + " : " + entry.getValue() + "
    "; + } + } + + if(onlineHabbo != null) + { + message += "\r" + + "Other accounts ("; + + ArrayList users = Emulator.getGameEnvironment().getHabboManager().getCloneAccounts(onlineHabbo, 10); + Collections.sort(users, new Comparator() + { + @Override + public int compare(HabboInfo o1, HabboInfo o2) + { + return o1.getId() - o2.getId(); + } + }); + + message += users.size() + "):\r"; + + + message += "Username,\tID,\tDate register,\tDate last online\r"; + + for(HabboInfo info : users) + { + message += info.getUsername() + ",\t" + info.getId() + ",\t" + format.format(new Date((long)info.getAccountCreated() * 1000L)) + ",\t" + format.format(new Date((long)info.getLastOnline() * 1000L)) + "\r"; + } + } + gameClient.sendResponse(new GenericAlertComposer(message)); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/WordQuizCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/WordQuizCommand.java new file mode 100644 index 00000000..e2f4b504 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/commands/WordQuizCommand.java @@ -0,0 +1,46 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; + +public class WordQuizCommand extends Command +{ + public WordQuizCommand() + { + super("cmd_word_quiz", Emulator.getTexts().getValue("commands.keys.cmd_word_quiz").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception + { + if (!gameClient.getHabbo().getHabboInfo().getCurrentRoom().hasActiveWordQuiz()) + { + String question = ""; + int duration = 60; + + if (params.length > 2) + { + for (int i = 1; i < params.length - 1; i++) + { + question += " " + params[i]; + } + + try + { + duration = Integer.valueOf(params[params.length - 1]); + } + catch (Exception e) + { + question += " " + params[params.length -1]; + } + } + else + { + question = params[1]; + } + + gameClient.getHabbo().getHabboInfo().getCurrentRoom().startWordQuiz(question, duration * 1000); + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingAltar.java b/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingAltar.java new file mode 100644 index 00000000..87d0c7ef --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingAltar.java @@ -0,0 +1,194 @@ +package com.eu.habbo.habbohotel.crafting; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class CraftingAltar +{ + private final Item baseItem; + private final THashSet ingredients; + private final THashMap recipes; + + public CraftingAltar(Item baseItem) + { + this.baseItem = baseItem; + + this.ingredients = new THashSet(); + this.recipes = new THashMap(); + } + + public void addIngredient(Item item) + { + this.ingredients.add(item); + } + + public boolean hasIngredient(Item item) + { + return this.ingredients.contains(item); + } + + public Map matchRecipes(Map amountMap) + { + THashMap foundRecepies = new THashMap(); + + for (Map.Entry set : this.recipes.entrySet()) + { + boolean contains = true; + boolean equals = true; + + if (set.getValue().isLimited() && !set.getValue().canBeCrafted()) + { + continue; + } + + equals = amountMap.size() == set.getValue().getIngredients().size(); + + for (Map.Entry entry : amountMap.entrySet()) + { + if (contains) + { + if (set.getValue().getIngredients().containsKey(entry.getKey())) + { + if (set.getValue().getIngredients().get(entry.getKey()).equals(entry.getValue())) + { + continue; + } + + equals = false; + + if (set.getValue().getIngredients().get(entry.getKey()) > entry.getValue()) + { + continue; + } + } + + contains = false; + } + } + +// for (Map.Entry entry : set.getValue().getIngredients().entrySet()) +// { +// if (contains) +// { +// if (!amountMap.containsKey(entry.getKey())) +// { +// equals = false; +// continue; +// } +// +// { +// if (equals) +// { +// if (!entry.getValue().equals(amountMap.get(entry.getKey()))) +// { +// if (entry.getValue() > amountMap.get(entry.getKey())) +// { +// contains = true; +// } +// else +// { +// contains = false; +// } +// +// equals = false; +// break; +// } +// } +// } +// } +// } + + if (contains) + { + foundRecepies.put(set.getValue(), equals); + } + } + + return foundRecepies; + } + + + public void addRecipe(CraftingRecipe recipe) + { + this.recipes.put(recipe.getId(), recipe); + } + + public CraftingRecipe getRecipe(int id) + { + return this.recipes.get(id); + } + + public CraftingRecipe getRecipe(String name) + { + for (Map.Entry set : this.recipes.entrySet()) + { + if (set.getValue().getName().equals(name)) + { + return set.getValue(); + } + } + + return null; + } + + public CraftingRecipe getRecipe(Map items) + { + for (Map.Entry set : this.recipes.entrySet()) + { + CraftingRecipe recipe = set.getValue(); + + for (Map.Entry entry : recipe.getIngredients().entrySet()) + { + if (!(items.containsKey(entry.getKey()) && items.get(entry.getKey()).equals(entry.getValue()))) + { + recipe = null; + break; + } + } + + if (recipe != null) + { + return recipe; + } + } + + return null; + } + + public List getRecipesForHabbo(Habbo habbo) + { + List recipeList = new ArrayList(); + + for (Map.Entry set : this.recipes.entrySet()) + { + if (!set.getValue().isSecret() || habbo.getHabboStats().hasRecipe(set.getValue().getId())) + { + recipeList.add(set.getValue()); + } + } + + return recipeList; + } + + public Item getBaseItem() + { + return this.baseItem; + } + + public Collection getIngredients() + { + return this.ingredients; + } + + public Collection getRecipes() + { + return this.recipes.values(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingManager.java b/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingManager.java new file mode 100644 index 00000000..a1f35760 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingManager.java @@ -0,0 +1,171 @@ +package com.eu.habbo.habbohotel.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +public class CraftingManager +{ + /* + crafting_altars_recipes + crafting_recipes + crafting_recipes_ingredients + */ + private final THashMap altars; + + public CraftingManager() + { + this.altars = new THashMap(); + + this.reload(); + } + + public void reload() + { + this.dispose(); + + synchronized (this.altars) + { + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM crafting_altars_recipes " + + "INNER JOIN crafting_recipes ON crafting_altars_recipes.recipe_id = crafting_recipes.id " + + "INNER JOIN crafting_recipes_ingredients ON crafting_recipes.id = crafting_recipes_ingredients.recipe_id " + + "WHERE crafting_recipes.enabled = ? ORDER BY altar_id ASC")) + { + statement.setString(1, "1"); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Item item = Emulator.getGameEnvironment().getItemManager().getItem(set.getInt("altar_id")); + + if (item != null) + { + if (!this.altars.containsKey(item)) + { + this.altars.put(item, new CraftingAltar(item)); + } + + CraftingAltar altar = this.altars.get(item); + + if (altar != null) + { + CraftingRecipe recipe = altar.getRecipe(set.getInt("crafting_recipes_ingredients.recipe_id")); + + if (recipe == null) + { + recipe = new CraftingRecipe(set); + altar.addRecipe(recipe); + } + + Item ingredientItem = Emulator.getGameEnvironment().getItemManager().getItem(set.getInt("crafting_recipes_ingredients.item_id")); + + if (ingredientItem != null) + { + recipe.addIngredient(ingredientItem, set.getInt("crafting_recipes_ingredients.amount")); + altar.addIngredient(ingredientItem); + } + else + { + Emulator.getLogging().logErrorLine("Unknown ingredient item " + set.getInt("crafting_recipes_ingredients.item_id")); + } + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public int getRecipesWithItemCount(final Item item) + { + final int[] i = {0}; + + synchronized (this.altars) + { + this.altars.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CraftingAltar altar) + { + if (altar.hasIngredient(item)) + { + i[0]++; + } + + return true; + } + }); + } + + return i[0]; + } + + public CraftingRecipe getRecipe(String recipeName) + { + synchronized (this.altars) + { + CraftingRecipe recipe = null; + for (CraftingAltar altar : this.altars.values()) + { + recipe = altar.getRecipe(recipeName); + + if (recipe != null) + { + return recipe; + } + } + } + + return null; + } + + public CraftingAltar getAltar(Item item) + { + synchronized (this.altars) + { + return this.altars.get(item); + } + } + + public void dispose() + { + synchronized (this.altars) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE crafting_recipes SET remaining = ? WHERE id = ? LIMIT 1")) + { + for (CraftingAltar altar : this.altars.values()) + { + for (CraftingRecipe recipe : altar.getRecipes()) + { + if (recipe.isLimited()) + { + statement.setInt(1, recipe.getRemaining()); + statement.setInt(2, recipe.getId()); + + statement.addBatch(); + } + } + } + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + this.altars.clear(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingRecipe.java b/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingRecipe.java new file mode 100644 index 00000000..53791900 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/crafting/CraftingRecipe.java @@ -0,0 +1,105 @@ +package com.eu.habbo.habbohotel.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CraftingRecipe +{ + private final int id; + private final String name; + private final Item reward; + private final boolean secret; + private final String achievement; + private final boolean limited; + private int remaining; + + private final THashMap ingredients; + + public CraftingRecipe(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("product_name"); + this.reward = Emulator.getGameEnvironment().getItemManager().getItem(set.getInt("reward")); + this.secret = set.getString("secret").equals("1"); + this.achievement = set.getString("achievement"); + this.limited = set.getString("limited").equals("1"); + this.remaining = set.getInt("remaining"); + + this.ingredients = new THashMap(); + } + + public boolean canBeCrafted() + { + return !this.limited || this.remaining > 0; + } + + public synchronized boolean decrease() + { + if (this.remaining > 0) + { + this.remaining--; + return true; + } + + return false; + } + + public void addIngredient(Item item, int amount) + { + this.ingredients.put(item, amount); + } + + public int getAmountNeeded(Item item) + { + return this.ingredients.get(item); + } + + public boolean hasIngredient(Item item) + { + return this.ingredients.containsKey(item); + } + + public int getId() + { + return this.id; + } + + public String getName() + { + return this.name; + } + + public Item getReward() + { + return this.reward; + } + + public boolean isSecret() + { + return this.secret; + } + + public String getAchievement() + { + return this.achievement; + } + + public boolean isLimited() + { + return this.limited; + } + + public THashMap getIngredients() + { + return this.ingredients; + } + + public int getRemaining() + { + return this.remaining; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java new file mode 100644 index 00000000..36c8660c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java @@ -0,0 +1,179 @@ +package com.eu.habbo.habbohotel.gameclients; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.PacketManager; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelOption; + +import java.net.InetSocketAddress; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; + +public class GameClient +{ + /** + * The Channel this client is using. + */ + private final Channel channel; + + /** + * The Habbo it is linked to. + */ + private Habbo habbo; + + /** + * The MAC Address of the connected client. + */ + private String machineId = ""; + + public GameClient(Channel channel) + { + this.channel = channel; + } + + /** + * Sends an composer to the client. + * @param composer The composer to send. + */ + public void sendResponse(MessageComposer composer) + { + if(this.channel.isOpen()) + { + try + { + ServerMessage msg = composer.compose(); + sendResponse(msg); + } catch (Exception e) + { + Emulator.getLogging().logPacketError(e); + } + } + } + + /** + * Sends an response to the client. + * @param response The response to send. + */ + public void sendResponse(ServerMessage response) + { + if(this.channel.isOpen()) + { + if (response == null || response.getHeader() <= 0) + { + return; + } + + if (PacketManager.DEBUG_SHOW_PACKETS) + Emulator.getLogging().logPacketLine("[" + Logging.ANSI_PURPLE + "SERVER" + Logging.ANSI_RESET + "] => [" + response.getHeader() + "] -> " + response.getBodyString()); + + this.channel.write(response.get(), this.channel.voidPromise()); + this.channel.flush(); + } + } + + /** + * Sends multiple responses to the client. + * @param responses The responses to send. + */ + public void sendResponses(ArrayList responses) + { + ByteBuf buffer = Unpooled.buffer(); + + if(this.channel.isOpen()) + { + for(ServerMessage response : responses) + { + if (response == null || response.getHeader() <= 0) + { + return; + } + + if (PacketManager.DEBUG_SHOW_PACKETS) + Emulator.getLogging().logPacketLine("[" + Logging.ANSI_PURPLE + "SERVER" + Logging.ANSI_RESET + "] => [" + response.getHeader() + "] -> " + response.getBodyString()); + + buffer.writeBytes(response.get()); + } + this.channel.write(buffer.copy(), this.channel.voidPromise()); + this.channel.flush(); + } + buffer.release(); + } + + /** + * Disposes the client. Disconnection mostly. + */ + public void dispose() + { + try + { + this.channel.close(); + + if(this.habbo != null) + { + if(this.habbo.isOnline()) + { + this.habbo.getHabboInfo().setOnline(false); + this.habbo.disconnect(); + } + + this.habbo = null; + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + public Channel getChannel() + { + return this.channel; + } + + public Habbo getHabbo() + { + return this.habbo; + } + + public void setHabbo(Habbo habbo) + { + this.habbo = habbo; + } + + public String getMachineId() + { + return this.machineId; + } + + public void setMachineId(String machineId) + { + if (machineId == null) + { + throw new RuntimeException("Cannot set machineID to NULL"); + } + this.machineId = machineId; + + if (this.habbo != null) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET machine_id = ? WHERE id = ? LIMIT 1")) + { + statement.setString(1, this.machineId); + statement.setInt(2, this.habbo.getHabboInfo().getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClientManager.java b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClientManager.java new file mode 100644 index 00000000..2e363202 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClientManager.java @@ -0,0 +1,209 @@ +package com.eu.habbo.habbohotel.gameclients; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +import io.netty.channel.*; +import io.netty.util.AttributeKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; + +public class GameClientManager +{ + private final ConcurrentMap clients; + + public static final AttributeKey CLIENT = AttributeKey.valueOf("GameClient"); + + public GameClientManager() + { + this.clients = new ConcurrentHashMap(); + } + + public ConcurrentMap getSessions() + { + return this.clients; + } + + public boolean containsClient(Channel channel) + { + return this.clients.containsKey(channel.id()); + } + + public GameClient getClient(Channel channel) + { + if (this.clients.containsKey(channel.id())) { + return this.clients.get(channel.id()); + } + return null; + } + + public GameClient getClient(Habbo habbo) + { + for(GameClient client : this.clients.values()) + { + if(client.getHabbo() == habbo) + return client; + } + + return null; + } + + public boolean addClient(ChannelHandlerContext ctx) + { + GameClient client = new GameClient(ctx.channel()); + ctx.channel().closeFuture().addListener(new ChannelFutureListener() + { + @Override + public void operationComplete(ChannelFuture channelFuture) throws Exception + { + disposeClient(ctx.channel()); + } + }); + + ctx.attr(CLIENT).set(client); + ctx.fireChannelRegistered(); + + return this.clients.putIfAbsent(ctx.channel().id(), client) == null; + } + + public void disposeClient(Channel channel) + { + GameClient client = this.getClient(channel); + + if (client != null) + { + client.dispose(); + } + + channel.attr(CLIENT).set(null); + channel.deregister(); + channel.closeFuture(); + channel.close(); + this.clients.remove(channel.id()); + } + + public boolean containsHabbo(Integer id) + { + if (!this.clients.isEmpty()) + { + for (GameClient client : this.clients.values()) + { + if (client.getHabbo() != null) + { + if (client.getHabbo().getHabboInfo() != null) + { + if (client.getHabbo().getHabboInfo().getId() == id) + return true; + } + } + } + } + return false; + } + + public Habbo getHabbo(int id) + { + for(GameClient client : this.clients.values()) + { + if(client.getHabbo() == null) + continue; + + if(client.getHabbo().getHabboInfo().getId() == id) + return client.getHabbo(); + } + + return null; + } + + public Habbo getHabbo(String username) + { + for(GameClient client : this.clients.values()) + { + if(client.getHabbo() == null) + continue; + + if(client.getHabbo().getHabboInfo().getUsername().equalsIgnoreCase(username)) + return client.getHabbo(); + } + + return null; + } + + public List getHabbosWithIP(String ip) + { + List habbos = new ArrayList(); + + for (GameClient client : this.clients.values()) + { + if (client.getHabbo() != null && client.getHabbo().getHabboInfo() != null) + { + if (client.getHabbo().getHabboInfo().getIpLogin().equalsIgnoreCase(ip)) + { + habbos.add(client.getHabbo()); + } + } + } + + return habbos; + } + + public List getHabbosWithMachineId(String machineId) + { + List habbos = new ArrayList(); + + for (GameClient client : this.clients.values()) + { + if (client.getHabbo() != null && client.getHabbo().getHabboInfo() != null && client.getMachineId().equalsIgnoreCase(machineId)) + { + habbos.add(client.getHabbo()); + } + } + + return habbos; + } + + public void sendBroadcastResponse(MessageComposer composer) + { + sendBroadcastResponse(composer.compose()); + } + + public void sendBroadcastResponse(ServerMessage msg) + { + for (GameClient client : this.clients.values()) { + client.sendResponse(msg); + } + } + + public void sendBroadcastResponse(ServerMessage msg, GameClient exclude) + { + for (GameClient client : this.clients.values()) { + if(client.equals(exclude)) + continue; + + client.sendResponse(msg); + } + } + + public void sendBroadcastResponse(ServerMessage message, String minPermission, GameClient exclude) + { + for (GameClient client : this.clients.values()) + { + if(client.equals(exclude)) + continue; + + if(client.getHabbo() != null) + { + if (client.getHabbo().hasPermission(minPermission)) + { + client.sendResponse(message); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/Game.java b/src/main/java/com/eu/habbo/habbohotel/games/Game.java new file mode 100644 index 00000000..3d384b94 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/Game.java @@ -0,0 +1,324 @@ +package com.eu.habbo.habbohotel.games; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredHighscore; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.games.GameHabboJoinEvent; +import com.eu.habbo.plugin.events.games.GameHabboLeaveEvent; +import com.eu.habbo.plugin.events.games.GameStartedEvent; +import com.eu.habbo.plugin.events.games.GameStoppedEvent; +import com.eu.habbo.threading.runnables.SaveScoreForTeam; +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +public abstract class Game implements Runnable +{ + /** + * The class that should be used that defines teams. + */ + public final Class gameTeamClazz; + + /** + * The class that should be used that defines a player. + */ + public final Class gamePlayerClazz; + + /** + * All the teams. + */ + protected final THashMap teams = new THashMap(); + + /** + * The room this game is affected by. + */ + protected Room room; + + /** + * Should this game progress any achievements. + */ + protected boolean countsAchievements; + + /** + * Time the game started. + */ + protected int startTime; + + /** + * Time the game ended. + */ + protected int endTime; + + /** + * Wether the game is running. + */ + public boolean isRunning; + + public Game(Class gameTeamClazz, Class gamePlayerClazz, Room room, boolean countsAchievements) + { + this.gameTeamClazz = gameTeamClazz; + this.gamePlayerClazz = gamePlayerClazz; + this.room = room; + this.countsAchievements = countsAchievements; + } + + /** + * Should reset the game to it's default state and call start() when done initialising. + * Only call start if you need to start a game. + */ + public abstract void initialise(); + + /** + * When overridden call super first! + * Adds a particular Habbo to a specific team. + * @param habbo The Habbo to add to an team. + * @param teamColor The teamcolor to add the Habbo too. + * @return True when user has joined the game. + */ + public boolean addHabbo(Habbo habbo, GameTeamColors teamColor) + { + try + { + if (habbo != null) + { + if(Emulator.getPluginManager().isRegistered(GameHabboJoinEvent.class, true)) + { + Event gameHabboJoinEvent = new GameHabboJoinEvent(this, habbo); + Emulator.getPluginManager().fireEvent(gameHabboJoinEvent); + if(gameHabboJoinEvent.isCancelled()) + return false; + } + + synchronized (this.teams) + { + GameTeam team = this.getTeam(teamColor); + if (team == null) + { + team = this.gameTeamClazz.getDeclaredConstructor(GameTeamColors.class).newInstance(teamColor); + this.addTeam(team); + } + + GamePlayer player = this.gamePlayerClazz.getDeclaredConstructor(Habbo.class, GameTeamColors.class).newInstance(habbo, teamColor); + team.addMember(player); + habbo.getHabboInfo().setCurrentGame(this.getClass()); + habbo.getHabboInfo().setGamePlayer(player); + } + + return true; + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return false; + } + + /** + * When overridden call super first! + * Removes an Habbo when the following events occur: + *
  • The Habbo gets disconnected.
  • + *
  • The Habbo leaves the room.
  • + *
  • The Habbo triggers leave team wired.
  • + * @param habbo The Habbo to be removed. + */ + public void removeHabbo(Habbo habbo) + { + if (habbo != null) + { + if(Emulator.getPluginManager().isRegistered(GameHabboLeaveEvent.class, true)) + { + Event gameHabboLeaveEvent = new GameHabboLeaveEvent(this, habbo); + Emulator.getPluginManager().fireEvent(gameHabboLeaveEvent); + if(gameHabboLeaveEvent.isCancelled()) + return; + } + + GameTeam team = this.getTeamForHabbo(habbo); + if (team != null && team.isMember(habbo)) + { + team.removeMember(habbo.getHabboInfo().getGamePlayer()); + habbo.getHabboInfo().getGamePlayer().reset(); + habbo.getHabboInfo().setCurrentGame(null); + habbo.getHabboInfo().setGamePlayer(null); + + if(this.countsAchievements && this.endTime > this.startTime) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GamePlayed")); + } + } + } + + boolean deleteGame = true; + for (GameTeam team : this.teams.values()) + { + if (team.getMembers().size() > 0 ) + { + deleteGame = false; + break; + } + } + + if (deleteGame) + { + room.deleteGame(this); + } + } + + /** + * This method should start a game. Make sure to call super.start() + * to register the time the game was started. + */ + public void start() + { + this.isRunning = true; + this.startTime = Emulator.getIntUnixTimestamp(); + + if(Emulator.getPluginManager().isRegistered(GameStartedEvent.class, true)) + { + Event gameStartedEvent = new GameStartedEvent(this); + Emulator.getPluginManager().fireEvent(gameStartedEvent); + } + + WiredHandler.handle(WiredTriggerType.GAME_STARTS, null, this.room, new Object[]{this}); + } + + /** + * Main game loop. + */ + public abstract void run(); + + /** + * Should stop the game. + * + * Called upon room unload or when the timer runs out. + * + * Make sure to call super.stop() when overriden to save the scores to the database. + */ + public void stop() + { + this.isRunning = false; + this.endTime = Emulator.getIntUnixTimestamp(); + + this.saveScores(); + + if(Emulator.getPluginManager().isRegistered(GameStoppedEvent.class, true)) + { + Event gameStoppedEvent = new GameStoppedEvent(this); + Emulator.getPluginManager().fireEvent(gameStoppedEvent); + } + + WiredHandler.handle(WiredTriggerType.GAME_ENDS, null, this.room, new Object[]{this}); + + for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionWiredHighscore.class)) + { + this.room.updateItem(item); + } + } + + /** + * Saves all scores to the game. + * Used for the Wired Highscores. + * Must have set the room. + */ + private void saveScores() + { + if(this.room == null) + return; + + for(Map.Entry teamEntry : this.teams.entrySet()) + { + Emulator.getThreading().run(new SaveScoreForTeam(teamEntry.getValue(), this)); + } + } + + /** + * Gets the team for the given Habbo. + * @param habbo The Habbo to look for the team. + * @return The team the Habbo is in. + */ + public GameTeam getTeamForHabbo(Habbo habbo) + { + if(habbo != null) + { + synchronized (this.teams) + { + for (GameTeam team : this.teams.values()) + { + if (team.isMember(habbo)) + { + return team; + } + } + } + } + + return null; + } + + /** + * Get the team by the team color. + * @param teamColor The teamcolor to look up. + * @return The team for the given team color. + */ + public GameTeam getTeam(GameTeamColors teamColor) + { + synchronized (this.teams) + { + return this.teams.get(teamColor); + } + } + + /** + * Adds a new team to the game. + * Note: Overwrites any existing team for the team.teamColor + * @param team The team to add. + */ + public void addTeam(GameTeam team) + { + synchronized (this.teams) + { + this.teams.put(team.teamColor, team); + } + } + + /** + * @return The room this game is affected by. + */ + public Room getRoom() + { + return this.room; + } + + /** + * @return The time the game was started. + */ + public int getStartTime() + { + return this.startTime; + } + + /** + * @return Last time this game ended. + */ + public int getEndTime() + { + return this.endTime; + } + + /** + * Adds time to the current game. + * @param time The amount of time to add. + */ + public void addTime(int time) + { + this.endTime += time; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/GamePlayer.java b/src/main/java/com/eu/habbo/habbohotel/games/GamePlayer.java new file mode 100644 index 00000000..1fbb7c7b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/GamePlayer.java @@ -0,0 +1,83 @@ +package com.eu.habbo.habbohotel.games; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; + +public class GamePlayer +{ + /** + * The Habbo that is linked to the game player. + */ + private Habbo habbo; + + /** + * The team color of this player. + */ + private GameTeamColors teamColor; + + /** + * The score of this player. + * + * This score gets saved at the end of a game for the Wired HighScore furniture. + */ + private int score; + + /** + * Creates a new GamePlayer for the given Habbo and it's team. + * @param habbo The Habbo who is linked to this GamePlayer. + * @param teamColor The team the GamePlayer is in. + */ + public GamePlayer(Habbo habbo, GameTeamColors teamColor) + { + this.habbo = habbo; + this.teamColor = teamColor; + } + + /** + * Resets the GamePlayer object to it's 'default' state. + * This method will be called by the emulator: + *
      + *
    • The game starts.
    • + *
    • The game ends.
    • + *
    + */ + public void reset() + { + this.score = 0; + } + + /** + * Adds an given amount of score to this object. + * @param amount The amount of score to add. + */ + public synchronized void addScore(int amount) + { + this.score += amount; + WiredHandler.handle(WiredTriggerType.SCORE_ACHIEVED, null, this.habbo.getHabboInfo().getCurrentRoom(), new Object[]{this.habbo.getHabboInfo().getCurrentRoom().getGame(this.habbo.getHabboInfo().getCurrentGame()).getTeamForHabbo(this.habbo).getTotalScore(), amount}); + } + + /** + * @return The Habbo linked to this object. + */ + public Habbo getHabbo() + { + return this.habbo; + } + + /** + * @return The GameTeamColor for this object. + */ + public GameTeamColors getTeamColor() + { + return this.teamColor; + } + + /** + * @return The score amount for this object. + */ + public int getScore() + { + return this.score; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java b/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java new file mode 100644 index 00000000..f58ad281 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java @@ -0,0 +1,158 @@ +package com.eu.habbo.habbohotel.games; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import gnu.trove.set.hash.THashSet; + +public class GameTeam +{ + /** + * List of all players in this team. + */ + private final THashSet members; + + /** + * The team color of this team. + */ + public final GameTeamColors teamColor; + + /** + * The total score of this team. + */ + private int teamScore; + + /** + * Creates an new GameTeam with the given team color. + * @param teamColor The team color this GameTeam is identified by. + */ + public GameTeam(GameTeamColors teamColor) + { + this.teamColor = teamColor; + + this.members = new THashSet(); + } + + /** + * Initialises the team and resets each player to it's default state. + */ + public void initialise() + { + for(GamePlayer player : this.members) + { + player.reset(); + } + + this.teamScore = 0; + } + + /** + * Resets this team by clearing all members in the team. + */ + public void reset() + { + this.members.clear(); + } + + /** + * Adds an given amount of score to the team score. + * @param teamScore The amount of score that will be added. + */ + public void addTeamScore(int teamScore) + { + this.teamScore += teamScore; + } + + /** + * @return The team score of this team. + */ + public int getTeamScore() + { + return this.teamScore; + } + + /** + * @return The sum of each team members score + the team score. + */ + public synchronized int getTotalScore() + { + int score = this.teamScore; + + for(GamePlayer player : this.members) + { + score += player.getScore(); + } + + return score; + } + + /** + * Adds an GamePlayer to the team. + * @param gamePlayer The GamePlayer that needs to be added. + */ + public void addMember(GamePlayer gamePlayer) + { + synchronized (this.members) + { + this.members.add(gamePlayer); + } + } + + /** + * Removes an GamePlayer from the team. + * @param gamePlayer The GamePlayer that needs to be removed. + */ + public void removeMember(GamePlayer gamePlayer) + { + synchronized (this.members) + { + this.members.remove(gamePlayer); + } + } + + /** + * @return An collection of all GamePlayers. + */ + public THashSet getMembers() + { + return this.members; + } + + /** + * Checks wether the given Habbo is part of this team. + * @param habbo The habbo to check. + * @return True when the given Habbo is part of the team. + */ + public boolean isMember(Habbo habbo) + { + for(GamePlayer p : this.members) + { + if(p.getHabbo().equals(habbo)) + { + return true; + } + } + + return false; + } + + /** + * Gets the GamePlayer object for the given Habbo. + * @param habbo The habbo to get the GamePlayer object for. + * @return The GamePlayer for the given Habbo. If not present returns null. + */ + @Deprecated + public GamePlayer getPlayerForHabbo(Habbo habbo) + { + for(GamePlayer p : this.members) + { + if(p.getHabbo().equals(habbo)) + { + return p; + } + } + + return null; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/GameTeamColors.java b/src/main/java/com/eu/habbo/habbohotel/games/GameTeamColors.java new file mode 100644 index 00000000..f84d39d0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/GameTeamColors.java @@ -0,0 +1,63 @@ +package com.eu.habbo.habbohotel.games; + +public enum GameTeamColors +{ + /** + * Team Red. + */ + RED(0), + + /** + * Team Green. + */ + GREEN(1), + + /** + * Team Blue. + */ + BLUE(2), + + /** + * Team Yellow. + */ + YELLOW(3), + + /** + * Additional GameTeamColors + */ + NONE(4), + + ONE(5), + TWO(6), + THREE(7), + FOUR(8), + FIVE(9), + SIX(10), + SEVEN(11), + EIGHT(12), + NINE(13), + TEN(14); + + /** + * The type of the TeamColor. Aka identifier. + */ + public final int type; + + GameTeamColors(int type) + { + this.type = type; + } + + public static GameTeamColors fromType(int type) + { + for (GameTeamColors teamColors : values()) + { + if (teamColors.type == type) + { + return teamColors; + } + } + + return RED; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGame.java b/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGame.java new file mode 100644 index 00000000..607c12c5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGame.java @@ -0,0 +1,408 @@ +package com.eu.habbo.habbohotel.games.battlebanzai; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiSphere; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiTile; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiTimer; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates.InteractionBattleBanzaiGate; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards.InteractionBattleBanzaiScoreboard; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserActionComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.EventPriority; +import com.eu.habbo.plugin.events.users.UserTakeStepEvent; +import com.eu.habbo.threading.runnables.BattleBanzaiTilesFlicker; +import com.eu.habbo.threading.runnables.GameStop; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.Map; + +public class BattleBanzaiGame extends Game +{ + /** + * The effect id BB effects start at. + */ + public static final int effectId = 33; + + /** + * Points for hijacking another users tile. + */ + public static final int POINTS_HIJACK_TILE = Emulator.getConfig().getInt("hotel.banzai.points.tile.steal"); + + /** + * Points for coloring a grey tile. + */ + public static final int POINTS_FILL_TILE = Emulator.getConfig().getInt("hotel.banzai.points.tile.fill"); + + /** + * Points for locking a tile. + */ + public static final int POINTS_LOCK_TILE = Emulator.getConfig().getInt("hotel.banzai.points.tile.lock"); + + private int timeLeft; + + private int tileCount; + + private int countDown; + + /** + * All locked tiles. + */ + private final THashMap> lockedTiles; + + public BattleBanzaiGame(Room room) + { + super(BattleBanzaiGameTeam.class, BattleBanzaiGamePlayer.class, room, true); + + this.lockedTiles = new THashMap>(); + + room.setAllowEffects(true); + } + + @Override + public void initialise() + { + if(this.isRunning) + return; + + int highestTime = 0; + this.countDown = 3; + + this.resetMap(); + + for (Map.Entry set : this.room.getRoomSpecialTypes().getBattleBanzaiTimers().entrySet()) + { + if(set.getValue().getExtradata().isEmpty()) + continue; + + if(highestTime < Integer.valueOf(set.getValue().getExtradata())) + { + highestTime = Integer.valueOf(set.getValue().getExtradata()); + } + } + + synchronized (this.teams) + { + for (GameTeam t : this.teams.values()) + { + t.initialise(); + } + } + + for(HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) + { + item.setExtradata("1"); + this.room.updateItemState(item); + } + + this.timeLeft = highestTime; + + if (this.timeLeft == 0) + { + this.timeLeft = 30; + } + + this.start(); + } + + @Override + public boolean addHabbo(Habbo habbo, GameTeamColors teamColor) + { + return super.addHabbo(habbo, teamColor); + } + + @Override + public void start() + { + if(this.isRunning) + return; + + super.start(); + + Emulator.getThreading().run(this, 0); + } + + @Override + public void run() + { + try + { + if (!this.isRunning) + return; + + if(this.countDown > 0) + { + this.countDown--; + + if(this.countDown == 0) + { + for(HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) + { + item.setExtradata("2"); + this.room.updateItemState(item); + } + } + + if(this.countDown > 1) + { + Emulator.getThreading().run(this, 500); + + return; + } + } + + if (this.timeLeft > 0) + { + Emulator.getThreading().run(this, 1000); + + this.timeLeft--; + + for (Map.Entry set : this.room.getRoomSpecialTypes().getBattleBanzaiTimers().entrySet()) + { + set.getValue().setExtradata(timeLeft + ""); + this.room.updateItemState(set.getValue()); + } + + int total = 0; + synchronized (this.lockedTiles) + { + for (Map.Entry> set : this.lockedTiles.entrySet()) + { + total += set.getValue().size(); + } + } + + GameTeam highestScore = null; + + synchronized (this.teams) + { + for (Map.Entry set : this.teams.entrySet()) + { + if (highestScore == null || highestScore.getTotalScore() < set.getValue().getTotalScore()) + { + highestScore = set.getValue(); + } + } + } + + if(highestScore != null) + { + for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) + { + item.setExtradata((highestScore.teamColor.type + 3) + ""); + this.room.updateItemState(item); + } + } + + if(total >= this.tileCount && this.tileCount != 0) + { + this.timeLeft = 0; + } + } + else + { + this.stop(); + + GameTeam winningTeam = null; + + for (GameTeam team : this.teams.values()) + { + for(GamePlayer player : team.getMembers()) + { + if (player.getScore() > 0) + { + AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallPlayer")); + AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallQuestCompleted")); + } + } + + if (winningTeam == null || team.getTotalScore() > winningTeam.getTotalScore()) + { + winningTeam = team; + } + } + + if (winningTeam != null) + { + synchronized (winningTeam) + { + for (GamePlayer player : winningTeam.getMembers()) + { + if (player.getScore() > 0) + { + this.room.sendComposer(new RoomUserActionComposer(player.getHabbo().getRoomUnit(), RoomUserAction.WAVE).compose()); + AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallWinner")); + } + } + + for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) + { + item.setExtradata((7 + winningTeam.teamColor.type) + ""); + this.room.updateItemState(item); + } + + Emulator.getThreading().run(new BattleBanzaiTilesFlicker(this.lockedTiles.get(winningTeam.teamColor), winningTeam.teamColor, this.room)); + } + } + + this.isRunning = false; + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public void stop() + { + super.stop(); + + this.timeLeft = 0; + + for (HabboItem item : this.room.getFloorItems()) + { + if (item instanceof InteractionBattleBanzaiTile || item instanceof InteractionBattleBanzaiScoreboard) + { + item.setExtradata("0"); + this.room.updateItemState(item); + } + } + + this.lockedTiles.clear(); + } + + /** + * Resets the map. + */ + protected synchronized void resetMap() + { + for (HabboItem item : this.room.getFloorItems()) + { + if (item instanceof InteractionBattleBanzaiTile) + { + item.setExtradata("1"); + this.room.updateItemState(item); + this.tileCount++; + } + + if (item instanceof InteractionBattleBanzaiScoreboard) + { + item.setExtradata("0"); + this.room.updateItemState(item); + } + } + } + + public void addPositionToGate(GameTeamColors teamColor) + { + for (InteractionBattleBanzaiGate gate : this.room.getRoomSpecialTypes().getBattleBanzaiGates().values()) + { + if (gate.teamColor != teamColor) + continue; + + if (gate.getExtradata().isEmpty() || gate.getExtradata().equals("0")) + continue; + + gate.setExtradata(Integer.valueOf(gate.getExtradata()) - 1 + ""); + this.room.updateItemState(gate); + break; + } + } + + @EventHandler(priority = EventPriority.HIGH) + public static void onUserWalkEvent(UserTakeStepEvent event) + { + if(event.habbo.getHabboInfo().getCurrentGame() == BattleBanzaiGame.class) + { + BattleBanzaiGame game = (BattleBanzaiGame) event.habbo.getHabboInfo().getCurrentRoom().getGame(BattleBanzaiGame.class); + if (game != null && game.isRunning) + { + if(!event.habbo.getHabboInfo().getCurrentRoom().hasObjectTypeAt(InteractionBattleBanzaiTile.class, event.toLocation.x, event.toLocation.y)) + { + event.setCancelled(true); + event.habbo.getRoomUnit().setGoalLocation(event.habbo.getRoomUnit().getCurrentLocation()); + event.habbo.getRoomUnit().getStatus().remove("mv"); + game.room.sendComposer(new RoomUserStatusComposer(event.habbo.getRoomUnit()).compose()); + } + } + } + } + + /** + * Locks an tile + * @param teamColor The color to lock. + * @param item The item to lock. + */ + public void tileLocked(GameTeamColors teamColor, HabboItem item, Habbo habbo) + { + if(item instanceof InteractionBattleBanzaiTile) + { + if(!this.lockedTiles.containsKey(teamColor)) + { + this.lockedTiles.put(teamColor, new THashSet()); + } + + this.lockedTiles.get(teamColor).add(item); + } + + if(habbo != null) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("BattleBallTilesLocked")); + } + } + + /** + * Updates the counters in the room. + */ + public void refreshCounters() + { + for(GameTeam team : this.teams.values()) + { + if(team.getMembers().isEmpty()) + continue; + + this.refreshCounters(team.teamColor); + } + } + + /** + * Updates the counters for the given GameTeamColors in the room. + * @param teamColors The color that should be updated. + */ + public void refreshCounters(GameTeamColors teamColors) + { + int totalScore = this.teams.get(teamColors).getTotalScore(); + + THashMap scoreBoards = this.room.getRoomSpecialTypes().getBattleBanzaiScoreboards(teamColors); + + for (InteractionBattleBanzaiScoreboard scoreboard : scoreBoards.values()) + { + if(scoreboard.getExtradata().isEmpty()) + { + scoreboard.setExtradata("0"); + } + + int oldScore = Integer.valueOf(scoreboard.getExtradata()); + + if(oldScore == totalScore) + continue; + + scoreboard.setExtradata(totalScore + ""); + this.room.updateItemState(scoreboard); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGamePlayer.java b/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGamePlayer.java new file mode 100644 index 00000000..60d5f170 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGamePlayer.java @@ -0,0 +1,13 @@ +package com.eu.habbo.habbohotel.games.battlebanzai; + +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.users.Habbo; + +public class BattleBanzaiGamePlayer extends GamePlayer +{ + public BattleBanzaiGamePlayer(Habbo habbo, GameTeamColors teamColor) + { + super(habbo, teamColor); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGameTeam.java b/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGameTeam.java new file mode 100644 index 00000000..1c69a0c2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/battlebanzai/BattleBanzaiGameTeam.java @@ -0,0 +1,38 @@ +package com.eu.habbo.habbohotel.games.battlebanzai; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; + +public class BattleBanzaiGameTeam extends GameTeam +{ + public BattleBanzaiGameTeam(GameTeamColors teamColor) + { + super(teamColor); + } + + @Override + public void addMember(GamePlayer gamePlayer) + { + super.addMember(gamePlayer); + + gamePlayer.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(gamePlayer.getHabbo(), BattleBanzaiGame.effectId + this.teamColor.type); + } + + @Override + public void removeMember(GamePlayer gamePlayer) + { + Game game = gamePlayer.getHabbo().getHabboInfo().getCurrentRoom().getGame(gamePlayer.getHabbo().getHabboInfo().getCurrentGame()); + if(game != null && game instanceof BattleBanzaiGame) + { + ((BattleBanzaiGame) game).addPositionToGate(gamePlayer.getTeamColor()); + } + + gamePlayer.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(gamePlayer.getHabbo(), 0); + gamePlayer.getHabbo().getRoomUnit().setCanWalk(true); + + super.removeMember(gamePlayer); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/football/FootballGame.java b/src/main/java/com/eu/habbo/habbohotel/games/football/FootballGame.java new file mode 100644 index 00000000..6d0f44db --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/football/FootballGame.java @@ -0,0 +1,64 @@ +package com.eu.habbo.habbohotel.games.football; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.InteractionFootballScoreboard; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserActionComposer; + +import java.util.Map; + +/** + * Thanks to Beny for adding football game to Arcturus! + */ +public class FootballGame extends Game +{ + private Room room; + + public FootballGame(Room room) + { + super(null, null, room, true); + + this.room = room; + } + + @Override + public void initialise() + { + } + + @Override + public void run() + { + } + + public void onScore(RoomUnit kicker, GameTeamColors team) + { + if(this.room == null || !this.room.isLoaded()) + return; + + Habbo habbo = room.getHabbo(kicker); + if(habbo != null) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("FootballGoalScored")); + } + + if (habbo.getHabboInfo().getId() != this.room.getOwnerId()) + { + AchievementManager.progressAchievement(this.room.getOwnerId(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FootballGoalScoredInRoom")); + } + + this.room.sendComposer(new RoomUserActionComposer(kicker, RoomUserAction.WAVE).compose()); + + for (Map.Entry scoreBoard : this.room.getRoomSpecialTypes().getFootballScoreboards(team).entrySet()) + { + scoreBoard.getValue().changeScore(1); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGame.java b/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGame.java new file mode 100644 index 00000000..5079616f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGame.java @@ -0,0 +1,458 @@ +package com.eu.habbo.habbohotel.games.freeze; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeBlock; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTile; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTimer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.gates.InteractionFreezeGate; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards.InteractionFreezeScoreboard; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserActionComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; +import com.eu.habbo.plugin.events.users.UserTakeStepEvent; +import com.eu.habbo.threading.runnables.freeze.FreezeClearEffects; +import com.eu.habbo.threading.runnables.freeze.FreezeThrowSnowball; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.util.HashMap; +import java.util.Map; +import java.util.NoSuchElementException; + +public class FreezeGame extends Game +{ + public static final int effectId = 40; + public static int POWER_UP_POINTS; + public static int POWER_UP_CHANCE; + public static int POWER_UP_PROTECT_TIME; + public static int DESTROY_BLOCK_POINTS; + public static int FREEZE_TIME; + public static int FREEZE_LOOSE_SNOWBALL; + public static int FREEZE_LOOSE_BOOST; + public static int MAX_LIVES; + public static int MAX_SNOWBALLS; + public static int FREEZE_LOOSE_POINTS; + public static boolean POWERUP_STACK; + + private int timeLeft; + + public FreezeGame(Room room) + { + super(FreezeGameTeam.class, FreezeGamePlayer.class, room, true); + room.setAllowEffects(true); + } + + @Override + public synchronized void initialise() + { + if(this.isRunning) + return; + + int highestTime = 0; + + this.resetMap(); + + for (Map.Entry set : this.room.getRoomSpecialTypes().getFreezeTimers().entrySet()) + { + if(set.getValue().getExtradata().isEmpty()) + continue; + + if(highestTime < Integer.valueOf(set.getValue().getExtradata())) + { + highestTime = Integer.valueOf(set.getValue().getExtradata()); + } + } + + for (GameTeam t : this.teams.values()) + { + t.initialise(); + } + + if (this.room.getRoomSpecialTypes().hasFreezeExitTile()) + { + for (Habbo habbo : this.room.getHabbos()) + { + if (this.getTeamForHabbo(habbo) == null) + { + for (HabboItem item : room.getItemsAt(habbo.getRoomUnit().getCurrentLocation())) + { + if (item instanceof InteractionFreezeTile) + { + this.room.teleportHabboToItem(habbo, this.room.getRoomSpecialTypes().getRandomFreezeExitTile()); + } + } + } + } + } + this.timeLeft = highestTime; + + if (this.timeLeft == 0) + { + this.timeLeft = 30; + } + + this.start(); + } + + synchronized void resetMap() + { + for (HabboItem item : this.room.getFloorItems()) + { + if (item instanceof InteractionFreezeBlock || item instanceof InteractionFreezeScoreboard) + { + item.setExtradata("0"); + this.room.updateItemState(item); + } + } + } + + public synchronized void placebackHelmet(GameTeamColors teamColor) + { + for (InteractionFreezeGate gate : this.room.getRoomSpecialTypes().getFreezeGates().values()) + { + if (gate.teamColor != teamColor) + continue; + + if (gate.getExtradata().isEmpty() || gate.getExtradata().equals("0")) + continue; + + gate.setExtradata(Integer.valueOf(gate.getExtradata()) - 1 + ""); + this.room.updateItemState(gate); + break; + } + } + + public void throwBall(Habbo habbo, InteractionFreezeTile item) + { + if (!this.isRunning || !habbo.getHabboInfo().isInGame() || habbo.getHabboInfo().getCurrentGame() != this.getClass()) + return; + + if (!item.getExtradata().equalsIgnoreCase("0") && !item.getExtradata().isEmpty()) + return; + + if (RoomLayout.tilesAdjecent(habbo.getRoomUnit().getCurrentLocation(), room.getLayout().getTile(item.getX(), item.getY()))) + { + if(((FreezeGamePlayer)habbo.getHabboInfo().getGamePlayer()).canThrowSnowball()) + { + Emulator.getThreading().run(new FreezeThrowSnowball(habbo, item, this.room)); + } + } + } + + public THashSet affectedTilesByExplosion(short x, short y, int radius) + { + THashSet tiles = new THashSet(); + + RoomTile t = this.room.getLayout().getTile(x, y); + + tiles.add(t); + for(int i = 0; i < 4; i++) + { + for(int j = 0; j < radius; j++) + { + t = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(x, y), i * 2, (short) radius); + + if(t == null || t.x < 0 || t.y < 0 || t.x >= this.room.getLayout().getMapSizeX() || t.y >= this.room.getLayout().getMapSizeY()) + continue; + tiles.add(t); + } + } + + return tiles; + } + + public THashSetaffectedTilesByExplosionDiagonal(short x, short y, int radius) + { + THashSet tiles = new THashSet(); + + for(int i = 0; i < 4; i++) + { + RoomTile t = room.getLayout().getTile(x, y); + + for(int j = 0; j < radius; j++) + { + t = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(x, y), (i * 2) + 1, (short) radius); + + if (t != null) + { + if (t.x < 0 || t.y < 0 || t.x >= this.room.getLayout().getMapSizeX() || t.y >= this.room.getLayout().getMapSizeY()) + continue; + + tiles.add(t); + } + } + } + + return tiles; + } + + public synchronized void explodeBox(InteractionFreezeBlock block) + { + int powerUp = 0; + if(Emulator.getRandom().nextInt(100) + 1 <= FreezeGame.POWER_UP_CHANCE) + { + powerUp += Emulator.getRandom().nextInt(6) + 1; + } + + block.setExtradata((powerUp + 1) * 1000 + ""); + + this.room.updateItemState(block); + } + + public synchronized void givePowerUp(FreezeGamePlayer player, int powerUpId) + { + player.addScore(FreezeGame.POWER_UP_POINTS); + + switch(powerUpId) + { + case 2: + { + player.increaseExplosion(); + break; + } + + case 3: + { + player.addSnowball(); + break; + } + + case 4: + { + player.nextDiagonal = true; + break; + } + + case 5: + { + player.nextHorizontal = true; + player.nextDiagonal = true; + player.tempMassiveExplosion = true; + break; + } + + case 6: + { + player.addLife(); + break; + } + + case 7: + { + player.addProtection(); + break; + } + } + } + + public synchronized void playerDies(GamePlayer player) + { + Emulator.getThreading().run(new FreezeClearEffects(player.getHabbo()), 1000); + if(this.room.getRoomSpecialTypes().hasFreezeExitTile()) + { + InteractionFreezeExitTile tile = this.room.getRoomSpecialTypes().getRandomFreezeExitTile(); + tile.setExtradata("1"); + this.room.updateItemState(tile); + this.room.teleportHabboToItem(player.getHabbo(), tile); + } + this.removeHabbo(player.getHabbo()); + } + + @Override + public void start() + { + if (this.isRunning) + { + return; + } + + super.start(); + + WiredHandler.handle(WiredTriggerType.GAME_STARTS, null, this.room, null); + this.setFreezeTileState("1"); + this.run(); + } + + @Override + public synchronized void run() + { + try + { + if (!this.isRunning) + return; + + if (timeLeft > 0) + { + Emulator.getThreading().run(this, 1000); + + this.timeLeft--; + + for (GameTeam team : this.teams.values()) + { + for (GamePlayer player : team.getMembers()) + { + ((FreezeGamePlayer)player).cycle(); + } + + int totalScore = team.getTotalScore(); + + THashMap scoreBoards = this.room.getRoomSpecialTypes().getFreezeScoreboards(team.teamColor); + + for (InteractionFreezeScoreboard scoreboard : scoreBoards.values()) + { + if(scoreboard.getExtradata().isEmpty()) + { + scoreboard.setExtradata("0"); + } + + int oldScore = Integer.valueOf(scoreboard.getExtradata()); + + if(oldScore == totalScore) + continue; + + scoreboard.setExtradata(totalScore + ""); + this.room.updateItemState(scoreboard); + } + } + + for (Map.Entry set : this.room.getRoomSpecialTypes().getFreezeTimers().entrySet()) + { + set.getValue().setExtradata(timeLeft + ""); + this.room.updateItemState(set.getValue()); + } + } else + { + this.stop(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public void stop() + { + super.stop(); + + this.timeLeft = 0; + + GameTeam winningTeam = null; + + for(GameTeam team : this.teams.values()) + { + if(winningTeam == null || team.getTotalScore() > winningTeam.getTotalScore()) + { + winningTeam = team; + } + } + + for (GameTeam team : this.teams.values()) + { + THashSet players = new THashSet(); + + players.addAll(team.getMembers()); + + for(GamePlayer p : players) + { + if (p.getScore() > 0) + { + if (team.equals(winningTeam)) + { + AchievementManager.progressAchievement(p.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FreezeWinner"), p.getScore()); + this.room.sendComposer(new RoomUserActionComposer(p.getHabbo().getRoomUnit(), RoomUserAction.WAVE).compose()); + } + + AchievementManager.progressAchievement(p.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FreezePlayer")); + } + } + } + + Map teamMemberCount = new HashMap(); + for (Map.Entry teamEntry : this.teams.entrySet()) + { + teamMemberCount.put(teamEntry.getKey(), teamEntry.getValue().getMembers().size()); + } + + for (Map.Entry set : this.room.getRoomSpecialTypes().getFreezeGates().entrySet()) + { + if (teamMemberCount.containsKey(set.getValue())) + { + int amount = Math.min(teamMemberCount.get(set.getValue().teamColor), 5); + set.getValue().setExtradata(amount + ""); + teamMemberCount.put(set.getValue().teamColor, teamMemberCount.get(set.getValue().teamColor) - amount); + this.room.updateItemState(set.getValue()); + } + } + + this.setFreezeTileState("0"); + } + + public void setFreezeTileState(String state) + { + this.room.getRoomSpecialTypes().getFreezeExitTiles().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(InteractionFreezeExitTile object) + { + object.setExtradata(state); + room.updateItemState(object); + return true; + } + }); + + } + + @EventHandler + public static void onUserWalkEvent(UserTakeStepEvent event) + { + if(event.habbo.getHabboInfo().getCurrentGame() == FreezeGame.class) + { + FreezeGame game = (FreezeGame) event.habbo.getHabboInfo().getCurrentRoom().getGame(FreezeGame.class); + if (game != null && game.isRunning) + { + if (!game.room.hasObjectTypeAt(InteractionFreezeTile.class, event.toLocation.x, event.toLocation.y)) + { + event.setCancelled(true); + event.habbo.getRoomUnit().setGoalLocation(event.habbo.getRoomUnit().getCurrentLocation()); + event.habbo.getRoomUnit().getStatus().remove("mv"); + game.room.sendComposer(new RoomUserStatusComposer(event.habbo.getRoomUnit()).compose()); + } + } + } + } + + @EventHandler + public static void onConfigurationUpdated(EmulatorConfigUpdatedEvent event) + { + POWER_UP_POINTS = Emulator.getConfig().getInt("hotel.freeze.points.effect"); + POWER_UP_CHANCE = Emulator.getConfig().getInt("hotel.freeze.powerup.chance"); + POWER_UP_PROTECT_TIME = Emulator.getConfig().getInt("hotel.freeze.powerup.protection.time"); + DESTROY_BLOCK_POINTS = Emulator.getConfig().getInt("hotel.freeze.points.block"); + FREEZE_TIME = Emulator.getConfig().getInt("hotel.freeze.onfreeze.time.frozen"); + FREEZE_LOOSE_SNOWBALL = Emulator.getConfig().getInt("hotel.freeze.onfreeze.loose.snowballs"); + FREEZE_LOOSE_BOOST = Emulator.getConfig().getInt("hotel.freeze.onfreeze.loose.explosionboost"); + MAX_LIVES = Emulator.getConfig().getInt("hotel.freeze.powerup.max.lives"); + MAX_SNOWBALLS = Emulator.getConfig().getInt("hotel.freeze.powerup.max.snowballs"); + FREEZE_LOOSE_POINTS = Emulator.getConfig().getInt("hotel.freeze.points.freeze"); + POWERUP_STACK = Emulator.getConfig().getBoolean("hotel.freeze.powerup.protection.stack"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGamePlayer.java b/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGamePlayer.java new file mode 100644 index 00000000..91aacf01 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGamePlayer.java @@ -0,0 +1,267 @@ +package com.eu.habbo.habbohotel.games.freeze; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.FreezeLivesComposer; + +public class FreezeGamePlayer extends GamePlayer +{ + private int lives; + private int snowBalls; + private int explosionBoost; + private int protectionTime; + private int frozenTime; + public boolean nextDiagonal; + public boolean nextHorizontal; + public boolean tempMassiveExplosion; + public boolean dead; + + public FreezeGamePlayer(Habbo habbo, GameTeamColors teamColor) + { + super(habbo, teamColor); + } + + @Override + public void reset() + { + this.lives = 3; + this.snowBalls = 1; + this.explosionBoost = 0; + this.protectionTime = 0; + this.frozenTime = 0; + this.nextDiagonal = false; + this.nextHorizontal = true; + this.tempMassiveExplosion = false; + this.dead = false; + + super.reset(); + } + + @Override + public void addScore(int amount) + { + super.addScore(amount); + + if(amount > 0) + { + AchievementManager.progressAchievement(this.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FreezePlayer"), amount); + } + } + + /* + Freeze + */ + public void addLife() + { + if(this.lives < FreezeGame.MAX_LIVES) + { + this.lives++; + super.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new FreezeLivesComposer(this).compose()); + } + } + + public void takeLife() + { + this.lives--; + if(this.lives == 0) + { + this.dead = true; + + FreezeGame game = (FreezeGame) super.getHabbo().getHabboInfo().getCurrentRoom().getGame(FreezeGame.class); + + if(game != null) + { + game.playerDies(this); + } + return; + } + else + { + super.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new FreezeLivesComposer(this).compose()); + } + } + + public int getLives() + { + return this.lives; + } + + public boolean canPickupLife() + { + return this.lives < 3; + } + + public void addSnowball() + { + if(this.snowBalls < FreezeGame.MAX_SNOWBALLS) + this.snowBalls++; + } + + public void addSnowball(int amount) + { + this.snowBalls += amount; + + if(this.snowBalls < 1) + this.snowBalls = 1; + } + + public void takeSnowball() + { + if(this.snowBalls > 0) + this.snowBalls--; + } + + public boolean canThrowSnowball() + { + if(this.snowBalls > 0) + { + if(!this.isFrozen()) + return true; + } + + return false; + } + + public void freeze() + { + if(this.protectionTime > 0 || this.frozenTime > 0) + return; + + this.takeLife(); + + this.frozenTime = FreezeGame.FREEZE_TIME; + this.addSnowball(-FreezeGame.FREEZE_LOOSE_SNOWBALL); + this.addExplosion(-FreezeGame.FREEZE_LOOSE_BOOST); + super.getHabbo().getRoomUnit().setCanWalk(false); + this.updateEffect(); + } + + public void unfreeze() + { + super.getHabbo().getRoomUnit().setCanWalk(true); + this.frozenTime = 0; + this.addProtection(); + } + + public boolean isFrozen() + { + return this.frozenTime > 0; + } + + public boolean canGetFrozen() + { + if(this.isFrozen() || this.isProtected()) + return false; + + return true; + } + + public void addProtection() + { + this.updateEffect(); + + if(this.isProtected() && !FreezeGame.POWERUP_STACK) + return; + + this.protectionTime += FreezeGame.POWER_UP_PROTECT_TIME; + } + + public boolean isProtected() + { + return this.protectionTime > 0; + } + + public int getExplosionBoost() + { + if(this.tempMassiveExplosion) + { + this.tempMassiveExplosion = false; + return 5; + } + + return this.explosionBoost; + } + + public void increaseExplosion() + { + if(this.explosionBoost < 5) + this.explosionBoost++; + } + + public void addExplosion(int radius) + { + this.explosionBoost += radius; + + if(this.explosionBoost < 0) + { + this.explosionBoost = 0; + } + + if(this.explosionBoost > 5) + { + this.explosionBoost = 5; + } + } + + public void cycle() + { + boolean needsEffectUpdate = false; + + if(this.isProtected()) + { + this.protectionTime--; + + if(!this.isProtected()) + needsEffectUpdate = true; + } + + if(this.frozenTime > 0) + { + this.frozenTime--; + + if(frozenTime <= 0) + { + super.getHabbo().getRoomUnit().setCanWalk(true); + needsEffectUpdate = true; + } + } + + if(needsEffectUpdate) + this.updateEffect(); + } + + public int correctEffectId() + { + if(this.dead) + return 0; + + if(!this.isFrozen()) + { + int effectId = 40; + + effectId += super.getTeamColor().type; + + if (this.isProtected()) + { + effectId += 9; + } + + return effectId; + } + else + { + return 12; + } + } + + public void updateEffect() + { + if(this.dead) + return; + + super.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(super.getHabbo(), this.correctEffectId()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGameTeam.java b/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGameTeam.java new file mode 100644 index 00000000..bd78c184 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/freeze/FreezeGameTeam.java @@ -0,0 +1,37 @@ +package com.eu.habbo.habbohotel.games.freeze; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; + +public class FreezeGameTeam extends GameTeam +{ + public FreezeGameTeam(GameTeamColors teamColor) + { + super(teamColor); + } + + @Override + public void removeMember(GamePlayer gamePlayer) + { + Game game = gamePlayer.getHabbo().getHabboInfo().getCurrentRoom().getGame(FreezeGame.class); + if(game != null && game instanceof FreezeGame) + { + ((FreezeGame) game).placebackHelmet(gamePlayer.getTeamColor()); + } + + gamePlayer.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(gamePlayer.getHabbo(), 0); + gamePlayer.getHabbo().getRoomUnit().setCanWalk(true); + + super.removeMember(gamePlayer); + } + + @Override + public void addMember(GamePlayer gamePlayer) + { + super.addMember(gamePlayer); + + gamePlayer.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(gamePlayer.getHabbo(), FreezeGame.effectId + this.teamColor.type); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/games/tag/BunnyrunGame.java b/src/main/java/com/eu/habbo/habbohotel/games/tag/BunnyrunGame.java new file mode 100644 index 00000000..d9c5eb65 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/tag/BunnyrunGame.java @@ -0,0 +1,44 @@ +package com.eu.habbo.habbohotel.games.tag; + +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; +import com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun.InteractionBunnyrunPole; +import com.eu.habbo.habbohotel.rooms.Room; + +public class BunnyrunGame extends TagGame +{ + public BunnyrunGame(Room room) + { + super(GameTeam.class, TagGamePlayer.class, room); + } + + @Override + public Class getTagPole() + { + return InteractionBunnyrunPole.class; + } + + @Override + public int getMaleEffect() + { + return 0; + } + + @Override + public int getMaleTaggerEffect() + { + return 68; + } + + @Override + public int getFemaleEffect() + { + return 0; + } + + @Override + public int getFemaleTaggerEffect() + { + return 68; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/tag/IceTagGame.java b/src/main/java/com/eu/habbo/habbohotel/games/tag/IceTagGame.java new file mode 100644 index 00000000..da606ebc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/tag/IceTagGame.java @@ -0,0 +1,203 @@ +package com.eu.habbo.habbohotel.games.tag; + +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; +import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagPole; +import com.eu.habbo.habbohotel.rooms.Room; + +/*public class IceTagGame extends Game +{ + private static final int MALE_SKATES = 38; + private static final int FEMALE_SKATES = 39; + + public boolean hasIceTagGame = false; + + public IceTagGame(Room room) throws Exception + { + super(null, null, room); + } + + @Override + public void initialise() + { + + } + + @Override + public boolean addHabbo(Habbo habbo, GameTeamColors teamColor) + { + return super.addHabbo(habbo, teamColor); + } + + @Override + public void removeHabbo(Habbo habbo) + { + + } + + @Override + public void start() + { + } + + @Override + public void run() + { + + } + + @Override + public void stop() + { + } + + @EventHandler + public static void onUserLookAtPoint(RoomUnitLookAtPointEvent event) + { + if(!isValidEffect(event.roomUnit.getEffectId())) + return; + + Room room = event.room; + + Habbo h = event.room.getHabbo(event.roomUnit); + + boolean found = false; + + if (room != null && h != null) + { + for(Habbo habbo : room.getCurrentHabbos().valueCollection()) + { + if(habbo.getRoomUnit().getEffectId() == (habbo.getHabboInfo().getGender().equals(HabboGender.M) ? MALE_SKATES + 7 : FEMALE_SKATES + 7)) + found = true; + } + + if(!found) + { + room.giveEffect(h, (h.getHabboInfo().getGender().equals(HabboGender.M) ? MALE_SKATES : FEMALE_SKATES) + 7); + return; + } + + THashSet items = room.getRoomSpecialTypes().getItemsOfType(InteractionTagPole.class); + + if(items.isEmpty()) + return; + + if(PathFinder.tilesAdjecent(event.location.X, event.location.Y, h.getRoomUnit().getX(), h.getRoomUnit().getY())) + { + if (h.getRoomUnit().getEffectId() == (h.getHabboInfo().getGender().equals(HabboGender.M) ? MALE_SKATES + 7 : FEMALE_SKATES + 7)) + { + boolean affectedHabbo = false; + for (Habbo habbo : room.getHabbosAt(event.location)) + { + if (habbo == h) + continue; + + if (habbo.getRoomUnit().getEffectId() == (habbo.getHabboInfo().getGender().equals(HabboGender.M) ? MALE_SKATES : FEMALE_SKATES)) + { + room.giveEffect(habbo, (habbo.getHabboInfo().getGender().equals(HabboGender.M) ? MALE_SKATES : FEMALE_SKATES) + 7); + room.giveEffect(h, (habbo.getHabboInfo().getGender().equals(HabboGender.M) ? MALE_SKATES : FEMALE_SKATES)); + } + + affectedHabbo = true; + + break; + } + + if (affectedHabbo) + { + for (HabboItem item : items) + { + item.setExtradata("1"); + room.updateItem(item); + Emulator.getThreading().run(new HabboItemNewState(item, room, "0"), 1000); + } + } + } + } + } + } + + @EventHandler + public static void onUserWalkEvent(UserTakeStepEvent event) + { + if (event.habbo.getHabboInfo().getCurrentGame() == IceTagGame.class) + { + + } + else + { + THashSet + } + } + + private static boolean isValidEffect(int effectId) + { + if(effectId == MALE_SKATES) + return true; + + if(effectId == FEMALE_SKATES) + return true; + + if(effectId - 7 == MALE_SKATES) + return true; + + if (effectId - 7 == FEMALE_SKATES) + return true; + + return false; + } + + private static boolean hasValidEffect(Habbo habbo) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M)) + { + return habbo.getRoomUnit().getEffectId() == MALE_SKATES || habbo.getRoomUnit().getEffectId() - 7 == MALE_SKATES; + } + else + { + return habbo.getRoomUnit().getEffectId() == FEMALE_SKATES || habbo.getRoomUnit().getEffectId() - 7 == FEMALE_SKATES; + } + } +} +*/ + +public class IceTagGame extends TagGame +{ + private static final int MALE_SKATES = 38; + private static final int FEMALE_SKATES = 39; + + public IceTagGame(Room room) + { + super(GameTeam.class, TagGamePlayer.class, room); + } + + @Override + public Class getTagPole() + { + return InteractionIceTagPole.class; + } + + @Override + public int getMaleEffect() + { + return MALE_SKATES; + } + + @Override + public int getMaleTaggerEffect() + { + return MALE_SKATES + 7; + } + + @Override + public int getFemaleEffect() + { + return FEMALE_SKATES; + } + + @Override + public int getFemaleTaggerEffect() + { + return FEMALE_SKATES + 7; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/tag/RollerskateGame.java b/src/main/java/com/eu/habbo/habbohotel/games/tag/RollerskateGame.java new file mode 100644 index 00000000..29b96791 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/tag/RollerskateGame.java @@ -0,0 +1,43 @@ +package com.eu.habbo.habbohotel.games.tag; + +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; +import com.eu.habbo.habbohotel.rooms.Room; + +public class RollerskateGame extends TagGame +{ + public RollerskateGame(Room room) + { + super(GameTeam.class, TagGamePlayer.class, room); + } + + @Override + public Class getTagPole() + { + return null; + } + + @Override + public int getMaleEffect() + { + return 55; + } + + @Override + public int getMaleTaggerEffect() + { + return 57; + } + + @Override + public int getFemaleEffect() + { + return 56; + } + + @Override + public int getFemaleTaggerEffect() + { + return 58; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/tag/TagGame.java b/src/main/java/com/eu/habbo/habbohotel/games/tag/TagGame.java new file mode 100644 index 00000000..614623b6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/tag/TagGame.java @@ -0,0 +1,237 @@ +package com.eu.habbo.habbohotel.games.tag; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.roomunit.RoomUnitLookAtPointEvent; +import com.eu.habbo.plugin.events.users.UserTakeStepEvent; +import com.eu.habbo.threading.runnables.HabboItemNewState; +import gnu.trove.iterator.hash.TObjectHashIterator; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.Map; + +public abstract class TagGame extends Game +{ + public THashMap taggers = new THashMap(); + + public TagGame(Class gameTeamClazz, Class gamePlayerClazz, Room room) + { + super(gameTeamClazz, gamePlayerClazz, room, false); + } + + public abstract Class getTagPole(); + + public abstract int getMaleEffect(); + + public abstract int getMaleTaggerEffect(); + + public abstract int getFemaleEffect(); + + public abstract int getFemaleTaggerEffect(); + + public void tagged(Room room, Habbo tagger, Habbo tagged) + { + if (this.taggers.containsKey(tagged)) + { + return; + } + + THashSet poles = room.getRoomSpecialTypes().getItemsOfType(this.getTagPole()); + InteractionTagPole pole = this.taggers.get(tagger); + room.giveEffect(tagged, this.getTaggedEffect(tagged)); + + if (poles.size() > this.taggers.size()) + { + for (Map.Entry set : this.taggers.entrySet()) + { + poles.remove(set.getValue()); + } + + for (HabboItem item : poles) + { + tagged.getHabboInfo().getCurrentRoom().giveEffect(tagged, getTaggedEffect(tagged)); + this.taggers.put(tagged, (InteractionTagPole) item); + } + } + else + { + if (tagger != null) + { + room.giveEffect(tagger, this.getEffect(tagger)); + this.taggers.remove(tagger); + } + + this.taggers.put(tagged, pole); + } + + if (pole != null) + { + pole.setExtradata("1"); + room.updateItemState(pole); + Emulator.getThreading().run(new HabboItemNewState(pole, room, "0"), 1000); + } + } + + @Override + public synchronized boolean addHabbo(Habbo habbo, GameTeamColors teamColor) + { + super.addHabbo(habbo, GameTeamColors.RED); + + if (this.getTagPole() != null) + { + THashSet poles = habbo.getHabboInfo().getCurrentRoom().getRoomSpecialTypes().getItemsOfType(this.getTagPole()); + + if (poles.size() > this.taggers.size()) + { + for (Map.Entry set : this.taggers.entrySet()) + { + poles.remove(set.getValue()); + } + + TObjectHashIterator iterator = poles.iterator(); + if ((iterator.hasNext())) + { + HabboItem item = iterator.next(); + habbo.getHabboInfo().getCurrentRoom().giveEffect(habbo, getTaggedEffect(habbo)); + this.taggers.put(habbo, (InteractionTagPole) item); + return true; + } + } + } + else + { + if (this.taggers.isEmpty()) + { + habbo.getHabboInfo().getCurrentRoom().giveEffect(habbo, getTaggedEffect(habbo)); + this.taggers.put(habbo, null); + return true; + } + } + + habbo.getHabboInfo().getCurrentRoom().giveEffect(habbo, getEffect(habbo)); + + return true; + } + + @Override + public synchronized void removeHabbo(Habbo habbo) + { + super.removeHabbo(habbo); + this.taggers.remove(habbo); + habbo.getHabboInfo().getCurrentRoom().giveEffect(habbo, 0); + } + + @Override + public void initialise() + { + + } + + @Override + public void run() + { + + } + + public int getEffect(Habbo habbo) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M)) + { + return this.getMaleEffect(); + } + + return this.getFemaleEffect(); + } + + public int getTaggedEffect(Habbo habbo) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M)) + { + return this.getMaleTaggerEffect(); + } + + return this.getFemaleTaggerEffect(); + } + + public boolean isTagger(Habbo habbo) + { + return this.taggers.containsKey(habbo); + } + + @EventHandler + public static void onUserLookAtPoint(RoomUnitLookAtPointEvent event) + { + if (RoomLayout.tilesAdjecent(event.roomUnit.getCurrentLocation(), event.location)) + { + Habbo habbo = event.room.getHabbo(event.roomUnit); + + if (habbo != null) + { + if (habbo.getHabboInfo().getCurrentGame() != null) + { + if (TagGame.class.isAssignableFrom(habbo.getHabboInfo().getCurrentGame())) + { + TagGame game = (TagGame) event.room.getGame(habbo.getHabboInfo().getCurrentGame()); + + if (game != null) + { + if (game.isTagger(habbo)) + { + for (Habbo tagged : event.room.getHabbosAt(event.location)) + { + if (tagged == habbo || tagged.getHabboInfo().getCurrentGame() == null || tagged.getHabboInfo().getCurrentGame() != habbo.getHabboInfo().getCurrentGame()) + { + continue; + } + + game.tagged(event.room, habbo, tagged); + break; + } + } + } + } + } + } + } + } + + @EventHandler + public static void onUserWalkEvent(UserTakeStepEvent event) + { + if(event.habbo.getHabboInfo().getCurrentGame() != null && TagGame.class.isAssignableFrom(event.habbo.getHabboInfo().getCurrentGame())) + { + THashSet items = event.habbo.getHabboInfo().getCurrentRoom().getItemsAt(event.toLocation); + + TagGame game = (TagGame) event.habbo.getHabboInfo().getCurrentRoom().getGame(event.habbo.getHabboInfo().getCurrentGame()); + + if (game != null) + { + for (HabboItem item : items) + { + if (item instanceof InteractionTagField && ((InteractionTagField) item).gameClazz == event.habbo.getHabboInfo().getCurrentGame()) + { + if (game.taggers.isEmpty()) + { + game.tagged(event.habbo.getHabboInfo().getCurrentRoom(), null, event.habbo); + } + return; + } + } + + game.removeHabbo(event.habbo); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/tag/TagGamePlayer.java b/src/main/java/com/eu/habbo/habbohotel/games/tag/TagGamePlayer.java new file mode 100644 index 00000000..f7465d91 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/tag/TagGamePlayer.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.games.tag; + +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.users.Habbo; + +public class TagGamePlayer extends GamePlayer +{ + /** + * Creates a new GamePlayer for the given Habbo and it's team. + * + * @param habbo The Habbo who is linked to this GamePlayer. + * @param teamColor The team the GamePlayer is in. + */ + public TagGamePlayer(Habbo habbo, GameTeamColors teamColor) + { + super(habbo, teamColor); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/games/wired/WiredGame.java b/src/main/java/com/eu/habbo/habbohotel/games/wired/WiredGame.java new file mode 100644 index 00000000..3737fa7e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/games/wired/WiredGame.java @@ -0,0 +1,77 @@ +package com.eu.habbo.habbohotel.games.wired; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTimer; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.Map; + +public class WiredGame extends Game +{ + private int timeLeft = 30; + public WiredGame(Room room) + { + super(GameTeam.class, GamePlayer.class, room , false); + } + + @Override + public void initialise() + { + for (Map.Entry set : this.room.getRoomSpecialTypes().getGameTimers().entrySet()) + { + if(set.getValue().getExtradata().isEmpty()) + continue; + + if(this.timeLeft < Integer.valueOf(set.getValue().getExtradata())) + { + this.timeLeft = Integer.valueOf(set.getValue().getExtradata()); + } + } + + if (this.timeLeft <= 30) + { + this.timeLeft = 30; + } + + this.run(); + } + + @Override + public void run() + { + if (this.timeLeft > 0) + { + Emulator.getThreading().run(this, 1000); + this.timeLeft--; + for (Map.Entry set : this.room.getRoomSpecialTypes().getGameTimers().entrySet()) + { + set.getValue().setExtradata(timeLeft + ""); + this.room.updateItemState(set.getValue()); + } + } + else + { + this.stop(); + } + } + + @Override + public boolean addHabbo(Habbo habbo, GameTeamColors teamColor) + { + this.room.giveEffect(habbo, FreezeGame.effectId + teamColor.type); + return super.addHabbo(habbo, teamColor); + } + + @Override + public synchronized void removeHabbo(Habbo habbo) + { + this.room.giveEffect(habbo, 0); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuardianTicket.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuardianTicket.java new file mode 100644 index 00000000..555d9b7e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuardianTicket.java @@ -0,0 +1,338 @@ +package com.eu.habbo.habbohotel.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.guardians.*; +import com.eu.habbo.messages.outgoing.guides.BullyReportClosedComposer; +import com.eu.habbo.threading.runnables.GuardianNotAccepted; +import com.eu.habbo.threading.runnables.GuardianVotingFinish; +import gnu.trove.map.hash.THashMap; + +import java.util.*; + +public class GuardianTicket +{ + private ArrayList chatLogs; + private final THashMap votes = new THashMap(); + private GuardianVoteType verdict; + private int timeLeft = 120; + private int resendCount = 0; + private int checkSum = 0; + private final Habbo reporter; + private final Habbo reported; + private final Date date; + + private int guardianCount = 0; + + public GuardianTicket(Habbo reporter, Habbo reported, ArrayList chatLogs) + { + this.chatLogs = chatLogs; + Collections.sort(chatLogs); + Emulator.getThreading().run(new GuardianVotingFinish(this), 120000); + + this.reported = reported; + this.reporter = reporter; + this.date = new Date(); + } + + /** + * Requests an Guardian to vote on this ticket. + * @param guardian The Guardian to ask. + */ + public void requestToVote(Habbo guardian) + { + guardian.getClient().sendResponse(new GuardianNewReportReceivedComposer(this)); + + this.votes.put(guardian, new GuardianVote(guardianCount, guardian)); + + Emulator.getThreading().run(new GuardianNotAccepted(this, guardian), Emulator.getConfig().getInt("guardians.accept.timer") * 1000); + } + + /** + * Adds an guardian to this ticket. + * @param guardian The guardian to add. + */ + public void addGuardian(Habbo guardian) + { + GuardianVote vote = this.votes.get(guardian); + + if(vote != null && vote.type == GuardianVoteType.SEARCHING) + { + guardian.getClient().sendResponse(new GuardianVotingRequestedComposer(this)); + vote.type = GuardianVoteType.WAITING; + this.updateVotes(); + } + } + + /** + * Removes an Guardian from this ticket. + * @param guardian The Guardian to remove. + */ + public void removeGuardian(Habbo guardian) + { + GuardianVote vote = this.getVoteForGuardian(guardian); + + if(vote == null) + return; + + if(vote.type == GuardianVoteType.SEARCHING || vote.type == GuardianVoteType.WAITING) + { + this.getVoteForGuardian(guardian).type = GuardianVoteType.NOT_VOTED; + } + + this.getVoteForGuardian(guardian).ignore = true; + + guardian.getClient().sendResponse(new GuardianVotingTimeEnded()); + + this.updateVotes(); + } + + /** + * Set the vote for an Guardian. + * @param guardian The Guardian to set the vote for. + * @param vote The GuardianVoteType to set the vote to. + */ + public void vote(Habbo guardian, GuardianVoteType vote) + { + this.votes.get(guardian).type = vote; + + this.updateVotes(); + + AchievementManager.progressAchievement(guardian, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideChatReviewer")); + + this.finish(); + } + + /** + * Updates the votes to all other voting guardians. + */ + public void updateVotes() + { + synchronized (this.votes) + { + for(Map.Entry set : this.votes.entrySet()) + { + if(set.getValue().type == GuardianVoteType.WAITING || set.getValue().type == GuardianVoteType.NOT_VOTED || set.getValue().ignore || set.getValue().type == GuardianVoteType.SEARCHING) + continue; + + set.getKey().getClient().sendResponse(new GuardianVotingVotesComposer(this, set.getKey())); + } + } + } + + /** + * Tries to finish the voting on a ticket and searches for more guardians if needed. + */ + public void finish() + { + int votedCount = this.getVotedCount(); + if(votedCount < Emulator.getConfig().getInt("guardians.minimum.votes")) + { + if(this.votes.size() >= Emulator.getConfig().getInt("guardians.maximum.guardians.total") || this.resendCount == Emulator.getConfig().getInt("guardians.maximum.resends")) + { + this.verdict = GuardianVoteType.FORWARDED; + + Emulator.getGameEnvironment().getGuideManager().closeTicket(this); + + ModToolIssue issue = new ModToolIssue(this.reporter.getHabboInfo().getId(), + this.reporter.getHabboInfo().getUsername(), + this.reported.getHabboInfo().getId(), + this.reported.getHabboInfo().getUsername(), + 0, + "", + ModToolTicketType.GUARDIAN); + + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + + this.reporter.getClient().sendResponse(new BullyReportClosedComposer(BullyReportClosedComposer.CLOSED)); + } + else + { + this.timeLeft = 30; + Emulator.getThreading().run(new GuardianVotingFinish(this), 10000); + this.resendCount++; + + Emulator.getGameEnvironment().getGuideManager().findGuardians(this); + } + } + else + { + this.verdict = calculateVerdict(); + + for(Map.Entry set : this.votes.entrySet()) + { + if(set.getValue().type == GuardianVoteType.ACCEPTABLY || + set.getValue().type == GuardianVoteType.BADLY || + set.getValue().type == GuardianVoteType.AWFULLY) + { + set.getKey().getClient().sendResponse(new GuardianVotingResultComposer(this, set.getValue())); + } + } + + Emulator.getGameEnvironment().getGuideManager().closeTicket(this); + + if(this.verdict == GuardianVoteType.ACCEPTABLY) + this.reporter.getClient().sendResponse(new BullyReportClosedComposer(BullyReportClosedComposer.MISUSE)); + else + this.reporter.getClient().sendResponse(new BullyReportClosedComposer(BullyReportClosedComposer.CLOSED)); + } + } + + /** + * @return True if an verdict has been set. + */ + public boolean isFinished() + { + return !(this.verdict == null); + } + + /** + * @return Calculates the verdict of this ticket. + */ + public GuardianVoteType calculateVerdict() + { + int countAcceptably = 0; + int countBadly = 0; + int countAwfully = 0; + int total = 0; + + synchronized (this.votes) + { + for(Map.Entry set : this.votes.entrySet()) + { + GuardianVote vote = set.getValue(); + + if(vote.type == GuardianVoteType.ACCEPTABLY) + { + countAcceptably++; + } + else if(vote.type == GuardianVoteType.BADLY) + { + countBadly++; + } + else if(vote.type == GuardianVoteType.AWFULLY) + { + countAwfully++; + } + } + } + + total += countAcceptably; + total += countBadly; + total += countAwfully; + +// if(total / countAcceptably * 100.0 >= 35) +// { +// if(total / countBadly >= ) +// } + + return GuardianVoteType.BADLY; + } + + public GuardianVote getVoteForGuardian(Habbo guardian) + { + return this.votes.get(guardian); + } + + public THashMap getVotes() + { + return this.votes; + } + + public int getTimeLeft() + { + return this.timeLeft; + } + + public GuardianVoteType getVerdict() + { + return this.verdict; + } + + public ArrayList getChatLogs() + { + return this.chatLogs; + } + + public int getResendCount() + { + return this.resendCount; + } + + public int getCheckSum() + { + return this.checkSum; + } + + public Habbo getReporter() + { + return this.reporter; + } + + public Habbo getReported() + { + return this.reported; + } + + public Date getDate() + { + return this.date; + } + + public int getGuardianCount() + { + return this.guardianCount; + } + + /** + * Sorts all votes. + * @param guardian The guardian to remove from this vote list. + * @return The sorted votes list. + */ + public ArrayList getSortedVotes(Habbo guardian) + { + synchronized (this.votes) + { + ArrayList votes = new ArrayList(this.votes.values()); + Collections.sort(votes); + + GuardianVote v = null; + for(GuardianVote vote : votes) + { + if(vote.guardian == guardian) + { + v = vote; + break; + } + } + votes.remove(v); + + return votes; + } + } + + /** + * @return The amount of votes (Acceptably, Badly or Awfully) thath as been cast. + */ + public int getVotedCount() + { + int count = 0; + synchronized (this.votes) + { + for(Map.Entry set : this.votes.entrySet()) + { + if(set.getValue().type == GuardianVoteType.ACCEPTABLY || + set.getValue().type == GuardianVoteType.BADLY || + set.getValue().type == GuardianVoteType.AWFULLY) + count++; + } + } + + return count; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuardianVote.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuardianVote.java new file mode 100644 index 00000000..5e64fdff --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuardianVote.java @@ -0,0 +1,41 @@ +package com.eu.habbo.habbohotel.guides; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuardianVote implements Comparable +{ + public int id; + public Habbo guardian; + public GuardianVoteType type; + public boolean ignore; + + public GuardianVote(int id, Habbo guardian) + { + this.id = id; + this.guardian = guardian; + this.type = GuardianVoteType.SEARCHING; + this.ignore = false; + } + + @Override + public int compareTo(GuardianVote o) + { + return this.id - o.id; + } + + @Override + public boolean equals(Object o) + { + if(o instanceof GuardianVote) + { + return ((GuardianVote)o).id == this.id && ((GuardianVote) o).guardian == this.guardian && ((GuardianVote) o).type == this.type; + } + + return false; + } + + public void ignore() + { + this.ignore = true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuardianVoteType.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuardianVoteType.java new file mode 100644 index 00000000..e23c9ed1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuardianVoteType.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.guides; + +public enum GuardianVoteType +{ + FORWARDED(-1), + WAITING(0), + ACCEPTABLY(1), + BADLY(2), + AWFULLY(3), + NOT_VOTED(4), + SEARCHING(5); + + private final int type; + + GuardianVoteType(int type) + { + this.type = type; + } + + public int getType() + { + return this.type; + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuideChatMessage.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuideChatMessage.java new file mode 100644 index 00000000..df1b3fb5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuideChatMessage.java @@ -0,0 +1,15 @@ +package com.eu.habbo.habbohotel.guides; + +public class GuideChatMessage +{ + public final int userId; + public final String message; + public final int timestamp; + + public GuideChatMessage(int userId, String message, int timestamp) + { + this.userId = userId; + this.message = message; + this.timestamp = timestamp; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuideManager.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuideManager.java new file mode 100644 index 00000000..ca5e897c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuideManager.java @@ -0,0 +1,567 @@ +package com.eu.habbo.habbohotel.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.guides.*; +import com.eu.habbo.threading.runnables.GuardianTicketFindMoreSlaves; +import com.eu.habbo.threading.runnables.GuideFindNewHelper; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; + +public class GuideManager +{ + private final THashSet activeTours; + private final THashSet activeTickets; + private final THashSet closedTickets; + private final THashMap activeHelpers; + private final THashMap activeGuardians; + private final THashMap tourRequestTiming; + + public GuideManager() + { + this.activeTours = new THashSet(); + this.activeTickets = new THashSet(); + this.closedTickets = new THashSet(); + this.activeHelpers = new THashMap(); + this.activeGuardians = new THashMap(); + this.tourRequestTiming = new THashMap(); + } + + public void userLogsOut(Habbo habbo) + { + GuideTour tour = this.getGuideTourByHabbo(habbo); + + if(tour != null) + { + this.endSession(tour); + } + + this.activeHelpers.remove(habbo); + + GuardianTicket ticket = this.getTicketForGuardian(habbo); + + if(ticket != null) + { + ticket.removeGuardian(habbo); + } + + this.activeGuardians.remove(habbo); + } + + /** + * Guide Shit + */ + + public void setOnGuide(Habbo habbo, boolean onDuty) + { + if(onDuty) + { + this.activeHelpers.put(habbo, false); + } + else + { + GuideTour tour = this.getGuideTourByHabbo(habbo); + + if(tour != null) + return; + + this.activeHelpers.remove(habbo); + } + } + + /** + * Searches for an helper to handle the tour. + * Automatically schedules the tour request untill an helper is found + * or the request has been cancelled by the requester. + * + * @param tour The tour to find a helper for. + * @return Wether an helper has been found. + */ + public boolean findHelper(GuideTour tour) + { + synchronized (this.activeHelpers) + { + for(Map.Entry set : activeHelpers.entrySet()) + { + if(!set.getValue()) + { + if(!tour.hasDeclined(set.getKey().getHabboInfo().getId())) + { + tour.checkSum++; + tour.setHelper(set.getKey()); + set.getKey().getClient().sendResponse(new GuideSessionAttachedComposer(tour, true)); + tour.getNoob().getClient().sendResponse(new GuideSessionAttachedComposer(tour, false)); + Emulator.getThreading().run(new GuideFindNewHelper(tour, set.getKey()), 60000); + this.activeTours.add(tour); + return true; + } + } + } + } + this.endSession(tour); + tour.getNoob().getClient().sendResponse(new GuideSessionErrorComposer(GuideSessionErrorComposer.NO_HELPERS_AVAILABLE)); + + return false; + } + + /** + * Declines an tourrequest for the current helper assigned. + * Automatically searches for a new helper. + * @param tour The tour to decline. + */ + public void declineTour(GuideTour tour) + { + Habbo helper = tour.getHelper(); + tour.addDeclinedHelper(tour.getHelper().getHabboInfo().getId()); + tour.setHelper(null); + helper.getClient().sendResponse(new GuideSessionEndedComposer(GuideSessionEndedComposer.HELP_CASE_CLOSED)); + helper.getClient().sendResponse(new GuideSessionDetachedComposer()); + if(!this.findHelper(tour)) + { + this.endSession(tour); + tour.getNoob().getClient().sendResponse(new GuideSessionErrorComposer(GuideSessionErrorComposer.NO_HELPERS_AVAILABLE)); + } + } + + /** + * Starts an new tour session. + * @param tour The tour to start. + * @param helper The helper to assign. + */ + public void startSession(GuideTour tour, Habbo helper) + { + synchronized (this.activeTours) + { + synchronized (this.activeHelpers) + { + this.activeHelpers.put(helper, true); + + ServerMessage message = new GuideSessionStartedComposer(tour).compose(); + tour.getNoob().getClient().sendResponse(message); + tour.getHelper().getClient().sendResponse(message); + tour.checkSum++; + this.tourRequestTiming.put(tour.getStartTime(), Emulator.getIntUnixTimestamp()); + } + } + } + + /** + * Ends an tour session. + * + *
      + * The requester cancels the tour request. + *
    + *
      + * The requester says no more help needed. + *
    + *
      + * The requester reported the helper. + *
    + *
    + * @param tour + */ + public void endSession(GuideTour tour) + { + synchronized (this.activeTours) + { + synchronized (this.activeHelpers) + { + tour.getNoob().getClient().sendResponse(new GuideSessionEndedComposer(GuideSessionEndedComposer.HELP_CASE_CLOSED)); + tour.end(); + + if(tour.getHelper() != null) + { + this.activeHelpers.put(tour.getHelper(), false); + tour.getHelper().getClient().sendResponse(new GuideSessionEndedComposer(GuideSessionEndedComposer.HELP_CASE_CLOSED)); + tour.getHelper().getClient().sendResponse(new GuideSessionDetachedComposer()); + tour.getHelper().getClient().sendResponse(new GuideToolsComposer(true)); + } + } + } + } + + /** + * Recommend the guide. + * @param tour The GuideTour this applies to. + * @param recommend Recommended or not. + */ + public void recommend(GuideTour tour, boolean recommend) + { + synchronized (this.activeTours) + { + tour.setWouldRecommend(recommend ? GuideRecommendStatus.YES : GuideRecommendStatus.NO); + tour.getNoob().getClient().sendResponse(new GuideSessionDetachedComposer()); + AchievementManager.progressAchievement(tour.getNoob(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideFeedbackGiver")); + + this.activeTours.remove(tour); + } + } + + /** + * Gets the GuideTour for the given helper. + * @param helper The helper to find the tour for. + * @return The GuideTour for the helper. NULL when not found. + */ + public GuideTour getGuideTourByHelper(Habbo helper) + { + synchronized (this.activeTours) + { + for(GuideTour tour : this.activeTours) + { + if(!tour.isEnded() && tour.getHelper() == helper) + { + return tour; + } + } + } + + return null; + } + + /** + * Gets the GuideTour for the given requester. + * @param noob The noob to find the tour for. + * @return The GuideTour for the noob. NULL when not found. + */ + public GuideTour getGuideTourByNoob(Habbo noob) + { + synchronized (this.activeTours) + { + for(GuideTour tour : this.activeTours) + { + if(tour.getNoob() == noob) + { + return tour; + } + } + } + + return null; + } + + /** + * Searches for any GuideTour linked to the either the noob or the helper. + * @param habbo The Habbo to look for. + * @return An given tour. + */ + public GuideTour getGuideTourByHabbo(Habbo habbo) + { + synchronized (this.activeTours) + { + for(GuideTour tour : this.activeTours) + { + if(tour.getHelper() == habbo || tour.getNoob() == habbo) + { + return tour; + } + } + } + + return null; + } + + /** + * @return The amount of helpers that are on duty. + */ + public int getGuidesCount() + { + return this.activeHelpers.size(); + } + + /** + * @return The amount of guardians that are on duty. + */ + public int getGuardiansCount() + { + return this.activeGuardians.size(); + } + + /** + * @return true if there are guardians on duty. + */ + public boolean activeGuardians() + { + return this.activeGuardians.size() > 0; + } + + /** + * @return The average waiting time before an helper is assinged. + */ + public int getAverageWaitingTime() + { + synchronized (this.tourRequestTiming) + { + int total = 0; + + if(this.tourRequestTiming.isEmpty()) + return 5; + + for(Map.Entry set : this.tourRequestTiming.entrySet()) + { + total += (set.getValue() - set.getKey()); + } + + return total / this.tourRequestTiming.size(); + } + } + + /** + * Guardians + */ + + /** + * Adds a new guardian ticket to the active ticket Queue + * @param ticket The GuardianTicket to add. + */ + public void addGuardianTicket(GuardianTicket ticket) + { + synchronized (this.activeTickets) + { + this.activeTickets.add(ticket); + + this.findGuardians(ticket); + } + } + + /** + * Searches for new guardians to vote on the given ticket. + * @param ticket The GuardianTicket to find Guardians for. + */ + public void findGuardians(GuardianTicket ticket) + { + synchronized (this.activeGuardians) + { + int count = ticket.getVotedCount(); + + THashSet selectedGuardians = new THashSet(); + + for(Map.Entry set : this.activeGuardians.entrySet()) + { + if(count == 5) + break; + + if(set.getKey() == ticket.getReporter() || + set.getKey() == ticket.getReported()) + continue; + + if(set.getValue() == null) + { + if(ticket.getVoteForGuardian(set.getKey()) == null) + { + ticket.requestToVote(set.getKey()); + + selectedGuardians.add(set.getKey()); + } + } + + count++; + } + + for(Habbo habbo : selectedGuardians) + { + this.activeGuardians.put(habbo, ticket); + } + + if(count < 5) + { + Emulator.getThreading().run(new GuardianTicketFindMoreSlaves(ticket), 3000); + } + } + } + + /** + * Accept a ticket for an Guardian. + * @param guardian The Guardian who accepts. + * @param accepted Accepted. + */ + public void acceptTicket(Habbo guardian, boolean accepted) + { + GuardianTicket ticket = this.getTicketForGuardian(guardian); + + if(ticket != null) + { + if(!accepted) + { + ticket.removeGuardian(guardian); + this.findGuardians(ticket); + this.activeGuardians.put(guardian, null); + } + else + { + ticket.addGuardian(guardian); + this.activeGuardians.put(guardian, ticket); + } + } + } + + /** + * @return The active GuardianTicket for the Guardian. + */ + public GuardianTicket getTicketForGuardian(Habbo guardian) + { + synchronized (this.activeGuardians) + { + return this.activeGuardians.get(guardian); + } + } + + /** + * @return The most recent ticket send by the reporter. NULL when not found. + */ + public GuardianTicket getRecentTicket(Habbo reporter) + { + GuardianTicket ticket = null; + + synchronized (this.activeTickets) + { + for(GuardianTicket t : this.activeTickets) + { + if(t.getReporter() == reporter) + { + return t; + } + } + } + + synchronized (this.closedTickets) + { + for(GuardianTicket t : this.closedTickets) + { + if(t.getReporter() != reporter) + continue; + + if(ticket == null || Emulator.getIntUnixTimestamp() - (t.getDate().getTime() / 1000) < Emulator.getIntUnixTimestamp() - (ticket.getDate().getTime() / 1000)) + { + ticket = t; + } + } + } + + return ticket; + } + + public GuardianTicket getOpenReportedHabboTicket(Habbo reported) + { + GuardianTicket ticket = null; + + synchronized (this.activeTickets) + { + for(GuardianTicket t : this.activeTickets) + { + if(t.getReported() == reported) + { + return t; + } + } + } + + return ticket; + } + + /** + * Closes a ticket and moves it to the closed ticket queue. + * @param ticket The GuardianTicket to close. + */ + public void closeTicket(GuardianTicket ticket) + { + synchronized (this.activeTickets) + { + this.activeTickets.remove(ticket); + } + + synchronized (this.closedTickets) + { + this.closedTickets.add(ticket); + } + + THashSet toUpdate = new THashSet(); + + synchronized (this.activeGuardians) + { + for (Map.Entry set : this.activeGuardians.entrySet()) + { + if (set.getValue() == ticket) + { + toUpdate.add(set.getKey()); + } + } + + for (Habbo habbo : toUpdate) + { + this.activeGuardians.put(habbo, null); + } + } + } + + /** + * Sets the give Guardian active for Guardian duty. + * @param habbo The Guardian to set on duty. + * @param onDuty On duty or not. + */ + public void setOnGuardian(Habbo habbo, boolean onDuty) + { + if(onDuty) + { + this.activeGuardians.put(habbo, null); + } + else + { + GuardianTicket ticket = this.getTicketForGuardian(habbo); + + if(ticket != null) + { + ticket.removeGuardian(habbo); + } + + this.activeGuardians.remove(habbo); + } + } + + /** + * Cleans up shit. + */ + public void cleanup() + { + synchronized (this.activeTours) + { + THashSet tours = new THashSet(); + for(GuideTour tour : this.activeTours) + { + if(tour.isEnded() && (Emulator.getIntUnixTimestamp() - tour.getEndTime() > 300)) + { + tours.add(tour); + } + } + + for(GuideTour tour : tours) + { + this.activeTours.remove(tour); + } + } + + synchronized (this.activeTickets) + { + THashSet tickets = new THashSet(); + + for(GuardianTicket ticket : this.closedTickets) + { + if(Emulator.getIntUnixTimestamp() - (ticket.getDate().getTime() / 1000) > 15 * 60) + { + tickets.add(ticket); + } + } + + for(GuardianTicket ticket : tickets) + { + this.closedTickets.remove(ticket); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuideRecommendStatus.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuideRecommendStatus.java new file mode 100644 index 00000000..efa6341c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuideRecommendStatus.java @@ -0,0 +1,8 @@ +package com.eu.habbo.habbohotel.guides; + +public enum GuideRecommendStatus +{ + UNKNOWN, + YES, + NO +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guides/GuideTour.java b/src/main/java/com/eu/habbo/habbohotel/guides/GuideTour.java new file mode 100644 index 00000000..5379025d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guides/GuideTour.java @@ -0,0 +1,118 @@ +package com.eu.habbo.habbohotel.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +public class GuideTour +{ + public int checkSum = 0; + + private Habbo helper; + private int startTime; + private int endTime; + private boolean ended; + private GuideRecommendStatus wouldRecommend = GuideRecommendStatus.UNKNOWN; + + private final Habbo noob; + private final String helpRequest; + private final THashSet sendMessages = new THashSet(); + private final THashSet declinedHelpers = new THashSet(); + + public GuideTour(Habbo noob, String helpRequest) + { + this.noob = noob; + this.helpRequest = helpRequest; + + AchievementManager.progressAchievement(this.noob, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideAdvertisementReader")); + } + + public void finish() + { + //TODO Insert recommendation. + //TODO Query messages. + } + + public Habbo getNoob() + { + return this.noob; + } + + public String getHelpRequest() + { + return this.helpRequest; + } + + public Habbo getHelper() + { + return this.helper; + } + + public void setHelper(Habbo helper) + { + this.helper = helper; + } + + public void addMessage(GuideChatMessage message) + { + this.sendMessages.add(message); + } + + public GuideRecommendStatus getWouldRecommend() + { + return this.wouldRecommend; + } + + public void setWouldRecommend(GuideRecommendStatus wouldRecommend) + { + this.wouldRecommend = wouldRecommend; + + if(this.wouldRecommend == GuideRecommendStatus.YES) + { + AchievementManager.progressAchievement(this.getHelper(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideRecommendation")); + } + } + + public void addDeclinedHelper(int userId) + { + this.declinedHelpers.add(userId); + } + + public boolean hasDeclined(int userId) + { + return this.declinedHelpers.contains(userId); + } + + public void end() + { + this.ended = true; + this.endTime = Emulator.getIntUnixTimestamp(); + + AchievementManager.progressAchievement(this.helper, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideEnrollmentLifetime")); + AchievementManager.progressAchievement(this.helper, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideRequestHandler")); + AchievementManager.progressAchievement(this.noob, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GuideRequester")); + } + + public boolean isEnded() + { + return this.ended; + } + + public int getStartTime() + { + return this.startTime; + } + + public void setStartTime(int startTime) + { + this.startTime = startTime; + } + + public int getEndTime() + { + return this.endTime; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/Guild.java b/src/main/java/com/eu/habbo/habbohotel/guilds/Guild.java new file mode 100644 index 00000000..c4997f48 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/Guild.java @@ -0,0 +1,331 @@ +package com.eu.habbo.habbohotel.guilds; + +import com.eu.habbo.Emulator; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Guild implements Runnable +{ + private int id; + private int ownerId; + private String ownerName; + private String name; + private String description; + private int roomId; + private String roomName; + private GuildState state; + private int rights; + private int colorOne; + private int colorTwo; + private String badge; + private int dateCreated; + private int memberCount; + private int requestCount; + private boolean forum = false; + private SettingsState readForum = SettingsState.ADMINS; + private SettingsState postMessages = SettingsState.ADMINS; + private SettingsState postThreads = SettingsState.ADMINS; + private SettingsState modForum = SettingsState.ADMINS; + + public boolean needsUpdate; + public int lastRequested = Emulator.getIntUnixTimestamp(); + + public Guild(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.ownerId = set.getInt("user_id"); + this.ownerName = set.getString("username"); + this.name = set.getString("name"); + this.description = set.getString("description"); + this.state = GuildState.values()[set.getInt("state")]; + this.roomId = set.getInt("room_id"); + this.roomName = set.getString("room_name"); + this.rights = set.getString("rights").equalsIgnoreCase("1") ? 1 : 0; + this.colorOne = set.getInt("color_one"); + this.colorTwo = set.getInt("color_two"); + this.badge = set.getString("badge"); + this.dateCreated = set.getInt("date_created"); + this.forum = set.getString("forum").equalsIgnoreCase("1"); + this.readForum = SettingsState.valueOf(set.getString("read_forum")); + this.postMessages = SettingsState.valueOf(set.getString("post_messages")); + this.postThreads = SettingsState.valueOf(set.getString("post_threads")); + this.modForum = SettingsState.valueOf(set.getString("mod_forum")); + this.memberCount = 0; + this.requestCount = 0; + } + + public Guild(int ownerId, String ownerName, int roomId, String roomName, String name, String description, int colorOne, int colorTwo, String badge) + { + this.id = 0; + this.ownerId = ownerId; + this.ownerName = ownerName; + this.roomId = roomId; + this.roomName = roomName; + this.name = name; + this.description = description; + this.state = GuildState.OPEN; + this.rights = 0; + this.colorOne = colorOne; + this.colorTwo = colorTwo; + this.badge = badge; + this.memberCount = 0; + this.dateCreated = Emulator.getIntUnixTimestamp(); + } + + public void loadMemberCount() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as count FROM guilds_members WHERE level_id < 3 AND guild_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + this.memberCount = set.getInt(1); + } + } + } + + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as count FROM guilds_members WHERE level_id = 3 AND guild_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + this.requestCount = set.getInt(1); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + @Override + public void run() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds SET name = ?, description = ?, state = ?, rights = ?, color_one = ?, color_two = ?, badge = ?, read_forum = ?, post_messages = ?, post_threads = ?, mod_forum = ? WHERE id = ?")) + { + statement.setString(1, this.name); + statement.setString(2, this.description); + statement.setInt(3, this.state.state); + statement.setString(4, this.rights == 1 ? "1" : "0"); + statement.setInt(5, this.colorOne); + statement.setInt(6, this.colorTwo); + statement.setString(7, this.badge); + statement.setString(8, this.readForum.name()); + statement.setString(9, this.postMessages.name()); + statement.setString(10, this.postThreads.name()); + statement.setString(11, this.modForum.name()); + statement.setInt(12, this.id); + statement.execute(); + + this.needsUpdate = false; + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public int getId() + { + return this.id; + } + + public void setId(int id) + { + this.id = id; + } + + public String getOwnerName() + { + return this.ownerName; + } + + public String getName() + { + return this.name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getDescription() + { + return this.description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public int getRoomId() + { + return this.roomId; + } + + public String getRoomName() + { + return this.roomName; + } + + public void setRoomName(String roomName) + { + this.roomName = roomName; + } + + public GuildState getState() + { + return this.state; + } + + public void setState(GuildState state) + { + this.state = state; + } + + public int getRights() + { + return this.rights; + } + + public void setRights(int rights) + { + this.rights = rights; + } + + public int getColorOne() + { + return this.colorOne; + } + + public void setColorOne(int colorOne) + { + this.colorOne = colorOne; + } + + public int getColorTwo() + { + return this.colorTwo; + } + + public void setColorTwo(int colorTwo) + { + this.colorTwo = colorTwo; + } + + public String getBadge() + { + return this.badge; + } + + public void setBadge(String badge) + { + this.badge = badge; + } + + public int getOwnerId() + { + return this.ownerId; + } + + public int getDateCreated() + { + return dateCreated; + } + + public int getMemberCount() + { + return this.memberCount; + } + + public void increaseMemberCount() + { + this.memberCount++; + } + + public void decreaseMemberCount() + { + this.memberCount--; + } + + public int getRequestCount() + { + return this.requestCount; + } + + public void increaseRequestCount() + { + this.requestCount++; + } + + public void decreaseRequestCount() + { + this.requestCount--; + } + + public boolean hasForum() + { + return this.forum; + } + + public void setForum(boolean forum) + { + this.forum = forum; + } + + public SettingsState canReadForum() + { + return this.readForum; + } + + public void setReadForum(SettingsState readForum) + { + this.readForum = readForum; + } + + public SettingsState canPostMessages() + { + return this.postMessages; + } + + public void setPostMessages(SettingsState postMessages) + { + this.postMessages = postMessages; + } + + public SettingsState canPostThreads() + { + return this.postThreads; + } + + public void setPostThreads(SettingsState postThreads) + { + this.postThreads = postThreads; + } + + public SettingsState canModForum() + { + return this.modForum; + } + + public void setModForum(SettingsState modForum) + { + this.modForum = modForum; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java new file mode 100644 index 00000000..b52af23b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildManager.java @@ -0,0 +1,782 @@ +package com.eu.habbo.habbohotel.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.interactions.InteractionGuildFurni; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.guilds.GuildJoinErrorComposer; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.NoSuchElementException; + +public class GuildManager +{ + /** + * Guildparts. The things you use to create the badge. + */ + private final THashMap> guildParts; + + /** + * Cached guilds. + */ + private final TIntObjectMap guilds; + + public GuildManager() + { + long millis = System.currentTimeMillis(); + this.guildParts = new THashMap>(); + this.guilds = TCollections.synchronizedMap(new TIntObjectHashMap()); + + this.loadGuildParts(); + Emulator.getLogging().logStart("Guild Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + /** + * Loads the guild parts. + */ + public void loadGuildParts() + { + this.guildParts.clear(); + + for (GuildPartType t : GuildPartType.values()) + { + this.guildParts.put(t, new THashMap()); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + Statement statement = connection.createStatement(); + ResultSet set = statement.executeQuery("SELECT * FROM guilds_elements")) + { + while (set.next()) + { + this.guildParts.get(GuildPartType.valueOf(set.getString("type").toUpperCase())).put(set.getInt("id"), new GuildPart(set)); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Creates a new guild. + * @param habbo + * @param roomId + * @param name + * @param description + * @param badge + * @param colorOne + * @param colorTwo + * @return + */ + public Guild createGuild(Habbo habbo, int roomId, String roomName, String name, String description, String badge, int colorOne, int colorTwo) + { + Guild guild = new Guild(habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), roomId, roomName, name, description, colorOne, colorTwo, badge); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO guilds (name, description, room_id, user_id, color_one, color_two, badge, date_created) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setString(1, name); + statement.setString(2, description); + statement.setInt(3, roomId); + statement.setInt(4, guild.getOwnerId()); + statement.setInt(5, colorOne); + statement.setInt(6, colorTwo); + statement.setString(7, badge); + statement.setInt(8, Emulator.getIntUnixTimestamp()); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + guild.setId(set.getInt(1)); + } + } + } + + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO guilds_members (guild_id, user_id, level_id, member_since) VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, guild.getId()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.setInt(3, 0); + statement.setInt(4, Emulator.getIntUnixTimestamp()); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + guild.increaseMemberCount(); + //guild.addMember(new GuildMember(habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), habbo.getHabboInfo().getLook(), Emulator.getIntUnixTimestamp(), 2)); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + habbo.getHabboStats().addGuild(guild.getId()); + + return guild; + } + + /** + * Deletes a guild. + * @param guild The guild to delete. + */ + public void deleteGuild(Guild guild) + { + THashSet members = this.getGuildMembers(guild); + + for (GuildMember member : members) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(member.getUserId()); + + if (habbo != null) + { + habbo.getHabboStats().removeGuild(guild.getId()); + + if (habbo.getHabboStats().guild == guild.getId()) + { + habbo.getHabboStats().guild = 0; + } + } + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement deleteFavourite = connection.prepareStatement("UPDATE users_settings SET guild_id = ? WHERE guild_id = ?")) + { + deleteFavourite.setInt(1, 0); + deleteFavourite.setInt(2, guild.getId()); + deleteFavourite.execute(); + } + + + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM guilds_members WHERE guild_id = ?")) + { + statement.setInt(1, guild.getId()); + statement.execute(); + } + + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM guilds WHERE id = ?")) + { + statement.setInt(1, guild.getId()); + statement.execute(); + } + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()); + + if (room != null) + { + room.setGuild(0); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Removes inactive guilds from the cache. + */ + public void clearInactiveGuilds() + { + List toRemove = new ArrayList(); + TIntObjectIterator guilds = this.guilds.iterator(); + for (int i = this.guilds.size(); i-- > 0; ) + { + try + { + guilds.advance(); + } + catch (NoSuchElementException e) + { + break; + } + + if (guilds.value().lastRequested < Emulator.getIntUnixTimestamp() - 300) + { + toRemove.add(guilds.value().getId()); + } + } + + for (Integer i : toRemove) + { + this.guilds.remove(i); + } + } + + /** + * Join a guild. + * @param guild The guild to join. + * @param client The client that joins. + * @param userId The Habbo ID that joins. + * @param acceptRequest Accepted the request. + */ + public void joinGuild(Guild guild, GameClient client, int userId, boolean acceptRequest) + { + boolean error = false; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try(PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as total FROM guilds_members WHERE user_id = ?")) + { + if (userId == 0) + statement.setInt(1, client.getHabbo().getHabboInfo().getId()); + else + statement.setInt(1, userId); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + if (set.getInt(1) >= 100) + { + //TODO Add non acceptRequest errors. See Outgoing.GroupEditFailComposer + if (userId == 0) + client.sendResponse(new GuildJoinErrorComposer(GuildJoinErrorComposer.GROUP_LIMIT_EXCEED)); + else + client.sendResponse(new GuildJoinErrorComposer(GuildJoinErrorComposer.MEMBER_FAIL_JOIN_LIMIT_EXCEED_NON_HC)); + + error = true; + } + } + } + } + + if(!error) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as total FROM guilds_members WHERE guild_id = ? AND level_id < 3")) + { + statement.setInt(1, guild.getId()); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + if (set.getInt(1) >= 50000) + { + client.sendResponse(new GuildJoinErrorComposer(GuildJoinErrorComposer.GROUP_FULL)); + error = true; + } + } + } + } + + if (userId == 0 && !error) + { + if (guild.getState() == GuildState.LOCKED) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as total FROM guilds_members WHERE guild_id = ? AND level_id = 3")) + { + statement.setInt(1, guild.getId()); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + if (set.getInt(1) >= 100) + { + client.sendResponse(new GuildJoinErrorComposer(GuildJoinErrorComposer.GROUP_NOT_ACCEPT_REQUESTS)); + error = true; + } + } + } + } + + if(!error) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(id) as total FROM guilds_members WHERE guild_id = ? AND user_id = ? LIMIT 1")) + { + statement.setInt(1, guild.getId()); + statement.setInt(2, client.getHabbo().getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + if (set.getInt(1) >= 1) + { + error = true; + } + } + } + } + } + } + + if(!error) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO guilds_members (guild_id, user_id, member_since, level_id) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, guild.getId()); + statement.setInt(2, client.getHabbo().getHabboInfo().getId()); + statement.setInt(3, Emulator.getIntUnixTimestamp()); + statement.setInt(4, guild.getState() == GuildState.LOCKED ? GuildRank.REQUESTED.type : GuildRank.MEMBER.type); + statement.execute(); + } + } + } + else if(!error) + { + try (PreparedStatement statement = connection.prepareStatement("UPDATE guilds_members SET level_id = ?, member_since = ? WHERE user_id = ? AND guild_id = ?")) + { + statement.setInt(1, GuildRank.MEMBER.type); + statement.setInt(2, Emulator.getIntUnixTimestamp()); + statement.setInt(3, userId); + statement.setInt(4, guild.getId()); + statement.execute(); + } + } + + if(userId == 0 && !error) + { + if (guild.getState() == GuildState.LOCKED) + guild.increaseRequestCount(); + else + { + guild.increaseMemberCount(); + client.getHabbo().getHabboStats().addGuild(guild.getId()); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Makes the user admin of the guild. + * @param guild The guild that the user should become admin of. + * @param userId The userID that becomes admin. + */ + public void setAdmin(Guild guild, int userId) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds_members SET level_id = ? WHERE user_id = ? AND guild_id = ? LIMIT 1")) + { + statement.setInt(1, 1); + statement.setInt(2, userId); + statement.setInt(3, guild.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Demotes the admin back to user. + * @param guild The guild that the admin is demoted of. + * @param userId The user id. + */ + public void removeAdmin(Guild guild, int userId) + { + if(guild.getOwnerId() == userId) + return; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds_members SET level_id = ? WHERE user_id = ? AND guild_id = ? LIMIT 1")) + { + statement.setInt(1, 2); + statement.setInt(2, userId); + statement.setInt(3, guild.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Removes a member from the guild. + * @param guild The guild. + * @param userId The member + */ + public void removeMember(Guild guild, int userId) + { + if(guild.getOwnerId() == userId) + return; + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if(habbo != null && habbo.getHabboStats().guild == guild.getId()) + { + habbo.getHabboStats().removeGuild(guild.getId()); + habbo.getHabboStats().guild = 0; + habbo.getHabboStats().run(); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM guilds_members WHERE user_id = ? AND guild_id = ? LIMIT 1")) + { + statement.setInt(1, userId); + statement.setInt(2, guild.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Adds a guild to the cache. + * @param guild The guild to add. + */ + public void addGuild(Guild guild) + { + guild.lastRequested = Emulator.getIntUnixTimestamp(); + this.guilds.put(guild.getId(), guild); + } + + /** + * Gets the guild member for the given Habbo. + * @param guild The guild to look up. + * @param habbo The Habbo to look up. + * @return The GuildMember. + */ + public GuildMember getGuildMember(Guild guild, Habbo habbo) + { + return getGuildMember(guild.getId(), habbo.getHabboInfo().getId()); + } + + /** + * Gets the guild member for the given Habbo. + * @param guildId The guild to look up. + * @param habboId The Habbo to look up. + * @return The GuildMember. + */ + public GuildMember getGuildMember(int guildId, int habboId) + { + GuildMember member = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.look, guilds_members.* FROM guilds_members INNER JOIN users ON guilds_members.user_id = users.id WHERE guilds_members.guild_id = ? AND guilds_members.user_id = ? LIMIT 1")) + { + statement.setInt(1, guildId); + statement.setInt(2, habboId); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + member = new GuildMember(set); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return member; + } + + /** + * Gets the guild members for the guild. + * @param guildId The guild to lookup. + * @return The guild members. + */ + public THashSet getGuildMembers(int guildId) + { + return this.getGuildMembers(this.getGuild(guildId)); + } + + /** + * Gets the guild members for the guild. + * @param guild The guild to lookup. + * @return The guild members. + */ + THashSet getGuildMembers(Guild guild) + { + THashSet guildMembers = new THashSet(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.look, guilds_members.* FROM guilds_members INNER JOIN users ON guilds_members.user_id = users.id WHERE guilds_members.guild_id = ?")) + { + statement.setInt(1, guild.getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + guildMembers.add(new GuildMember(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return guildMembers; + } + + /** + * Gets the guild members for the guild. + * @param guild The guild to lookup. + * @param page The page to lookup. + * @param levelId The levelid (Admins, Users, Unaccepted) + * @param query The search query. + * @return The found members. + */ + public ArrayList getGuildMembers(Guild guild, int page, int levelId, String query) + { + ArrayList guildMembers = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.look, guilds_members.* FROM guilds_members INNER JOIN users ON guilds_members.user_id = users.id WHERE guilds_members.guild_id = ? " + (rankQuery(levelId)) + " AND users.username LIKE ? ORDER BY level_id, member_since ASC LIMIT ?, ?")) + { + statement.setInt(1, guild.getId()); + statement.setString(2, "%" + query + "%"); + statement.setInt(3, page * 14); + statement.setInt(4, (page * 14) + 14); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + guildMembers.add(new GuildMember(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return guildMembers; + } + + /** + * Gets all the admins for a guild. + * @param guild The guild to lookup. + * @return The GuildMembers that have admin permission for the guild. + */ + public THashMap getOnlyAdmins(Guild guild) + { + THashMap guildAdmins = new THashMap(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.look, guilds_members.* FROM guilds_members INNER JOIN users ON guilds_members.user_id = users.id WHERE guilds_members.guild_id = ? " + (rankQuery(1)))) + { + statement.setInt(1, guild.getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + guildAdmins.put(set.getInt("user_id"), new GuildMember(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return guildAdmins; + } + + private String rankQuery(int level) + { + switch(level) + { + case 2: return "AND guilds_members.level_id = 3"; + case 1: return "AND (guilds_members.level_id = 0 OR guilds_members.level_id = 1)"; + default: return "AND guilds_members.level_id >= 0 AND guilds_members.level_id <= 2"; + } + } + + /** + * @param guildId The guild id + * @return The guild. Caches if needed. + */ + public Guild getGuild(int guildId) + { + Guild g = this.guilds.get(guildId); + + if(g == null) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, rooms.name as room_name, guilds.* FROM guilds INNER JOIN users ON guilds.user_id = users.id INNER JOIN rooms ON rooms.id = guilds.room_id WHERE guilds.id = ? LIMIT 1")) + { + statement.setInt(1, guildId); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + g = new Guild(set); + } + } + if(g != null) + g.loadMemberCount(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + if(g != null) + { + g.lastRequested = Emulator.getIntUnixTimestamp(); + if(!this.guilds.containsKey(guildId)) + this.guilds.put(guildId, g); + } + + return g; + } + + public List getGuilds(int userId) + { + List guilds = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT guild_id FROM guilds_members WHERE user_id = ? AND level_id <= 2 ORDER BY member_since ASC")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Guild guild = getGuild(set.getInt("guild_id")); + + if (guild != null) + { + guilds.add(guild); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return guilds; + } + + public boolean symbolColor(int colorId) + { + for(GuildPart part : this.getSymbolColors()) + { + if(part.id == colorId) + return true; + } + + return false; + } + + public boolean backgroundColor(int colorId) + { + for(GuildPart part : this.getBackgroundColors()) + { + if(part.id == colorId) + return true; + } + return false; + } + + public THashMap> getGuildParts() + { + return this.guildParts; + } + + public Collection getBases() + { + return this.guildParts.get(GuildPartType.BASE).values(); + } + + public GuildPart getBase(int id) + { + return this.guildParts.get(GuildPartType.BASE).get(id); + } + + public Collection getSymbols() + { + return this.guildParts.get(GuildPartType.SYMBOL).values(); + } + + public GuildPart getSymbol(int id) + { + return this.guildParts.get(GuildPartType.SYMBOL).get(id); + } + + public Collection getBaseColors() + { + return this.guildParts.get(GuildPartType.BASE_COLOR).values(); + } + + public GuildPart getBaseColor(int id) + { + return this.guildParts.get(GuildPartType.BASE_COLOR).get(id); + } + + public Collection getSymbolColors() + { + return this.guildParts.get(GuildPartType.SYMBOL_COLOR).values(); + } + + public GuildPart getSymbolColor(int id) + { + return this.guildParts.get(GuildPartType.SYMBOL_COLOR).get(id); + } + + public Collection getBackgroundColors() + { + return this.guildParts.get(GuildPartType.BACKGROUND_COLOR).values(); + } + + public GuildPart getBackgroundColor(int id) + { + return this.guildParts.get(GuildPartType.BACKGROUND_COLOR).get(id); + } + + public GuildPart getPart(GuildPartType type, int id) + { + return this.guildParts.get(type).get(id); + } + + /** + * Sets the furniture guild. + * @param furni The furni to set. + * @param guildId The guild to set. + */ + public void setGuild(InteractionGuildFurni furni, int guildId) + { + furni.setGuildId(guildId); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE items SET guild_id = ? WHERE id = ?")) + { + statement.setInt(1, guildId); + statement.setInt(2, furni.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Disposes the GuildManager + */ + public void dispose() + { + TIntObjectIterator guildIterator = this.guilds.iterator(); + + for(int i = this.guilds.size(); i-- > 0;) + { + guildIterator.advance(); + if(guildIterator.value().needsUpdate) + guildIterator.value().run(); + + guildIterator.remove(); + } + Emulator.getLogging().logShutdownLine("Guild Manager -> Disposed!"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildMember.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildMember.java new file mode 100644 index 00000000..4b0d92c1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildMember.java @@ -0,0 +1,77 @@ +package com.eu.habbo.habbohotel.guilds; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GuildMember implements Comparable +{ + private int userId; + private String username; + private String look; + private int joinDate; + private GuildRank rank; + + public GuildMember(ResultSet set) throws SQLException + { + this.userId = set.getInt("user_id"); + this.username = set.getString("username"); + this.look = set.getString("look"); + this.joinDate = set.getInt("member_since"); + this.rank = GuildRank.getRank(set.getInt("level_id")); + } + + public GuildMember(int user_id, String username, String look, int joinDate, int guildRank) + { + this.userId = user_id; + this.username = username; + this.look = look; + this.joinDate = joinDate; + this.rank = GuildRank.values()[guildRank]; + } + + public int getUserId() + { + return userId; + } + + public String getUsername() + { + return username; + } + + public String getLook() + { + return look; + } + + public void setLook(String look) + { + this.look = look; + } + + public int getJoinDate() + { + return joinDate; + } + + public void setJoinDate(int joinDate) + { + this.joinDate = joinDate; + } + + public GuildRank getRank() + { + return rank; + } + + public void setRank(GuildRank rank) + { + this.rank = rank; + } + + @Override + public int compareTo(Object o) + { + return 0; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildPart.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildPart.java new file mode 100644 index 00000000..fe61f8fe --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildPart.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.guilds; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GuildPart +{ + /** + * Identifier. + */ + public final int id; + + /** + * Part A + */ + public final String valueA; + + /** + * Part B + */ + public final String valueB; + + public GuildPart(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.valueA = set.getString("firstvalue"); + this.valueB = set.getString("secondvalue"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildPartType.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildPartType.java new file mode 100644 index 00000000..fe466d0f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildPartType.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.guilds; + +public enum GuildPartType +{ + /** + * Badge base. + */ + BASE, + + /** + * Symbol + */ + SYMBOL, + + /** + * Colors + */ + BASE_COLOR, + SYMBOL_COLOR, + BACKGROUND_COLOR +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildRank.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildRank.java new file mode 100644 index 00000000..cf45a1e5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildRank.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.guilds; + +public enum GuildRank +{ + ADMIN(0), + MOD(1), + MEMBER(2), + REQUESTED(3), + DELETED(4); + + public final int type; + + GuildRank(int type) + { + this.type = type; + } + + public static GuildRank getRank(int type) + { + try + { + return values()[type]; + } + catch (Exception e) + { + return MEMBER; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/GuildState.java b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildState.java new file mode 100644 index 00000000..90e5c9ec --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/GuildState.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.guilds; + +public enum GuildState +{ + OPEN(0), + LOCKED(1), + CLOSED(2); + + public final int state; + + GuildState(int state) + { + this.state = state; + } + + public static GuildState valueOf(int state) + { + try + { + return values()[state]; + } + catch (Exception e) + { + return OPEN; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/SettingsState.java b/src/main/java/com/eu/habbo/habbohotel/guilds/SettingsState.java new file mode 100644 index 00000000..ebebf355 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/SettingsState.java @@ -0,0 +1,39 @@ +package com.eu.habbo.habbohotel.guilds; + +public enum SettingsState +{ + EVERYONE(0), + MEMBERS(1), + ADMINS(2), + OWNER(3); + + public final int state; + + SettingsState(int state) + { + this.state = state; + } + + public static SettingsState fromValue(int state) + { + try + { + switch (state) + { + case 0: + return EVERYONE; + case 1: + return MEMBERS; + case 2: + return ADMINS; + case 3: + return OWNER; + } + } + catch (Exception e) + { + } + + return EVERYONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForum.java b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForum.java new file mode 100644 index 00000000..517a1af4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForum.java @@ -0,0 +1,199 @@ +package com.eu.habbo.habbohotel.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.*; + +public class GuildForum implements ISerialize +{ + private final int guild; + private int totalThreads; + private GuildForumComment lastComment = null; + private final TIntObjectHashMap threads; + private int lastRequested = Emulator.getIntUnixTimestamp(); + + public GuildForum(int guild) + { + this.guild = guild; + + this.threads = new TIntObjectHashMap(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT author.username as author_name, author.look as look, COALESCE(admin.username, '') as admin_name, guilds_forums.id as thread_id, 0 as row_number, guilds_forums.* FROM guilds_forums " + + "INNER JOIN users AS author ON author.id = user_id " + + "LEFT JOIN users AS admin ON guilds_forums.admin_id = admin.id " + + "WHERE guild_id = ?")) + { + statement.setInt(1, this.guild); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.threads.put(set.getInt("id"), new GuildForumThread(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public GuildForumThread getThread(int threadId) + { + return threads.get(threadId); + } + + public GuildForumThread createThread(Habbo habbo, String subject, String message) + { + int timestamp = Emulator.getIntUnixTimestamp(); + GuildForumThread thread = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO guilds_forums (guild_id, user_id, subject, message, timestamp) VALUES (?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, this.guild); + statement.setInt(2, habbo.getClient().getHabbo().getHabboInfo().getId()); + statement.setString(3, subject); + statement.setString(4, message); + statement.setInt(5, timestamp); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + thread = new GuildForumThread(habbo, set.getInt(1), this.guild, subject, message, timestamp); + this.threads.put(set.getInt(1), //Thread id + thread); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return thread; + } + + //TODO: + /* + Verwijderen door guild admin -> state naar HIDDEN_BY_ADMIN + Guild admins moeten nog wel forum kunnen bekijken. + Verwijderen door staff -> state naar HIDDEN_BY_STAFF + Guild admins kunnen de thread niet zien. Staff wel. + + Thread wordt nooit uit de database verwijderd, alleen als de groep verwijderd wordt. + */ + public void hideThread(int threadId) + { + this.threads.get(threadId).setState(ThreadState.HIDDEN_BY_ADMIN); + } + + public int getGuild() + { + return this.guild; + } + + public int getLastRequestedTime() + { + return this.lastRequested; + } + + @Override + public void serialize(ServerMessage message) + { + + } + + public void serializeThreads(final ServerMessage message) + { + synchronized (this.threads) + { + message.appendInt(this.threads.size()); + + this.threads.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(GuildForumThread thread) + { + thread.serialize(message); + return true; + } + }); + } + } + + public int threadSize() + { + synchronized (this.threads) + { + return this.threads.size(); + } + } + + public void updateLastRequested() + { + this.lastRequested = Emulator.getIntUnixTimestamp(); + } + + public enum ThreadState + { + /* + public static const _SafeStr_11113:int = 0; + public static const _SafeStr_11114:int = 1; + public static const _SafeStr_11115:int = 10; + public static const _SafeStr_9691:int = 20; + */ + + OPEN(0), + CLOSED(1), + HIDDEN_BY_ADMIN(10), //DELETED + HIDDEN_BY_STAFF(20); + + public final int state; + + ThreadState(int state) + { + this.state = state; + } + + public static ThreadState fromValue(int state) + { + switch (state) + { + case 0: return OPEN; + case 1: return CLOSED; + case 10: return HIDDEN_BY_ADMIN; + case 20: return HIDDEN_BY_STAFF; + } + + return OPEN; + } + } + + public void serializeUserForum(ServerMessage response, Habbo habbo) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.guild); + response.appendInt(guild.getId()); //k._SafeStr_6864 = _arg_2._SafeStr_5878(); = guild_id + response.appendString(guild.getName()); //k._name = _arg_2.readString(); = name + response.appendString(guild.getDescription()); //k._SafeStr_5790 = _arg_2.readString(); = description + response.appendString(guild.getBadge()); //k._icon = _arg_2.readString(); = icon + response.appendInt(0); //k._SafeStr_11338 = _arg_2._SafeStr_5878(); (?) + response.appendInt(0); //k._SafeStr_19191 = _arg_2._SafeStr_5878(); = rating + response.appendInt(this.totalThreads); //k._SafeStr_11328 = _arg_2._SafeStr_5878(); = total_messages + response.appendInt(0); //k._SafeStr_19192 = _arg_2._SafeStr_5878(); = new_messages + + if (this.lastComment != null) + { + response.appendInt(this.lastComment.getThreadId()); //k._SafeStr_19193 = _arg_2._SafeStr_5878(); (?) + response.appendInt(this.lastComment.getUserId()); //k._SafeStr_19194 = _arg_2._SafeStr_5878(); = last_author_id + response.appendString(this.lastComment.getUserName()); //k._SafeStr_19195 = _arg_2.readString(); = last_author_name + response.appendInt(this.lastComment.getTimestamp()); //k._SafeStr_19196 = _arg_2._SafeStr_5878(); = update_time + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumComment.java b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumComment.java new file mode 100644 index 00000000..30b2a86c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumComment.java @@ -0,0 +1,183 @@ +package com.eu.habbo.habbohotel.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GuildForumComment implements ISerialize, Runnable +{ + private int id; + private final int guildId; + private final int threadId; + private int index = -1; + private final int userId; + private final String userName; + private final String look; + private final int timestamp; + private final String message; + private GuildForum.ThreadState state = GuildForum.ThreadState.OPEN; + private int adminId; + private String adminName; + private int authorPostCount; + + public GuildForumComment(int guildId, int threadId, int userId, String userName, String look, String message) + { + this.guildId = guildId; + this.threadId = threadId; + this.userId = userId; + this.userName = userName; + this.look = look; + this.timestamp = Emulator.getIntUnixTimestamp(); + this.message = message; + this.adminName = ""; + } + + public GuildForumComment(final ResultSet set, final int index) throws SQLException + { + this.id = set.getInt("id"); + this.guildId = set.getInt("guild_id"); + this.threadId = set.getInt("thread_id"); + this.index = index; + this.userId = set.getInt("user_id"); + this.userName = set.getString("author_name"); + this.look = set.getString("look"); + this.timestamp = set.getInt("timestamp"); + this.message = set.getString("message"); + this.state = GuildForum.ThreadState.valueOf(set.getString("state")); + this.adminId = set.getInt("admin_id"); + this.adminName = set.getString("admin_name"); + } + + public void setAuthorPostCount(int authorPostCount) + { + this.authorPostCount = authorPostCount; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.id); //_local_2.messageId = k._SafeStr_5878(); = message_id + message.appendInt(this.index); //_local_2.messageIndex = k._SafeStr_5878(); = message_index + message.appendInt(this.userId); //_local_2._SafeStr_11317 = k._SafeStr_5878(); = author_id + message.appendString(this.userName); //_local_2._SafeStr_6798 = k.readString(); = author_name + message.appendString(this.look); //_local_2._SafeStr_11319 = k.readString(); = author_look + message.appendInt(Emulator.getIntUnixTimestamp() - this.timestamp); //_local_2._SafeStr_11164 = k._SafeStr_5878(); = creation_time + message.appendString(this.message); //_local_2._SafeStr_9526 = k.readString(); = message + message.appendByte(this.state.state); //_local_2.state = k.readByte(); = state + message.appendInt(this.adminId); //_local_2._SafeStr_19188 = k._SafeStr_5878(); = admin_id + message.appendString(this.adminName); //_local_2._SafeStr_11326 = k.readString(); = admin_name + message.appendInt(0); //_local_2._SafeStr_19189 = k._SafeStr_5878(); = (UNUSED) + message.appendInt(this.authorPostCount); //_local_2._SafeStr_11320 = k._SafeStr_5878(); = author_post_count + } + + public int getId() + { + return this.id; + } + + public void setId(int id) + { + this.id = id; + } + + public int getThreadId() + { + return this.threadId; + } + + public int getIndex() + { + return this.index; + } + + public void setIndex(int index) + { + this.index = index; + } + + public int getUserId() + { + return this.userId; + } + + public String getUserName() + { + return this.userName; + } + + public String getLook() + { + return this.look; + } + + public int getTimestamp() + { + return this.timestamp; + } + + public String getMessage() + { + return this.message; + } + + public GuildForum.ThreadState getState() + { + return this.state; + } + + public void setState(GuildForum.ThreadState state) + { + this.state = state; + } + + public int getAdminId() + { + return this.adminId; + } + + public void setAdminId(int adminId) + { + this.adminId = adminId; + } + + public String getAdminName() + { + return this.adminName; + } + + public void setAdminName(String adminName) + { + this.adminName = adminName; + } + + public int getAuthorPostCount() + { + return this.authorPostCount; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds_forums_comments SET state = ?, admin_id = ? WHERE id = ?")) + { + statement.setString(1, this.state.name()); + statement.setInt(2, this.adminId); + statement.setInt(3, this.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public int getGuildId() + { + return this.guildId; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumManager.java b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumManager.java new file mode 100644 index 00000000..f439075c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumManager.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +public class GuildForumManager +{ + private final TIntObjectMap guildForums; + + public GuildForumManager() + { + this.guildForums = TCollections.synchronizedMap(new TIntObjectHashMap()); + } + + public GuildForum getGuildForum(int guildId) + { + synchronized (this.guildForums) + { + GuildForum forum = this.guildForums.get(guildId); + + if (forum == null) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if (guild != null && guild.hasForum()) + { + forum = new GuildForum(guild.getId()); + this.guildForums.put(guild.getId(), forum); + } + } + + forum.updateLastRequested(); + return forum; + } + } + + public void clearInactiveForums() + { + int time = Emulator.getIntUnixTimestamp(); + + TIntObjectIterator guildForums = this.guildForums.iterator(); + for(int i = this.guildForums.size(); i-- > 0;) + { + try + { + guildForums.advance(); + } + catch (NoSuchElementException e) + { + break; + } + + if (time - guildForums.value().getLastRequestedTime() > 300) + { + this.guildForums.remove(guildForums.key()); + } + } + } + + public List getGuildForums(Habbo habbo) + { + List forums = new ArrayList<>(); + for (Integer i : habbo.getHabboStats().guilds) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(i); + + if (guild != null && guild.hasForum()) + { + forums.add(this.getGuildForum(i)); + } + } + + return forums; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumState.java b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumState.java new file mode 100644 index 00000000..3f5cc5e4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumState.java @@ -0,0 +1,33 @@ +package com.eu.habbo.habbohotel.guilds.forums; + +public enum GuildForumState +{ + OPEN(0), + CLOSED(1), + HIDDEN_BY_ADMIN(10), + HIDDEN_BY_STAFF(20); + + private int state; + public int getState() + { + return this.state; + } + + GuildForumState(int state) + { + this.state = state; + } + + public static GuildForumState fromValue(int value) + { + for (GuildForumState state : GuildForumState.values()) + { + if (state.state == value) + { + return state; + } + } + + return CLOSED; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumThread.java b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumThread.java new file mode 100644 index 00000000..c244c8a8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/guilds/forums/GuildForumThread.java @@ -0,0 +1,313 @@ +package com.eu.habbo.habbohotel.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class GuildForumThread implements ISerialize, Runnable +{ + private final int threadId; + private final int guildId; + private final int authorId; + private final String authorName; + private final String subject; + private final String message; + private GuildForum.ThreadState state; + private final int timestamp; + private boolean pinned = false; + private boolean locked = false; + + private int lastAuthorId = 0; + private String lastAuthorName; + private int lastCommentTimestamp = 0; + private int adminId; + private String adminName = ""; + + //public final TIntObjectHashMap comments; + public final List comments; + + public GuildForumThread(Habbo habbo, int threadId, int guildId, String subject, String message, int timestamp) + { + this.threadId = threadId; + this.guildId = guildId; + this.authorId = habbo.getHabboInfo().getId(); + this.authorName = habbo.getHabboInfo().getUsername(); + this.subject = subject; + this.message = message; + this.state = GuildForum.ThreadState.OPEN; + this.timestamp = timestamp; + this.lastAuthorId = this.authorId; + this.lastAuthorName = this.authorName; + this.lastCommentTimestamp = this.timestamp; + + //this.comments = new TIntObjectHashMap(); + this.comments = new ArrayList(); + } + + //Via de database inladen; + public GuildForumThread(ResultSet set) throws SQLException + { + this.threadId = set.getInt("id"); + this.guildId = set.getInt("guild_id"); + this.authorId = set.getInt("user_id"); + this.authorName = set.getString("author_name"); + this.subject = set.getString("subject"); + this.message = set.getString("message"); + this.state = GuildForum.ThreadState.valueOf(set.getString("state")); + this.timestamp = set.getInt("timestamp"); + this.pinned = set.getString("pinned").equals("1"); + this.locked = set.getString("locked").equals("1"); + this.adminId = set.getInt("admin_id"); + this.adminName = set.getString("admin_name"); + + + this.lastAuthorId = this.authorId; + this.lastAuthorName = this.authorName; + this.lastCommentTimestamp = this.timestamp; + + this.comments = new ArrayList(); + this.addComment(new GuildForumComment(set, 0)); + + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT " + + "author.username AS author_name, " + + "COALESCE(admin.username, '') as admin_name, " + + "author.look, " + + "guilds_forums_comments.*" + + "FROM guilds_forums_comments " + + "INNER JOIN users AS author ON guilds_forums_comments.user_id = author.id " + + "LEFT JOIN users AS admin ON guilds_forums_comments.admin_id = admin.id " + + "WHERE thread_id = ? " + + "ORDER BY id ASC")) + { + statement.setInt(1, this.threadId); + try (ResultSet commentSet = statement.executeQuery()) + { + int index = 1; + while (commentSet.next()) + { + if (!commentSet.isLast()) + { + this.comments.add(new GuildForumComment(commentSet, index)); + } + else + { + this.addComment(new GuildForumComment(commentSet, index)); + } + + ++index; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void addComment(GuildForumComment comment) + { + synchronized (this.comments) + { + if (comment.getIndex() == -1) + { + if (!this.comments.isEmpty()) + { + GuildForumComment previousComment = this.comments.get(this.comments.size() - 1); + + if (previousComment != null) + { + comment.setIndex(previousComment.getIndex() + 1); + } + } + } + + this.comments.add(comment); + } + + this.lastAuthorId = comment.getUserId(); + this.lastAuthorName = comment.getUserName(); + this.lastCommentTimestamp = comment.getTimestamp(); + } + + public GuildForumComment addComment(Habbo habbo, String message) + { + int commentId = -1; + + GuildForumComment comment = new GuildForumComment(this.guildId, this.threadId, habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), habbo.getHabboInfo().getLook(), message); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO guilds_forums_comments (thread_id, user_id, timestamp, message) VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, this.threadId); + statement.setInt(2, habbo.getHabboInfo().getId()); + int nowTimestamp = Emulator.getIntUnixTimestamp(); + statement.setInt(3, nowTimestamp); + statement.setString(4, message); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + commentId = set.getInt(1); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if (commentId >= 0) + { + comment.setId(commentId); + addComment(comment); + + return comment; + } + + return null; + } + + public GuildForumComment getComment(int id) + { + synchronized (this.comments) + { + return this.comments.get(id); + } + } + + public List getComments(int page, int limit) + { + synchronized (this.comments) + { + return this.comments.subList(page, (page + limit) > this.comments.size() ? this.comments.size() : (page + limit)); + } + } + + public int getId() + { + return this.threadId; + } + + public int getGuildId() + { + return this.guildId; + } + + public int getCommentsSize() + { + return this.comments.size(); + } + + public String getSubject() + { + return this.subject; + } + + public int getThreadId() + { + return this.threadId; + } + + public int getAuthorId() + { + return this.authorId; + } + + public String getAuthorName() + { + return this.authorName; + } + + public String getMessage() + { + return this.message; + } + + public GuildForum.ThreadState getState() + { + return this.state; + } + + public void setState(GuildForum.ThreadState state) + { + this.state = state; + } + + public void setAdminId(int adminId) + { + this.adminId = adminId; + } + + public void setAdminName(String adminName) + { + this.adminName = adminName; + } + + public void serializeComments(final ServerMessage message, int index, int limit) + { + List comments; + + synchronized (this.comments) + { + comments = this.getComments(index, limit); + } + + if (comments != null) + { + message.appendInt(comments.size()); + for (GuildForumComment comment : comments) + { + comment.serialize(message); + } + } + } + + @Override + public void serialize(ServerMessage message) + { + int nowTimestamp = Emulator.getIntUnixTimestamp(); + message.appendInt(this.threadId); //_local_2.threadId = k._SafeStr_5878(); + message.appendInt(this.authorId); //_local_2._SafeStr_11333 = k._SafeStr_5878(); = thread_author_id + message.appendString(this.authorName); //_local_2._SafeStr_11334 = k.readString(); = thread_author_name + message.appendString(this.subject); //_local_2.header = k.readString(); = look + message.appendBoolean(this.pinned); //_local_2._SafeStr_11331 = k.readBoolean(); = pinned + message.appendBoolean(this.locked); //_local_2._SafeStr_5801 = k.readBoolean(); = locked + message.appendInt(nowTimestamp - this.timestamp); //_local_2._SafeStr_11164 = k._SafeStr_5878(); = creation_time + message.appendInt(this.getCommentsSize()); //_local_2._SafeStr_11239 = k._SafeStr_5878(); = total_messages + message.appendInt(0); //_local_2._SafeStr_11260 = k._SafeStr_5878(); = unread_messages(?) + message.appendInt(1); //_local_2._SafeStr_11242 = k._SafeStr_5878(); = Something message count related. + message.appendInt(this.lastAuthorId); //_local_2._SafeStr_11188 = k._SafeStr_5878(); = last_author_id + message.appendString(this.lastAuthorName); //_local_2._SafeStr_11189 = k.readString(); = last_author_name + message.appendInt(nowTimestamp - this.lastCommentTimestamp); //_local_2._SafeStr_11190 = k._SafeStr_5878(); = update_time, seconds ago + message.appendByte(this.state.state); //_local_2.state = k.readByte(); = state + message.appendInt(this.adminId); //_local_2._SafeStr_19188 = k._SafeStr_5878(); = admin id + message.appendString(this.adminName); //_local_2._SafeStr_11326 = k.readString(); = admin_name + message.appendInt(this.threadId); //_local_2._SafeStr_19214 = k._SafeStr_5878(); //UNUSED? + } + + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE guilds_forums SET message = ?, state = ?, pinned = ?, locked = ?, admin_id = ? WHERE id = ?")) + { + statement.setString(1, this.message); + statement.setString(2, this.state.name()); + statement.setString(3, this.pinned ? "1" : "0"); + statement.setString(4, this.locked ? "1" : "0"); + statement.setInt(5, this.adminId); + statement.setInt(6, this.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/helper/TalentTrackTalentState.java b/src/main/java/com/eu/habbo/habbohotel/helper/TalentTrackTalentState.java new file mode 100644 index 00000000..c20ea4a2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/helper/TalentTrackTalentState.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.helper; + +public enum TalentTrackTalentState +{ + CLOSED(0), + PROGRESS(1), + FINISHED(2); + + private final int state; + + TalentTrackTalentState(int state) + { + this.state = state; + } + + public int getState() + { + return this.state; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFame.java b/src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFame.java new file mode 100644 index 00000000..ad07dfca --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFame.java @@ -0,0 +1,65 @@ +package com.eu.habbo.habbohotel.hotelview; + +import com.eu.habbo.Emulator; +import gnu.trove.map.hash.THashMap; + +import java.sql.*; + +public class HallOfFame +{ + /** + * Hall of Fame winners are in here. + */ + private final THashMap winners = new THashMap(); + + /** + * The name of the competition. + */ + private static String competitionName; + + public HallOfFame() + { + setCompetitionName("xmasRoomComp"); + + reload(); + } + + /** + * Reloads the HoF + */ + public void reload() + { + this.winners.clear(); + + synchronized (this.winners) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery(Emulator.getConfig().getValue("hotelview.halloffame.query"))) + { + while (set.next()) + { + HallOfFameWinner winner = new HallOfFameWinner(set); + this.winners.put(winner.getId(), winner); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public THashMap getWinners() + { + return this.winners; + } + + public String getCompetitionName() + { + return this.competitionName; + } + + void setCompetitionName(String name) + { + this.competitionName = name; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFameWinner.java b/src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFameWinner.java new file mode 100644 index 00000000..ef1c2a4c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/hotelview/HallOfFameWinner.java @@ -0,0 +1,73 @@ +package com.eu.habbo.habbohotel.hotelview; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class HallOfFameWinner implements Comparable +{ + /** + * Habbo ID + */ + private int id; + + /** + * Name + */ + private String username; + + /** + * Look + */ + private String look; + + /** + * Score + */ + private int points; + + public HallOfFameWinner(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.username = set.getString("username"); + this.look = set.getString("look"); + this.points = set.getInt("hof_points"); + } + + /** + * Habbo ID + */ + public int getId() + { + return this.id; + } + + /** + * Name + */ + public String getUsername() + { + return this.username; + } + + /** + * Look + */ + public String getLook() + { + return this.look; + } + + /** + * Score + */ + public int getPoints() + { + return this.points; + } + + @Override + public int compareTo(HallOfFameWinner o) + { + return o.getPoints() - this.points; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/hotelview/HotelViewManager.java b/src/main/java/com/eu/habbo/habbohotel/hotelview/HotelViewManager.java new file mode 100644 index 00000000..e85437d5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/hotelview/HotelViewManager.java @@ -0,0 +1,33 @@ +package com.eu.habbo.habbohotel.hotelview; + +import com.eu.habbo.Emulator; + +public class HotelViewManager +{ + private final HallOfFame hallOfFame; + private final NewsList newsList; + + public HotelViewManager() + { + long millis = System.currentTimeMillis(); + this.hallOfFame = new HallOfFame(); + this.newsList = new NewsList(); + + Emulator.getLogging().logStart("Hotelview Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public HallOfFame getHallOfFame() + { + return hallOfFame; + } + + public NewsList getNewsList() + { + return newsList; + } + + public void dispose() + { + Emulator.getLogging().logShutdownLine("HotelView Manager -> Disposed!"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/hotelview/NewsList.java b/src/main/java/com/eu/habbo/habbohotel/hotelview/NewsList.java new file mode 100644 index 00000000..8d41f19f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/hotelview/NewsList.java @@ -0,0 +1,48 @@ +package com.eu.habbo.habbohotel.hotelview; + +import com.eu.habbo.Emulator; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; + +public class NewsList +{ + private final THashSet newsWidgets; + + public NewsList() + { + this.newsWidgets = new THashSet(); + this.reload(); + } + + /** + * Reloads the news. + */ + public void reload() + { + synchronized (this.newsWidgets) + { + this.newsWidgets.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM hotelview_news ORDER BY id DESC LIMIT 10")) + { + while (set.next()) + { + this.newsWidgets.add(new NewsWidget(set)); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + /** + * The newsitems displayed on the HotelView + * @return + */ + public THashSet getNewsWidgets() + { + return newsWidgets; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/hotelview/NewsWidget.java b/src/main/java/com/eu/habbo/habbohotel/hotelview/NewsWidget.java new file mode 100644 index 00000000..e27c049a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/hotelview/NewsWidget.java @@ -0,0 +1,109 @@ +package com.eu.habbo.habbohotel.hotelview; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class NewsWidget +{ + /** + * News ID + */ + private int id; + + /** + * Title + */ + private String title; + + /** + * Message + */ + private String message; + + /** + * Text on the button + */ + private String buttonMessage; + + /** + * Type + */ + private int type; + + /** + * Link + */ + private String link; + + /** + * Image + */ + private String image; + + public NewsWidget(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.title = set.getString("title"); + this.message = set.getString("text"); + this.buttonMessage = set.getString("button_text"); + this.type = set.getString("button_type").equals("client") ? 1 : 0; + this.link = set.getString("button_link"); + this.image = set.getString("image"); + } + + /** + * News ID + */ + public int getId() + { + return this.id; + } + + /** + * Title + */ + public String getTitle() + { + return this.title; + } + + /** + * Message + */ + public String getMessage() + { + return this.message; + } + + /** + * Text on the button + */ + public String getButtonMessage() + { + return this.buttonMessage; + } + + /** + * Type + */ + public int getType() + { + return this.type; + } + + /** + * Link + */ + public String getLink() + { + return this.link; + } + + /** + * Image + */ + public String getImage() + { + return this.image; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/CrackableReward.java b/src/main/java/com/eu/habbo/habbohotel/items/CrackableReward.java new file mode 100644 index 00000000..de6944a8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/CrackableReward.java @@ -0,0 +1,74 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.Emulator; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.Map; + +public class CrackableReward +{ + public final int itemId; + public final int count; + public final Map> prizes; + public int totalChance; + public final String achievementTick; + public final String achievementCracked; + + public CrackableReward(ResultSet set) throws SQLException + { + this.itemId = set.getInt("item_id"); + this.count = set.getInt("count"); + this.achievementTick = set.getString("achievement_tick"); + this.achievementCracked = set.getString("achievement_cracked"); + + String[] data = set.getString("prizes").split(";"); + this.prizes = new HashMap>(); + + this.totalChance = 0; + for(int i = 0; i < data.length; i++) + { + try + { + int itemId = 0; + int chance = 100; + + if (data[i].contains(":") && data[i].split(":").length == 2) + { + itemId = Integer.valueOf(data[i].split(":")[0]); + chance = Integer.valueOf(data[i].split(":")[1]); + } + else + { + itemId = Integer.valueOf(data[i].replace(":", "")); + } + + this.prizes.put(itemId, new AbstractMap.SimpleEntry(this.totalChance, this.totalChance + chance)); + this.totalChance += chance; + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + + public int getRandomReward() + { + int random = Emulator.getRandom().nextInt(this.totalChance); + + int notFound = 0; + for (Map.Entry> set : this.prizes.entrySet()) + { + notFound = set.getKey(); + if (random >= set.getValue().getKey() && random < set.getValue().getValue()) + { + return set.getKey(); + } + } + + return notFound; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/FurnitureType.java b/src/main/java/com/eu/habbo/habbohotel/items/FurnitureType.java new file mode 100644 index 00000000..b7c938a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/FurnitureType.java @@ -0,0 +1,43 @@ +package com.eu.habbo.habbohotel.items; + +public enum FurnitureType +{ + FLOOR("S"), + WALL("I"), + EFFECT("E"), + BADGE("B"), + ROBOT("R"), + HABBO_CLUB("H"), + PET("P"); + + public final String code; + + FurnitureType(String code) + { + this.code = code; + } + + public static FurnitureType fromString(String code) + { + switch (code.toUpperCase()) + { + case "S": + return FLOOR; + case "I": + return WALL; + case "E": + return EFFECT; + case "B": + return BADGE; + case "R": + return ROBOT; + case "H": + return HABBO_CLUB; + case "P": + return PET; + default: + return FLOOR; + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/ICycleable.java b/src/main/java/com/eu/habbo/habbohotel/items/ICycleable.java new file mode 100644 index 00000000..5f30ccbe --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/ICycleable.java @@ -0,0 +1,8 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.habbohotel.rooms.Room; + +public interface ICycleable +{ + public void cycle(Room room); +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/IEventTriggers.java b/src/main/java/com/eu/habbo/habbohotel/items/IEventTriggers.java new file mode 100644 index 00000000..3160eae7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/IEventTriggers.java @@ -0,0 +1,14 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +public interface IEventTriggers +{ + public void onClick(GameClient client, Room room, Object[] objects) throws Exception; + + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception; + + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception; +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/Item.java b/src/main/java/com/eu/habbo/habbohotel/items/Item.java new file mode 100644 index 00000000..3ce99f58 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/Item.java @@ -0,0 +1,233 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionMultiHeight; +import com.eu.habbo.habbohotel.items.interactions.InteractionVendingMachine; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.list.array.TIntArrayList; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Item { + + private int id; + private int spriteId; + private String name; + private String fullName; + private FurnitureType type; + private short width; + private short length; + private double height; + private boolean allowStack; + private boolean allowWalk; + private boolean allowSit; + private boolean allowLay; + private boolean allowRecyle; + private boolean allowTrade; + private boolean allowMarketplace; + private boolean allowGift; + private boolean allowInventoryStack; + private short stateCount; + private short effectM; + private short effectF; + private TIntArrayList vendingItems; + private double[] multiHeights; + + private ItemInteraction interactionType; + + public Item(ResultSet set) throws SQLException + { + this.load(set); + } + + public void update(ResultSet set) throws SQLException + { + this.load(set); + } + + private void load(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.spriteId = set.getInt("sprite_id"); + this.name = set.getString("item_name"); + this.fullName = set.getString("public_name"); + this.type = FurnitureType.fromString(set.getString("type")); + this.width = set.getShort("width"); + this.length = set.getShort("length"); + this.height = set.getDouble("stack_height"); + this.allowStack = set.getBoolean("allow_stack"); + this.allowWalk = set.getBoolean("allow_walk"); + this.allowSit = set.getBoolean("allow_sit"); + this.allowLay = set.getBoolean("allow_lay"); + this.allowRecyle = set.getBoolean("allow_recycle"); + this.allowTrade = set.getBoolean("allow_trade"); + this.allowMarketplace = set.getBoolean("allow_marketplace_sell"); + this.allowGift = set.getBoolean("allow_gift"); + this.allowInventoryStack = set.getBoolean("allow_inventory_stack"); + + this.interactionType = Emulator.getGameEnvironment().getItemManager().getItemInteraction(set.getString("interaction_type").toLowerCase()); + + this.stateCount = set.getShort("interaction_modes_count"); + this.effectM = set.getShort("effect_id_male"); + this.effectF = set.getShort("effect_id_female"); + + if(!set.getString("vending_ids").isEmpty()) + { + this.vendingItems = new TIntArrayList(); + String[] vendingIds = set.getString("vending_ids").replace(";", ",").split(","); + for (String s : vendingIds) + { + this.vendingItems.add(Integer.valueOf(s.replace(" ", ""))); + } + } + + if(this.interactionType.getType() == InteractionMultiHeight.class) + { + if(set.getString("multiheight").contains(";")) + { + String[] s = set.getString("multiheight").split(";"); + this.multiHeights = new double[s.length]; + + for(int i = 0; i < s.length; i++) + { + this.multiHeights[i] = Double.parseDouble(s[i]); + } + } + else + { + this.multiHeights = new double[0]; + } + } + } + + public int getId() { + return this.id; + } + + public int getSpriteId() { + return this.spriteId; + } + + public String getName() { + return this.name; + } + + public String getFullName() + { + return this.fullName; + } + + public FurnitureType getType() + { + return this.type; + } + + public int getWidth() { + return this.width; + } + + public int getLength() { + return this.length; + } + + public double getHeight() { + return this.height; + } + + public boolean allowStack() { + return this.allowStack; + } + + public boolean allowWalk() { + return this.allowWalk; + } + + public boolean allowSit() { + return this.allowSit; + } + + public boolean allowLay() { + return this.allowLay; + } + + public boolean allowRecyle() { + return this.allowRecyle; + } + + public boolean allowTrade() { + return this.allowTrade; + } + + public boolean allowMarketplace() { + return this.allowMarketplace; + } + + public boolean allowGift() { + return this.allowGift; + } + + public boolean allowInventoryStack() { + return this.allowInventoryStack; + } + + public int getStateCount() { + return this.stateCount; + } + + public int getEffectM() { + return this.effectM; + } + + public int getEffectF() { + return this.effectF; + } + + public ItemInteraction getInteractionType() + { + return this.interactionType; + } + + public TIntArrayList getVendingItems() + { + return this.vendingItems; + } + + public int getRandomVendingItem() + { + return this.vendingItems.get(Emulator.getRandom().nextInt(this.vendingItems.size())); + } + + public double[] getMultiHeights() + { + return this.multiHeights; + } + + public static boolean isPet(Item item) + { + return item.getName().toLowerCase().startsWith("a0 pet"); + } + + public static double getCurrentHeight(HabboItem item) + { + if(item instanceof InteractionMultiHeight && item.getBaseItem().getMultiHeights().length > 0) + { + if (item.getExtradata().isEmpty()) + { + item.setExtradata("0"); + } + + try + { + int index = Integer.valueOf(item.getExtradata()) % (item.getBaseItem().getMultiHeights().length); + return item.getBaseItem().getMultiHeights()[(item.getExtradata().isEmpty() ? 0 : index)]; + } + catch (Exception e) + { + + } + } + + return item.getBaseItem().getHeight(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/ItemInteraction.java b/src/main/java/com/eu/habbo/habbohotel/items/ItemInteraction.java new file mode 100644 index 00000000..c1f3d06d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/ItemInteraction.java @@ -0,0 +1,40 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.habbohotel.users.HabboItem; + +public class ItemInteraction +{ + private final String name; + private final Class type; + + /** + * Creates an new ItemInteraction that will be used to load custom ItemInteractions. + * Note that the name (item_interaction_type) must be unique. Failing to do so will result + * into an launch failure at startup. + * @param name The name of this item interaction. Do not use capitals or spaces. + * @param type The interaction class that is linked and will be instantiated for new items. + */ + public ItemInteraction(String name, Class type) + { + this.name = name; + this.type = type; + } + + /** + * @return The class that is lined to this interaction. + */ + public Class getType() + { + return this.type; + } + + /** + * Should only be used upon startup and never get called outside of the emulator. + * Use getType() in order to identify the correct interactions! + * @return The interaction name as defined in the database. + */ + public String getName() + { + return this.name; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java new file mode 100644 index 00000000..a7ce7020 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java @@ -0,0 +1,947 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.*; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates.*; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards.*; +import com.eu.habbo.habbohotel.items.interactions.games.football.InteractionFootball; +import com.eu.habbo.habbohotel.items.interactions.games.football.InteractionFootballGate; +import com.eu.habbo.habbohotel.items.interactions.games.football.goals.InteractionFootballGoalBlue; +import com.eu.habbo.habbohotel.items.interactions.games.football.goals.InteractionFootballGoalGreen; +import com.eu.habbo.habbohotel.items.interactions.games.football.goals.InteractionFootballGoalRed; +import com.eu.habbo.habbohotel.items.interactions.games.football.goals.InteractionFootballGoalYellow; +import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.InteractionFootballScoreboardBlue; +import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.InteractionFootballScoreboardGreen; +import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.InteractionFootballScoreboardRed; +import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.InteractionFootballScoreboardYellow; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.*; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.gates.*; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards.*; +import com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun.InteractionBunnyrunField; +import com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun.InteractionBunnyrunPole; +import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagField; +import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagPole; +import com.eu.habbo.habbohotel.items.interactions.games.tag.rollerskate.InteractionRollerskateField; +import com.eu.habbo.habbohotel.items.interactions.wired.conditions.*; +import com.eu.habbo.habbohotel.items.interactions.wired.effects.*; +import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredExtraRandom; +import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredExtraUnseen; +import com.eu.habbo.habbohotel.items.interactions.wired.triggers.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.plugin.events.emulator.EmulatorLoadItemsManagerEvent; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.set.hash.THashSet; + +import java.lang.reflect.Constructor; +import java.sql.*; +import java.util.*; + +public class ItemManager +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean RECYCLER_ENABLED = true; + + private final TIntObjectMap items; + private final TIntObjectHashMap crackableRewards; + private final THashSet interactionsList; + private final THashMap soundTracks; + private final YoutubeManager youtubeManager; + private final TreeMap newuserGifts; + + public ItemManager() + { + this.items = TCollections.synchronizedMap(new TIntObjectHashMap<>()); + this.crackableRewards = new TIntObjectHashMap<>(); + this.interactionsList = new THashSet<>(); + this.soundTracks = new THashMap<>(); + this.youtubeManager = new YoutubeManager(); + this.newuserGifts = new TreeMap<>(); + } + + public void load() + { + Emulator.getPluginManager().fireEvent(new EmulatorLoadItemsManagerEvent()); + + long millis = System.currentTimeMillis(); + + this.loadItemInteractions(); + this.loadItems(); + this.loadCrackable(); + this.loadSoundTracks(); + this.youtubeManager.load(); + this.loadNewUserGifts(); + + Emulator.getLogging().logStart("Item Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + protected void loadItemInteractions() + { + this.interactionsList.add(new ItemInteraction("default", InteractionDefault.class)); + this.interactionsList.add(new ItemInteraction("gate", InteractionGate.class)); + this.interactionsList.add(new ItemInteraction("guild_furni", InteractionGuildFurni.class)); + this.interactionsList.add(new ItemInteraction("guild_gate", InteractionGuildGate.class)); + this.interactionsList.add(new ItemInteraction("background_toner", InteractionBackgroundToner.class)); + this.interactionsList.add(new ItemInteraction("badge_display", InteractionBadgeDisplay.class)); + this.interactionsList.add(new ItemInteraction("mannequin", InteractionMannequin.class)); + this.interactionsList.add(new ItemInteraction("ads_bg", InteractionRoomAds.class)); + this.interactionsList.add(new ItemInteraction("trophy", InteractionTrophy.class)); + this.interactionsList.add(new ItemInteraction("vendingmachine", InteractionVendingMachine.class)); + this.interactionsList.add(new ItemInteraction("pressureplate", InteractionPressurePlate.class)); + this.interactionsList.add(new ItemInteraction("colorplate", InteractionColorPlate.class)); + this.interactionsList.add(new ItemInteraction("multiheight", InteractionMultiHeight.class)); + this.interactionsList.add(new ItemInteraction("dice", InteractionDice.class)); + this.interactionsList.add(new ItemInteraction("colorwheel", InteractionColorWheel.class)); + this.interactionsList.add(new ItemInteraction("cannon", InteractionCannon.class)); + this.interactionsList.add(new ItemInteraction("teleport", InteractionTeleport.class)); + this.interactionsList.add(new ItemInteraction("teleporttile", InteractionTeleportTile.class)); + this.interactionsList.add(new ItemInteraction("crackable", InteractionCrackable.class)); + this.interactionsList.add(new ItemInteraction("nest", InteractionNest.class)); + this.interactionsList.add(new ItemInteraction("pet_drink", InteractionPetDrink.class)); + this.interactionsList.add(new ItemInteraction("pet_food", InteractionPetFood.class)); + this.interactionsList.add(new ItemInteraction("pet_toy", InteractionPetToy.class)); + this.interactionsList.add(new ItemInteraction("breeding_nest", InteractionPetBreedingNest.class)); + this.interactionsList.add(new ItemInteraction("obstacle", InteractionObstacle.class)); + this.interactionsList.add(new ItemInteraction("monsterplant_seed", InteractionMonsterPlantSeed.class)); + this.interactionsList.add(new ItemInteraction("gift", InteractionGift.class)); + this.interactionsList.add(new ItemInteraction("stack_helper", InteractionStackHelper.class)); + this.interactionsList.add(new ItemInteraction("puzzle_box", InteractionPuzzleBox.class)); + this.interactionsList.add(new ItemInteraction("hopper", InteractionHopper.class)); + this.interactionsList.add(new ItemInteraction("costume_hopper", InteractionCostumeHopper.class)); + this.interactionsList.add(new ItemInteraction("club_hopper", InteractionHabboClubHopper.class)); + this.interactionsList.add(new ItemInteraction("club_gate", InteractionHabboClubGate.class)); + this.interactionsList.add(new ItemInteraction("club_teleporttile", InteractionHabboClubTeleportTile.class)); + this.interactionsList.add(new ItemInteraction("onewaygate", InteractionOneWayGate.class)); + this.interactionsList.add(new ItemInteraction("love_lock", InteractionLoveLock.class)); + this.interactionsList.add(new ItemInteraction("clothing", InteractionClothing.class)); + this.interactionsList.add(new ItemInteraction("roller", InteractionRoller.class)); + this.interactionsList.add(new ItemInteraction("postit", InteractionPostIt.class)); + this.interactionsList.add(new ItemInteraction("dimmer", InteractionMoodLight.class)); + this.interactionsList.add(new ItemInteraction("rentable_space", InteractionRentableSpace.class)); + this.interactionsList.add(new ItemInteraction("pyramid", InteractionPyramid.class)); + this.interactionsList.add(new ItemInteraction("musicdisc", InteractionMusicDisc.class)); + this.interactionsList.add(new ItemInteraction("fireworks", InteractionFireworks.class)); + this.interactionsList.add(new ItemInteraction("talking_furni", InteractionTalkingFurniture.class)); + this.interactionsList.add(new ItemInteraction("water_item", InteractionWaterItem.class)); + this.interactionsList.add(new ItemInteraction("water", InteractionWater.class)); + this.interactionsList.add(new ItemInteraction("viking_cotie", InteractionVikingCotie.class)); + this.interactionsList.add(new ItemInteraction("tile_fxprovider_nfs", InteractionTileEffectProvider.class)); + this.interactionsList.add(new ItemInteraction("mutearea", InteractionMuteArea.class)); + this.interactionsList.add(new ItemInteraction("information_terminal", InteractionInformationTerminal.class)); + this.interactionsList.add(new ItemInteraction("external_image", InteractionExternalImage.class)); + this.interactionsList.add(new ItemInteraction("youtube", InteractionYoutubeTV.class)); + this.interactionsList.add(new ItemInteraction("jukebox", InteractionJukeBox.class)); + this.interactionsList.add(new ItemInteraction("switch", InteractionSwitch.class)); + this.interactionsList.add(new ItemInteraction("fx_box", InteractionFXBox.class)); + this.interactionsList.add(new ItemInteraction("blackhole", InteractionBlackHole.class)); + this.interactionsList.add(new ItemInteraction("effect_toggle", InteractionEffectToggle.class)); + this.interactionsList.add(new ItemInteraction("room_o_matic", InteractionRoomOMatic.class)); + this.interactionsList.add(new ItemInteraction("effect_tile", InteractionEffectTile.class)); + this.interactionsList.add(new ItemInteraction("sticky_pole", InteractionStickyPole.class)); + + /* + Wireds + */ + /* + Triggers + */ + this.interactionsList.add(new ItemInteraction("wf_trg_walks_on_furni", WiredTriggerHabboWalkOnFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_walks_off_furni", WiredTriggerHabboWalkOffFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_enter_room", WiredTriggerHabboEntersRoom.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_says_something", WiredTriggerHabboSaysKeyword.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_periodically", WiredTriggerRepeater.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_period_long", WiredTriggerRepeaterLong.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_state_changed", WiredTriggerFurniStateToggled.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_at_given_time", WiredTriggerAtSetTime.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_at_time_long", WiredTriggerAtTimeLong.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_collision", WiredTriggerCollision.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_game_starts", WiredTriggerGameStarts.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_game_ends", WiredTriggerGameEnds.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_bot_reached_stf", WiredTriggerBotReachedFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_bot_reached_avtr", WiredTriggerBotReachedHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_says_command", WiredTriggerHabboSaysCommand.class)); + this.interactionsList.add(new ItemInteraction("wf_trg_score_achieved", WiredTriggerScoreAchieved.class)); + + /* + Effects + */ + this.interactionsList.add(new ItemInteraction("wf_act_toggle_state", WiredEffectToggleFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_act_reset_timers", WiredEffectResetTimers.class)); + this.interactionsList.add(new ItemInteraction("wf_act_match_to_sshot", WiredEffectMatchFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_act_move_rotate", WiredEffectMoveRotateFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_score", WiredEffectGiveScore.class)); + this.interactionsList.add(new ItemInteraction("wf_act_show_message", WiredEffectWhisper.class)); + this.interactionsList.add(new ItemInteraction("wf_act_teleport_to", WiredEffectTeleport.class)); + this.interactionsList.add(new ItemInteraction("wf_act_join_team", WiredEffectJoinTeam.class)); + this.interactionsList.add(new ItemInteraction("wf_act_leave_team", WiredEffectLeaveTeam.class)); + this.interactionsList.add(new ItemInteraction("wf_act_chase", WiredEffectMoveFurniTowards.class)); + this.interactionsList.add(new ItemInteraction("wf_act_flee", WiredEffectMoveFurniAway.class)); + this.interactionsList.add(new ItemInteraction("wf_act_move_to_dir", WiredEffectChangeFurniDirection.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_score_tm", WiredEffectGiveScoreToTeam.class)); + this.interactionsList.add(new ItemInteraction("wf_act_toggle_to_rnd", WiredEffectToggleRandom.class)); + this.interactionsList.add(new ItemInteraction("wf_act_move_furni_to", WiredEffectMoveFurniTo.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_reward", WiredEffectGiveReward.class)); + this.interactionsList.add(new ItemInteraction("wf_act_call_stacks", WiredEffectTriggerStacks.class)); + this.interactionsList.add(new ItemInteraction("wf_act_kick_user", WiredEffectKickHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_act_mute_triggerer", WiredEffectMuteHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_teleport", WiredEffectBotTeleport.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_move", WiredEffectBotWalkToFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_talk", WiredEffectBotTalk.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_give_handitem", WiredEffectBotGiveHandItem.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_follow_avatar", WiredEffectBotFollowHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_clothes", WiredEffectBotClothes.class)); + this.interactionsList.add(new ItemInteraction("wf_act_bot_talk_to_avatar", WiredEffectBotTalkToHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_diamonds", WiredEffectGiveDiamonds.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_credits", WiredEffectGiveCredits.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_duckets", WiredEffectGiveDuckets.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_badge", WiredEffectGiveBadge.class)); + this.interactionsList.add(new ItemInteraction("wf_act_forward_user", WiredEffectForwardToRoom.class)); + this.interactionsList.add(new ItemInteraction("wf_act_roller_speed", WiredEffectRollerSpeed.class)); + this.interactionsList.add(new ItemInteraction("wf_act_raise_furni", WiredEffectRaiseFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_act_lower_furni", WiredEffectLowerFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_act_give_respect", WiredEffectGiveRespect.class)); + this.interactionsList.add(new ItemInteraction("wf_act_alert", WiredEffectAlert.class)); + + /* + Conditions + */ + this.interactionsList.add(new ItemInteraction("wf_cnd_has_furni_on", WiredConditionFurniHaveFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_furnis_hv_avtrs", WiredConditionFurniHaveHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_stuff_is", WiredConditionFurniTypeMatch.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_actor_in_group", WiredConditionGroupMember.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_user_count_in", WiredConditionHabboCount.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_wearing_effect", WiredConditionHabboHasEffect.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_wearing_badge", WiredConditionHabboWearsBadge.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_time_less_than", WiredConditionLessTimeElapsed.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_match_snapshot", WiredConditionMatchStatePosition.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_time_more_than", WiredConditionMoreTimeElapsed.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_furni_on", WiredConditionNotFurniHaveFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_hv_avtrs", WiredConditionNotFurniHaveHabbo.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_stuff_is", WiredConditionNotFurniTypeMatch.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_user_count", WiredConditionNotHabboCount.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_wearing_fx", WiredConditionNotHabboHasEffect.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_wearing_b", WiredConditionNotHabboWearsBadge.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_in_group", WiredConditionNotInGroup.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_in_team", WiredConditionNotInTeam.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_match_snap", WiredConditionNotMatchStatePosition.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_trggrer_on", WiredConditionNotTriggerOnFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_actor_in_team", WiredConditionTeamMember.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_trggrer_on_frn", WiredConditionTriggerOnFurni.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_has_handitem", WiredConditionHabboHasHandItem.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_date_rng_active", WiredConditionDateRangeActive.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_motto_contains", WiredConditionMottoContains.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_battlebanzai", WiredConditionBattleBanzaiGameActive.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_battlebanzai", WiredConditionNotBattleBanzaiGameActive.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_freeze", WiredConditionFreezeGameActive.class)); + this.interactionsList.add(new ItemInteraction("wf_cnd_not_freeze", WiredConditionNotFreezeGameActive.class)); + + /* + Extra + */ + this.interactionsList.add(new ItemInteraction("wf_xtra_random", WiredExtraRandom.class)); + this.interactionsList.add(new ItemInteraction("wf_xtra_unseen", WiredExtraUnseen.class)); + + /* + Highscores + */ + this.interactionsList.add(new ItemInteraction("wf_highscore", InteractionWiredHighscore.class)); + + /* + Battle Banzai + */ + /* + Battle Banzai Items + */ + //battlebanzai_pyramid + //battlebanzai_puck extends pushable + this.interactionsList.add(new ItemInteraction("battlebanzai_timer", InteractionBattleBanzaiTimer.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_tile", InteractionBattleBanzaiTile.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_random_teleport", InteractionBattleBanzaiTeleporter.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_sphere", InteractionBattleBanzaiSphere.class)); + + /* + Battle Banzai Gates + */ + this.interactionsList.add(new ItemInteraction("battlebanzai_gate_blue", InteractionBattleBanzaiGateBlue.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_gate_green", InteractionBattleBanzaiGateGreen.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_gate_red", InteractionBattleBanzaiGateRed.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_gate_yellow", InteractionBattleBanzaiGateYellow.class)); + + /* + Battle Banzai Scoreboards + */ + this.interactionsList.add(new ItemInteraction("battlebanzai_counter_blue", InteractionBattleBanzaiScoreboardBlue.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_counter_green", InteractionBattleBanzaiScoreboardGreen.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_counter_red", InteractionBattleBanzaiScoreboardRed.class)); + this.interactionsList.add(new ItemInteraction("battlebanzai_counter_yellow", InteractionBattleBanzaiScoreboardYellow.class)); + + /* + Freeze + */ + /* + Freeze Items + */ + this.interactionsList.add(new ItemInteraction("freeze_block", InteractionFreezeBlock.class)); + this.interactionsList.add(new ItemInteraction("freeze_tile", InteractionFreezeTile.class)); + this.interactionsList.add(new ItemInteraction("freeze_exit", InteractionFreezeExitTile.class)); + this.interactionsList.add(new ItemInteraction("freeze_timer", InteractionFreezeTimer.class)); + + /* + Freeze Gates + */ + this.interactionsList.add(new ItemInteraction("freeze_gate_blue", InteractionFreezeGateBlue.class)); + this.interactionsList.add(new ItemInteraction("freeze_gate_green", InteractionFreezeGateGreen.class)); + this.interactionsList.add(new ItemInteraction("freeze_gate_red", InteractionFreezeGateRed.class)); + this.interactionsList.add(new ItemInteraction("freeze_gate_yellow", InteractionFreezeGateYellow.class)); + + /* + Freeze Scoreboards + */ + this.interactionsList.add(new ItemInteraction("freeze_counter_blue", InteractionFreezeScoreboardBlue.class)); + this.interactionsList.add(new ItemInteraction("freeze_counter_green", InteractionFreezeScoreboardGreen.class)); + this.interactionsList.add(new ItemInteraction("freeze_counter_red", InteractionFreezeScoreboardRed.class)); + this.interactionsList.add(new ItemInteraction("freeze_counter_yellow", InteractionFreezeScoreboardYellow.class)); + + /* + Ice Tag + */ + this.interactionsList.add(new ItemInteraction("icetag_pole", InteractionIceTagPole.class)); + this.interactionsList.add(new ItemInteraction("icetag_field", InteractionIceTagField.class)); + + /* + Bunnyrun + */ + this.interactionsList.add(new ItemInteraction("bunnyrun_pole", InteractionBunnyrunPole.class)); + this.interactionsList.add(new ItemInteraction("bunnyrun_field", InteractionBunnyrunField.class)); + + /* + Rollerskate + */ + this.interactionsList.add(new ItemInteraction("rollerskate_field", InteractionRollerskateField.class)); + + /* + Football + */ + this.interactionsList.add(new ItemInteraction("football", InteractionFootball.class)); + this.interactionsList.add(new ItemInteraction("football_gate", InteractionFootballGate.class)); + this.interactionsList.add(new ItemInteraction("football_counter_blue", InteractionFootballScoreboardBlue.class)); + this.interactionsList.add(new ItemInteraction("football_counter_green", InteractionFootballScoreboardGreen.class)); + this.interactionsList.add(new ItemInteraction("football_counter_red", InteractionFootballScoreboardRed.class)); + this.interactionsList.add(new ItemInteraction("football_counter_yellow", InteractionFootballScoreboardYellow.class)); + this.interactionsList.add(new ItemInteraction("football_goal_blue", InteractionFootballGoalBlue.class)); + this.interactionsList.add(new ItemInteraction("football_goal_green", InteractionFootballGoalGreen.class)); + this.interactionsList.add(new ItemInteraction("football_goal_red", InteractionFootballGoalRed.class)); + this.interactionsList.add(new ItemInteraction("football_goal_yellow", InteractionFootballGoalYellow.class)); + + this.interactionsList.add(new ItemInteraction("snowstorm_tree", null)); + this.interactionsList.add(new ItemInteraction("snowstorm_machine", null)); + this.interactionsList.add(new ItemInteraction("snowstorm_pile", null)); + } + + /** + * Adds an new ItemInteraction to the interaction list. + * @param itemInteraction The ItemInteraction that must be added. + */ + public void addItemInteraction(ItemInteraction itemInteraction) + { + for (ItemInteraction interaction : this.interactionsList) + { + if(interaction.getType() == itemInteraction.getType() || + interaction.getName().equalsIgnoreCase(itemInteraction.getName())) + + throw new RuntimeException("Interaction Types must be unique. An class with type: " + interaction.getClass().getName() + " was already added OR the key: " + interaction.getName() + " is already in use."); + } + + this.interactionsList.add(itemInteraction); + } + + /** + * Gets that correct ItemInteraction class for the given Interaction. + * @param type The Interaction that must be found. + * @return The ItemInteraction definition for the given class. + */ + public ItemInteraction getItemInteraction(Class type) + { + for (ItemInteraction interaction : this.interactionsList) + { + if (interaction.getType() == type) + return interaction; + } + + Emulator.getLogging().logDebugLine("Can't find interaction class:" + type.getName()); + return getItemInteraction(InteractionDefault.class); + } + + /** + * Gets that correct ItemInteraction class for the given Interaction. + * @param type The Interaction that must be found. + * @return The ItemInteraction definition for the given class. + */ + public ItemInteraction getItemInteraction(String type) + { + for (ItemInteraction interaction : this.interactionsList) + { + if (interaction.getName().equalsIgnoreCase(type)) + return interaction; + } + + return this.getItemInteraction(InteractionDefault.class); + } + + /** + * Loads all items from the database. Updates the item definition when needed. + * + * Note: Does not change the interaction type. Emulator requires a restart for that. + */ + public void loadItems() + { + try ( + Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + Statement statement = connection.createStatement(); + ResultSet set = statement.executeQuery(("SELECT * FROM items_base ORDER BY id DESC")) + ) + { + while (set.next()) + { + try + { + //Item proxyItem = + int id = set.getInt("id"); + if (!this.items.containsKey(id)) + this.items.put(id, new Item(set)); + else + this.items.get(id).update(set); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to load Item (" + set.getInt("id") + ")"); + Emulator.getLogging().logErrorLine(e); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Loads the crackable items and their rewards from the database. + */ + public void loadCrackable() + { + this.crackableRewards.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM items_crackable"); ResultSet set = statement.executeQuery()) + { + while(set.next()) + { + try + { + this.crackableRewards.put(set.getInt("item_id"), new CrackableReward(set)); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to load items_crackable item_id = " + set.getInt("ïtem_id")); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * Gets the amount of clicks required for an crackable item. + * @param itemId The Item id. + * @return The amount of clicks required. + */ + public int getCrackableCount(int itemId) + { + if(this.crackableRewards.containsKey(itemId)) + return this.crackableRewards.get(itemId).count; + else + return 0; + } + + /** + * Calculates the current state of the crackable item depending on the amount of ticks. + * @param count The current amount of ticks. + * @param max The amount of ticks needed. + * @return State of the crackable. + */ + public int calculateCrackState(int count, int max, Item baseItem) + { + return (int)Math.floor((1.0D / ((double)max / (double)count) * baseItem.getStateCount())); + } + + public CrackableReward getCrackableData(int itemId) + { + return this.crackableRewards.get(itemId); + } + + public Item getCrackableReward(int itemId) + { + return this.getItem(this.crackableRewards.get(itemId).getRandomReward()); + } + + /** + * Loads soundtracks from the database. + */ + public void loadSoundTracks() + { + this.soundTracks.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM soundtracks"); ResultSet set = statement.executeQuery()) + { + while(set.next()) + { + this.soundTracks.put(set.getString("code"), new SoundTrack(set)); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public SoundTrack getSoundTrack(String code) + { + return this.soundTracks.get(code); + } + + public SoundTrack getSoundTrack(int id) + { + for(Map.Entry entry : this.soundTracks.entrySet()) + { + if(entry.getValue().getId() == id) + return entry.getValue(); + } + + return null; + } + + public HabboItem createItem(int habboId, Item item, int limitedStack, int limitedSells, String extraData) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO items (user_id, item_id, extra_data, limited_data) VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, habboId); + statement.setInt(2, item.getId()); + statement.setString(3, extraData); + statement.setString(4, limitedStack + ":" + limitedSells); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + Class itemClass = item.getInteractionType().getType(); + + if (itemClass != null) + { + try + { + return itemClass.getDeclaredConstructor(int.class, int.class, Item.class, String.class, int.class, int.class).newInstance(set.getInt(1), habboId, item, extraData, limitedStack, limitedSells); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + return new InteractionDefault(set.getInt(1), habboId, item, extraData, limitedStack, limitedSells); + } + } + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch(Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + return null; + } + + public void loadNewUserGifts() + { + this.newuserGifts.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM nux_gifts")) + { + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.newuserGifts.put(set.getInt("id"), new NewUserGift(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void addNewUserGift(NewUserGift gift) + { + this.newuserGifts.put(gift.getId(), gift); + } + + public void removeNewUserGift(NewUserGift gift) + { + this.newuserGifts.remove(gift.getId()); + } + + public NewUserGift getNewUserGift(int id) + { + return this.newuserGifts.get(id); + } + + public List getNewUserGifts() + { + return new ArrayList<>(this.newuserGifts.values()); + } + + public void deleteItem(HabboItem item) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM items WHERE id = ?")) + { + statement.setInt(1, item.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public HabboItem handleRecycle(Habbo habbo, String itemId) + { + String extradata = Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + (Calendar.getInstance().get(Calendar.MONTH) + 1) + "-" + Calendar.getInstance().get(Calendar.YEAR); + + HabboItem item = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO items (user_id, item_id, extra_data) VALUES (?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, Emulator.getGameEnvironment().getCatalogManager().ecotronItem.getId()); + statement.setString(3, extradata); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + try (PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO items_presents VALUES (?, ?)")) + { + while (set.next() && item == null) + { + preparedStatement.setInt(1, set.getInt(1)); + preparedStatement.setInt(2, Integer.valueOf(itemId)); + preparedStatement.addBatch(); + item = new InteractionDefault(set.getInt(1), habbo.getHabboInfo().getId(), Emulator.getGameEnvironment().getCatalogManager().ecotronItem, extradata, 0, 0); + } + + preparedStatement.executeBatch(); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return item; + } + + public HabboItem handleOpenRecycleBox(Habbo habbo, HabboItem box) + { + Emulator.getThreading().run(new QueryDeleteHabboItem(box)); + HabboItem item = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM items_presents WHERE item_id = ? LIMIT 1")) + { + statement.setInt(1, box.getId()); + try (ResultSet rewardSet = statement.executeQuery()) + { + if (rewardSet.next()) + { + try (PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO items (user_id, item_id) VALUES(?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + preparedStatement.setInt(1, habbo.getHabboInfo().getId()); + preparedStatement.setInt(2, rewardSet.getInt("base_item_reward")); + preparedStatement.execute(); + + try (ResultSet set = preparedStatement.getGeneratedKeys()) + { + if (set.next()) + { + try (PreparedStatement request = connection.prepareStatement("SELECT * FROM items WHERE id = ? LIMIT 1")) + { + request.setInt(1, set.getInt(1)); + + try (ResultSet resultSet = request.executeQuery()) + { + if (resultSet.next()) + { + try (PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM items_presents WHERE item_id = ? LIMIT 1")) + { + deleteStatement.setInt(1, box.getId()); + deleteStatement.execute(); + + item = loadHabboItem(resultSet); + } + } + } + } + } + } + } + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return item; + } + + public void insertTeleportPair(int itemOneId, int itemTwoId) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO items_teleports VALUES (?, ?)")) + { + statement.setInt(1, itemOneId); + statement.setInt(2, itemTwoId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void insertHopper(HabboItem hopper) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO items_hoppers VALUES (?, ?)")) + { + statement.setInt(1, hopper.getId()); + statement.setInt(2, hopper.getBaseItem().getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public int[] getTargetTeleportRoomId(HabboItem item) + { + int[] a = new int[]{}; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT items.id, items.room_id FROM items_teleports INNER JOIN items ON items_teleports.teleport_one_id = items.id OR items_teleports.teleport_two_id = items.id WHERE items.id != ? AND items.room_id > 0 LIMIT 1")) + { + statement.setInt(1, item.getId()); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + a = new int[]{set.getInt("room_id"), set.getInt("id")}; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return a; + } + + public HabboItem loadHabboItem(int itemId) + { + HabboItem item = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM items WHERE id = ? LIMIT 1")) + { + statement.setInt(1, itemId); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + item = this.loadHabboItem(set); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return item; + } + + public HabboItem loadHabboItem(ResultSet set) throws SQLException + { + Item baseItem = this.getItem(set.getInt("item_id")); + + if(baseItem == null) + return null; + + Class itemClass = baseItem.getInteractionType().getType(); + + if(itemClass != null) + { + try + { + Constructor c = itemClass.getConstructor(ResultSet.class, Item.class); + c.setAccessible(true); + + return (HabboItem)c.newInstance(set, baseItem); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + return null; + } + + public HabboItem createGift(String username, Item item, String extraData, int limitedStack, int limitedSells) + { + HabboItem gift = null; + int userId = 0; + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(username); + + if(habbo != null) + { + userId = habbo.getHabboInfo().getId(); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT id FROM users WHERE username = ?")) + { + statement.setString(1, username); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + userId = set.getInt(1); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + if(userId == 0) + return null; + + if (extraData.length() > 1000) + { + Emulator.getLogging().logErrorLine("Extradata exceeds maximum length of 1000 characters:" + extraData); + extraData = extraData.substring(0, 1000); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO items (user_id, item_id, extra_data, limited_data) VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, userId); + statement.setInt(2, item.getId()); + statement.setString(3, extraData); + statement.setString(4, limitedStack + ":" + limitedSells); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + gift = new InteractionGift(set.getInt(1), userId, item, extraData, limitedStack, limitedSells); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if(gift != null) + { + if(habbo != null) + { + habbo.getInventory().getItemsComponent().addItem(gift); + + habbo.getClient().sendResponse(new AddHabboItemComposer(gift)); + } + } + + return gift; + } + + public Item getItem(int itemId) + { + if(itemId < 0) + return null; + + return this.items.get(itemId); + } + + public TIntObjectMap getItems() + { + return this.items; + } + + public Item getItem(String itemName) + { + TIntObjectIterator item = this.items.iterator(); + + for(int i = this.items.size(); i-- > 0;) + { + try + { + item.advance(); + if (item.value().getName().toLowerCase().equals(itemName.toLowerCase())) + { + return item.value(); + } + } + catch (NoSuchElementException e) + { + break; + } + } + + return null; + } + + public YoutubeManager getYoutubeManager() + { + return this.youtubeManager; + } + + public void dispose() + { + this.items.clear(); + + Emulator.getLogging().logShutdownLine("Item Manager -> Disposed!"); + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/NewUserGift.java b/src/main/java/com/eu/habbo/habbohotel/items/NewUserGift.java new file mode 100644 index 00000000..9903ae6e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/NewUserGift.java @@ -0,0 +1,99 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +public class NewUserGift implements ISerialize +{ + private final int id; + private final Type type; + private final String imageUrl; + private Map items = new HashMap(); + + public NewUserGift(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.type = Type.valueOf(set.getString("type").toUpperCase()); + this.imageUrl = set.getString("image"); + this.items.put(type == Type.ROOM ? "" : set.getString("value"), type == Type.ROOM ? set.getString("value") : ""); + } + public NewUserGift(int id, Type type, String imageUrl, Map items) + { + this.id = id; + this.imageUrl = imageUrl; + this.type = type; + this.items = items; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString(this.imageUrl); + message.appendInt(this.items.size()); + for (Map.Entry entry : this.items.entrySet()) + { + message.appendString(entry.getKey()); //Item Name + message.appendString(entry.getValue()); //Extra Info + } + } + + public void give(Habbo habbo) + { + if (this.type == Type.ITEM) + { + for (Map.Entry set : this.items.entrySet()) + { + Item item = Emulator.getGameEnvironment().getItemManager().getItem(set.getKey()); + + if (item != null) + { + HabboItem createdItem = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getHabboInfo().getId(), item, 0, 0, ""); + + if (createdItem != null) + { + habbo.addFurniture(createdItem); + } + } + } + } + else if (this.type == Type.ROOM) + { + + } + } + + public int getId() + { + return this.id; + } + + public Type getType() + { + return this.type; + } + + public String getImageUrl() + { + return this.imageUrl; + } + + public Map getItems() + { + return this.items; + } + + public static enum Type + { + ITEM, + ROOM + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/PostItColor.java b/src/main/java/com/eu/habbo/habbohotel/items/PostItColor.java new file mode 100644 index 00000000..4b6a6d43 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/PostItColor.java @@ -0,0 +1,47 @@ +package com.eu.habbo.habbohotel.items; + +public enum PostItColor +{ + /** + * Blue! + */ + BLUE("9CCEFF"), + + /** + * Green! + */ + GREEN("9CFF9C"), + + /** + * Pink! (Or purple :P) + */ + PINK("FF9CFF"), + + /** + * Yellow + */ + YELLOW("FFFF33"); + + public final String hexColor; + + PostItColor(String hexColor) + { + this.hexColor = hexColor; + } + + /** + * If the color is a custom color. + * @param color The color to check. + * @return True if the color is a custom color. + */ + public static boolean isCustomColor(String color) + { + for(PostItColor postItColor : PostItColor.values()) + { + if(postItColor.hexColor.equalsIgnoreCase(color)) + return false; + } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/SoundTrack.java b/src/main/java/com/eu/habbo/habbohotel/items/SoundTrack.java new file mode 100644 index 00000000..ff56cb3f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/SoundTrack.java @@ -0,0 +1,54 @@ +package com.eu.habbo.habbohotel.items; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SoundTrack +{ + private int id; + private String name; + private String author; + private String code; + private String data; + private int length; + + public SoundTrack(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + this.author = set.getString("author"); + this.code = set.getString("code"); + this.data = set.getString("track"); + this.length = set.getInt("length"); + } + + public int getId() + { + return id; + } + + public String getName() + { + return name; + } + + public String getAuthor() + { + return author; + } + + public String getCode() + { + return code; + } + + public String getData() + { + return data; + } + + public int getLength() + { + return length; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java b/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java new file mode 100644 index 00000000..5abbcb71 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java @@ -0,0 +1,126 @@ +package com.eu.habbo.habbohotel.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.ArrayList; + +public class YoutubeManager +{ + public THashMap> playLists = new THashMap>(); + public THashMap videos = new THashMap(); + + public void load() + { + this.videos.clear(); + this.playLists.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (Statement statement = connection.createStatement()) + { + try (ResultSet set = statement.executeQuery("SELECT * FROM youtube_items")) + { + while (set.next()) + { + this.videos.put(set.getInt("id"), new YoutubeItem(set)); + } + } + + try (ResultSet set = statement.executeQuery("SELECT * FROM youtube_playlists ORDER BY `order` ASC")) + { + while (set.next()) + { + if (!this.playLists.containsKey(set.getInt("item_id"))) + { + this.playLists.put(set.getInt("item_id"), new ArrayList()); + } + + YoutubeItem item = this.videos.get(set.getInt("video_id")); + + if (item != null) + { + this.playLists.get(set.getInt("item_id")).add(item); + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public ArrayList getPlaylist(Item item) + { + if (this.playLists.containsKey(item.getId())) + { + return this.playLists.get(item.getId()); + } + + return new ArrayList(); + } + + public YoutubeItem getVideo(Item item, String video) + { + if (this.playLists.contains(item.getId())) + { + for (YoutubeItem v : this.playLists.get(item.getId())) + { + if (v.video.equalsIgnoreCase(video)) + { + return v; + } + } + } + + return null; + } + + public String getPreviewImage(Item item) + { + if (this.playLists.contains(item.getId())) + { + if (!this.playLists.get(item.getId()).isEmpty()) + { + return this.playLists.get(item.getId()).get(0).video; + } + } + + return ""; + } + + public YoutubeItem getVideo(Item item, int index) + { + if (this.playLists.containsKey(item.getId())) + { + return this.playLists.get(item.getId()).get(index); + } + + return null; + } + + public class YoutubeItem + { + public final int id; + public final String video; + public final String title; + public final String description; + public final int startTime; + public final int endTime; + + public YoutubeItem(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.video = set.getString("video"); + this.title = set.getString("title"); + this.description = set.getString("description"); + this.startTime = set.getInt("start_time"); + this.endTime = set.getInt("end_time"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBackgroundToner.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBackgroundToner.java new file mode 100644 index 00000000..6a54c11d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBackgroundToner.java @@ -0,0 +1,109 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.BackgroundAnimation; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBackgroundToner extends HabboItem +{ + public InteractionBackgroundToner(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBackgroundToner(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(5 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(4); + if (this.getExtradata().split(":").length == 4) + { + String[] colorData = this.getExtradata().split(":"); + serverMessage.appendInt(Integer.valueOf(colorData[0])); + serverMessage.appendInt(Integer.valueOf(colorData[1])); + serverMessage.appendInt(Integer.valueOf(colorData[2])); + serverMessage.appendInt(Integer.valueOf(colorData[3])); + } + else + { + serverMessage.appendInt(0); + serverMessage.appendInt(126); + serverMessage.appendInt(126); + serverMessage.appendInt(126); + this.setExtradata("0:126:126:126"); + this.needsUpdate(true); + Emulator.getThreading().run(this); + } + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if(client.getHabbo().getRoomUnit().cmdSit && client.getHabbo().getRoomUnit().getEffectId() == 1337) + { + Emulator.getThreading().run(new BackgroundAnimation(this, room)); + return; + } + + if(this.getExtradata().split(":").length == 4) + { + String[] data = this.getExtradata().split(":"); + this.setExtradata((data[0].equals("0") ? "1" : "0") + ":" + data[1] + ":" + data[2] + ":" + data[3]); + room.updateItem(this); + } + else + { + this.setExtradata("0:126:126:126"); + room.updateItem(this); + } + this.needsUpdate(true); + Emulator.getThreading().run(this); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBadgeDisplay.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBadgeDisplay.java new file mode 100644 index 00000000..767f1efd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBadgeDisplay.java @@ -0,0 +1,83 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBadgeDisplay extends HabboItem +{ + public InteractionBadgeDisplay(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBadgeDisplay(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(2 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(4); + serverMessage.appendString("0"); + String[] data = this.getExtradata().split((char) 9 + ""); + if(data.length == 3) + { + serverMessage.appendString(data[2]); + serverMessage.appendString(data[1]); + serverMessage.appendString(data[0]); + } + else + { + serverMessage.appendString(this.getExtradata()); + serverMessage.appendString("Unknown User"); + serverMessage.appendString("Unknown Date"); + } + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBlackHole.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBlackHole.java new file mode 100644 index 00000000..20db14e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBlackHole.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBlackHole extends InteractionGate +{ + public InteractionBlackHole(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBlackHole(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java new file mode 100644 index 00000000..8ddf4132 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java @@ -0,0 +1,98 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.CannonKickAction; +import com.eu.habbo.threading.runnables.CannonResetCooldownAction; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionCannon extends HabboItem +{ + public boolean cooldown = false; + + public InteractionCannon(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionCannon(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(client != null) + { + super.onClick(client, room, objects); + } + + if(room == null) + return; + + RoomTile tile = room.getLayout().getTile(this.getX(), this.getY()); + + if ((client == null || tile.distance(client.getHabbo().getRoomUnit().getCurrentLocation()) <= 2) && !this.cooldown) + { + this.cooldown = true; + this.setExtradata(this.getExtradata().equals("1") ? "0" : "1"); + room.updateItemState(this); + Emulator.getThreading().run(new CannonKickAction(this, room), 750); + Emulator.getThreading().run(new CannonResetCooldownAction(this), 2000); + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionClothing.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionClothing.java new file mode 100644 index 00000000..fa92dddb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionClothing.java @@ -0,0 +1,51 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionClothing extends HabboItem +{ + public InteractionClothing(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionClothing(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(2 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(1); + serverMessage.appendString(""); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorPlate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorPlate.java new file mode 100644 index 00000000..e3ee0424 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorPlate.java @@ -0,0 +1,72 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionColorPlate extends InteractionDefault +{ + public InteractionColorPlate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionColorPlate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + this.change(room, 1); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + change(room, -1); + } + + private void change(Room room, int amount) + { + int state = 0; + + if (this.getExtradata() == null || this.getExtradata().isEmpty()) + { + this.setExtradata("0"); + } + + try + { + state = Integer.valueOf(this.getExtradata()); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + state += amount; + if (state > this.getBaseItem().getStateCount()) + { + state = this.getBaseItem().getStateCount(); + } + + if (state < 0) + { + state = 0; + } + + this.setExtradata(state + ""); + this.needsUpdate(true); + room.updateItemState(this); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorWheel.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorWheel.java new file mode 100644 index 00000000..98e8d440 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionColorWheel.java @@ -0,0 +1,90 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.WallItemUpdateComposer; +import com.eu.habbo.threading.runnables.RandomDiceNumber; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionColorWheel extends HabboItem +{ + private Runnable rollTaks; + + public InteractionColorWheel(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionColorWheel(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (!room.hasRights(client.getHabbo())) + return; + + if(this.rollTaks == null) + { + this.setExtradata("-1"); + room.sendComposer(new WallItemUpdateComposer(this).compose()); + Emulator.getThreading().run(this); + Emulator.getThreading().run(new RandomDiceNumber(this, room, this.getBaseItem().getStateCount()), 3000); + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit client, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + public void clearRunnable() + { + this.rollTaks = null; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCostumeHopper.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCostumeHopper.java new file mode 100644 index 00000000..a70eb81a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCostumeHopper.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.outgoing.generic.alerts.CustomNotificationComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionCostumeHopper extends InteractionHopper +{ + public InteractionCostumeHopper(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionCostumeHopper(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(client.getHabbo().getRoomUnit().getEffectId() > 0) + { + super.onClick(client, room, objects); + } + else + { + client.sendResponse(new CustomNotificationComposer(CustomNotificationComposer.HOPPER_NO_COSTUME)); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java new file mode 100644 index 00000000..0e397cf9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java @@ -0,0 +1,135 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.CrackableReward; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.CrackableExplode; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionCrackable extends HabboItem +{ + public boolean cracked = false; + private final Object lock = new Object(); + + public InteractionCrackable(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionCrackable(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + if(this.getExtradata().length() == 0) + this.setExtradata("0"); + + serverMessage.appendInt(7 + (this.isLimited() ? 256 : 0)); + + serverMessage.appendString(Emulator.getGameEnvironment().getItemManager().calculateCrackState(Integer.valueOf(this.getExtradata()), Emulator.getGameEnvironment().getItemManager().getCrackableCount(this.getBaseItem().getId()), this.getBaseItem()) + ""); + serverMessage.appendInt(Integer.valueOf(this.getExtradata())); + serverMessage.appendInt(Emulator.getGameEnvironment().getItemManager().getCrackableCount(this.getBaseItem().getId())); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client == null) + { + return; + } + + synchronized (this.lock) + { + super.onClick(client, room, objects); + + if (!room.hasRights(client.getHabbo())) + return; + + if (client == null) + return; + + if (this.getRoomId() == 0) + return; + + if (this.cracked) + return; + + if (this.getExtradata().length() == 0) + this.setExtradata("0"); + + if (this.getBaseItem().getEffectF() > 0) + if (client.getHabbo().getHabboInfo().getGender().equals(HabboGender.F) && this.getBaseItem().getEffectF() == client.getHabbo().getRoomUnit().getEffectId()) + return; + + if (this.getBaseItem().getEffectM() > 0) + if (client.getHabbo().getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() == client.getHabbo().getRoomUnit().getEffectId()) + return; + + this.setExtradata(Integer.valueOf(this.getExtradata()) + 1 + ""); + this.needsUpdate(true); + room.updateItemState(this); + + CrackableReward rewardData = Emulator.getGameEnvironment().getItemManager().getCrackableData(this.getBaseItem().getId()); + + if (rewardData != null && !rewardData.achievementTick.isEmpty()) + { + AchievementManager.progressAchievement(client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement(rewardData.achievementTick)); + } + if (!this.cracked && Integer.valueOf(this.getExtradata()) == Emulator.getGameEnvironment().getItemManager().getCrackableCount(this.getBaseItem().getId())) + { + this.cracked = true; + Emulator.getThreading().run(new CrackableExplode(room, this), 1500); + + if (rewardData != null && !rewardData.achievementCracked.isEmpty()) + { + AchievementManager.progressAchievement(client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement(rewardData.achievementCracked)); + } + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit client, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit client, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCustomValues.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCustomValues.java new file mode 100644 index 00000000..0778c1cb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCustomValues.java @@ -0,0 +1,95 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +public abstract class InteractionCustomValues extends HabboItem +{ + public final THashMap values = new THashMap(); + + public InteractionCustomValues(ResultSet set, Item baseItem, THashMap defaultValues) throws SQLException + { + super(set, baseItem); + + this.values.putAll(defaultValues); + + for(String s : set.getString("extra_data").split(";")) + { + String[] data = s.split("="); + + if(data.length == 2) + { + this.values.put(data[0], data[1]); + } + } + } + + public InteractionCustomValues(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, THashMap defaultValues) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + this.values.putAll(defaultValues); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void run() + { + this.setExtradata(this.toExtraData()); + + super.run(); + } + + public String toExtraData() + { + String data = ""; + synchronized (this.values) + { + for (Map.Entry set : this.values.entrySet()) + { + data += set.getKey() + "=" + set.getValue() + ";"; + } + } + + return data; + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(1 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(this.values.size()); + for (Map.Entry set : this.values.entrySet()) + { + serverMessage.appendString(set.getKey()); + serverMessage.appendString(set.getValue()); + } + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDefault.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDefault.java new file mode 100644 index 00000000..226da6c2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDefault.java @@ -0,0 +1,169 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUnitType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionDefault extends HabboItem +{ + public InteractionDefault(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionDefault(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean isWalkable() + { + return this.getBaseItem().allowWalk(); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(room != null && (client == null || canToggle(client.getHabbo(), room) || (objects.length >= 2 && objects[1] instanceof WiredEffectType && objects[1] == WiredEffectType.TOGGLE_STATE))) + { + super.onClick(client, room, objects); + + if (objects != null && objects.length > 0) + { + if (objects[0] instanceof Integer) + { + if (this.getExtradata().length() == 0) + this.setExtradata("0"); + + if (this.getBaseItem().getStateCount() > 0) + { + int currentState = 0; + + try + { + currentState = Integer.valueOf(this.getExtradata()); + } + catch (NumberFormatException e) + { + Emulator.getLogging().logErrorLine("Incorrect extradata (" + this.getExtradata() + ") for item ID (" + this.getId() + ") of type (" + this.getBaseItem().getName() + ")"); + } + + this.setExtradata("" + (currentState + 1) % this.getBaseItem().getStateCount()); + this.needsUpdate(true); + + room.updateItemState(this); + } + } + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + if (roomUnit != null) + { + if (this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) + { + if (roomUnit.getRoomUnitType().equals(RoomUnitType.USER)) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() > 0 && habbo.getRoomUnit().getEffectId() != this.getBaseItem().getEffectM()) + { + room.giveEffect(habbo, this.getBaseItem().getEffectM()); + return; + } + + if (habbo.getHabboInfo().getGender().equals(HabboGender.F) && this.getBaseItem().getEffectF() > 0 && habbo.getRoomUnit().getEffectId() != this.getBaseItem().getEffectF()) + { + room.giveEffect(habbo, this.getBaseItem().getEffectF()); + return; + } + } + } + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + if (roomUnit != null) + { + if (this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) + { + if (roomUnit.getRoomUnitType().equals(RoomUnitType.USER)) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() > 0) + { + room.giveEffect(habbo, 0); + return; + } + + if (habbo.getHabboInfo().getGender().equals(HabboGender.F) && this.getBaseItem().getEffectF() > 0) + { + room.giveEffect(habbo, 0); + return; + } + } + } + } + } + } + + public boolean canToggle(Habbo habbo, Room room) + { + return room.hasRights(habbo); + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDice.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDice.java new file mode 100644 index 00000000..f1757b5f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionDice.java @@ -0,0 +1,100 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.plugin.events.furniture.FurnitureDiceRolledEvent; +import com.eu.habbo.threading.runnables.RandomDiceNumber; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionDice extends HabboItem +{ + public InteractionDice(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + public InteractionDice(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null) + { + if (RoomLayout.tilesAdjecent(room.getLayout().getTile(this.getX(), this.getY()), client.getHabbo().getRoomUnit().getCurrentLocation())) + { + if (!this.getExtradata().equalsIgnoreCase("-1")) + { + FurnitureDiceRolledEvent event = (FurnitureDiceRolledEvent) Emulator.getPluginManager().fireEvent(new FurnitureDiceRolledEvent(this, client.getHabbo(), -1)); + + if (event.isCancelled()) + return; + + this.setExtradata("-1"); + room.updateItemState(this); + Emulator.getThreading().run(this); + + if (event.result > 0) + { + Emulator.getThreading().run(new RandomDiceNumber(room, this, event.result), 1500); + } + else + { + Emulator.getThreading().run(new RandomDiceNumber(this, room, this.getBaseItem().getStateCount()), 1500); + } + } + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectTile.java new file mode 100644 index 00000000..950fc53e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectTile.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionEffectTile extends InteractionDefault +{ + public InteractionEffectTile(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionEffectTile(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectToggle.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectToggle.java new file mode 100644 index 00000000..fa46011d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionEffectToggle.java @@ -0,0 +1,46 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboGender; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionEffectToggle extends InteractionDefault +{ + public InteractionEffectToggle(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionEffectToggle(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (this.getExtradata().isEmpty()) + { + this.setExtradata("0"); + } + + if (client != null) + { + if (room.hasRights(client.getHabbo())) + { + if (Integer.valueOf(this.getExtradata()) < this.getBaseItem().getStateCount() - 1) + { + if ((client.getHabbo().getHabboInfo().getGender() == HabboGender.M && client.getHabbo().getRoomUnit().getEffectId() == this.getBaseItem().getEffectM()) || + (client.getHabbo().getHabboInfo().getGender() == HabboGender.F && client.getHabbo().getRoomUnit().getEffectId() == this.getBaseItem().getEffectF())) + { + super.onClick(client, room, objects); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionExternalImage.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionExternalImage.java new file mode 100644 index 00000000..a2696b3c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionExternalImage.java @@ -0,0 +1,58 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionExternalImage extends HabboItem +{ + public InteractionExternalImage(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionExternalImage(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + } + + //{"t":10000000, "u":"http://arcturus.wf/camera/", "m":"idk", "s":1, "w":"http://arcturus.wf/camera/image.png"} +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFXBox.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFXBox.java new file mode 100644 index 00000000..5849e2fc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFXBox.java @@ -0,0 +1,65 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFXBox extends InteractionDefault +{ + public InteractionFXBox(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFXBox(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null && room.hasRights(client.getHabbo())) + { + if (client.getHabbo().getHabboInfo().getGender().equals(HabboGender.M)) + { + if (this.getBaseItem().getEffectM() > 0) + { + room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectM()); + } + } + + if (client.getHabbo().getHabboInfo().getGender().equals(HabboGender.F)) + { + if (this.getBaseItem().getEffectF() > 0) + { + room.giveEffect(client.getHabbo(), this.getBaseItem().getEffectF()); + } + } + + this.setExtradata("1"); + room.updateItemState(this); + room.removeHabboItem(this); + HabboItem item = this; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + new QueryDeleteHabboItem(item).run(); + room.sendComposer(new RemoveFloorItemComposer(item).compose()); + } + }, 500); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java new file mode 100644 index 00000000..e9f11a45 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFireworks extends HabboItem +{ + public InteractionFireworks(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFireworks(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return this.getBaseItem().allowWalk(); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + super.serializeExtradata(serverMessage); //Design flaw ;( + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if(client != null && this.getExtradata().equalsIgnoreCase("2")) //2 explodes I think (0 = empty, 1 = charged, 2 = effect) + { + AchievementManager.progressAchievement(client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FireworksCharger")); + } + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGate.java new file mode 100644 index 00000000..512b79d0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGate.java @@ -0,0 +1,87 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionGate extends HabboItem +{ + public InteractionGate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + public boolean isWalkable() + { + return this.getExtradata().equals("1"); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null && !room.hasRights(client.getHabbo()) && !(objects.length >= 2 && objects[1] instanceof WiredEffectType && objects[1] == WiredEffectType.TOGGLE_STATE)) + return; + + if(!room.getHabbosAt(this.getX(), this.getY()).isEmpty()) + return; + + if(this.getExtradata().length() == 0) + this.setExtradata("0"); + + this.setExtradata((Integer.valueOf(this.getExtradata()) + 1 ) % 2 + ""); + room.updateTile(room.getLayout().getTile(this.getX(), this.getY())); + this.needsUpdate(true); + room.updateItemState(this); + } + + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGift.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGift.java new file mode 100644 index 00000000..48016da8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGift.java @@ -0,0 +1,159 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionGift extends HabboItem +{ + private int[] itemId; + private int colorId = 0; + private int ribbonId = 0; + private boolean showSender = false; + private String message = ""; + private String sender = ""; + private String look = ""; + + public THashSet items = new THashSet(); + + public boolean explode = false; + + public InteractionGift(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + + try + { + this.loadData(); + } + catch (Exception e) + { + Emulator.getLogging().logDebugLine("Incorrect extradata for gift with ID " + this.getId()); + } + } + + public InteractionGift(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + try + { + this.loadData(); + } + catch (Exception e) + { + Emulator.getLogging().logDebugLine("Incorrect extradata for gift with ID " + this.getId()); + } + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + //serverMessage.appendInt(this.colorId * 1000 + this.ribbonId); + serverMessage.appendInt(1); + serverMessage.appendInt(6); + serverMessage.appendString("EXTRA_PARAM"); + serverMessage.appendString(""); + serverMessage.appendString("MESSAGE"); + serverMessage.appendString(this.message); + serverMessage.appendString("PURCHASER_NAME"); + serverMessage.appendString(this.showSender ? this.sender : ""); + serverMessage.appendString("PURCHASER_FIGURE"); + serverMessage.appendString(this.showSender ? this.look : ""); + serverMessage.appendString("PRODUCT_CODE"); + serverMessage.appendString(""); //this.gift.getItemId() + serverMessage.appendString("state"); + serverMessage.appendString(this.explode ? "1" : "0"); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + private void loadData() throws NumberFormatException + { + String[] data = null; + + if (this.getExtradata().contains("\t")) + data = this.getExtradata().split("\t"); + + if (data != null && data.length >= 5) + { + int count = Integer.valueOf(data[0]); + + this.itemId = new int[count]; + + for (int i = 0; i < count; i++) + { + this.itemId[i] = Integer.valueOf(data[i + 1]); + } + + this.colorId = Integer.valueOf(data[count + 1]); + this.ribbonId = Integer.valueOf(data[count + 2]); + this.showSender = data[count + 3].equalsIgnoreCase("1"); + this.message = data[count + 4]; + + if (data.length - count >= 7 && this.showSender) + { + this.sender = data[count + 5]; + this.look = data[count + 6]; + } + } else + { + this.itemId = new int[0]; + this.colorId = 0; + this.ribbonId = 0; + this.showSender = false; + this.message = "Please delete this present. Thanks!"; + } + + this.items.clear(); + for (int anItemId : itemId) + { + if (anItemId == 0) + continue; + + this.items.add(Emulator.getGameEnvironment().getItemManager().loadHabboItem(anItemId)); + } + } + + public int getColorId() + { + return colorId; + } + + public int getRibbonId() + { + return ribbonId; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildFurni.java new file mode 100644 index 00000000..624c5b27 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildFurni.java @@ -0,0 +1,127 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionGuildFurni extends HabboItem +{ + private int guildId; + + public InteractionGuildFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.guildId = set.getInt("guild_id"); + } + + public InteractionGuildFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.guildId = 0; + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.guildId); + + if(guild != null) + { + serverMessage.appendInt(2 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(5); + serverMessage.appendString(this.getExtradata()); + serverMessage.appendString(guild.getId() + ""); + serverMessage.appendString(guild.getBadge()); + serverMessage.appendString(Emulator.getGameEnvironment().getGuildManager().getSymbolColor(guild.getColorOne()).valueA); + serverMessage.appendString(Emulator.getGameEnvironment().getGuildManager().getBackgroundColor(guild.getColorTwo()).valueA); + + super.serializeExtradata(serverMessage); + } + else + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + if(this.isLimited()) + { + serverMessage.appendInt(10); + serverMessage.appendInt(100); + } + } + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return this.getBaseItem().allowWalk(); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (objects.length > 0) + { + if (objects[0] instanceof Integer && room != null) + { + if(this.getExtradata().length() == 0) + this.setExtradata("0"); + + if(this.getBaseItem().getStateCount() > 1) + { + this.setExtradata("" + (Integer.valueOf(this.getExtradata()) + 1) % this.getBaseItem().getStateCount()); + this.needsUpdate(true); + room.updateItemState(this); + } + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + public int getGuildId() + { + return this.guildId; + } + + public void setGuildId(int guildId) + { + this.guildId = guildId; + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildGate.java new file mode 100644 index 00000000..ed4f241d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGuildGate.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.threading.runnables.CloseGate; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionGuildGate extends InteractionGuildFurni +{ + public InteractionGuildGate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionGuildGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + if(roomUnit == null) + return false; + + Habbo habbo = room.getHabbo(roomUnit); + + return habbo != null && (habbo.getHabboStats().hasGuild(super.getGuildId()) || habbo.hasPermission("acc_guildgate")); + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + if(this.canWalkOn(roomUnit, room, objects)) + { + this.setExtradata("1"); + room.updateItemState(this); + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + Emulator.getThreading().run(new CloseGate(this, room), 500); + } + + @Override + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + this.setExtradata("0"); + room.updateItemState(this); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubGate.java new file mode 100644 index 00000000..9215c780 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubGate.java @@ -0,0 +1,88 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.generic.alerts.CustomNotificationComposer; +import com.eu.habbo.threading.runnables.CloseGate; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionHabboClubGate extends InteractionGate +{ + public InteractionHabboClubGate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionHabboClubGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + return habbo.getHabboStats().hasActiveClub(); + } + + return false; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + if(this.canWalkOn(roomUnit, room, objects)) + { + this.setExtradata("1"); + room.updateItemState(this); + } + else + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + habbo.getClient().sendResponse(new CustomNotificationComposer(CustomNotificationComposer.GATE_NO_HC)); + } + + roomUnit.setGoalLocation(roomUnit.getCurrentLocation()); + } + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(this.canWalkOn(client.getHabbo().getRoomUnit(), room, null)) + { + super.onClick(client, room, objects); + } + else + { + } + } + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + Emulator.getThreading().run(new CloseGate(this, room), 500); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubHopper.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubHopper.java new file mode 100644 index 00000000..bfbaaa17 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubHopper.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.outgoing.generic.alerts.CustomNotificationComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionHabboClubHopper extends InteractionHopper +{ + public InteractionHabboClubHopper(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionHabboClubHopper(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(client.getHabbo().getHabboStats().hasActiveClub()) + { + super.onClick(client, room, objects); + } + else + { + client.sendResponse(new CustomNotificationComposer(CustomNotificationComposer.HOPPER_NO_HC)); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubTeleportTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubTeleportTile.java new file mode 100644 index 00000000..4f4d6654 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHabboClubTeleportTile.java @@ -0,0 +1,36 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionHabboClubTeleportTile extends InteractionTeleportTile +{ + public InteractionHabboClubTeleportTile(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionHabboClubTeleportTile(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + return habbo.getHabboStats().hasActiveClub(); + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java new file mode 100644 index 00000000..7ebac4fd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java @@ -0,0 +1,122 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.hopper.HopperActionOne; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionHopper extends HabboItem +{ + public InteractionHopper(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionHopper(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if(room != null) + { + RoomTile loc = HabboItem.getSquareInFront(room.getLayout(), this); + if (loc != null) + { + if (canUseTeleport(client, loc, room)) + { + client.getHabbo().getRoomUnit().isTeleporting = true; + this.setExtradata("1"); + room.updateItemState(this); + + Emulator.getThreading().run(new HopperActionOne(this, room, client), 500); + } + else + { + client.getHabbo().getRoomUnit().setGoalLocation(loc); + } + } + } + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } + + @Override + public void run() + { + if(!this.getExtradata().equals("0")) + { + this.setExtradata("0"); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room != null) + { + room.updateItemState(this); + } + } + super.run(); + } + + private boolean canUseTeleport(GameClient client, RoomTile front, Room room) + { + if(client.getHabbo().getRoomUnit().getX() != front.x) + return false; + + if(client.getHabbo().getRoomUnit().getY() != front.y) + return false; + + if(client.getHabbo().getRoomUnit().isTeleporting) + return false; + + if(!room.getHabbosAt(this.getX(), this.getY()).isEmpty()) + return false; + + if(!this.getExtradata().equals("0")) + return false; + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionInformationTerminal.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionInformationTerminal.java new file mode 100644 index 00000000..5ed9c405 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionInformationTerminal.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionInformationTerminal extends InteractionCustomValues +{ + public static THashMap defaultValues = new THashMap() + { + {put("internalLink", "http://arcturus.wf");} + }; + + public InteractionInformationTerminal(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, defaultValues); + } + + public InteractionInformationTerminal(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, defaultValues); + } + + @Override + public void onPickUp(Room room) + { + values.clear(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionJukeBox.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionJukeBox.java new file mode 100644 index 00000000..9b1772d8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionJukeBox.java @@ -0,0 +1,94 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.list.array.TIntArrayList; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionJukeBox extends HabboItem +{ + public InteractionJukeBox(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionJukeBox(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null && objects.length == 1) + { + if ((Integer)objects[0] == 0) + { + if (room.getTraxManager().isPlaying()) + { + room.getTraxManager().stop(); + } else + { + room.getTraxManager().play(0); + } + } + } + } + + @Override + public void onPickUp(Room room) + { + super.onPickUp(room); + this.setExtradata("0"); + + if (room.getTraxManager().isPlaying() && room.getRoomSpecialTypes().getItemsOfType(InteractionJukeBox.class).isEmpty()) + { + room.getTraxManager().clearPlayList(); + } + } + + @Override + public void onPlace(Room room) + { + super.onPlace(room); + if (room.getTraxManager().isPlaying()) + { + this.setExtradata("1"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionLoveLock.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionLoveLock.java new file mode 100644 index 00000000..2c3ab558 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionLoveLock.java @@ -0,0 +1,140 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.lovelock.LoveLockFurniStartComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Calendar; + +public class InteractionLoveLock extends HabboItem +{ + public int userOneId; + public int userTwoId; + + public InteractionLoveLock(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionLoveLock(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(2 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(6); + + String[] data = this.getExtradata().split("\t"); + + if(data.length == 6) + { + serverMessage.appendString("1"); + serverMessage.appendString(data[1]); + serverMessage.appendString(data[2]); + serverMessage.appendString(data[3]); + serverMessage.appendString(data[4]); + serverMessage.appendString(data[5]); + } + else + { + serverMessage.appendString("0"); + serverMessage.appendString(""); + serverMessage.appendString(""); + serverMessage.appendString(""); + serverMessage.appendString(""); + serverMessage.appendString(""); + } + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(this.getExtradata().contains("\t")) + return; + + if(client == null) + return; + + if(RoomLayout.tilesAdjecent(client.getHabbo().getRoomUnit().getCurrentLocation(), room.getLayout().getTile(this.getX(), this.getY()))) + { + if(this.userOneId == 0) + { + this.userOneId = client.getHabbo().getHabboInfo().getId(); + client.sendResponse(new LoveLockFurniStartComposer(this)); + } + else + { + if(this.userOneId != client.getHabbo().getHabboInfo().getId()) + { + Habbo habbo = room.getHabbo(this.userOneId); + + if (habbo != null) + { + this.userTwoId = client.getHabbo().getHabboInfo().getId(); + } + } + } + } + } + + public boolean lock(Habbo userOne, Habbo userTwo, Room room) + { + RoomTile tile = room.getLayout().getTile(this.getX(), this.getY()); + if(RoomLayout.tilesAdjecent(userOne.getRoomUnit().getCurrentLocation(), tile) && RoomLayout.tilesAdjecent(userTwo.getRoomUnit().getCurrentLocation(), tile)) + { + String data = "1"; + data += "\t"; + data += userOne.getHabboInfo().getUsername(); + data += "\t"; + data += userTwo.getHabboInfo().getUsername(); + data += "\t"; + data += userOne.getHabboInfo().getLook(); + data += "\t"; + data += userTwo.getHabboInfo().getLook(); + data += "\t"; + data += Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + (Calendar.getInstance().get(Calendar.MONTH) + 1) + "-" + Calendar.getInstance().get(Calendar.YEAR); + + this.setExtradata(data); + this.needsUpdate(true); + Emulator.getThreading().run(this); + room.updateItem(this); + + return true; + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMannequin.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMannequin.java new file mode 100644 index 00000000..4747f07f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMannequin.java @@ -0,0 +1,118 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.users.UserDataComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionMannequin extends HabboItem +{ + public InteractionMannequin(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionMannequin(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(1 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(3); + if(this.getExtradata().split(":").length >= 2) + { + String[] data = this.getExtradata().split(":"); + serverMessage.appendString("GENDER"); + serverMessage.appendString(data[0].toLowerCase()); + serverMessage.appendString("FIGURE"); + serverMessage.appendString(data[1]); + serverMessage.appendString("OUTFIT_NAME"); + serverMessage.appendString((data.length >= 3 ? data[2] : "")); + } + else + { + serverMessage.appendString("GENDER"); + serverMessage.appendString("m"); + serverMessage.appendString("FIGURE"); + serverMessage.appendString(""); + serverMessage.appendString("OUTFIT_NAME"); + serverMessage.appendString("My Look"); + this.setExtradata("m: :My look"); + this.needsUpdate(true); + Emulator.getThreading().run(this); + } + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + String[] lookCode = this.getExtradata().split(":")[1].split("\\."); + + String look = ""; + for (String part : client.getHabbo().getHabboInfo().getLook().split("\\.")) + { + String type = part.split("-")[0]; + + boolean found = false; + for (String s : lookCode) + { + if (s.contains(type)) + { + found = true; + look += s + "."; + } + } + + if (!found) + { + look += part + "."; + } + } + + client.getHabbo().getHabboInfo().setLook(look.substring(0, look.length() - 1)); + room.sendComposer(new RoomUserDataComposer(client.getHabbo()).compose()); + client.sendResponse(new UserDataComposer(client.getHabbo())); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java new file mode 100644 index 00000000..b7a51423 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java @@ -0,0 +1,58 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionMonsterPlantSeed extends HabboItem +{ + public InteractionMonsterPlantSeed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionMonsterPlantSeed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + client.sendResponse(new GenericAlertComposer("We're in the progress of implementing monster plants.\r\n Stay tuned!\r-Arcturus Emulator")); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMoodLight.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMoodLight.java new file mode 100644 index 00000000..a422993c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMoodLight.java @@ -0,0 +1,70 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomMoodlightData; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionMoodLight extends HabboItem +{ + public InteractionMoodLight(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionMoodLight(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onPlace(Room room) + { + if(room != null) + { + for (RoomMoodlightData data : room.getMoodlightData().valueCollection()) + { + if (data.isEnabled()) + { + this.setExtradata(data.toString()); + this.needsUpdate(true); + room.updateItem(this); + Emulator.getThreading().run(this); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java new file mode 100644 index 00000000..f0e1f2c5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java @@ -0,0 +1,187 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUnitType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.UpdateStackHeightComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionMultiHeight extends HabboItem +{ + public InteractionMultiHeight(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + public InteractionMultiHeight(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + @Override + public boolean isWalkable() + { + return this.getBaseItem().allowWalk() || this.getBaseItem().allowSit(); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null) + { + if (!room.hasRights(client.getHabbo()) && !(objects.length >= 2 && objects[1] instanceof WiredEffectType && objects[1] == WiredEffectType.TOGGLE_STATE)) + return; + } + + if (objects.length > 0) + { + if (objects[0] instanceof Integer && room != null) + { + this.needsUpdate(true); + + if(this.getExtradata().length() == 0) + this.setExtradata("0"); + + if(this.getBaseItem().getMultiHeights().length > 0) + { + this.setExtradata("" + (Integer.valueOf(this.getExtradata()) + 1) % (this.getBaseItem().getMultiHeights().length)); + this.needsUpdate(true); + room.updateItemState(this); + room.sendComposer(new UpdateStackHeightComposer(this.getX(), this.getY(), this.getBaseItem().getMultiHeights()[Integer.valueOf(this.getExtradata())] * 256.0D).compose()); + } + + if(this.isWalkable()) + { + THashSet habbos = room.getHabbosOnItem(this); + THashSet updatedUnits = new THashSet(); + for (Habbo habbo : habbos) + { + if(habbo.getRoomUnit() == null) + continue; + + if(habbo.getRoomUnit().getStatus().containsKey("mv")) + continue; + + if (this.getBaseItem().getMultiHeights().length >= 0) + { + if (this.getBaseItem().allowSit()) + { + habbo.getRoomUnit().getStatus().put("sit", this.getBaseItem().getMultiHeights()[(this.getExtradata().isEmpty() ? 0 : Integer.valueOf(this.getExtradata()) % (this.getBaseItem().getMultiHeights().length))] * 1.0D + ""); + } + else + { + habbo.getRoomUnit().setZ(this.getZ() + this.getBaseItem().getMultiHeights()[(this.getExtradata().isEmpty() ? 0 : Integer.valueOf(this.getExtradata()) % (this.getBaseItem().getMultiHeights().length))]); + } + } + + updatedUnits.add(habbo.getRoomUnit()); + } + room.sendComposer(new RoomUserStatusComposer(updatedUnits, true).compose()); + } + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) + { + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + if (roomUnit != null) + { + if (this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) + { + if (roomUnit.getRoomUnitType().equals(RoomUnitType.USER)) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() > 0 && habbo.getRoomUnit().getEffectId() != this.getBaseItem().getEffectM()) + { + room.giveEffect(habbo, this.getBaseItem().getEffectM()); + return; + } + + if (habbo.getHabboInfo().getGender().equals(HabboGender.F) && this.getBaseItem().getEffectF() > 0 && habbo.getRoomUnit().getEffectId() != this.getBaseItem().getEffectF()) + { + room.giveEffect(habbo, this.getBaseItem().getEffectF()); + return; + } + } + } + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + if (roomUnit != null) + { + if (this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) + { + if (roomUnit.getRoomUnitType().equals(RoomUnitType.USER)) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (habbo.getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() > 0) + { + room.giveEffect(habbo, 0); + return; + } + + if (habbo.getHabboInfo().getGender().equals(HabboGender.F) && this.getBaseItem().getEffectF() > 0) + { + room.giveEffect(habbo, 0); + return; + } + } + } + } + } + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMusicDisc.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMusicDisc.java new file mode 100644 index 00000000..0485f098 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMusicDisc.java @@ -0,0 +1,99 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxMySongsComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionMusicDisc extends HabboItem +{ + private int songId; + private boolean inQueue; + + public InteractionMusicDisc(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + + String[] stuff = this.getExtradata().split("\n"); + + if(stuff.length >= 7) + { + this.songId = Integer.valueOf(stuff[6]); + } + } + + public InteractionMusicDisc(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + String[] stuff = this.getExtradata().split("\n"); + + if(stuff.length >= 7) + { + this.songId = Integer.valueOf(stuff[6]); + } + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + public int getSongId() + { + return songId; + } + + @Override + public void onPlace(Room room) + { + super.onPlace(room); + + room.sendComposer(new JukeBoxMySongsComposer(room.getTraxManager().myList()).compose()); + } + + @Override + public void onPickUp(Room room) + { + super.onPickUp(room); + + room.getTraxManager().removeSong(this.getId()); + } + + public boolean inQueue() + { + return this.inQueue; + } + + public void inQueue(boolean inQueue) + { + this.inQueue = inQueue; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java new file mode 100644 index 00000000..694e116d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java @@ -0,0 +1,46 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import gnu.trove.map.hash.THashMap; + +import java.awt.*; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionMuteArea extends InteractionCustomValues +{ + public static THashMap defaultValues = new THashMap() + { + {put("tilesLeft", "0");} + {put("tilesRight", "0");} + {put("tilesFront", "0");} + {put("tilesBack", "0");} + }; + + public InteractionMuteArea(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, defaultValues); + } + + public InteractionMuteArea(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, defaultValues); + } + + public boolean inSquare(RoomTile location) + { + try + { + return new Rectangle( + this.getX() - Integer.valueOf(this.values.get("tilesBack")), + this.getY() + Integer.valueOf(this.values.get("tilesLeft")) - (Integer.valueOf(this.values.get("tilesLeft")) + Integer.valueOf(this.values.get("tilesRight"))), + Integer.valueOf(this.values.get("tilesLeft")) + Integer.valueOf(this.values.get("tilesRight")) + 1, + Integer.valueOf(this.values.get("tilesFront")) + Integer.valueOf(this.values.get("tilesBack")) + 1).contains(location.x, location.y); + } + catch (Exception e) + { + return false; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java new file mode 100644 index 00000000..ac962117 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java @@ -0,0 +1,98 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionNest extends HabboItem +{ + public InteractionNest(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionNest(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return this.getBaseItem().allowWalk(); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + AbstractPet pet = room.getPet(roomUnit); + + if(pet != null && pet instanceof Pet) + { + if(pet instanceof HorsePet) + { + if(((HorsePet) pet).getRider() != null) + return; + } + + if(pet.getPetData().haveNest(this)) + { + if (pet.getEnergy() <= 85) + { + ((Pet) pet).setTask(PetTasks.NEST); + pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getX(), this.getY())); + pet.getRoomUnit().getStatus().clear(); + pet.getRoomUnit().getStatus().remove("mv"); + pet.getRoomUnit().getStatus().put("lay", room.getStackHeight(this.getX(), this.getY(), false) + ""); + room.sendComposer(new RoomUserStatusComposer(roomUnit).compose()); + } + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java new file mode 100644 index 00000000..52ef07c8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java @@ -0,0 +1,181 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionObstacle extends HabboItem +{ + public InteractionObstacle(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionObstacle(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + AbstractPet pet = room.getPet(roomUnit); + + if (pet != null && pet instanceof HorsePet) + { + HorsePet horsePet = (HorsePet)pet; + + if (horsePet == null) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null && habbo.getHabboInfo().getRiding() != null) + { + return true; + } + + return false; + } + else + return horsePet.getRider() != null; + } + + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + { + AbstractPet pet = room.getPet(roomUnit); + + if(pet != null && pet instanceof HorsePet && ((HorsePet) pet).getRider() != null) + { + if (((HorsePet) pet).getTask() != null && ((HorsePet) pet).getTask().equals(PetTasks.RIDE)) + { + if (pet.getRoomUnit().getStatus().containsKey("jmp")) + { + pet.getRoomUnit().getStatus().remove("jmp"); + Emulator.getThreading().run(new HabboItemNewState(this, room, "0"), 2000); + } else + { + int state = 0; + for (int i = 0; i < 2; i++) + { + state = Emulator.getRandom().nextInt(4) + 1; + + if (state == 4) + break; + } + + this.setExtradata(state + ""); + pet.getRoomUnit().getStatus().put("jmp", "0"); + + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("HorseConsecutiveJumpsCount")); + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("HorseJumping")); + } + + room.updateItemState(this); + } + } + } + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + { + AbstractPet pet = room.getPet(roomUnit); + + if(pet != null && pet instanceof HorsePet && ((HorsePet) pet).getRider() != null) + { + if (roomUnit.getBodyRotation().getValue() % 2 == 0) + { + if (this.getRotation() == 2) + { + if(roomUnit.getBodyRotation().equals(RoomUserRotation.WEST)) + { + ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile((short) (roomUnit.getX() - 3), roomUnit.getY())); + } + else if(roomUnit.getBodyRotation().equals(RoomUserRotation.EAST)) + { + ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile((short) (roomUnit.getX() + 3), roomUnit.getY())); + } + } + else if(this.getRotation() == 4) + { + if(roomUnit.getBodyRotation().equals(RoomUserRotation.NORTH)) + { + ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile(roomUnit.getX(), (short) (roomUnit.getY() - 3))); + } + else if(roomUnit.getBodyRotation().equals(RoomUserRotation.SOUTH)) + { + ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile(roomUnit.getX(), (short) (roomUnit.getY() + 3))); + } + } + } + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + { + AbstractPet pet = room.getPet(roomUnit); + + if(pet != null && pet instanceof HorsePet && ((HorsePet) pet).getRider() != null) + { + pet.getRoomUnit().getStatus().remove("jmp"); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java new file mode 100644 index 00000000..ee008faf --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java @@ -0,0 +1,145 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.messages.outgoing.unknown.ItemStateComposer2; +import com.eu.habbo.threading.runnables.HabboItemNewState; +import com.eu.habbo.threading.runnables.OneWayGateActionOne; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionOneWayGate extends HabboItem +{ + private int roomUnitID = 0; + public InteractionOneWayGate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionOneWayGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return roomUnit.getId() == roomUnitID; + } + + @Override + public boolean isWalkable() + { + return this.roomUnitID != 0; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + if(this.getExtradata().length() == 0) + { + this.setExtradata("0"); + this.needsUpdate(true); + } + + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onClick(final GameClient client, final Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null) + { + RoomTile tile = room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), this.getRotation()); + RoomTile gatePosition = room.getLayout().getTile(getX(), getY()); + + if (tile != null && tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) + { + if (!room.hasHabbosAt(this.getX(), this.getY()) && roomUnitID == 0) + { + HabboItem item = this; + + room.sendComposer(new ItemStateComposer2(getId(), 1).compose()); + room.scheduledTasks.add(new Runnable() + { + @Override + public void run() + { + roomUnitID = client.getHabbo().getRoomUnit().getId(); + room.updateTile(gatePosition); + client.getHabbo().getRoomUnit().setGoalLocation(room.getLayout().getTileInFront(room.getLayout().getTile(getX(), getY()), getRotation() + 4)); + } + }); + } + } + } + } + + private void refresh(Room room) + { + this.setExtradata("0"); + this.roomUnitID = 0; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + room.sendComposer(new ItemStateComposer2(getId(), 0).compose()); + } + }, 500); + room.updateTile(room.getLayout().getTile(this.getX(), this.getY())); + } + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + refresh(room); + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + refresh(room); + } + + @Override + public void onPlace(Room room) + { + super.onPlace(room); + refresh(room); + } + + @Override + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + super.onMove(room, oldLocation, newLocation); + refresh(room); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java new file mode 100644 index 00000000..727c0156 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java @@ -0,0 +1,109 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.pets.breeding.PetBreedingResultComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPetBreedingNest extends HabboItem +{ + public AbstractPet petOne = null; + public AbstractPet petTwo = null; + + public InteractionPetBreedingNest(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPetBreedingNest(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return room.getPet(roomUnit) != null && !this.boxFull(); + } + + @Override + public boolean isWalkable() + { + return true; + } + + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + AbstractPet pet = room.getPet(roomUnit); + + if (pet != null) + { + if (!boxFull()) + { + this.addPet(pet); + + if (boxFull()) + { + Habbo ownerPetOne = room.getHabbo(petOne.getUserId()); + Habbo ownerPetTwo = room.getHabbo(petTwo.getUserId()); + + if (ownerPetOne != null && ownerPetTwo != null) + { + ownerPetTwo.getClient().sendResponse(new PetBreedingResultComposer(0, this.petOne, ownerPetOne.getHabboInfo().getUsername(), this.petTwo, ownerPetTwo.getHabboInfo().getUsername())); + } + } + } + } + } + + public boolean addPet(AbstractPet pet) + { + if (this.petOne == null) + { + this.petOne = pet; + return true; + } + else if (this.petTwo == null && this.petOne != pet) + { + this.petTwo = pet; + return true; + } + + return false; + } + + public boolean boxFull() + { + return this.petOne != null && this.petTwo != null; + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java new file mode 100644 index 00000000..1417320d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java @@ -0,0 +1,106 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.PetClearPosture; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPetDrink extends HabboItem +{ + public InteractionPetDrink(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPetDrink(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit client, Room room, Object[] objects) throws Exception + { + super.onWalkOn(client, room, objects); + + AbstractPet pet = room.getPet(client); + + if(pet != null && pet instanceof Pet) + { + if(pet.getPetData().haveDrinkItem(this)) + { + if (((Pet) pet).levelThirst >= 35) + { + ((Pet) pet).setTask(PetTasks.EAT); + pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getX(), this.getY())); + pet.getRoomUnit().setRotation(RoomUserRotation.values()[this.getRotation()]); + pet.getRoomUnit().getStatus().clear(); + pet.getRoomUnit().getStatus().remove("mv"); + pet.getRoomUnit().getStatus().put("eat", "0"); + ((Pet) pet).addThirst(-75); + room.sendComposer(new RoomUserStatusComposer(client).compose()); + Emulator.getThreading().run(new PetClearPosture((Pet)pet, "eat", null, true), 500); + + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(pet.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("PetFeeding"), 75); + } + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java new file mode 100644 index 00000000..eb5b33d8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java @@ -0,0 +1,105 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.PetEatAction; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPetFood extends HabboItem +{ + public InteractionPetFood(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPetFood(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit client, Room room, Object[] objects) throws Exception + { + super.onWalkOn(client, room, objects); + + if(this.getExtradata().length() == 0) + this.setExtradata("0"); + + AbstractPet pet = room.getPet(client); + + if(pet != null && pet instanceof Pet) + { + if(pet.getPetData().haveFoodItem(this)) + { + if (((Pet) pet).levelHunger >= 35) + { + ((Pet) pet).setTask(PetTasks.EAT); + pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getX(), this.getY())); + pet.getRoomUnit().setRotation(RoomUserRotation.values()[this.getRotation()]); + pet.getRoomUnit().getStatus().clear(); + pet.getRoomUnit().getStatus().remove("mv"); + pet.getRoomUnit().getStatus().put("eat", "0"); + room.sendComposer(new RoomUserStatusComposer(client).compose()); + Emulator.getThreading().run(new PetEatAction((Pet) pet, this)); + } + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java new file mode 100644 index 00000000..99f9a832 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java @@ -0,0 +1,114 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.PetClearPosture; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPetToy extends HabboItem +{ + public InteractionPetToy(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPetToy(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onWalkOn(RoomUnit client, Room room, Object[] objects) throws Exception + { + super.onWalkOn(client, room, objects); + + AbstractPet pet = room.getPet(client); + + if(pet != null && pet instanceof Pet) + { + if (pet.getEnergy() <= 35) + { + return; + } + + ((Pet) pet).setTask(PetTasks.PLAY); + pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getX(), this.getY())); + pet.getRoomUnit().setRotation(RoomUserRotation.values()[this.getRotation()]); + pet.getRoomUnit().getStatus().clear(); + pet.getRoomUnit().getStatus().remove("mv"); + pet.getRoomUnit().getStatus().put("pla", "0"); + ((Pet) pet).packetUpdate = true; + HabboItem item = this; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + pet.addHappyness(25); + item.setExtradata("0"); + room.updateItem(item); + new PetClearPosture((Pet)pet, "pla", null, true).run();; + } + }, 2500 + (Emulator.getRandom().nextInt(20) * 500)); + this.setExtradata("1"); + room.updateItemState(this); + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + AbstractPet pet = room.getPet(roomUnit); + + if (pet != null && pet instanceof Pet) + { + this.setExtradata("0"); + room.updateItemState(this); + } + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPostIt.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPostIt.java new file mode 100644 index 00000000..5ae987d1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPostIt.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPostIt extends HabboItem +{ + public InteractionPostIt(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPostIt(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata().replace(((char)9 ) + "", "")); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPoster.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPoster.java new file mode 100644 index 00000000..0e2702c5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPoster.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPoster extends HabboItem +{ + public InteractionPoster(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + public InteractionPoster(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPressurePlate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPressurePlate.java new file mode 100644 index 00000000..20474ac4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPressurePlate.java @@ -0,0 +1,79 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPressurePlate extends InteractionDefault +{ + public InteractionPressurePlate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPressurePlate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + this.setExtradata("1"); + room.updateItemState(this); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + this.setExtradata("0"); + room.updateItemState(this); + } + + @Override + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + this.setExtradata("0"); + room.updateItemState(this); + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPushable.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPushable.java new file mode 100644 index 00000000..72ef0a78 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPushable.java @@ -0,0 +1,298 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.threading.runnables.KickBallAction; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionPushable extends InteractionDefault +{ + /** + * Currently running Runnable for this item. + */ + private KickBallAction currentThread; + + public InteractionPushable(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPushable(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalkOff(RoomUnit roomUnit, final Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + + if(!(currentThread == null || currentThread.dead)) + { + currentThread = null; + return; + } + + int velocity = this.getWalkOffVelocity(roomUnit, room); + RoomUserRotation direction = this.getWalkOffDirection(roomUnit, room); + this.onKick(room, roomUnit, velocity, direction); + + if(velocity > 0) + { + if(currentThread != null) + currentThread.dead = true; + + currentThread = new KickBallAction(this, room, roomUnit, direction, velocity); + Emulator.getThreading().run(currentThread, 0); + } + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if(RoomLayout.tilesAdjecent(client.getHabbo().getRoomUnit().getCurrentLocation(), room.getLayout().getTile(this.getX(), this.getY()))) + { + int velocity = this.getTackleVelocity(client.getHabbo().getRoomUnit(), room); + RoomUserRotation direction = this.getWalkOnDirection(client.getHabbo().getRoomUnit(), room); + this.onTackle(room, client.getHabbo().getRoomUnit(), velocity, direction); + + if(velocity > 0) + { + if(currentThread != null) + currentThread.dead = true; + + currentThread = new KickBallAction(this, room, client.getHabbo().getRoomUnit(), direction, velocity); + Emulator.getThreading().run(currentThread, 0); + } + } + } + + @Override + public void onWalkOn(RoomUnit roomUnit, final Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + int velocity; + RoomUserRotation direction; + + if(this.getX() == roomUnit.getGoal().x && this.getY() == roomUnit.getGoal().y) //User clicked on the tile the ball is on, they want to kick it + { + velocity = this.getWalkOnVelocity(roomUnit, room); + direction = this.getWalkOnDirection(roomUnit, room); + this.onKick(room, roomUnit, velocity, direction); + } + else //User is walking past the ball, they want to drag it with them + { + velocity = this.getDragVelocity(roomUnit, room); + direction = this.getDragDirection(roomUnit, room); + this.onDrag(room, roomUnit, velocity, direction); + } + + if(velocity > 0) + { + if(currentThread != null) + currentThread.dead = true; + + currentThread = new KickBallAction(this, room, roomUnit, direction, velocity); + Emulator.getThreading().run(currentThread, 0); + } + } + + /** + * Gets the velocity of the item when a Habbo kicks the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return The item's new velocity + */ + public abstract int getWalkOnVelocity(RoomUnit roomUnit, Room room); + + /** + * Gets the direction the item should start moving in when a Habbo kicks the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return Direction that the item should start moving in + */ + public abstract RoomUserRotation getWalkOnDirection(RoomUnit roomUnit, Room room); + + /** + * Gets the velocity of the item when a Habbo walks off the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return The item's new velocity + */ + public abstract int getWalkOffVelocity(RoomUnit roomUnit, Room room); + + /** + * Gets the direction the item should start moving in when a Habbo walks off the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return Direction that the item should start moving in + */ + public abstract RoomUserRotation getWalkOffDirection(RoomUnit roomUnit, Room room); + + /** + * Gets the velocity of the item when a Habbo drags the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return The item's new velocity + */ + public abstract int getDragVelocity(RoomUnit roomUnit, Room room); + + /** + * Gets the direction the item should start moving in when a Habbo drags the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return Direction that the item should start moving in + */ + public abstract RoomUserRotation getDragDirection(RoomUnit roomUnit, Room room); + + /** + * Gets the velocity of the item when a Habbo tackles the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return The item's new velocity + */ + public abstract int getTackleVelocity(RoomUnit roomUnit, Room room); + + /** + * Gets the direction the item should start moving in when a Habbo tackles the item + * + * @param roomUnit The Habbo that initiated the event + * @param room The room this event happened in + * @return Direction that the item should start moving in + */ + public abstract RoomUserRotation getTackleDirection(RoomUnit roomUnit, Room room); + + /** + * Gets the delay till the next move of the item in milliseconds. + * + * @param currentStep The current step of the move sequence + * @param totalSteps The total number of steps to complete the move sequence + * @return Time in milliseconds till the next move of the item + */ + public abstract int getNextRollDelay(int currentStep, int totalSteps); //The length in milliseconds when the ball should next roll + + /** + * Gets the new direction of the item when it cannot move any further. + * + * @param room The room this event happened in + * @param currentDirection The current direction of the item + * @return New direction of the item + */ + public abstract RoomUserRotation getBounceDirection(Room room, RoomUserRotation currentDirection); //Returns the new direction to move the ball when the ball cannot move + + /** + * Checks if the next move is allowed. + * + * @param room The room this event happened in + * @param from The current coordinate of the item + * @param to The coordinate the item wishes to move to + * @return Is this move allowed? + */ + public abstract boolean validMove(Room room, RoomTile from, RoomTile to); //Checks if the next move is valid + + /** + * Triggered when a Habbo drags a pushable item. + * + * @param room The room that this event happened in + * @param roomUnit The Habbo that initiated the event + * @param velocity The new velocity of the item + * @param direction The direction the item is moving in + */ + public abstract void onDrag(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction); + + /** + * Triggered when a Habbo kicks a pushable item. + * + * @param room The room that this event happened in + * @param roomUnit The Habbo that initiated the event + * @param velocity The new velocity of the item + * @param direction The direction the item is moving in + */ + public abstract void onKick(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction); + + /** + * Triggered when a Habbo tackles the ball (double clicks). + * + * @param room The room that this event happened in + * @param roomUnit The Habbo that initiated the event + * @param velocity The new velocity of the item + * @param direction The direction the item is moving in + */ + public abstract void onTackle(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction); + + /** + * Triggered when an item is moved due to a kick, drag or tackle. + * State changes should be executed here + * + * @param room The room that the event happened in + * @param from The old coordinate of the item + * @param to The new coordinate of the item + * @param direction The direction the item is moving in + * @param kicker The Habbo which initiated the move of the item + * @param nextRoll The delay till the next move of the item + * @param currentStep The current step of the move sequence + * @param totalSteps The total number of steps to complete the move sequence + */ + public abstract void onMove(Room room, RoomTile from, RoomTile to, RoomUserRotation direction, RoomUnit kicker, int nextRoll, int currentStep, int totalSteps); + + /** + * Triggered when an item cannot move any further and has changed it's direction. + * + * @param room The room that the event happened in + * @param oldDirection The old direction of the item + * @param newDirection The new direction of the item + * @param kicker The Habbo which initiated the move of the item + */ + public abstract void onBounce(Room room, RoomUserRotation oldDirection, RoomUserRotation newDirection, RoomUnit kicker); + + /** + * Triggered when an item stops moving + * + * @param room The room that the event happened in + * @param kicker The Habbo which initiated the move of the item + * @param currentStep The current step of the move sequence + * @param totalSteps The total number of steps to complete the move sequence + */ + public abstract void onStop(Room room, RoomUnit kicker, int currentStep, int totalSteps); + + /** + * Checks if the item is still allowed to move. If not, the ball will stop. + * + * @param room The room that the event happened in + * @param from The old coordinate of the item + * @param to The new coordinate of the item + * @param direction The direction the item is moving in + * @param kicker The Habbo which initiated the move of the item + * @param nextRoll The delay till the next move of the item + * @param currentStep The current step of the move sequence + * @param totalSteps The total number of steps to complete the move sequence + * @return Can the item still move? + */ + public abstract boolean canStillMove(Room room, RoomTile from, RoomTile to, RoomUserRotation direction, RoomUnit kicker, int nextRoll, int currentStep, int totalSteps); +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java new file mode 100644 index 00000000..b7a2152e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java @@ -0,0 +1,100 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPuzzleBox extends HabboItem +{ + public InteractionPuzzleBox(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPuzzleBox(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(client.getHabbo().getRoomUnit().getStatus().containsKey("mv")) + return; + + if(!RoomLayout.tilesAdjecent(room.getLayout().getTile(super.getX(), super.getY()), client.getHabbo().getRoomUnit().getCurrentLocation())) + return; + + + RoomTile boxLocation = room.getLayout().getTile(this.getX(), this.getY()); + client.getHabbo().getRoomUnit().lookAtPoint(boxLocation); + room.sendComposer(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); + + switch (client.getHabbo().getRoomUnit().getBodyRotation()) + { + case NORTH_EAST: + case NORTH_WEST: + case SOUTH_EAST: + case SOUTH_WEST: + return; + } + + RoomTile tile = room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), client.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (tile == null || !room.tileWalkable(tile)) + { + return; + } + + double offset = room.getStackHeight(tile.x, tile.y, false) - this.getZ(); + + if(!boxLocation.equals(room.getLayout().getTileInFront(client.getHabbo().getRoomUnit().getCurrentLocation(), client.getHabbo().getRoomUnit().getBodyRotation().getValue()))) + return; + + HabboItem item = room.getTopItemAt(tile.x, tile.y); + + if(item == null || (item.getZ() <= this.getZ() && item.getBaseItem().allowWalk())) + { + room.scheduledComposers.add(new FloorItemOnRollerComposer(this, null, tile, offset, room).compose()); + client.getHabbo().getRoomUnit().setGoalLocation(boxLocation); + this.needsUpdate(true); + } + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPyramid.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPyramid.java new file mode 100644 index 00000000..b025f757 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPyramid.java @@ -0,0 +1,57 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionPyramid extends InteractionGate +{ + private int nextChange; + + public InteractionPyramid(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionPyramid(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + public void change(Room room) + { + if(!(this.getExtradata().equals("0") || this.getExtradata().equals("1"))) + this.setExtradata("0"); + + if(room != null) + { + if(room.getHabbosAt(this.getX(), this.getY()).isEmpty()) + { + int state = Integer.valueOf(this.getExtradata()); + state = Math.abs(state - 1); + + this.setExtradata(state + ""); + room.updateItemState(this); + + this.nextChange = Emulator.getIntUnixTimestamp() + 1 + (Emulator.getRandom().nextInt(Emulator.getConfig().getInt("pyramids.max.delay"))); + } + } + } + + public int getNextChange() + { + return this.nextChange; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java new file mode 100644 index 00000000..300a4037 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java @@ -0,0 +1,314 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.rentablespaces.RentableSpaceInfoComposer; +import com.eu.habbo.threading.runnables.ClearRentedSpace; +import gnu.trove.set.hash.THashSet; + +import java.awt.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionRentableSpace extends HabboItem +{ + private int renterId; + private String renterName; + private int endTimestamp; + + public InteractionRentableSpace(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + + String[] data = set.getString("extra_data").split(":"); + + this.renterName = "Unknown"; + + if(data.length == 2) + { + this.renterId = Integer.valueOf(data[0]); + this.endTimestamp = Integer.valueOf(data[1]); + + if(this.renterId > 0) + { + if(this.isRented()) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.renterId); + + if (habbo != null) + { + this.renterName = habbo.getHabboInfo().getUsername(); + } else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT username FROM users WHERE id = ? LIMIT 1")) + { + statement.setInt(1, this.renterId); + try (ResultSet row = statement.executeQuery()) + { + if (row.next()) + { + this.renterName = row.getString("username"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + else + { + if(this.getRoomId() > 0) + { + Emulator.getThreading().run(new ClearRentedSpace(this, Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()))); + this.renterId = 0; + } + } + } + } + } + + public InteractionRentableSpace(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + this.renterName = ""; + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + if(this.getExtradata().isEmpty()) + return false; + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return true; + + if(habbo.getHabboInfo().getId() == room.getId()) + return true; + + if(this.endTimestamp > Emulator.getIntUnixTimestamp()) + { + if (this.renterId > 0 && this.renterId == habbo.getHabboInfo().getId()) + return true; + } + + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + this.sendRentWidget(client.getHabbo()); + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + if(this.getExtradata().isEmpty()) + this.setExtradata("0:0"); + + serverMessage.appendInt(1 + (this.isLimited() ? 256 : 0)); + + if(this.isRented()) + { + serverMessage.appendInt(1); + serverMessage.appendString("renterId"); + serverMessage.appendString(this.renterId + ""); + } + else + { + serverMessage.appendInt(0); + } + + super.serializeExtradata(serverMessage); + } + + public void rent(Habbo habbo) + { + if(this.isRented()) + return; + + if(!habbo.getHabboStats().canRentSpace()) + return; + + if(habbo.getHabboInfo().getCredits() < this.rentCost()) + return; + + if(habbo.getHabboStats().getClubExpireTimestamp() < Emulator.getIntUnixTimestamp()) + return; + + this.setRenterId(habbo.getHabboInfo().getId()); + this.setRenterName(habbo.getHabboInfo().getUsername()); + this.setEndTimestamp(Emulator.getIntUnixTimestamp() + (7 * 86400)); + + habbo.getHabboStats().setRentedItemId(this.getId()); + habbo.getHabboStats().setRentedTimeEnd(this.endTimestamp); + } + + public void endRent() + { + this.setEndTimestamp(0); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return; + + Rectangle rect = RoomLayout.getRectangle(this.getX(), this.getY(), this.getBaseItem().getWidth(), this.getBaseItem().getLength(), this.getRotation()); + + THashSet items = new THashSet(); + for(int i = rect.x; i < rect.x + rect.getWidth(); i++) + { + for(int j = rect.y; j < rect.y + rect.getHeight(); j++) + { + items.addAll(room.getItemsAt(i, j, this.getZ())); + } + } + + for(HabboItem item : items) + { + if(item.getUserId() == this.renterId) + { + room.pickUpItem(item, null); + } + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.renterId); + + if(habbo != null) + { + habbo.getHabboStats().setRentedItemId(0); + habbo.getHabboStats().setRentedTimeEnd(0); + } + else + { + int zero = 0; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_settings SET rent_space_id = ?, rent_space_endtime = ? WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, zero); + statement.setInt(2, zero); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + //room.ejectUserFurni(this.renterId); + + this.setRenterId(0); + this.setRenterName(""); + } + + @Override + public String getExtradata() + { + return this.renterId + ":" + this.endTimestamp; + } + + public int getRenterId() + { + return this.renterId; + } + + public void setRenterId(int renterId) + { + this.renterId = renterId; + } + + public String getRenterName() + { + return this.renterName; + } + + public void setRenterName(String renterName) + { + this.renterName = renterName; + } + + public int getEndTimestamp() + { + return this.endTimestamp; + } + + public void setEndTimestamp(int endTimestamp) + { + this.endTimestamp = endTimestamp; + } + + public boolean isRented() + { + return this.endTimestamp > Emulator.getIntUnixTimestamp(); + } + + public int rentCost() + { + String[] data = this.getBaseItem().getName().replace("hblooza_spacerent", "").split("x"); + + if(data.length == 2) + { + int x = Integer.valueOf(data[0]); + int y = Integer.valueOf(data[1]); + + return 10 * (x * y); + } + + return 1337; + } + + public int getRentErrorCode(Habbo habbo) + { + if(this.isRented() && this.renterId != habbo.getHabboInfo().getId()) + { + return RentableSpaceInfoComposer.SPACE_ALREADY_RENTED; + } + + if(!habbo.getHabboStats().canRentSpace() && habbo.getHabboStats().getRentedItemId() != this.getId()) + { + return RentableSpaceInfoComposer.CAN_RENT_ONLY_ONE_SPACE; + } + + if(habbo.getHabboStats().getClubExpireTimestamp() < Emulator.getIntUnixTimestamp()) + { + return RentableSpaceInfoComposer.CANT_RENT_NO_HABBO_CLUB; + } + + if(this.rentCost() > habbo.getHabboInfo().getCredits()) + { + return RentableSpaceInfoComposer.NOT_ENOUGH_CREDITS; + } + + return 0; + } + + public void sendRentWidget(Habbo habbo) + { + habbo.getClient().sendResponse(new RentableSpaceInfoComposer(habbo, this, this.getRentErrorCode(habbo))); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoller.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoller.java new file mode 100644 index 00000000..f9698b63 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoller.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionRoller extends HabboItem +{ + public InteractionRoller(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionRoller(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomAds.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomAds.java new file mode 100644 index 00000000..df89eeb3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomAds.java @@ -0,0 +1,43 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionRoomAds extends InteractionCustomValues +{ + public final static THashMap defaultValues = new THashMap() + { + {put("imageUrl", "http://arcturus.wf");} + {put("clickUrl", "http://arcturus.wf");} + {put("offsetX", "0");} + {put("offsetY", "0");} + {put("offsetZ", "0");} + }; + + public InteractionRoomAds(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, defaultValues); + } + + public InteractionRoomAds(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, defaultValues); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomOMatic.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomOMatic.java new file mode 100644 index 00000000..f5cecd98 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRoomOMatic.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.outgoing.navigator.OpenRoomCreationWindowComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionRoomOMatic extends InteractionDefault +{ + public InteractionRoomOMatic(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionRoomOMatic(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client != null) + { + client.sendResponse(new OpenRoomCreationWindowComposer()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStackHelper.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStackHelper.java new file mode 100644 index 00000000..2998027c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStackHelper.java @@ -0,0 +1,50 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionStackHelper extends HabboItem +{ + public InteractionStackHelper(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionStackHelper(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStickyPole.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStickyPole.java new file mode 100644 index 00000000..00adb4fd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionStickyPole.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionStickyPole extends InteractionDefault +{ + public InteractionStickyPole(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionStickyPole(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java new file mode 100644 index 00000000..f73f9211 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java @@ -0,0 +1,34 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionSwitch extends InteractionDefault +{ + public InteractionSwitch(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionSwitch(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canToggle(Habbo habbo, Room room) + { + return super.canToggle(habbo, room) || RoomLayout.tilesAdjecent(room.getLayout().getTile(this.getX(), this.getY()), habbo.getRoomUnit().getCurrentLocation()); + } + + @Override + public boolean allowWiredResetState() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTalkingFurniture.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTalkingFurniture.java new file mode 100644 index 00000000..cf83680d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTalkingFurniture.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionTalkingFurniture extends InteractionDefault +{ + public InteractionTalkingFurniture(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionTalkingFurniture(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java new file mode 100644 index 00000000..0edaaf2d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java @@ -0,0 +1,218 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.unknown.ItemStateComposer2; +import com.eu.habbo.threading.runnables.RoomUnitTeleportWalkToAction; +import com.eu.habbo.threading.runnables.teleport.TeleportActionOne; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Set; + +public class InteractionTeleport extends HabboItem +{ + private int targetId; + private int targetRoomId; + private int roomUnitID = 0; + + public InteractionTeleport(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionTeleport(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return this.getBaseItem().allowWalk() || roomUnit.getId() == roomUnitID; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if(room != null && client != null && objects.length <= 1) + { + /*client.getHabbo().getRoomUnit().cmdTeleport = false; + this.roomUnitId + RoomTile loc = room.getLayout().getTile(this.getX(), this.getY()); + if (loc.equals(room.getLayout().getDoorTile())) + return; + + /*if (!this.getBaseItem().allowWalk()) + { + loc = HabboItem.getSquareInFront(room.getLayout(), this); + } + + if (loc != null) + { + + else + { + client.getHabbo().getRoomUnit().setGoalLocation(loc); + Emulator.getThreading().run(new RoomUnitTeleportWalkToAction(client.getHabbo(), this, room), client.getHabbo().getRoomUnit().getPath().size() + 2 * 510); + } + }*/ + + super.onClick(client, room, objects); + + RoomTile tile = room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), this.getRotation()); + RoomTile teleportPosition = room.getLayout().getTile(getX(), getY()); + + if (tile != null && tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) + { + if (!room.hasHabbosAt(this.getX(), this.getY()) && this.roomUnitID == 0) + { + room.sendComposer(new ItemStateComposer2(getId(), 1).compose()); + room.scheduledTasks.add(new Runnable() + { + @Override + public void run() + { + roomUnitID = client.getHabbo().getRoomUnit().getId(); + room.updateTile(teleportPosition); + client.getHabbo().getRoomUnit().setGoalLocation(room.getLayout().getTile(getX(), getY())); + } + }); + } + } + else if (teleportPosition.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) + { + startTeleport(room, client.getHabbo()); + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null && habbo.getRoomUnit().getId() == this.roomUnitID) + { + if (habbo.getRoomUnit().getGoal().equals(room.getLayout().getTile(this.getX(), this.getY()))) + { + startTeleport(room, habbo); + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + @Override + public void run() + { + if(!this.getExtradata().equals("0")) + { + this.setExtradata("0"); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room != null) + { + room.updateItem(this); + } + } + super.run(); + } + + @Override + public void onPickUp(Room room) + { + this.targetId = 0; + this.targetRoomId = 0; + this.setExtradata("0"); + } + + private boolean canUseTeleport(GameClient client, Room room) + { + if(!this.getExtradata().equals("0")) + return false; + + if(client.getHabbo().getRoomUnit().isTeleporting) + return false; + + if (client.getHabbo().getRoomUnit().getCurrentLocation().is(this.getX(), this.getY())) + return true; + + return true; + } + + public int getTargetId() + { + return this.targetId; + } + + public void setTargetId(int targetId) + { + this.targetId = targetId; + } + + public int getTargetRoomId() + { + return this.targetRoomId; + } + + public void setTargetRoomId(int targetRoomId) + { + this.targetRoomId = targetRoomId; + } + + @Override + public boolean allowWiredResetState() + { + return false; + } + + public void startTeleport(Room room, Habbo habbo) + { + if (this.canUseTeleport(habbo.getClient(), room)) + { + this.roomUnitID = 0; + habbo.getRoomUnit().isTeleporting = true; + //new TeleportInteraction(room, client, this).run(); + this.setExtradata("1"); + room.updateItem(this); + room.scheduledTasks.add(new TeleportActionOne(this, room, habbo.getClient())); + } + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java new file mode 100644 index 00000000..2f1e6021 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java @@ -0,0 +1,34 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.teleport.TeleportActionOne; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionTeleportTile extends InteractionTeleport +{ + public InteractionTeleportTile(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionTeleportTile(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTileEffectProvider.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTileEffectProvider.java new file mode 100644 index 00000000..9231f5c1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTileEffectProvider.java @@ -0,0 +1,71 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionTileEffectProvider extends InteractionCustomValues +{ + public static THashMap defaultValues = new THashMap() + { + {put("effectId", "0");} + }; + + public InteractionTileEffectProvider(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, defaultValues); + } + + public InteractionTileEffectProvider(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, defaultValues); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalkOn(RoomUnit roomUnit, final Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + int effectId = Integer.valueOf(this.values.get("effectId")); + + if(roomUnit.getEffectId() == effectId) + { + effectId = 0; + } + + this.values.put("state", "1"); + room.updateItem(this); + + final InteractionTileEffectProvider proxy = this; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + proxy.values.put("state", "0"); + room.updateItem(proxy); + } + }, 500); + + roomUnit.setEffectId(effectId); + room.sendComposer(new RoomUserEffectComposer(roomUnit).compose()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java new file mode 100644 index 00000000..a7a9890d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java @@ -0,0 +1,68 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionTrophy extends HabboItem +{ + public InteractionTrophy(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionTrophy(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java new file mode 100644 index 00000000..3b519c63 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java @@ -0,0 +1,135 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem; +import com.eu.habbo.threading.runnables.RoomUnitVendingMachineAction; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.util.pathfinding.Rotation; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionVendingMachine extends HabboItem +{ + public InteractionVendingMachine(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionVendingMachine(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if (client != null) + { + RoomTile tile = getSquareInFront(room.getLayout(), this); + + if (tile != null) + { + if (tile.equals(client.getHabbo().getRoomUnit().getCurrentLocation())) + { + if (this.getExtradata().equals("0") || this.getExtradata().length() == 0) + { + room.updateHabbo(client.getHabbo()); + if (!client.getHabbo().getRoomUnit().getStatus().containsKey("sit")) + { + client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[Rotation.Calculate(client.getHabbo().getRoomUnit().getX(), client.getHabbo().getRoomUnit().getY(), this.getX(), this.getY())]); + client.getHabbo().getRoomUnit().getStatus().remove("mv"); + room.scheduledComposers.add(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); + } + this.setExtradata("1"); + room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); + Emulator.getThreading().run(this, 1000); + Emulator.getThreading().run(new RoomUnitGiveHanditem(client.getHabbo().getRoomUnit(), room, this.getBaseItem().getRandomVendingItem())); + } + } + else + { + if (!tile.isWalkable()) + { + for (RoomTile t : room.getLayout().getTilesAround(room.getLayout().getTile(this.getX(), this.getY()))) + { + if (t != null && t.isWalkable()) + { + tile = t; + break; + } + } + } + client.getHabbo().getRoomUnit().setGoalLocation(tile); + Emulator.getThreading().run(new RoomUnitVendingMachineAction(client.getHabbo(), this, room), client.getHabbo().getRoomUnit().getPath().size() + 2 * 510); + } + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void run() + { + super.run(); + if(this.getExtradata().equals("1")) + { + this.setExtradata("0"); + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room != null) + { + room.updateItem(this); + } + } + } + + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVikingCotie.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVikingCotie.java new file mode 100644 index 00000000..d16ebf05 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVikingCotie.java @@ -0,0 +1,60 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionVikingCotie extends InteractionDefault +{ + public InteractionVikingCotie(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionVikingCotie(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(this.getExtradata().isEmpty()) + { + this.setExtradata("0"); + } + + if (client.getHabbo().getHabboInfo().getId() == this.getUserId()) + { + if (client.getHabbo().getRoomUnit().getEffectId() == 5) + { + int state = Integer.valueOf(this.getExtradata()); + + if (state < 5) + { + state++; + this.setExtradata(state + ""); + room.updateItem(this); + + if (state == 5) + { + AchievementManager.progressAchievement(client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("ViciousViking")); + } + } + } + } + + super.onClick(client, room, objects); + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWater.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWater.java new file mode 100644 index 00000000..06a63142 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWater.java @@ -0,0 +1,160 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionWater extends InteractionDefault +{ + public InteractionWater(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionWater(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + this.recalculate(room); + } + + @Override + public void onPickUp(Room room) + { + this.recalculate(room); + } + + @Override + public void onPlace(Room room) + { + this.recalculate(room); + } + + public void refreshWaters(Room room) + { + if(room == null) + { + room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + } + + int _1 = 0; + int _2 = 0; + int _3 = 0; + int _4 = 0; + int _5 = 0; + int _6 = 0; + int _7 = 0; + int _8 = 0; + int _9 = 0; + int _10 = 0; + int _11 = 0; + int _12 = 0; + + for(HabboItem item : room.getRoomSpecialTypes().getItemsOfType(InteractionWaterItem.class)) + { + ((InteractionWaterItem) item).update(); + } + + if (room.waterTiles.containsKey(this.getX() - 1) && room.waterTiles.get(this.getX() - 1).contains(this.getY() - 1)) _1 = 1; + if (room.waterTiles.containsKey(this.getX() ) && room.waterTiles.get(this.getX() ).contains(this.getY() - 1)) _2 = 1; + if (room.waterTiles.containsKey(this.getX() + 1) && room.waterTiles.get(this.getX() + 1).contains(this.getY() - 1)) _3 = 1; + if (room.waterTiles.containsKey(this.getX() + 2) && room.waterTiles.get(this.getX() + 2).contains(this.getY() - 1)) _4 = 1; + if (room.waterTiles.containsKey(this.getX() - 1) && room.waterTiles.get(this.getX() - 1).contains(this.getY() )) _5 = 1; + if (room.waterTiles.containsKey(this.getX() + 2) && room.waterTiles.get(this.getX() + 2).contains(this.getY() )) _6 = 1; + if (room.waterTiles.containsKey(this.getX() - 1) && room.waterTiles.get(this.getX() - 1).contains(this.getY() + 1)) _7 = 1; + if (room.waterTiles.containsKey(this.getX() + 2) && room.waterTiles.get(this.getX() + 2).contains(this.getY() + 1)) _8 = 1; + if (room.waterTiles.containsKey(this.getX() - 1) && room.waterTiles.get(this.getX() - 1).contains(this.getY() + 2)) _9 = 1; + if (room.waterTiles.containsKey(this.getX() ) && room.waterTiles.get(this.getX() ).contains(this.getY() + 2)) _10 = 1; + if (room.waterTiles.containsKey(this.getX() + 1) && room.waterTiles.get(this.getX() + 1).contains(this.getY() + 2)) _11 = 1; + if (room.waterTiles.containsKey(this.getX() + 2) && room.waterTiles.get(this.getX() + 2).contains(this.getY() + 2)) _12 = 1; + + if (_2 == 0 && !room.getLayout().tileWalkable(this.getX() , (short) (this.getY() - 1))) _2 = 1; + if (_3 == 0 && !room.getLayout().tileWalkable((short) (this.getX() + 1), (short) (this.getY() - 1))) _3 = 1; + if (_5 == 0 && !room.getLayout().tileWalkable((short) (this.getX() - 1), this.getY() )) _5 = 1; + if (_6 == 0 && !room.getLayout().tileWalkable((short) (this.getX() + 2), this.getY() )) _6 = 1; + if (_7 == 0 && !room.getLayout().tileWalkable((short) (this.getX() - 1), (short) (this.getY() + 1))) _7 = 1; + if (_8 == 0 && !room.getLayout().tileWalkable((short) (this.getX() + 2), (short) (this.getY() + 1))) _8 = 1; + if (_10 == 0 && !room.getLayout().tileWalkable(this.getX() , (short) (this.getY() + 2))) _10 = 1; + if (_11 == 0 && !room.getLayout().tileWalkable((short) (this.getX() + 1), (short) (this.getY() + 2))) _11 = 1; + + int result = 0; + result |= _1 << 11; + result |= _2 << 10; + result |= _3 << 9; + result |= _4 << 8; + result |= _5 << 7; + result |= _6 << 6; + result |= _7 << 5; + result |= _8 << 4; + result |= _9 << 3; + result |= _10 << 2; + result |= _11 << 1; + result |= _12 ; + + this.setExtradata(result + ""); + this.needsUpdate(true); + room.updateItem(this); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + AbstractPet pet = room.getPet(roomUnit); + + if (pet != null) + { + if(pet instanceof Pet) + { + pet.getRoomUnit().getStatus().put("dip", "0"); + } + } + } + + private void recalculate(Room room) + { + THashMap tiles = new THashMap(); + + for (HabboItem item : room.getRoomSpecialTypes().getItemsOfType(InteractionWater.class)) + { + for (int i = 0; i < item.getBaseItem().getLength(); i++) + { + for (int j = 0; j < item.getBaseItem().getWidth(); j++) + { + if (!tiles.containsKey(item.getX() + i)) + { + tiles.put(item.getX() + i, new TIntArrayList()); + } + + tiles.get(item.getX() + i).add(item.getY() + j); + } + } + } + + room.waterTiles = tiles; + + for (HabboItem item : room.getRoomSpecialTypes().getItemsOfType(InteractionWater.class)) + { + ((InteractionWater)item).refreshWaters(room); + } + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWaterItem.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWaterItem.java new file mode 100644 index 00000000..9a73e86f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWaterItem.java @@ -0,0 +1,82 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.set.hash.THashSet; + +import java.awt.*; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionWaterItem extends InteractionDefault +{ + public InteractionWaterItem(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionWaterItem(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onPlace(Room room) + { + this.update(); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + this.needsUpdate(true); + } + + @Override + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + this.update(); + } + + public void update() + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return; + + Rectangle rectangle = RoomLayout.getRectangle(this.getX(), this.getY(), this.getBaseItem().getWidth(), this.getBaseItem().getLength(), this.getRotation()); + + for(int x = rectangle.x; x < rectangle.getWidth() + rectangle.x; x++) + { + for(int y = rectangle.y; y < rectangle.getHeight() + rectangle.y; y++) + { + THashSet items = room.getItemsAt(room.getLayout().getTile(this.getX(), this.getY())); + + for(HabboItem item : items) + { + if(item instanceof InteractionWater) + { + this.setExtradata("1"); + room.updateItem(this); + return; + } + } + } + } + + this.setExtradata("0"); + room.updateItem(this); + } + + @Override + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWired.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWired.java new file mode 100644 index 00000000..343b1a1e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWired.java @@ -0,0 +1,104 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.ItemStateComposer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionWired extends HabboItem +{ + InteractionWired(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + InteractionWired(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + public abstract boolean execute(RoomUnit roomUnit, Room room, Object[] stuff); + + protected abstract String getWiredData(); + + public abstract void serializeWiredData(ServerMessage message, Room room); + + public abstract void loadWiredData(ResultSet set, Room room) throws SQLException; + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } + + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void run() + { + if(this.needsUpdate()) + { + String wiredData = this.getWiredData(); + + if (wiredData == null) + { + wiredData = ""; + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE items SET wired_data = ? WHERE id = ?")) + { + if(this.getRoomId() != 0) + { + statement.setString(1, wiredData); + } + else + { + statement.setString(1, ""); + } + statement.setInt(2, this.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + super.run(); + } + + @Override + public void onPickUp(Room room) + { + onPickUp(); + } + + public abstract void onPickUp(); + + public void activateBox(Room room) + { + this.setExtradata(this.getExtradata().equals("1") ? "0" : "1"); + room.sendComposer(new ItemStateComposer(this).compose()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredCondition.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredCondition.java new file mode 100644 index 00000000..6fd30412 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredCondition.java @@ -0,0 +1,73 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.outgoing.wired.WiredConditionDataComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionWiredCondition extends InteractionWired +{ + public InteractionWiredCondition(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionWiredCondition(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client != null) + { + if (room.hasRights(client.getHabbo())) + { + client.sendResponse(new WiredConditionDataComposer(this, room)); + this.activateBox(room); + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + public abstract WiredConditionType getType(); + + public abstract boolean saveData(ClientMessage packet); + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredEffect.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredEffect.java new file mode 100644 index 00000000..24a3e224 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredEffect.java @@ -0,0 +1,128 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.outgoing.wired.WiredEffectDataComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionWiredEffect extends InteractionWired +{ + private int delay; + private long cooldown; + + public InteractionWiredEffect(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionWiredEffect(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client != null) + { + if (room.hasRights(client.getHabbo())) + { + client.sendResponse(new WiredEffectDataComposer(this, room)); + this.activateBox(room); + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + /** + * Checks if the cooldown has passed and updates it to the new cooldown. + * @param newMillis The new timestamp the wired was executed. + * @return True if the wired can be executed. + */ + public boolean canExecute(long newMillis) + { + if (newMillis - this.cooldown < this.requiredCooldown()) + { + this.cooldown = newMillis; + return false; + } + + this.cooldown = newMillis; + return true; + } + public abstract boolean saveData(ClientMessage packet, GameClient gameClient); + + /** + * Sets the delay of execution. + * @param value The delay of execution. + */ + protected void setDelay(int value) + { + this.delay = value; + } + + /** + * @return The delay of execution. + */ + public int getDelay() + { + return this.delay; + } + + /** + * @return The type of the wired trigger. + */ + public abstract WiredEffectType getType(); + + /** + * @return The delay between two activations. + */ + protected long requiredCooldown() + { + return 500; + } + + /** + * @return Returns true if the InteractionWiredEffect can only be executed + * if there is a RoomUnit triggering the wired. + */ + public boolean requiresTriggeringUser() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredExtra.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredExtra.java new file mode 100644 index 00000000..cde34021 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredExtra.java @@ -0,0 +1,46 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionWiredExtra extends InteractionWired +{ + protected InteractionWiredExtra(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + protected InteractionWiredExtra(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client != null) + { + if (room.hasRights(client.getHabbo())) + { + this.activateBox(room); + } + } + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredHighscore.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredHighscore.java new file mode 100644 index 00000000..4f8d8cef --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredHighscore.java @@ -0,0 +1,202 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHighscoreClearType; +import com.eu.habbo.habbohotel.wired.WiredHighscoreData; +import com.eu.habbo.habbohotel.wired.WiredHighscoreScoreType; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionWiredHighscore extends HabboItem +{ + public WiredHighscoreScoreType scoreType; + public WiredHighscoreClearType clearType; + + private THashSet data; + private int lastUpdate; + + public InteractionWiredHighscore(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + + this.scoreType = WiredHighscoreScoreType.CLASSIC; + this.clearType = WiredHighscoreClearType.ALLTIME; + + try + { + String name = this.getBaseItem().getName().split("_")[1].toUpperCase().split("\\*")[0]; + int ctype = Integer.valueOf(this.getBaseItem().getName().split("\\*")[1]) - 1; + this.scoreType = WiredHighscoreScoreType.valueOf(name); + this.clearType = WiredHighscoreClearType.values()[ctype]; + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + if(this.getRoomId() > 0) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + this.reloadData(room); + } + } + } + + public InteractionWiredHighscore(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + this.scoreType = WiredHighscoreScoreType.CLASSIC; + this.clearType = WiredHighscoreClearType.ALLTIME; + + try + { + String name = this.getBaseItem().getName().split("_")[1].toUpperCase().split("\\*")[0]; + int ctype = Integer.valueOf(this.getBaseItem().getName().split("\\*")[1]) - 1; + this.scoreType = WiredHighscoreScoreType.valueOf(name); + this.clearType = WiredHighscoreClearType.values()[ctype]; + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(this.getExtradata() == null || this.getExtradata().isEmpty() || this.getExtradata().length() == 0) + { + this.setExtradata("0"); + } + + try + { + int state = Integer.valueOf(this.getExtradata()); + this.setExtradata(Math.abs(state - 1) + ""); + this.reloadData(room); + room.updateItem(this); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + /* + + FUCK OFF + */ + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt(6); + serverMessage.appendString(this.getExtradata()); + serverMessage.appendInt(this.scoreType.type); //score type + serverMessage.appendInt(this.clearType.type); //clear type + + if(this.getRoomId() == 0) + { + serverMessage.appendInt(0); + } + else + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + { + serverMessage.appendInt(0); + } + else + { + if(Emulator.getIntUnixTimestamp() - this.lastUpdate > 60 * 60) + { + this.reloadData(room); + } + + if(this.data != null) + { + serverMessage.appendInt(this.data.size()); //count + + for (WiredHighscoreData dataSet : this.data) + { + if (this.scoreType == WiredHighscoreScoreType.PERTEAM) + { + serverMessage.appendInt(dataSet.teamScore); //Team score + } else if (dataSet.usernames.length == 1) + { + serverMessage.appendInt(dataSet.score); + } else + { + serverMessage.appendInt(dataSet.totalScore); + } + + serverMessage.appendInt(dataSet.usernames.length); //Users count + + for (String codeDragon : dataSet.usernames) + { + serverMessage.appendString(codeDragon); + } + } + } + else + { + serverMessage.appendInt(0); + } + } + } + + super.serializeExtradata(serverMessage); + } + + @Override + public void onPlace(Room room) + { + this.reloadData(room); + } + + @Override + public void onPickUp(Room room) + { + if (this.data != null) + { + this.data.clear(); + } + this.lastUpdate = 0; + } + + private void reloadData(Room room) + { + this.data = room.getWiredHighscoreData(this.scoreType, this.clearType); + this.lastUpdate = Emulator.getIntUnixTimestamp(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredTrigger.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredTrigger.java new file mode 100644 index 00000000..cbc066f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionWiredTrigger.java @@ -0,0 +1,90 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.outgoing.wired.WiredTriggerDataComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionWiredTrigger extends InteractionWired +{ + private int delay; + + protected InteractionWiredTrigger(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + protected InteractionWiredTrigger(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client != null) + { + if (room.hasRights(client.getHabbo())) + { + client.sendResponse(new WiredTriggerDataComposer(this, room)); + this.activateBox(room); + } + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + public abstract WiredTriggerType getType(); + + public abstract boolean saveData(ClientMessage packet); + + protected void setDelay(int value) + { + this.delay = value; + } + + protected int getDelay() + { + return this.delay; + } + + public boolean isTriggeredByRoomUnit() + { + return false; + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionYoutubeTV.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionYoutubeTV.java new file mode 100644 index 00000000..a00690dc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionYoutubeTV.java @@ -0,0 +1,56 @@ +package com.eu.habbo.habbohotel.items.interactions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionYoutubeTV extends HabboItem +{ + public InteractionYoutubeTV(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionYoutubeTV(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + if(this.getExtradata().length() == 0) + this.setExtradata(""); + + serverMessage.appendInt(1 + (this.isLimited() ? 256 : 0)); + serverMessage.appendInt(1); + serverMessage.appendString("THUMBNAIL_URL"); + serverMessage.appendString(Emulator.getConfig().getValue("imager.url.youtube").replace("%video%", Emulator.getGameEnvironment().getItemManager().getYoutubeManager().getPreviewImage(this.getBaseItem()))); + + super.serializeExtradata(serverMessage); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameGate.java new file mode 100644 index 00000000..ddca2a55 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameGate.java @@ -0,0 +1,44 @@ +package com.eu.habbo.habbohotel.items.interactions.games; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionGameGate extends InteractionGameTeamItem +{ + public InteractionGameGate(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + public InteractionGameGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameScoreboard.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameScoreboard.java new file mode 100644 index 00000000..cfad891b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameScoreboard.java @@ -0,0 +1,37 @@ +package com.eu.habbo.habbohotel.items.interactions.games; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionGameScoreboard extends InteractionGameTeamItem +{ + protected InteractionGameScoreboard(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + protected InteractionGameScoreboard(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTeamItem.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTeamItem.java new file mode 100644 index 00000000..268aba05 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTeamItem.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.items.interactions.games; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.HabboItem; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionGameTeamItem extends HabboItem +{ + public final GameTeamColors teamColor; + + protected InteractionGameTeamItem(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem); + + this.teamColor = teamColor; + } + + protected InteractionGameTeamItem(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + this.teamColor = teamColor; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTimer.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTimer.java new file mode 100644 index 00000000..cf0c946a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/InteractionGameTimer.java @@ -0,0 +1,210 @@ +package com.eu.habbo.habbohotel.items.interactions.games; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.wired.WiredGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionGameTimer extends HabboItem +{ + private int baseTime = 0; + + protected InteractionGameTimer(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + + String[] data = set.getString("extra_data").split("\t"); + + if (data.length >= 2) + { + this.baseTime = Integer.valueOf(data[1]); + } + + if (data.length >= 1) + { + this.setExtradata(data[0]); + } + } + + protected InteractionGameTimer(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } + + @Override + public void onPlace(Room room) + { + this.baseTime = 30; + this.setExtradata("30"); + room.updateItem(this); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client != null) + { + if (!(room.hasRights(client.getHabbo()) || client.getHabbo().hasPermission("acc_anyroomowner"))) + return; + } + + if(this.getExtradata().isEmpty()) + { + this.setExtradata("0"); + } + + Game game = room.getGame(WiredGame.class); + + if (game == null) + { + game = (this.getGameType().cast(room.getGame(this.getGameType()))); + } + + if ((objects.length >= 2 && objects[1] instanceof WiredEffectType)) + { + if (game.isRunning) + return; + } + + if(objects.length >= 1 && objects[0] instanceof Integer && client != null) + { + int state = (Integer)objects[0]; + + switch (state) + { + case 1: + { + startGame(room); + break; + } + + case 2: + { + increaseTimer(room); + } + break; + + case 3: + { + stopGame(room); + } + break; + } + } + else + { + + if (game != null && !game.isRunning) + { + this.startGame(room); + } + } + + super.onClick(client, room, objects); + } + + private void startGame(Room room) + { + this.needsUpdate(true); + try + { + this.setExtradata(this.baseTime + ""); + + room.updateItem(this); + + Game game = (this.getGameType().cast(room.getGame(this.getGameType()))); + + if (game == null) + { + game = this.getGameType().getDeclaredConstructor(Room.class).newInstance(room); + room.addGame(game); + } + + if (!game.isRunning) + { + game.initialise(); + } + else + { + game.stop(); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + private void stopGame(Room room) + { + this.needsUpdate(true); + Game game = (this.getGameType().cast(room.getGame(this.getGameType()))); + + if(game != null && game.isRunning) + { + game.stop(); + } + + room.updateItem(this); + } + + private void increaseTimer(Room room) + { + Game game = (this.getGameType().cast(room.getGame(this.getGameType()))); + + if(game != null && game.isRunning) + { + return; + } + + this.needsUpdate(true); + switch(this.baseTime) + { + case 0: this.baseTime = 30; break; + case 30: this.baseTime = 60; break; + case 60: this.baseTime = 120; break; + case 120: this.baseTime = 180; break; + case 180: this.baseTime = 300; break; + case 300: this.baseTime = 600; break; + //case 600: this.baseTime = 0; break; + + default: + this.baseTime = 30; + } + + this.setExtradata(this.baseTime + ""); + + room.updateItem(this); + } + + @Override + public String getDatabaseExtraData() + { + return this.getExtradata() + "\t" + this.baseTime; + } + + public abstract Class getGameType(); +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiSphere.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiSphere.java new file mode 100644 index 00000000..1bf15a3d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiSphere.java @@ -0,0 +1,49 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiSphere extends HabboItem +{ + public InteractionBattleBanzaiSphere(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBattleBanzaiSphere(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java new file mode 100644 index 00000000..db86c1ae --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java @@ -0,0 +1,89 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.BanzaiRandomTeleport; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiTeleporter extends HabboItem +{ + public InteractionBattleBanzaiTeleporter(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBattleBanzaiTeleporter(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + this.setExtradata("1"); + HabboItem target = room.getRoomSpecialTypes().getRandomTeleporter(); + + while (target == this && room.getRoomSpecialTypes().getBanzaiTeleporters().size() > 1) + target = room.getRoomSpecialTypes().getRandomTeleporter(); + + target.setExtradata("1"); + room.updateItem(this); + room.updateItem(target); + roomUnit.setGoalLocation(room.getLayout().getTile(roomUnit.getX(), roomUnit.getY())); + roomUnit.setCanWalk(false); + Emulator.getThreading().run(new BanzaiRandomTeleport(this, target, habbo, room), 500); + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOff(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTile.java new file mode 100644 index 00000000..a676cd45 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTile.java @@ -0,0 +1,121 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai; + +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiTile extends HabboItem +{ + public InteractionBattleBanzaiTile(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBattleBanzaiTile(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + if(this.getExtradata().isEmpty()) + this.setExtradata("0"); + + int state = Integer.valueOf(this.getExtradata()); + + if(state % 3 == 2) + return; + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return; + + if(this.isLocked()) + return; + + if(habbo.getHabboInfo().getCurrentGame() != null && habbo.getHabboInfo().getCurrentGame().equals(BattleBanzaiGame.class)) + { + BattleBanzaiGame game = ((BattleBanzaiGame)room.getGame(BattleBanzaiGame.class)); + + if(game == null) + return; + + if(!game.isRunning) + return; + + + int check = state - (habbo.getHabboInfo().getGamePlayer().getTeamColor().type * 3); + if(check == 3 || check == 4) + { + state++; + + if(state % 3 == 2) + { + habbo.getHabboInfo().getGamePlayer().addScore(BattleBanzaiGame.POINTS_LOCK_TILE); + game.tileLocked(habbo.getHabboInfo().getGamePlayer().getTeamColor(), this, habbo); + } + else + { + habbo.getHabboInfo().getGamePlayer().addScore(BattleBanzaiGame.POINTS_FILL_TILE); + } + } + else + { + state = (habbo.getHabboInfo().getGamePlayer().getTeamColor().type * 3) + 3; + + habbo.getHabboInfo().getGamePlayer().addScore(BattleBanzaiGame.POINTS_HIJACK_TILE); + } + + game.refreshCounters(habbo.getHabboInfo().getGamePlayer().getTeamColor()); + this.setExtradata(state + ""); + room.updateItem(this); + } + + } + + public boolean isLocked() + { + if(this.getExtradata().isEmpty()) + return false; + + return Integer.valueOf(this.getExtradata()) % 3 == 2; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTimer.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTimer.java new file mode 100644 index 00000000..fff7871e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTimer.java @@ -0,0 +1,48 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiTimer extends InteractionGameTimer +{ + public InteractionBattleBanzaiTimer(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBattleBanzaiTimer(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public Class getGameType() + { + return BattleBanzaiGame.class; + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGate.java new file mode 100644 index 00000000..0b3d28a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGate.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGamePlayer; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGameTeam; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameGate; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiGate extends InteractionGameGate +{ + public InteractionBattleBanzaiGate(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + public InteractionBattleBanzaiGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return room.getGame(BattleBanzaiGame.class) == null || !((BattleBanzaiGame)room.getGame(BattleBanzaiGame.class)).isRunning; + } + + @Override + public boolean isWalkable() + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + return false; + + return (this.getExtradata() == null || this.getExtradata().isEmpty() || Integer.valueOf(this.getExtradata()) < 5) && ((room.getGame(BattleBanzaiGame.class))) == null || !((BattleBanzaiGame)(room.getGame(BattleBanzaiGame.class))).isRunning; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + //TODO: Move to upper class + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + BattleBanzaiGame game = (BattleBanzaiGame) room.getGame(BattleBanzaiGame.class); + + if(game == null) + { + game = BattleBanzaiGame.class.getDeclaredConstructor(Room.class).newInstance(room); + room.addGame(game); + } + + GameTeam team = game.getTeamForHabbo(room.getHabbo(roomUnit)); + + if(team != null) + { + game.removeHabbo(room.getHabbo(roomUnit)); + } + else + { + if(this.getExtradata().isEmpty()) + { + this.setExtradata("0"); + } + + int value = Integer.valueOf(this.getExtradata()) + 1; + + this.setExtradata(value + ""); + room.updateItem(this); + game.addHabbo(room.getHabbo(roomUnit), this.teamColor); + } + + super.onWalkOn(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateBlue.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateBlue.java new file mode 100644 index 00000000..c9f2ddde --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateBlue.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiGateBlue extends InteractionBattleBanzaiGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.BLUE; + + public InteractionBattleBanzaiGateBlue(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiGateBlue(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateGreen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateGreen.java new file mode 100644 index 00000000..8884a79a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateGreen.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiGateGreen extends InteractionBattleBanzaiGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.GREEN; + + public InteractionBattleBanzaiGateGreen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiGateGreen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateRed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateRed.java new file mode 100644 index 00000000..52394503 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateRed.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiGateRed extends InteractionBattleBanzaiGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.RED; + + public InteractionBattleBanzaiGateRed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiGateRed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateYellow.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateYellow.java new file mode 100644 index 00000000..b37e176a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/gates/InteractionBattleBanzaiGateYellow.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiGateYellow extends InteractionBattleBanzaiGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.YELLOW; + + public InteractionBattleBanzaiGateYellow(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiGateYellow(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboard.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboard.java new file mode 100644 index 00000000..04d7e731 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboard.java @@ -0,0 +1,41 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameScoreboard; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiScoreboard extends InteractionGameScoreboard +{ + public InteractionBattleBanzaiScoreboard(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + public InteractionBattleBanzaiScoreboard(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardBlue.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardBlue.java new file mode 100644 index 00000000..9862d9f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardBlue.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiScoreboardBlue extends InteractionBattleBanzaiScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.BLUE; + + public InteractionBattleBanzaiScoreboardBlue(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiScoreboardBlue(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardGreen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardGreen.java new file mode 100644 index 00000000..f0f9f5d2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardGreen.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiScoreboardGreen extends InteractionBattleBanzaiScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.GREEN; + + public InteractionBattleBanzaiScoreboardGreen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiScoreboardGreen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardRed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardRed.java new file mode 100644 index 00000000..c598b6c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardRed.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiScoreboardRed extends InteractionBattleBanzaiScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.RED; + + public InteractionBattleBanzaiScoreboardRed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiScoreboardRed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardYellow.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardYellow.java new file mode 100644 index 00000000..759caa8d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/scoreboards/InteractionBattleBanzaiScoreboardYellow.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBattleBanzaiScoreboardYellow extends InteractionBattleBanzaiScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.YELLOW; + + public InteractionBattleBanzaiScoreboardYellow(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionBattleBanzaiScoreboardYellow(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootball.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootball.java new file mode 100644 index 00000000..e9f74dc4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootball.java @@ -0,0 +1,251 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.games.football.FootballGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionPushable; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTeamItem; +import com.eu.habbo.habbohotel.items.interactions.games.football.goals.InteractionFootballGoal; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.rooms.RoomTileState; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.ItemStateComposer; +import com.eu.habbo.util.pathfinding.Rotation; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootball extends InteractionPushable +{ + public InteractionFootball(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFootball(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + // Velocity + + @Override + public int getWalkOnVelocity(RoomUnit roomUnit, Room room) + { + if(roomUnit.getPath().isEmpty() && roomUnit.tilesWalked() == 2) + return 0; + + return 6; + } + + @Override + public int getWalkOffVelocity(RoomUnit roomUnit, Room room) + { + return 6; + } + + @Override + public int getDragVelocity(RoomUnit roomUnit, Room room) + { + if(roomUnit.getPath().isEmpty() && roomUnit.tilesWalked() == 2) + return 0; + + return 1; + } + + @Override + public int getTackleVelocity(RoomUnit roomUnit, Room room) + { + return 2; + } + + // Direction + + @Override + public RoomUserRotation getWalkOnDirection(RoomUnit roomUnit, Room room) + { + return roomUnit.getBodyRotation(); + } + + @Override + public RoomUserRotation getWalkOffDirection(RoomUnit roomUnit, Room room) + { + RoomTile nextWalkTile = roomUnit.getPath().peek(); + + if (nextWalkTile == null) + { + nextWalkTile = roomUnit.getGoal(); + } + + if (nextWalkTile != null) + { + return RoomUserRotation.values()[(RoomUserRotation.values().length + Rotation.Calculate(roomUnit.getX(), roomUnit.getY(), nextWalkTile.x, nextWalkTile.y) + 4) % 8]; + } + else + { + return RoomUserRotation.values()[(roomUnit.getBodyRotation().getValue() + 4) % RoomUserRotation.values().length]; + } + } + + public RoomUserRotation getDragDirection(RoomUnit roomUnit, Room room) + { + return roomUnit.getBodyRotation(); + } + + public RoomUserRotation getTackleDirection(RoomUnit roomUnit, Room room) + { + return roomUnit.getBodyRotation(); + } + + // Methods + + @Override + public int getNextRollDelay(int currentStep, int totalSteps) + { + int t = 2500; + return (totalSteps == 1) ? 500 : 100*((t=t/t-1)*t*t*t*t + 1) + (currentStep * 100); + } + + @Override + public RoomUserRotation getBounceDirection(Room room, RoomUserRotation currentDirection) + { + switch(currentDirection) + { + default: + case NORTH: + return RoomUserRotation.SOUTH; + + case NORTH_EAST: + if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.NORTH_WEST.getValue()))) + return RoomUserRotation.NORTH_WEST; + else if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.SOUTH_EAST.getValue()))) + return RoomUserRotation.SOUTH_EAST; + else + return RoomUserRotation.SOUTH_WEST; + + case EAST: + return RoomUserRotation.WEST; + + case SOUTH_EAST: + if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.SOUTH_WEST.getValue()))) + return RoomUserRotation.SOUTH_WEST; + else if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.NORTH_EAST.getValue()))) + return RoomUserRotation.NORTH_EAST; + else + return RoomUserRotation.NORTH_WEST; + + case SOUTH: + return RoomUserRotation.NORTH; + + case SOUTH_WEST: + if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.SOUTH_EAST.getValue()))) + return RoomUserRotation.SOUTH_EAST; + else if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.NORTH_WEST.getValue()))) + return RoomUserRotation.NORTH_WEST; + else + return RoomUserRotation.NORTH_EAST; + + case WEST: + return RoomUserRotation.EAST; + + case NORTH_WEST: + if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.NORTH_EAST.getValue()))) + return RoomUserRotation.NORTH_EAST; + else if(this.validMove(room, room.getLayout().getTile(this.getX(), this.getY()), room.getLayout().getTileInFront(room.getLayout().getTile(this.getX(), this.getY()), RoomUserRotation.SOUTH_WEST.getValue()))) + return RoomUserRotation.SOUTH_WEST; + else + return RoomUserRotation.SOUTH_EAST; + } + } + + // Checks + + @Override + public boolean validMove(Room room, RoomTile from, RoomTile to) + { + if (to == null || to.state == RoomTileState.BLOCKED) + return false; + + HabboItem topItem = room.getTopItemAt(to.x, to.y, this); + return !(!room.getLayout().tileWalkable(to.x, to.y) || (topItem != null && (!topItem.getBaseItem().allowStack() || topItem.getBaseItem().allowSit() || topItem.getBaseItem().allowLay()))); + } + + //Events + + @Override + public void onDrag(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction) + { + + } + + @Override + public void onKick(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction) + { + + } + + @Override + public void onTackle(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction) + { + + } + + @Override + public void onMove(Room room, RoomTile from, RoomTile to, RoomUserRotation direction, RoomUnit kicker, int nextRoll, int currentStep, int totalSteps) + { + FootballGame game = (FootballGame)room.getGame(FootballGame.class); + if (game == null) + { + try + { + game = FootballGame.class.getDeclaredConstructor(Room.class).newInstance(room); + room.addGame(game); + } + catch(Exception e) + { + return; + } + } + + HabboItem currentTopItem = room.getTopItemAt(from.x, from.y, this); + HabboItem topItem = room.getTopItemAt(to.x, to.y, this); + + if(game != null && topItem != null && (currentTopItem == null || currentTopItem.getId() != topItem.getId()) && topItem instanceof InteractionFootballGoal) + { + GameTeamColors color = ((InteractionGameTeamItem) topItem).teamColor; + game.onScore(kicker, color); + } + + this.setExtradata(nextRoll <= 200 ? "8" : (nextRoll <= 250 ? "7" : (nextRoll <= 300 ? "6" : (nextRoll <= 350 ? "5" : (nextRoll <= 400 ? "4" : (nextRoll <= 450 ? "3" : (nextRoll <= 500 ? "2" : "1"))))))); + room.sendComposer(new ItemStateComposer(this).compose()); + } + + @Override + public void onBounce(Room room, RoomUserRotation oldDirection, RoomUserRotation newDirection, RoomUnit kicker) + { + + } + + @Override + public void onStop(Room room, RoomUnit kicker, int currentStep, int totalSteps) + { + this.setExtradata("0"); + room.sendComposer(new ItemStateComposer(this).compose()); + } + + @Override + public boolean canStillMove(Room room, RoomTile from, RoomTile to, RoomUserRotation direction, RoomUnit kicker, int nextRoll, int currentStep, int totalSteps) + { + if (from == null || to == null) + return false; + + HabboItem topItem = room.getTopItemAt(from.x, from.y, this); + return !(room.hasHabbosAt(to.x, to.y) || (topItem != null && topItem.getBaseItem().getName().startsWith("fball_goal_") && currentStep != 1)); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootballGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootballGate.java new file mode 100644 index 00000000..53798a9d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/InteractionFootballGate.java @@ -0,0 +1,173 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; +import com.eu.habbo.messages.outgoing.users.UpdateUserLookComposer; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.users.UserDisconnectEvent; +import com.eu.habbo.plugin.events.users.UserExitRoomEvent; +import com.eu.habbo.plugin.events.users.UserSavedLookEvent; +import com.eu.habbo.util.FigureUtil; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballGate extends HabboItem +{ + private static final String CACHE_KEY = "fball_gate_look"; + private String figureM = ""; + private String figureF = ""; + + public InteractionFootballGate(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + + String[] bits = set.getString("extra_data").split(";"); + this.figureM = bits.length > 0 ? bits[0] : ""; + this.figureF = bits.length > 1 ? bits[1] : ""; + } + + public InteractionFootballGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + String[] bits = extradata.split(";"); + this.figureM = bits.length > 0 ? bits[0] : ""; + this.figureF = bits.length > 1 ? bits[1] : ""; + } + + public void setFigureM(String look) + { + this.figureM = look; + + this.setExtradata(this.figureM + ";" + this.figureF); + this.needsUpdate(true); + Emulator.getThreading().run(this); + } + + public void setFigureF(String look) + { + this.figureF = look; + + this.setExtradata(this.figureM + ";" + this.figureF); + this.needsUpdate(true); + Emulator.getThreading().run(this); + } + + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.figureM + "," + this.figureF); + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + Habbo habbo = room.getHabbo(roomUnit); + if(habbo != null) + { + if(habbo.getHabboStats().cache.containsKey(CACHE_KEY)) + { + String oldlook = (String)habbo.getHabboStats().cache.get(CACHE_KEY); + + UserSavedLookEvent lookEvent = new UserSavedLookEvent(habbo, habbo.getHabboInfo().getGender(), oldlook); + Emulator.getPluginManager().fireEvent(lookEvent); + if(!lookEvent.isCancelled()) + { + habbo.getHabboInfo().setLook(lookEvent.newLook); + Emulator.getThreading().run(habbo.getHabboInfo()); + habbo.getClient().sendResponse(new UpdateUserLookComposer(habbo)); + room.sendComposer(new RoomUserDataComposer(habbo).compose()); + } + + habbo.getHabboStats().cache.remove(CACHE_KEY); + } + else + { + String finalLook = FigureUtil.mergeFigures(habbo.getHabboInfo().getLook(), habbo.getHabboInfo().getGender() == HabboGender.F ? this.figureF : this.figureM, new String[] { "hd", "hr", "ha", "he", "ea", "fa" }, new String[] { "ch", "ca", "cc", "cp", "lg", "wa", "sh" }); + + UserSavedLookEvent lookEvent = new UserSavedLookEvent(habbo, habbo.getHabboInfo().getGender(), finalLook); + Emulator.getPluginManager().fireEvent(lookEvent); + if(!lookEvent.isCancelled()) + { + habbo.getHabboStats().cache.put(CACHE_KEY, habbo.getHabboInfo().getLook()); + habbo.getHabboInfo().setLook(lookEvent.newLook); + Emulator.getThreading().run(habbo.getHabboInfo()); + habbo.getClient().sendResponse(new UpdateUserLookComposer(habbo)); + room.sendComposer(new RoomUserDataComposer(habbo).compose()); + } + } + } + + super.onWalkOn(roomUnit, room, objects); + } + + @EventHandler + public static void onUserDisconnectEvent(UserDisconnectEvent event) + { + if (event.habbo != null) + { + removeLook(event.habbo); + } + } + + @EventHandler + public static void onUserExitRoomEvent(UserExitRoomEvent event) + { + if (event.habbo != null) + { + removeLook(event.habbo); + } + } + + @EventHandler + public static void onUserSavedLookEvent(UserSavedLookEvent event) + { + if (event.habbo != null) + { + removeLook(event.habbo); + } + } + + private static void removeLook(Habbo habbo) + { + if (habbo.getHabboStats().cache.containsKey(CACHE_KEY)) + { + habbo.getHabboInfo().setLook((String)habbo.getHabboStats().cache.get(CACHE_KEY)); + habbo.getHabboStats().cache.remove(CACHE_KEY); + habbo.getClient().sendResponse(new UpdateUserLookComposer(habbo)); + if (habbo.getHabboInfo().getCurrentRoom() != null) + { + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(habbo).compose()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoal.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoal.java new file mode 100644 index 00000000..49115d08 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoal.java @@ -0,0 +1,51 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.goals; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTeamItem; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballGoal extends InteractionGameTeamItem +{ + public InteractionFootballGoal(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + public InteractionFootballGoal(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalBlue.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalBlue.java new file mode 100644 index 00000000..bcd63e00 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalBlue.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.goals; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballGoalBlue extends InteractionFootballGoal +{ + public InteractionFootballGoalBlue(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.BLUE); + } + + public InteractionFootballGoalBlue(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.BLUE); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalGreen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalGreen.java new file mode 100644 index 00000000..f5c5c54c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalGreen.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.goals; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballGoalGreen extends InteractionFootballGoal +{ + public InteractionFootballGoalGreen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.GREEN); + } + + public InteractionFootballGoalGreen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.GREEN); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalRed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalRed.java new file mode 100644 index 00000000..15555bbd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalRed.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.goals; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballGoalRed extends InteractionFootballGoal +{ + public InteractionFootballGoalRed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.RED); + } + + public InteractionFootballGoalRed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.RED); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalYellow.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalYellow.java new file mode 100644 index 00000000..11675fc1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/goals/InteractionFootballGoalYellow.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.goals; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballGoalYellow extends InteractionFootballGoal +{ + public InteractionFootballGoalYellow(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.YELLOW); + } + + public InteractionFootballGoalYellow(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.YELLOW); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboard.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboard.java new file mode 100644 index 00000000..92add261 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboard.java @@ -0,0 +1,170 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameScoreboard; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.wired.WiredEffectType; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Thanks to Beny for coding football game for Arcturus! + */ +public class InteractionFootballScoreboard extends InteractionGameScoreboard +{ + private int score; + + public InteractionFootballScoreboard(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + + try + { + this.score = Integer.parseInt(getExtradata()); + } + catch (Exception e) + { + this.score = 0; + } + } + + public InteractionFootballScoreboard(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + + try + { + this.score = Integer.parseInt(extradata); + } + catch (Exception e) + { + this.score = 0; + } + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + /** + * + * @param amount + * @return New score. + */ + public int changeScore(int amount) + { + this.score += amount; + + if(this.score > 99) { + this.score = 0; + } + + if(this.score < 0) { + this.score = 99; + } + + this.setExtradata(this.score + ""); + this.needsUpdate(true); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room != null) + { + room.updateItem(this); + } + + return this.score; + } + + public void setScore(int amount) + { + this.score = amount; + + if(this.score > 99) { + this.score = 0; + } + + if(this.score < 0) { + this.score = 99; + } + + this.setExtradata(this.score + ""); + this.needsUpdate(true); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room != null) + { + room.updateItem(this); + } + } + + public int getScore() + { + return this.score; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + + if(objects.length >= 1 && objects[0] instanceof Integer && client != null && !(objects.length >= 2 && objects[1] instanceof WiredEffectType)) + { + int state = (Integer)objects[0]; + + switch (state) + { + case 1: + { + this.changeScore(1); + } + break; + + case 2: + { + this.changeScore(-1); + } + break; + + default: + this.setScore(0); + break; + } + } + else + { + this.changeScore(1); + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardBlue.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardBlue.java new file mode 100644 index 00000000..822d55ea --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardBlue.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballScoreboardBlue extends InteractionFootballScoreboard +{ + public InteractionFootballScoreboardBlue(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.BLUE); + } + + public InteractionFootballScoreboardBlue(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.BLUE); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardGreen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardGreen.java new file mode 100644 index 00000000..35b18240 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardGreen.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballScoreboardGreen extends InteractionFootballScoreboard +{ + public InteractionFootballScoreboardGreen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.GREEN); + } + + public InteractionFootballScoreboardGreen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.GREEN); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardRed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardRed.java new file mode 100644 index 00000000..61f35b59 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardRed.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballScoreboardRed extends InteractionFootballScoreboard +{ + public InteractionFootballScoreboardRed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.RED); +} + + public InteractionFootballScoreboardRed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.RED); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardYellow.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardYellow.java new file mode 100644 index 00000000..ae16a328 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/football/scoreboards/InteractionFootballScoreboardYellow.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFootballScoreboardYellow extends InteractionFootballScoreboard +{ + public InteractionFootballScoreboardYellow(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, GameTeamColors.YELLOW); + } + + public InteractionFootballScoreboardYellow(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, GameTeamColors.YELLOW); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeBlock.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeBlock.java new file mode 100644 index 00000000..725fb747 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeBlock.java @@ -0,0 +1,131 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.games.freeze.FreezeGamePlayer; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeBlock extends HabboItem +{ + public InteractionFreezeBlock(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFreezeBlock(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client == null) + return; + + HabboItem item = null; + THashSet items = room.getItemsAt(room.getLayout().getTile(this.getX(), this.getY())); + + for(HabboItem i : items) + { + if(i instanceof InteractionFreezeTile) + { + if(item == null || i.getZ() <= item.getZ()) + { + item = i; + } + } + } + + if(item != null) + { + FreezeGame game = (FreezeGame) room.getGame(FreezeGame.class); + + if(game == null) + return; + + game.throwBall(client.getHabbo(), (InteractionFreezeTile) item); + } + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + if(this.getExtradata().length() == 0) + { + this.setExtradata("0"); + } + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return this.isWalkable(); + } + + @Override + public boolean isWalkable() + { + return !this.getExtradata().isEmpty() && !this.getExtradata().equals("0"); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + super.onWalkOn(roomUnit, room, objects); + + if(this.getExtradata().isEmpty() || this.getExtradata().equalsIgnoreCase("0")) + return; + + FreezeGame game = (FreezeGame) room.getGame(FreezeGame.class); + if(game == null || !game.isRunning) + return; + + FreezeGamePlayer player = (FreezeGamePlayer)room.getHabbo(roomUnit).getHabboInfo().getGamePlayer(); + + if(player == null) + return; + + int powerUp = Integer.valueOf(this.getExtradata()) / 1000; + + if(powerUp >= 2 && powerUp <= 7) + { + if(powerUp == 6 && !player.canPickupLife()) + return; + + this.setExtradata((powerUp + 10) * 1000 + ""); + + room.updateItem(this); + + game.givePowerUp(player, powerUp); + + AchievementManager.progressAchievement(player.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FreezePowerUp")); + } + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeExitTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeExitTile.java new file mode 100644 index 00000000..db721966 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeExitTile.java @@ -0,0 +1,56 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeExitTile extends HabboItem +{ + public InteractionFreezeExitTile(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFreezeExitTile(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return true; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java new file mode 100644 index 00000000..9a54d853 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java @@ -0,0 +1,73 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeTile extends HabboItem +{ + public InteractionFreezeTile(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFreezeTile(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if (client == null) + return; + + if (client.getHabbo().getRoomUnit().getCurrentLocation().x == this.getX() && client.getHabbo().getRoomUnit().getCurrentLocation().y == this.getY()) + { + FreezeGame game = (FreezeGame) room.getGame(FreezeGame.class); + + if (game != null) + game.throwBall(client.getHabbo(), this); + } + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTimer.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTimer.java new file mode 100644 index 00000000..a93227f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTimer.java @@ -0,0 +1,59 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeTimer extends InteractionGameTimer +{ + public InteractionFreezeTimer(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionFreezeTimer(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + super.onClick(client, room, objects); + } + + /** + * Overrides from the InteractionGameTimer class. + * @return The specific game class which should be linked to this timer. + */ + @Override + public Class getGameType() + { + return FreezeGame.class; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGate.java new file mode 100644 index 00000000..9b8e790f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGate.java @@ -0,0 +1,87 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.games.freeze.FreezeGamePlayer; +import com.eu.habbo.habbohotel.games.freeze.FreezeGameTeam; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameGate; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeGate extends InteractionGameGate +{ + public InteractionFreezeGate(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + public InteractionFreezeGate(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return room.getGame(FreezeGame.class) == null || !((FreezeGame)room.getGame(FreezeGame.class)).isRunning; + } + + @Override + public boolean isWalkable() + { + if (this.getRoomId() == 0) + return false; + + return (this.getExtradata().isEmpty() || + Integer.valueOf(this.getExtradata()) < 5); + //((Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getGame(FreezeGame.class))) == null || + //!((FreezeGame)(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getGame(FreezeGame.class))).isRunning; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + FreezeGame game = (FreezeGame) room.getGame(FreezeGame.class); + + if(game == null) + { + game = FreezeGame.class.getDeclaredConstructor(Room.class).newInstance(room); + room.addGame(game); + } + + GameTeam team = game.getTeamForHabbo(room.getHabbo(roomUnit)); + + if(team != null) + { + game.removeHabbo(room.getHabbo(roomUnit)); + } + else + { + if(this.getExtradata().isEmpty()) + { + this.setExtradata("0"); + } + + int value = Integer.valueOf(this.getExtradata()) + 1; + + this.setExtradata(value + ""); + room.updateItem(this); + game.addHabbo(room.getHabbo(roomUnit), this.teamColor); + } + + super.onWalkOn(roomUnit, room, objects); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateBlue.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateBlue.java new file mode 100644 index 00000000..ae9b9370 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateBlue.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeGateBlue extends InteractionFreezeGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.BLUE; + + public InteractionFreezeGateBlue(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeGateBlue(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateGreen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateGreen.java new file mode 100644 index 00000000..92fef3ac --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateGreen.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeGateGreen extends InteractionFreezeGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.GREEN; + + public InteractionFreezeGateGreen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeGateGreen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateRed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateRed.java new file mode 100644 index 00000000..aaaf3f15 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateRed.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeGateRed extends InteractionFreezeGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.RED; + + public InteractionFreezeGateRed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeGateRed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateYellow.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateYellow.java new file mode 100644 index 00000000..dd4c9b70 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/gates/InteractionFreezeGateYellow.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.gates; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeGateYellow extends InteractionFreezeGate +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.YELLOW; + + public InteractionFreezeGateYellow(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeGateYellow(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboard.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboard.java new file mode 100644 index 00000000..305928a8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboard.java @@ -0,0 +1,41 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameScoreboard; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeScoreboard extends InteractionGameScoreboard +{ + InteractionFreezeScoreboard(ResultSet set, Item baseItem, GameTeamColors teamColor) throws SQLException + { + super(set, baseItem, teamColor); + } + + InteractionFreezeScoreboard(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, GameTeamColors teamColor) + { + super(id, userId, item, extradata, limitedStack, limitedSells, teamColor); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardBlue.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardBlue.java new file mode 100644 index 00000000..6b1d3957 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardBlue.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeScoreboardBlue extends InteractionFreezeScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.BLUE; + + public InteractionFreezeScoreboardBlue(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeScoreboardBlue(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardGreen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardGreen.java new file mode 100644 index 00000000..1be33a7f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardGreen.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeScoreboardGreen extends InteractionFreezeScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.GREEN; + + public InteractionFreezeScoreboardGreen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeScoreboardGreen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardRed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardRed.java new file mode 100644 index 00000000..2214b21e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardRed.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeScoreboardRed extends InteractionFreezeScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.RED; + + public InteractionFreezeScoreboardRed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeScoreboardRed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardYellow.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardYellow.java new file mode 100644 index 00000000..897810ba --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/scoreboards/InteractionFreezeScoreboardYellow.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionFreezeScoreboardYellow extends InteractionFreezeScoreboard +{ + public static final GameTeamColors TEAM_COLOR = GameTeamColors.YELLOW; + + public InteractionFreezeScoreboardYellow(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, TEAM_COLOR); + } + + public InteractionFreezeScoreboardYellow(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, TEAM_COLOR); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagField.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagField.java new file mode 100644 index 00000000..cc18e744 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagField.java @@ -0,0 +1,95 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.tag.TagGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public abstract class InteractionTagField extends HabboItem +{ + public Class gameClazz; + + public InteractionTagField(ResultSet set, Item baseItem, Class gameClazz) throws SQLException + { + super(set, baseItem); + + this.gameClazz = gameClazz; + } + + public InteractionTagField(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells, Class gameClazz) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + + this.gameClazz = gameClazz; + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + return habbo.getHabboInfo().getCurrentGame() == null || habbo.getHabboInfo().getCurrentGame() == this.gameClazz; + } + + return false; + } + + @Override + public boolean isWalkable() + { + return true; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (habbo.getHabboInfo().getCurrentGame() == null) + { + TagGame game = (TagGame) room.getGame(this.gameClazz); + + if (game == null) + { + game = (TagGame) this.gameClazz.getDeclaredConstructor(Room.class).newInstance(room); + room.addGame(game); + } + + game.addHabbo(habbo, null); + habbo.getHabboInfo().setCurrentGame(this.gameClazz); + } + } + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagPole.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagPole.java new file mode 100644 index 00000000..d7dd1fad --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/InteractionTagPole.java @@ -0,0 +1,56 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionTagPole extends HabboItem +{ + public InteractionTagPole(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionTagPole(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) + { + return false; + } + + @Override + public boolean isWalkable() + { + return false; + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void serializeExtradata(ServerMessage serverMessage) + { + serverMessage.appendInt((this.isLimited() ? 256 : 0)); + serverMessage.appendString(this.getExtradata()); + + super.serializeExtradata(serverMessage); + } + + @Override + public void onPickUp(Room room) + { + this.setExtradata("0"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunField.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunField.java new file mode 100644 index 00000000..540542dc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunField.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun; + +import com.eu.habbo.habbohotel.games.tag.BunnyrunGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBunnyrunField extends InteractionTagField +{ + public InteractionBunnyrunField(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, BunnyrunGame.class); + } + + public InteractionBunnyrunField(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, BunnyrunGame.class); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunPole.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunPole.java new file mode 100644 index 00000000..7b2cd035 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/bunnyrun/InteractionBunnyrunPole.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionBunnyrunPole extends InteractionTagPole +{ + public InteractionBunnyrunPole(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionBunnyrunPole(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagField.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagField.java new file mode 100644 index 00000000..fdab39d7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagField.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag.icetag; + +import com.eu.habbo.habbohotel.games.tag.IceTagGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionIceTagField extends InteractionTagField +{ + public InteractionIceTagField(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, IceTagGame.class); + } + + public InteractionIceTagField(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, IceTagGame.class); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagPole.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagPole.java new file mode 100644 index 00000000..46040ec6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/icetag/InteractionIceTagPole.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag.icetag; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionIceTagPole extends InteractionTagPole +{ + public InteractionIceTagPole(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public InteractionIceTagPole(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/rollerskate/InteractionRollerskateField.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/rollerskate/InteractionRollerskateField.java new file mode 100644 index 00000000..a84a0824 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/tag/rollerskate/InteractionRollerskateField.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.items.interactions.games.tag.rollerskate; + +import com.eu.habbo.habbohotel.games.tag.RollerskateGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InteractionRollerskateField extends InteractionTagField +{ + public InteractionRollerskateField(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem, RollerskateGame.class); + } + + public InteractionRollerskateField(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells, RollerskateGame.class); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/WiredTriggerReset.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/WiredTriggerReset.java new file mode 100644 index 00000000..42bd5bfe --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/WiredTriggerReset.java @@ -0,0 +1,6 @@ +package com.eu.habbo.habbohotel.items.interactions.wired; + +public interface WiredTriggerReset +{ + public void resetTimer(); +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionBattleBanzaiGameActive.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionBattleBanzaiGameActive.java new file mode 100644 index 00000000..fb18eae8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionBattleBanzaiGameActive.java @@ -0,0 +1,83 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionBattleBanzaiGameActive extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_IN_GROUP; + + public WiredConditionBattleBanzaiGameActive(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionBattleBanzaiGameActive(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Game game = room.getGame(BattleBanzaiGame.class); + + return game != null && game.isRunning; + } + + @Override + protected String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java new file mode 100644 index 00000000..d20a0821 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java @@ -0,0 +1,79 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionDateRangeActive extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.DATE_RANGE; + + public WiredConditionDateRangeActive(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionDateRangeActive(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return false; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return false; + } + + @Override + protected String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFreezeGameActive.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFreezeGameActive.java new file mode 100644 index 00000000..9d12b164 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFreezeGameActive.java @@ -0,0 +1,83 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionFreezeGameActive extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_IN_GROUP; + + public WiredConditionFreezeGameActive(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionFreezeGameActive(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Game game = room.getGame(FreezeGame.class); + + return game != null && game.isRunning; + } + + @Override + protected String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveFurni.java new file mode 100644 index 00000000..f545c0eb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveFurni.java @@ -0,0 +1,210 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionFurniHaveFurni extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.FURNI_HAS_FURNI; + + private boolean all; + private THashSet items; + + public WiredConditionFurniHaveFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredConditionFurniHaveFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + boolean foundSomething = false; + for(HabboItem item : this.items) + { + boolean found = false; + + THashSet stackedItems = room.getItemsAt(room.getLayout().getTile(item.getX(), item.getY())); + + if (stackedItems == null) + continue; + + if(stackedItems.isEmpty() && this.all) + return false; + + for(HabboItem i : stackedItems) + { + if(i == item) + continue; + + if(i.getZ() >= item.getZ()) + { + found = true; + foundSomething = true; + } + } + + if(this.all) + { + if(!found) + return false; + } + else + { + if(found) + return true; + } + } + + return this.items.isEmpty() || foundSomething; + + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = (all ? "1" : "0") + ":"; + + for(HabboItem item : this.items) + data += item.getId() + ";"; + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + + if(data.length >= 1) + { + this.all = (data[0].equals("1")); + + if(data.length == 2) + { + String[] items = data[1].split(";"); + + for (String s : items) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if(item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.all = false; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.all ? 1 : 0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + int count; + packet.readInt(); + + this.all = packet.readInt() == 1; + + packet.readString(); + + count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + HabboItem item = room.getHabboItem(packet.readInt()); + + if(item != null) + this.items.add(item); + } + + return true; + } + return false; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveHabbo.java new file mode 100644 index 00000000..6469f266 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniHaveHabbo.java @@ -0,0 +1,189 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionFurniHaveHabbo extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.FURNI_HAVE_HABBO; + + private boolean all; + private THashSet items; + + public WiredConditionFurniHaveHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + items = new THashSet(); + } + + public WiredConditionFurniHaveHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + items = new THashSet(); + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.all = false; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(this.items.isEmpty()) + return true; + + for(HabboItem item : this.items) + { + THashSet habbos = room.getHabbosOnItem(item); + + if(habbos.isEmpty()) + { + return false; + } + } + + return true; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = (this.all ? "1" : "0") + ":"; + + for(HabboItem item : this.items) + { + data += item.getId() + ";"; + } + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(":"); + + if(data.length >= 1) + { + this.all = (data[0].equals("1")); + + if(data.length == 2) + { + String[] items = data[1].split(";"); + + for (String s : items) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if(item != null) + this.items.add(item); + } + } + } + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.all ? 1 : 0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + int count; + packet.readInt(); + + packet.readString(); + + count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + HabboItem item = room.getHabboItem(packet.readInt()); + + if(item != null) + this.items.add(item); + } + + return true; + } + + return false; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniTypeMatch.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniTypeMatch.java new file mode 100644 index 00000000..67b48aba --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionFurniTypeMatch.java @@ -0,0 +1,164 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionFurniTypeMatch extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.STUFF_IS; + + private THashSet items = new THashSet(); + + public WiredConditionFurniTypeMatch(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionFurniTypeMatch(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void onPickUp() + { + this.items.clear(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(stuff != null) + { + if(stuff.length >= 1) + { + if(stuff[0] instanceof HabboItem) + { + HabboItem item = (HabboItem) stuff[0]; + + for(HabboItem i : this.items) + { + if(i.getBaseItem().getId() == item.getBaseItem().getId()) + return true; + } + + return false; + } + } + } + return true; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = ""; + + for(HabboItem item : this.items) + data += item.getId() + ";"; + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(";"); + + for(String s : data) + this.items.add(room.getHabboItem(Integer.valueOf(s))); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + packet.readInt(); + packet.readString(); + + int count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + this.items.add(room.getHabboItem(packet.readInt())); + } + } + + return true; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionGroupMember.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionGroupMember.java new file mode 100644 index 00000000..f276f7f6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionGroupMember.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionGroupMember extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_IN_GROUP; + + public WiredConditionGroupMember(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionGroupMember(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(room.getGuildId() == 0) + return false; + + Habbo habbo = room.getHabbo(roomUnit); + + return habbo != null && habbo.getHabboStats().hasGuild(room.getGuildId()); + } + + @Override + public String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboCount.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboCount.java new file mode 100644 index 00000000..16a3dd12 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboCount.java @@ -0,0 +1,95 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionHabboCount extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.USER_COUNT; + + private int lowerLimit = 0; + private int upperLimit = 50; + + public WiredConditionHabboCount(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionHabboCount(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + int count = room.getUserCount(); + + return count >= this.lowerLimit && count <= this.upperLimit; + } + + @Override + public String getWiredData() + { + return this.lowerLimit + ":" + this.upperLimit; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + + this.lowerLimit = Integer.valueOf(data[0]); + this.upperLimit = Integer.valueOf(data[1]); + } + + @Override + public void onPickUp() + { + this.lowerLimit = 0; + this.upperLimit = 50; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(2); + message.appendInt(this.lowerLimit); + message.appendInt(this.upperLimit); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.lowerLimit = packet.readInt(); + this.upperLimit = packet.readInt(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasEffect.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasEffect.java new file mode 100644 index 00000000..6882bb30 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasEffect.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionHabboHasEffect extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_WEARS_EFFECT; + + private int effectId = 0; + + public WiredConditionHabboHasEffect(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionHabboHasEffect(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return roomUnit.getEffectId() == this.effectId; + } + + @Override + public String getWiredData() + { + return effectId + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.effectId = Integer.valueOf(set.getString("wired_data")); + } + + @Override + public void onPickUp() + { + this.effectId = 0; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.effectId + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.effectId = packet.readInt(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasHandItem.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasHandItem.java new file mode 100644 index 00000000..175b0603 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboHasHandItem.java @@ -0,0 +1,94 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionHabboHasHandItem extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_HAS_HANDITEM; + + private int handItem; + + public WiredConditionHabboHasHandItem(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionHabboHasHandItem(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.handItem); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.handItem = packet.readInt(); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return roomUnit.getHandItem() == this.handItem; + } + + @Override + protected String getWiredData() + { + return this.handItem + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + try + { + this.handItem = Integer.valueOf(set.getString("wired_data")); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + @Override + public void onPickUp() + { + this.handItem = 0; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboWearsBadge.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboWearsBadge.java new file mode 100644 index 00000000..20cf44c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionHabboWearsBadge.java @@ -0,0 +1,102 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionHabboWearsBadge extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_WEARS_BADGE; + + private String badge = ""; + + public WiredConditionHabboWearsBadge(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionHabboWearsBadge(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + synchronized (habbo.getInventory().getBadgesComponent().getWearingBadges()) + { + for (HabboBadge badge : habbo.getInventory().getBadgesComponent().getWearingBadges()) + { + if (badge.getCode().equalsIgnoreCase(this.badge)) + { + return true; + } + } + } + } + return false; + } + + @Override + public String getWiredData() + { + return this.badge; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.badge = set.getString("wired_data"); + } + + @Override + public void onPickUp() + { + this.badge = ""; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.badge); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.badge = packet.readString(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionLessTimeElapsed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionLessTimeElapsed.java new file mode 100644 index 00000000..5df3c2f2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionLessTimeElapsed.java @@ -0,0 +1,97 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionLessTimeElapsed extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.TIME_LESS_THAN; + + private int cycles; + + public WiredConditionLessTimeElapsed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionLessTimeElapsed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return (Emulator.getIntUnixTimestamp() - room.getLastTimerReset()) / 0.5 < this.cycles; + } + + @Override + public String getWiredData() + { + return this.cycles + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String data = set.getString("wired_data"); + + try + { + if (!data.equals("")) + this.cycles = Integer.valueOf(data); + } + catch (Exception e) + { + return; + } + } + + @Override + public void onPickUp() + { + this.cycles = 0; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.cycles); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.cycles = packet.readInt(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMatchStatePosition.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMatchStatePosition.java new file mode 100644 index 00000000..e922137f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMatchStatePosition.java @@ -0,0 +1,229 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredMatchFurniSetting; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionMatchStatePosition extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.MATCH_SSHOT; + + private THashSet settings; + + private boolean state; + private boolean position; + private boolean direction; + + public WiredConditionMatchStatePosition(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.settings = new THashSet(); + } + + public WiredConditionMatchStatePosition(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.settings = new THashSet(); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.settings.size()); + + for(WiredMatchFurniSetting item : this.settings) + message.appendInt(item.itemId); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(4); + message.appendInt(this.state ? 1 : 0); + message.appendInt(this.direction ? 1 : 0); + message.appendInt(this.position ? 1 : 0); + message.appendInt(10); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.settings.clear(); + + int count; + packet.readInt(); + + this.state = packet.readInt() == 1; + this.direction = packet.readInt() == 1; + this.position = packet.readInt() == 1; + + packet.readString(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return true; + + count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + int itemId = packet.readInt(); + HabboItem item = room.getHabboItem(itemId); + + if (item != null) + this.settings.add(new WiredMatchFurniSetting(item.getId(), item.getExtradata(), item.getRotation(), item.getX(), item.getY(), item.getZ())); + } + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(this.settings.isEmpty()) + return true; + + THashSet s = new THashSet(); + + for(WiredMatchFurniSetting setting : this.settings) + { + HabboItem item = room.getHabboItem(setting.itemId); + + if(item != null) + { + if(this.state) + { + if(!item.getExtradata().equals(setting.state)) + return false; + } + + if(this.position) + { + if(!(setting.x == item.getX() && setting.y == item.getY() && setting.z == item.getZ())) + return false; + } + + if(this.direction) + { + if(setting.rotation != item.getRotation()) + return false; + } + } + else + { + s.add(setting); + } + } + + if(!s.isEmpty()) + { + for(WiredMatchFurniSetting setting : s) + { + this.settings.remove(setting); + } + } + + return true; + } + + @Override + public String getWiredData() + { + String data = this.settings.size() + ":"; + + if(this.settings.isEmpty()) + { + data += "\t;"; + } + else + { + for (WiredMatchFurniSetting item : this.settings) + data += item.toString() + ";"; + } + + data += ":" + (this.state ? 1 : 0) + ":" + (this.direction ? 1 : 0) + ":" + (this.position ? 1 : 0); + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + + int itemCount = Integer.valueOf(data[0]); + + String[] items = data[1].split(";"); + + for(int i = 0; i < itemCount; i++) + { + String[] stuff = items[i].split("-"); + + if(stuff.length == 6) + this.settings.add(new WiredMatchFurniSetting(Integer.valueOf(stuff[0]), stuff[1], Integer.valueOf(stuff[2]), Integer.valueOf(stuff[3]), Integer.valueOf(stuff[4]), Double.valueOf(stuff[5]))); + } + + this.state = data[2].equals("1"); + this.direction = data[3].equals("1"); + this.position = data[4].equals("1"); + } + + @Override + public void onPickUp() + { + this.settings.clear(); + this.direction = false; + this.position = false; + this.state = false; + } + + private void refresh() + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + THashSet remove = new THashSet(); + + for (WiredMatchFurniSetting setting : this.settings) + { + HabboItem item = room.getHabboItem(setting.itemId); + if (item == null) + { + remove.add(setting); + } + } + + for(WiredMatchFurniSetting setting : remove) + { + this.settings.remove(setting); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMoreTimeElapsed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMoreTimeElapsed.java new file mode 100644 index 00000000..e95b70ba --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMoreTimeElapsed.java @@ -0,0 +1,97 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionMoreTimeElapsed extends InteractionWiredCondition +{ + private static final WiredConditionType type = WiredConditionType.TIME_MORE_THAN; + + private int cycles; + + public WiredConditionMoreTimeElapsed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionMoreTimeElapsed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return (Emulator.getIntUnixTimestamp() - room.getLastTimerReset()) / 0.5 > this.cycles; + } + + @Override + public String getWiredData() + { + return this.cycles + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String data = set.getString("wired_data"); + + try + { + if (!data.equals("")) + this.cycles = Integer.valueOf(data); + } + catch (Exception e) + { + return; + } + } + + @Override + public void onPickUp() + { + this.cycles = 0; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.cycles); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.cycles = packet.readInt(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMottoContains.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMottoContains.java new file mode 100644 index 00000000..70608d7f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionMottoContains.java @@ -0,0 +1,94 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionMottoContains extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_WEARS_BADGE; + + private String motto = ""; + + public WiredConditionMottoContains(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionMottoContains(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(habbo.getHabboInfo().getMotto().contains(this.motto)) + return true; + } + + return false; + } + + @Override + public String getWiredData() + { + return this.motto; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.motto = set.getString("wired_data"); + } + + @Override + public void onPickUp() + { + this.motto = ""; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.motto); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.motto = packet.readString(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotBattleBanzaiGameActive.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotBattleBanzaiGameActive.java new file mode 100644 index 00000000..0e021ab6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotBattleBanzaiGameActive.java @@ -0,0 +1,83 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotBattleBanzaiGameActive extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_ACTOR_IN_GROUP; + + public WiredConditionNotBattleBanzaiGameActive(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotBattleBanzaiGameActive(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Game game = room.getGame(BattleBanzaiGame.class); + + return game == null || !game.isRunning; + } + + @Override + protected String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFreezeGameActive.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFreezeGameActive.java new file mode 100644 index 00000000..8c644f4c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFreezeGameActive.java @@ -0,0 +1,83 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotFreezeGameActive extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_ACTOR_IN_GROUP; + + public WiredConditionNotFreezeGameActive(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotFreezeGameActive(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Game game = room.getGame(FreezeGame.class); + + return game == null || !game.isRunning; + } + + @Override + protected String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveFurni.java new file mode 100644 index 00000000..4ca6dc3e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveFurni.java @@ -0,0 +1,199 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotFurniHaveFurni extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_FURNI_HAVE_FURNI; + + private boolean all; + private THashSet items; + + public WiredConditionNotFurniHaveFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredConditionNotFurniHaveFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(this.items.isEmpty()) + return true; + + for(HabboItem item : this.items) + { + THashSet things = room.getItemsAt(room.getLayout().getTile(item.getX(), item.getY())); + + for(HabboItem i : things) + { + if(i == item) + continue; + + if(i.getZ() >= item.getZ()) + { + if(this.all) + return false; + } + else + { + if(!this.all) + return true; + } + } + } + + return false; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = (all ? "1" : "0") + ":"; + + for(HabboItem item : this.items) + data += item.getId() + ";"; + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(":"); + + if(data.length >= 1) + { + this.all = (data[0].equals("1")); + + if(data.length == 2) + { + String[] items = data[1].split(";"); + + for (String s : items) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if(item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.all = false; + this.items.clear(); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.all ? 1 : 0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + int count; + packet.readInt(); + + this.all = packet.readInt() == 1; + + packet.readString(); + + count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + HabboItem item = room.getHabboItem(packet.readInt()); + + if(item != null) + this.items.add(item); + } + + return true; + } + return false; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveHabbo.java new file mode 100644 index 00000000..1c4001bb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniHaveHabbo.java @@ -0,0 +1,187 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotFurniHaveHabbo extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_FURNI_HAVE_HABBO; + + private boolean all; + private THashSet items; + + public WiredConditionNotFurniHaveHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredConditionNotFurniHaveHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(this.items.isEmpty()) + return true; + + for(HabboItem item : this.items) + { + THashSet habbos = room.getHabbosOnItem(item); + + if(habbos.isEmpty()) + return true; + } + + return false; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = (this.all ? "1" : "0") + ":"; + + for(HabboItem item : this.items) + { + data += item.getId() + ";"; + } + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(":"); + + if(data.length >= 1) + { + this.all = (data[0].equals("1")); + + if(data.length == 2) + { + String[] items = data[1].split(";"); + + for (String s : items) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if(item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.all = false; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.all ? 1 : 0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + int count; + packet.readInt(); + + packet.readString(); + + count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + HabboItem item = room.getHabboItem(packet.readInt()); + + if(item != null) + this.items.add(item); + } + + return true; + } + + return false; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniTypeMatch.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniTypeMatch.java new file mode 100644 index 00000000..13b0c5cd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotFurniTypeMatch.java @@ -0,0 +1,163 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotFurniTypeMatch extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_STUFF_IS; + + private THashSet items = new THashSet(); + + public WiredConditionNotFurniTypeMatch(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotFurniTypeMatch(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(stuff != null) + { + if(stuff.length >= 1) + { + if(stuff[0] instanceof HabboItem) + { + HabboItem item = (HabboItem) stuff[0]; + + for(HabboItem i : this.items) + { + if(i.getBaseItem().getId() == item.getBaseItem().getId()) + return false; + } + } + } + } + + return true; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = ""; + + for(HabboItem item : this.items) + data += item.getId() + ";"; + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(";"); + + for(String s : data) + this.items.add(room.getHabboItem(Integer.valueOf(s))); + } + + @Override + public void onPickUp() + { + this.items.clear(); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + packet.readInt(); + packet.readString(); + + int count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + this.items.add(room.getHabboItem(packet.readInt())); + } + } + + return true; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboCount.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboCount.java new file mode 100644 index 00000000..7380deba --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboCount.java @@ -0,0 +1,94 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotHabboCount extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_USER_COUNT; + + private int lowerLimit = 10; + private int upperLimit = 20; + + public WiredConditionNotHabboCount(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotHabboCount(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + int count = room.getUserCount(); + + return count < this.lowerLimit || count > this.upperLimit; + } + + @Override + public String getWiredData() + { + return this.lowerLimit + ":" + this.upperLimit; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + this.lowerLimit = Integer.valueOf(data[0]); + this.upperLimit = Integer.valueOf(data[1]); + } + + @Override + public void onPickUp() + { + this.upperLimit = 0; + this.lowerLimit = 20; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(2); + message.appendInt(this.lowerLimit); + message.appendInt(this.upperLimit); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.lowerLimit = packet.readInt(); + this.upperLimit = packet.readInt(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboHasEffect.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboHasEffect.java new file mode 100644 index 00000000..56760b05 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboHasEffect.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotHabboHasEffect extends InteractionWiredCondition +{ + private static final WiredConditionType type = WiredConditionType.NOT_ACTOR_WEARS_EFFECT; + + private int effectId; + + public WiredConditionNotHabboHasEffect(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotHabboHasEffect(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return roomUnit.getEffectId() != this.effectId; + } + + @Override + public String getWiredData() + { + return this.effectId + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.effectId = Integer.valueOf(set.getString("wired_data")); + } + + @Override + public void onPickUp() + { + this.effectId = 0; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.effectId + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.effectId = packet.readInt(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboWearsBadge.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboWearsBadge.java new file mode 100644 index 00000000..ac675463 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotHabboWearsBadge.java @@ -0,0 +1,102 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotHabboWearsBadge extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_ACTOR_WEARS_BADGE; + + private String badge = ""; + + public WiredConditionNotHabboWearsBadge(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotHabboWearsBadge(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + synchronized (habbo.getInventory().getBadgesComponent().getWearingBadges()) + { + for (HabboBadge b : habbo.getInventory().getBadgesComponent().getWearingBadges()) + { + if (b.getCode().equalsIgnoreCase(this.badge)) + return false; + } + } + return true; + } + + return true; + } + + @Override + public String getWiredData() + { + return this.badge; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.badge = set.getString("wired_data"); + } + + @Override + public void onPickUp() + { + this.badge = ""; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.badge); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.badge = packet.readString(); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInGroup.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInGroup.java new file mode 100644 index 00000000..678f22c6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInGroup.java @@ -0,0 +1,85 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotInGroup extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_ACTOR_IN_GROUP; + + public WiredConditionNotInGroup(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotInGroup(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(room.getGuildId() == 0) + return false; + + Habbo habbo = room.getHabbo(roomUnit); + + return habbo == null || !habbo.getHabboStats().hasGuild(room.getGuildId()); + } + + @Override + public String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInTeam.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInTeam.java new file mode 100644 index 00000000..fcc4bc9d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotInTeam.java @@ -0,0 +1,109 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotInTeam extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_ACTOR_IN_TEAM; + + private GameTeamColors teamColor = GameTeamColors.RED; + + public WiredConditionNotInTeam(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotInTeam(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(habbo.getHabboInfo().getGamePlayer() != null) + { + if(habbo.getHabboInfo().getGamePlayer().getTeamColor().equals(this.teamColor)) + return false; + } + } + + return true; + } + + @Override + public String getWiredData() + { + return this.teamColor.type + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String data = set.getString("wired_data"); + + try + { + if (!data.equals("")) + this.teamColor = GameTeamColors.values()[Integer.valueOf(data)]; + } + catch (Exception e) + { + this.teamColor = GameTeamColors.RED; + } + } + + @Override + public void onPickUp() + { + this.teamColor = GameTeamColors.RED; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.teamColor.type); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.teamColor = GameTeamColors.values()[packet.readInt()]; + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotMatchStatePosition.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotMatchStatePosition.java new file mode 100644 index 00000000..b85166c8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotMatchStatePosition.java @@ -0,0 +1,229 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredMatchFurniSetting; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotMatchStatePosition extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_MATCH_SSHOT; + + private THashSet settings; + + private boolean state; + private boolean position; + private boolean direction; + + public WiredConditionNotMatchStatePosition(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.settings = new THashSet(); + } + + public WiredConditionNotMatchStatePosition(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.settings = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(this.settings.isEmpty()) + return true; + + THashSet s = new THashSet(); + + for(WiredMatchFurniSetting setting : this.settings) + { + HabboItem item = room.getHabboItem(setting.itemId); + + if(item != null) + { + if(this.state) + { + if(item.getExtradata().equals(setting.state)) + return false; + } + + if(this.position) + { + if((setting.x == item.getX() && setting.y == item.getY() && setting.z == item.getZ())) + return false; + } + + if(this.direction) + { + if((setting.rotation == item.getRotation())) + return false; + } + } + else + { + s.add(setting); + } + } + + if(!s.isEmpty()) + { + for(WiredMatchFurniSetting setting : s) + { + this.settings.remove(setting); + } + } + + return true; + } + + @Override + public String getWiredData() + { + String data = this.settings.size() + ":"; + + if(this.settings.isEmpty()) + { + data += "\t;"; + } + else + { + for (WiredMatchFurniSetting item : this.settings) + data += item.toString() + ";"; + } + + data += ":" + (this.state ? 1 : 0) + ":" + (this.direction ? 1 : 0) + ":" + (this.position ? 1 : 0); + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + + int itemCount = Integer.valueOf(data[0]); + + String[] items = data[1].split(";"); + + for(int i = 0; i < itemCount; i++) + { + String[] stuff = items[i].split("-"); + + if(stuff.length == 6) + this.settings.add(new WiredMatchFurniSetting(Integer.valueOf(stuff[0]), stuff[1], Integer.valueOf(stuff[2]), Integer.valueOf(stuff[3]), Integer.valueOf(stuff[4]), Double.valueOf(stuff[5]))); + } + + this.state = data[2].equals("1"); + this.direction = data[3].equals("1"); + this.position = data[4].equals("1"); + } + + @Override + public void onPickUp() + { + this.settings.clear(); + this.state = false; + this.direction = false; + this.position = false; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.settings.size()); + + for(WiredMatchFurniSetting item : this.settings) + message.appendInt(item.itemId); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(4); + message.appendInt(this.state ? 1 : 0); + message.appendInt(this.direction ? 1 : 0); + message.appendInt(this.position ? 1 : 0); + message.appendInt(10); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.settings.clear(); + + int count; + packet.readInt(); + + this.state = packet.readInt() == 1; + this.direction = packet.readInt() == 1; + this.position = packet.readInt() == 1; + + packet.readString(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return true; + + count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + int itemId = packet.readInt(); + HabboItem item = room.getHabboItem(itemId); + + if (item != null) + this.settings.add(new WiredMatchFurniSetting(item.getId(), item.getExtradata(), item.getRotation(), item.getX(), item.getY(), item.getZ())); + } + + return true; + } + + private void refresh() + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + THashSet remove = new THashSet(); + + for (WiredMatchFurniSetting setting : this.settings) + { + HabboItem item = room.getHabboItem(setting.itemId); + if (item == null) + { + remove.add(setting); + } + } + + for(WiredMatchFurniSetting setting : remove) + { + this.settings.remove(setting); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotTriggerOnFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotTriggerOnFurni.java new file mode 100644 index 00000000..f360a1a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionNotTriggerOnFurni.java @@ -0,0 +1,171 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionNotTriggerOnFurni extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.NOT_ACTOR_ON_FURNI; + + private THashSet items = new THashSet(); + + public WiredConditionNotTriggerOnFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionNotTriggerOnFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(this.items.isEmpty()) + return true; + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return true; + + for(HabboItem item : this.items) + { + if(RoomLayout.getRectangle(item.getX(), item.getY(), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()).contains(roomUnit.getX(), roomUnit.getY())) + return false; + } + + return true; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = ""; + + for(HabboItem item : this.items) + data += item.getId() + ";"; + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(";"); + + for(String s : data) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + { + this.items.add(item); + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + packet.readInt(); + packet.readString(); + + int count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + HabboItem item = room.getHabboItem(packet.readInt()); + + if (item != null) + { + this.items.add(item); + } + } + } + + return true; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (item.getRoomId() != room.getId()) + items.add(item); + } + } + + this.items.removeAll(items); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamMember.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamMember.java new file mode 100644 index 00000000..41b45449 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTeamMember.java @@ -0,0 +1,109 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionTeamMember extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.ACTOR_IN_TEAM; + + private GameTeamColors teamColor = GameTeamColors.RED; + + public WiredConditionTeamMember(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionTeamMember(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(habbo.getHabboInfo().getGamePlayer() != null) + { + if(habbo.getHabboInfo().getGamePlayer().getTeamColor().equals(this.teamColor)) + return true; + } + } + + return false; + } + + @Override + public String getWiredData() + { + return this.teamColor.type + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String data = set.getString("wired_data"); + + try + { + if (!data.equals("")) + this.teamColor = GameTeamColors.values()[Integer.valueOf(data)]; + } + catch (Exception e) + { + this.teamColor = GameTeamColors.RED; + } + } + + @Override + public void onPickUp() + { + this.teamColor = GameTeamColors.RED; + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.teamColor.type); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.teamColor = GameTeamColors.values()[packet.readInt()]; + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTriggerOnFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTriggerOnFurni.java new file mode 100644 index 00000000..9b98446a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionTriggerOnFurni.java @@ -0,0 +1,173 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredConditionTriggerOnFurni extends InteractionWiredCondition +{ + public static final WiredConditionType type = WiredConditionType.TRIGGER_ON_FURNI; + + private THashSet items = new THashSet(); + + public WiredConditionTriggerOnFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredConditionTriggerOnFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + this.refresh(); + + if(this.items.isEmpty()) + return true; + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return true; + + for(HabboItem item : this.items) + { + if(RoomLayout.getRectangle(item.getX(), item.getY(), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()).contains(roomUnit.getX(), roomUnit.getY())) + return true; + } + + return false; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = ""; + + for(HabboItem item : this.items) + { + data += item.getId() + ";"; + } + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(";"); + + for(String s : data) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + { + this.items.add(item); + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + } + + @Override + public WiredConditionType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + this.items.clear(); + + packet.readInt(); + packet.readString(); + + int count = packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + for (int i = 0; i < count; i++) + { + HabboItem item = room.getHabboItem(packet.readInt()); + + if (item != null) + { + this.items.add(item); + } + } + } + + return true; + } + + private void refresh() + { + THashSet items = new THashSet(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (item.getRoomId() != room.getId()) + items.add(item); + } + } + + this.items.removeAll(items); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectAlert.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectAlert.java new file mode 100644 index 00000000..9b8544fa --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectAlert.java @@ -0,0 +1,41 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectAlert extends WiredEffectWhisper +{ + public WiredEffectAlert(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectAlert(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + habbo.getClient().sendResponse(new GenericAlertComposer(this.message + .replace("%online%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "") + .replace("%username%", habbo.getHabboInfo().getUsername()) + .replace("%roomsloaded%", Emulator.getGameEnvironment().getRoomManager().loadedRoomsCount() + ""))); + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotClothes.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotClothes.java new file mode 100644 index 00000000..29302c0d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotClothes.java @@ -0,0 +1,135 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class WiredEffectBotClothes extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_CLOTHES; + + private String botName = ""; + private String botLook = ""; + + public WiredEffectBotClothes(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectBotClothes(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName + ((char) 9) + "" + this.botLook); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + String[] data = packet.readString().split(((char) 9 ) + ""); + + if(data.length == 2) + { + this.botName = data[0]; + this.botLook = data[1]; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + List bots = room.getBots(this.botName); + for(Bot bot : bots) + { + bot.setFigure(this.botLook); + } + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "" + ((char) 9) + "" + + this.botName + ((char) 9) + + this.botLook; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(((char) 9) + ""); + + if(data.length >= 3) + { + this.setDelay(Integer.valueOf(data[0])); + this.botName = data[1]; + this.botLook = data[2]; + } + } + + @Override + public void onPickUp() + { + this.botLook = ""; + this.botName = ""; + this.setDelay(0); + } + + public String getBotName() + { + return botName; + } + + public void setBotName(String botName) + { + this.botName = botName; + } + + public String getBotLook() + { + return botLook; + } + + public void setBotLook(String botLook) + { + this.botLook = botLook; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotFollowHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotFollowHabbo.java new file mode 100644 index 00000000..df761389 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotFollowHabbo.java @@ -0,0 +1,152 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectBotFollowHabbo extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_FOLLOW_AVATAR; + + private String botName = ""; + private int mode = 0; + + public WiredEffectBotFollowHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectBotFollowHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName); + message.appendInt(1); + message.appendInt(this.mode); + message.appendInt(1); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.mode = packet.readInt(); + this.botName = packet.readString().replace("\t", ""); + packet.readInt(); + this.setDelay(packet.readInt()); + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + List bots = room.getBots(this.botName); + for(Bot bot : bots) + { + if(this.mode == 1) + bot.startFollowingHabbo(habbo); + else + bot.stopFollowingHabbo(); + } + + return true; + } + + return false; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "" + ((char) 9) + "" + this.mode + "" + ((char) 9) + this.botName; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(((char) 9) + ""); + + if(data.length == 3) + { + this.setDelay(Integer.valueOf(data[0])); + this.mode = (data[1].equalsIgnoreCase("1") ? 1 : 0); + this.botName = data[2]; + } + } + + @Override + public void onPickUp() + { + this.botName = ""; + this.mode = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java new file mode 100644 index 00000000..2cf7063e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java @@ -0,0 +1,157 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem; +import com.eu.habbo.threading.runnables.RoomUnitWalkToRoomUnit; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectBotGiveHandItem extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_GIVE_HANDITEM; + + private String botName = ""; + private int itemId; + + public WiredEffectBotGiveHandItem(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectBotGiveHandItem(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName); + message.appendInt(1); + message.appendInt(this.itemId); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.itemId = packet.readInt(); + this.botName = packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + List bots = room.getBots(this.botName); + + for(Bot bot : bots) + { + List tasks = new ArrayList(); + tasks.add(new RoomUnitGiveHanditem(habbo.getRoomUnit(), room, this.itemId)); + tasks.add(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, 0)); + Emulator.getThreading().run(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, this.itemId)); + Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(bot.getRoomUnit(), habbo.getRoomUnit(), room, tasks, null)); + } + + return true; + } + + return false; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "" + ((char)9) + "" + this.itemId + "" + ((char) 9) + "" + this.botName; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(((char) 9) + ""); + + if(data.length == 3) + { + this.setDelay(Integer.valueOf(data[0])); + this.itemId = Integer.valueOf(data[1]); + this.botName = data[2]; + } + } + + @Override + public void onPickUp() + { + this.botName = ""; + this.itemId = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalk.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalk.java new file mode 100644 index 00000000..6fde3201 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalk.java @@ -0,0 +1,166 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class WiredEffectBotTalk extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_TALK; + + private int mode; + private String botName = ""; + private String message = ""; + + public WiredEffectBotTalk(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectBotTalk(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName + "" + ((char) 9) + "" + this.message); + message.appendInt(1); + message.appendInt(this.mode); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.mode = packet.readInt(); + + String[] data = packet.readString().split(((char) 9) + ""); + + if(data.length == 2) + { + this.botName = data[0]; + this.message = data[1]; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + String message = this.message; + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + message = message.replace(Emulator.getTexts().getValue("wired.variable.username"), habbo.getHabboInfo().getUsername()) + .replace(Emulator.getTexts().getValue("wired.variable.credits"), habbo.getHabboInfo().getCredits() + "") + .replace(Emulator.getTexts().getValue("wired.variable.pixels"), habbo.getHabboInfo().getPixels() + "") + .replace(Emulator.getTexts().getValue("wired.variable.points"), habbo.getHabboInfo().getCurrencyAmount(Emulator.getConfig().getInt("seasonal.primary.type")) + ""); + } + List bots = room.getBots(this.botName); + + for(Bot bot : bots) + { + if(this.mode == 1) + bot.shout(message); + else + bot.talk(message); + } + return true; + } + + @Override + public String getWiredData() + { + return this.getDelay() + "" + ((char)9) + "" + this.mode + "" + ((char)9) + "" + this.botName + "" + ((char)9) + "" + this.message; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String d = set.getString("wired_data"); + String[] data = d.split(((char)9) + ""); + + if(data.length == 4) + { + this.setDelay(Integer.valueOf(data[0])); + this.mode = data[1].equalsIgnoreCase("1") ? 1 : 0; + this.botName = data[2]; + this.message = data[3]; + } + } + + @Override + public void onPickUp() + { + this.mode = 0; + this.botName = ""; + this.message = ""; + this.setDelay(0); + } + + public int getMode() + { + return this.mode; + } + + public void setMode(int mode) + { + this.mode = mode; + } + + public String getBotName() + { + return this.botName; + } + + public void setBotName(String botName) + { + this.botName = botName; + } + + public String getMessage() + { + return this.message; + } + + public void setMessage(String message) + { + this.message = message; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalkToHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalkToHabbo.java new file mode 100644 index 00000000..8ce947fd --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTalkToHabbo.java @@ -0,0 +1,174 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectBotTalkToHabbo extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_TALK_TO_AVATAR; + + private int mode; + private String botName = ""; + private String message = ""; + + public WiredEffectBotTalkToHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectBotTalkToHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName + "" + ((char) 9) + "" + this.message); + message.appendInt(1); + message.appendInt(this.mode); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.mode = packet.readInt(); + String[] data = packet.readString().split("" + ((char) 9)); + + if(data.length == 2) + { + this.botName = data[0]; + this.message = data[1]; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + String m = this.message; + m = m.replace(Emulator.getTexts().getValue("wired.variable.username"), habbo.getHabboInfo().getUsername()) + .replace(Emulator.getTexts().getValue("wired.variable.credits"), habbo.getHabboInfo().getCredits() + "") + .replace(Emulator.getTexts().getValue("wired.variable.pixels"), habbo.getHabboInfo().getPixels() + "") + .replace(Emulator.getTexts().getValue("wired.variable.points"), habbo.getHabboInfo().getCurrencyAmount(Emulator.getConfig().getInt("seasonal.primary.type")) + ""); + + List bots = room.getBots(this.botName); + + for(Bot bot : bots) + { + if(this.mode == 1) + { + bot.whisper(m, habbo); + } + else + { + bot.talk(habbo.getHabboInfo().getUsername() + ": " + m); + } + } + + return true; + } + return false; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "" + ((char) 9) + "" + this.mode + "" + ((char) 9) + "" + this.botName + "" + ((char) 9 ) + "" + this.message; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(((char) 9) + ""); + + if(data.length == 4) + { + this.setDelay(Integer.valueOf(data[0])); + this.mode = data[1].equalsIgnoreCase("1") ? 1 : 0; + this.botName = data[2]; + this.message = data[3]; + } + } + + @Override + public void onPickUp() + { + this.botName = ""; + this.message = ""; + this.mode = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java new file mode 100644 index 00000000..848bbaa6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java @@ -0,0 +1,188 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.RoomUnitTeleport; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class WiredEffectBotTeleport extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_TELEPORT; + + private THashSet items; + private String botName = ""; + + public WiredEffectBotTeleport(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredEffectBotTeleport(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + this.botName = packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(this.items.isEmpty()) + return false; + + List bots = room.getBots(this.botName); + + if(bots.isEmpty()) + return false; + + for(Bot bot : bots) + { + int i = Emulator.getRandom().nextInt(this.items.size()) + 1; + int j = 1; + for (HabboItem item : this.items) + { + if(item.getRoomId() != 0 && item.getRoomId() == bot.getRoom().getId()) + { + if (i == j) + { + int currentEffect = bot.getRoomUnit().getEffectId(); + + room.giveEffect(bot.getRoomUnit(), 4); + Emulator.getThreading().run(new RoomUnitTeleport(bot.getRoomUnit(), room, item.getX(), item.getY(), item.getZ() + (item.getBaseItem().allowSit() ? item.getBaseItem().getHeight() - 0.50 : 0D), currentEffect)); + break; + } else + { + j++; + } + } + } + } + + return true; + } + + @Override + protected String getWiredData() + { + String wiredData = this.getDelay() + "\t" + this.botName + ";"; + + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + if(item.getRoomId() != 0) + { + wiredData += item.getId() + ";"; + } + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 2) + { + this.setDelay(Integer.valueOf(wiredData[0])); + String[] data = wiredData[1].split(";"); + + if (data.length > 1) + { + this.botName = data[0]; + + for (int i = 1; i < data.length; i++) + { + HabboItem item = room.getHabboItem(Integer.valueOf(data[i])); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.botName = ""; + this.items.clear(); + this.setDelay(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java new file mode 100644 index 00000000..bf562eb5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java @@ -0,0 +1,197 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class WiredEffectBotWalkToFurni extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.BOT_MOVE; + + private THashSet items; + private String botName = ""; + + public WiredEffectBotWalkToFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredEffectBotWalkToFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + this.botName = packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(this.items.isEmpty()) + return false; + + List bots = room.getBots(this.botName); + + if(bots.isEmpty()) + return false; + + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + for(Bot bot : bots) + { + int i = Emulator.getRandom().nextInt(this.items.size()) + 1; + int j = 1; + for (HabboItem item : this.items) + { + if(item.getRoomId() != 0 && item.getRoomId() == bot.getRoom().getId()) + { + if (i == j) + { + bot.getRoomUnit().setGoalLocation(room.getLayout().getTile(item.getX(), item.getY())); + break; + } else + { + j++; + } + } + } + } + + return true; + } + + @Override + protected String getWiredData() + { + String wiredData = this.getDelay() + "\t" + this.botName + ";"; + + if(this.items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + if(item.getRoomId() != 0) + { + wiredData += item.getId() + ";"; + } + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length > 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + String[] data = wiredData[1].split(";"); + + if (data.length >= 1) + { + this.botName = data[0]; + + for (int i = 1; i < data.length; i++) + { + HabboItem item = room.getHabboItem(Integer.valueOf(data[i])); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.botName = ""; + this.setDelay(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java new file mode 100644 index 00000000..a7d8c835 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java @@ -0,0 +1,92 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +public class WiredEffectChangeFurniDirection extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.MOVE_DIRECTION; + + private final THashMap items = new THashMap(); + + public WiredEffectChangeFurniDirection(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectChangeFurniDirection(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return false; + } + + @Override + public String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + this.setDelay(0); + this.items.clear(); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for (Map.Entry item : this.items.entrySet()) + { + message.appendInt(item.getKey().getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectForwardToRoom.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectForwardToRoom.java new file mode 100644 index 00000000..9c141ce7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectForwardToRoom.java @@ -0,0 +1,154 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectForwardToRoom extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int roomId = 0; + public WiredEffectForwardToRoom(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectForwardToRoom(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.roomId + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.roomId = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + if(this.roomId > 0) + habbo.getClient().sendResponse(new ForwardToRoomComposer(this.roomId)); + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.roomId; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + this.roomId = 0; + + if(wireData.split("\t").length >= 2) + { + super.setDelay(Integer.valueOf(wireData.split("\t")[0])); + + try + { + this.roomId = Integer.valueOf(getWiredData().split("\t")[1]); + } + catch (Exception e) + {} + } + } + + @Override + public void onPickUp() + { + this.roomId = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveBadge.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveBadge.java new file mode 100644 index 00000000..2fc8cd81 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveBadge.java @@ -0,0 +1,154 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveBadge extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private String badge = ""; + + public WiredEffectGiveBadge(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveBadge(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.badge); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.badge = packet.readString(); + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + if (this.badge.isEmpty()) + return false; + + if (habbo.getInventory().getBadgesComponent().hasBadge(this.badge)) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALREADY_RECEIVED)); + } + else + { + BadgesComponent.createBadge(this.badge, habbo); + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_RECEIVED_BADGE)); + } + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.badge; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + String[] data = wireData.split("\t"); + + if(data.length >= 2) + { + super.setDelay(Integer.valueOf(data[0])); + this.badge = data[1]; + } + } + + @Override + public void onPickUp() + { + this.badge = ""; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} + diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveCredits.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveCredits.java new file mode 100644 index 00000000..9f5b3e21 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveCredits.java @@ -0,0 +1,157 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveCredits extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int credits = 0; + + public WiredEffectGiveCredits(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveCredits(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(true); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.credits + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.credits = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return false; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + habbo.giveCredits(this.credits); + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.credits; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + String[] data = wireData.split("\t"); + this.credits = 0; + + if(data.length >= 2) + { + super.setDelay(Integer.valueOf(data[0])); + + try + { + this.credits = Integer.valueOf(data[1]); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void onPickUp() + { + this.credits = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} + diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDiamonds.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDiamonds.java new file mode 100644 index 00000000..7e823e3e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDiamonds.java @@ -0,0 +1,176 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveDiamonds extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int points = 0; + private int pointsType = -1; + + public WiredEffectGiveDiamonds(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveDiamonds(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.points + (this.pointsType == -1 ? "" : ":" + this.pointsType)); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + loadFromString(packet.readString()); + } + catch (Exception e) + { + return false; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + habbo.getHabboInfo().addCurrencyAmount(this.pointsType == -1 ? Emulator.getConfig().getInt("seasonal.primary.type") : this.pointsType, this.points); + habbo.getClient().sendResponse(new UserPointsComposer(habbo.getHabboInfo().getCurrencyAmount(this.pointsType == -1 ? Emulator.getConfig().getInt("seasonal.primary.type") : this.pointsType), this.points, Emulator.getConfig().getInt("seasonal.primary.type"))); + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.points + (this.pointsType == -1 ? "" : ":" + this.pointsType); + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + String[] data = wireData.split("\t"); + this.points = 0; + + if(data.length >= 2) + { + super.setDelay(Integer.valueOf(data[0])); + + try + { + loadFromString(data[1]); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void onPickUp() + { + this.points = 0; + this.setDelay(0); + } + + private void loadFromString(String data) + { + String[] pointsData = data.split(":"); + + this.pointsType = -1; + if (pointsData.length >= 1) + { + this.points = Integer.valueOf(pointsData[0]); + } + + if (pointsData.length == 2) + { + this.pointsType = Integer.valueOf(pointsData[1]); + } + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDuckets.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDuckets.java new file mode 100644 index 00000000..a4492a5e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveDuckets.java @@ -0,0 +1,159 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveDuckets extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int pixels = 0; + + public WiredEffectGiveDuckets(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveDuckets(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.pixels + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.pixels = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + habbo.getHabboInfo().addCurrencyAmount(0, this.pixels); + habbo.getClient().sendResponse(new UserPointsComposer(habbo.getHabboInfo().getCurrencyAmount(0), this.pixels, 0)); + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.pixels; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + String[] data = wireData.split("\t"); + this.pixels = 0; + + if(data.length >= 2) + { + super.setDelay(Integer.valueOf(data[0])); + + try + { + this.pixels = Integer.valueOf(data[1]); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void onPickUp() + { + this.pixels = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} + diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewBonusRarePoints.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewBonusRarePoints.java new file mode 100644 index 00000000..8bdc04bc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewBonusRarePoints.java @@ -0,0 +1,159 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.hotelview.BonusRareComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveHotelviewBonusRarePoints extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int amount = 0; + + public WiredEffectGiveHotelviewBonusRarePoints(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveHotelviewBonusRarePoints(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.amount + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.amount = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + if(this.amount > 0) + { + habbo.getHabboInfo().addCurrencyAmount(Emulator.getConfig().getInt("hotelview.promotional.points.type"), this.amount); + habbo.getClient().sendResponse(new BonusRareComposer(habbo)); + } + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.amount; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + this.amount = 0; + + if(wireData.split("\t").length >= 2) + { + super.setDelay(Integer.valueOf(wireData.split("\t")[0])); + + try + { + this.amount = Integer.valueOf(getWiredData().split("\t")[1]); + } + catch (Exception e) + {} + } + } + + @Override + public void onPickUp() + { + this.amount = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewHofPoints.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewHofPoints.java new file mode 100644 index 00000000..0b22d745 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveHotelviewHofPoints.java @@ -0,0 +1,157 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveHotelviewHofPoints extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int amount = 0; + + public WiredEffectGiveHotelviewHofPoints(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveHotelviewHofPoints(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.amount + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.amount = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + if(this.amount > 0) + { + habbo.getHabboStats().hofPoints += this.amount; + Emulator.getThreading().run(habbo.getHabboStats()); + } + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.amount; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + this.amount = 0; + + if(wireData.split("\t").length >= 2) + { + super.setDelay(Integer.valueOf(wireData.split("\t")[0])); + + try + { + this.amount = Integer.valueOf(getWiredData().split("\t")[1]); + } + catch (Exception e) + {} + } + } + + @Override + public void onPickUp() + { + this.amount = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveRespect.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveRespect.java new file mode 100644 index 00000000..c73b5daf --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveRespect.java @@ -0,0 +1,159 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveRespect extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int respects = 0; + + public WiredEffectGiveRespect(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveRespect(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.respects + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.respects = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + return false; + + habbo.getHabboStats().respectPointsReceived += this.respects; + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectEarned"), this.respects); + + return true; + } + + @Override + protected String getWiredData() + { + return this.getDelay() + "\t" + this.respects; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + String[] data = wireData.split("\t"); + this.respects = 0; + + if(data.length >= 2) + { + super.setDelay(Integer.valueOf(data[0])); + + try + { + this.respects = Integer.valueOf(data[1]); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void onPickUp() + { + this.respects = 0; + this.setDelay(0); + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveReward.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveReward.java new file mode 100644 index 00000000..2c8aa8f2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveReward.java @@ -0,0 +1,235 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredGiveRewardItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericErrorMessagesComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.UpdateFailedComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import com.eu.habbo.messages.outgoing.unknown.UnknownMessengerErrorComposer; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectGiveReward extends InteractionWiredEffect +{ + public final static int LIMIT_ONCE = 0; + public final static int LIMIT_N_DAY = 1; + public final static int LIMIT_N_HOURS = 2; + public final static int LIMIT_N_MINUTES = 3; + + public final static WiredEffectType type = WiredEffectType.GIVE_REWARD; + public int limit; + public int limitationInterval; + public int given; + public int rewardTime; + public boolean uniqueRewards; + + public THashSet rewardItems = new THashSet(); + + public WiredEffectGiveReward(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveReward(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + return habbo != null && WiredHandler.getReward(habbo, this); + } + + @Override + public String getWiredData() + { + String data = limit + ":" + given + ":"+ rewardTime + ":" + (uniqueRewards ? 1 : 0) + ":" + this.limitationInterval +":" + getDelay() + ":"; + + if(this.rewardItems.isEmpty()) + { + data += "\t"; + } + else + { + for (WiredGiveRewardItem item : this.rewardItems) + { + data += item.toString() + ";"; + } + } + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + if(data.length > 0) + { + this.limit = Integer.valueOf(data[0]); + this.given = Integer.valueOf(data[1]); + this.rewardTime = Integer.valueOf(data[2]); + this.uniqueRewards = data[3].equals("1"); + this.limitationInterval = Integer.valueOf(data[4]); + this.setDelay(Integer.valueOf(data[5])); + + if(data.length > 5) + { + if(!data[6].equalsIgnoreCase("\t")) + { + String[] items = data[6].split(";"); + + this.rewardItems.clear(); + + for (String s : items) + { + try + { + this.rewardItems.add(new WiredGiveRewardItem(s)); + } + catch (Exception e) + {} + } + } + } + } + } + + @Override + public void onPickUp() + { + this.limit = 0; + this.limitationInterval = 0; + this.given = 0; + this.rewardTime = 0; + this.uniqueRewards = false; + this.rewardItems.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(this.rewardItems.size()); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + String s = ""; + + for(WiredGiveRewardItem item : this.rewardItems) + { + s += item.wiredString() + ";"; + } + message.appendString(s); + message.appendInt(4); + message.appendInt(this.rewardTime); + message.appendInt32(this.uniqueRewards); + message.appendInt(this.limit); + message.appendInt(this.limitationInterval); + message.appendInt32(this.limit > 0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.rewardTime = packet.readInt(); + this.uniqueRewards = packet.readInt() == 1; + this.limit = packet.readInt(); + this.limitationInterval = packet.readInt(); + this.given = 0; + + String data = packet.readString(); + + String[] items = data.split(";"); + + this.rewardItems.clear(); + + int i = 1; + for(String s : items) + { + String[] d = s.split(","); + + if(d.length == 3) + { + if (!(d[1].contains(":") || d[1].contains(";"))) + { + this.rewardItems.add(new WiredGiveRewardItem(i, d[0].equalsIgnoreCase("0"), d[1], Integer.valueOf(d[2]))); + continue; + } + } + + gameClient.sendResponse(new UpdateFailedComposer(Emulator.getTexts().getValue("alert.superwired.invalid"))); + return false; + } + + WiredHandler.dropRewards(this.getId()); + + packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + return true; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScore.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScore.java new file mode 100644 index 00000000..f46a78b6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScore.java @@ -0,0 +1,193 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.iterator.TObjectIntIterator; +import gnu.trove.map.TObjectIntMap; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class WiredEffectGiveScore extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.GIVE_SCORE; + + private int score; + private int count; + + private TObjectIntMap> data = new TObjectIntHashMap>(); + + public WiredEffectGiveScore(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectGiveScore(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null && habbo.getHabboInfo().getCurrentGame() != null) + { + Game game = room.getGame(habbo.getHabboInfo().getCurrentGame()); + + if(game == null) + return false; + + TObjectIntIterator> iterator = this.data.iterator(); + + for(int i = this.data.size(); i-- > 0; ) + { + iterator.advance(); + + Map.Entry map = iterator.key(); + + if(map.getValue() == habbo.getHabboInfo().getId()) + { + if(map.getKey() == game.getStartTime()) + { + if(iterator.value() < this.count) + { + iterator.setValue(iterator.value() + 1); + + habbo.getHabboInfo().getGamePlayer().addScore(this.score); + + return true; + } + } + else + { + iterator.remove(); + } + } + } + + this.data.put(new AbstractMap.SimpleEntry(game.getStartTime(), habbo.getHabboInfo().getId()), 1); + + if (habbo.getHabboInfo().getGamePlayer() != null) + { + habbo.getHabboInfo().getGamePlayer().addScore(this.score); + } + + return true; + } + + return false; + } + + @Override + public String getWiredData() + { + return this.score + ";" + this.count + ";" + this.getDelay(); + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(";"); + + if(data.length == 3) + { + this.score = Integer.valueOf(data[0]); + this.count = Integer.valueOf(data[1]); + this.setDelay(Integer.valueOf(data[2])); + } + } + + @Override + public void onPickUp() + { + this.score = 0; + this.count = 0; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return WiredEffectGiveScore.type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(2); + message.appendInt(this.score); + message.appendInt(this.count); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.score = packet.readInt(); + this.count = packet.readInt(); + packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScoreToTeam.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScoreToTeam.java new file mode 100644 index 00000000..00d5910b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectGiveScoreToTeam.java @@ -0,0 +1,145 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GameTeam; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.map.hash.TIntIntHashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectGiveScoreToTeam extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.GIVE_SCORE_TEAM; + + private int points; + private int count; + private GameTeamColors teamColor = GameTeamColors.RED; + + private TIntIntHashMap startTimes = new TIntIntHashMap(); + + public WiredEffectGiveScoreToTeam(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + public WiredEffectGiveScoreToTeam(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + Class game = habbo.getHabboInfo().getCurrentGame(); + + if(game != null) + { + Game g = room.getGame(game); + + if(g != null) + { + int c = this.startTimes.get(g.getStartTime()); + + if(c < this.count) + { + GameTeam team = g.getTeam(this.teamColor); + + if(team != null) + { + team.addTeamScore(this.points); + + this.startTimes.put(g.getStartTime(), c++); + + return true; + } + } + } + } + } + + return false; + } + + @Override + public String getWiredData() + { + return this.points + ";" + this.count + ";" + this.teamColor.type + ";" + this.getDelay(); + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(";"); + + if(data.length == 4) + { + this.points = Integer.valueOf(data[0]); + this.count = Integer.valueOf(data[1]); + this.teamColor = GameTeamColors.values()[Integer.valueOf(data[2])]; + this.setDelay(Integer.valueOf(data[3])); + } + } + + @Override + public void onPickUp() + { + this.startTimes.clear(); + this.points = 0; + this.count = 0; + this.teamColor = GameTeamColors.RED; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(3); + message.appendInt(this.points); + message.appendInt(this.count); + message.appendInt(this.teamColor.type + 1); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.points = packet.readInt(); + this.count = packet.readInt(); + this.teamColor = GameTeamColors.values()[packet.readInt() - 1]; + packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectJoinTeam.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectJoinTeam.java new file mode 100644 index 00000000..0673aa0d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectJoinTeam.java @@ -0,0 +1,156 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.games.wired.WiredGame; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectJoinTeam extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.JOIN_TEAM; + + private GameTeamColors teamColor = GameTeamColors.RED; + + public WiredEffectJoinTeam(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectJoinTeam(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(habbo.getHabboInfo().getGamePlayer() == null) + { + WiredGame game = (WiredGame)room.getGame(WiredGame.class); + + if(game == null) + { + game = new WiredGame(room); + room.addGame(game); + } + + return game.addHabbo(habbo, this.teamColor); + } + } + + return false; + } + + @Override + public String getWiredData() + { + return this.getDelay() + "\t" + this.teamColor.type + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split("\t"); + + if (data.length >= 1) + { + this.setDelay(Integer.valueOf(data[0])); + + if (data.length >= 2) + { + this.teamColor = GameTeamColors.values()[Integer.valueOf(data[1])]; + } + } + } + + @Override + public void onPickUp() + { + this.teamColor = GameTeamColors.RED; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.teamColor.type + 1); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + this.teamColor = GameTeamColors.values()[packet.readInt() - 1]; + int unknownInt = packet.readInt(); + packet.readString(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectKickHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectKickHabbo.java new file mode 100644 index 00000000..0c25642b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectKickHabbo.java @@ -0,0 +1,167 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.threading.runnables.RoomUnitKick; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectKickHabbo extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.KICK_USER; + + private String message = ""; + + public WiredEffectKickHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectKickHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(room == null) + return false; + + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(!habbo.hasPermission("acc_unkickable") && habbo.getHabboInfo().getId() != room.getOwnerId()) + { + room.giveEffect(habbo, 4); + + if(!this.message.isEmpty()) + habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(this.message, habbo, habbo, RoomChatMessageBubbles.ALERT))); + + Emulator.getThreading().run(new RoomUnitKick(habbo, room, true), 2000); + + return true; + } + } + + return false; + } + + @Override + public String getWiredData() + { + return this.getDelay() + "\t" + this.message; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + try + { + String[] data = set.getString("wired_data").split("\t"); + + if (data.length >= 1) + { + this.setDelay(Integer.valueOf(data[0])); + + if (data.length >= 2) + { + this.message = data[1]; + } + } + } + catch (Exception e) + { + this.message = ""; + this.setDelay(0); + } + } + + @Override + public void onPickUp() + { + this.message = ""; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.message); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + this.message = packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLeaveTeam.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLeaveTeam.java new file mode 100644 index 00000000..e75eb2c7 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLeaveTeam.java @@ -0,0 +1,129 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectLeaveTeam extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.LEAVE_TEAM; + + public WiredEffectLeaveTeam(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectLeaveTeam(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(habbo.getHabboInfo().getCurrentGame() != null) + { + Game game = room.getGame(habbo.getHabboInfo().getCurrentGame()); + + if (game != null) + { + game.removeHabbo(habbo); + } + } + } + return true; + } + + @Override + public String getWiredData() + { + return getDelay() + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.setDelay(Integer.valueOf(set.getString("wired_data"))); + } + + @Override + public void onPickUp() + { + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLowerFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLowerFurni.java new file mode 100644 index 00000000..e7dc7cdb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectLowerFurni.java @@ -0,0 +1,172 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectLowerFurni extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.TELEPORT; + + private THashSet items = new THashSet(); + + private int offset = 0; + + public WiredEffectLowerFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectLowerFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(0); + message.appendInt(this.offset); + message.appendInt(0); + message.appendString(""); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.offset = packet.readInt(); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + for(HabboItem item : this.items) + { + if(item.getRoomId() == 0) + continue; + + if(item.getZ() > 0) + { + double z = (0.1) * (double)offset; + double minZ = room.getLayout().getHeightAtSquare(item.getX(), item.getY()); + if(z < minZ) + { + z = minZ; + } + + room.sendComposer(new FloorItemOnRollerComposer(item, null, room.getLayout().getTile(item.getX(), item.getY()), z, room).compose()); + } + } + + return true; + } + + @Override + protected String getWiredData() + { + String wiredData = offset + "\t"; + + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String wiredData = set.getString("wired_data"); + + if(wiredData.contains("\t")) + { + String[] data = wiredData.split("\t"); + + try + { + this.offset = Integer.valueOf(data[0]); + } + catch (Exception e) + {} + + if (data[1].contains(";")) + { + for (String s : data[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.offset = 0; + this.items.clear(); + this.setDelay(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java new file mode 100644 index 00000000..62241fe9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java @@ -0,0 +1,267 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionDice; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredMatchFurniSetting; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.items.ItemStateComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectMatchFurni extends InteractionWiredEffect +{ + private static final WiredEffectType type = WiredEffectType.MATCH_SSHOT; + + private THashSet settings; + + private boolean state = false; + private boolean direction = false; + private boolean position = false; + + public WiredEffectMatchFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.settings = new THashSet(0); + } + + public WiredEffectMatchFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.settings = new THashSet(0); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + THashSet tilesToUpdate = new THashSet<>(this.settings.size()); + //this.refresh(); + for(WiredMatchFurniSetting setting : this.settings) + { + HabboItem item = room.getHabboItem(setting.itemId); + if(item != null) + { + if(this.state && item.allowWiredResetState()) + { + if(!setting.state.equals(" ")) + { + item.setExtradata(setting.state); + } + } + + int oldRotation = item.getRotation(); + if(this.direction) + { + item.setRotation(setting.rotation); + } + + //room.sendComposer(new ItemStateComposer(item).compose()); + room.sendComposer(new FloorItemUpdateComposer(item).compose()); + + if(this.position) + { + RoomTile t = room.getLayout().getTile((short)setting.x, (short)setting.y); + + tilesToUpdate.addAll(room.getLayout().getTilesAt(t, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), oldRotation)); + + double offsetZ = setting.z - item.getZ(); + + room.sendComposer(new FloorItemOnRollerComposer(item, null, t, offsetZ, room).compose()); + tilesToUpdate.addAll(room.getLayout().getTilesAt(room.getLayout().getTile((short) item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), oldRotation)); + } + + item.needsUpdate(true); + } + } + + room.updateTiles(tilesToUpdate); + + return true; + } + + @Override + public String getWiredData() + { + this.refresh(); + + String data = this.settings.size() + ":"; + + if(this.settings.isEmpty()) + { + data += ";"; + } + else + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + for (WiredMatchFurniSetting item : this.settings) + { + HabboItem i = null; + + if (room != null) + { + i = room.getHabboItem(item.itemId); + + if (i != null) + { + data += item.toString(i.allowWiredResetState()) + ";"; + } + } + } + } + + data += ":" + (this.state ? 1 : 0) + ":" + (this.direction ? 1 : 0) + ":" + (this.position ? 1 : 0) + ":" + getDelay(); + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split(":"); + + int itemCount = Integer.valueOf(data[0]); + + String[] items = data[1].split(";"); + + for(int i = 0; i < itemCount; i++) + { + try + { + + String[] stuff = items[i].split("-"); + + if (stuff.length == 6) + this.settings.add(new WiredMatchFurniSetting(Integer.valueOf(stuff[0]), stuff[1], Integer.valueOf(stuff[2]), Integer.valueOf(stuff[3]), Integer.valueOf(stuff[4]), Double.valueOf(stuff[5]))); + + } + catch (Exception e) + { + System.out.println(set.getString("wired_data")); + e.printStackTrace(); + } + } + + this.state = data[2].equals("1"); + this.direction = data[3].equals("1"); + this.position = data[4].equals("1"); + this.setDelay(Integer.valueOf(data[5])); + } + + @Override + public void onPickUp() + { + this.settings.clear(); + this.state = false; + this.direction = false; + this.position = false; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + this.refresh(); + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.settings.size()); + + for(WiredMatchFurniSetting item : this.settings) + message.appendInt(item.itemId); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(3); + message.appendInt(this.state ? 1 : 0); + message.appendInt(this.direction ? 1 : 0); + message.appendInt(this.position ? 1 : 0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + this.settings.clear(); + + //packet.readInt(); + + int count; + packet.readInt(); + + this.state = packet.readInt() == 1; + this.direction = packet.readInt() == 1; + this.position = packet.readInt() == 1; + + packet.readString(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return true; + + count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + int itemId = packet.readInt(); + HabboItem item = room.getHabboItem(itemId); + + if (item != null) + this.settings.add(new WiredMatchFurniSetting(item.getId(), item.allowWiredResetState() ? item.getExtradata() : " ", item.getRotation(), item.getX(), item.getY(), item.getZ())); + } + + this.setDelay(packet.readInt()); + + return true; + } + + private void refresh() + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room != null) + { + THashSet remove = new THashSet(); + + for (WiredMatchFurniSetting setting : this.settings) + { + HabboItem item = room.getHabboItem(setting.itemId); + if (item == null) + { + remove.add(setting); + } + } + + for(WiredMatchFurniSetting setting : remove) + { + this.settings.remove(setting); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniAway.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniAway.java new file mode 100644 index 00000000..35f5fea1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniAway.java @@ -0,0 +1,244 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectMoveFurniAway extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.FLEE; + + private THashSet items = new THashSet(); + + public WiredEffectMoveFurniAway(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectMoveFurniAway(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if (item.getRoomId() == 0) + items.add(item); + } + + this.items.removeAll(items); + + for(HabboItem item : this.items) + { + RoomTile t = room.getLayout().getTile(item.getX(), item.getY()); + double shortest = 1000.0D; + + Habbo target = null; + + for(Habbo habbo : room.getHabbos()) + { + if(habbo.getRoomUnit().getCurrentLocation().distance(t) <= shortest) + { + shortest = habbo.getRoomUnit().getCurrentLocation().distance(t); + target = habbo; + } + } + + if(target != null) + { + + if(RoomLayout.tilesAdjecent(target.getRoomUnit().getCurrentLocation(), room.getLayout().getTile(item.getX(), item.getY())) && (target.getRoomUnit().getX() == item.getX() || target.getRoomUnit().getY() == item.getY())) + { + final Habbo finalTarget = target; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + WiredHandler.handle(WiredTriggerType.COLLISION, finalTarget.getRoomUnit(), room, new Object[]{item}); + } + }, 500); + + continue; + } + + int x = 0; + int y = 0; + + if(target.getRoomUnit().getX() == item.getX()) + { + if (item.getY() < target.getRoomUnit().getY()) + y--; + else + y++; + } + else if(target.getRoomUnit().getY() == item.getY()) + { + if (item.getX() < target.getRoomUnit().getX()) + x--; + else + x++; + } + else if (target.getRoomUnit().getX() - item.getX() > target.getRoomUnit().getY() - item.getY()) + { + if (target.getRoomUnit().getX() - item.getX() > 0 ) + x--; + else + x++; + } + else + { + if (target.getRoomUnit().getY() - item.getY() > 0) + y--; + else + y++; + } + + RoomTile newTile = room.getLayout().getTile((short) (item.getX() + x), (short) (item.getY() + y)); + + if (newTile != null && newTile.state == RoomTileState.OPEN) + { + if (room.getLayout().tileExists(newTile.x, newTile.y)) + { + HabboItem topItem = room.getTopItemAt(newTile.x, newTile.y); + + if (topItem == null || topItem.getBaseItem().allowStack()) + { + double offsetZ = 0; + + if (topItem != null) + offsetZ = topItem.getZ() + topItem.getBaseItem().getHeight() - item.getZ(); + + room.sendComposer(new FloorItemOnRollerComposer(item, null, newTile, offsetZ, room).compose()); + } + } + } + } + } + return true; + } + + @Override + public String getWiredData() + { + String wiredData = this.getDelay() + "\t"; + + if(this.items != null && !this.items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + } + if (wiredData.length == 2) + { + if (wiredData[1].contains(";")) + { + for (String s : wiredData[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTo.java new file mode 100644 index 00000000..571b7c26 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTo.java @@ -0,0 +1,248 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class WiredEffectMoveFurniTo extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.MOVE_FURNI_TO; + private final List items = new ArrayList<>(); + private int direction; + private int spacing = 1; + private Map indexOffset = new LinkedHashMap<>(); + + public WiredEffectMoveFurniTo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectMoveFurniTo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return false; + + this.items.clear(); + this.indexOffset.clear(); + + packet.readInt(); + + this.direction = packet.readInt(); + this.spacing = packet.readInt(); + packet.readString(); + + int count = packet.readInt(); + for (int i = 0; i < count; i++) + { + this.items.add(room.getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + List items = new ArrayList(); + + synchronized (this.items) + { + for (HabboItem item : this.items) + { + if (Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for (HabboItem item : items) + { + this.items.remove(item); + } + + if (this.items.isEmpty()) + return false; + + if (stuff != null && stuff.length > 0) + { + for (Object object : stuff) + { + if (object instanceof HabboItem) + { + HabboItem targetItem = this.items.get(Emulator.getRandom().nextInt(this.items.size())); + + if (targetItem != null) + { + int indexOffset = 0; + if (!this.indexOffset.containsKey(targetItem.getId())) + { + this.indexOffset.put(targetItem.getId(), indexOffset); + } + else + { + indexOffset = this.indexOffset.get(targetItem.getId()) + spacing; + } + + RoomTile objectTile = room.getLayout().getTile(((HabboItem) targetItem).getX(), ((HabboItem) targetItem).getY()); + + if (objectTile != null) + { + THashSet refreshTiles = room.getLayout().getTilesAt(room.getLayout().getTile(((HabboItem) object).getX(), ((HabboItem) object).getY()), ((HabboItem) object).getBaseItem().getWidth(), ((HabboItem) object).getBaseItem().getLength(), ((HabboItem) object).getRotation()); + + RoomTile tile = room.getLayout().getTileInFront(objectTile, this.direction, indexOffset); + if (tile == null || !tile.allowStack()) + { + indexOffset = 0; + tile = room.getLayout().getTileInFront(objectTile, this.direction, indexOffset); + } + + room.sendComposer(new FloorItemOnRollerComposer((HabboItem) object, null, tile, tile.getStackHeight() - ((HabboItem) object).getZ(), room).compose()); + refreshTiles.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(((HabboItem) object).getX(), ((HabboItem) object).getY()), ((HabboItem) object).getBaseItem().getWidth(), ((HabboItem) object).getBaseItem().getLength(), ((HabboItem) object).getRotation())); + room.updateTiles(refreshTiles); + this.indexOffset.put(targetItem.getId(), indexOffset); + } + } + } + } + } + } + + return true; + } + + @Override + public String getWiredData() + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + String data = this.direction + "\t" + this.spacing + "\t" + this.getDelay() + "\t"; + + for(HabboItem item : this.items) + { + data += item.getId() + "\r"; + } + + return data; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + synchronized (this.items) + { + for (HabboItem item : this.items) + { + if (item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for (HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for (HabboItem item : this.items) + message.appendInt(item.getId()); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(2); + message.appendInt(this.direction); + message.appendInt(this.spacing); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + synchronized (this.items) + { + this.items.clear(); + + String[] data = set.getString("wired_data").split("\t"); + + if (data.length == 4) + { + try + { + this.direction = Integer.valueOf(data[0]); + this.spacing = Integer.valueOf(data[1]); + this.setDelay(Integer.valueOf(data[2])); + } + catch (Exception e) + { + } + + for (String s : data[3].split("\r")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.setDelay(0); + this.items.clear(); + this.direction = 0; + this.spacing = 0; + this.indexOffset.clear(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTowards.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTowards.java new file mode 100644 index 00000000..2f36141d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveFurniTowards.java @@ -0,0 +1,249 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectMoveFurniTowards extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.CHASE; + + private THashSet items; + + public WiredEffectMoveFurniTowards(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + items = new THashSet(); + } + + public WiredEffectMoveFurniTowards(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if (item.getRoomId() == 0) + items.add(item); + } + + this.items.removeAll(items); + + for(HabboItem item : this.items) + { + RoomTile t = room.getLayout().getTile(item.getX(), item.getY()); + double shortest = 1000.0D; + + Habbo target = null; + + for(Habbo habbo : room.getHabbos()) + { + RoomTile h = habbo.getRoomUnit().getCurrentLocation(); + + double distance = t.distance(h); + if(distance <= shortest) + { + target = habbo; + shortest = distance; + } + } + + if(target != null) + { + if(RoomLayout.tilesAdjecent(target.getRoomUnit().getCurrentLocation(), room.getLayout().getTile(this.getX(), this.getY())) && (target.getRoomUnit().getX() == item.getX() || target.getRoomUnit().getY() == item.getY())) + { + final Habbo finalTarget = target; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + WiredHandler.handle(WiredTriggerType.COLLISION, finalTarget.getRoomUnit(), room, new Object[]{item}); + } + }, 500); + + continue; + } + + int x = 0; + int y = 0; + + if(target.getRoomUnit().getX() == item.getX()) + { + if (item.getY() < target.getRoomUnit().getY()) + y++; + else + y--; + } + else if(target.getRoomUnit().getY() == item.getY()) + { + if (item.getX() < target.getRoomUnit().getX()) + x++; + else + x--; + } + else if (target.getRoomUnit().getX() - item.getX() > target.getRoomUnit().getY() - item.getY()) + { + if (target.getRoomUnit().getX() - item.getX() > 0 ) + x++; + else + x--; + } + else + { + if (target.getRoomUnit().getY() - item.getY() > 0) + y++; + else + y--; + } + + RoomTile newTile = room.getLayout().getTile((short) (item.getX() + x), (short) (item.getY() + y)); + + if (newTile != null && newTile.state == RoomTileState.OPEN) + { + if (room.getLayout().tileExists(newTile.x, newTile.y)) + { + HabboItem topItem = room.getTopItemAt(newTile.x, newTile.y); + + if (topItem == null || topItem.getBaseItem().allowStack()) + { + double offsetZ = 0; + + if (topItem != null) + offsetZ = topItem.getZ() + topItem.getBaseItem().getHeight() - item.getZ(); + + room.sendComposer(new FloorItemOnRollerComposer(item, null, newTile, offsetZ, room).compose()); + } + } + } + } + } + + return true; + } + + @Override + public String getWiredData() + { + String wiredData = getDelay() + "\t"; + + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + } + if (wiredData.length == 2) + { + if (wiredData[1].contains(";")) + { + for (String s : wiredData[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveRotateFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveRotateFurni.java new file mode 100644 index 00000000..44301293 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMoveRotateFurni.java @@ -0,0 +1,317 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import gnu.trove.set.hash.THashSet; + +import java.awt.*; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectMoveRotateFurni extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.MOVE_ROTATE; + + private int direction; + private int rotation; + private final THashSet items = new THashSet(); + + public WiredEffectMoveRotateFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectMoveRotateFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + THashSet items = new THashSet(); + + synchronized (this.items) + { + for (HabboItem item : this.items) + { + if (Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for (HabboItem item : items) + { + this.items.remove(item); + } + + for (HabboItem item : this.items) + { + if (this.rotation > 0) + { + THashSet tiles = room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + if (this.rotation == 1) + { + item.setRotation(item.getRotation() + 2); + } + else if (this.rotation == 2) + { + item.setRotation(item.getRotation() + 6); + } + else if (this.rotation == 3) + { + if (Emulator.getRandom().nextInt(2) == 1) + { + item.setRotation(item.getRotation() + 2); + } + else + { + item.setRotation(item.getRotation() + 6); + } + } + + if (this.direction == 0) + { + tiles.addAll(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); + room.updateTiles(tiles); + room.sendComposer(new FloorItemUpdateComposer(item).compose()); + } + } + + if (this.direction > 0) + { + RoomUserRotation moveDirection = RoomUserRotation.NORTH; + + if (this.direction == 1) + { + moveDirection = RoomUserRotation.values()[Emulator.getRandom().nextInt(RoomUserRotation.values().length)]; + } + else if (this.direction == 2) + { + if (Emulator.getRandom().nextInt(2) == 1) + { + moveDirection = RoomUserRotation.EAST; + } + else + { + moveDirection = RoomUserRotation.WEST; + } + } + else if (this.direction == 3) + { + if (Emulator.getRandom().nextInt(2) == 1) + { + moveDirection = RoomUserRotation.NORTH; + } + else + { + moveDirection = RoomUserRotation.SOUTH; + } + } + else if (this.direction == 4) + { + moveDirection = RoomUserRotation.SOUTH; + } + else if (this.direction == 5) + { + moveDirection = RoomUserRotation.EAST; + } + else if (this.direction == 6) + { + moveDirection = RoomUserRotation.NORTH; + } + else if (this.direction == 7) + { + moveDirection = RoomUserRotation.WEST; + } + + RoomTile newTile = room.getLayout().getTile( + (short) (item.getX() + ((moveDirection == RoomUserRotation.WEST || moveDirection == RoomUserRotation.NORTH_WEST || moveDirection == RoomUserRotation.SOUTH_WEST) ? -1 : (((moveDirection == RoomUserRotation.EAST || moveDirection == RoomUserRotation.SOUTH_EAST || moveDirection == RoomUserRotation.NORTH_EAST) ? 1 : 0)))), + (short) (item.getY() + ((moveDirection == RoomUserRotation.NORTH || moveDirection == RoomUserRotation.NORTH_EAST || moveDirection == RoomUserRotation.NORTH_WEST) ? 1 : ((moveDirection == RoomUserRotation.SOUTH || moveDirection == RoomUserRotation.SOUTH_EAST || moveDirection == RoomUserRotation.SOUTH_WEST) ? -1 : 0))) + ); + + if (newTile != null && room.tileWalkable(newTile)) + { + Rectangle rectangle = new Rectangle(newTile.x, + newTile.y, + item.getBaseItem().getWidth(), + item.getBaseItem().getLength()); + + for (int x = rectangle.x; x < rectangle.x + rectangle.getWidth(); x++) + { + for (int y = rectangle.y; y < rectangle.y + rectangle.getHeight(); y++) + { + HabboItem i = room.getTopItemAt(x, y, item); + + if (i == null || i == item || i.getBaseItem().allowStack()) + { + double offset = room.getStackHeight(newTile.x, newTile.y, false) - item.getZ(); + room.sendComposer(new FloorItemOnRollerComposer(item, null, newTile, offset, room).compose()); + } + } + } + } + } + } + } + + return true; + } + + @Override + public String getWiredData() + { + THashSet items = new THashSet(); + + this.items.remove(null); + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || (room != null && room.getHabboItem(item.getId()) == null)) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + String data = this.direction + "\t" + + this.rotation + "\t" + + this.getDelay() + "\t"; + + for(HabboItem item : this.items) + { + data += item.getId() + "\r"; + } + + return data; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + synchronized (this.items) + { + this.items.clear(); + + String[] data = set.getString("wired_data").split("\t"); + + if (data.length == 4) + { + try + { + this.direction = Integer.valueOf(data[0]); + this.rotation = Integer.valueOf(data[1]); + this.setDelay(Integer.valueOf(data[2])); + } + catch (Exception e) + { + } + + for (String s : data[3].split("\r")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.direction = 0; + this.rotation = 0; + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return this.type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + synchronized (this.items) + { + for (HabboItem item : this.items) + { + if (item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for (HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for (HabboItem item : this.items) + message.appendInt(item.getId()); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(2); + message.appendInt(this.direction); + message.appendInt(this.rotation); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); + + if(room == null) + return false; + + packet.readInt(); + + this.direction = packet.readInt(); + this.rotation = packet.readInt(); + + packet.readString(); + + int count = packet.readInt(); + + synchronized (this.items) + { + this.items.clear(); + for (int i = 0; i < count; i++) + { + this.items.add(room.getHabboItem(packet.readInt())); + } + } + + this.setDelay(packet.readInt()); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMuteHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMuteHabbo.java new file mode 100644 index 00000000..e371bd1a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMuteHabbo.java @@ -0,0 +1,130 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectMuteHabbo extends InteractionWiredEffect +{ + private static final WiredEffectType type = WiredEffectType.MUTE_TRIGGER; + + private int length = 5; + private String message = ""; + + public WiredEffectMuteHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectMuteHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.message); + message.appendInt(1); + message.appendInt(this.length); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + this.length = packet.readInt(); + this.message = packet.readString(); + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(roomUnit == null) + return true; + + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (room.hasRights(habbo)) + return false; + + room.muteHabbo(habbo, 60); + + habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(message.replace("%user%", habbo.getHabboInfo().getUsername()).replace("%online_count%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "").replace("%room_count%", Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + ""), habbo, habbo, RoomChatMessageBubbles.WIRED))); + } + + return true; + } + + @Override + public String getWiredData() + { + return getDelay() + "\t" + this.length + "\t" + this.message; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split("\t"); + + if (data.length >= 3) + { + try + { + this.setDelay(Integer.valueOf(data[0])); + this.length = Integer.valueOf(data[1]); + this.message = data[2]; + } + catch (Exception e) + {} + } + } + + @Override + public void onPickUp() + { + this.setDelay(0); + this.message = ""; + this.length = 0; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRaiseFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRaiseFurni.java new file mode 100644 index 00000000..338261e4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRaiseFurni.java @@ -0,0 +1,163 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredEffectRaiseFurni extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.TELEPORT; + + private THashSet items = new THashSet(); + + private int offset = 0; + + public WiredEffectRaiseFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectRaiseFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(0); + message.appendInt(this.offset); + message.appendInt(0); + message.appendString(""); + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.offset = packet.readInt(); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + for(HabboItem item : this.items) + { + if(item.getRoomId() == 0) + continue; + + double offsetZ = (item.getZ() + ((0.1) * offset)) % 127; + room.sendComposer(new FloorItemOnRollerComposer(item, null, room.getLayout().getTile(item.getX(), item.getY()), offsetZ, room).compose()); + } + + return true; + } + + @Override + protected String getWiredData() + { + String wiredData = offset + "\t"; + + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String wiredData = set.getString("wired_data"); + + if(wiredData.contains("\t")) + { + String[] data = wiredData.split("\t"); + + try + { + this.offset = Integer.valueOf(data[0]); + } + catch (Exception e) + {} + + if (data[1].contains(";")) + { + for (String s : data[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.offset = 0; + this.items.clear(); + this.setDelay(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectResetTimers.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectResetTimers.java new file mode 100644 index 00000000..7bcd4c72 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectResetTimers.java @@ -0,0 +1,134 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.WiredResetTimers; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectResetTimers extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.RESET_TIMERS; + + private int delay = 0; + + public WiredEffectResetTimers(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectResetTimers(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.getDelay()); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + packet.readInt(); + this.delay = packet.readInt(); + this.setDelay(this.delay); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Emulator.getThreading().run(new WiredResetTimers(room), this.delay); + + return true; + } + + @Override + public String getWiredData() + { + return this.delay + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String data = set.getString("wired_data"); + + try + { + if (!data.equals("")) + this.delay = Integer.valueOf(data); + } + catch (Exception e) + { + } + + this.setDelay(this.delay); + } + + @Override + public void onPickUp() + { + this.delay = 0; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRollerSpeed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRollerSpeed.java new file mode 100644 index 00000000..8e7b6b94 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectRollerSpeed.java @@ -0,0 +1,143 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectRollerSpeed extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + private int speed = 4; + + public WiredEffectRollerSpeed(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectRollerSpeed(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.speed + ""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + try + { + this.speed = Integer.valueOf(packet.readString()); + } + catch (Exception e) + { + return false; + } + packet.readInt(); + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + room.setRollerSpeed(this.speed); + + return true; + } + + @Override + public String getWiredData() + { + return this.getDelay() + "\t" + this.speed; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + String[] data = wireData.split("\t"); + this.speed = 0; + + if(data.length >= 2) + { + super.setDelay(Integer.valueOf(data[0])); + + try + { + this.speed = Integer.valueOf(data[1]); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void onPickUp() + { + this.speed = 4; + this.setDelay(0); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTeleport.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTeleport.java new file mode 100644 index 00000000..6fe16d9a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTeleport.java @@ -0,0 +1,231 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.RoomUnitTeleport; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectTeleport extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.TELEPORT; + + protected THashSet items; + + public WiredEffectTeleport(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredEffectTeleport(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + message.appendInt(item.getId()); + + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo == null) + { + return false; + } + + if(!this.items.isEmpty()) + { + int i = Emulator.getRandom().nextInt(this.items.size()) + 1; + int j = 1; + + for (HabboItem item : this.items) + { + if (i == j) + { + int currentEffect = habbo.getRoomUnit().getEffectId(); + + room.giveEffect(habbo, 4); + Emulator.getThreading().run(new RoomUnitTeleport(habbo.getRoomUnit(), room, item.getX(), item.getY(), item.getZ() + (item.getBaseItem().allowSit() ? item.getBaseItem().getHeight() - 0.50 : 0D), currentEffect), WiredHandler.TELEPORT_DELAY); + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + try + { + item.onWalkOn(habbo.getRoomUnit(), room, new Object[]{}); + } + catch (Exception e) + {} + } + }, WiredHandler.TELEPORT_DELAY); + break; + } else + { + j++; + } + } + return true; + } + + return false; + } + + @Override + public String getWiredData() + { + String wiredData = this.getDelay() + "\t"; + + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + } + if (wiredData.length == 2) + { + if (wiredData[1].contains(";")) + { + for (String s : wiredData[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } + + @Override + protected long requiredCooldown() + { + return 0; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleFurni.java new file mode 100644 index 00000000..6d4ef810 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleFurni.java @@ -0,0 +1,256 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionCrackable; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeBlock; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTile; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectToggleFurni extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.TOGGLE_STATE; + + private final THashSet items; + + public WiredEffectToggleFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredEffectToggleFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + synchronized (this.items) + { + THashSet items = new THashSet(); + + for (HabboItem item : this.items) + { + if (item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for (HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for (HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + synchronized (this.items) + { + this.items.clear(); + + int count = packet.readInt(); + + for (int i = 0; i < count; i++) + { + HabboItem item = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt()); + + if (item instanceof InteractionFreezeBlock || item instanceof InteractionFreezeTile || item instanceof InteractionCrackable) + continue; + + this.items.add(item); + } + } + + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + synchronized (this.items) + { + Habbo habbo = room.getHabbo(roomUnit); + + HabboItem triggerItem = null; + + if (stuff != null && stuff.length > 0) + { + if (stuff[0] instanceof HabboItem) + { + triggerItem = (HabboItem) stuff[0]; + } + } + + THashSet itemsToRemove = new THashSet<>(); + for (HabboItem item : this.items) + { + if (item == null || item.getRoomId() == 0 || item instanceof InteractionFreezeBlock || item instanceof InteractionFreezeTile) + { + itemsToRemove.add(item); + continue; + } + + if (triggerItem == null && roomUnit == null)// && triggerItem.getId() == item.getId()) + { + continue; + } + + try + { + if (item.getBaseItem().getStateCount() > 1 || item instanceof InteractionGameTimer) + { + if (item instanceof InteractionGameTimer) + { + Game game = room.getGame(((InteractionGameTimer)item).getGameType()); + if (game == null || game.isRunning) + { + continue; + } + } + + item.onClick(habbo != null ? habbo.getClient() : null, room, new Object[]{item.getExtradata().length() == 0 ? 0 : Integer.valueOf(item.getExtradata()), this.getType()}); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + this.items.removeAll(itemsToRemove); + } + return true; + } + + @Override + public String getWiredData() + { + String wiredData = this.getDelay() + "\t"; + + synchronized (this.items) + { + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + synchronized (this.items) + { + this.items.clear(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + } + if (wiredData.length == 2) + { + if (wiredData[1].contains(";")) + { + for (String s : wiredData[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item instanceof InteractionFreezeBlock || item instanceof InteractionFreezeTile || item instanceof InteractionCrackable) + continue; + + if (item != null) + this.items.add(item); + } + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleRandom.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleRandom.java new file mode 100644 index 00000000..b0805fd3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectToggleRandom.java @@ -0,0 +1,210 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionCrackable; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeBlock; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectToggleRandom extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.TOGGLE_RANDOM; + + private final THashSet items = new THashSet(); + + public WiredEffectToggleRandom(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectToggleRandom(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + synchronized (this.items) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for (int i = 0; i < count; i++) + { + HabboItem item = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt()); + + if (item instanceof InteractionFreezeBlock || item instanceof InteractionGameTimer || item instanceof InteractionCrackable) + continue; + + this.items.add(item); + } + + this.setDelay(packet.readInt()); + } + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + THashSet items = this.items; + + for(HabboItem item : items) + { + if(item.getRoomId() == 0) + { + this.items.remove(item); + continue; + } + + try + { + item.setExtradata(Emulator.getRandom().nextInt(item.getBaseItem().getStateCount() + 1) + ""); + room.updateItem(item); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + return true; + } + + @Override + public String getWiredData() + { + String wiredData = getDelay() + "\t"; + + if(!items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + } + if (wiredData.length == 2) + { + if (wiredData[1].contains(";")) + { + for (String s : wiredData[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item instanceof InteractionFreezeBlock || item instanceof InteractionGameTimer || item instanceof InteractionCrackable) + continue; + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTriggerStacks.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTriggerStacks.java new file mode 100644 index 00000000..0092e643 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectTriggerStacks.java @@ -0,0 +1,219 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectTriggerStacks extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.CALL_STACKS; + + private THashSet items; + + public WiredEffectTriggerStacks(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredEffectTriggerStacks(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId() || Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + this.setDelay(packet.readInt()); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if (stuff.length >= 1 && stuff[stuff.length - 1] instanceof WiredEffectTriggerStacks) + { + return false; + } + + THashSet usedTiles = new THashSet(); + + boolean found; + + for(HabboItem item : this.items) + { + //if(item instanceof InteractionWiredTrigger) + { + found = false; + for(RoomTile tile : usedTiles) + { + if(tile.x == item.getX() && tile.y == item.getY()) + { + found = true; + break; + } + } + + if(!found) + { + usedTiles.add(room.getLayout().getTile(item.getX(), item.getY())); + } + } + } + + Object[] newStuff = new Object[stuff.length + 1]; + System.arraycopy(stuff, 0, newStuff, 0, stuff.length); + newStuff[newStuff.length - 1] = this; + WiredHandler.executeEffectsAtTiles(usedTiles, roomUnit, room, stuff); + + return true; + } + + @Override + public String getWiredData() + { + String wiredData = this.getDelay() + "\t"; + + if(items != null && !items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String[] wiredData = set.getString("wired_data").split("\t"); + + if (wiredData.length >= 1) + { + this.setDelay(Integer.valueOf(wiredData[0])); + } + if (wiredData.length == 2) + { + if (wiredData[1].contains(";")) + { + for (String s : wiredData[1].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + protected long requiredCooldown() + { + return 2500; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectWhisper.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectWhisper.java new file mode 100644 index 00000000..6813f4cf --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectWhisper.java @@ -0,0 +1,154 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.effects; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredEffectWhisper extends InteractionWiredEffect +{ + public static final WiredEffectType type = WiredEffectType.SHOW_MESSAGE; + + protected String message = ""; + + public WiredEffectWhisper(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredEffectWhisper(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.message); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(this.getDelay()); + + if (this.requiresTriggeringUser()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getTriggers(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredTrigger object) + { + if (!object.isTriggeredByRoomUnit()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet, GameClient gameClient) + { + packet.readInt(); + + this.message = Emulator.getGameEnvironment().getWordFilter().filter(packet.readString(), null); + packet.readInt(); + this.setDelay(packet.readInt()); + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(this.message.length() > 0) + { + if(roomUnit != null) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(message.replace("%user%", habbo.getHabboInfo().getUsername()).replace("%online_count%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "").replace("%room_count%", Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + ""), habbo, habbo, RoomChatMessageBubbles.WIRED))); + return true; + } + } + else + { + for(Habbo h : room.getHabbos()) + { + h.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(message.replace("%user%", h.getHabboInfo().getUsername()).replace("%online_count%", Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "").replace("%room_count%", Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + ""), h, h, RoomChatMessageBubbles.WIRED))); + } + + return true; + } + } + return false; + } + + @Override + public String getWiredData() + { + return this.getDelay() + "\t" + this.message; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String wireData = set.getString("wired_data"); + this.message = ""; + + if(wireData.split("\t").length >= 2) + { + super.setDelay(Integer.valueOf(wireData.split("\t")[0])); + this.message = wireData.split("\t")[1]; + } + } + + @Override + public void onPickUp() + { + this.message = ""; + this.setDelay(0); + } + + @Override + public WiredEffectType getType() + { + return type; + } + + @Override + public boolean requiresTriggeringUser() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraRandom.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraRandom.java new file mode 100644 index 00000000..1b414fe5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraRandom.java @@ -0,0 +1,59 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.extra; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredExtra; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredExtraRandom extends InteractionWiredExtra +{ + public WiredExtraRandom(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredExtraRandom(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return false; + } + + @Override + protected String getWiredData() + { + return null; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraUnseen.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraUnseen.java new file mode 100644 index 00000000..9ce77ab6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/extra/WiredExtraUnseen.java @@ -0,0 +1,105 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.extra; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredExtra; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredExtraUnseen extends InteractionWiredExtra +{ + public List seenList = new ArrayList<>(); + + public WiredExtraUnseen(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredExtraUnseen(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return false; + } + + @Override + protected String getWiredData() + { + return null; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + this.seenList.clear(); + } + + @Override + public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + + } + + @Override + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + super.onMove(room, oldLocation, newLocation); + this.seenList.clear(); + } + + public InteractionWiredEffect getUnseenEffect(List effects) + { + List unseenEffects = new ArrayList<>(); + for (InteractionWiredEffect effect : effects) + { + if (!this.seenList.contains(effect.getId())) + { + unseenEffects.add(effect); + } + } + + InteractionWiredEffect effect = null; + if (!unseenEffects.isEmpty()) + { + effect = unseenEffects.get(0); + } + else + { + this.seenList.clear(); + + if (!effects.isEmpty()) + { + effect = effects.get(0); + } + } + + if (effect != null) + { + this.seenList.add(effect.getId()); + } + return effect; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtSetTime.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtSetTime.java new file mode 100644 index 00000000..88ce4c83 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtSetTime.java @@ -0,0 +1,138 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.items.interactions.wired.WiredTriggerReset; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.WiredExecuteTask; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerAtSetTime extends InteractionWiredTrigger implements WiredTriggerReset +{ + public final static WiredTriggerType type = WiredTriggerType.AT_GIVEN_TIME; + + public int executeTime; + public int taskId; + + public WiredTriggerAtSetTime(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerAtSetTime(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return true; + } + + @Override + public String getWiredData() + { + return this.executeTime + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + if(set.getString("wired_data").length() >= 1) + { + this.executeTime = (Integer.valueOf(set.getString("wired_data"))); + } + + if(this.executeTime < 500) + { + this.executeTime = 20 * 500; + } + this.taskId = 1; + Emulator.getThreading().run(new WiredExecuteTask(this, Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId())), executeTime); + } + + @Override + public void onPickUp() + { + this.executeTime = 0; + this.taskId = 0; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.executeTime / 500); + message.appendInt(1); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + this.executeTime = packet.readInt() * 500; + + this.resetTimer(); + + return true; + } + + @Override + public void resetTimer() + { + this.taskId++; + + Emulator.getThreading().run(new WiredExecuteTask(this, Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId())), executeTime); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtTimeLong.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtTimeLong.java new file mode 100644 index 00000000..804f9755 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerAtTimeLong.java @@ -0,0 +1,137 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.items.interactions.wired.WiredTriggerReset; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.WiredExecuteTask; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerAtTimeLong extends InteractionWiredTrigger implements WiredTriggerReset +{ + private static final WiredTriggerType type = WiredTriggerType.AT_GIVEN_TIME; + + private int executeTime; + public int taskId; + + public WiredTriggerAtTimeLong(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerAtTimeLong(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return true; + } + + @Override + public String getWiredData() + { + return this.executeTime + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + if(set.getString("wired_data").length() >= 1) + { + this.executeTime = (Integer.valueOf(set.getString("wired_data"))); + } + + if(this.executeTime < 500) + { + this.executeTime = 20 * 500; + } + this.taskId = 1; + Emulator.getThreading().run(new WiredExecuteTask(this, Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId())), executeTime); + } + + @Override + public void onPickUp() + { + this.executeTime = 0; + this.taskId = 0; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.executeTime / 500); + message.appendInt(1); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.executeTime = packet.readInt() * 500; + + return true; + } + + @Override + public void resetTimer() + { + this.taskId++; + + Emulator.getThreading().run(new WiredExecuteTask(this, Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId())), executeTime); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedFurni.java new file mode 100644 index 00000000..87d8e1b9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedFurni.java @@ -0,0 +1,207 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerBotReachedFurni extends InteractionWiredTrigger +{ + public final static WiredTriggerType type = WiredTriggerType.BOT_REACHED_STF; + + private THashSet items; + private String botName = ""; + + public WiredTriggerBotReachedFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredTriggerBotReachedFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + if(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()) == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.botName = packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + List bots = room.getBots(this.botName); + + for(Bot bot : bots) + { + if(bot.getRoomUnit().equals(roomUnit)) + { + for(Object o : stuff) + { + if(this.items.contains(o)) + return true; + } + } + } + + return false; + } + + @Override + protected String getWiredData() + { + String wiredData = this.botName + ":"; + + if(!items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + + String[] data = set.getString("wired_data").split(":"); + + if(data.length == 1) + { + this.botName = data[0]; + } + else if(data.length == 2) + { + this.botName = data[0]; + + String[] items = data[1].split(";"); + + for(int i = 0; i < items.length; i++) + { + try + { + HabboItem item = room.getHabboItem(Integer.valueOf(items[i])); + + if (item != null) + this.items.add(item); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.botName = ""; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedHabbo.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedHabbo.java new file mode 100644 index 00000000..23e2bc5a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerBotReachedHabbo.java @@ -0,0 +1,103 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class WiredTriggerBotReachedHabbo extends InteractionWiredTrigger +{ + public final static WiredTriggerType type = WiredTriggerType.BOT_REACHED_AVTR; + + private String botName = ""; + + public WiredTriggerBotReachedHabbo(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerBotReachedHabbo(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.botName); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.botName = packet.readString(); + + return true; + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(stuff.length == 0) + return false; + + List bots = room.getBots(this.botName); + + for(Bot bot : bots) + { + if(bot.getRoomUnit().equals(stuff[0])) + return true; + } + return false; + } + + @Override + protected String getWiredData() + { + return this.botName; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.botName = set.getString("wired_data"); + } + + @Override + public void onPickUp() + { + this.botName = ""; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerCollision.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerCollision.java new file mode 100644 index 00000000..5abdab55 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerCollision.java @@ -0,0 +1,87 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerCollision extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.COLLISION; + + public WiredTriggerCollision(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerCollision(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(stuff.length > 0) + { + return stuff[0] instanceof HabboItem; + } + + return false; + } + + @Override + public String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + + } + + @Override + public void onPickUp() + { + + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(type.code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerFurniStateToggled.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerFurniStateToggled.java new file mode 100644 index 00000000..b8c1cf13 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerFurniStateToggled.java @@ -0,0 +1,187 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerFurniStateToggled extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.STATE_CHANGED; + + private THashSet items; + private String message = ""; + + public WiredTriggerFurniStateToggled(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredTriggerFurniStateToggled(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(stuff.length >= 1) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + for (Object object : stuff) + { + if (object instanceof WiredEffectType) + { + return false; + } + } + + if (stuff[0] instanceof HabboItem) + { + if(items.contains(stuff[0])) + { + return true; + } + } + } + } + return false; + } + + @Override + public String getWiredData() + { + String wiredData = super.getDelay() + ":\t:"; + + if(items != null) + { + if (!items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } else + wiredData += "\t"; + } + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items = new THashSet(); + String wiredData = set.getString("wired_data"); + if(wiredData.split(":").length >= 3) + { + super.setDelay(Integer.valueOf(wiredData.split(":")[0])); + this.message = wiredData.split(":")[1]; + + if (!wiredData.split(":")[2].equals("\t")) + { + for (String s : wiredData.split(":")[2].split(";")) + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.message = ""; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.items) + { + if(item.getRoomId() != this.getRoomId()) + { + items.add(item); + continue; + } + + if (room.getHabboItem(item.getId()) == null) + { + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.message); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + return true; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameEnds.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameEnds.java new file mode 100644 index 00000000..c6eb33dc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameEnds.java @@ -0,0 +1,107 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerGameEnds extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.GAME_ENDS; + + public WiredTriggerGameEnds(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerGameEnds(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return true; + } + + @Override + public String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + return; + } + + @Override + public void onPickUp() + { + + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameStarts.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameStarts.java new file mode 100644 index 00000000..42b9f990 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerGameStarts.java @@ -0,0 +1,107 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerGameStarts extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.GAME_STARTS; + + public WiredTriggerGameStarts(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerGameStarts(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return true; + } + + @Override + public String getWiredData() + { + return ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + return; + } + + @Override + public void onPickUp() + { + + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboEntersRoom.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboEntersRoom.java new file mode 100644 index 00000000..84653ad4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboEntersRoom.java @@ -0,0 +1,106 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerHabboEntersRoom extends InteractionWiredTrigger +{ + public static final WiredTriggerType type = WiredTriggerType.ENTER_ROOM; + + private String username = ""; + + public WiredTriggerHabboEntersRoom(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerHabboEntersRoom(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if(username.length() > 0) + { + if(habbo.getHabboInfo().getUsername().equalsIgnoreCase(this.username)) + { + return true; + } + return false; + } + + return true; + } + return false; + } + + @Override + public String getWiredData() + { + return this.username; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.username = set.getString("wired_data"); + } + + @Override + public void onPickUp() + { + this.username = ""; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.username); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + this.username = packet.readString(); + + return true; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysCommand.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysCommand.java new file mode 100644 index 00000000..54370120 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysCommand.java @@ -0,0 +1,123 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerHabboSaysCommand extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.SAY_COMMAND; + + private boolean ownerOnly = false; + private String key = ""; + + public WiredTriggerHabboSaysCommand(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerHabboSaysCommand(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if (this.key.length() > 0) + { + if (stuff[0] instanceof String) + { + if (((String) stuff[0]).equalsIgnoreCase(this.key)) + { + if (this.ownerOnly && room.getOwnerId() != habbo.getHabboInfo().getId()) + return false; + + habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(this.key, habbo, habbo, RoomChatMessageBubbles.ALERT))); + + return true; + } + } + } + } + return false; + } + + @Override + public String getWiredData() + { + return (this.ownerOnly ? "1" : "0") + "\t" + this.key; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split("\t"); + + if(data.length == 2) + { + this.ownerOnly = data[0].equalsIgnoreCase("1"); + this.key = data[1]; + } + } + + @Override + public void onPickUp() + { + this.ownerOnly = false; + this.key = ""; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.key); + message.appendInt(0); + message.appendInt(1); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + this.ownerOnly = packet.readInt() == 1; + this.key = packet.readString(); + + return true; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysKeyword.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysKeyword.java new file mode 100644 index 00000000..0a5992d8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboSaysKeyword.java @@ -0,0 +1,118 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerHabboSaysKeyword extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.SAY_SOMETHING; + + private boolean ownerOnly = false; + private String key = ""; + + public WiredTriggerHabboSaysKeyword(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerHabboSaysKeyword(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + Habbo habbo = room.getHabbo(roomUnit); + + if(habbo != null) + { + if (this.key.length() > 0) + { + if (stuff[0] instanceof String) + { + if (((String) stuff[0]).toLowerCase().contains(this.key.toLowerCase())) + { + if (this.ownerOnly && room.getOwnerId() != habbo.getHabboInfo().getId()) + return false; + + return true; + } + } + } + } + return false; + } + + @Override + public String getWiredData() + { + return (this.ownerOnly ? "1" : "0") + "\t" + this.key; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + String[] data = set.getString("wired_data").split("\t"); + + if(data.length == 2) + { + this.ownerOnly = data[0].equalsIgnoreCase("1"); + this.key = data[1]; + } + } + + @Override + public void onPickUp() + { + this.ownerOnly = false; + this.key = ""; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.key); + message.appendInt(0); + message.appendInt(1); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + this.ownerOnly = packet.readInt() == 1; + this.key = packet.readString(); + + return true; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOffFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOffFurni.java new file mode 100644 index 00000000..18a37f22 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOffFurni.java @@ -0,0 +1,187 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerHabboWalkOffFurni extends InteractionWiredTrigger +{ + public static final WiredTriggerType type = WiredTriggerType.WALKS_OFF_FURNI; + + private THashSet items; + private String message = ""; + + public WiredTriggerHabboWalkOffFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredTriggerHabboWalkOffFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(stuff.length >= 1) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (stuff[0] instanceof HabboItem) + { + if(items.contains(stuff[0])) + { + return true; + } + } + } + } + return false; + } + + @Override + public String getWiredData() + { + String wiredData = super.getDelay() + ":\t:"; + + if(!items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + else + wiredData += "\t"; + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + String wiredData = set.getString("wired_data"); + if(wiredData.split(":").length >= 3) + { + super.setDelay(Integer.valueOf(wiredData.split(":")[0])); + this.message = wiredData.split(":")[1]; + + if (!wiredData.split(":")[2].equals("\t")) + { + for (String s : wiredData.split(":")[2].split(";")) + { + if(s.isEmpty()) + continue; + + try + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + catch (Exception e) + { + continue; + } + } + } + } + + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.message = ""; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + if(room == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (room.getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.message); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + return true; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOnFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOnFurni.java new file mode 100644 index 00000000..bf555b25 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerHabboWalkOnFurni.java @@ -0,0 +1,186 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerHabboWalkOnFurni extends InteractionWiredTrigger +{ + public static final WiredTriggerType type = WiredTriggerType.WALKS_ON_FURNI; + + private THashSet items; + private String message = ""; + + public WiredTriggerHabboWalkOnFurni(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + this.items = new THashSet(); + } + + public WiredTriggerHabboWalkOnFurni(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + this.items = new THashSet(); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if(stuff.length >= 1) + { + Habbo habbo = room.getHabbo(roomUnit); + + if (habbo != null) + { + if (stuff[0] instanceof HabboItem) + { + if(items.contains(stuff[0])) + { + return true; + } + } + } + } + return false; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + THashSet items = new THashSet(); + + if(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()) == null) + { + items.addAll(this.items); + } + else + { + for (HabboItem item : this.items) + { + if (Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(item.getId()) == null) + items.add(item); + } + } + + for(HabboItem item : items) + { + this.items.remove(item); + } + + message.appendBoolean(false); + message.appendInt(WiredHandler.MAXIMUM_FURNI_SELECTION); + message.appendInt(this.items.size()); + for(HabboItem item : this.items) + { + message.appendInt(item.getId()); + } + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(this.message); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + packet.readString(); + + this.items.clear(); + + int count = packet.readInt(); + + for(int i = 0; i < count; i++) + { + this.items.add(Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()).getHabboItem(packet.readInt())); + } + + return true; + } + + @Override + public String getWiredData() + { + String wiredData = super.getDelay() + ":\t:"; + + if(!items.isEmpty()) + { + for (HabboItem item : this.items) + { + wiredData += item.getId() + ";"; + } + } + else + wiredData += "\t"; + + return wiredData; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + this.items.clear(); + String wiredData = set.getString("wired_data"); + if(wiredData.split(":").length >= 3) + { + super.setDelay(Integer.valueOf(wiredData.split(":")[0])); + this.message = wiredData.split(":")[1]; + + if (!wiredData.split(":")[2].equals("\t")) + { + for (String s : wiredData.split(":")[2].split(";")) + { + if(s.isEmpty()) + continue; + + try + { + HabboItem item = room.getHabboItem(Integer.valueOf(s)); + + if (item != null) + this.items.add(item); + } + catch (Exception e) + { + continue; + } + } + } + } + } + + @Override + public void onPickUp() + { + this.items.clear(); + this.message = ""; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeater.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeater.java new file mode 100644 index 00000000..f5be7c01 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeater.java @@ -0,0 +1,150 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.ICycleable; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerRepeater extends InteractionWiredTrigger implements ICycleable +{ + public static final WiredTriggerType type = WiredTriggerType.PERIODICALLY; + public static final int DEFAULT_DELAY = 20 * 500; + + protected int repeatTime = DEFAULT_DELAY; + protected int counter = 0; + + public WiredTriggerRepeater(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerRepeater(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return true; + } + + @Override + public String getWiredData() + { + return this.repeatTime + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + if(set.getString("wired_data").length() >= 1) + { + this.repeatTime = (Integer.valueOf(set.getString("wired_data"))); + } + + if(this.repeatTime < 500) + { + this.repeatTime = 20 * 500; + } + } + + @Override + public void onPickUp() + { + this.repeatTime = DEFAULT_DELAY; + this.counter = 0; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.repeatTime / 500); + message.appendInt(0); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.repeatTime = packet.readInt() * 500; + this.counter = 0; + + if (this.repeatTime < 500) + { + this.repeatTime = 500; + } + + return true; + } + + @Override + public void cycle(Room room) + { + this.counter += 500; + if (this.counter >= this.repeatTime) + { + this.counter = 0; + if (this.getRoomId() != 0) + { + if (room.isLoaded()) + { + WiredHandler.handle(this, null, room, new Object[]{this}); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeaterLong.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeaterLong.java new file mode 100644 index 00000000..9598575d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerRepeaterLong.java @@ -0,0 +1,143 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.ICycleable; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WiredTriggerRepeaterLong extends InteractionWiredTrigger implements ICycleable +{ + private static final WiredTriggerType type = WiredTriggerType.PERIODICALLY_LONG; + public static final int DEFAULT_DELAY = 20 * 5000; + private int repeatTime = DEFAULT_DELAY; + private int counter = 0; + + public WiredTriggerRepeaterLong(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerRepeaterLong(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + return true; + } + + @Override + public String getWiredData() + { + return this.repeatTime + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + if(set.getString("wired_data").length() >= 1) + { + this.repeatTime = (Integer.valueOf(set.getString("wired_data"))); + } + + if(this.repeatTime < 5000) + { + this.repeatTime = 20 * 5000; + } + } + + @Override + public void onPickUp() + { + this.repeatTime = DEFAULT_DELAY; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.repeatTime / 5000); + message.appendInt(0); + message.appendInt(this.getType().code); + + if (!this.isTriggeredByRoomUnit()) + { + List invalidTriggers = new ArrayList<>(); + room.getRoomSpecialTypes().getEffects(this.getX(), this.getY()).forEach(new TObjectProcedure() + { + @Override + public boolean execute(InteractionWiredEffect object) + { + if (object.requiresTriggeringUser()) + { + invalidTriggers.add(object.getBaseItem().getSpriteId()); + } + return true; + } + }); + message.appendInt(invalidTriggers.size()); + for (Integer i : invalidTriggers) + { + message.appendInt(i); + } + } + else + { + message.appendInt(0); + } + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + + this.repeatTime = packet.readInt() * 5000; + this.counter = 0; + return true; + } + + + @Override + public void cycle(Room room) + { + this.counter += 500; + if (this.counter >= this.repeatTime) + { + this.counter = 0; + if (this.getRoomId() != 0) + { + if (room.isLoaded()) + { + WiredHandler.handle(this, null, room, new Object[]{this}); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerScoreAchieved.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerScoreAchieved.java new file mode 100644 index 00000000..b40fac43 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/triggers/WiredTriggerScoreAchieved.java @@ -0,0 +1,104 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.triggers; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WiredTriggerScoreAchieved extends InteractionWiredTrigger +{ + private static final WiredTriggerType type = WiredTriggerType.SCORE_ACHIEVED; + private int score = 0; + + public WiredTriggerScoreAchieved(ResultSet set, Item baseItem) throws SQLException + { + super(set, baseItem); + } + + public WiredTriggerScoreAchieved(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + super(id, userId, item, extradata, limitedStack, limitedSells); + } + + @Override + public boolean execute(RoomUnit roomUnit, Room room, Object[] stuff) + { + if (stuff.length >= 2) + { + int points = (Integer)stuff[0]; + int amountAdded = (Integer)stuff[1]; + + if (points - amountAdded < this.score && points >= this.score) + { + return true; + } + } + + return false; + } + + @Override + public String getWiredData() + { + return this.score + ""; + } + + @Override + public void loadWiredData(ResultSet set, Room room) throws SQLException + { + try + { + this.score = Integer.valueOf(set.getString("wired_data")); + } + catch (Exception e){} + } + + @Override + public void onPickUp() + { + this.score = 0; + } + + @Override + public WiredTriggerType getType() + { + return type; + } + + @Override + public void serializeWiredData(ServerMessage message, Room room) + { + message.appendBoolean(false); + message.appendInt(5); + message.appendInt(0); + message.appendInt(this.getBaseItem().getSpriteId()); + message.appendInt(this.getId()); + message.appendString(""); + message.appendInt(1); + message.appendInt(this.score); + message.appendInt(0); + message.appendInt(this.getType().code); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public boolean saveData(ClientMessage packet) + { + packet.readInt(); + this.score = packet.readInt(); + return true; + } + + @Override + public boolean isTriggeredByRoomUnit() + { + return true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/messenger/FriendRequest.java b/src/main/java/com/eu/habbo/habbohotel/messenger/FriendRequest.java new file mode 100644 index 00000000..7540a44c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/messenger/FriendRequest.java @@ -0,0 +1,40 @@ +package com.eu.habbo.habbohotel.messenger; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class FriendRequest +{ + private int id; + private String username; + private String look; + + public FriendRequest(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.username = set.getString("username"); + this.look = set.getString("look"); + } + + public FriendRequest(int id, String username, String look) + { + this.id = id; + this.username = username; + this.look = look; + } + + public int getId() + { + return id; + } + + public String getUsername() + { + return username; + } + + public String getLook() + { + return look; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/messenger/Message.java b/src/main/java/com/eu/habbo/habbohotel/messenger/Message.java new file mode 100644 index 00000000..165575d4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/messenger/Message.java @@ -0,0 +1,67 @@ +package com.eu.habbo.habbohotel.messenger; + +import com.eu.habbo.Emulator; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class Message implements Runnable +{ + private final int fromId; + private final int toId; + private String message; + private final int timestamp; + + public Message(int fromId, int toId, String message) + { + this.fromId = fromId; + this.toId = toId; + this.message = message; + + this.timestamp = Emulator.getIntUnixTimestamp(); + } + + @Override + public void run() + { + //TODO Turn into scheduler + if(Messenger.SAVE_PRIVATE_CHATS) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO chatlogs_private (user_from_id, user_to_id, message, timestamp) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, this.fromId); + statement.setInt(2, this.toId); + statement.setString(3, this.message); + statement.setInt(4, this.timestamp); + statement.execute(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public int getToId() + { + return this.toId; + } + + public int getFromId() { + return this.fromId; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) + { + this.message = message; + } + + public int getTimestamp() { + return this.timestamp; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/messenger/Messenger.java b/src/main/java/com/eu/habbo/habbohotel/messenger/Messenger.java new file mode 100644 index 00000000..e758aa3b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/messenger/Messenger.java @@ -0,0 +1,472 @@ +package com.eu.habbo.habbohotel.messenger; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.outgoing.friends.UpdateFriendComposer; +import com.eu.habbo.plugin.events.users.friends.UserAcceptFriendRequestEvent; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class Messenger +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean SAVE_PRIVATE_CHATS = false; + public static int MAXIMUM_FRIENDS = 200; + + private final ConcurrentHashMap friends; + private final THashSet friendRequests; + + public Messenger() + { + this.friends = new ConcurrentHashMap(); + this.friendRequests = new THashSet(); + } + + public void loadFriends(Habbo habbo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT " + + "users.id, " + + "users.username, " + + "users.gender, " + + "users.online, " + + "users.look, " + + "users.motto, " + + "messenger_friendships.* FROM messenger_friendships INNER JOIN users ON messenger_friendships.user_two_id = users.id WHERE user_one_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.friends.putIfAbsent(set.getInt("id"), new MessengerBuddy(set)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public MessengerBuddy loadFriend(Habbo habbo, int userId) + { + MessengerBuddy buddy = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT " + + "users.id, " + + "users.username, " + + "users.gender, " + + "users.online, " + + "users.look, " + + "users.motto, " + + "messenger_friendships.* FROM messenger_friendships INNER JOIN users ON messenger_friendships.user_two_id = users.id WHERE user_one_id = ? AND user_two_id = ? LIMIT 1")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, userId); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + buddy = new MessengerBuddy(set); + this.friends.putIfAbsent(set.getInt("id"), buddy); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return buddy; + } + + public void loadFriendRequests(Habbo habbo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.id, users.username, users.look FROM messenger_friendrequests INNER JOIN users ON user_from_id = users.id WHERE user_to_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while(set.next()) + { + friendRequests.add(new FriendRequest(set)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void removeBuddy(int id) + { + this.friends.remove(id); + } + + public void removeBuddy(Habbo habbo) + { + this.friends.remove(habbo.getHabboInfo().getId()); + } + + public static void unfriend(int userOne, int userTwo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM messenger_friendships WHERE (user_one_id = ? AND user_two_id = ?) OR (user_one_id = ? AND user_two_id = ?)")) + { + statement.setInt(1, userOne); + statement.setInt(2, userTwo); + statement.setInt(3, userTwo); + statement.setInt(4, userOne); + statement.execute(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public THashSet getFriends(String username) + { + THashSet users = new THashSet(); + + for(Map.Entry map : this.friends.entrySet()) + { + if(map.getValue().getUsername().contains(username)) + { + users.add(map.getValue()); + } + } + + return users; + } + public static THashSet searchUsers(String username) + { + THashSet users = new THashSet(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE username LIKE ? ORDER BY username DESC LIMIT 50")) + { + statement.setString(1, username + "%"); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + users.add(new MessengerBuddy(set, false)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + return users; + } + + public void connectionChanged(Habbo owner, boolean online, boolean inRoom) + { + if(owner != null) + { + for (Map.Entry map : this.getFriends().entrySet()) + { + if (map.getValue().getOnline() == 0) + continue; + + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(map.getKey()); + + if (habbo != null) + { + if (habbo.getMessenger() != null) + { + MessengerBuddy buddy = habbo.getMessenger().getFriend(owner.getHabboInfo().getId()); + + if (buddy != null) + { + buddy.setOnline(online); + buddy.inRoom(inRoom); + buddy.setLook(owner.getHabboInfo().getLook()); + buddy.setGender(owner.getHabboInfo().getGender()); + buddy.setUsername(owner.getHabboInfo().getUsername()); + Emulator.getGameServer().getGameClientManager().getClient(habbo).sendResponse(new UpdateFriendComposer(buddy)); + } + } + } + } + } + } + + public void deleteAllFriendRequests(int userTo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM messenger_friendrequests WHERE user_to_id = ?")) + { + statement.setInt(1, userTo); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public int deleteFriendRequests(int userFrom, int userTo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM messenger_friendrequests WHERE (user_to_id = ? AND user_from_id = ?) OR (user_to_id = ? AND user_from_id = ?)")) + { + statement.setInt(1, userTo); + statement.setInt(2, userFrom); + statement.setInt(4, userTo); + statement.setInt(3, userFrom); + return statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return 0; + } + //TODO Needs redesign. userFrom is redundant. + public void acceptFriendRequest(int userFrom, int userTo) + { + int count = deleteFriendRequests(userFrom, userTo); + + if(count > 0) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO messenger_friendships (user_one_id, user_two_id, friends_since) VALUES (?, ?, ?)")) + { + statement.setInt(1, userFrom); + statement.setInt(2, userTo); + statement.setInt(3, Emulator.getIntUnixTimestamp()); + statement.execute(); + + statement.setInt(1, userTo); + statement.setInt(2, userFrom); + statement.setInt(3, Emulator.getIntUnixTimestamp()); + statement.execute(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + Habbo habboTo = Emulator.getGameServer().getGameClientManager().getHabbo(userTo); + Habbo habboFrom = Emulator.getGameServer().getGameClientManager().getHabbo(userFrom); + + if(habboTo != null && habboFrom != null) + { + MessengerBuddy to = new MessengerBuddy(habboFrom, habboTo.getHabboInfo().getId()); + MessengerBuddy from = new MessengerBuddy(habboTo, habboFrom.getHabboInfo().getId()); + + + habboTo.getMessenger().friends.putIfAbsent(habboFrom.getHabboInfo().getId(), to); + habboFrom.getMessenger().friends.putIfAbsent(habboTo.getHabboInfo().getId(), from); + + if(Emulator.getPluginManager().fireEvent(new UserAcceptFriendRequestEvent(habboTo, from)).isCancelled()) + { + this.removeBuddy(userTo); + return; + } + + Emulator.getGameServer().getGameClientManager().getClient(habboTo).sendResponse(new UpdateFriendComposer(to)); + Emulator.getGameServer().getGameClientManager().getClient(habboFrom).sendResponse(new UpdateFriendComposer(from)); + } + else if (habboTo != null) + { + habboTo.getClient().sendResponse(new UpdateFriendComposer(loadFriend(habboTo, userFrom))); + } + else if (habboFrom != null) + { + habboFrom.getClient().sendResponse(new UpdateFriendComposer(loadFriend(habboFrom, userTo))); + } + } + } + + public static boolean canFriendRequest(Habbo habbo, String friend) + { + Habbo user = Emulator.getGameEnvironment().getHabboManager().getHabbo(friend); + HabboInfo habboInfo; + + if(user != null) + { + habboInfo = user.getHabboInfo(); + } + else + { + habboInfo = HabboManager.getOfflineHabboInfo(friend); + } + + if(habboInfo == null) + { + return false; + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM messenger_friendrequests WHERE (user_to_id = ? AND user_from_id = ?) OR (user_to_id = ? AND user_from_id = ?) LIMIT 1")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, habboInfo.getId()); + statement.setInt(3, habboInfo.getId()); + statement.setInt(4, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + if (!set.next()) + { + return true; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + public static boolean friendRequested(int userFrom, int userTo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM messenger_friendrequests WHERE user_to_id = ? AND user_from_id = ? LIMIT 1")) + { + statement.setInt(1, userFrom); + statement.setInt(2, userTo); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + return true; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + public static void makeFriendRequest(int userFrom, int userTo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO messenger_friendrequests (user_to_id, user_from_id) VALUES (?, ?)")) + { + statement.setInt(1, userTo); + statement.setInt(2, userFrom); + statement.executeUpdate(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public static int getFriendCount(int userId) + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(userId); + + if(habbo != null) + return habbo.getMessenger().getFriends().size(); + + int count = 0; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT count(id) as count FROM messenger_friendships WHERE user_one_id = ?")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + count = set.getInt("count"); + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return count; + } + + public static THashMap> getFriends(int userId) + { + THashMap> map = new THashMap>(); + map.put(1, new THashSet()); + map.put(2, new THashSet()); + map.put(3, new THashSet()); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.id, users.look, users.username, messenger_friendships.relation FROM messenger_friendships INNER JOIN users ON users.id = messenger_friendships.user_two_id WHERE user_one_id = ? ORDER BY RAND() LIMIT 50")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (set.getInt("relation") == 0) + continue; + + MessengerBuddy buddy = new MessengerBuddy(set.getInt("id"), set.getString("username"), set.getString("look"), (short) set.getInt("relation"), userId); + map.get((int) buddy.getRelation()).add(buddy); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + return map; + } + + public ConcurrentHashMap getFriends() + { + return this.friends; + } + + public THashSet getFriendRequests() + { + synchronized (this.friendRequests) + { + return this.friendRequests; + } + } + + public FriendRequest findFriendRequest(String username) + { + synchronized (this.friendRequests) + { + for (FriendRequest friendRequest : this.friendRequests) + { + if (friendRequest.getUsername().equalsIgnoreCase(username)) + { + return friendRequest; + } + } + } + + return null; + } + + public MessengerBuddy getFriend(int id) + { + return this.friends.get(id); + } + + public void dispose() + { + synchronized (this.friends) + { + this.friends.clear(); + } + + synchronized (this.friendRequests) + { + this.friendRequests.clear(); + } + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/messenger/MessengerBuddy.java b/src/main/java/com/eu/habbo/habbohotel/messenger/MessengerBuddy.java new file mode 100644 index 00000000..5557a35e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/messenger/MessengerBuddy.java @@ -0,0 +1,179 @@ +package com.eu.habbo.habbohotel.messenger; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class MessengerBuddy implements Runnable { + + private int id; + private String username; + private HabboGender gender = HabboGender.M; + private int online = 0; + private String look = ""; + private String motto = ""; + private short relation; + private boolean inRoom; + private int userOne = 0; + + public MessengerBuddy(ResultSet set) + { + try + { + this.id = set.getInt("id"); + this.username = set.getString("username"); + this.gender = HabboGender.valueOf(set.getString("gender")); + this.online = Integer.valueOf(set.getString("online")); + this.motto = set.getString("motto"); + this.look = set.getString("look"); + this.relation = (short) set.getInt("relation"); + this.userOne = set.getInt("user_one_id"); + this.inRoom = false; + if(this.online == 1) + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(this.username); + + if(habbo != null) + { + this.inRoom = habbo.getHabboInfo().getCurrentRoom() != null; + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public MessengerBuddy(ResultSet set, boolean value) + { + try + { + this.id = set.getInt("id"); + this.username = set.getString("username"); + this.relation = 0; + this.userOne = 0; + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public MessengerBuddy(int id, String username, String look, Short relation, int userOne) + { + this.id = id; + this.username = username; + this.gender = HabboGender.M; + this.online = 0; + this.motto = ""; + this.look = look; + this.relation = relation; + this.userOne = userOne; + } + + public MessengerBuddy(Habbo habbo, int userOne) + { + this.id = habbo.getHabboInfo().getId(); + this.username = habbo.getHabboInfo().getUsername(); + this.gender = habbo.getHabboInfo().getGender(); + this.online = habbo.getHabboInfo().isOnline() ? 1 : 0; + this.motto = habbo.getHabboInfo().getMotto(); + this.look = habbo.getHabboInfo().getLook(); + this.relation = 0; + this.userOne = userOne; + this.inRoom = habbo.getHabboInfo().getCurrentRoom() != null; + } + + public void setRelation(int relation) + { + this.relation = (short)relation; + Emulator.getThreading().run(this); + } + + public int getId() + { + return this.id; + } + + public String getUsername() + { + return this.username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public HabboGender getGender() + { + return this.gender; + } + + public void setGender(HabboGender gender) + { + this.gender = gender; + } + + public int getOnline() + { + return this.online; + } + + public String getLook() + { + return this.look; + } + + public void setLook(String look) + { + this.look = look; + } + + public String getMotto() + { + return this.motto; + } + + public short getRelation() + { + return this.relation; + } + + public boolean inRoom() + { + return this.inRoom; + } + + public void inRoom(boolean value) + { + this.inRoom = value; + } + + public void setOnline(boolean value) + { + this.online = (value ? 1 : 0); + } + + @Override + public void run() { + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE messenger_friendships SET relation = ? WHERE user_one_id = ? AND user_two_id = ?")) + { + statement.setInt(1, this.relation); + statement.setInt(2, this.userOne); + statement.setInt(3, this.id); + statement.execute(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/CfhActionType.java b/src/main/java/com/eu/habbo/habbohotel/modtool/CfhActionType.java new file mode 100644 index 00000000..507b1584 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/CfhActionType.java @@ -0,0 +1,39 @@ +package com.eu.habbo.habbohotel.modtool; + +public enum CfhActionType +{ + MODS(0), + AUTO_REPLY(1), + AUTO_IGNORE(2), + GUARDIANS(3); + + public final int type; + + CfhActionType(int type) + { + this.type = type; + } + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + + public static CfhActionType get(String name) + { + switch(name) + { + case "auto_reply": + return CfhActionType.AUTO_REPLY; + + case "auto_ignore": + return CfhActionType.AUTO_IGNORE; + + case "guardians": + return CfhActionType.GUARDIANS; + } + + return CfhActionType.MODS; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/CfhCategory.java b/src/main/java/com/eu/habbo/habbohotel/modtool/CfhCategory.java new file mode 100644 index 00000000..aa421ac9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/CfhCategory.java @@ -0,0 +1,34 @@ +package com.eu.habbo.habbohotel.modtool; + +import gnu.trove.TCollections; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +public class CfhCategory +{ + private final int id; + private final String name; + private final TIntObjectMap topics; + + public CfhCategory(int id, String name) + { + this.id = id; + this.name = name; + this.topics = TCollections.synchronizedMap(new TIntObjectHashMap()); + } + + public void addTopic(CfhTopic topic) + { + this.topics.put(topic.id, topic); + } + + public TIntObjectMap getTopics() + { + return this.topics; + } + + public String getName() + { + return this.name; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/CfhTopic.java b/src/main/java/com/eu/habbo/habbohotel/modtool/CfhTopic.java new file mode 100644 index 00000000..3db7f132 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/CfhTopic.java @@ -0,0 +1,24 @@ +package com.eu.habbo.habbohotel.modtool; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CfhTopic +{ + public final int id; + public final String name; + public final CfhActionType action; + public final boolean ignoreTarget; + public final String reply; + public final ModToolPreset defaultSanction; + + public CfhTopic(ResultSet set, ModToolPreset defaultSanction) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name_internal"); + this.action = CfhActionType.get(set.getString("action")); + this.ignoreTarget = set.getString("ignore_target").equalsIgnoreCase("1"); + this.reply = set.getString("auto_reply"); + this.defaultSanction = defaultSanction; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBan.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBan.java new file mode 100644 index 00000000..ecf35ecb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBan.java @@ -0,0 +1,92 @@ +package com.eu.habbo.habbohotel.modtool; + +import com.eu.habbo.Emulator; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; + +public class ModToolBan implements Runnable +{ + public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public int userId; + public String ip; + public String machineId; + public int staffId; + public int expireDate; + public int timestamp; + public String reason; + public ModToolBanType type; + public int cfhTopic; + + private boolean needsInsert; + + public ModToolBan(ResultSet set) throws SQLException + { + this.userId = set.getInt("user_id"); + this.ip = set.getString("ip"); + this.machineId = set.getString("machine_id"); + this.staffId = set.getInt("user_staff_id"); + this.timestamp = set.getInt("timestamp"); + this.expireDate = set.getInt("ban_expire"); + this.reason = set.getString("ban_reason"); + this.type = ModToolBanType.fromString(set.getString("type")); + this.cfhTopic = set.getInt("cfh_topic"); + this.needsInsert = false; + } + + public ModToolBan(int userId, String ip, String machineId, int staffId, int expireDate, String reason, ModToolBanType type, int cfhTopic) + { + this.userId = userId; + this.staffId = staffId; + this.timestamp = Emulator.getIntUnixTimestamp(); + this.expireDate = expireDate; + this.reason = reason; + this.ip = ip; + this.machineId = machineId; + this.type = type; + this.cfhTopic = cfhTopic; + this.needsInsert = true; + } + + @Override + public void run() + { + if(this.needsInsert) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO bans (user_id, ip, machine_id, user_staff_id, timestamp, ban_expire, ban_reason, type, cfh_topic) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")) + { + statement.setInt(1, this.userId); + statement.setString(2, this.ip); + statement.setString(3, this.machineId); + statement.setInt(4, this.staffId); + statement.setInt(5, Emulator.getIntUnixTimestamp()); + statement.setInt(6, this.expireDate); + statement.setString(7, this.reason); + statement.setString(8, this.type.getType()); + statement.setInt(9, this.cfhTopic); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public String listInfo() + { + return new StringBuilder() + .append("Banned User Id: ") .append(this.userId) .append("\r") + .append("Type: ") .append(this.type.getType()).append("\r") + .append("Reason: ") .append("").append(this.reason).append("").append("\r") + .append("Moderator Id: ") .append(this.staffId) .append("\r") + .append("Date: ") .append(dateFormat.format(this.timestamp * 1000l)) .append("\r") + .append("Expire Date: ") .append(dateFormat.format(this.expireDate * 1000l)) .append("\r") + .append("IP: ") .append(this.ip) .append("\r") + .append("MachineID: ") .append(this.machineId) .append("\r") + .append("Topic: ") .append(this.cfhTopic).toString(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBanType.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBanType.java new file mode 100644 index 00000000..e9a1c70f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolBanType.java @@ -0,0 +1,35 @@ +package com.eu.habbo.habbohotel.modtool; + +public enum ModToolBanType +{ + ACCOUNT("account"), + MACHINE("machine"), + SUPER("super"), + IP("ip"), + UNKNOWN("???"); + + private final String type; + + ModToolBanType(String type) + { + this.type = type; + } + + public String getType() + { + return this.type; + } + + public static ModToolBanType fromString(String type) + { + for (ModToolBanType t : ModToolBanType.values()) + { + if (t.type.equalsIgnoreCase(type)) + { + return t; + } + } + + return UNKNOWN; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolCategory.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolCategory.java new file mode 100644 index 00000000..023a2f9c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolCategory.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.modtool; + +import gnu.trove.TCollections; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +public class ModToolCategory +{ + private final String name; + private final TIntObjectMap presets; + + public ModToolCategory(String name) + { + this.name = name; + this.presets = TCollections.synchronizedMap(new TIntObjectHashMap()); + } + + public void addPreset(ModToolPreset preset) + { + this.presets.put(preset.id, preset); + } + + public TIntObjectMap getPresets() + { + return this.presets; + } + + public String getName() + { + return this.name; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatLog.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatLog.java new file mode 100644 index 00000000..03a99689 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatLog.java @@ -0,0 +1,23 @@ +package com.eu.habbo.habbohotel.modtool; + +public class ModToolChatLog implements Comparable +{ + public final int timestamp; + public final int habboId; + public final String username; + public final String message; + + public ModToolChatLog(int timestamp, int habboId, String username, String message) + { + this.timestamp = timestamp; + this.habboId = habboId; + this.username = username; + this.message = message; + } + + @Override + public int compareTo(ModToolChatLog o) + { + return o.timestamp - this.timestamp; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataContext.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataContext.java new file mode 100644 index 00000000..488688ff --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataContext.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.modtool; + +import com.eu.habbo.messages.ServerMessage; + +public enum ModToolChatRecordDataContext +{ + ROOM_NAME("roomName", 2), + ROOM_ID("roomId", 1), + GROUP_ID("groupId", 1), + THREAD_ID("threadId", 1), + MESSAGE_ID("messageId", 1); + + public final String key; + public final int type; + + ModToolChatRecordDataContext(String key, int type) + { + this.key = key; + this.type = type; + } + + public void append(final ServerMessage message) + { + message.appendString(this.key); + message.appendByte(this.type); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataType.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataType.java new file mode 100644 index 00000000..12013a54 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatRecordDataType.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.modtool; + +public enum ModToolChatRecordDataType +{ + UNKNOWN(0), + ROOM_TOOL(1), + IM_SESSION(2), + FORUM_THREAD(3), + FORUM_MESSAGE(4), + SELFIE(5), + PHOTO_REPORT(6); + + public final int type; + + ModToolChatRecordDataType(int type) + { + this.type = type; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatlogType.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatlogType.java new file mode 100644 index 00000000..1ce3cbe4 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolChatlogType.java @@ -0,0 +1,15 @@ +package com.eu.habbo.habbohotel.modtool; + +public enum ModToolChatlogType +{ + BOT_PET(0), + YELLOW(1), + BLUE(2); + + public final int type; + + ModToolChatlogType(int type) + { + this.type = type; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolIssue.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolIssue.java new file mode 100644 index 00000000..f15cc734 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolIssue.java @@ -0,0 +1,108 @@ +package com.eu.habbo.habbohotel.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.threading.runnables.UpdateModToolIssue; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class ModToolIssue implements ISerialize +{ + public int id; + public volatile ModToolTicketState state; + public volatile ModToolTicketType type = ModToolTicketType.NORMAL; + public int category; + public int timestamp; + public volatile int priority; + public int reportedId; + public String reportedUsername = "Uknown Reported Habbo"; + public int roomId; + public int senderId; + public String senderUsername = "Unknown Sender"; + public volatile int modId = -1; + public volatile String modName = ""; + public String message = "Unknown Message"; + public ArrayList chatLogs = null; + + public ModToolIssue(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.state = ModToolTicketState.getState(set.getInt("state")); + this.timestamp = set.getInt("timestamp"); + this.priority = set.getInt("score"); + this.senderId = set.getInt("sender_id"); + this.senderUsername = set.getString("sender_username"); + this.reportedId = set.getInt("reported_id"); + this.reportedUsername = set.getString("reported_username"); + this.message = set.getString("issue"); + this.modId = set.getInt("mod_id"); + this.modName = set.getString("mod_username"); + this.type = ModToolTicketType.values()[set.getInt("type") - 1]; + this.category = set.getInt("category"); + + if(this.modId <= 0) + { + this.modName = ""; + this.state = ModToolTicketState.OPEN; + } + } + + public ModToolIssue(int senderId, String senderUserName, int reportedId, String reportedUsername, int reportedRoomId, String message, ModToolTicketType type) + { + this.state = ModToolTicketState.OPEN; + this.timestamp = Emulator.getIntUnixTimestamp(); + this.priority = 0; + this.senderId = senderId; + this.senderUsername = senderUserName; + this.reportedUsername = reportedUsername; + this.reportedId = reportedId; + this.roomId = reportedRoomId; + this.message = message; + this.type = type; + this.category = 1; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.id); //ID + message.appendInt(this.state.getState()); //STATE + message.appendInt(this.type.getType()); //TYPE + message.appendInt(this.category); //CATEGORY ID + message.appendInt(((Emulator.getIntUnixTimestamp() - this.timestamp))); //TIME IN MS AGO + message.appendInt(this.priority); //PRIORITY + message.appendInt(1); // != 0? + message.appendInt(this.senderId); //Reporter user ID + message.appendString(this.senderUsername); //Reporter user name. + message.appendInt(this.reportedId); //Reported user ID. + message.appendString(this.reportedUsername); //Reported user name. + message.appendInt(this.modId); //MOD User ID? + message.appendString(this.modName); //MOD User name? + message.appendString(this.message); + message.appendInt(0); + + if (this.chatLogs != null) + { + message.appendInt(this.chatLogs.size()); + for (ModToolChatLog chatLog : this.chatLogs) + { + message.appendString(chatLog.message); + message.appendInt(0); + message.appendInt(chatLog.message.length()); + } + } + else + { + message.appendInt(0); + } + } + + public void updateInDatabase() + { + Emulator.getThreading().run(new UpdateModToolIssue(this)); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java new file mode 100644 index 00000000..d23de03f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java @@ -0,0 +1,859 @@ +package com.eu.habbo.habbohotel.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomState; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.modtool.*; +import com.eu.habbo.plugin.events.support.SupportRoomActionEvent; +import com.eu.habbo.plugin.events.support.SupportTicketEvent; +import com.eu.habbo.plugin.events.support.SupportUserAlertedEvent; +import com.eu.habbo.plugin.events.support.SupportUserBannedEvent; +import com.eu.habbo.threading.runnables.InsertModToolIssue; +import gnu.trove.TCollections; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; +import io.netty.channel.Channel; + +import java.net.InetSocketAddress; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ModToolManager +{ + private final TIntObjectMap category; + private final THashMap> presets; + private final THashMap tickets; + private final TIntObjectMap cfhCategories; + + public ModToolManager() + { + long millis = System.currentTimeMillis(); + this.category = TCollections.synchronizedMap(new TIntObjectHashMap<>()); + this.presets = new THashMap<>(); + this.tickets = new THashMap<>(); + this.cfhCategories = new TIntObjectHashMap<>(); + this.loadModTool(); + Emulator.getLogging().logStart("ModTool Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public synchronized void loadModTool() + { + this.category.clear(); + this.presets.clear(); + this.cfhCategories.clear(); + + this.presets.put("user", new THashSet<>()); + this.presets.put("room", new THashSet<>()); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + this.loadCategory(connection); + this.loadPresets(connection); + this.loadTickets(connection); + this.loadCfhCategories(connection); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private void loadCategory(Connection connection) throws SQLException + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM support_issue_categories")) + { + while(set.next()) + { + this.category.put(set.getInt("id"), new ModToolCategory(set.getString("name"))); + + try (PreparedStatement settings = connection.prepareStatement("SELECT * FROM support_issue_presets WHERE category = ?")) + { + settings.setInt(1, set.getInt("id")); + try (ResultSet presets = settings.executeQuery()) + { + while (presets.next()) + { + this.category.get(set.getInt("id")).addPreset(new ModToolPreset(presets)); + } + } + } + } + } + } + + private void loadPresets(Connection connection) throws SQLException + { + synchronized (this.presets) + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM support_presets")) + { + while (set.next()) + { + this.presets.get(set.getString("type")).add(set.getString("preset")); + } + } + } + } + + private void loadTickets(Connection connection) throws SQLException + { + synchronized (this.tickets) + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT S.username as sender_username, R.username AS reported_username, M.username as mod_username, support_tickets.* FROM support_tickets INNER JOIN users as S ON S.id = sender_id INNER JOIN users AS R ON R.id = reported_id INNER JOIN users AS M ON M.id = mod_id WHERE state != 0")) + { + while(set.next()) + { + this.tickets.put(set.getInt("id"), new ModToolIssue(set)); + } + } + } + } + + private void loadCfhCategories(Connection connection) throws SQLException + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT " + + "support_cfh_topics.id, " + + "support_cfh_topics.category_id, " + + "support_cfh_topics.name_internal, " + + "support_cfh_topics.action, " + + "support_cfh_topics.auto_reply," + + "support_cfh_topics.ignore_target, " + + "support_cfh_categories.name_internal AS category_name_internal, " + + "support_cfh_categories.id AS support_cfh_category_id, " + + "support_cfh_topics.default_sanction AS default_sanction " + + "FROM support_cfh_topics " + + "LEFT JOIN support_cfh_categories ON support_cfh_categories.id = support_cfh_topics.category_id")) + { + while(set.next()) + { + if (!this.cfhCategories.containsKey(set.getInt("support_cfh_category_id"))) + { + this.cfhCategories.put(set.getInt("support_cfh_category_id"), new CfhCategory(set.getInt("id"), set.getString("category_name_internal"))); + } + + this.cfhCategories.get(set.getInt("support_cfh_category_id")).addTopic(new CfhTopic(set, this.getIssuePreset(set.getInt("default_sanction")))); + } + } + } + + public CfhTopic getCfhTopic(int topicId) + { + for(CfhCategory category : getCfhCategories().valueCollection()) + { + for(CfhTopic topic : category.getTopics().valueCollection()) + { + if(topic.id == topicId) + { + return topic; + } + } + } + + return null; + } + + public ModToolPreset getIssuePreset(int id) + { + if (id == 0) + return null; + + final ModToolPreset[] preset = {null}; + this.category.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(ModToolCategory object) + { + preset[0] = object.getPresets().get(id); + return preset[0] == null; + } + }); + + return preset[0]; + } + + public void quickTicket(Habbo reported, String reason, String message) + { + ModToolIssue issue = new ModToolIssue(0, reason, reported.getHabboInfo().getId(), reported.getHabboInfo().getUsername(), 0, message, ModToolTicketType.AUTOMATIC); + if (Emulator.getPluginManager().fireEvent(new SupportTicketEvent(null, issue)).isCancelled()) + return; + + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + } + + public static void requestUserInfo(GameClient client, ClientMessage packet) + { + int userId = packet.readInt(); + + if(userId <= 0) + return; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users INNER JOIN users_settings ON users.id = users_settings.user_id WHERE users.id = ? LIMIT 1")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + client.sendResponse(new ModToolUserInfoComposer(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public ArrayList getRoomChatlog(int roomId) + { + ArrayList chatlogs = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.id, chatlogs_room.* FROM chatlogs_room INNER JOIN users ON users.id = chatlogs_room.user_from_id WHERE room_id = ? ORDER BY timestamp DESC LIMIT 150")) + { + statement.setInt(1, roomId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + chatlogs.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("id"), set.getString("username"), set.getString("message"))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return chatlogs; + } + + public ArrayList getUserChatlog(int userId) + { + ArrayList chatlogs = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.id, chatlogs_room.* FROM chatlogs_room INNER JOIN users ON users.id = chatlogs_room.user_from_id WHERE user_from_id = ? ORDER BY timestamp DESC LIMIT 150")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + chatlogs.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("id"), set.getString("username"), set.getString("message"))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return chatlogs; + } + + public ArrayList getMessengerChatlog(int userOneId, int userTwoId) + { + ArrayList chatLogs = new ArrayList<>(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username, chatlogs_private.* FROM chatlogs_private INNER JOIN users ON users.id = user_from_id WHERE (user_from_id = ? AND user_to_id = ?) OR (user_from_id = ? AND user_to_id = ?) ORDER BY timestamp DESC LIMIT 50")) + { + statement.setInt(1, userOneId); + statement.setInt(2, userTwoId); + statement.setInt(3, userTwoId); + statement.setInt(4, userOneId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + chatLogs.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("chatlogs_private.user_from_id"), set.getString("users.username"), set.getString("message"))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return chatLogs; + } + + public ArrayList getUserRoomVisitsAndChatlogs(int userId) + { + ArrayList chatlogs = new ArrayList(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.name, users.username, room_enter_log.timestamp AS enter_timestamp, room_enter_log.exit_timestamp, chatlogs_room.* FROM room_enter_log INNER JOIN rooms ON room_enter_log.room_id = rooms.id INNER JOIN users ON room_enter_log.user_id = users.id LEFT JOIN chatlogs_room ON room_enter_log.user_id = chatlogs_room.user_from_id AND room_enter_log.room_id = chatlogs_room.room_id AND chatlogs_room.timestamp >= room_enter_log.timestamp AND chatlogs_room.timestamp < room_enter_log.exit_timestamp WHERE chatlogs_room.user_from_id = ? ORDER BY room_enter_log.timestamp DESC LIMIT 500")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + int userid = 0; + String username = "unknown"; + + while (set.next()) + { + ModToolRoomVisit visit = null; + + for (ModToolRoomVisit v : chatlogs) + { + if (v.timestamp == set.getInt("enter_timestamp") && v.exitTimestamp == set.getInt("exit_timestamp")) + { + visit = v; + } + } + + if (visit == null) + { + visit = new ModToolRoomVisit(set.getInt("room_id"), set.getString("name"), set.getInt("enter_timestamp"), set.getInt("exit_timestamp")); + chatlogs.add(visit); + } + visit.chat.add(new ModToolChatLog(set.getInt("timestamp"), set.getInt("user_from_id"), set.getString("username"), set.getString("message"))); + + if (userid == 0) + userid = set.getInt("user_from_id"); + + if (username.equals("unknown")) + username = set.getString("username"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return chatlogs; + } + + public THashSet requestUserRoomVisits(Habbo habbo) + { + THashSet roomVisits = new THashSet(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.name, room_enter_log.* FROM room_enter_log INNER JOIN rooms ON rooms.id = room_enter_log.room_id WHERE user_id = ? AND timestamp >= ? ORDER BY timestamp DESC LIMIT 50")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, Emulator.getIntUnixTimestamp() - 84600); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + roomVisits.add(new ModToolRoomVisit(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return roomVisits; + } + + public THashSet getVisitsForRoom(Room room, int amount, boolean groupUser, int fromTimestamp, int toTimestamp) + { + return this.getVisitsForRoom(room, amount, groupUser, fromTimestamp, toTimestamp, ""); + } + + public THashSet getVisitsForRoom(Room room, int amount, boolean groupUser, int fromTimestamp, int toTimestamp, String excludeUsername) + { + THashSet roomVisits = new THashSet(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM (" + + "SELECT " + + "users.username as name, " + + "room_enter_log.* " + + "FROM" + + "`room_enter_log` " + + "INNER JOIN " + + "users " + + "ON " + + "users.id = room_enter_log.user_id " + + "WHERE " + + "room_enter_log.room_id = ? " + + (fromTimestamp > 0 ? "AND timestamp >= ? " : "") + + (toTimestamp > 0 ? "AND exit_timestamp <= ? " : "") + + "AND users.username != ? " + + "ORDER BY " + + "timestamp " + + "DESC LIMIT ?) x " + + (groupUser ? "GROUP BY user_id" : "") + + ";")) + { + statement.setInt(1, room.getId()); + + if(fromTimestamp > 0) + statement.setInt(2, fromTimestamp); + + if(toTimestamp > 0) + statement.setInt((fromTimestamp > 0 ? 3 : 2), toTimestamp); + + statement.setString((toTimestamp > 0 ? fromTimestamp > 0 ? 4 : 3 : 2), excludeUsername); + + int columnAmount = 3; + if(fromTimestamp > 0) + columnAmount++; + + if(toTimestamp > 0) + columnAmount++; + + statement.setInt(columnAmount, amount); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + roomVisits.add(new ModToolRoomVisit(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return roomVisits; + } + + public ModToolBan createOfflineUserBan(int userId, int staffId, int duration, String reason, ModToolBanType type) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO bans (user_id, ip, machine_id, user_staff_id, ban_expire, ban_reason, type) VALUES (?, (SELECT ip_current FROM users WHERE id = ?), (SELECT machine_id FROM users WHERE id = ?), ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, userId); + statement.setInt(2, userId); + statement.setInt(3, userId); + statement.setInt(4, staffId); + statement.setInt(5, Emulator.getIntUnixTimestamp() + duration); + statement.setString(6, reason); + statement.setString(7, type.getType()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + try (PreparedStatement selectBanStatement = connection.prepareStatement("SELECT * FROM bans WHERE id = ? LIMIT 1")) + { + selectBanStatement.setInt(1, set.getInt(1)); + + try (ResultSet selectSet = selectBanStatement.executeQuery()) + { + if (selectSet.next()) + { + return new ModToolBan(selectSet); + } + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return null; + } + + public void alert(Habbo moderator, Habbo target, String message) + { + if(moderator.hasPermission("acc_supporttool")) + { + SupportUserAlertedEvent alertedEvent = new SupportUserAlertedEvent(moderator, target, message); + if (Emulator.getPluginManager().fireEvent(alertedEvent).isCancelled()) + { + return; + } + + if(target != null) + { + alertedEvent.target.getClient().sendResponse(new ModToolIssueHandledComposer(alertedEvent.message)); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(moderator, "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.alert").replace("%username%", moderator.getHabboInfo().getUsername()).replace("%message%", message)); + } + } + + public void kick(Habbo moderator, Habbo target, String message) + { + if(target.getHabboInfo().getCurrentRoom() != null) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(target, target.getHabboInfo().getCurrentRoom()); + } + this.alert(moderator, target, message); + } + + public List ban(int targetUserId, Habbo moderator, String reason, int duration, ModToolBanType type, int cfhTopic) + { + if (moderator == null) + return null; + + List bans = new ArrayList<>(); + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(targetUserId); + HabboInfo offlineInfo = target != null ? target.getHabboInfo() : HabboManager.getOfflineHabboInfo(targetUserId); + + if (moderator.getHabboInfo().getRank().getId() < offlineInfo.getRank().getId()) + { + return bans; + } + + ModToolBan ban = new ModToolBan(targetUserId, offlineInfo != null ? offlineInfo.getIpLogin() : "offline", offlineInfo != null ? offlineInfo.getMachineID() : "offline", moderator.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + duration, reason, type, cfhTopic); + Emulator.getPluginManager().fireEvent(new SupportUserBannedEvent(moderator, target, ban)); + Emulator.getThreading().run(ban); + bans.add(ban); + + if (target != null) + { + Emulator.getGameServer().getGameClientManager().disposeClient(target.getClient().getChannel()); + } + + if ((type == ModToolBanType.IP || type == ModToolBanType.SUPER) && target != null && !ban.ip.equals("offline")) + { + for (Habbo h : Emulator.getGameServer().getGameClientManager().getHabbosWithIP(ban.ip)) + { + ban = new ModToolBan(h.getHabboInfo().getId(), h != null ? h.getHabboInfo().getIpLogin() : "offline", h != null ? h.getClient().getMachineId() : "offline", moderator.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + duration, reason, type, cfhTopic); + Emulator.getPluginManager().fireEvent(new SupportUserBannedEvent(moderator, h, ban)); + Emulator.getThreading().run(ban); + bans.add(ban); + Emulator.getGameServer().getGameClientManager().disposeClient(h.getClient().getChannel()); + } + } + + if ((type == ModToolBanType.MACHINE || type == ModToolBanType.SUPER) && target != null && !ban.machineId.equals("offline")) + { + for (Habbo h : Emulator.getGameServer().getGameClientManager().getHabbosWithMachineId(ban.machineId)) + { + ban = new ModToolBan(h.getHabboInfo().getId(), h != null ? h.getHabboInfo().getIpLogin() : "offline", h != null ? h.getClient().getMachineId() : "offline", moderator.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + duration, reason, type, cfhTopic); + Emulator.getPluginManager().fireEvent(new SupportUserBannedEvent(moderator, h, ban)); + Emulator.getThreading().run(ban); + bans.add(ban); + Emulator.getGameServer().getGameClientManager().disposeClient(h.getClient().getChannel()); + } + } + + return bans; + } + + public void roomAction(Room room, Habbo moderator, boolean kickUsers, boolean lockDoor, boolean changeTitle) + { + SupportRoomActionEvent roomActionEvent = new SupportRoomActionEvent(moderator, room, kickUsers, lockDoor, changeTitle); + Emulator.getPluginManager().fireEvent(roomActionEvent); + + if (roomActionEvent.changeTitle) + { + room.setName(Emulator.getTexts().getValue("hotel.room.inappropriate.title")); + room.setNeedsUpdate(true); + } + + if (roomActionEvent.lockDoor) + { + room.setState(RoomState.LOCKED); + room.setNeedsUpdate(true); + } + + if (roomActionEvent.kickUsers) + { + for (Habbo habbo : room.getHabbos()) + { + if (!(habbo.hasPermission("acc_unkickable") || habbo.hasPermission("acc_supporttool") || room.isOwner(habbo))) + { + room.kickHabbo(habbo, false); + } + } + } + } + + public ModToolBan checkForBan(int userId) + { + ModToolBan ban = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans WHERE user_id = ? AND ban_expire >= ? AND (type = 'account' OR type = 'super') ORDER BY timestamp LIMIT 1")) + { + statement.setInt(1, userId); + statement.setInt(2, Emulator.getIntUnixTimestamp()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + ban = new ModToolBan(set); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return ban; + } + + public boolean hasIPBan(Channel habbo) + { + if (habbo == null) + return false; + + if (habbo.remoteAddress() == null || ((InetSocketAddress)habbo.remoteAddress()).getAddress() == null) + return false; + + boolean banned = false; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans WHERE ip = ? AND (type = 'ip' OR type = 'super') AND ban_expire > ? LIMIT 1")) + { + statement.setString(1, ((InetSocketAddress) habbo.remoteAddress()).getAddress().getHostAddress()); + statement.setInt(2, Emulator.getIntUnixTimestamp()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + banned = true; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return banned; + } + + public boolean hasMACBan(GameClient habbo) + { + if (habbo == null) + return false; + + if (habbo.getMachineId().isEmpty()) + { + return false; + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans WHERE machine_id = ? AND (type = 'machine' OR type = 'super') AND ban_expire > ? LIMIT 1")) + { + statement.setString(1, habbo.getMachineId()); + statement.setInt(2, Emulator.getIntUnixTimestamp()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + return true; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + public boolean unban(String username) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE bans INNER JOIN users ON bans.user_id = users.id SET ban_expire = ?, ban_reason = CONCAT('" + Emulator.getTexts().getValue("unbanned") + ": ', ban_reason) WHERE users.username = ? AND ban_expire > ?")) + { + statement.setInt(1, Emulator.getIntUnixTimestamp()); + statement.setString(2, username); + statement.setInt(3, Emulator.getIntUnixTimestamp()); + statement.execute(); + return statement.getUpdateCount() > 0; + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + public void pickTicket(ModToolIssue issue, Habbo habbo) + { + issue.modId = habbo.getHabboInfo().getId(); + issue.modName = habbo.getHabboInfo().getUsername(); + issue.state = ModToolTicketState.PICKED; + + this.updateTicketToMods(issue); + issue.updateInDatabase(); + } + + public void updateTicketToMods(ModToolIssue issue) + { + Emulator.getGameEnvironment().getHabboManager().sendPacketToHabbosWithPermission(new ModToolIssueInfoComposer(issue).compose(), "acc_supporttool"); + } + + public void addTicket(ModToolIssue issue) + { + if (Emulator.getPluginManager().fireEvent(new SupportTicketEvent(null, issue)).isCancelled()) + return; + + if (issue.id == 0) + { + new InsertModToolIssue(issue).run(); + } + + synchronized (this.tickets) + { + this.tickets.put(issue.id, issue); + } + } + + public void removeTicket(ModToolIssue issue) + { + this.removeTicket(issue.id); + } + + public void removeTicket(int issueId) + { + synchronized (this.tickets) + { + this.tickets.remove(issueId); + } + } + + public void closeTicketAsUseless(ModToolIssue issue, Habbo sender) + { + issue.state = ModToolTicketState.CLOSED; + issue.updateInDatabase(); + + if(sender != null) + { + sender.getClient().sendResponse(new ModToolIssueHandledComposer(ModToolIssueHandledComposer.USELESS)); + } + + this.updateTicketToMods(issue); + + this.removeTicket(issue); + } + + public void closeTicketAsAbusive(ModToolIssue issue, Habbo sender) + { + issue.state = ModToolTicketState.CLOSED; + issue.updateInDatabase(); + if(sender != null) + { + sender.getClient().sendResponse(new ModToolIssueHandledComposer(ModToolIssueHandledComposer.ABUSIVE)); + } + + this.updateTicketToMods(issue); + + this.removeTicket(issue); + } + + public void closeTicketAsHandled(ModToolIssue issue, Habbo sender) + { + issue.state = ModToolTicketState.CLOSED; + issue.updateInDatabase(); + + if(sender != null) + { + sender.getClient().sendResponse(new ModToolIssueHandledComposer(ModToolIssueHandledComposer.HANDLED)); + } + + this.updateTicketToMods(issue); + + this.removeTicket(issue); + } + + public boolean hasPendingTickets(int userId) + { + synchronized (this.tickets) + { + for(Map.Entry map : this.tickets.entrySet()) + { + if(map.getValue().senderId == userId) + return true; + } + } + + return false; + } + + public int totalBans(int userId) + { + int total = 0; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) as total FROM bans WHERE user_id = ?")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + total = set.getInt("total"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return total; + } + + public TIntObjectMap getCategory() + { + return this.category; + } + + public ModToolCategory getCategory(int id) + { + return this.category.get(id); + } + + public THashMap> getPresets() + { + return this.presets; + } + + public THashMap getTickets() + { + return this.tickets; + } + + public ModToolIssue getTicket(int ticketId) + { + return this.tickets.get(ticketId); + } + + public TIntObjectMap getCfhCategories() + { + return this.cfhCategories; + } + + public List openTicketsForHabbo(Habbo habbo) + { + List issues = new ArrayList<>(); + synchronized (this.tickets) + { + this.tickets.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(ModToolIssue object) + { + if (object.senderId == habbo.getHabboInfo().getId() && object.state == ModToolTicketState.OPEN) + { + issues.add(object); + } + + return true; + } + }); + } + + return issues; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolPreset.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolPreset.java new file mode 100644 index 00000000..e5d92fe5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolPreset.java @@ -0,0 +1,24 @@ +package com.eu.habbo.habbohotel.modtool; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ModToolPreset +{ + public final int id; + public final String name; + public final String message; + public final String reminder; + public final int banLength; + public final int muteLength; + + public ModToolPreset(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + this.message = set.getString("message"); + this.reminder = set.getString("reminder"); + this.banLength = set.getInt("ban_for"); + this.muteLength = set.getInt("mute_for"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolRoomVisit.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolRoomVisit.java new file mode 100644 index 00000000..65bdc0c3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolRoomVisit.java @@ -0,0 +1,37 @@ +package com.eu.habbo.habbohotel.modtool; + +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ModToolRoomVisit implements Comparable +{ + public int roomId; + public String roomName; + public int timestamp; + public int exitTimestamp; + public THashSet chat; + + public ModToolRoomVisit(ResultSet set) throws SQLException + { + this.roomId = set.getInt("room_id"); + this.roomName = set.getString("name"); + this.timestamp = set.getInt("timestamp"); + } + + public ModToolRoomVisit(int roomId, String roomName, int timestamp, int exitTimestamp) + { + this.roomId = roomId; + this.roomName = roomName; + this.timestamp = timestamp; + this.exitTimestamp = exitTimestamp; + this.chat = new THashSet(); + } + + @Override + public int compareTo(ModToolRoomVisit o) + { + return o.timestamp - this.timestamp; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketState.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketState.java new file mode 100644 index 00000000..a6bb4994 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketState.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.modtool; + +public enum ModToolTicketState +{ + CLOSED(0), + OPEN(1), + PICKED(2); + + private final int state; + + ModToolTicketState(int state) + { + this.state = state; + } + + public int getState() + { + return this.state; + } + + public static ModToolTicketState getState(int number) + { + for(ModToolTicketState s : ModToolTicketState.values()) + { + if(s.state == number) + return s; + } + + return CLOSED; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketType.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketType.java new file mode 100644 index 00000000..00b3b9b6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolTicketType.java @@ -0,0 +1,32 @@ +package com.eu.habbo.habbohotel.modtool; + +public enum ModToolTicketType +{ + NORMAL(1), + NORMAL_UNKNOWN(2), + AUTOMATIC(3), + AUTOMATIC_IM(4), + GUIDE_SYSTEM(5), + IM(6), + ROOM(7), + PANIC(8), + GUARDIAN(9), + AUTOMATIC_HELPER(10), + DISCUSSION(11), + SELFIE(12), + POTATO(13), + PHOTO(14), + AMBASSADOR(15); + + private final int type; + + ModToolTicketType(int type) + { + this.type = type; + } + + public int getType() + { + return this.type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/WordFilter.java b/src/main/java/com/eu/habbo/habbohotel/modtool/WordFilter.java new file mode 100644 index 00000000..2b4cc99a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/WordFilter.java @@ -0,0 +1,217 @@ +package com.eu.habbo.habbohotel.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClientManager; +import com.eu.habbo.habbohotel.messenger.Message; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.friends.FriendChatMessageComposer; +import com.eu.habbo.plugin.events.users.UserTriggerWordFilterEvent; +import com.eu.habbo.threading.runnables.InsertModToolIssue; +import gnu.trove.iterator.hash.TObjectHashIterator; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.text.Normalizer; + +public class WordFilter +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean ENABLED_FRIENDCHAT = true; + + THashSet autoReportWords = new THashSet(); + THashSet hideMessageWords = new THashSet(); + THashSet words = new THashSet(); + + public WordFilter() + { + long start = System.currentTimeMillis(); + this.reload(); + Emulator.getLogging().logStart("WordFilter -> Loaded! (" + (System.currentTimeMillis() - start) + " MS)"); + } + + public synchronized void reload() + { + if(!Emulator.getConfig().getBoolean("hotel.wordfilter.enabled")) + return; + + this.autoReportWords.clear(); + this.hideMessageWords.clear(); + this.words.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement();) + { + try (ResultSet set = statement.executeQuery("SELECT * FROM wordfilter")) + { + while (set.next()) + { + WordFilterWord word; + + try + { + word = new WordFilterWord(set); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + continue; + } + + if (word.autoReport) + this.autoReportWords.add(word); + else if (word.hideMessage) + this.hideMessageWords.add(word); + else + words.add(word); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + /** + * Normalises a string to replace all weird unicode characters to regular characters. + * May dispose certain characters (Like Chinese) + * @param message The {@String} to normalise. + * @return A String with only regular characters. + */ + public String normalise(String message) + { + return Normalizer.normalize(message, Normalizer.Form.NFD) + .replaceAll("[^\\p{ASCII}]", "").replaceAll("\\p{M}", "").replace("1", "i").replace("2", "z").replace("3", "e").replace("4","a").replace("5", "s").replace("8", "b").replace("0", "o"); + } + + + public boolean autoReportCheck(RoomChatMessage roomChatMessage) + { + String message = this.normalise(roomChatMessage.getMessage()).toLowerCase(); + + TObjectHashIterator iterator = this.autoReportWords.iterator(); + + while (iterator.hasNext()) + { + WordFilterWord word = (WordFilterWord) iterator.next(); + + if (message.contains(word.key)) + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(roomChatMessage.getHabbo(), "Automatic WordFilter", roomChatMessage.getMessage()); + + if(Emulator.getConfig().getBoolean("notify.staff.chat.auto.report")) + { + Emulator.getGameEnvironment().getHabboManager().sendPacketToHabbosWithPermission(new FriendChatMessageComposer(new Message(roomChatMessage.getHabbo().getHabboInfo().getId(), 0, Emulator.getTexts().getValue("warning.auto.report").replace("%user%", roomChatMessage.getHabbo().getHabboInfo().getUsername()).replace("%word%", word.key))).compose(), "acc_staff_chat"); + } + return true; + } + } + + return false; + } + + public boolean hideMessageCheck(String message) + { + message = this.normalise(message).toLowerCase(); + + TObjectHashIterator iterator = this.hideMessageWords.iterator(); + + while (iterator.hasNext()) + { + WordFilterWord word = (WordFilterWord) iterator.next(); + + if (message.contains(word.key)) + { + return true; + } + } + + return false; + } + + public String[] filter(String[] messages) + { + for(int i = 0; i < messages.length; i++) + { + messages[i] = this.filter(messages[i], null); + } + + return messages; + } + + public String filter(String message, Habbo habbo) + { + String original = message; + + if(Emulator.getConfig().getBoolean("hotel.wordfilter.normalise")) + { + message = this.normalise(message); + } + + TObjectHashIterator iterator = this.words.iterator(); + + boolean foundShit = false; + + while(iterator.hasNext()) + { + WordFilterWord word = (WordFilterWord) iterator.next(); + + if(message.contains(word.key)) + { + if(habbo != null) + { + if(Emulator.getPluginManager().fireEvent(new UserTriggerWordFilterEvent(habbo, word)).isCancelled()) + continue; + } + message = message.replace(word.key, word.replacement); + foundShit = true; + + if (word.muteTime > 0) + { + habbo.mute(word.muteTime); + } + } + } + + if (!foundShit) + { + return original; + } + + return message; + } + + public void filter (RoomChatMessage roomChatMessage, Habbo habbo) + { + String message = roomChatMessage.getMessage().toLowerCase(); + + if(Emulator.getConfig().getBoolean("hotel.wordfilter.normalise")) + { + message = this.normalise(message); + } + + TObjectHashIterator iterator = this.words.iterator(); + + while(iterator.hasNext()) + { + WordFilterWord word = (WordFilterWord) iterator.next(); + + if(message.contains(word.key)) + { + if(habbo != null) + { + if(Emulator.getPluginManager().fireEvent(new UserTriggerWordFilterEvent(habbo, word)).isCancelled()) + continue; + } + + message = message.replace(word.key, word.replacement); + roomChatMessage.filtered = true; + } + } + + if (roomChatMessage.filtered) + { + roomChatMessage.setMessage(message); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/WordFilterWord.java b/src/main/java/com/eu/habbo/habbohotel/modtool/WordFilterWord.java new file mode 100644 index 00000000..64be198d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/WordFilterWord.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.modtool; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WordFilterWord +{ + public final String key; + public final String replacement; + public final boolean hideMessage; + public final boolean autoReport; + public final int muteTime; + + public WordFilterWord(ResultSet set) throws SQLException + { + this.key = set.getString("key"); + this.replacement = set.getString("replacement"); + this.hideMessage = set.getInt("hide") == 1; + this.autoReport = set.getInt("report") == 1; + this.muteTime = set.getInt("mute"); + } + + public WordFilterWord(String key, String replacement) + { + this.key = key; + this.replacement = replacement; + this.hideMessage = false; + this.autoReport = false; + this.muteTime = 0; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/DisplayMode.java b/src/main/java/com/eu/habbo/habbohotel/navigation/DisplayMode.java new file mode 100644 index 00000000..ba5d3868 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/DisplayMode.java @@ -0,0 +1,7 @@ +package com.eu.habbo.habbohotel.navigation; + +public enum DisplayMode +{ + VISIBLE, + COLLAPSED +} diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/ListMode.java b/src/main/java/com/eu/habbo/habbohotel/navigation/ListMode.java new file mode 100644 index 00000000..63d1dc16 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/ListMode.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.navigation; + +public enum ListMode +{ + LIST(0), + THUMBNAILS(1), + FORCED_THUNBNAILS(2); + + public final int type; + + ListMode(int type) + { + this.type = type; + } + + public static ListMode fromType(int type) + { + for (ListMode m : ListMode.values()) + { + if (m.type == type) + { + return m; + } + } + + return LIST; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFavoriteFilter.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFavoriteFilter.java new file mode 100644 index 00000000..3cd66a15 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFavoriteFilter.java @@ -0,0 +1,29 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class NavigatorFavoriteFilter extends NavigatorFilter +{ + public final static String name = "favorites"; + + public NavigatorFavoriteFilter() + { + super(name); + } + + @Override + public List getResult(Habbo habbo) + { + List resultLists = new ArrayList(); + List rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsFavourite(habbo); + Collections.sort(rooms); + resultLists.add(new SearchResultList(0, "favorites", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("favorites", ListMode.LIST), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("popular", DisplayMode.VISIBLE), rooms, true, true)); + return resultLists; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilter.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilter.java new file mode 100644 index 00000000..bb72ebd2 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilter.java @@ -0,0 +1,156 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +public abstract class NavigatorFilter +{ + public final String viewName; + + public NavigatorFilter(String viewName) + { + this.viewName = viewName; + } + + public void filter(Method method, Object value, List collection) + { + if (method == null) + { + return; + } + + if (value instanceof String) + { + if (((String) value).isEmpty()) + { + return; + } + } + + for (SearchResultList result : collection) + { + if (!result.filter) + { + continue; + } + + filterRooms(method, value, result.rooms); + } + } + + public void filterRooms(Method method, Object value, List result) + { + if (method == null) + { + return; + } + + if (value instanceof String) + { + if (((String) value).isEmpty()) + { + return; + } + } + + List toRemove = new ArrayList(); + try + { + method.setAccessible(true); + + for (Room room : result) + { + Object o = method.invoke(room); + if (o.getClass() == value.getClass()) + { + if (o instanceof String) + { + NavigatorFilterComparator comparator = Emulator.getGameEnvironment().getNavigatorManager().comperatorForField(method); + + if (comparator != null) + { + if (!applies(comparator, (String) o, (String) value)) + { + toRemove.add(room); + } + } + else + { + toRemove.add(room); + } + } + else if (o instanceof String[]) + { + for (String s : (String[]) o) + { + NavigatorFilterComparator comparator = Emulator.getGameEnvironment().getNavigatorManager().comperatorForField(method); + + if (comparator != null) + { + if (!applies(comparator, s, (String) value)) + { + toRemove.add(room); + } + } + } + } + else + { + if (o != value) + { + toRemove.add(room); + } + } + } + } + } + catch (Exception e) + { + } + + result.removeAll(toRemove); + toRemove.clear(); + } + + public abstract List getResult(Habbo habbo); + + public List getResult(Habbo habbo, NavigatorFilterField filterField, String value, int roomCategory) + { + return getResult(habbo); + } + + private boolean applies(NavigatorFilterComparator comparator, String o, String value) + { + switch (comparator) + { + case CONTAINS: + if (StringUtils.containsIgnoreCase(o, + value)) + { + return true; + } + break; + + case EQUALS: + if (o.equals(value)) + { + return true; + } + break; + + case EQUALS_IGNORE_CASE: + if (o.equalsIgnoreCase(value)) + { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterComparator.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterComparator.java new file mode 100644 index 00000000..81ab3804 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterComparator.java @@ -0,0 +1,8 @@ +package com.eu.habbo.habbohotel.navigation; + +public enum NavigatorFilterComparator +{ + EQUALS, + EQUALS_IGNORE_CASE, + CONTAINS +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterField.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterField.java new file mode 100644 index 00000000..1c4ce670 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorFilterField.java @@ -0,0 +1,19 @@ +package com.eu.habbo.habbohotel.navigation; + +import java.lang.reflect.Method; + +public class NavigatorFilterField +{ + public final String key; + public final Method field; + public final String databaseQuery; + public final NavigatorFilterComparator comparator; + + public NavigatorFilterField(String key, Method field, String databaseQuery, NavigatorFilterComparator comparator) + { + this.key = key; + this.field = field; + this.databaseQuery = databaseQuery; + this.comparator = comparator; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorHotelFilter.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorHotelFilter.java new file mode 100644 index 00000000..4377bfa3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorHotelFilter.java @@ -0,0 +1,69 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class NavigatorHotelFilter extends NavigatorFilter +{ + public final static String name = "hotel_view"; + + public NavigatorHotelFilter() + { + super(name); + } + + @Override + public List getResult(Habbo habbo) + { + boolean showInvisible = habbo.hasPermission("acc_enter_anyroom") || habbo.hasPermission("acc_anyroomowner"); + List resultLists = new ArrayList(); + int i = 0; + resultLists.add(new SearchResultList(i, "popular", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("popular", ListMode.fromType(Emulator.getConfig().getInt("hotel.navigator.popular.listtype"))), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("popular"), Emulator.getGameEnvironment().getRoomManager().getPopularRooms(Emulator.getConfig().getInt("hotel.navigator.popular.amount")), false, showInvisible)); + i++; + + for (Map.Entry> set : Emulator.getGameEnvironment().getRoomManager().getPopularRoomsByCategory(Emulator.getConfig().getInt("hotel.navigator.popular.category.maxresults")).entrySet()) + { + if (!set.getValue().isEmpty()) + { + RoomCategory category = Emulator.getGameEnvironment().getRoomManager().getCategory(set.getKey()); + resultLists.add(new SearchResultList(i, category.getCaption(), category.getCaption(), SearchAction.MORE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory(category.getCaptionSave()), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory(category.getCaptionSave()), set.getValue(), true, showInvisible)); + i++; + } + } + + return resultLists; + } + + @Override + public List getResult(Habbo habbo, NavigatorFilterField filterField, String value, int roomCategory) + { + boolean showInvisible = habbo.hasPermission("acc_enter_anyroom") || habbo.hasPermission("acc_anyroomowner"); + if (!filterField.databaseQuery.isEmpty()) + { + List resultLists = new ArrayList(); + int i = 0; + + for (Map.Entry> set : Emulator.getGameEnvironment().getRoomManager().findRooms(filterField, value, roomCategory).entrySet()) + { + if (!set.getValue().isEmpty()) + { + RoomCategory category = Emulator.getGameEnvironment().getRoomManager().getCategory(set.getKey()); + resultLists.add(new SearchResultList(i, category.getCaptionSave(), category.getCaption(), SearchAction.MORE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory(category.getCaptionSave()), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory(category.getCaptionSave()), set.getValue(), true, showInvisible)); + i++; + } + } + + return resultLists; + } + else + { + return getResult(habbo); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorManager.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorManager.java new file mode 100644 index 00000000..b0772ea9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorManager.java @@ -0,0 +1,139 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import gnu.trove.map.hash.THashMap; + +import java.lang.reflect.Method; +import java.sql.*; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class NavigatorManager +{ + public static int MAXIMUM_RESULTS_PER_PAGE = 10; + + public final THashMap publicCategories = new THashMap(); + public final ConcurrentHashMap filterSettings = new ConcurrentHashMap(); + public final THashMap filters = new THashMap(); + + public NavigatorManager() + { + long millis = System.currentTimeMillis(); + loadNavigator(); + + filters.put(NavigatorPublicFilter.name, new NavigatorPublicFilter()); + filters.put(NavigatorHotelFilter.name, new NavigatorHotelFilter()); + filters.put(NavigatorRoomAdsFilter.name, new NavigatorRoomAdsFilter()); + filters.put(NavigatorUserFilter.name, new NavigatorUserFilter()); + filters.put(NavigatorFavoriteFilter.name, new NavigatorFavoriteFilter()); + + Emulator.getLogging().logStart("Navigator Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void loadNavigator() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + synchronized (this.publicCategories) + { + this.publicCategories.clear(); + + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM navigator_publiccats WHERE visible = '1'")) + { + while(set.next()) + { + this.publicCategories.put(set.getInt("id"), new NavigatorPublicCategory(set)); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM navigator_publics WHERE visible = '1'")) + { + while (set.next()) + { + NavigatorPublicCategory category = this.publicCategories.get(set.getInt("public_cat_id")); + + if (category != null) + { + category.addRoom(Emulator.getGameEnvironment().getRoomManager().loadRoom(set.getInt("room_id"))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + synchronized (this.filterSettings) + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM navigator_filter")) + { + while(set.next()) + { + Method field = null; + Class clazz = Room.class; + + if (set.getString("field").contains(".")) + { + for (String s : (set.getString("field")).split(".")) + { + try + { + field = clazz.getDeclaredMethod(s); + clazz = field.getReturnType(); + } + catch (Exception e) + { + e.printStackTrace(); + break; + } + } + } + else + { + try + { + field = clazz.getDeclaredMethod(set.getString("field")); + } + catch (Exception e) + { + continue; + } + } + + if (field != null) + { + this.filterSettings.put(set.getString("key"), new NavigatorFilterField(set.getString("key"), field, set.getString("database_query"), NavigatorFilterComparator.valueOf(set.getString("compare").toUpperCase()))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public NavigatorFilterComparator comperatorForField(Method field) + { + for (Map.Entry set : this.filterSettings.entrySet()) + { + if (set.getValue().field == field) + { + return set.getValue().comparator; + } + } + + return null; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicCategory.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicCategory.java new file mode 100644 index 00000000..ad41915a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicCategory.java @@ -0,0 +1,31 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.habbohotel.rooms.Room; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class NavigatorPublicCategory +{ + public final int id; + public final String name; + public final List rooms; + public final ListMode image; + + public NavigatorPublicCategory(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.name = set.getString("name"); + this.image = set.getString("image").equals("1") ? ListMode.THUMBNAILS : ListMode.LIST; + + this.rooms = new ArrayList(); + } + + public void addRoom(Room room) + { + room.preventUncaching = true; + this.rooms.add(room); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicFilter.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicFilter.java new file mode 100644 index 00000000..e825e0ac --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorPublicFilter.java @@ -0,0 +1,37 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; +import java.util.List; + +public class NavigatorPublicFilter extends NavigatorFilter +{ + public final static String name = "official_view"; + + public NavigatorPublicFilter() + { + super(name); + } + + @Override + public List getResult(Habbo habbo) + { + boolean showInvisible = habbo.hasPermission("acc_enter_anyroom") || habbo.hasPermission("acc_anyroomowner"); + List resultLists = new ArrayList(); + int i = 0; + resultLists.add(new SearchResultList(i, "official-root", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("official-root", ListMode.THUMBNAILS), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("official-root"), Emulator.getGameEnvironment().getRoomManager().getPublicRooms(), false, showInvisible)); + i++; + for (NavigatorPublicCategory category : Emulator.getGameEnvironment().getNavigatorManager().publicCategories.values()) + { + if (!category.rooms.isEmpty()) + { + resultLists.add(new SearchResultList(i, "", category.name, SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory(category.name, category.image), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory(category.name), category.rooms, true, showInvisible)); + i++; + } + } + + return resultLists; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorRoomAdsFilter.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorRoomAdsFilter.java new file mode 100644 index 00000000..f176be5c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorRoomAdsFilter.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; +import java.util.List; + +public class NavigatorRoomAdsFilter extends NavigatorFilter +{ + public final static String name = "roomads_view"; + + public NavigatorRoomAdsFilter() + { + super(name); + } + + @Override + public List getResult(Habbo habbo) + { + boolean showInvisible = habbo.hasPermission("acc_enter_anyroom") || habbo.hasPermission("acc_anyroomowner"); + List resultList = new ArrayList(); + resultList.add(new SearchResultList(0, "categories", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("categories", ListMode.LIST), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("official-root", DisplayMode.VISIBLE), Emulator.getGameEnvironment().getRoomManager().getRoomsPromoted(), false, showInvisible)); + return resultList; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorUserFilter.java b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorUserFilter.java new file mode 100644 index 00000000..a90d75ce --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/NavigatorUserFilter.java @@ -0,0 +1,62 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class NavigatorUserFilter extends NavigatorFilter +{ + public final static String name = "myworld_view"; + + public NavigatorUserFilter() + { + super(name); + } + + @Override + public List getResult(Habbo habbo) + { + int i = 0; + List resultLists = new ArrayList(); + List rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(habbo); + Collections.sort(rooms); + resultLists.add(new SearchResultList(i, "my", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("my"), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("my"), rooms, true, true)); + i++; + + List favoriteRooms = Emulator.getGameEnvironment().getRoomManager().getRoomsFavourite(habbo); + + if (!favoriteRooms.isEmpty()) + { + Collections.sort(favoriteRooms); + resultLists.add(new SearchResultList(1, "favorites", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("favorites"), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("favorites"), favoriteRooms, true, true)); + i++; + } + + List frequentlyVisited = Emulator.getGameEnvironment().getRoomManager().getRoomsVisited(habbo, false, 10); + if (!frequentlyVisited.isEmpty()) + { + resultLists.add(new SearchResultList(1, "history_freq", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("history_freq"), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("history_freq"), frequentlyVisited, true, true)); + i++; + } + + List groupRooms = Emulator.getGameEnvironment().getRoomManager().getGroupRooms(habbo, 25); + if (!groupRooms.isEmpty()) + { + resultLists.add(new SearchResultList(1, "my_groups", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("my_groups"), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("my_groups"), groupRooms, true, true)); + i++; + } + + List rightRooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithRights(habbo); + if (!rightRooms.isEmpty()) + { + resultLists.add(new SearchResultList(1, "with_rights", "", SearchAction.NONE, habbo.getHabboStats().navigatorWindowSettings.getListModeForCategory("with_rights"), habbo.getHabboStats().navigatorWindowSettings.getDisplayModeForCategory("with_rights"), rightRooms, true, true)); + i++; + } + + return resultLists; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/SearchAction.java b/src/main/java/com/eu/habbo/habbohotel/navigation/SearchAction.java new file mode 100644 index 00000000..12c7e08c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/SearchAction.java @@ -0,0 +1,15 @@ +package com.eu.habbo.habbohotel.navigation; + +public enum SearchAction +{ + NONE(0), + MORE(1), + BACK(2); + + public final int type; + + SearchAction(int type) + { + this.type = type; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/navigation/SearchResultList.java b/src/main/java/com/eu/habbo/habbohotel/navigation/SearchResultList.java new file mode 100644 index 00000000..be8c7e70 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/navigation/SearchResultList.java @@ -0,0 +1,82 @@ +package com.eu.habbo.habbohotel.navigation; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomState; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class SearchResultList implements ISerialize, Comparable +{ + public final int order; + public final String code; + public final String query; + public final SearchAction action; + public final ListMode mode; + public final DisplayMode hidden; + public final List rooms; + public final boolean filter; + public final boolean showInvisible; + + public SearchResultList(int order, String code, String query, SearchAction action, ListMode mode, DisplayMode hidden, List rooms, boolean filter, boolean showInvisible) + { + this.order = order; + this.code = code; + this.query = query; + this.action = action; + this.mode = mode; + this.rooms = rooms; + this.hidden = hidden; + this.filter = filter; + this.showInvisible = showInvisible; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString(this.code); //Search Code + message.appendString(this.query); //Text + message.appendInt(this.action.type); //Action Allowed (0 (Nothing), 1 (More Results), 2 (Go Back)) + message.appendBoolean(this.hidden.equals(DisplayMode.COLLAPSED)); //Closed + message.appendInt(this.mode.type); //Display Mode (0 (List), 1 (Thumbnails), 2 (Thumbnail no choice)) + + synchronized (this.rooms) + { + if (!this.showInvisible) + { + List toRemove = new ArrayList(); + for (Room room : this.rooms) + { + if (room.getState() == RoomState.INVISIBLE) + { + toRemove.add(room); + } + } + + this.rooms.removeAll(toRemove); + } + + message.appendInt(this.rooms.size()); + + Collections.sort(this.rooms); + for (Room room : this.rooms) + { + room.serialize(message); + } + } + } + + @Override + public int compareTo(SearchResultList o) + { + if (this.code.equalsIgnoreCase("popular")) + { + return -1; + } + + return this.rooms.size() - o.rooms.size(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java b/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java new file mode 100644 index 00000000..ad66d05f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/permissions/Permission.java @@ -0,0 +1,13 @@ +package com.eu.habbo.habbohotel.permissions; + +public class Permission +{ + public final String key; + public final PermissionSetting setting; + + public Permission(String key, PermissionSetting setting) + { + this.key = key; + this.setting = setting; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/permissions/PermissionSetting.java b/src/main/java/com/eu/habbo/habbohotel/permissions/PermissionSetting.java new file mode 100644 index 00000000..7e46e767 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/permissions/PermissionSetting.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.permissions; + +public enum PermissionSetting +{ + DISALLOWED, + ALLOWED, + ROOM_OWNER; + + public static PermissionSetting fromString(String value) + { + switch (value) + { + case "1": + return ALLOWED; + case "2": + return ROOM_OWNER; + + } + + return DISALLOWED; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/permissions/PermissionsManager.java b/src/main/java/com/eu/habbo/habbohotel/permissions/PermissionsManager.java new file mode 100644 index 00000000..26cbbdf3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/permissions/PermissionsManager.java @@ -0,0 +1,144 @@ +package com.eu.habbo.habbohotel.permissions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.HabboPlugin; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +public class PermissionsManager +{ + private final TIntObjectHashMap ranks; + private final TIntIntHashMap enables; + + public PermissionsManager() + { + long millis = System.currentTimeMillis(); + this.ranks = new TIntObjectHashMap(); + this.enables = new TIntIntHashMap(); + + this.reload(); + + Emulator.getLogging().logStart("Permissions Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void reload() + { + this.loadPermissions(); + this.loadEnables(); + } + + private void loadPermissions() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM permissions ORDER BY id ASC")) + { + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (!this.ranks.containsKey(set.getInt("id"))) + { + this.ranks.put(set.getInt("id"), new Rank(set)); + } else + { + this.ranks.get(set.getInt("id")).load(set); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private void loadEnables() + { + synchronized (this.enables) + { + this.enables.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM special_enables")) + { + while(set.next()) + { + this.enables.put(set.getInt("effect_id"), set.getInt("min_rank")); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public boolean rankExists(int rankId) + { + return this.ranks.containsKey(rankId); + } + + public Rank getRank(int rankId) + { + return this.ranks.get(rankId); + } + + public Rank getRank(String rankName) + { + for (Rank rank : this.ranks.valueCollection()) + { + if (rank.getName().equalsIgnoreCase(rankName)) + return rank; + } + + return null; + } + + @Deprecated + public Collection getPermissionsForRank(int rankId) + { + throw new RuntimeException("Please use getRank()"); + } + + public boolean isEffectBlocked(int effectId, int rank) + { + return this.enables.contains(effectId) && this.enables.get(effectId) > rank; + } + + public boolean hasPermission(Habbo habbo, String permission) + { + return this.hasPermission(habbo, permission, false); + } + + public boolean hasPermission(Habbo habbo, String permission, boolean withRoomRights) + { + boolean result = this.hasPermission(habbo.getHabboInfo().getRank(), permission, withRoomRights); + + if (!result) + { + for (HabboPlugin plugin : Emulator.getPluginManager().getPlugins()) + { + if(plugin.hasPermission(habbo, permission)) + { + return true; + } + } + + return false; + } + + return result; + } + + public boolean hasPermission(Rank rank, String permission, boolean withRoomRights) + { + return rank.hasPermission(permission, withRoomRights); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/permissions/Rank.java b/src/main/java/com/eu/habbo/habbohotel/permissions/Rank.java new file mode 100644 index 00000000..d13ec1fe --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/permissions/Rank.java @@ -0,0 +1,120 @@ +package com.eu.habbo.habbohotel.permissions; + +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; + +public class Rank +{ + private final int id; + private final int level; + private String name; + private final THashMap permissions; + private final THashMap variables; + private int roomEffect; + private boolean logCommands; + private String prefix; + private String prefixColor; + private boolean hasPrefix; + + public Rank(ResultSet set) throws SQLException + { + this.permissions = new THashMap<>(); + this.variables = new THashMap<>(); + this.id = set.getInt("id"); + this.level = set.getInt("level"); + + this.load(set); + } + + public void load(ResultSet set) throws SQLException + { + ResultSetMetaData meta = set.getMetaData(); + this.name = set.getString("rank_name"); + this.roomEffect = set.getInt("room_effect"); + this.logCommands = set.getString("log_commands").equals("1"); + this.prefix = set.getString("prefix"); + this.prefixColor = set.getString("prefix_color"); + this.hasPrefix = !this.prefix.isEmpty(); + for (int i = 1; i < meta.getColumnCount() + 1; i++) + { + String columnName = meta.getColumnName(i); + if (columnName.startsWith("cmd_") || columnName.startsWith("acc_")) + { + if (set.getString(i).equals("1") || set.getString(i).equals("2")) + { + this.permissions.put(meta.getColumnName(i), new Permission(columnName, PermissionSetting.fromString(set.getString(i)))); + } + } + else + { + variables.put(meta.getColumnName(i), set.getString(i)); + } + } + } + + public boolean hasPermission(String key, boolean isRoomOwner) + { + if (this.permissions.containsKey(key)) + { + Permission permission = this.permissions.get(key); + + return permission.setting == PermissionSetting.ALLOWED || permission.setting == PermissionSetting.ROOM_OWNER && isRoomOwner; + + } + + return false; + } + + public int getId() + { + return this.id; + } + + public int getLevel() + { + return this.level; + } + + public String getName() + { + return this.name; + } + + public THashMap getPermissions() + { + return this.permissions; + } + + public THashMap getVariables() + { + return this.variables; + } + + public int getRoomEffect() + { + return this.roomEffect; + } + + public boolean isLogCommands() + { + return this.logCommands; + } + + public String getPrefix() + { + return this.prefix; + } + + public String getPrefixColor() + { + return this.prefixColor; + } + + public boolean hasPrefix() + { + return this.hasPrefix; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/AbstractPet.java b/src/main/java/com/eu/habbo/habbohotel/pets/AbstractPet.java new file mode 100644 index 00000000..bf42335c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/AbstractPet.java @@ -0,0 +1,238 @@ +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.plugin.events.pets.PetTalkEvent; + +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +public abstract class AbstractPet implements ISerialize, Runnable +{ + protected int id; + protected int userId; + protected Room room; + protected String name; + protected PetData petData; + protected int race; + protected String color; + protected int happyness; + protected int experience; + protected int energy; + protected int respect; + protected int created; + protected int level; + public boolean needsUpdate = false; + + RoomUnit roomUnit; + int chatTimeout; + + void say(String message) + { + if(this.roomUnit != null && this.room != null && !message.isEmpty()) + { + RoomChatMessage chatMessage = new RoomChatMessage(message, this.roomUnit, RoomChatMessageBubbles.NORMAL); + PetTalkEvent talkEvent = new PetTalkEvent(this, chatMessage); + if (!Emulator.getPluginManager().fireEvent(talkEvent).isCancelled()) + { + this.room.petChat(new RoomUserTalkComposer(chatMessage).compose()); + } + } + } + + public void say(PetVocal vocal) + { + if (true) + return; + + if(vocal != null) + this.say(vocal.message); + } + + public int getId() + { + return id; + } + + public int getUserId() + { + return userId; + } + + public void setUserId(int userId) + { + this.userId = userId; + } + + public Room getRoom() + { + return room; + } + + public void setRoom(Room room) + { + this.room = room; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public PetData getPetData() + { + return this.petData; + } + + public void setPetData(PetData petData) + { + this.petData = petData; + } + + public int getRace() + { + return race; + } + + public void setRace(int race) + { + this.race = race; + } + + public String getColor() + { + return this.color; + } + + public void setColor(String color) + { + this.color = color; + } + + public int getHappyness() + { + return happyness; + } + + public void setHappyness(int happyness) + { + this.happyness = happyness; + } + + public int getExperience() + { + return experience; + } + + public void setExperience(int experience) + { + this.experience = experience; + } + + public synchronized void addExperience(int amount) + { + this.experience += amount; + } + + public int getEnergy() + { + return energy; + } + + public int getMaxEnergy() + { + return this.level * 100; + } + + public synchronized void setEnergy(int energy) + { + this.energy = energy; + } + + public synchronized void addEnergy(int amount) + { + this.energy += amount; + + if(this.energy > PetManager.maxEnergy(this.level)) + this.energy = PetManager.maxEnergy(this.level); + + if(this.energy < 0) + this.energy = 0; + } + + public synchronized void addHappyness(int amount) + { + this.happyness += amount; + + if(this.happyness > 100) + this.happyness = 100; + + if(this.happyness < 0) + this.happyness = 0; + } + + public int getRespect() + { + return respect; + } + + public synchronized void addRespect() + { + this.respect++; + } + + public int getCreated() + { + return created; + } + + public void setCreated(int created) + { + this.created = created; + } + + public int daysAlive() + { + return (Emulator.getIntUnixTimestamp() - this.created) / 86400; + } + + public String bornDate() + { + + Calendar cal = Calendar.getInstance(TimeZone.getDefault()); + cal.setTime(new Date(this.created)); + + return cal.get(Calendar.DAY_OF_MONTH) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.YEAR); + } + + public int getLevel() + { + return level; + } + + public void setLevel(int level) + { + this.level = level; + } + + public RoomUnit getRoomUnit() + { + return roomUnit; + } + + public void setRoomUnit(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/GnomePet.java b/src/main/java/com/eu/habbo/habbohotel/pets/GnomePet.java new file mode 100644 index 00000000..bffb236e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/GnomePet.java @@ -0,0 +1,108 @@ +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class GnomePet extends Pet implements IPetLook +{ + private final String gnomeData; + + public GnomePet(ResultSet set) throws SQLException + { + super(set); + + this.gnomeData = set.getString("gnome_data"); + } + + public GnomePet( int type, int race, String color, String name,int userId, String gnomeData) + { + super(type, race, color, name, userId); + + this.gnomeData = gnomeData; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.getId()); + message.appendString(this.getName()); + message.appendInt(this.petData.getType()); + message.appendInt(this.race); + message.appendString(this.color); + message.appendInt(0); + message.appendInt(0); + message.appendInt(0); + } + + @Override + public void run() + { + if (this.needsUpdate) + { + super.run(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_pets SET gnome_data = ? WHERE id = ? LIMIT 1")) + { + statement.setString(1, this.gnomeData); + statement.setInt(2, this.id); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + @Override + public String getLook() + { + return this.getPetData().getType() + " 0 FFFFFF " + this.gnomeData; + } + + @Override + public void scratched(Habbo habbo) + { + super.scratched(habbo); + + if (this.getPetData().getType() == 26) + { + if (habbo != null) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GnomeRespectGiver")); + } + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GnomeRespectReceiver")); + } + else if (this.getPetData().getType() == 27) + { + if (habbo != null) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("LeprechaunRespectGiver")); + } + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("LeprechaunRespectReceiver")); + } + + } + + @Override + protected void levelUp() + { + super.levelUp(); + + if (this.getPetData().getType() == 26) + { + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GnomeLevelUp")); + } + else if (this.getPetData().getType() == 27) + { + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("LeprechaunLevelUp")); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/HorsePet.java b/src/main/java/com/eu/habbo/habbohotel/pets/HorsePet.java new file mode 100644 index 00000000..5a4a879c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/HorsePet.java @@ -0,0 +1,113 @@ +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class HorsePet extends Pet +{ + private int hairColor; + private int hairStyle; + + private boolean hasSaddle; + private boolean anyoneCanRide; + + private Habbo rider; + + public HorsePet(ResultSet set) throws SQLException + { + super(set); + this.hairColor = set.getInt("hair_color"); + this.hairStyle = set.getInt("hair_style"); + this.hasSaddle = set.getString("saddle").equalsIgnoreCase("1"); + this.anyoneCanRide = set.getString("ride").equalsIgnoreCase("1"); + this.rider = null; + } + + public HorsePet(int type, int race, String color, String name, int userId) + { + super(type, race, color, name, userId); + this.hairColor = 0; + this.hairStyle = -1; + this.hasSaddle = false; + this.anyoneCanRide = false; + this.rider = null; + } + + @Override + public void run() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_pets SET hair_style = ?, hair_color = ?, saddle = ?, ride = ? WHERE id = ?")) + { + statement.setInt(1, this.hairStyle); + statement.setInt(2, this.hairColor); + statement.setString(3, this.hasSaddle ? "1" : "0"); + statement.setString(4, this.anyoneCanRide ? "1" : "0"); + statement.setInt(5, super.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + super.run(); + } + } + + public int getHairColor() + { + return this.hairColor; + } + + public void setHairColor(int hairColor) + { + this.hairColor = hairColor; + } + + public int getHairStyle() + { + return this.hairStyle; + } + + public void setHairStyle(int hairStyle) + { + this.hairStyle = hairStyle; + } + + public boolean hasSaddle() + { + return this.hasSaddle; + } + + public void hasSaddle(boolean hasSaddle) + { + this.hasSaddle = hasSaddle; + } + + public boolean anyoneCanRide() + { + return this.anyoneCanRide; + } + + public void setAnyoneCanRide(boolean anyoneCanRide) + { + this.anyoneCanRide = anyoneCanRide; + } + + public Habbo getRider() + { + return this.rider; + } + + public void setRider(Habbo rider) + { + this.rider = rider; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/IPetLook.java b/src/main/java/com/eu/habbo/habbohotel/pets/IPetLook.java new file mode 100644 index 00000000..5792bab0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/IPetLook.java @@ -0,0 +1,6 @@ +package com.eu.habbo.habbohotel.pets; + +public interface IPetLook +{ + public String getLook(); +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/MonsterplantPet.java b/src/main/java/com/eu/habbo/habbohotel/pets/MonsterplantPet.java new file mode 100644 index 00000000..c21fb33a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/MonsterplantPet.java @@ -0,0 +1,432 @@ +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.PetStatusUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetRespectComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import javafx.util.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +public class MonsterplantPet extends Pet implements IPetLook +{ + public static int growTime = (30 * 60); // 30 minutes + public static int timeToLive = (3 * 24 * 60 * 60); //3 days + + public static final Map> bodyRarity = new LinkedHashMap>() + { + { + put(1, new Pair<>("Blungon", 0)); + put(5, new Pair<>("Squarg", 0)); + put(2, new Pair<>("Wailzor", 1)); + put(3, new Pair<>("Stumpy", 1)); + put(4, new Pair<>("Sunspike", 2)); + put(9, new Pair<>("Weggylum", 2)); + put(6, new Pair<>("Shroomer", 3)); + put(7, new Pair<>("Zuchinu", 3)); + put(10, new Pair<>("Wystique", 4)); + put(11, new Pair<>("Hairbullis", 4)); + put(8, new Pair<>("Abysswirl", 5)); + put(12, new Pair<>("Snozzle", 5)); //Rarity??? + } + }; + + public static final Map> colorRarity = new LinkedHashMap>() + { + { + put(0, new Pair<>("Aenueus", 0)); + put(9, new Pair<>("Fulvus", 0)); + put(1, new Pair<>("Griseus", 1)); + put(3, new Pair<>("Viridulus", 1)); + put(2, new Pair<>("Phoenicus", 2)); + put(5, new Pair<>("Incarnatus", 2)); + put(8, new Pair<>("Amethyst", 3)); + put(10, new Pair<>("Cinereus", 3)); + put(6, new Pair<>("Azureus", 4)); + put(7, new Pair<>("Atamasc", 4)); + put(4, new Pair<>("Cyaneus", 5)); + } + }; + + public static final ArrayList> indexedBody = new ArrayList>(MonsterplantPet.bodyRarity.values()); + + public static final ArrayList> indexedColors = new ArrayList>(MonsterplantPet.colorRarity.values()); + + private int type; + private int hue; + private final int nose; + private final int noseColor; + private final int eyes; + private final int eyesColor; + private final int mouth; + private final int mouthColor; + private int deathTimestamp = Emulator.getIntUnixTimestamp() + timeToLive; + private boolean canBreed = true; + private boolean publiclyBreedable = false; + + private int growthStage = 0; + + public String look; + + public MonsterplantPet(ResultSet set) throws SQLException + { + super(set); + this.type = set.getInt("mp_type"); + this.hue = set.getInt("mp_color"); + this.nose = set.getInt("mp_nose"); + this.noseColor = set.getInt("mp_nose_color"); + this.eyes = set.getInt("mp_eyes"); + this.eyesColor = set.getInt("mp_eyes_color"); + this.mouth = set.getInt("mp_mouth"); + this.mouthColor = set.getInt("mp_mouth_color"); + this.deathTimestamp = set.getInt("mp_death_timestamp"); + this.publiclyBreedable = set.getString("mp_allow_breed").equals("1"); + this.canBreed = set.getString("mp_breedable").equals("1"); + } + + public MonsterplantPet(int userId, int type, int hue, int nose, int noseColor, int mouth, int mouthColor, int eyes, int eyesColor) + { + super(16, 0, "", "", userId); + + this.type = type; + this.hue = hue; + this.nose = nose; + this.noseColor = noseColor; + this.mouth = mouth; + this.mouthColor = mouthColor; + this.eyes = eyes; + this.eyesColor = eyesColor; + } + + @Override + public String getName() + { + String name = "Unknownis"; + + if (colorRarity.containsKey(this.hue)) + { + name = colorRarity.get(this.hue).getKey(); + } + + if (bodyRarity.containsKey(this.type)) + { + name += " " + bodyRarity.get(this.type).getKey(); + } + + return name; + } + + @Override + public void run() + { + if(this.needsUpdate) + { + super.run(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_pets SET mp_type = ?, mp_color = ?, mp_nose = ?, mp_eyes = ?, mp_mouth = ?, mp_nose_color = ?, mp_eyes_color = ?, mp_mouth_color = ?, mp_death_timestamp = ?, mp_breedable = ?, mp_allow_breed = ? WHERE id = ?")) + { + statement.setInt(1, this.type); + statement.setInt(2, this.hue); + statement.setInt(3, this.nose); + statement.setInt(4, this.eyes); + statement.setInt(5, this.mouth); + statement.setInt(6, this.noseColor); + statement.setInt(7, this.eyesColor); + statement.setInt(8, this.mouthColor); + statement.setInt(9, this.deathTimestamp); + statement.setString(10, this.canBreed ? "1" : "0"); + statement.setString(11, this.publiclyBreedable ? "1" : "0"); + statement.setInt(12, this.id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + @Override + public void cycle() + { + if (this.room != null && this.roomUnit != null) + { + if (isDead()) + { + this.roomUnit.getStatus().remove("gst"); + + if (!this.roomUnit.getStatus().containsKey("rip")) + { + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.userId), Emulator.getGameEnvironment().getAchievementManager().getAchievement("MonsterPlantGardenOfDeath")); + } + if (this.roomUnit.getStatus().size() != 1) + { + this.roomUnit.getStatus().clear(); + this.roomUnit.getStatus().put("rip", ""); + this.packetUpdate = true; + } + } + else + { + int difference = Emulator.getIntUnixTimestamp() - this.created + 1; + if (difference >= growTime) + { + this.growthStage = 7; + boolean clear = false; + for (String s : roomUnit.getStatus().keySet()) + { + if (s.startsWith("grw")) + { + clear = true; + } + } + + if (clear) + { + roomUnit.getStatus().clear(); + packetUpdate = true; + } + } + else + { + int g = (int) Math.ceil(difference / (growTime / 7.0)); + + if (g > this.growthStage) + { + this.growthStage = g; + roomUnit.getStatus().clear(); + roomUnit.getStatus().put("grw" + this.growthStage, ""); + packetUpdate = true; + } + } + + if (Emulator.getRandom().nextInt(1000) < 10) + { + super.updateGesture(Emulator.getIntUnixTimestamp()); + this.packetUpdate = true; + } + } + } + } + + public int getType() + { + return this.type; + } + + public int getRarity() + { + if (bodyRarity.containsKey(this.type) && colorRarity.containsKey(this.hue)) + { + return bodyRarity.get(this.type).getValue() + colorRarity.get(this.hue).getValue(); + } + return 0; + } + + @Override + public String getLook() + { + String look = "16 0 FFFFFF " + + "5 " + + "0 -1 10 " + + "1 " + this.type + " " + this.hue + " " + + "2 " + this.mouth + " " + this.mouthColor + " " + + "3 " + this.nose + " " + this.noseColor + " " + + "4 " + this.eyes + " " + this.eyesColor; + + return look; + } + + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.getId()); + message.appendString(this.getName()); + message.appendInt(this.petData.getType()); + message.appendInt(this.race); + message.appendString(this.getLook().substring(5, this.getLook().length())); + message.appendInt(this.getRarity()); + message.appendInt(5); + message.appendInt(0); + message.appendInt(-1); + message.appendInt(10); + message.appendInt(1); + message.appendInt(this.type); + message.appendInt(this.hue); + message.appendInt(2); + message.appendInt(this.mouth); + message.appendInt(this.mouthColor); + message.appendInt(3); + message.appendInt(this.nose); + message.appendInt(this.noseColor); + message.appendInt(4); + message.appendInt(this.eyes); + message.appendInt(this.eyesColor); + + message.appendInt(this.growthStage); + } + + public int remainingTimeToLive() + { + return Math.max(0, this.deathTimestamp - Emulator.getIntUnixTimestamp()); + } + + public boolean isDead() + { + return Emulator.getIntUnixTimestamp() >= this.deathTimestamp; + } + + public void setDeathTimestamp(int deathTimestamp) + { + this.deathTimestamp = deathTimestamp; + } + + public int getGrowthStage() + { + return growthStage; + } + + public int remainingGrowTime() + { + if (growthStage == 7) + { + return 0; + } + + return Math.max(0, growTime - (Emulator.getIntUnixTimestamp() - this.created)); + } + + public boolean isFullyGrown() + { + return this.growthStage == 7; + } + + public boolean canBreed() + { + return this.canBreed; + } + + public void setCanBreed(boolean canBreed) + { + this.canBreed = canBreed; + } + + public boolean breedable() + { + return this.isFullyGrown() && this.canBreed && !this.isDead(); + } + + public boolean isPubliclyBreedable() + { + return this.publiclyBreedable; + } + + public void setPubliclyBreedable(boolean isPubliclyBreedable) + { + this.publiclyBreedable = isPubliclyBreedable; + } + + public void breed(MonsterplantPet pet) + { + if (this.canBreed && pet.canBreed) + { + this.canBreed = false; + this.publiclyBreedable = false; + + pet.setCanBreed(false); + pet.setPubliclyBreedable(false); + this.room.sendComposer(new PetStatusUpdateComposer((Pet) pet).compose()); + this.room.sendComposer(new PetStatusUpdateComposer(this).compose()); + + this.getRoomUnit().getStatus().put("gst", "reb"); + pet.getRoomUnit().getStatus().put("gst", "reb"); + + this.room.sendComposer(new RoomUserStatusComposer(this.getRoomUnit()).compose()); + this.room.sendComposer(new RoomUserStatusComposer(pet.getRoomUnit()).compose()); + + this.getRoomUnit().getStatus().remove("gst"); + pet.getRoomUnit().getStatus().remove("gst"); + + Habbo ownerOne = this.room.getHabbo(this.getUserId()); + Habbo ownerTwo = null; + + if (this.getUserId() != pet.getUserId()) + { + ownerTwo = this.room.getHabbo(pet.getUserId()); + } + + Item seedBase = null; + + if (this.getRarity() < 8 || pet.getRarity() < 8 || Emulator.getRandom().nextInt(100) > this.getRarity() + pet.getRarity()) + { + seedBase = Emulator.getGameEnvironment().getItemManager().getItem(Emulator.getConfig().getInt("monsterplant.seed.item_id")); + } + else + { + seedBase = Emulator.getGameEnvironment().getItemManager().getItem(Emulator.getConfig().getInt("monsterplant.seed_rare.item_id")); + } + + if (seedBase != null) + { + HabboItem seed = null; + if (ownerOne != null) + { + AchievementManager.progressAchievement(ownerOne, Emulator.getGameEnvironment().getAchievementManager().getAchievement("MonsterPlantBreeder"), 5); + seed = Emulator.getGameEnvironment().getItemManager().createItem(ownerOne.getHabboInfo().getId(), seedBase, 0, 0, ""); + ownerOne.getInventory().getItemsComponent().addItem(seed); + ownerOne.getClient().sendResponse(new AddHabboItemComposer(seed)); + ownerOne.getClient().sendResponse(new InventoryRefreshComposer()); + } + + if (ownerTwo != null) + { + AchievementManager.progressAchievement(ownerTwo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("MonsterPlantBreeder"), 5); + seed = Emulator.getGameEnvironment().getItemManager().createItem(ownerTwo.getHabboInfo().getId(), seedBase, 0, 0, ""); + ownerTwo.getInventory().getItemsComponent().addItem(seed); + ownerTwo.getClient().sendResponse(new AddHabboItemComposer(seed)); + ownerTwo.getClient().sendResponse(new InventoryRefreshComposer()); + } + } + } + } + + @Override + public int getMaxEnergy() + { + return MonsterplantPet.timeToLive; + } + @Override + public int getEnergy() + { + if (this.isDead()) + { + return 100; + } + + return this.deathTimestamp - Emulator.getIntUnixTimestamp(); + } + + @Override + public void scratched(Habbo habbo) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("MonsterPlantTreater"), 5); + this.setDeathTimestamp(Emulator.getIntUnixTimestamp() + MonsterplantPet.timeToLive); + this.addExperience(10); + this.room.sendComposer(new PetStatusUpdateComposer(this).compose()); + this.room.sendComposer(new RoomPetRespectComposer(this, RoomPetRespectComposer.PET_TREATED).compose()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java b/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java new file mode 100644 index 00000000..83edc945 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java @@ -0,0 +1,1096 @@ + +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetBreedingNest; +import com.eu.habbo.habbohotel.items.interactions.InteractionWater; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetExperienceComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetRespectComposer; +import com.eu.habbo.threading.runnables.PetClearPosture; +import com.eu.habbo.threading.runnables.PetFollowHabbo; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; + +public class Pet extends AbstractPet +{ + public int levelThirst; + public int levelHunger; + + public boolean packetUpdate = false; + + private int tickTimeout = Emulator.getIntUnixTimestamp(); + private int happynessDelay = Emulator.getIntUnixTimestamp(); + private int gestureTickTimeout = Emulator.getIntUnixTimestamp(); + private int randomActionTickTimeout = Emulator.getIntUnixTimestamp(); + private int postureTimeout = Emulator.getIntUnixTimestamp(); + private int idleCommandTicks = 0; + private int freeCommandTicks = -1; + + private PetTasks task = PetTasks.FREE; + + private boolean muted = false; + + public Pet(ResultSet set) throws SQLException + { + super(); + this.id = set.getInt("id"); + this.userId = set.getInt("user_id"); + this.room = null; + this.name = set.getString("name"); + this.petData = Emulator.getGameEnvironment().getPetManager().getPetData(set.getInt("type")); + this.race = set.getInt("race"); + this.experience = set.getInt("experience"); + this.happyness = set.getInt("happyness"); + this.energy = set.getInt("energy"); + this.respect = set.getInt("respect"); + this.created = set.getInt("created"); + this.color = set.getString("color"); + this.levelThirst = set.getInt("thirst"); + this.levelHunger = set.getInt("hunger"); + this.level = PetManager.getLevel(this.experience); + } + + public Pet(int type, int race, String color, String name, int userId) + { + this.id = 0; + this.userId = userId; + this.room = null; + this.name = name; + this.petData = Emulator.getGameEnvironment().getPetManager().getPetData(type); + + if(this.petData == null) + { + Emulator.getLogging().logErrorLine(new Exception("Non existing pet data for type: " + type)); + } + + this.race = race; + this.color = color; + this.experience = 0; + this.happyness = 100; + this.energy = 100; + this.respect = 0; + this.levelThirst = 0; + this.levelHunger = 0; + this.created = Emulator.getIntUnixTimestamp(); + this.level = 1; + } + + @Override + public void run() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + if (this.id > 0) + { + try (PreparedStatement statement = connection.prepareStatement("UPDATE users_pets SET room_id = ?, experience = ?, energy = ?, respect = ?, x = ?, y = ?, z = ?, rot = ?, hunger = ?, thirst = ?, happyness = ? WHERE id = ?")) + { + statement.setInt(1, (this.room == null ? 0 : this.room.getId())); + statement.setInt(2, this.experience); + statement.setInt(3, this.energy); + statement.setInt(4, this.respect); + statement.setInt(5, this.getRoomUnit() != null ? this.getRoomUnit().getX() : 0); + statement.setInt(6, this.getRoomUnit() != null ? this.getRoomUnit().getY() : 0); + statement.setDouble(7, this.getRoomUnit() != null ? this.getRoomUnit().getZ() : 0.0); + statement.setInt(8, this.getRoomUnit() != null ? this.getRoomUnit().getBodyRotation().getValue() : 0); + statement.setInt(9, this.levelHunger); + statement.setInt(10, this.levelThirst); + statement.setInt(11, this.happyness); + statement.setInt(12, this.id); + statement.execute(); + } + } + else if (this.id == 0) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO users_pets (user_id, room_id, name, race, type, color, experience, energy, respect, created) VALUES (?, 0, ?, ?, ?, ?, 0, 0, 0, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, this.userId); + statement.setString(2, this.name); + statement.setInt(3, this.race); + statement.setInt(4, 0); + + if (this.petData != null) + { + statement.setInt(4, this.petData.getType()); + } + + statement.setString(5, this.color); + statement.setInt(6, this.created); + statement.execute(); + + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + this.id = set.getInt(1); + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.needsUpdate = false; + } + } + + public void cycle() + { + this.idleCommandTicks++; + + int time = Emulator.getIntUnixTimestamp(); + if(this.roomUnit != null && this.task != PetTasks.RIDE) + { + if(time - this.gestureTickTimeout > 5) + { + this.roomUnit.getStatus().remove("gst"); + this.packetUpdate = true; + } + + if(time - this.postureTimeout > 1 && this.task == null) + { + this.clearPosture(); + this.postureTimeout = time; + } + + if (this.freeCommandTicks > 0) + { + this.freeCommandTicks--; + + if (this.freeCommandTicks == 0) + { + freeCommand(); + } + } + + if(!this.roomUnit.isWalking()) + { + this.roomUnit.getStatus().remove("mv"); + + if (this.roomUnit.getWalkTimeOut() < time && this.canWalk()) + { + this.roomUnit.setGoalLocation(this.room.getRandomWalkableTile()); + } + + if (this.task == PetTasks.NEST || this.task == PetTasks.DOWN) + { + if (this.levelHunger > 0) + this.levelHunger--; + + if (this.levelThirst > 0) + this.levelThirst--; + + this.addEnergy(5); + + this.addHappyness(1); + + if (this.energy == PetManager.maxEnergy(this.level)) + { + this.roomUnit.getStatus().remove("lay"); + this.roomUnit.setCanWalk(true); + this.roomUnit.setGoalLocation(this.room.getRandomWalkableTile()); + this.task = null; + this.roomUnit.getStatus().put("gst", PetGestures.ENERGY.getKey()); + this.gestureTickTimeout = time; + } + } + else if(this.tickTimeout >= 5) + { + if(this.levelHunger < 100) + this.levelHunger++; + + if(this.levelThirst < 100) + this.levelThirst++; + + if(this.energy < PetManager.maxEnergy(this.level)) + this.energy++; + + this.tickTimeout = time; + } + } + else + { + int timeout = Emulator.getRandom().nextInt(10) * 2; + this.roomUnit.setWalkTimeOut(timeout < 20 ? 20 + time : timeout + time); + + if(this.energy >= 2) + this.addEnergy(-1); + + if(this.levelHunger < 100) + this.levelHunger++; + + if(this.levelThirst < 100) + this.levelThirst++; + + if(this.happyness > 0 && time - this.happynessDelay >= 30) + { + this.happyness--; + this.happynessDelay = time; + } + } + + if(time - this.gestureTickTimeout > 15) + { + updateGesture(time); + } + else if(time - this.randomActionTickTimeout > 30) + { + this.randomAction(); + this.randomActionTickTimeout = time + (10 * Emulator.getRandom().nextInt(60)); + } + + if(!this.muted) + { + if (super.chatTimeout <= time) + { + if (this.energy <= 30) + { + super.say(this.petData.randomVocal(PetVocalsType.TIRED)); + if(this.energy <= 10) + this.findNest(); + } else if (this.happyness > 85) + { + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_HAPPY)); + } else if (this.happyness < 15) + { + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_SAD)); + } else if (this.levelHunger > 50) + { + super.say(this.petData.randomVocal(PetVocalsType.HUNGRY)); + this.eat(); + } else if (this.levelThirst > 50) + { + super.say(this.petData.randomVocal(PetVocalsType.THIRSTY)); + this.drink(); + } + + int timeOut = Emulator.getRandom().nextInt(30); + super.chatTimeout = time + (timeOut < 3 ? 30 : timeOut); + } + } + } + } + + public void handleCommand(PetCommand command, Habbo habbo) + { + this.idleCommandTicks = 0; + if(Emulator.getRandom().nextInt((this.level - command.level <= 0 ? 2 : this.level - command.level) + 2) == 0) + { + super.say(this.petData.randomVocal(PetVocalsType.DISOBEY)); + return; + } + + this.addEnergy(-command.energyCost); + this.addHappyness(-command.happynessCost); + + switch(command.id) + { + case 0: + { + freeCommand(); + } + break; + + case 1: + { + this.getRoomUnit().getStatus().put("sit", room.getStackHeight(this.getRoomUnit().getX(), this.getRoomUnit().getY(), false) - 0.50 + ""); + this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(this.getRoomUnit().getX(), this.getRoomUnit().getY())); + this.task = PetTasks.SIT; + this.packetUpdate = true; + + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 2: + { + if(this.task == PetTasks.DOWN) + return; + + this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(this.getRoomUnit().getX(), this.getRoomUnit().getY())); + this.getRoomUnit().getStatus().remove("mv"); + this.getRoomUnit().getStatus().remove("sit"); + this.getRoomUnit().getStatus().put("lay", room.getStackHeight(this.getRoomUnit().getX(), this.getRoomUnit().getY(), false) + ""); + this.task = PetTasks.DOWN; + this.packetUpdate = true; + + if(this.happyness > 50) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 3: + { + this.getRoomUnit().setGoalLocation(this.room.getLayout().getTileInFront(habbo.getRoomUnit().getCurrentLocation(), habbo.getRoomUnit().getBodyRotation().getValue())); + this.task = PetTasks.HERE; + this.roomUnit.setCanWalk(true); + + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 4: + { + clearPosture(); + if(this.task == PetTasks.BEG) + return; + + this.getRoomUnit().getStatus().put("beg", "0"); + this.task = PetTasks.BEG; + this.packetUpdate = true; + + if(this.happyness > 90) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 5: + { + clearPosture(); + if(this.task == PetTasks.PLAY_DEAD) + return; + + this.getRoomUnit().getStatus().remove("mv"); + this.getRoomUnit().getStatus().remove("lay"); + this.getRoomUnit().getStatus().remove("ded"); + this.getRoomUnit().getStatus().put("ded", room.getStackHeight(this.roomUnit.getX(), this.roomUnit.getY(), false) + ""); + this.task = PetTasks.PLAY_DEAD; + this.packetUpdate = true; + + if(this.happyness > 50) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 6: + { + clearPosture(); + if(this.task == PetTasks.STAY) + return; + + this.getRoomUnit().setCanWalk(false); + this.getRoomUnit().getStatus().remove("mv"); + this.getRoomUnit().getStatus().remove("lay"); + this.getRoomUnit().getStatus().remove("ded"); + this.task = PetTasks.STAY; + + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 7: + { + clearPosture(); + if(this.task == PetTasks.FOLLOW) + return; + + Emulator.getThreading().run(new PetFollowHabbo(this, habbo, 0)); + this.getRoomUnit().getStatus().remove("mv"); + this.getRoomUnit().getStatus().remove("lay"); + this.getRoomUnit().getStatus().remove("ded"); + this.task = PetTasks.FOLLOW; + + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + + } + break; + + case 8: + { + clearPosture(); + if(this.task == PetTasks.STAND) + return; + + this.task = PetTasks.STAND; + this.roomUnit.getStatus().remove("lay"); + this.getRoomUnit().getStatus().remove("mv"); + this.getRoomUnit().getStatus().remove("lay"); + this.getRoomUnit().getStatus().remove("ded"); + + if(this.happyness > 30) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 9: + { + clearPosture(); + if(this.task == PetTasks.JUMP) + return; + + this.roomUnit.getStatus().put("jmp", ""); + this.task = PetTasks.JUMP; + this.packetUpdate = true; + Emulator.getThreading().run(new PetClearPosture(this, "jmp", null, false), 2000); + + if(this.happyness > 60) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 10: + { + this.muted = false; + this.roomUnit.getStatus().put("spk", "0"); + Emulator.getThreading().run(new PetClearPosture(this, "spk", null, false), 2000); + + if(this.happyness > 70) + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_HAPPY)); + else if(this.happyness < 30) + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_SAD)); + else if(this.levelHunger > 65) + super.say(this.petData.randomVocal(PetVocalsType.HUNGRY)); + else if(this.levelThirst > 65) + super.say(this.petData.randomVocal(PetVocalsType.THIRSTY)); + else if(this.energy < 25) + super.say(this.petData.randomVocal(PetVocalsType.TIRED)); + else if(this.task == PetTasks.NEST || this.task == PetTasks.DOWN) + super.say(this.petData.randomVocal(PetVocalsType.SLEEPING)); + } + break; + + case 11: + { + //Play + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + { + super.say(this.petData.randomVocal(PetVocalsType.DISOBEY)); + } + } + break; + + case 12: + { + //Silent + this.muted = true; + this.roomUnit.getStatus().remove("spk"); + super.say(this.petData.randomVocal(PetVocalsType.MUTED)); + } + break; + + case 13: + { + //Nest + if(this.energy < 65) + { + this.findNest(); + + if (this.energy < 30) + super.say(this.petData.randomVocal(PetVocalsType.TIRED)); + } + else + { + super.say(this.petData.randomVocal(PetVocalsType.DISOBEY)); + } + } + break; + + case 14: + { + //Drink + if(this.levelThirst > 40) + { + this.drink(); + + if(this.levelThirst > 65) + super.say(this.petData.randomVocal(PetVocalsType.THIRSTY)); + } + else + { + super.say(this.petData.randomVocal(PetVocalsType.DISOBEY)); + } + + } + break; + + case 15: + { + //Follow left. + clearPosture(); + if(this.task == PetTasks.FOLLOW) + return; + + Emulator.getThreading().run(new PetFollowHabbo(this, habbo, - 2)); + this.task = PetTasks.FOLLOW; + + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 16: + { + //Follow right. + clearPosture(); + if(this.task == PetTasks.FOLLOW) + return; + + Emulator.getThreading().run(new PetFollowHabbo(this, habbo, + 2)); + this.task = PetTasks.FOLLOW; + + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 17: + { + //Play football + + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 18: + { + this.getRoomUnit().setGoalLocation(this.room.getLayout().getTileInFront(habbo.getRoomUnit().getCurrentLocation(), habbo.getRoomUnit().getBodyRotation().getValue())); + this.roomUnit.setCanWalk(true); + } + break; + + case 19: + { + //Bounce + } + break; + + case 20: + { + //Flat + //Same as down? + } + break; + + case 21: + { + //Dance + } + break; + + case 22: + { + //Spin -> Schildpad? + } + break; + + case 23: + { + //Switch TV -> Monkey? + } + break; + + case 24: + { + //Move forward: + this.getRoomUnit().setGoalLocation(this.room.getLayout().getTileInFront(this.roomUnit.getCurrentLocation(), this.roomUnit.getBodyRotation().getValue())); + this.roomUnit.setCanWalk(true); + + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 25: + { + this.getRoomUnit().setBodyRotation(RoomUserRotation.values()[(this.roomUnit.getBodyRotation().getValue() - 1 < 0 ? 7 : this.roomUnit.getBodyRotation().getValue() - 1)]); + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 26: + { + this.getRoomUnit().setBodyRotation(RoomUserRotation.values()[(this.roomUnit.getBodyRotation().getValue() + 1 > 7 ? 0 : this.roomUnit.getBodyRotation().getValue() + 1)]); + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + break; + + case 27: + { + //Relax + if(this.happyness > 75) + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_HAPPY)); + else if(this.happyness < 30) + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_SAD)); + else + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + + this.getRoomUnit().getStatus().put("rlx", "0"); + } + break; + + case 28: + { + //Croak + this.getRoomUnit().getStatus().put("crk", "0"); + + Emulator.getThreading().run(new PetClearPosture(this, "crk", null, false), 2000); + + if(this.happyness > 80) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + } + break; + + case 29: + { + //Dip + + if(this.roomUnit.isWalking()) + return; + + THashSet waterItems = room.getRoomSpecialTypes().getItemsOfType(InteractionWater.class); + + if (waterItems.isEmpty()) + return; + + HabboItem waterPatch = (HabboItem) waterItems.toArray()[Emulator.getRandom().nextInt(waterItems.size())]; + + this.roomUnit.setGoalLocation(this.room.getLayout().getTile(waterPatch.getX(), waterPatch.getY())); + } + break; + + case 30: + { + //WAV + if(this.happyness > 65) + { + this.getRoomUnit().getStatus().put("wav", "0"); + + Emulator.getThreading().run(new PetClearPosture(this, "wav", null, false), 2000); + } + } + break; + + case 31: + { + //Mambo! + } + break; + + case 32: + { + //High jump + } + break; + + case 33: + { + //Chicken dance + } + break; + + case 34: + { + //Triple jump + } + break; + + case 35: + { + //Spread wings + if(this.task == PetTasks.SPREAD_WINGS) + return; + + this.roomUnit.getStatus().put("wng", "0"); + Emulator.getThreading().run(new PetClearPosture(this, "wng", null, false), 2000); + + if(this.happyness > 50) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + } + break; + + case 36: + { + //Breathe fire + this.roomUnit.getStatus().put("flm", "0"); + Emulator.getThreading().run(new PetClearPosture(this, "fla", null, false), 1000); + + if(this.happyness > 50) + super.say(this.petData.randomVocal(PetVocalsType.PLAYFUL)); + } + break; + + case 37: + { + //Hang + } + break; + + case 38: + { + if(this.happyness < 30) + { + super.say(this.petData.randomVocal(PetVocalsType.DISOBEY)); + return; + } + + this.roomUnit.getStatus().put("eat", "0"); + Emulator.getThreading().run(new PetClearPosture(this, "eat", null, false), 500); + } + break; + + case 39: + { + //Not found O.o ? + } + break; + + case 40: + { + //Swing + } + break; + + case 41: + { + //Roll + } + break; + + case 42: + { + //Ring of fire + } + break; + + case 43: + { + //Eat + if(this.levelHunger > 40) + { + super.say(this.petData.randomVocal(PetVocalsType.HUNGRY)); + + this.roomUnit.getStatus().put("eat", "0"); + Emulator.getThreading().run(new PetClearPosture(this, "eat", null, false), 500); + this.eat(); + } + else + { + super.say(this.petData.randomVocal(PetVocalsType.DISOBEY)); + return; + } + } + break; + + case 44: + { + //Wag tail + } + break; + + case 45: + { + //Count + } + break; + + case 46: + { + InteractionPetBreedingNest nest = null; + for (HabboItem item : room.getRoomSpecialTypes().getItemsOfType(InteractionPetBreedingNest.class)) + { + if (item.getBaseItem().getName().contains(this.petData.getName())) + { + if (!((InteractionPetBreedingNest)item).boxFull()) + { + nest = (InteractionPetBreedingNest) item; + break; + } + } + } + + if (nest != null) + { + this.roomUnit.setGoalLocation(this.room.getLayout().getTile(nest.getX(), nest.getY())); + } + } + break; + } + + this.addExperience(command.xp); + } + + public boolean canWalk() + { + if(this.task == null) + return true; + + switch(this.task) + { + case DOWN: + case FLAT: + case HERE: + case SIT: + case BEG: + case PLAY: + case PLAY_FOOTBALL: + case PLAY_DEAD: + case FOLLOW: + case JUMP: + case STAND: + case NEST: + case RIDE: + + return false; + } + + return true; + } + + void clearPosture() + { + THashMap keys = new THashMap(); + + if(this.getRoomUnit().getStatus().containsKey("mv")) + keys.put("mv", this.getRoomUnit().getStatus().get("mv")); + + if(this.getRoomUnit().getStatus().containsKey("sit")) + keys.put("sit", this.getRoomUnit().getStatus().get("sit")); + + if(this.getRoomUnit().getStatus().containsKey("lay")) + keys.put("lay", this.getRoomUnit().getStatus().get("lay")); + + if(this.getRoomUnit().getStatus().containsKey("gst")) + keys.put("gst", this.getRoomUnit().getStatus().get("gst")); + + if(this.task == null) + { + this.getRoomUnit().getStatus().clear(); + this.getRoomUnit().getStatus().putAll(keys); + } + + this.packetUpdate = true; + } + + public void updateGesture(int time) + { + this.gestureTickTimeout = time; + if (this.getEnergy() < 30) + { + this.roomUnit.getStatus().put("gst", PetGestures.TIRED.getKey()); + this.findNest(); + } + else if(this.getHappyness() == 100) + { + this.roomUnit.getStatus().put("gst", PetGestures.LOVE.getKey()); + } else if (this.happyness >= 90) + { + this.randomHappyAction(); + this.roomUnit.getStatus().put("gst", PetGestures.HAPPY.getKey()); + } else if (this.happyness <= 5) + { + this.randomSadAction(); + this.roomUnit.getStatus().put("gst", PetGestures.SAD.getKey()); + } else if (this.levelHunger > 80) + { + this.roomUnit.getStatus().put("gst", PetGestures.HUNGRY.getKey()); + this.eat(); + } else if (this.levelThirst > 80) + { + this.roomUnit.getStatus().put("gst", PetGestures.THIRSTY.getKey()); + this.drink(); + } + else if(this.idleCommandTicks > 240) + { + this.idleCommandTicks = 0; + + this.roomUnit.getStatus().put("gst", PetGestures.QUESTION.getKey()); + } + } + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.getId()); + message.appendString(this.getName()); + message.appendInt(this.petData.getType()); + message.appendInt(this.race); + message.appendString(this.color); + message.appendInt(0); + message.appendInt(0); + message.appendInt(0); + } + + public void findNest() + { + HabboItem item = this.petData.randomNest(this.room.getRoomSpecialTypes().getNests()); + this.roomUnit.setCanWalk(true); + if(item != null) + { + this.roomUnit.setGoalLocation(this.room.getLayout().getTile(item.getX(), item.getY())); + } + else + { + this.roomUnit.getStatus().put("lay", this.room.getStackHeight(this.roomUnit.getX(), this.roomUnit.getY(), false) + ""); + super.say(this.petData.randomVocal(PetVocalsType.SLEEPING)); + this.task = PetTasks.DOWN; + } + } + + public void drink() + { + HabboItem item = this.petData.randomDrinkItem(this.room.getRoomSpecialTypes().getPetDrinks()); + if(item != null) + { + this.roomUnit.setCanWalk(true); + this.roomUnit.setGoalLocation(this.room.getLayout().getTile(item.getX(), item.getY())); + } + } + + public void eat() + { + HabboItem item = this.petData.randomFoodItem(this.room.getRoomSpecialTypes().getPetFoods()); + { + if(item != null) + { + this.roomUnit.setCanWalk(true); + this.roomUnit.setGoalLocation(this.room.getLayout().getTile(item.getX(), item.getY())); + } + } + } + + public void findToy() + { + HabboItem item = this.petData.randomToyItem(this.room.getRoomSpecialTypes().getPetToys()); + { + if(item != null) + { + this.roomUnit.setCanWalk(true); + this.roomUnit.setGoalLocation(this.room.getLayout().getTile(item.getX(), item.getY())); + } + } + } + + public void randomHappyAction() + { + this.roomUnit.getStatus().put(this.petData.actionsHappy[Emulator.getRandom().nextInt(this.petData.actionsHappy.length)], ""); + } + + public void randomSadAction() + { + this.roomUnit.getStatus().put(this.petData.actionsTired[Emulator.getRandom().nextInt(this.petData.actionsTired.length)], ""); + } + + public void randomAction() + { + this.roomUnit.getStatus().put(this.petData.actionsRandom[Emulator.getRandom().nextInt(this.petData.actionsRandom.length)], ""); + } + + @Override + public synchronized void addExperience(int amount) + { + this.experience += amount; + + if(this.room != null) + { + this.room.sendComposer(new RoomPetExperienceComposer(this, amount).compose()); + + if(this.experience >= PetManager.experiences[this.level - 1]) + { + this.levelUp(); + } + } + } + + protected void levelUp() + { + this.level++; + super.say(this.petData.randomVocal(PetVocalsType.LEVEL_UP)); + this.addHappyness(100); + this.getRoomUnit().getStatus().put("gst", "exp"); + this.gestureTickTimeout = Emulator.getIntUnixTimestamp(); + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.userId), Emulator.getGameEnvironment().getAchievementManager().getAchievement("PetLevelUp")); + } + + public synchronized void addThirst(int amount) + { + this.levelThirst += amount; + + if(this.levelThirst > 100) + this.levelThirst = 100; + + if(this.levelThirst < 0) + this.levelThirst = 0; + } + + public synchronized void addHunger(int amount) + { + this.levelHunger += amount; + + if(this.levelHunger > 100) + this.levelHunger = 100; + + if(this.levelHunger < 0) + this.levelHunger = 0; + } + + public PetTasks getTask() + { + return this.task; + } + + public void setTask(PetTasks newTask) + { + this.task = newTask; + } + + public void freeCommand() + { + this.task = null; + this.roomUnit.getStatus().clear(); + this.roomUnit.setCanWalk(true); + super.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); + } + + public void scratched(Habbo habbo) + { + this.addExperience(10); + this.addRespect(); + + if (habbo != null) + { + habbo.getHabboStats().petRespectPointsToGive--; + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomPetRespectComposer(this).compose()); + + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("PetRespectGiver")); + } + + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("PetRespectReceiver")); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetBreedingReward.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetBreedingReward.java new file mode 100644 index 00000000..a0d8b2f9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetBreedingReward.java @@ -0,0 +1,18 @@ +package com.eu.habbo.habbohotel.pets; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PetBreedingReward +{ + public final int petType; + public final int rarityLevel; + public final int breed; + + public PetBreedingReward(ResultSet set) throws SQLException + { + this.petType = set.getInt("pet_type"); + this.rarityLevel = set.getInt("rarity_level"); + this.breed = set.getInt("breed"); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java new file mode 100644 index 00000000..901246c1 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java @@ -0,0 +1,30 @@ +package com.eu.habbo.habbohotel.pets; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PetCommand implements Comparable +{ + public final int id; + public final String key; + public final int level; + public final int xp; + public final int energyCost; + public final int happynessCost; + + public PetCommand(ResultSet set) throws SQLException + { + this.id = set.getInt("command_id"); + this.key = set.getString("text"); + this.level = set.getInt("required_level"); + this.xp = set.getInt("reward_xp"); + this.energyCost = set.getInt("cost_energy"); + this.happynessCost = set.getInt("cost_happyness"); + } + + @Override + public int compareTo(PetCommand o) + { + return this.level - o.level; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java new file mode 100644 index 00000000..3d29c935 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java @@ -0,0 +1,294 @@ +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionNest; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetDrink; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetToy; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PetData implements Comparable +{ + private int type; + private String name; + + public static final String BLINK = "eyb"; + public static final String SPEAK = "spk"; + public static final String EAT = "eat"; + public static final String PLAYFUL = "pla"; + + public String[] actionsHappy; + public String[] actionsTired; + public String[] actionsRandom; + + private List petCommands; + + private List nestItems; + private List foodItems; + private List drinkItems; + private List toyItems; + + public static final List generalDrinkItems = new ArrayList(); + public static final List generalFoodItems = new ArrayList(); + public static final List generalNestItems = new ArrayList(); + public static final List generalToyItems = new ArrayList(); + + public THashMap> petVocals; + public static final THashMap> generalPetVocals = new THashMap>(); + + public PetData(ResultSet set) throws SQLException + { + this.type = set.getInt("pet_type"); + this.name = set.getString("pet_name"); + this.actionsHappy = set.getString("happy_actions").split(";"); + this.actionsTired = set.getString("tired_actions").split(";"); + this.actionsRandom = set.getString("random_actions").split(";"); + + this.petCommands = new ArrayList(); + this.nestItems = new ArrayList(); + this.foodItems = new ArrayList(); + this.drinkItems = new ArrayList(); + this.toyItems = new ArrayList(); + + this.petVocals = new THashMap>(); + + for(PetVocalsType type : PetVocalsType.values()) + { + this.petVocals.put(type, new THashSet()); + } + + if(PetData.generalPetVocals.isEmpty()) + { + for(PetVocalsType type : PetVocalsType.values()) + { + PetData.generalPetVocals.put(type, new THashSet()); + } + } + } + + public void setPetCommands(List petCommands) + { + this.petCommands = petCommands; + } + + public List getPetCommands() + { + return this.petCommands; + } + + public int getType() + { + return this.type; + } + + public String getName() + { + return this.name; + } + + public void addNest(Item item) + { + if(item != null) + this.nestItems.add(item); + } + + public List getNests() + { + return this.nestItems; + } + + public boolean haveNest(HabboItem item) + { + return this.haveNest(item.getBaseItem()); + } + + boolean haveNest(Item item) + { + return PetData.generalNestItems.contains(item) || this.nestItems.contains(item); + } + + public HabboItem randomNest(THashSet items) + { + List nestList = new ArrayList(); + + for(InteractionNest nest : items) + { + if(this.haveNest(nest)) + { + nestList.add(nest); + } + } + + if(!nestList.isEmpty()) + { + Collections.shuffle(nestList); + + return nestList.get(0); + } + + return null; + } + + public void addFoodItem(Item item) + { + this.foodItems.add(item); + } + + public List getFoodItems() + { + return this.foodItems; + } + + public boolean haveFoodItem(HabboItem item) + { + return this.haveFoodItem(item.getBaseItem()); + } + + boolean haveFoodItem(Item item) + { + return this.foodItems.contains(item) || PetData.generalFoodItems.contains(item); + } + + public HabboItem randomFoodItem(THashSet items) + { + List foodList = new ArrayList(); + + for(InteractionPetFood food : items) + { + if(this.haveFoodItem(food)) + { + foodList.add(food); + } + } + + if(!foodList.isEmpty()) + { + Collections.shuffle(foodList); + return foodList.get(0); + } + + return null; + } + + public void addDrinkItem(Item item) + { + this.drinkItems.add(item); + } + + public List getDrinkItems() + { + return this.drinkItems; + } + + public boolean haveDrinkItem(HabboItem item) + { + return this.haveDrinkItem(item.getBaseItem()); + } + + boolean haveDrinkItem(Item item) + { + return this.drinkItems.contains(item) || PetData.generalDrinkItems.contains(item); + } + + public HabboItem randomDrinkItem(THashSet items) + { + List drinkList = new ArrayList(); + + for(InteractionPetDrink drink : items) + { + if(this.haveDrinkItem(drink)) + { + drinkList.add(drink); + } + } + + if(!drinkList.isEmpty()) + { + Collections.shuffle(drinkList); + return drinkList.get(0); + } + + return null; + } + + public void addToyItem(Item item) + { + this.toyItems.add(item); + } + + public List getToyItems() + { + return this.toyItems; + } + + public boolean haveToyItem(HabboItem item) + { + return this.haveToyItem(item.getBaseItem()); + } + + public boolean haveToyItem(Item item) + { + return this.toyItems.contains(item) || PetData.generalToyItems.contains(item); + } + + public HabboItem randomToyItem(THashSet items) + { + List toyList = new ArrayList(); + + for(InteractionPetToy toy : items) + { + if(this.haveToyItem(toy)) + { + toyList.add(toy); + } + } + + if(!toyList.isEmpty()) + { + Collections.shuffle(toyList); + return toyList.get(0); + } + + return null; + } + + public PetVocal randomVocal(PetVocalsType type) + { + //TODO: Remove this useless copying. + List vocals = new ArrayList(); + + if(this.petVocals.get(type) != null) + vocals.addAll(this.petVocals.get(type)); + + if(PetData.generalPetVocals.get(type) != null) + vocals.addAll(PetData.generalPetVocals.get(type)); + + if(vocals.isEmpty() || vocals.size() == 0) + return null; + + return vocals.get(Emulator.getRandom().nextInt(vocals.size())); + } + + public void update(ResultSet set) throws SQLException + { + this.type = set.getInt("pet_type"); + this.actionsHappy = set.getString("happy_actions").split(";"); + this.actionsTired = set.getString("tired_actions").split(";"); + this.actionsRandom = set.getString("random_actions").split(";"); + } + + @Override + public int compareTo(PetData o) + { + return this.getType() - o.getType(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetGestures.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetGestures.java new file mode 100644 index 00000000..60e801be --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetGestures.java @@ -0,0 +1,28 @@ +package com.eu.habbo.habbohotel.pets; + +public enum PetGestures +{ + THIRSTY("thr"), + TIRED("trd"), + PLAYFULL("plf"), + HUNGRY("hng"), + SAD("sad"), + HAPPY("sml"), + QUESTION("que"), + LVLUP("exp"), + LOVE("lov"), + WARNING("und"), + ENERGY("nrg"); + + private final String key; + + PetGestures(String key) + { + this.key = key; + } + + public String getKey() + { + return this.key; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java new file mode 100644 index 00000000..84516ec8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java @@ -0,0 +1,545 @@ +package com.eu.habbo.habbohotel.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionNest; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetDrink; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetToy; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.TIntIntMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.set.hash.THashSet; +import javafx.util.Pair; +import org.apache.commons.math.distribution.ExponentialDistribution; + +import java.sql.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + +public class PetManager +{ + public static final int[] experiences = new int[]{ 100, 200, 400, 600, 900, 1300, 1800, 2400, 3200, 4300, 5700, 7600, 10100, 13300, 17500, 23000, 30200, 39600, 51900}; + + private final THashMap> petRaces; + private final THashMap petData; + private final TIntIntMap breedingPetType; + private final THashMap>> breedingReward; + + public PetManager() + { + long millis = System.currentTimeMillis(); + + this.petRaces = new THashMap>(); + this.petData = new THashMap(); + this.breedingPetType = new TIntIntHashMap(); + this.breedingReward = new THashMap>>(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + this.loadRaces(connection); + this.loadPetData(connection); + this.loadPetCommands(connection); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + Emulator.getLogging().logErrorLine("Pet Manager -> Failed to load!"); + return; + } + + Emulator.getLogging().logStart("Pet Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void reloadPetData() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM pet_actions ORDER BY pet_type ASC")) + { + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + PetData petData = this.petData.get(set.getInt("pet_type")); + + if (petData != null) + { + petData.update(set); + } + else + { + this.petData.put(set.getInt("pet_type"), new PetData(set)); + } + } + } + } + + PetData.generalNestItems.clear(); + PetData.generalFoodItems.clear(); + PetData.generalDrinkItems.clear(); + + for(PetData data : this.petData.values()) + { + data.getDrinkItems().clear(); + data.getFoodItems().clear(); + data.getToyItems().clear(); + data.getNests().clear(); + data.petVocals.clear(); + } + + this.loadPetItems(connection); + + this.loadPetVocals(connection); + + this.loadRaces(connection); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private void loadRaces(Connection connection) throws SQLException + { + this.petRaces.clear(); + + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_breeds ORDER BY race, color_one, color_two ASC")) + { + while(set.next()) + { + if(this.petRaces.get(set.getInt("race")) == null) + this.petRaces.put(set.getInt("race"), new THashSet()); + + this.petRaces.get(set.getInt("race")).add(new PetRace(set)); + } + } + } + + private void loadPetData(Connection connection) throws SQLException + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_actions ORDER BY pet_type ASC")) + { + while(set.next()) + { + this.petData.put(set.getInt("pet_type"), new PetData(set)); + } + } + + this.loadPetItems(connection); + + this.loadPetVocals(connection); + } + + private void loadPetItems(Connection connection) throws SQLException + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_items")) + { + while(set.next()) + { + Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem(set.getInt("item_id")); + + if(baseItem != null) + { + if(set.getInt("pet_id") == 0) + { + if(baseItem.getInteractionType().getType() == InteractionNest.class) PetData.generalNestItems.add(baseItem); + else if(baseItem.getInteractionType().getType() == InteractionPetFood.class) PetData.generalFoodItems.add(baseItem); + else if(baseItem.getInteractionType().getType() == InteractionPetDrink.class) PetData.generalDrinkItems.add(baseItem); + else if(baseItem.getInteractionType().getType() == InteractionPetToy.class) PetData.generalToyItems.add(baseItem); + } + else + { + PetData data = this.getPetData(set.getInt("pet_id")); + + if(data != null) + { + if(baseItem.getInteractionType().getType() == InteractionNest.class) data.addNest(baseItem); + else if(baseItem.getInteractionType().getType() == InteractionPetFood.class) data.addFoodItem(baseItem); + else if(baseItem.getInteractionType().getType() == InteractionPetDrink.class) data.addDrinkItem(baseItem); + else if(baseItem.getInteractionType().getType() == InteractionPetToy.class) data.addToyItem(baseItem); + } + } + } + } + } + } + + private void loadPetVocals(Connection connection) throws SQLException + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_vocals")) + { + while(set.next()) + { + if(set.getInt("pet_id") > 0) + { + this.petData.get(set.getInt("pet_id")).petVocals.get(PetVocalsType.valueOf(set.getString("type").toUpperCase())).add(new PetVocal(set.getString("message"))); + } + else + { + if(!PetData.generalPetVocals.containsKey(PetVocalsType.valueOf(set.getString("type").toUpperCase()))) + PetData.generalPetVocals.put(PetVocalsType.valueOf(set.getString("type").toUpperCase()), new THashSet()); + + PetData.generalPetVocals.get(PetVocalsType.valueOf(set.getString("type").toUpperCase())).add(new PetVocal(set.getString("message"))); + } + } + } + } + + private void loadPetCommands(Connection connection) throws SQLException + { + THashMap commandsList = new THashMap(); + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_commands_data")) + { + while(set.next()) + { + commandsList.put(set.getInt("command_id"), new PetCommand(set)); + } + } + + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_commands ORDER BY pet_id ASC")) + { + while(set.next()) + { + PetData data = this.petData.get(set.getInt("pet_id")); + + if(data != null) + { + data.getPetCommands().add(commandsList.get(set.getInt("command_id"))); + } + } + } + } + + private void loadPetBreeding(Connection connection) throws SQLException + { + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_breeding")) + { + while (set.next()) + { + this.breedingPetType.put(set.getInt("pet_id"), set.getInt("offspring_id")); + } + } + + try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM pet_breeding_races")) + { + while (set.next()) + { + PetBreedingReward reward = new PetBreedingReward(set); + if (!this.breedingReward.containsKey(reward.petType)) + { + this.breedingReward.put(reward.petType, new TIntObjectHashMap>()); + } + + if (!this.breedingReward.get(reward.petType).containsKey(reward.rarityLevel)) + { + this.breedingReward.get(reward.petType).put(reward.rarityLevel, new ArrayList()); + } + + this.breedingReward.get(reward.petType).get(reward.rarityLevel).add(reward); + } + } + } + + public THashSet getBreeds(String petName) + { + if(!petName.startsWith("a0 pet")) + { + Emulator.getLogging().logErrorLine("Pet " + petName + " not found. Make sure it matches the pattern \"a0 pet\"!"); + return null; + } + + try + { + int petId = Integer.valueOf(petName.split("t")[1]); + return this.petRaces.get(petId); + } + catch (Exception e) + { + e.printStackTrace(); + } + + return null; + } + + public static int getLevel(int experience) + { + int index = 0; + + for(int i = 0; i < experiences.length; i++) + { + if(experiences[i] > experience) + { + index = i; + break; + } + } + + return index + 1; + } + + public static int maxEnergy(int level) + { + //TODO: Add energy calculation. + return 100 * level; + } + + public PetData getPetData(int type) + { + synchronized (this.petData) + { + if (this.petData.containsKey(type)) + { + return this.petData.get(type); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + Emulator.getLogging().logErrorLine("Missing petdata for type " + type + ". Adding this to the database..."); + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO pet_actions (pet_type) VALUES (?)")) + { + statement.setInt(1, type); + statement.execute(); + } + + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM pet_actions WHERE pet_type = ? LIMIT 1")) + { + statement.setInt(1, type); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + PetData petData = new PetData(set); + this.petData.put(type, petData); + Emulator.getLogging().logErrorLine("Missing petdata for type " + type + " added to the database!"); + return petData; + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + return null; + } + + public PetData getPetData(String petName) + { + synchronized (this.petData) + { + for (Map.Entry entry : this.petData.entrySet()) + { + if (entry.getValue().getName().equalsIgnoreCase(petName)) + { + return entry.getValue(); + } + } + } + + return null; + } + + public Collection getPetData() + { + return this.petData.values(); + } + + public Pet createPet(Item item, String name, String race, String color, GameClient client) + { + int type = Integer.valueOf(item.getName().toLowerCase().replace("a0 pet", "")); + + Pet pet; + if(type == 15) + pet = new HorsePet(type, Integer.valueOf(race), color, name, client.getHabbo().getHabboInfo().getId()); + else if(type == 16) + pet = createMonsterplant(null, client.getHabbo(), false, null); + else + pet = new Pet(type, + Integer.valueOf(race), + color, + name, + client.getHabbo().getHabboInfo().getId() + ); + + pet.needsUpdate = true; + pet.run(); + return pet; + } + + public Pet createPet(int type, String name, GameClient client) + { + Pet pet = new Pet(type, Emulator.getRandom().nextInt(this.petRaces.get(type).size() + 1), "FFFFFF", name, client.getHabbo().getHabboInfo().getId()); + pet.needsUpdate = true; + pet.run(); + return pet; + } + + public MonsterplantPet createMonsterplant(Room room, Habbo habbo, boolean rare, RoomTile t) + { + MonsterplantPet pet = new MonsterplantPet( + habbo.getHabboInfo().getId(), //Owner ID + randomBody(rare ? 4 : 0), // Type + randomColor(rare ? 4 : 0), // Color + Emulator.getRandom().nextInt(12) + 1, // Mouth + Emulator.getRandom().nextInt(11), // Mouthcolor + Emulator.getRandom().nextInt(12) + 1, // Nose + Emulator.getRandom().nextInt(11), // NoseColor + Emulator.getRandom().nextInt(12) + 1, // Eyes + Emulator.getRandom().nextInt(11) // EyesColor + ); + + pet.setUserId(habbo.getHabboInfo().getId()); + pet.setRoom(room); + pet.setRoomUnit(new RoomUnit()); + pet.getRoomUnit().setPathFinderRoom(room); + pet.needsUpdate = true; + pet.run(); + return pet; + } + + public Pet createGnome(String name, Room room, Habbo habbo) + { + Pet pet = new GnomePet(26, 0, "FFFFFF", name, habbo.getHabboInfo().getId(), + "5 " + + "0 -1 " + randomGnomeSkinColor() + " " + + "1 10" + (1 + Emulator.getRandom().nextInt(2)) + " " + randomGnomeColor() + " " + + "2 201 " + randomGnomeColor() + " " + + "3 30" + (1 + Emulator.getRandom().nextInt(2)) + " " + randomGnomeColor() + " " + + "4 40" + Emulator.getRandom().nextInt(2) + " " + randomGnomeColor() + ); + + pet.setUserId(habbo.getHabboInfo().getId()); + pet.setRoom(room); + pet.setRoomUnit(new RoomUnit()); + pet.getRoomUnit().setPathFinderRoom(room); + pet.needsUpdate = true; + pet.run(); + + return pet; + } + + public Pet createLeprechaun(String name, Room room, Habbo habbo) + { + Pet pet = new GnomePet(27, 0, "FFFFFF", name, habbo.getHabboInfo().getId(), + "5 " + + "0 -1 0 " + + "1 102 19 " + + "2 201 27 " + + "3 302 23 " + + "4 401 27" + ); + + pet.setUserId(habbo.getHabboInfo().getId()); + pet.setRoom(room); + pet.setRoomUnit(new RoomUnit()); + pet.getRoomUnit().setPathFinderRoom(room); + pet.needsUpdate = true; + pet.run(); + + return pet; + } + + private int randomGnomeColor() + { + int color = 19; + + while (color == 19 || color == 27) + { + color = Emulator.getRandom().nextInt(34); + } + + return color; + } + + private int randomLeprechaunColor() + { + return Emulator.getRandom().nextInt(2) == 1 ? 19 : 27; + } + + static int[] skins = new int[]{0, 1, 6, 7}; + private int randomGnomeSkinColor() + { + return skins[Emulator.getRandom().nextInt(skins.length)]; + } + + public static int randomBody(int minimumRarity) + { + //int rarity = MonsterplantPet.indexedBody.get(random(0, MonsterplantPet.bodyRarity.size(), 2.0)).getValue(); + + int rarity = -1; + Integer bodyType = 0; + while (rarity < minimumRarity) + { + bodyType = (Integer) MonsterplantPet.bodyRarity.keySet().toArray()[random(0, MonsterplantPet.bodyRarity.size(), 2.0)]; + rarity = MonsterplantPet.bodyRarity.get(bodyType).getValue(); + } + + return bodyType; + } + + public static int randomColor(int minimumRarity) + { + int rarity = -1; + Integer colorType = 0; + while (rarity < minimumRarity) + { + colorType = (Integer) MonsterplantPet.colorRarity.keySet().toArray()[random(0, MonsterplantPet.colorRarity.size(), 2.0)]; + rarity = MonsterplantPet.colorRarity.get(colorType).getValue(); + } + + return colorType; + } + + public static int random(int low, int high, double bias) + { + double r = Math.random(); // random between 0 and 1 + r = Math.pow(r, bias); + return (int) (low + (high - low) * r); + } + + public static Pet loadPet(ResultSet set) throws SQLException + { + if(set.getInt("type") == 15) + return new HorsePet(set); + else if(set.getInt("type") == 16) + return new MonsterplantPet(set); + else if (set.getInt("type") == 26 || set.getInt("type") == 27) + return new GnomePet(set); + else + return new Pet(set); + } + + /** + * Deletes a pet from the database. + * @param pet The pet to delete. + * @return true if the pet has been deleted. + */ + public boolean deletePet(AbstractPet pet) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM users_pets WHERE id = ? LIMIT 1")) + { + statement.setInt(1, pet.getId()); + return statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetRace.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetRace.java new file mode 100644 index 00000000..296edf17 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetRace.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.pets; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PetRace +{ + public final int race; + public final int colorOne; + public final int colorTwo; + public final boolean hasColorOne; + public final boolean hasColorTwo; + + public PetRace(ResultSet set) throws SQLException + { + this.race = set.getInt("race"); + this.colorOne = set.getInt("color_one"); + this.colorTwo = set.getInt("color_two"); + this.hasColorOne = set.getString("has_color_one").equals("1"); + this.hasColorTwo = set.getString("has_color_two").equals("1"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetTasks.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetTasks.java new file mode 100644 index 00000000..2ab45cb9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetTasks.java @@ -0,0 +1,65 @@ +package com.eu.habbo.habbohotel.pets; + +public enum PetTasks +{ + NONE(""), + FREE(""), + SIT("sit"), + DOWN("lay"), + HERE(""), + BEG("beg"), + PLAY_DEAD("ded"), + STAY(""), + FOLLOW(""), + STAND(""), + JUMP("jmp"), + SPEAK("spk"), + PLAY(""), + SILENT(""), + NEST(""), + DRINK(""), + FOLLOW_LEFT(""), + FOLLOW_RIGHT(""), + PLAY_FOOTBALL(""), + COME_HERE(""), + BOUNCE(""), + FLAT(""), + DANCE(""), + SPIN(""), + SWITCH_TV(""), + MOVE_FORWARD(""), + TURN_LEFT(""), + TURN_RIGHT(""), + RELAX(""), + CROAK(""), + DIP(""), + WAVE(""), + MAMBO(""), + HIGH_JUMP(""), + CHICKEN_DANCE(""), + TRIPLE_JUMP(""), + SPREAD_WINGS(""), + BREATHE_FIRE(""), + HANG(""), + TORCH(""), + SWING(""), + ROLL(""), + RING_OF_FIRE(""), + EAT("eat"), + WAG_TAIL(""), + COUNT(""), + BREED(""), + RIDE(""); + + private final String status; + + PetTasks(String status) + { + this.status = status; + } + + public String getStatus() + { + return this.status; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetVocal.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetVocal.java new file mode 100644 index 00000000..c50f0fd6 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetVocal.java @@ -0,0 +1,11 @@ +package com.eu.habbo.habbohotel.pets; + +public class PetVocal +{ + public final String message; + + public PetVocal(String message) + { + this.message = message; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetVocalsType.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetVocalsType.java new file mode 100644 index 00000000..2ad687da --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetVocalsType.java @@ -0,0 +1,20 @@ +package com.eu.habbo.habbohotel.pets; + +public enum PetVocalsType +{ + DISOBEY, + DRINKING, + EATING, + GENERIC_HAPPY, + GENERIC_NEUTRAL, + GENERIC_SAD, + GREET_OWNER, + HUNGRY, + LEVEL_UP, + MUTED, + PLAYFUL, + SLEEPING, + THIRSTY, + TIRED, + UNKNOWN_COMMAND +} diff --git a/src/main/java/com/eu/habbo/habbohotel/polls/Poll.java b/src/main/java/com/eu/habbo/habbohotel/polls/Poll.java new file mode 100644 index 00000000..c06f32eb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/polls/Poll.java @@ -0,0 +1,73 @@ +package com.eu.habbo.habbohotel.polls; + +import gnu.trove.map.hash.THashMap; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; + +public class Poll +{ + private int id; + private String title; + private String thanksMessage; + private String badgeReward; + public int lastQuestionId; + + private ArrayList questions; + + public Poll(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.title = set.getString("title"); + this.thanksMessage = set.getString("thanks_message"); + this.badgeReward = set.getString("reward_badge"); + this.questions = new ArrayList(); + } + + public int getId() + { + return this.id; + } + + public String getTitle() + { + return this.title; + } + + public String getThanksMessage() + { + return this.thanksMessage; + } + + public String getBadgeReward() + { + return this.badgeReward; + } + + public ArrayList getQuestions() + { + return this.questions; + } + + public PollQuestion getQuestion(int id) + { + for (PollQuestion q : this.questions) + { + if (q.getId() == id) + { + return q; + } + } + + return null; + } + + public void addQuestion(PollQuestion question) + { + this.questions.add(question); + + Collections.sort(this.questions); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/polls/PollManager.java b/src/main/java/com/eu/habbo/habbohotel/polls/PollManager.java new file mode 100644 index 00000000..0964923b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/polls/PollManager.java @@ -0,0 +1,98 @@ +package com.eu.habbo.habbohotel.polls; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.map.hash.THashMap; + +import java.sql.*; + +public class PollManager +{ + private final THashMap activePolls = new THashMap(); + + public PollManager() + { + this.loadPolls(); + } + + public void loadPolls() + { + synchronized (this.activePolls) + { + this.activePolls.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (Statement statement = connection.createStatement()) + { + try (ResultSet set = statement.executeQuery("SELECT * FROM polls")) + { + while (set.next()) + { + this.activePolls.put(set.getInt("id"), new Poll(set)); + } + } + + try (ResultSet set = statement.executeQuery("SELECT * FROM polls_questions ORDER BY parent_id, `order` ASC")) + { + while (set.next()) + { + Poll poll = this.getPoll(set.getInt("poll_id")); + + if (poll != null) + { + PollQuestion question = new PollQuestion(set); + + if (set.getInt("parent_id") <= 0) + { + poll.addQuestion(question); + } + else + { + PollQuestion parentQuestion = poll.getQuestion(set.getInt("parent_id")); + + if (parentQuestion != null) + { + parentQuestion.addSubQuestion(question); + } + } + + poll.lastQuestionId = question.getId(); + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public Poll getPoll(int pollId) + { + return this.activePolls.get(pollId); + } + + public static boolean donePoll(Habbo habbo, int pollId) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT NULL FROM polls_answers WHERE poll_id = ? AND user_id = ? LIMIT 1")) + { + statement.setInt(1, pollId); + statement.setInt(2, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + return true; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/polls/PollQuestion.java b/src/main/java/com/eu/habbo/habbohotel/polls/PollQuestion.java new file mode 100644 index 00000000..8dcbb42e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/polls/PollQuestion.java @@ -0,0 +1,112 @@ +package com.eu.habbo.habbohotel.polls; + +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import gnu.trove.map.hash.THashMap; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +public class PollQuestion implements ISerialize, Comparable +{ + private int id; + private int parentId; + private int type; + private String question; + private THashMap options; + private ArrayList subQuestions; + private int minSelections; + private int order; + + public PollQuestion(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.parentId = set.getInt("parent_id"); + this.type = set.getInt("type"); + this.question = set.getString("question"); + this.minSelections = set.getInt("min_selections"); + this.order = set.getInt("order"); + + this.options = new THashMap(); + this.subQuestions = new ArrayList(); + + String opts = set.getString("options"); + + if(this.type == 1 || this.type == 2) + { + for (int i = 0; i < opts.split(";").length; i++) + { + this.options.put(i, new String[]{opts.split(";")[i].split(":")[0], opts.split(";")[i].split(":")[1]}); + } + } + } + + public int getId() + { + return this.id; + } + + public int getType() + { + return this.type; + } + + public String getQuestion() + { + return this.question; + } + + public THashMap getOptions() + { + return this.options; + } + + public int getMinSelections() + { + return this.minSelections; + } + + public void addSubQuestion(PollQuestion pollQuestion) + { + this.subQuestions.add(pollQuestion); + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.id); + message.appendInt(this.order); + message.appendInt(this.type); + message.appendString(this.question); + message.appendInt(this.minSelections); + message.appendInt(0); + message.appendInt(this.options.size()); + + if (this.type == 1 || this.type == 2) + { + for (Map.Entry set : this.options.entrySet()) + { + message.appendString(set.getValue()[0]); + message.appendString(set.getValue()[1]); + message.appendInt(set.getKey()); + } + } + + if (this.parentId <= 0) + { + Collections.sort(this.subQuestions); + message.appendInt(this.subQuestions.size()); + + for (PollQuestion q : this.subQuestions) + { + q.serialize(message); + } + } + } + + @Override + public int compareTo(PollQuestion o) + { + return this.order - o.order; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/CustomRoomLayout.java b/src/main/java/com/eu/habbo/habbohotel/rooms/CustomRoomLayout.java new file mode 100644 index 00000000..44452c3a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/CustomRoomLayout.java @@ -0,0 +1,54 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CustomRoomLayout extends RoomLayout implements Runnable +{ + private boolean needsUpdate; + private Room room; + + public CustomRoomLayout(ResultSet set, Room room) throws SQLException + { + super(set, room); + + this.room = room; + } + + @Override + public void run() + { + if(this.needsUpdate) + { + this.needsUpdate = false; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE room_models_custom SET door_x = ?, door_y = ?, door_dir = ?, heightmap = ? WHERE id = ? LIMIT 1")) + { + statement.setInt(1, this.getDoorX()); + statement.setInt(2, this.getDoorY()); + statement.setInt(3, this.getDoorDirection()); + statement.setString(4, this.getHeightmap()); + statement.setInt(5, this.room.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public boolean needsUpdate() + { + return this.needsUpdate; + } + + public void needsUpdate(boolean needsUpdate) + { + this.needsUpdate = needsUpdate; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java new file mode 100644 index 00000000..b9f443f8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -0,0 +1,5103 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.bots.VisitorBot; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.ICycleable; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameGate; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameScoreboard; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiSphere; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiTeleporter; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; +import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.pets.*; +import com.eu.habbo.habbohotel.users.*; +import com.eu.habbo.habbohotel.wired.*; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericErrorMessagesComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewComposer; +import com.eu.habbo.messages.outgoing.inventory.*; +import com.eu.habbo.messages.outgoing.polls.infobus.SimplePollAnswerComposer; +import com.eu.habbo.messages.outgoing.polls.infobus.SimplePollStartComposer; +import com.eu.habbo.messages.outgoing.rooms.*; +import com.eu.habbo.messages.outgoing.rooms.items.*; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetComposer; +import com.eu.habbo.messages.outgoing.rooms.users.*; +import com.eu.habbo.messages.outgoing.users.MutedWhisperComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.furniture.FurniturePickedUpEvent; +import com.eu.habbo.plugin.events.furniture.FurnitureRolledEvent; +import com.eu.habbo.plugin.events.rooms.RoomLoadedEvent; +import com.eu.habbo.plugin.events.rooms.RoomUnloadedEvent; +import com.eu.habbo.plugin.events.rooms.RoomUnloadingEvent; +import com.eu.habbo.plugin.events.users.UserExitRoomEvent; +import com.eu.habbo.plugin.events.users.UserIdleEvent; +import com.eu.habbo.plugin.events.users.UserRightsTakenEvent; +import com.eu.habbo.plugin.events.users.UserRolledEvent; +import com.eu.habbo.threading.runnables.YouAreAPirate; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.TIntIntMap; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TIntObjectProcedure; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; +import io.netty.util.internal.ConcurrentSet; + +import java.awt.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class Room implements Comparable, ISerialize, Runnable +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean HABBO_CHAT_DELAY = false; + public static int MAXIMUM_BOTS = 10; + public static int MAXIMUM_PETS = 10; + public static int HAND_ITEM_TIME = 10; + public static int IDLE_CYCLES = 240; + public static int IDLE_CYCLES_KICK = 480; + public static String PREFIX_FORMAT = "[%prefix%] "; + + private static final TIntObjectHashMap defaultMoodData = new TIntObjectHashMap(); + + static + { + for(int i = 1; i <= 3; i++) + { + RoomMoodlightData data = RoomMoodlightData.fromString(""); + data.setId(i); + defaultMoodData.put(i, data); + } + } + private int id; + private int ownerId; + private String ownerName; + private String name; + private String description; + private RoomLayout layout; + private boolean overrideModel; + private String layoutName; + private String password; + private RoomState state; + private int usersMax; + private volatile int score; + private volatile int category; + + private String floorPaint; + private String wallPaint; + private String backgroundPaint; + + private int wallSize; + private int wallHeight; + private int floorSize; + + private int guild; + + private String tags; + private volatile boolean publicRoom; + private volatile boolean staffPromotedRoom; + private volatile boolean allowPets; + private volatile boolean allowPetsEat; + private volatile boolean allowWalkthrough; + private volatile boolean allowBotsWalk; + private volatile boolean allowEffects; + private volatile boolean hideWall; + private volatile int chatMode; + private volatile int chatWeight; + private volatile int chatSpeed; + private volatile int chatDistance; + private volatile int chatProtection; + private volatile int muteOption; + private volatile int kickOption; + private volatile int banOption; + private volatile int pollId; + private volatile boolean promoted; + private volatile int tradeMode; + private volatile boolean moveDiagonally; + private volatile boolean jukeboxActive; + + private final ConcurrentHashMap currentHabbos = new ConcurrentHashMap<>(3); + private final TIntObjectMap habboQueue = TCollections.synchronizedMap(new TIntObjectHashMap(0)); + private final TIntObjectMap currentBots = TCollections.synchronizedMap(new TIntObjectHashMap(0)); + private final TIntObjectMap currentPets = TCollections.synchronizedMap(new TIntObjectHashMap(0)); + private final THashSet activeTrades; + private final TIntArrayList rights; + private final TIntArrayList traxItems; + private final TIntIntHashMap mutedHabbos; + private final TIntObjectHashMap bannedHabbos; + private final ConcurrentSet games; + private final TIntObjectMap furniOwnerNames; + private final TIntIntMap furniOwnerCount; + private final TIntObjectMap moodlightData; + private final THashSet wordFilterWords; + private final TIntObjectMap roomItems; + private final THashMap>> wiredHighscoreData; + private RoomPromotion promotion; + + private volatile boolean needsUpdate; + private volatile boolean loaded; + private volatile boolean preLoaded; + private volatile int idleCycles; + private volatile int unitCounter; + private volatile int rollerSpeed; + private volatile long rollerCycle = System.currentTimeMillis(); + private volatile int lastTimerReset = Emulator.getIntUnixTimestamp(); + private volatile boolean muted; + + private RoomSpecialTypes roomSpecialTypes; + + private final Object loadLock = new Object(); + public final Object roomUnitLock = new Object(); + + //Use appropriately. Could potentially cause memory leaks when used incorrectly. + public volatile boolean preventUnloading = false; + public volatile boolean preventUncaching = false; + public THashMap waterTiles; + public final ConcurrentHashMap> tileCache = new ConcurrentHashMap>(); + public ConcurrentSet scheduledComposers = new ConcurrentSet(); + public ConcurrentSet scheduledTasks = new ConcurrentSet(); + public String wordQuiz = ""; + public int noVotes = 0; + public int yesVotes = 0; + public int wordQuizEnd = 0; + public final List userVotes; + public ScheduledFuture roomCycleTask; + private TraxManager traxManager; + + public Room(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.ownerId = set.getInt("owner_id"); + this.ownerName = set.getString("owner_name"); + this.name = set.getString("name"); + this.description = set.getString("description"); + this.password = set.getString("password"); + this.state = RoomState.valueOf(set.getString("state").toUpperCase()); + this.usersMax = set.getInt("users_max"); + this.score = set.getInt("score"); + this.category = set.getInt("category"); + this.floorPaint = set.getString("paper_floor"); + this.wallPaint = set.getString("paper_wall"); + this.backgroundPaint = set.getString("paper_landscape"); + this.wallSize = set.getInt("thickness_wall"); + this.wallHeight = set.getInt("wall_height"); + this.floorSize = set.getInt("thickness_floor"); + this.tags = set.getString("tags"); + this.publicRoom = set.getBoolean("is_public"); + this.staffPromotedRoom = set.getBoolean("is_staff_picked"); + this.allowPets = set.getBoolean("allow_other_pets"); + this.allowPetsEat = set.getBoolean("allow_other_pets_eat"); + this.allowWalkthrough = set.getBoolean("allow_walkthrough"); + this.hideWall = set.getBoolean("allow_hidewall"); + this.chatMode = set.getInt("chat_mode"); + this.chatWeight = set.getInt("chat_weight"); + this.chatSpeed = set.getInt("chat_speed"); + this.chatDistance = set.getInt("chat_hearing_distance"); + this.chatProtection = set.getInt("chat_protection"); + this.muteOption = set.getInt("who_can_mute"); + this.kickOption = set.getInt("who_can_kick"); + this.banOption = set.getInt("who_can_ban"); + this.pollId = set.getInt("poll_id"); + this.guild = set.getInt("guild_id"); + this.rollerSpeed = set.getInt("roller_speed"); + this.overrideModel = set.getString("override_model").equals("1"); + this.layoutName = set.getString("model"); + this.promoted = set.getString("promoted").equals("1"); + this.jukeboxActive = set.getString("jukebox_active").equals("1"); + + this.bannedHabbos = new TIntObjectHashMap(); + this.traxItems = new TIntArrayList(); + +// for (String itemString : set.getString("trax").split(";")) +// { +// try +// { +// this.traxItems.add(Integer.valueOf(itemString)); +// } +// catch (Exception e) +// { +// Emulator.getLogging().logErrorLine(e); +// } +// } + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM room_promotions WHERE room_id = ? AND end_timestamp > ? LIMIT 1")) + { + if(this.promoted) + { + statement.setInt(1, this.id); + statement.setInt(2, Emulator.getIntUnixTimestamp()); + + try (ResultSet promotionSet = statement.executeQuery()) + { + this.promoted = false; + if (promotionSet.next()) + { + this.promoted = true; + this.promotion = new RoomPromotion(this, promotionSet); + } + } + } + + this.loadBans(connection); + } + this.tradeMode = set.getInt("trade_mode"); + this.moveDiagonally = set.getString("move_diagonally").equals("1"); + + this.preLoaded = true; + this.allowBotsWalk = true; + this.allowEffects = true; + this.furniOwnerNames = TCollections.synchronizedMap(new TIntObjectHashMap(0)); + this.furniOwnerCount = TCollections.synchronizedMap(new TIntIntHashMap(0)); + this.roomItems = TCollections.synchronizedMap(new TIntObjectHashMap(0)); + this.wordFilterWords = new THashSet(0); + this.moodlightData = new TIntObjectHashMap(defaultMoodData); + + for(String s : set.getString("moodlight_data").split(";")) + { + RoomMoodlightData data = RoomMoodlightData.fromString(s); + this.moodlightData.put(data.getId(), data); + } + + this.mutedHabbos = new TIntIntHashMap(); + this.games = new ConcurrentSet(); + + this.activeTrades = new THashSet(0); + this.rights = new TIntArrayList(); + this.wiredHighscoreData = new THashMap>>(); + this.userVotes = new ArrayList<>(); + } + + public synchronized void loadData() + { + synchronized (this.loadLock) + { + if (!this.preLoaded || this.loaded) + return; + + this.preLoaded = false; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + synchronized ( this.roomUnitLock) + { + this.unitCounter = 0; + this.currentHabbos.clear(); + this.currentPets.clear(); + this.currentBots.clear(); + } + + this.roomSpecialTypes = new RoomSpecialTypes(); + + try + { + this.loadLayout(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadRights(connection); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadItems(connection); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadHeightmap(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadBots(connection); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadPets(connection); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadWordFilter(connection); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.loadWiredData(connection); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + this.idleCycles = 0; + this.loaded = true; + + this.roomCycleTask = Emulator.getThreading().getService().scheduleAtFixedRate(this, 500, 500, TimeUnit.MILLISECONDS); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + this.traxManager = new TraxManager(this); + + if (this.jukeboxActive) + { + this.traxManager.play(0); + for (HabboItem item : this.roomSpecialTypes.getItemsOfType(InteractionJukeBox.class)) + { + item.setExtradata("1"); + this.updateItem(item); + } + } + } + + Emulator.getPluginManager().fireEvent(new RoomLoadedEvent(this)); + } + + private synchronized void loadLayout() + { + if (this.layout == null) + { + if (this.overrideModel) + { + this.layout = Emulator.getGameEnvironment().getRoomManager().loadCustomLayout(this); + } + else + { + this.layout = Emulator.getGameEnvironment().getRoomManager().loadLayout(this.layoutName, this); + } + } + } + + private synchronized void loadHeightmap() + { + if (this.layout != null) + { + for (short x = 0; x < this.layout.getMapSizeX(); x++) + { + for (short y = 0; y < this.layout.getMapSizeY(); y++) + { + RoomTile tile = this.layout.getTile(x, y); + if (tile != null) + { + this.updateTile(tile); + } + } + } + } + else + { + Emulator.getLogging().logErrorLine("Unknown Room Layout for Room (ID: " + this.id + ")"); + } + } + + private synchronized void loadItems(Connection connection) throws SQLException + { + this.roomItems.clear(); + + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM items WHERE room_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.addHabboItem(Emulator.getGameEnvironment().getItemManager().loadHabboItem(set)); + } + } + } + } + + private synchronized void loadWiredData(Connection connection) throws SQLException + { + try (PreparedStatement statement = connection.prepareStatement("SELECT id, wired_data FROM items WHERE room_id = ? AND wired_data<>?")) + { + statement.setInt(1, this.id); + statement.setString(2, ""); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + try + { + HabboItem item = this.getHabboItem(set.getInt("id")); + + if (item != null && item instanceof InteractionWired) + { + ((InteractionWired) item).loadWiredData(set, this); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + private synchronized void loadBots(Connection connection) throws SQLException + { + this.currentBots.clear(); + + try (PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots INNER JOIN users ON bots.user_id = users.id WHERE room_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Bot b = Emulator.getGameEnvironment().getBotManager().loadBot(set); + + if (b != null) + { + b.setRoom(this); + b.setRoomUnit(new RoomUnit()); + b.getRoomUnit().setPathFinderRoom(this); + b.getRoomUnit().setLocation(this.layout.getTile((short) set.getInt("x"), (short) set.getInt("y"))); + if (b.getRoomUnit().getCurrentLocation() == null) + { + b.getRoomUnit().setLocation(this.getLayout().getDoorTile()); + b.getRoomUnit().setRotation(RoomUserRotation.fromValue(this.getLayout().getDoorDirection())); + } + else + { + b.getRoomUnit().setZ(set.getDouble("z")); + b.getRoomUnit().setRotation(RoomUserRotation.values()[set.getInt("rot")]); + } + b.getRoomUnit().setRoomUnitType(RoomUnitType.BOT); + b.getRoomUnit().setDanceType(DanceType.values()[set.getInt("dance")]); + b.getRoomUnit().setCanWalk(set.getBoolean("freeroam")); + b.getRoomUnit().setInRoom(true); + this.addBot(b); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private synchronized void loadPets(Connection connection) throws SQLException + { + this.currentPets.clear(); + + try (PreparedStatement statement = connection.prepareStatement("SELECT users.username as pet_owner_name, users_pets.* FROM users_pets INNER JOIN users ON users_pets.user_id = users.id WHERE room_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + try + { + AbstractPet pet = PetManager.loadPet(set); + pet.setRoom(this); + pet.setRoomUnit(new RoomUnit()); + pet.getRoomUnit().setPathFinderRoom(this); + pet.getRoomUnit().setLocation(this.layout.getTile((short) set.getInt("x"), (short) set.getInt("y"))); + if (pet.getRoomUnit().getCurrentLocation() == null) + { + pet.getRoomUnit().setLocation(this.getLayout().getDoorTile()); + pet.getRoomUnit().setRotation(RoomUserRotation.fromValue(this.getLayout().getDoorDirection())); + } + else + { + pet.getRoomUnit().setZ(set.getDouble("z")); + pet.getRoomUnit().setRotation(RoomUserRotation.values()[set.getInt("rot")]); + } + pet.getRoomUnit().setRoomUnitType(RoomUnitType.PET); + pet.getRoomUnit().setCanWalk(true); + this.addPet(pet); + + this.getFurniOwnerNames().put(pet.getUserId(), set.getString("pet_owner_name")); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + } + + private synchronized void loadWordFilter(Connection connection) throws SQLException + { + this.wordFilterWords.clear(); + + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM room_wordfilter WHERE room_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.wordFilterWords.add(set.getString("word")); + } + } + } + } + + public void updateTile(RoomTile tile) + { + if (tile != null) + { + tile.setStackHeight(this.getStackHeight(tile.x, tile.y, false)); + tile.setWalkable(this.canWalkAt(tile)); + } + } + + public void updateTiles(THashSet tiles) + { + for (RoomTile tile : tiles) + { + this.tileCache.remove(tile); + tile.setStackHeight(this.getStackHeight(tile.x, tile.y, false)); + tile.setWalkable(this.canWalkAt(tile)); + } + + this.sendComposer(new UpdateStackHeightComposer(tiles).compose()); + } + + public boolean tileWalkable(RoomTile t) + { + return this.tileWalkable(t.x, t.y); + } + + public boolean tileWalkable(short x, short y) + { + boolean walkable = this.layout.tileWalkable(x, y); + + if (walkable) + { + if (this.hasHabbosAt(x, y) && !this.allowWalkthrough) + { + walkable = false; + } + } + return walkable; //&& (!this.allowWalkthrough && !this.hasHabbosAt(x, y))); + //if(this.layout.tileWalkable(x, y)) +// { +// if(!this.allowWalkthrough) +// { +// if (hasHabbosAt(x, y)) +// return false; +// +// if (hasBotsAt(x, y)) +// return false; +// } +// +// THashSet items = getItemsAt(x, y); +// if(items.isEmpty()) +// return true; +// +// boolean walkAble = true; +// for(HabboItem item : items) +// { +// if(!item.getBaseItem().allowWalk()) +// walkAble = false; +// +// if(item.getBaseItem().allowSit()) +// walkAble = false; +// +// if(item instanceof InteractionGate) +// { +// walkAble = item.isWalkable(); +// } +// else if(item instanceof InteractionGameGate) +// { +// walkAble = item.isWalkable(); +// } +// else if(item instanceof InteractionFreezeBlock) +// { +// walkAble = item.isWalkable(); +// } +// } +// +// return walkAble; +// HabboItem item = this.getTopItemAt(x, y); +// +// return item == null || item.isWalkable(); +// } +// return false; + } + + public void pickUpItem(HabboItem item, Habbo picker) + { + if(item == null) + return; + + if(Emulator.getPluginManager().isRegistered(FurniturePickedUpEvent.class, true)) + { + Event furniturePickedUpEvent = new FurniturePickedUpEvent(item, picker); + Emulator.getPluginManager().fireEvent(furniturePickedUpEvent); + + if(furniturePickedUpEvent.isCancelled()) + return; + } + + this.removeHabboItem(item.getId()); + item.onPickUp(this); + item.setRoomId(0); + item.needsUpdate(true); + + if (item.getBaseItem().getType() == FurnitureType.FLOOR) + { + this.sendComposer(new RemoveFloorItemComposer(item).compose()); + + THashSet updatedTiles = new THashSet(); + Rectangle rectangle = RoomLayout.getRectangle(item.getX(), item.getY(), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + + for (short x = (short)rectangle.x; x < rectangle.x + rectangle.getWidth(); x++) + { + for (short y = (short)rectangle.y; y < rectangle.y + rectangle.getHeight(); y++) + { + double stackHeight = this.getStackHeight(x, y, false); + RoomTile tile = this.layout.getTile(x, y); + + if (tile != null) + { + tile.setStackHeight(stackHeight); + updatedTiles.add(tile); + } + } + } + this.sendComposer(new UpdateStackHeightComposer(updatedTiles).compose()); + this.updateTiles(updatedTiles); + for (RoomTile tile : updatedTiles) + { + this.updateHabbosAt(tile.x, tile.y); + } + } + else if (item.getBaseItem().getType() == FurnitureType.WALL) + { + this.sendComposer(new RemoveWallItemComposer(item).compose()); + } + + Habbo habbo = (picker != null && picker.getHabboInfo().getId() == item.getId() ? picker : Emulator.getGameServer().getGameClientManager().getHabbo(item.getUserId())); + if (habbo != null) { + habbo.getInventory().getItemsComponent().addItem(item); + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + } + Emulator.getThreading().run(item); + } + + public void updateHabbosAt(Rectangle rectangle) + { + for(short i = (short) rectangle.x; i < rectangle.x + rectangle.width; i++) + { + for(short j = (short) rectangle.y; j < rectangle.y + rectangle.height; j++) + { + this.updateHabbosAt(i, j); + } + } + } + + public void updateHabbo(Habbo habbo) + { + HabboItem item = this.getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); + + if((item == null && !habbo.getRoomUnit().cmdSit) || (item != null && !item.getBaseItem().allowSit())) + habbo.getRoomUnit().getStatus().remove("sit"); + + + if(item != null) + { + if(item.getBaseItem().allowSit()) + { + habbo.getRoomUnit().setZ(item.getZ()); + } + else + { + habbo.getRoomUnit().setZ(item.getZ() + item.getBaseItem().getHeight()); + } + } + + this.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + } + + public void updateHabbosAt(short x, short y) + { + THashSet habbos = this.getHabbosAt(x, y); + + HabboItem item = this.getTopItemAt(x, y); + + THashSet roomUnits = new THashSet(); + for (Habbo habbo : habbos) + { + if ((item == null && !habbo.getRoomUnit().cmdSit) || (item != null && !item.getBaseItem().allowSit())) + habbo.getRoomUnit().getStatus().remove("sit"); + + if ((item == null && !habbo.getRoomUnit().cmdLay) || (item != null && !item.getBaseItem().allowLay())) + habbo.getRoomUnit().getStatus().remove("lay"); + + if(item != null) + { + if(item.getBaseItem().allowSit()) + { + habbo.getRoomUnit().setZ(item.getZ()); + } + else + { + habbo.getRoomUnit().setZ(item.getZ() + item.getBaseItem().getHeight()); + + if (item.getBaseItem().allowLay()) + { + habbo.getRoomUnit().getStatus().put("lay", (item.getZ() + item.getBaseItem().getHeight()) + ""); + } + } + } + else + { + habbo.getRoomUnit().setZ(habbo.getRoomUnit().getCurrentLocation().getStackHeight()); + } + roomUnits.add(habbo.getRoomUnit()); + } + + this.sendComposer(new RoomUserStatusComposer(roomUnits, true).compose()); + } + + public void pickupPetsForHabbo(Habbo habbo) + { + THashSet pets = new THashSet(); + + synchronized (this.currentPets) + { + for(AbstractPet pet : this.currentPets.valueCollection()) + { + if(pet.getUserId() == habbo.getHabboInfo().getId()) + { + pets.add((Pet) pet); + } + } + } + + for(AbstractPet pet : pets) + { + if(pet instanceof Pet) + { + pet.setRoom(null); + pet.needsUpdate = true; + + habbo. + getInventory(). + getPetsComponent(). + addPet((Pet) pet); + + this.sendComposer(new RoomUserRemoveComposer(pet.getRoomUnit()).compose()); + habbo.getClient().sendResponse(new AddPetComposer(pet)); + } + this.currentPets.remove(pet.getId()); + } + + } + + public void startTrade(Habbo userOne, Habbo userTwo) + { + RoomTrade trade = new RoomTrade(userOne, userTwo, this); + synchronized (this.activeTrades) + { + this.activeTrades.add(trade); + } + } + + public void stopTrade(RoomTrade trade) + { + synchronized (this.activeTrades) + { + this.activeTrades.remove(trade); + } + } + + public RoomTrade getActiveTradeForHabbo(Habbo user) + { + synchronized (this.activeTrades) + { + for (RoomTrade trade : this.activeTrades) + { + for (RoomTradeUser habbo : trade.getRoomTradeUsers()) + { + if (habbo.getHabbo() == user) + return trade; + } + } + } + return null; + } + + public synchronized void dispose() + { + synchronized (this.loadLock) + { + if (this.preventUnloading) + return; + + if (Emulator.getPluginManager().fireEvent(new RoomUnloadingEvent(this)).isCancelled()) + return; + + if (this.loaded) + { + if (!this.traxManager.disposed()) + { + this.traxManager.dispose(); + } + try + { + this.roomCycleTask.cancel(false); + this.scheduledTasks.clear(); + this.scheduledComposers.clear(); + this.loaded = false; + + this.tileCache.clear(); + + synchronized (this.mutedHabbos) + { + this.mutedHabbos.clear(); + } + + for (Game game : this.games) + { + game.stop(); + } + this.games.clear(); + + synchronized (this.roomItems) + { + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + try + { + iterator.advance(); + + if (iterator.value().needsUpdate()) + iterator.value().run(); + } catch (NoSuchElementException e) + { + break; + } + } + } + + if (this.roomSpecialTypes != null) + { + this.roomSpecialTypes.dispose(); + } + + synchronized (this.roomItems) + { + this.roomItems.clear(); + } + + synchronized (this.habboQueue) + { + this.habboQueue.clear(); + } + + // SAFE + + + for (Habbo habbo : this.currentHabbos.values()) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, this); + } + + this.sendComposer(new HotelViewComposer().compose()); + + this.currentHabbos.clear(); + + + TIntObjectIterator botIterator = this.currentBots.iterator(); + + for (int i = this.currentBots.size(); i-- > 0; ) + { + try + { + botIterator.advance(); + botIterator.value().needsUpdate(true); + Emulator.getThreading().run(botIterator.value()); + } catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + } + + TIntObjectIterator petIterator = this.currentPets.iterator(); + for (int i = this.currentPets.size(); i-- > 0; ) + { + try + { + petIterator.advance(); + if (petIterator.value() instanceof Pet) + { + petIterator.value().needsUpdate = true; + Emulator.getThreading().run(petIterator.value()); + } + } catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + } + + this.currentBots.clear(); + this.currentPets.clear(); + } catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + this.wordQuiz = ""; + this.yesVotes = 0; + this.noVotes = 0; + this.updateDatabaseUserCount(); + this.preLoaded = true; + this.layout = null; + } + + Emulator.getPluginManager().fireEvent(new RoomUnloadedEvent(this)); + } + + @SuppressWarnings("NullableProblems") + @Override + public int compareTo(Room o) + { + if (o.getUserCount() != this.getUserCount()) + { + return o.getCurrentHabbos().size() - this.getCurrentHabbos().size(); + } + + return this.id - o.id ; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.id); + message.appendString(this.name); + if(this.isPublicRoom()) + { + message.appendInt(0); + message.appendString(""); + } + else + { + message.appendInt(this.ownerId); + message.appendString(this.ownerName); + } + message.appendInt(this.state.getState()); + message.appendInt(this.getUserCount()); + message.appendInt(this.usersMax); + message.appendString(this.description); + message.appendInt(0); + message.appendInt(this.score); + message.appendInt(0); + message.appendInt(this.category); + message.appendInt(this.tags.split(";").length); + for(String s : this.tags.split(";")) + { + message.appendString(s); + } + + /*if(g != null) + { + message.appendInt(58); + message.appendInt(g.getId()); + message.appendString(g.getName()); + message.appendString(g.getBadge()); + } + else + { + message.appendInt(56); + }*/ + + int base = 0; + + if(this.getGuildId() > 0) + { + base = base | 2; + } + + if (this.isPromoted()) + { + base = base | 4; + } + + if(!this.isPublicRoom()) + { + base = base | 8; + } + + message.appendInt(base); + + + //message.appendString("a.png"); //Camera image. + + if(this.getGuildId() > 0) + { + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(this.getGuildId()); + if (g != null) + { + message.appendInt(g.getId()); + message.appendString(g.getName()); + message.appendString(g.getBadge()); + } + else + { + message.appendInt(0); + message.appendString(""); + message.appendString(""); + } + } + + if(this.promoted) + { + message.appendString(this.promotion.getTitle()); + message.appendString(this.promotion.getDescription()); + message.appendInt((this.promotion.getEndTimestamp() - Emulator.getIntUnixTimestamp()) / 60); + } + + } + + public static final Comparator SORT_SCORE = new Comparator() { + @Override + public int compare(Object o1, Object o2) { + + if (!(o1 instanceof Room && o2 instanceof Room)) + return 0; + + return ((Room) o2).getScore() - ((Room) o1).getScore(); + } + }; + + public static final Comparator SORT_ID = new Comparator() { + @Override + public int compare(Object o1, Object o2) { + + if (!(o1 instanceof Room && o2 instanceof Room)) + return 0; + + return ((Room) o2).getId() - ((Room) o1).getId(); + } + }; + + @Override + public void run() + { + long millis = System.currentTimeMillis(); + + synchronized (this.loadLock) + { + if (this.loaded) + { + try + { + Emulator.getThreading().run( + new Runnable() + { + @Override + public void run() + { + cycle(); + } + }); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + + this.save(); + } + + public void save() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE rooms SET name = ?, description = ?, password = ?, state = ?, users_max = ?, category = ?, score = ?, paper_floor = ?, paper_wall = ?, paper_landscape = ?, thickness_wall = ?, wall_height = ?, thickness_floor = ?, moodlight_data = ?, tags = ?, allow_other_pets = ?, allow_other_pets_eat = ?, allow_walkthrough = ?, allow_hidewall = ?, chat_mode = ?, chat_weight = ?, chat_speed = ?, chat_hearing_distance = ?, chat_protection =?, who_can_mute = ?, who_can_kick = ?, who_can_ban = ?, poll_id = ?, guild_id = ?, roller_speed = ?, override_model = ?, is_staff_picked = ?, promoted = ?, trade_mode = ?, move_diagonally = ?, owner_id = ?, owner_name = ?, jukebox_active = ? WHERE id = ?")) + { + statement.setString(1, this.name); + statement.setString(2, this.description); + statement.setString(3, this.password); + statement.setString(4, this.state.name().toLowerCase()); + statement.setInt(5, this.usersMax); + statement.setInt(6, this.category); + statement.setInt(7, this.score); + statement.setString(8, this.floorPaint); + statement.setString(9, this.wallPaint); + statement.setString(10, this.backgroundPaint); + statement.setInt(11, this.wallSize); + statement.setInt(12, this.wallHeight); + statement.setInt(13, this.floorSize); + String moodLightData = ""; + + int id = 1; + for(RoomMoodlightData data : this.moodlightData.valueCollection()) + { + data.setId(id); + moodLightData += data.toString() + ";"; + id++; + } + + statement.setString(14, moodLightData); + statement.setString(15, this.tags); + statement.setString(16, this.allowPets ? "1" : "0"); + statement.setString(17, this.allowPetsEat ? "1" : "0"); + statement.setString(18, this.allowWalkthrough ? "1" : "0"); + statement.setString(19, this.hideWall ? "1" : "0"); + statement.setInt(20, this.chatMode); + statement.setInt(21, this.chatWeight); + statement.setInt(22, this.chatSpeed); + statement.setInt(23, this.chatDistance); + statement.setInt(24, this.chatProtection); + statement.setInt(25, this.muteOption); + statement.setInt(26, this.kickOption); + statement.setInt(27, this.banOption); + statement.setInt(28, this.pollId); + statement.setInt(29, this.guild); + statement.setInt(30, this.rollerSpeed); + statement.setString(31, this.overrideModel ? "1" : "0"); + statement.setString(32, this.staffPromotedRoom ? "1" : "0"); + statement.setString(33, this.promoted ? "1" : "0"); + statement.setInt(34, this.tradeMode); + statement.setString(35, this.moveDiagonally ? "1" : "0"); + statement.setInt(36, this.ownerId); + statement.setString(37, this.ownerName); + statement.setString(38, this.jukeboxActive ? "1" : "0"); + statement.setInt(39, this.id); + statement.executeUpdate(); + this.needsUpdate = false; + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + private void updateDatabaseUserCount() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE rooms SET users = ? WHERE id = ? LIMIT 1")) + { + statement.setInt(1, this.currentHabbos.size()); + statement.setInt(2, this.id); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private void cycle() + { + final boolean[] foundRightHolder = {false}; + + this.tileCache.clear(); + + boolean loaded = false; + synchronized (this.loadLock) + { + loaded = this.loaded; + } + if(loaded) + { + if (!this.scheduledTasks.isEmpty()) + { + ConcurrentSet tasks = this.scheduledTasks; + this.scheduledTasks = new ConcurrentSet<>(); + + for (Runnable runnable : tasks) + { + Emulator.getThreading().run(runnable); + } + } + + if (!this.currentHabbos.isEmpty()) + { + this.idleCycles = 0; + + THashSet updatedUnit = new THashSet(); + ArrayList toKick = new ArrayList(); + + final Room room = this; + + final long millis = System.currentTimeMillis(); + if(this.rollerSpeed != -1 && this.rollerCycle >= this.rollerSpeed) + { + this.rollerCycle = 0; + + THashSet messages = new THashSet(); + + this.roomSpecialTypes.getRollers().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(InteractionRoller roller) + { + //if(Double.compare(roller.getZ(), this.layout.getHeightAtSquare(roller.getX(), roller.getY())) != 0) + // { + // continue; + //} + + HabboItem newRoller = null; + + THashSet habbosOnRoller = getHabbosAt(roller.getX(), roller.getY()); + THashSet itemsOnRoller = getItemsAt(roller.getX(), roller.getY(), roller.getZ() + roller.getBaseItem().getHeight()); + + itemsOnRoller.remove(roller); + + if (habbosOnRoller.isEmpty()) + { + if (itemsOnRoller.isEmpty()) + return true; + } + + RoomTile roomTile = layout.getTileInFront(layout.getTile(roller.getX(), roller.getY()), roller.getRotation()); + + if (roomTile == null) + return true; + + if(!layout.tileExists(roomTile.x, roomTile.y)) + return true; + + if (roomTile.state == RoomTileState.BLOCKED) + return true; + + if (!getHabbosAt(roomTile.x, roomTile.y).isEmpty()) + return true; + + THashSet itemsNewTile = getItemsAt(roomTile.x, roomTile.y); + itemsNewTile.removeAll(itemsOnRoller); + List toRemove = new ArrayList(); + for (HabboItem item : itemsOnRoller) + { + if (item.getX() != roller.getX() || item.getY() != roller.getY()) + { + toRemove.add(item); + } + } + itemsOnRoller.removeAll(toRemove); + HabboItem topItem = getTopItemAt(roomTile.x, roomTile.y); + + boolean allowUsers = true; + boolean allowFurniture = true; + boolean stackContainsRoller = false; + + for (HabboItem item : itemsNewTile) + { + if (!(item.getBaseItem().allowWalk() || item.getBaseItem().allowSit()) && !(item instanceof InteractionGate && item.getExtradata().equals("1"))) + { + allowUsers = false; + } + if (item instanceof InteractionRoller) + { + newRoller = item; + stackContainsRoller = true; + + if (itemsNewTile.size() > 1 && item != topItem) + { + allowUsers = false; + allowFurniture = false; + continue; + } + + break; + } + else + { + allowFurniture = false; + } + } + + double zOffset = 0; + if(newRoller == null) + { + zOffset = -roller.getBaseItem().getHeight(); + } + + if (allowFurniture || (!allowFurniture && !stackContainsRoller)) + { + /** + * Redneck way to prevent checking ifregistered each time. + */ + Event furnitureRolledEvent = null; + + if (Emulator.getPluginManager().isRegistered(FurnitureRolledEvent.class, true)) + { + furnitureRolledEvent = new FurnitureRolledEvent(null, null, null); + } + + //if (newRoller == null || topItem == newRoller) + { + for (HabboItem item : itemsOnRoller) + { + //if (item.getX() == roller.getX() && item.getY() == roller.getY()) + { + if (furnitureRolledEvent != null) + { + furnitureRolledEvent = new FurnitureRolledEvent(item, roller, roomTile); + Emulator.getPluginManager().fireEvent(furnitureRolledEvent); + + if (furnitureRolledEvent.isCancelled()) + continue; + } + + if (item != roller) + messages.add(new FloorItemOnRollerComposer(item, roller, roomTile, zOffset, room)); + } + } + } + } + + if (allowUsers) + { + Event roomUserRolledEvent = null; + + if(Emulator.getPluginManager().isRegistered(UserRolledEvent.class, true)) + { + roomUserRolledEvent = new UserRolledEvent(null, null, null); + } + + for (Habbo habbo : habbosOnRoller) + { + if (stackContainsRoller && !allowFurniture && !(topItem != null && topItem.isWalkable())) + continue; + + if (!habbo.getRoomUnit().getStatus().containsKey("mv")) + { + RoomTile tile = roomTile.copy(); + tile.setStackHeight(habbo.getRoomUnit().getZ() + zOffset); + if(roomUserRolledEvent != null) + { + roomUserRolledEvent = new UserRolledEvent(habbo, roller, tile); + Emulator.getPluginManager().fireEvent(roomUserRolledEvent); + + if(roomUserRolledEvent.isCancelled()) + continue; + } + + messages.add(new RoomUnitOnRollerComposer(habbo.getRoomUnit(), roller, tile, room)); + } + + if(habbo.getRoomUnit().getStatus().containsKey("sit")) + habbo.getRoomUnit().sitUpdate = true; + } + } + + return true; + } + }); + + for (MessageComposer message : messages) + { + this.sendComposer(message.compose()); + } + + for(HabboItem pyramid : this.roomSpecialTypes.getItemsOfType(InteractionPyramid.class)) + { + if(pyramid instanceof InteractionPyramid) + { + int currentTime = Emulator.getIntUnixTimestamp(); + + if(((InteractionPyramid) pyramid).getNextChange() < currentTime) + { + ((InteractionPyramid) pyramid).change(this); + } + } + } + } + else + { + this.rollerCycle++; + } + + for (Habbo habbo : this.currentHabbos.values()) + { + if (!foundRightHolder[0]) + { + foundRightHolder[0] = habbo.getRoomUnit().getRightsLevel() != RoomRightLevels.NONE; + } + + if (habbo.getRoomUnit().getHandItem() > 0 && millis - habbo.getRoomUnit().getHandItemTimestamp() > (Room.HAND_ITEM_TIME * 1000)) + { + giveHandItem(habbo, 0); + } + + if (Emulator.getConfig().getBoolean("hotel.rooms.auto.idle")) + { + if (!habbo.getRoomUnit().isIdle()) + { + habbo.getRoomUnit().increaseIdleTimer(); + + if (habbo.getRoomUnit().isIdle()) + { + sendComposer(new RoomUnitIdleComposer(habbo.getRoomUnit()).compose()); + } + } + else + { + habbo.getRoomUnit().increaseIdleTimer(); + + if (!isOwner(habbo) && habbo.getRoomUnit().getIdleTimer() >= Room.IDLE_CYCLES_KICK) + { + UserExitRoomEvent event = new UserExitRoomEvent(habbo, UserExitRoomEvent.UserExitRoomReason.KICKED_IDLE); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + toKick.add(habbo); + } + } + } + } + + if (habbo.getHabboStats().mutedBubbleTracker && habbo.getHabboStats().allowTalk()) + { + habbo.getHabboStats().mutedBubbleTracker = false; + this.sendComposer(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.UNIGNORED).compose()); + } + if (!habbo.hasPermission("acc_chat_no_flood") && habbo.getHabboStats().chatCounter > 0) + { + //if (habbo.getRoomUnit().talkTimeOut == 0 || currentTimestamp - habbo.getRoomUnit().talkTimeOut < 0) + { + habbo.getHabboStats().chatCounter--; + + if (habbo.getHabboStats().chatCounter > 3 && !this.hasRights(habbo)) + { + if (chatProtection == 0) + { + floodMuteHabbo(habbo, 30); + } + else if (chatProtection == 1 && habbo.getHabboStats().chatCounter > 4) + { + floodMuteHabbo(habbo, 30); + } + else if (chatProtection == 2 && habbo.getHabboStats().chatCounter > 5) + { + floodMuteHabbo(habbo, 30); + } + } + } + } + else + { + habbo.getHabboStats().chatCounter = 0; + } + + if (habbo.getRoomUnit().getStatus().containsKey("sign")) + { + sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + habbo.getRoomUnit().getStatus().remove("sign"); + } + + if (habbo.getRoomUnit().isWalking() && habbo.getRoomUnit().getPath() != null && !habbo.getRoomUnit().getPath().isEmpty()) + { + if (!habbo.getRoomUnit().cycle(room)) + { + updatedUnit.add(habbo.getRoomUnit()); + continue; + } + } + else + { + if (habbo.getRoomUnit().getStatus().containsKey("mv") && !habbo.getRoomUnit().animateWalk) + { + habbo.getRoomUnit().getStatus().remove("mv"); + + updatedUnit.add(habbo.getRoomUnit()); + } + + if (!habbo.getRoomUnit().isWalking() && !habbo.getRoomUnit().cmdSit) + { + HabboItem topItem = getLowestChair(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); + + if (topItem == null || !topItem.getBaseItem().allowSit()) + { + if (habbo.getRoomUnit().getStatus().containsKey("sit")) + { + habbo.getRoomUnit().getStatus().remove("sit"); + updatedUnit.add(habbo.getRoomUnit()); + } + } + else + { + if (!habbo.getRoomUnit().getStatus().containsKey("sit") || habbo.getRoomUnit().sitUpdate) + { + dance(habbo, DanceType.NONE); + if (topItem instanceof InteractionMultiHeight) + { + habbo.getRoomUnit().getStatus().put("sit", Item.getCurrentHeight(topItem) * 1.0D + ""); + } + else + { + habbo.getRoomUnit().getStatus().put("sit", topItem.getBaseItem().getHeight() * 1.0D + ""); + } + habbo.getRoomUnit().setZ(topItem.getZ()); + habbo.getRoomUnit().setRotation(RoomUserRotation.values()[topItem.getRotation()]); + updatedUnit.add(habbo.getRoomUnit()); + habbo.getRoomUnit().sitUpdate = false; + } + } + } + } + + if (!habbo.getRoomUnit().isWalking() && !habbo.getRoomUnit().cmdLay) + { + HabboItem topItem = getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); + + if (topItem == null || !topItem.getBaseItem().allowLay()) + { + if (habbo.getRoomUnit().getStatus().containsKey("lay")) + { + habbo.getRoomUnit().getStatus().remove("lay"); + updatedUnit.add(habbo.getRoomUnit()); + } + } + else + { + if (!habbo.getRoomUnit().getStatus().containsKey("lay")) + { + if (topItem instanceof InteractionMultiHeight) + { + habbo.getRoomUnit().getStatus().put("lay", Item.getCurrentHeight(topItem) * 1.0D + ""); + } + else + { + habbo.getRoomUnit().getStatus().put("lay", topItem.getBaseItem().getHeight() * 1.0D + ""); + } + habbo.getRoomUnit().setRotation(RoomUserRotation.values()[topItem.getRotation()]); + + if (topItem.getRotation() == 0 || topItem.getRotation() == 4) + { + habbo.getRoomUnit().setLocation(layout.getTile(habbo.getRoomUnit().getX(), topItem.getY())); + //habbo.getRoomUnit().setOldY(topItem.getY()); + } + else + { + habbo.getRoomUnit().setLocation(layout.getTile(topItem.getX(), habbo.getRoomUnit().getY())); + //habbo.getRoomUnit().setOldX(topItem.getX()); + } + updatedUnit.add(habbo.getRoomUnit()); + } + } + } + } + + if(!toKick.isEmpty()) + { + for(Habbo habbo : toKick) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, this); + } + } + + if (!this.currentBots.isEmpty()) + { + TIntObjectIterator botIterator = this.currentBots.iterator(); + for (int i = this.currentBots.size(); i-- > 0; ) + { + try + { + final Bot bot; + try + { + botIterator.advance(); + bot = botIterator.value(); + } + catch (Exception e) + { + break; + } + + if (!this.allowBotsWalk && bot.getRoomUnit().isWalking()) + { + bot.getRoomUnit().stopWalking(); + updatedUnit.add(bot.getRoomUnit()); + continue; + } + + botIterator.value().cycle(this.allowBotsWalk); + + if (!bot.getRoomUnit().isWalking()) + { + if (bot.getRoomUnit().getStatus().containsKey("mv")) + { + bot.getRoomUnit().getStatus().remove("mv"); + + updatedUnit.add(bot.getRoomUnit()); + } + + if (!bot.getRoomUnit().isWalking() && !bot.getRoomUnit().cmdSit) + { + HabboItem topItem = this.getLowestChair(bot.getRoomUnit().getX(), bot.getRoomUnit().getY()); + + if (topItem == null || !topItem.getBaseItem().allowSit()) + { + if (bot.getRoomUnit().getStatus().containsKey("sit")) + { + bot.getRoomUnit().getStatus().remove("sit"); + updatedUnit.add(bot.getRoomUnit()); + } + } + else + { + if (!bot.getRoomUnit().getStatus().containsKey("sit")) + { + if (topItem instanceof InteractionMultiHeight) + { + bot.getRoomUnit().getStatus().put("sit", Item.getCurrentHeight(topItem) * 1.0D + ""); + } else + { + bot.getRoomUnit().getStatus().put("sit", topItem.getBaseItem().getHeight() * 1.0D + ""); + } + bot.getRoomUnit().setRotation(RoomUserRotation.values()[topItem.getRotation()]); + updatedUnit.add(bot.getRoomUnit()); + } + } + } + } + + if (!bot.getRoomUnit().isWalking() && !bot.getRoomUnit().cmdLay) + { + HabboItem topItem = this.getTopItemAt(bot.getRoomUnit().getX(), bot.getRoomUnit().getY()); + + if (topItem == null || !topItem.getBaseItem().allowLay()) + { + if (bot.getRoomUnit().getStatus().containsKey("lay")) + { + bot.getRoomUnit().getStatus().remove("lay"); + updatedUnit.add(bot.getRoomUnit()); + } + } else + { + if (!bot.getRoomUnit().getStatus().containsKey("lay")) + { + if (topItem instanceof InteractionMultiHeight) + { + bot.getRoomUnit().getStatus().put("lay", Item.getCurrentHeight(topItem) * 1.0D + ""); + } else + { + bot.getRoomUnit().getStatus().put("lay", topItem.getBaseItem().getHeight() * 1.0D + ""); + } + bot.getRoomUnit().setRotation(RoomUserRotation.values()[topItem.getRotation()]); + bot.getRoomUnit().setLocation(this.layout.getTile(topItem.getX(), topItem.getY())); + updatedUnit.add(bot.getRoomUnit()); + } + } + } + + if (!botIterator.value().getRoomUnit().cycle(this)) + updatedUnit.add(botIterator.value().getRoomUnit()); + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + } + } + + if (!this.currentPets.isEmpty()) + { + if (this.allowBotsWalk) + { + TIntObjectIterator petIterator = this.currentPets.iterator(); + for (int i = this.currentPets.size(); i-- > 0; ) + { + try + { + petIterator.advance(); + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + + AbstractPet pet = petIterator.value(); + if (pet instanceof Pet) + { +// if (pet.getRoomUnit().getStatus().containsKey("mv") && pet.getRoomUnit().isAtGoal()) +// { +// System.out.println("Clearing Pet Walking Animation..."); +// pet.getRoomUnit().getStatus().remove("mv"); +// updatedUnit.add(pet.getRoomUnit()); +// } + + if (!pet.getRoomUnit().isWalking() && pet.getRoomUnit().getStatus().containsKey("mv")) + { + pet.getRoomUnit().getStatus().remove("mv"); + updatedUnit.add(pet.getRoomUnit()); + continue; + } + + ((Pet) pet).cycle(); + + if (((Pet) pet).packetUpdate) + { + updatedUnit.add(pet.getRoomUnit()); + ((Pet) pet).packetUpdate = false; + } + + if (((Pet) pet).getTask() == PetTasks.RIDE) + { + if (pet instanceof HorsePet) + { + HorsePet horse = ((HorsePet) pet); + if (horse.getRider() != null) + { + if (!horse.getRider().getRoomUnit().getCurrentLocation().equals(horse.getRoomUnit().getCurrentLocation())) + { + horse.getRoomUnit().setGoalLocation(horse.getRider().getRoomUnit().getCurrentLocation()); + } + } + } + } + +// if (pet.getRoomUnit().isAtGoal()) +// { +// if (!(pet.getRoomUnit().getStatus().isEmpty() || (pet.getRoomUnit().getStatus().size() >= 1 && (pet.getRoomUnit().getStatus().containsKey("lay") || pet.getRoomUnit().getStatus().containsKey("gst")))) || ((Pet) pet).packetUpdate) +// { +// updatedUnit.add(pet.getRoomUnit()); +// ((Pet) pet).packetUpdate = false; +// } +// } + + if (pet.getRoomUnit().isWalking() && pet.getRoomUnit().getPath().size() == 1 && pet.getRoomUnit().getStatus().containsKey("gst")) + { + pet.getRoomUnit().getStatus().remove("gst"); + updatedUnit.add(pet.getRoomUnit()); + } + + if (!pet.getRoomUnit().cycle(this)) + { + updatedUnit.add(pet.getRoomUnit()); + } + } + } + } + } + + + if(!updatedUnit.isEmpty()) + { + this.sendComposer(new RoomUserStatusComposer(updatedUnit, true).compose()); + } + + for (ICycleable task : this.roomSpecialTypes.getCycleTasks()) + { + task.cycle(this); + } + + this.traxManager.cycle(); + } + else + { + + if(this.idleCycles < 60) + this.idleCycles++; + else + this.dispose(); + } + } + + synchronized (this.habboQueue) + { + if (!this.habboQueue.isEmpty() && !foundRightHolder[0]) + { + this.habboQueue.forEachEntry(new TIntObjectProcedure() + { + @Override + public boolean execute(int a, Habbo b) + { + if (b.isOnline()) + { + if (b.getHabboInfo().getRoomQueueId() == getId()) + { + b.getClient().sendResponse(new RoomAccessDeniedComposer("")); + } + } + + return true; + } + }); + + this.habboQueue.clear(); + } + } + + if (!this.scheduledComposers.isEmpty()) + { + for (ServerMessage message : scheduledComposers) + { + this.sendComposer(message); + } + + this.scheduledComposers.clear(); + } + } + + public int getId() + { + return this.id; + } + + public int getOwnerId() + { + return this.ownerId; + } + + public void setOwnerId(int ownerId) + { + this.ownerId = ownerId; + } + + public String getOwnerName() + { + return this.ownerName; + } + + public void setOwnerName(String ownerName) + { + this.ownerName = ownerName; + } + + public String getName() + { + return this.name; + } + + public String getDescription() + { + return this.description; + } + + public RoomLayout getLayout() + { + return this.layout; + } + + public void setLayout(RoomLayout layout) + { + this.layout = layout; + } + + public boolean hasCustomLayout() + { + return this.overrideModel; + } + + public void setHasCustomLayout(boolean overrideModel) + { + this.overrideModel = overrideModel; + } + + public String getPassword() + { + return this.password; + } + + public RoomState getState() + { + return this.state; + } + + public int getUsersMax() + { + return this.usersMax; + } + + public int getScore() + { + return this.score; + } + + public int getCategory() + { + return this.category; + } + + public String getFloorPaint() + { + return this.floorPaint; + } + + public String getWallPaint() + { + return this.wallPaint; + } + + public String getBackgroundPaint() + { + return this.backgroundPaint; + } + + public int getWallSize() + { + return this.wallSize; + } + + public int getWallHeight() + { + return this.wallHeight; + } + + public void setWallHeight(int wallHeight) + { + this.wallHeight = wallHeight; + } + + public int getFloorSize() + { + return this.floorSize; + } + + public String getTags() + { + return this.tags; + } + + public int getTradeMode() + { + return this.tradeMode; + } + + public boolean moveDiagonally() + { + return this.moveDiagonally; + } + + public void moveDiagonally(boolean moveDiagonally) + { + this.moveDiagonally = moveDiagonally; + this.layout.moveDiagonally(this.moveDiagonally); + this.needsUpdate = true; + } + + public int getGuildId() + { + return this.guild; + } + + public boolean hasGuild() + { + return this.guild != 0; + } + + public void setGuild(int guild) + { + this.guild = guild; + } + + public String getGuildName() + { + if (this.hasGuild()) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.guild); + + if (guild != null) + { + return guild.getName(); + } + } + + return ""; + } + + public boolean isPublicRoom() + { + return this.publicRoom; + } + + public boolean isStaffPromotedRoom() + { + return this.staffPromotedRoom; + } + + public void setStaffPromotedRoom(boolean staffPromotedRoom) + { + this.staffPromotedRoom = staffPromotedRoom; + } + + public boolean isAllowPets() + { + return this.allowPets; + } + + public boolean isAllowPetsEat() + { + return this.allowPetsEat; + } + + public boolean isAllowWalkthrough() + { + return this.allowWalkthrough; + } + + public boolean isAllowBotsWalk() + { + return this.allowBotsWalk; + } + + public boolean isAllowEffects() + { + return this.allowEffects; + } + + public void setAllowEffects(boolean allowEffects) + { + this.allowEffects = allowEffects; + } + + public boolean isHideWall() + { + return this.hideWall; + } + + public Color getBackgroundTonerColor() + { + Color color = new Color(0, 0, 0); + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i > 0; i--) + { + try + { + iterator.advance(); + HabboItem object = iterator.value(); + + if (object instanceof InteractionBackgroundToner) + { + String[] extraData = object.getExtradata().split(":"); + + if (extraData.length == 4) + { + if (extraData[0].equalsIgnoreCase("1")) + { + return Color.getHSBColor(Integer.valueOf(extraData[1]), Integer.valueOf(extraData[2]), Integer.valueOf(extraData[3])); + } + } + } + } + catch (Exception e) + { + } + } + + return color; + } + + public int getChatMode() + { + return this.chatMode; + } + + public int getChatWeight() + { + return this.chatWeight; + } + + public int getChatSpeed() + { + return this.chatSpeed; + } + + public int getChatDistance() + { + return this.chatDistance; + } + + public void setName(String name) + { + this.name = name; + + if (this.name.length() > 50) + { + this.name = this.name.substring(0, 50); + } + + if (this.hasGuild()) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.guild); + + if (guild != null) + { + guild.setRoomName(name); + } + } + } + + public void setDescription(String description) + { + this.description = description; + + if (this.description.length() > 250) + { + this.description = this.description.substring(0, 250); + } + } + + public void setPassword(String password) + { + this.password = password; + + if (this.password.length() > 20) + { + this.password = this.password.substring(0, 20); + } + } + + public void setState(RoomState state) + { + this.state = state; + } + + public void setUsersMax(int usersMax) + { + this.usersMax = usersMax; + } + + public void setScore(int score) + { + this.score = score; + } + + public void setCategory(int category) + { + this.category = category; + } + + public void setFloorPaint(String floorPaint) + { + this.floorPaint = floorPaint; + } + + public void setWallPaint(String wallPaint) + { + this.wallPaint = wallPaint; + } + + public void setBackgroundPaint(String backgroundPaint) + { + this.backgroundPaint = backgroundPaint; + } + + public void setWallSize(int wallSize) + { + this.wallSize = wallSize; + } + + public void setFloorSize(int floorSize) + { + this.floorSize = floorSize; + } + + public void setTags(String tags) + { + this.tags = tags; + } + + public void setTradeMode(int tradeMode) + { + this.tradeMode = tradeMode; + } + + public void setAllowPets(boolean allowPets) + { + this.allowPets = allowPets; + } + + public void setAllowPetsEat(boolean allowPetsEat) + { + this.allowPetsEat = allowPetsEat; + } + + public void setAllowWalkthrough(boolean allowWalkthrough) + { + this.allowWalkthrough = allowWalkthrough; + } + + public void setAllowBotsWalk(boolean allowBotsWalk) + { + this.allowBotsWalk = allowBotsWalk; + } + + public void setHideWall(boolean hideWall) + { + this.hideWall = hideWall; + } + + public void setChatMode(int chatMode) + { + this.chatMode = chatMode; + } + + public void setChatWeight(int chatWeight) + { + this.chatWeight = chatWeight; + } + + public void setChatSpeed(int chatSpeed) + { + this.chatSpeed = chatSpeed; + } + + public void setChatDistance(int chatDistance) + { + this.chatDistance = chatDistance; + } + + public int getChatProtection() + { + return this.chatProtection; + } + + public void setChatProtection(int chatProtection) + { + this.chatProtection = chatProtection; + } + + public int getMuteOption() + { + return this.muteOption; + } + + public void setMuteOption(int muteOption) + { + this.muteOption = muteOption; + } + + public int getKickOption() + { + return this.kickOption; + } + + public void setKickOption(int kickOption) + { + this.kickOption = kickOption; + } + + public int getBanOption() + { + return this.banOption; + } + + public void setBanOption(int banOption) + { + this.banOption = banOption; + } + + public int getPollId() + { + return this.pollId; + } + + public int getRollerSpeed() + { + return this.rollerSpeed; + } + + public String[] filterAnything() + { + return new String[]{ getOwnerName(), getGuildName(), getDescription(), getPromotionDesc()}; + } + + public boolean isPromoted() + { + this.promoted = this.promotion != null && this.promotion.getEndTimestamp() > Emulator.getIntUnixTimestamp(); + this.needsUpdate = true; + + return this.promoted; + } + + public RoomPromotion getPromotion() + { + return this.promotion; + } + + public String getPromotionDesc() + { + if (this.promotion != null) + { + return this.promotion.getDescription(); + } + + return ""; + } + + public void createPromotion(String title, String description) + { + this.promoted = true; + + if(this.promotion == null) + { + this.promotion = new RoomPromotion(this, title, description, Emulator.getIntUnixTimestamp() + (120 * 60)); + } + else + { + this.promotion.setTitle(title); + this.promotion.setDescription(description); + this.promotion.setEndTimestamp(Emulator.getIntUnixTimestamp() + (120 * 60)); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_promotions (room_id, title, description, end_timestamp) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE title = ?, description = ?, end_timestamp = ?")) + { + statement.setInt(1, this.id); + statement.setString(2, title); + statement.setString(3, description); + statement.setInt(4, this.promotion.getEndTimestamp()); + statement.setString(5, this.promotion.getTitle()); + statement.setString(6, this.promotion.getDescription()); + statement.setInt(7, this.promotion.getEndTimestamp()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.needsUpdate = true; + } + + public void setRollerSpeed(int rollerSpeed) + { + this.rollerSpeed = rollerSpeed; + this.rollerCycle = 0; + this.needsUpdate = true; + } + + public void setPollId(int pollId) + { + this.pollId = pollId; + } + + public boolean addGame(Game game) + { + synchronized (this.games) + { + return this.games.add(game); + } + } + + public boolean deleteGame(Game game) + { + game.stop(); + synchronized (this.games) + { + return this.games.remove(game); + } + } + + public Game getGame(Class gameType) + { + synchronized (this.games) + { + for(Game game : this.games) + { + if(gameType.isInstance(game)) + { + return game; + } + } + } + + return null; + } + + public int getUserCount() + { + return this.currentHabbos.size(); + } + + public ConcurrentHashMap getCurrentHabbos() + { + return this.currentHabbos; + } + + public Collection getHabbos() + { + return this.currentHabbos.values(); + } + + public TIntObjectMap getHabboQueue() + { + return this.habboQueue; + } + + public TIntObjectMap getFurniOwnerNames() + { + return this.furniOwnerNames; + } + + public String getFurniOwnerName(int userId) + { + return this.furniOwnerNames.get(userId); + } + + public TIntIntMap getFurniOwnerCount() + { + return this.furniOwnerCount; + } + + public TIntObjectMap getMoodlightData() + { + return this.moodlightData; + } + + public int getLastTimerReset() + { + return this.lastTimerReset; + } + + public void setLastTimerReset(int lastTimerReset) + { + this.lastTimerReset = lastTimerReset; + } + + public void addToQueue(Habbo habbo) + { + synchronized (this.habboQueue) + { + this.habboQueue.put(habbo.getHabboInfo().getId(), habbo); + } + } + + public boolean removeFromQueue(Habbo habbo) + { + try + { + this.sendComposer(new HideDoorbellComposer(habbo.getHabboInfo().getUsername()).compose()); + + synchronized (this.habboQueue) + { + return this.habboQueue.remove(habbo.getHabboInfo().getId()) != null; + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return true; + } + + public TIntObjectMap getCurrentBots() + { + return this.currentBots; + } + + public TIntObjectMap getCurrentPets() + { + return this.currentPets; + } + + public THashSet getWordFilterWords() + { + return this.wordFilterWords; + } + + public RoomSpecialTypes getRoomSpecialTypes() + { + return this.roomSpecialTypes; + } + + public boolean isPreLoaded() + { + return this.preLoaded; + } + + public boolean isLoaded() + { + return this.loaded; + } + + public void setNeedsUpdate(boolean needsUpdate) + { + this.needsUpdate = needsUpdate; + } + + public TIntArrayList getRights() + { + return rights; + } + + public boolean isMuted() + { + return this.muted; + } + + public void setMuted(boolean muted) + { + this.muted = muted; + } + + public TraxManager getTraxManager() + { + return this.traxManager; + } + + public void addHabboItem(HabboItem item) + { + if(item == null) + return; + + try + { + this.roomItems.put(item.getId(), item); + } + catch (Exception e) + { + + } + + synchronized (this.furniOwnerCount) + { + this.furniOwnerCount.put(item.getUserId(), this.furniOwnerCount.get(item.getUserId()) + 1); + } + + synchronized (this.furniOwnerNames) + { + if (!this.furniOwnerNames.containsKey(item.getUserId())) + { + HabboInfo habbo = HabboManager.getOfflineHabboInfo(item.getUserId()); + + if (habbo != null) + { + this.furniOwnerNames.put(item.getUserId(), habbo.getUsername()); + } + else + { + Emulator.getLogging().logDebugLine("Failed to find username for item (ID:" + item.getId() + ", UserID: " + item.getUserId() + ")" ); + } + } + } + + //TODO: Move this list + synchronized (this.roomSpecialTypes) + { + if (item instanceof ICycleable) + { + this.roomSpecialTypes.addCycleTask((ICycleable)item); + } + + if (item instanceof InteractionWiredTrigger) + { + this.roomSpecialTypes.addTrigger((InteractionWiredTrigger) item); + } else if (item instanceof InteractionWiredEffect) + { + this.roomSpecialTypes.addEffect((InteractionWiredEffect) item); + } else if (item instanceof InteractionWiredCondition) + { + this.roomSpecialTypes.addCondition((InteractionWiredCondition) item); + } else if (item instanceof InteractionWiredExtra) + { + this.roomSpecialTypes.addExtra((InteractionWiredExtra) item); + } else if (item instanceof InteractionBattleBanzaiTeleporter) + { + this.roomSpecialTypes.addBanzaiTeleporter((InteractionBattleBanzaiTeleporter) item); + } else if (item instanceof InteractionRoller) + { + this.roomSpecialTypes.addRoller((InteractionRoller) item); + } else if (item instanceof InteractionGameScoreboard) + { + this.roomSpecialTypes.addGameScoreboard((InteractionGameScoreboard) item); + } else if (item instanceof InteractionGameGate) + { + this.roomSpecialTypes.addGameGate((InteractionGameGate) item); + } else if (item instanceof InteractionGameTimer) + { + this.roomSpecialTypes.addGameTimer((InteractionGameTimer) item); + } else if (item instanceof InteractionFreezeExitTile) + { + this.roomSpecialTypes.addFreezeExitTile((InteractionFreezeExitTile) item); + } else if (item instanceof InteractionNest) + { + this.roomSpecialTypes.addNest((InteractionNest) item); + } else if (item instanceof InteractionPetDrink) + { + this.roomSpecialTypes.addPetDrink((InteractionPetDrink) item); + } else if (item instanceof InteractionPetFood) + { + this.roomSpecialTypes.addPetFood((InteractionPetFood) item); + } else if (item instanceof InteractionMoodLight) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionPyramid) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionMusicDisc) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionBattleBanzaiSphere) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionTalkingFurniture) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionWater) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionWaterItem) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionMuteArea) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionTagPole) + { + this.roomSpecialTypes.addUndefined(item); + } else if (item instanceof InteractionTagField) + { + this.roomSpecialTypes.addUndefined(item); + }else if (item instanceof InteractionJukeBox) + { + this.roomSpecialTypes.addUndefined(item); + }else if (item instanceof InteractionPetBreedingNest) + { + this.roomSpecialTypes.addUndefined(item); + } + else if (item instanceof InteractionBlackHole) + { + this.roomSpecialTypes.addUndefined(item); + } + else if (item instanceof InteractionWiredHighscore) + { + this.roomSpecialTypes.addUndefined(item); + } + else if (item instanceof InteractionStickyPole) + { + this.roomSpecialTypes.addUndefined(item); + } + } + } + + public HabboItem getHabboItem(int id) + { + HabboItem item; + synchronized (this.roomItems) + { + item = this.roomItems.get(id); + } + + if(item == null) + item = this.roomSpecialTypes.getBanzaiTeleporter(id); + + if(item == null) + item = this.roomSpecialTypes.getTrigger(id); + + if(item == null) + item = this.roomSpecialTypes.getEffect(id); + + if(item == null) + item = this.roomSpecialTypes.getCondition(id); + + if(item == null) + item = this.roomSpecialTypes.getGameGate(id); + + if(item == null) + item = this.roomSpecialTypes.getGameScorebord(id); + + if(item == null) + item = this.roomSpecialTypes.getGameTimer(id); + + if(item == null) + item = this.roomSpecialTypes.getFreezeExitTiles().get(id); + + if(item == null) + item = this.roomSpecialTypes.getRoller(id); + + if(item == null) + item = this.roomSpecialTypes.getNest(id); + + if(item == null) + item = this.roomSpecialTypes.getPetDrink(id); + + if(item == null) + item = this.roomSpecialTypes.getPetFood(id); + + return item; + } + + void removeHabboItem(int id) + { + this.removeHabboItem(this.getHabboItem(id)); + } + + /** + * Removes an {@see HabboItem} from the list of room items. Does not visually remove it from the room. + * @param item The item to remove. + */ + public void removeHabboItem(HabboItem item) + { + if (item != null) + { + + HabboItem i; + synchronized (this.roomItems) + { + i = this.roomItems.remove(item.getId()); + } + + if (i != null) + { + synchronized (this.furniOwnerCount) + { + synchronized (this.furniOwnerNames) + { + int count = this.furniOwnerCount.get(i.getUserId()); + + if (count > 1) + this.furniOwnerCount.put(i.getUserId(), count - 1); + else + { + this.furniOwnerCount.remove(i.getUserId()); + this.furniOwnerNames.remove(i.getUserId()); + } + } + } + + if (item instanceof ICycleable) + { + this.roomSpecialTypes.removeCycleTask((ICycleable) item); + } + + if (item instanceof InteractionBattleBanzaiTeleporter) + { + this.roomSpecialTypes.removeBanzaiTeleporter((InteractionBattleBanzaiTeleporter) item); + } + else if (item instanceof InteractionWiredTrigger) + { + this.roomSpecialTypes.removeTrigger((InteractionWiredTrigger) item); + } + else if (item instanceof InteractionWiredEffect) + { + this.roomSpecialTypes.removeEffect((InteractionWiredEffect) item); + } + else if (item instanceof InteractionWiredCondition) + { + this.roomSpecialTypes.removeCondition((InteractionWiredCondition) item); + } + else if (item instanceof InteractionWiredExtra) + { + this.roomSpecialTypes.removeExtra((InteractionWiredExtra) item); + } + else if (item instanceof InteractionRoller) + { + this.roomSpecialTypes.removeRoller((InteractionRoller) item); + } + else if (item instanceof InteractionGameScoreboard) + { + this.roomSpecialTypes.removeScoreboard((InteractionGameScoreboard) item); + } + else if (item instanceof InteractionGameGate) + { + this.roomSpecialTypes.removeGameGate((InteractionGameGate) item); + } + else if (item instanceof InteractionGameTimer) + { + this.roomSpecialTypes.removeGameTimer((InteractionGameTimer) item); + } + else if (item instanceof InteractionFreezeExitTile) + { + this.roomSpecialTypes.removeFreezeExitTile((InteractionFreezeExitTile) item); + } + else if (item instanceof InteractionNest) + { + this.roomSpecialTypes.removeNest((InteractionNest) item); + } + else if (item instanceof InteractionPetDrink) + { + this.roomSpecialTypes.removePetDrink((InteractionPetDrink) item); + } + else if (item instanceof InteractionPetFood) + { + this.roomSpecialTypes.removePetFood((InteractionPetFood) item); + } + else if (item instanceof InteractionMoodLight) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionPyramid) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionMusicDisc) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionBattleBanzaiSphere) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionTalkingFurniture) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionWaterItem) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionWater) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionMuteArea) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionTagPole) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionTagField) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionJukeBox) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionPetBreedingNest) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionBlackHole) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionWiredHighscore) + { + this.roomSpecialTypes.removeUndefined(item); + } + else if (item instanceof InteractionStickyPole) + { + this.roomSpecialTypes.removeUndefined(item); + } + } + } + } + + public THashSet getFloorItems() + { + THashSet items = new THashSet(); + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + try + { + iterator.advance(); + } + catch (Exception e) + { + break; + } + + if (iterator.value().getBaseItem().getType() == FurnitureType.FLOOR) + items.add(iterator.value()); + + } + + /*items.addAll(this.roomSpecialTypes.getBanzaiTeleporters()); + items.addAll(this.roomSpecialTypes.getNests()); + items.addAll(this.roomSpecialTypes.getPetDrinks()); + items.addAll(this.roomSpecialTypes.getPetFoods()); + items.addAll(this.roomSpecialTypes.getRollers()); + items.addAll(this.roomSpecialTypes.getTriggers()); + items.addAll(this.roomSpecialTypes.getEffects()); + items.addAll(this.roomSpecialTypes.getConditions());*/ + + return items; + + } + + public THashSet getWallItems() + { + THashSet items = new THashSet(); + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + try + { + iterator.advance(); + } + catch (Exception e) + { + break; + } + + if (iterator.value().getBaseItem().getType() == FurnitureType.WALL) + items.add(iterator.value()); + } + + return items; + + } + + public void addHabbo(Habbo habbo) + { + synchronized (this.roomUnitLock) + { + habbo.getRoomUnit().setId(this.unitCounter); + this.currentHabbos.put(habbo.getHabboInfo().getId(), habbo); + this.unitCounter++; + this.updateDatabaseUserCount(); + } + } + + public void kickHabbo(Habbo habbo, boolean alert) + { + if(alert) + { + habbo.getClient().sendResponse(new GenericErrorMessagesComposer(GenericErrorMessagesComposer.KICKED_OUT_OF_THE_ROOM)); + } + + habbo.getRoomUnit().isKicked = true; + habbo.getRoomUnit().setGoalLocation(this.layout.getDoorTile()); + + if (habbo.getRoomUnit().getPath() == null || habbo.getRoomUnit().getPath().size() <= 1 || this.isPublicRoom()) + { + habbo.getRoomUnit().setCanWalk(true); + Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, this); + } + } + + public void removeHabbo(Habbo habbo) + { + HabboItem item = getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); + + if (item != null) + { + try + { + item.onWalkOff(habbo.getRoomUnit(), this, new Object[]{}); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + synchronized (this.roomUnitLock) + { + this.currentHabbos.remove(habbo.getHabboInfo().getId()); + } + + if(habbo.getHabboInfo().getCurrentGame() != null) + { + if (this.getGame(habbo.getHabboInfo().getCurrentGame()) != null) + { + this.getGame(habbo.getHabboInfo().getCurrentGame()).removeHabbo(habbo); + } + } + + RoomTrade trade = this.getActiveTradeForHabbo(habbo); + + if(trade != null) + { + trade.stopTrade(habbo); + } + + this.updateDatabaseUserCount(); + } + + public void addBot(Bot bot) + { + synchronized (this.roomUnitLock) + { + bot.getRoomUnit().setId(this.unitCounter); + this.currentBots.put(bot.getId(), bot); + this.unitCounter++; + } + } + + public void addPet(AbstractPet pet) + { + synchronized (this.roomUnitLock) + { + pet.getRoomUnit().setId(this.unitCounter); + this.currentPets.put(pet.getId(), pet); + this.unitCounter++; + + Habbo habbo = this.getHabbo(pet.getUserId()); + if (habbo != null) + { + this.furniOwnerNames.put(pet.getUserId(), this.getHabbo(pet.getUserId()).getHabboInfo().getUsername()); + } + } + } + + public Bot getBot(int botId) + { + return this.currentBots.get(botId); + } + + public List getBots(String name) + { + List bots = new ArrayList(); + + synchronized (this.currentBots) + { + TIntObjectIterator iterator = this.currentBots.iterator(); + + for(int i = this.currentBots.size(); i-- > 0;) + { + try + { + iterator.advance(); + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + + if (iterator.value().getName().equalsIgnoreCase(name)) + bots.add(iterator.value()); + } + } + + return bots; + } + + public boolean hasBotsAt(final int x, final int y) + { + final boolean[] result = {false}; + + synchronized (this.currentBots) + { + this.currentBots.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(Bot object) + { + if (object.getRoomUnit().getX() == x && object.getRoomUnit().getY() == y) + { + result[0] = true; + return false; + } + + return true; + } + }); + } + + return result[0]; + } + + public AbstractPet getPet(int petId) + { + return this.currentPets.get(petId); + } + + public AbstractPet getPet(RoomUnit roomUnit) + { + TIntObjectIterator petIterator = this.currentPets.iterator(); + + for(int i = this.currentPets.size(); i-- > 0;) + { + try + { + petIterator.advance(); + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + + if(petIterator.value().getRoomUnit() == roomUnit) + return petIterator.value(); + } + + return null; + } + + public boolean removeBot(Bot bot) + { + synchronized (this.currentBots) + { + if (this.currentBots.containsKey(bot.getId())) + { + this.currentBots.remove(bot.getId()); + bot.getRoomUnit().setInRoom(false); + bot.setRoom(null); + this.sendComposer(new RoomUserRemoveComposer(bot.getRoomUnit()).compose()); + bot.setRoomUnit(null); + return true; + } + } + + return false; + } + + public void placePet(AbstractPet pet, short x, short y, double z, int rot) + { + synchronized (this.currentPets) + { + RoomTile tile = this.layout.getTile(x, y); + + if (tile == null) + { + tile = this.layout.getDoorTile(); + } + + pet.setRoomUnit(new RoomUnit()); + pet.setRoom(this); + pet.getRoomUnit().setLocation(tile); + pet.getRoomUnit().setRoomUnitType(RoomUnitType.PET); + pet.getRoomUnit().setCanWalk(true); + pet.getRoomUnit().setPathFinderRoom(this); + if (pet.getRoomUnit().getCurrentLocation() == null) + { + pet.getRoomUnit().setLocation(this.getLayout().getDoorTile()); + pet.getRoomUnit().setRotation(RoomUserRotation.fromValue(this.getLayout().getDoorDirection())); + } + + pet.needsUpdate = true; + this.furniOwnerNames.put(pet.getUserId(), this.getHabbo(pet.getUserId()).getHabboInfo().getUsername()); + this.addPet(pet); + this.sendComposer(new RoomPetComposer(pet).compose()); + } + } + + public AbstractPet removePet(int petId) + { + return this.currentPets.remove(petId); + } + + public boolean hasHabbosAt(int x, int y) + { + for (Habbo habbo : this.getHabbos()) + { + if (habbo.getRoomUnit().getX() == x && habbo.getRoomUnit().getY() == y) + return true; + } + return false; + } + + public boolean hasPetsAt(int x, int y) + { + synchronized (this.currentPets) + { + TIntObjectIterator petIterator = this.currentPets.iterator(); + + for (int i = this.currentPets.size(); i-- > 0; ) + { + try + { + petIterator.advance(); + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + + if (petIterator.value().getRoomUnit().getX() == x && petIterator.value().getRoomUnit().getY() == y) + return true; + } + } + + return false; + } + + public THashSet getHabbosAt(short x, short y) + { + return getHabbosAt(this.layout.getTile(x, y)); + } + + public THashSet getHabbosAt(RoomTile tile) + { + THashSet habbos = new THashSet(); + + for (Habbo habbo : this.getHabbos()) + { + if (habbo.getRoomUnit().getCurrentLocation().equals(tile)) + habbos.add(habbo); + } + + return habbos; + } + + public THashSet getHabbosOnItem(HabboItem item) + { + THashSet habbos = new THashSet(); + for(short x = item.getX(); x < item.getX() + item.getBaseItem().getLength(); x++) + { + for(short y = item.getY(); y < item.getY() + item.getBaseItem().getWidth(); y++) + { + habbos.addAll(getHabbosAt(x, y)); + } + } + + return habbos; + } + + public void teleportHabboToItem(Habbo habbo, HabboItem item) + { + this.teleportHabboToLocation(habbo, item.getX(), item.getY(), item.getZ() + item.getBaseItem().getHeight()); + } + + public void teleportHabboToLocation(Habbo habbo, short x, short y) + { + this.teleportHabboToLocation(habbo, x, y, 0.0); + } + + void teleportHabboToLocation(Habbo habbo, short x, short y, double z) + { + if (this.loaded) + { + RoomTile tile = this.layout.getTile(x, y); + habbo.getRoomUnit().setLocation(tile); + habbo.getRoomUnit().setGoalLocation(tile); + habbo.getRoomUnit().setZ(z); + this.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + } + } + + public void muteHabbo(Habbo habbo, int minutes) + { + synchronized (this.mutedHabbos) + { + this.mutedHabbos.put(habbo.getHabboInfo().getId(), Emulator.getIntUnixTimestamp() + (minutes * 60)); + } + } + + public boolean isMuted(Habbo habbo) + { + if (this.isOwner(habbo) || this.hasRights(habbo)) + return false; + + if(this.mutedHabbos.containsKey(habbo.getHabboInfo().getId())) + { + boolean time = this.mutedHabbos.get(habbo.getHabboInfo().getId()) > Emulator.getIntUnixTimestamp(); + + if (!time) + { + this.mutedHabbos.remove(habbo.getHabboInfo().getId()); + } + + return time; + } + + return false; + } + + public void habboEntered(Habbo habbo) + { + habbo.getRoomUnit().animateWalk = false; + + synchronized (this.currentBots) + { + if(habbo.getHabboInfo().getId() != this.getOwnerId()) + return; + + TIntObjectIterator botIterator = this.currentBots.iterator(); + + for (int i = this.currentBots.size(); i-- > 0; ) + { + try + { + botIterator.advance(); + + if(botIterator.value() instanceof VisitorBot) + { + ((VisitorBot)botIterator.value()).onUserEnter(habbo); + break; + } + } + catch (Exception e) + { + break; + } + } + } + } + + public void floodMuteHabbo(Habbo habbo, int timeOut) + { + habbo.getHabboStats().mutedCount++; + timeOut += (timeOut * (int)Math.ceil(Math.pow(habbo.getHabboStats().mutedCount, 2))); + habbo.getHabboStats().chatCounter = 0; + habbo.mute(timeOut); + } + + public void talk(Habbo habbo, RoomChatMessage roomChatMessage, RoomChatType chatType) + { + this.talk(habbo, roomChatMessage, chatType, false); + } + + public void talk(final Habbo habbo, final RoomChatMessage roomChatMessage, RoomChatType chatType, boolean ignoreWired) + { + if (!habbo.getHabboStats().allowTalk()) + return; + + habbo.getHabboStats().chatCounter += 2; + + if (habbo.getHabboInfo().getCurrentRoom() != this) + return; + + long millis = System.currentTimeMillis(); + if (HABBO_CHAT_DELAY) + { + if (millis - habbo.getHabboStats().lastChat < 750) + { + return; + } + } + habbo.getHabboStats().lastChat = millis; + if(roomChatMessage != null && roomChatMessage.getMessage().equalsIgnoreCase("i am a pirate")) + { + Emulator.getThreading().run(new YouAreAPirate(habbo, this)); + return; + } + + UserIdleEvent event = new UserIdleEvent(habbo, UserIdleEvent.IdleReason.TALKED, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (!event.idle) + { + this.unIdle(habbo); + } + } + + this.sendComposer(new RoomUserTypingComposer(habbo.getRoomUnit(), false).compose()); + + if(roomChatMessage == null || roomChatMessage.getMessage() == null || roomChatMessage.getMessage().equals("")) + return; + + for(HabboItem area : this.getRoomSpecialTypes().getItemsOfType(InteractionMuteArea.class)) + { + if(((InteractionMuteArea)area).inSquare(habbo.getRoomUnit().getCurrentLocation())) + { + return; + } + } + + if(!this.wordFilterWords.isEmpty()) + { + if (!habbo.hasPermission("acc_chat_no_filter")) + { + for(String string : this.wordFilterWords) + { + roomChatMessage.setMessage(roomChatMessage.getMessage().replace(string, "bobba")); + } + } + } + + if(!habbo.hasPermission("acc_nomute")) + { + if(this.isMuted() && !this.hasRights(habbo)) + { + return; + } + + if (this.isMuted(habbo)) + { + habbo.getClient().sendResponse(new MutedWhisperComposer(this.mutedHabbos.get(habbo.getHabboInfo().getId()) - Emulator.getIntUnixTimestamp())); + return; + } + } + + if (chatType != RoomChatType.WHISPER) + { + if (CommandHandler.handleCommand(habbo.getClient(), roomChatMessage.getUnfilteredMessage())) + { + WiredHandler.handle(WiredTriggerType.SAY_COMMAND, habbo.getRoomUnit(), habbo.getHabboInfo().getCurrentRoom(), new Object[]{roomChatMessage.getMessage()}); + roomChatMessage.isCommand = true; + return; + } + + if(!ignoreWired) + { + if (WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, habbo.getRoomUnit(), habbo.getHabboInfo().getCurrentRoom(), new Object[]{roomChatMessage.getMessage()})) + { + habbo.getClient().sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(roomChatMessage.getMessage(), habbo, habbo, roomChatMessage.getBubble()))); + return; + } + } + } + + ServerMessage prefixMessage = roomChatMessage.getHabbo().getHabboInfo().getRank().hasPrefix() ? new RoomUserNameChangedComposer(habbo, true).compose() : null; + ServerMessage clearPrefixMessage = prefixMessage != null ? new RoomUserNameChangedComposer(habbo).compose() : null; + + if(chatType == RoomChatType.WHISPER) + { + if (roomChatMessage.getTargetHabbo() == null) + { + return; + } + + final ServerMessage message = new RoomUserWhisperComposer(roomChatMessage).compose(); + RoomChatMessage staffChatMessage = new RoomChatMessage(roomChatMessage); + staffChatMessage.setMessage("To " + staffChatMessage.getTargetHabbo().getHabboInfo().getUsername() + ": " + staffChatMessage.getMessage()); + final ServerMessage staffMessage = new RoomUserWhisperComposer(staffChatMessage).compose(); + + for (Habbo h : this.getHabbos()) + { + if (h == roomChatMessage.getTargetHabbo() || h == habbo) + { + if (!h.getHabboStats().ignoredUsers.contains(habbo.getHabboInfo().getId())) + { + if (prefixMessage != null) + { + h.getClient().sendResponse(prefixMessage); + } + h.getClient().sendResponse(message); + + if (clearPrefixMessage != null) + { + h.getClient().sendResponse(clearPrefixMessage); + } + } + + continue; + } + if (h.hasPermission("acc_see_whispers")) + { + h.getClient().sendResponse(staffMessage); + } + + continue; + } + } + else if (chatType == RoomChatType.TALK) + { + ServerMessage message = new RoomUserTalkComposer(roomChatMessage).compose(); + boolean noChatLimit = habbo.hasPermission("acc_chat_no_limit"); + + for (Habbo h : this.getHabbos()) + { + if (h.getRoomUnit().getCurrentLocation().distance(habbo.getRoomUnit().getCurrentLocation()) <= this.chatDistance || + h.hasPermission("acc_chat_no_limit") || + h.equals(habbo) || + this.hasRights(h) || + noChatLimit) + { + if (!h.getHabboStats().ignoredUsers.contains(habbo.getHabboInfo().getId())) + { + if (prefixMessage != null) + { + h.getClient().sendResponse(prefixMessage); + } + h.getClient().sendResponse(message); + if (clearPrefixMessage != null) + { + h.getClient().sendResponse(clearPrefixMessage); + } + } + } + } + } + else if(chatType == RoomChatType.SHOUT) + { + ServerMessage message = new RoomUserShoutComposer(roomChatMessage).compose(); + + for (Habbo h : this.getHabbos()) + { + if (!h.getHabboStats().ignoredUsers.contains(habbo.getHabboInfo().getId())) + { + if (prefixMessage != null){ h.getClient().sendResponse(prefixMessage); } + h.getClient().sendResponse(message); + if (clearPrefixMessage != null){ h.getClient().sendResponse(clearPrefixMessage); } + } + } + } + + if(chatType == RoomChatType.TALK || chatType == RoomChatType.SHOUT) + { + synchronized (this.currentBots) + { + TIntObjectIterator botIterator = this.currentBots.iterator(); + + for (int i = this.currentBots.size(); i-- > 0; ) + { + try + { + botIterator.advance(); + Bot bot = botIterator.value(); + bot.onUserSay(roomChatMessage); + + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + } + } + + if(roomChatMessage.getBubble()!= RoomChatMessageBubbles.PARROT && + roomChatMessage.getBubble() != RoomChatMessageBubbles.FORTUNE_TELLER) + { + synchronized (this.roomSpecialTypes) + { + THashSet items = this.roomSpecialTypes.getItemsOfType(InteractionTalkingFurniture.class); + + for (HabboItem item : items) + { + if (this.layout.getTile(item.getX(), item.getY()).distance(habbo.getRoomUnit().getCurrentLocation()) <= Emulator.getConfig().getInt("furniture.talking.range")) + { + int count = Emulator.getConfig().getInt(item.getBaseItem().getName() + ".message.count", 0); + + if (count > 0) + { + int randomValue = Emulator.getRandom().nextInt(count + 1); + + RoomChatMessage itemMessage = new RoomChatMessage(Emulator.getTexts().getValue(item.getBaseItem().getName() + ".message." + randomValue, item.getBaseItem().getName() + ".message." + randomValue + " not found!"), habbo, RoomChatMessageBubbles.getBubble(Emulator.getConfig().getInt(item.getBaseItem().getName() + ".message.bubble"))); + + this.talk(habbo, itemMessage, chatType); + + try + { + item.onClick(habbo.getClient(), this, new Object[0]); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + } + } + } + } + } + + public THashSet getLockedTiles() + { + THashSet lockedTiles = new THashSet(); + + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + HabboItem item; + try + { + iterator.advance(); + item = iterator.value(); + } + catch (Exception e) + { + break; + } + + if (item.getBaseItem().getType() != FurnitureType.FLOOR) + continue; + + boolean found = false; + for(RoomTile tile : lockedTiles) + { + if(tile.x == item.getX() && + tile.y == item.getY()) + { + found = true; + break; + } + } + + if(!found) + { + if(item.getRotation() == 0 || item.getRotation() == 4) + { + for(short y = 0; y < item.getBaseItem().getLength(); y++) + { + for(short x = 0; x < item.getBaseItem().getWidth(); x++) + { + RoomTile tile = this.layout.getTile((short) (item.getX() + x), (short) (item.getY() + y)); + + if (tile != null) + { + lockedTiles.add(tile); + } + } + } + } + else + { + for(short y = 0; y < item.getBaseItem().getWidth(); y++) + { + for(short x = 0; x < item.getBaseItem().getLength(); x++) + { + RoomTile tile = this.layout.getTile((short) (item.getX() + x), (short) (item.getY() + y)); + + if (tile != null) + { + lockedTiles.add(tile); + } + } + } + } + } + } + + return lockedTiles; + } + + @Deprecated + public THashSet getItemsAt(int x, int y) + { + RoomTile tile = this.getLayout().getTile((short)x, (short)y); + + if (tile != null) + { + return this.getItemsAt(tile); + } + + return new THashSet(0); + } + public THashSet getItemsAt(RoomTile tile) + { + if (this.loaded) + { + if (this.tileCache.containsKey(tile)) + { + return this.tileCache.get(tile); + } + } + + THashSet items = new THashSet(0); + + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + HabboItem item; + try + { + iterator.advance(); + item = iterator.value(); + } + catch (Exception e) + { + break; + } + + if (item.getBaseItem().getType() != FurnitureType.FLOOR) + continue; + + if (item.getX() == tile.x && item.getY() == tile.y) + { + items.add(item); + } + else + { + if (item.getBaseItem().getWidth() <= 1 && item.getBaseItem().getLength() <= 1) + { + continue; + } + + THashSet tiles = this.getLayout().getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + for (RoomTile t : tiles) + { + if ((t.x == tile.x) && (t.y == tile.y) && (!items.contains(item))) + { + items.add(item); + } + } + } + } + + if (this.loaded) + { + this.tileCache.put(tile, items); + } + + return items; + } + + public THashSet getItemsAt(int x, int y, double minZ) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.getItemsAt(x, y)) + { + if(item.getZ() < minZ) + continue; + + if(item.getX() == x && item.getY() == y && item.getZ() >= minZ) + { + items.add(item); + } + else + { + if(item.getBaseItem().getWidth() <= 1 && item.getBaseItem().getLength() <= 1) + { + continue; + } + + THashSet tiles = this.getLayout().getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + for (RoomTile tile : tiles) + { + if ((tile.x == x) && (tile.y == y) && (!items.contains(item))) { + items.add(item); + } + } + } + } + return items; + } + + public THashSet getItemsAt(Class type, int x, int y) + { + THashSet items = new THashSet(); + + for(HabboItem item : this.getFloorItems()) + { + if(item.getClass().equals(type)) + { + if(item.getX() == x && item.getY() == y) + { + items.add(item); + } + else + { + if(item.getBaseItem().getWidth() <= 1 && item.getBaseItem().getLength() <= 1) + { + continue; + } + + THashSet tiles = this.getLayout().getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + for (RoomTile tile : tiles){ + if ((tile.x == x) && (tile.y == y) && (!items.contains(item))) { + items.add(item); + } + } + } + } + } + + return items; + } + + public HabboItem getTopItemAt(int x, int y) + { + return this.getTopItemAt(x, y, null); + } + + public HabboItem getTopItemAt(int x, int y, HabboItem exclude) + { + HabboItem item = null; + + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + HabboItem habboItem; + try + { + iterator.advance(); + habboItem = iterator.value(); + } + catch (Exception e) + { + break; + } + + if (habboItem.getBaseItem().getType() != FurnitureType.FLOOR) + continue; + + if (exclude != null) + { + if (exclude == habboItem) + continue; + } + + if (habboItem.getX() == x && habboItem.getY() == y) + { + if (item == null || (habboItem.getZ() + Item.getCurrentHeight(habboItem)) > (item.getZ() + Item.getCurrentHeight(item))) + { + item = habboItem; + } + } else + { + if (habboItem.getBaseItem().getWidth() <= 1 && habboItem.getBaseItem().getLength() <= 1) + { + continue; + } + + THashSet tiles = this.layout.getTilesAt( + this.layout.getTile(habboItem.getX(), habboItem.getY()), + habboItem.getBaseItem().getWidth(), + habboItem.getBaseItem().getLength(), + habboItem.getRotation()); + + for (RoomTile tile : tiles) + { + if (((tile.x == x) && (tile.y == y))) + { + if (item == null || item.getZ() < habboItem.getZ()) + item = habboItem; + } + } + } + } + + return item; + } + + public double getTopHeightAt(int x, int y) + { + HabboItem item = getTopItemAt(x, y); + + if(item != null) + return (item.getZ() + item.getBaseItem().getHeight()); + else + return this.layout.getHeightAtSquare(x, y); + } + + @Deprecated + public HabboItem getLowestChair(int x, int y) + { + RoomTile tile = this.layout.getTile((short)x, (short)y); + + if (tile != null) + { + return getLowestChair(tile); + } + + return null; + } + + public HabboItem getLowestChair(RoomTile tile) + { + HabboItem lowestChair = null; + + THashSet items = this.getItemsAt(tile); + if (items != null && !items.isEmpty()) + { + for (HabboItem item : items) + { + if (item.getBaseItem().allowSit()) + { + if (lowestChair == null || item.getZ() < lowestChair.getZ()) + { + lowestChair = item; + } + } + + if (lowestChair != null) + { + if (item.getZ() > lowestChair.getZ() && item.getZ() - lowestChair.getZ() < 1.5) + { + lowestChair = null; + } + } + } + } + + return lowestChair; + } + + public HabboItem getStackHelper(int x, int y) + { + RoomTile tile = this.getLayout().getTile((short)x, (short)y); + + if (tile != null) + { + THashSet items = this.getItemsAt(tile); + + for (HabboItem item : items) + { + if (item instanceof InteractionStackHelper) + { + return item; + } + } + } + + return null; + } + + public double getStackHeight(int x, int y, boolean calculateHeightmap) + { + if(x < 0 || y < 0) + return 0.0; + + double height = this.layout.getHeightAtSquare(x, y); + boolean canStack = true; + boolean stackHelper = false; + THashSet items = this.getItemsAt(x, y); + + if (items != null) + { + for (HabboItem item : items) + { + if (item instanceof InteractionStackHelper) + { + stackHelper = true; + height = item.getExtradata().isEmpty() ? Double.valueOf("0.0") : (Double.valueOf(item.getExtradata()) / 100); + canStack = true; + } + } + + if (!stackHelper) + { + for (HabboItem item : items) + { + if (item.getBaseItem().allowSit()) + { + canStack = false; + height = -1.0D; + break; + } + + if (!item.getBaseItem().allowStack()) + { + canStack = false; + height = -1.0D; + break; + } + + double itemHeight = (item.getBaseItem().allowSit() ? 0.0D : item.getBaseItem().getHeight()) + item.getZ(); + + if (item instanceof InteractionMultiHeight) + { + if (item.getExtradata().length() == 0) + { + item.setExtradata("0"); + } + itemHeight += Item.getCurrentHeight(item); + } + + if (itemHeight > height) + { + height = itemHeight; + } + } + } + } + + if(calculateHeightmap) + { + return (canStack ? height * 256.0D : Short.MAX_VALUE); + } + + return height; + } + + public double getStackHeight(int x, int y, boolean calculateHeightmap, HabboItem exclude) + { + if(x < 0 || y < 0) + return 0.0; + + double height = this.layout.getHeightAtSquare(x, y); + boolean canStack = true; + + THashSet items = this.getItemsAt(x, y); + if (items != null && !items.isEmpty()) + { + for (HabboItem item : items) + { + if (item == exclude) + continue; + + if (item.getBaseItem().allowSit()) + { + canStack = false; + height = 0.0D; + break; + } + + if (!item.getBaseItem().allowStack()) + { + canStack = false; + break; + } + + double itemHeight = (item.getBaseItem().allowSit() ? 0.0D : item.getBaseItem().getHeight()) + item.getZ(); + + if (item instanceof InteractionMultiHeight) + { + if (item.getExtradata().length() == 0) + { + item.setExtradata("0"); + } + itemHeight += Item.getCurrentHeight(item); + } + + if (itemHeight > height) + { + height = itemHeight; + } + } + } + + if(calculateHeightmap) + { + return (canStack ? height * 256.0D : 65535.0D); + } + + return height; + } + + public boolean hasObjectTypeAt(Class type, int x, int y) + { + THashSet items = this.getItemsAt(x, y); + + for(HabboItem item : items) + { + if(item.getClass() == type) + { + return true; + } + } + + return false; + } + + public boolean canSitOrLayAt(int x, int y) + { + if(hasHabbosAt(x, y)) + return false; + + THashSet items = getItemsAt(x, y); + + return canSitAt(items) || canLayAt(items); + } + public boolean canSitAt(int x, int y) + { + if(hasHabbosAt(x, y)) + return false; + + return this.canSitAt(this.getItemsAt(x, y)); + } + + boolean canWalkAt(RoomTile roomTile) + { + if (roomTile == null) + { + return false; + } + + if (roomTile.state == RoomTileState.BLOCKED) + return false; + + HabboItem topItem = null; + boolean canWalk = true; + THashSet items = this.getItemsAt(roomTile); + if (items != null) + { + for (HabboItem item : items) + { + if (topItem == null) + { + topItem = item; + } + + if (item.getZ() > topItem.getZ()) + { + topItem = item; + canWalk = topItem.isWalkable() || topItem.getBaseItem().allowWalk(); + } + else if (item.getZ() == topItem.getZ() && canWalk) + { + if ((!topItem.isWalkable() && !topItem.getBaseItem().allowWalk()) || (!item.getBaseItem().allowWalk() && !item.isWalkable())) + { + canWalk = false; + } + } + } + } + + return canWalk; + } + + boolean canSitAt(THashSet items) + { + if (items == null) + return false; + + HabboItem topItem = null; + HabboItem lowestSitItem = null; + boolean canSit = false; + boolean canSitUnder = false; + + for(HabboItem item : items) + { + if((lowestSitItem == null || lowestSitItem.getZ() > item.getZ()) && item.getBaseItem().allowSit()) + { + lowestSitItem = item; + } + + if(lowestSitItem != null) + { + if(item.getZ() > lowestSitItem.getZ()) + { + if(item.getZ() - lowestSitItem.getZ() > 0.8) + canSitUnder = true; + else + canSitUnder = false; + } + } + + if(topItem == null || item.getZ() > topItem.getZ()) + { + topItem = item; + canSit = false; + } + } + + if(topItem == null) + return false; + + if(lowestSitItem == null) + return false; + + if(topItem == lowestSitItem) + return true; + + return topItem.getZ() <= lowestSitItem.getZ() || (canSitUnder); + } + + public boolean canLayAt(int x, int y) + { + return this.canLayAt(this.getItemsAt(x, y)); + } + + boolean canLayAt(THashSet items) + { + if (items == null || items.isEmpty()) + return true; + + HabboItem topItem = null; + + for(HabboItem item : items) + { + if((topItem == null || item.getZ() > topItem.getZ())) + { + topItem = item; + } + } + + return (topItem == null || topItem.getBaseItem().allowLay()); + } + + public RoomTile getRandomWalkableTile() + { + for (int i = 0; i < 10; i++) + { + RoomTile tile = this.layout.getTile((short) (Math.random() * this.layout.getMapSizeX()), (short) (Math.random() * this.layout.getMapSizeY())); + if (tile.isWalkable() || this.canSitAt(tile.x, tile.y)) + { + return tile; + } + } + + return null; + } + + public Habbo getHabbo(String username) + { + for (Habbo habbo : this.getHabbos()) + { + if (habbo.getHabboInfo().getUsername().equalsIgnoreCase(username)) + return habbo; + } + return null; + } + + public Habbo getHabbo(RoomUnit roomUnit) + { + for (Habbo habbo : this.getHabbos()) + { + if (habbo.getRoomUnit() == roomUnit) + return habbo; + } + return null; + } + + public Habbo getHabbo(int userId) + { + return this.currentHabbos.get(userId); + } + + public Habbo getHabboByRoomUnitId(int roomUnitId) + { + for (Habbo habbo : this.getHabbos()) + { + if(habbo.getRoomUnit().getId() == roomUnitId) + return habbo; + } + + return null; + } + + public void sendComposer(ServerMessage message) + { + for (Habbo habbo : this.getHabbos()) + { + habbo.getClient().sendResponse(message); + } + } + + public void sendComposerToHabbosWithRights(ServerMessage message) + { + for (Habbo habbo : this.getHabbos()) + + { + if (hasRights(habbo)) + { + habbo.getClient().sendResponse(message); + } + } + } + + public void petChat(ServerMessage message) + { + for (Habbo habbo : this.getHabbos()) + { + if (!habbo.getHabboStats().ignorePets) + habbo.getClient().sendResponse(message); + } + } + + public void botChat(ServerMessage message) + { + for (Habbo habbo : this.getHabbos()) + { + if (!habbo.getHabboStats().ignoreBots) + habbo.getClient().sendResponse(message); + } + } + + private void loadRights(Connection connection) + { + this.rights.clear(); + try (PreparedStatement statement = connection.prepareStatement("SELECT user_id FROM room_rights WHERE room_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.rights.add(set.getInt("user_id")); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private void loadBans(Connection connection) + { + this.bannedHabbos.clear(); + + try (PreparedStatement statement = connection.prepareStatement("SELECT users.username, users.id, room_bans.* FROM room_bans INNER JOIN users ON room_bans.user_id = users.id WHERE ends > ? AND room_bans.room_id = ?")) + { + statement.setInt(1, Emulator.getIntUnixTimestamp()); + statement.setInt(2, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (this.bannedHabbos.containsKey(set.getInt("user_id"))) + continue; + + this.bannedHabbos.put(set.getInt("user_id"), new RoomBan(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + //TODO: Return Enum + public int guildRightLevel(Habbo habbo) + { + if(this.guild > 0 && habbo.getHabboStats().hasGuild(this.guild)) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.guild); + + if(Emulator.getGameEnvironment().getGuildManager().getOnlyAdmins(guild).get(habbo.getHabboInfo().getId()) != null) + return 3; + + if(guild.getRights() == 0) + { + return 2; + } + } + + return 0; + } + + public boolean isOwner(Habbo habbo) + { + return habbo.getHabboInfo().getId() == this.ownerId || habbo.hasPermission("acc_anyroomowner"); + } + + public boolean hasRights(Habbo habbo) + { + return isOwner(habbo) || this.rights.contains(habbo.getHabboInfo().getId()) || (habbo.getRoomUnit().getRightsLevel() != RoomRightLevels.NONE && this.currentHabbos.containsKey(habbo.getHabboInfo().getId())); + } + + public void giveRights(Habbo habbo) + { + if(habbo != null) + { + this.giveRights(habbo.getHabboInfo().getId()); + } + } + + public void giveRights(int userId) + { + if (this.rights.contains(userId)) + return; + + if(this.rights.add(userId)) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_rights VALUES (?, ?)")) + { + statement.setInt(1, this.id); + statement.setInt(2, userId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + Habbo habbo = this.getHabbo(userId); + + if(habbo != null) + { + this.refreshRightsForHabbo(habbo); + + this.sendComposer(new RoomAddRightsListComposer(this, habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername()).compose()); + } + else + { + Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.ownerId); + + if(owner != null) + { + MessengerBuddy buddy = owner.getMessenger().getFriend(userId); + + if(buddy != null) + { + this.sendComposer(new RoomAddRightsListComposer(this, userId, buddy.getUsername()).compose()); + } + } + } + } + + public void removeRights(int userId) + { + Habbo habbo = this.getHabbo(userId); + + if(Emulator.getPluginManager().fireEvent(new UserRightsTakenEvent(this.getHabbo(this.getOwnerId()), userId, habbo)).isCancelled()) + return; + + this.sendComposer(new RoomRemoveRightsListComposer(this, userId).compose()); + + if(this.rights.remove(userId)) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_rights WHERE room_id = ? AND user_id = ?")) + { + statement.setInt(1, this.id); + statement.setInt(2, userId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + if(habbo != null) + { + this.refreshRightsForHabbo(habbo); + } + } + + public void removeAllRights() + { + this.rights.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_rights WHERE room_id = ?")) + { + statement.setInt(1, this.id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.refreshRightsInRoom(); + } + + void refreshRightsInRoom() + { + Room room = this; + for (Habbo habbo : this.getHabbos()) + { + if(habbo.getHabboInfo().getCurrentRoom() == room) + { + refreshRightsForHabbo(habbo); + } + } + } + + public void refreshRightsForHabbo(Habbo habbo) + { + HabboItem item; + RoomRightLevels flatCtrl = RoomRightLevels.NONE; + if (!habbo.getHabboStats().canRentSpace()) + { + item = this.getHabboItem(habbo.getHabboStats().getRentedItemId()); + + if (item != null) + { + flatCtrl = RoomRightLevels.GUILD_ADMIN; + return; + } + } + + if (habbo.hasPermission("acc_anyroomowner")) + { + habbo.getClient().sendResponse(new RoomOwnerComposer()); + flatCtrl = RoomRightLevels.MODERATOR; + } + else if (this.isOwner(habbo)) + { + habbo.getClient().sendResponse(new RoomOwnerComposer()); + flatCtrl = RoomRightLevels.MODERATOR; + } + else if (this.hasRights(habbo) && !this.hasGuild()) + { + flatCtrl = RoomRightLevels.RIGHTS; + } + else if (this.hasGuild()) + { + int level = this.guildRightLevel(habbo); + + if(level == 3) + { + flatCtrl = RoomRightLevels.GUILD_ADMIN; + } + else if(level == 2) + { + flatCtrl = RoomRightLevels.GUILD_RIGHTS; + } + } + + + habbo.getClient().sendResponse(new RoomRightsComposer(flatCtrl)); + habbo.getRoomUnit().getStatus().put("flatctrl", flatCtrl.level + ""); + habbo.getRoomUnit().setRightsLevel(flatCtrl); + + if (flatCtrl.equals(RoomRightLevels.MODERATOR)) + { + habbo.getClient().sendResponse(new RoomRightsListComposer(this)); + } + } + + public THashMap getUsersWithRights() + { + THashMap rightsMap = new THashMap(); + + if(!this.rights.isEmpty()) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username AS username, users.id as user_id FROM room_rights INNER JOIN users ON room_rights.user_id = users.id WHERE room_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + rightsMap.put(set.getInt("user_id"), set.getString("username")); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + return rightsMap; + } + + public void unbanHabbo(int userId) + { + RoomBan ban = this.bannedHabbos.remove(userId); + + if(ban != null) + { + ban.delete(); + } + + this.sendComposer(new RoomUserUnbannedComposer(this, userId).compose()); + } + + public boolean isBanned(Habbo habbo) + { + RoomBan ban = this.bannedHabbos.get(habbo.getHabboInfo().getId()); + + boolean banned = ban != null && ban.endTimestamp > Emulator.getIntUnixTimestamp() && !habbo.hasPermission("acc_anyroomowner") && !habbo.hasPermission("acc_enteranyroom"); + + if (!banned && ban != null) + { + this.unbanHabbo(habbo.getHabboInfo().getId()); + } + + return banned; + } + + public TIntObjectHashMap getBannedHabbos() + { + return this.bannedHabbos; + } + + public void addRoomBan(RoomBan roomBan) + { + this.bannedHabbos.put(roomBan.userId, roomBan); + } + + public void makeSit(Habbo habbo) + { + if (habbo.getRoomUnit().getStatus().containsKey("sit")) + { + return; + } + + + this.dance(habbo, DanceType.NONE); + habbo.getRoomUnit().cmdSit = true; + habbo.getRoomUnit().setBodyRotation(RoomUserRotation.values()[habbo.getRoomUnit().getBodyRotation().getValue() - habbo.getRoomUnit().getBodyRotation().getValue() % 2]); + habbo.getRoomUnit().getStatus().put("sit", 0.5 + ""); + this.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + } + + public void giveEffect(Habbo habbo, int effectId) + { + if (this.currentHabbos.containsKey(habbo.getHabboInfo().getId())) + { + this.giveEffect(habbo.getRoomUnit(), effectId); + } + } + + public void giveEffect(RoomUnit roomUnit, int effectId) + { + if (this.allowEffects) + { + roomUnit.setEffectId(effectId); + this.sendComposer(new RoomUserEffectComposer(roomUnit).compose()); + } + } + + public void giveHandItem(Habbo habbo, int handItem) + { + habbo.getRoomUnit().setHandItem(handItem); + this.sendComposer(new RoomUserHandItemComposer(habbo.getRoomUnit()).compose()); + } + + public void updateItem(HabboItem item) + { + if (this.isLoaded()) + { + if (item != null && item.getRoomId() == this.id) + { + if (item.getBaseItem() != null) + { + if (item.getBaseItem().getType() == FurnitureType.FLOOR) + { + this.sendComposer(new FloorItemUpdateComposer(item).compose()); + this.updateTiles(this.getLayout().getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); + } + else if (item.getBaseItem().getType() == FurnitureType.WALL) + { + this.sendComposer(new WallItemUpdateComposer(item).compose()); + } + } + } + } + } + + public void updateItemState(HabboItem item) + { + this.sendComposer(new ItemStateComposer(item).compose()); + + if (item.getBaseItem().getType() == FurnitureType.FLOOR) + { + this.updateTiles(this.getLayout().getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); + } + } + + public int getUserFurniCount(int userId) + { + return this.furniOwnerCount.get(userId); + +// int count = 0; +// +// TIntObjectIterator iterator = this.roomItems.iterator(); +// +// for(int i = this.roomItems.size(); i-- > 0;) +// { +// try +// { +// iterator.advance(); +// +// if(iterator.value().getUserId() == userId) +// count++; +// } +// catch (NoSuchElementException e) +// { +// break; +// } +// } +// +// return count; + } + + public void ejectUserFurni(int userId) + { + THashSet items = new THashSet(); + + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + try + { + iterator.advance(); + } + catch (Exception e) + { + break; + } + + if (iterator.value().getUserId() == userId) + { + items.add(iterator.value()); + iterator.value().setRoomId(0); + } + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if (habbo != null) + { + habbo.getInventory().getItemsComponent().addItems(items); + habbo.getClient().sendResponse(new AddHabboItemComposer(items)); + } + + for (HabboItem i : items) + { + this.pickUpItem(i, null); + } + } + + public void ejectUserItem(HabboItem item) + { + this.pickUpItem(item, null); + } + + /** + * Ejects all furniture from the room not belonging to the room owner. + */ + public void ejectAll() + { + this.ejectAll(null); + } + + /** + * @param habbo The Habbo to exclude to eject its items. + */ + public void ejectAll(Habbo habbo) + { + THashMap> userItemsMap = new THashMap>(); + + synchronized (this.roomItems) + { + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + try + { + iterator.advance(); + } + catch (Exception e) + { + break; + } + + if (iterator.value().getUserId() != this.ownerId) + continue; + + if (habbo != null && iterator.value().getUserId() == habbo.getHabboInfo().getId()) + continue; + + if (userItemsMap.get(iterator.value().getUserId()) == null) + { + userItemsMap.put(iterator.value().getUserId(), new THashSet()); + } + + userItemsMap.get(iterator.value().getUserId()).add(iterator.value()); + } + } + + for (Map.Entry> entrySet : userItemsMap.entrySet()) + { + for (HabboItem i : entrySet.getValue()) + { + this.pickUpItem(i, null); + } + + Habbo user = Emulator.getGameEnvironment().getHabboManager().getHabbo(entrySet.getKey()); + + if (user != null) + { + user.getInventory().getItemsComponent().addItems(entrySet.getValue()); + user.getClient().sendResponse(new AddHabboItemComposer(entrySet.getValue())); + } + } + } + + public void refreshGuild(Guild guild) + { + if(guild.getRoomId() == this.id) + { + THashMap admins = Emulator.getGameEnvironment().getGuildManager().getOnlyAdmins(guild); + + for (Habbo habbo : this.getHabbos()) + { + GuildMember member = admins.get(habbo.getHabboInfo().getId()); + habbo.getClient().sendResponse(new GuildInfoComposer(guild, habbo.getClient(), false, member)); + } + } + + this.refreshGuildRightsInRoom(); + } + + public void refreshGuildColors(Guild guild) + { + if(guild.getRoomId() == this.id) + { + TIntObjectIterator iterator = this.roomItems.iterator(); + + for (int i = this.roomItems.size(); i-- > 0; ) + { + try + { + iterator.advance(); + } + catch (Exception e) + { + break; + } + + HabboItem habboItem = iterator.value(); + + if (habboItem != null && habboItem instanceof InteractionGuildFurni) + { + if (((InteractionGuildFurni) habboItem).getGuildId() == guild.getId()) + this.updateItem(habboItem); + } + } + } + } + + public void refreshGuildRightsInRoom() + { + for (Habbo habbo : this.getHabbos()) + { + if (habbo.getHabboInfo().getCurrentRoom() == this) + { + if (habbo.getHabboInfo().getId() != this.ownerId) + { + if (!(habbo.hasPermission("acc_anyroomowner") || habbo.hasPermission("acc_moverotate"))) + refreshRightsForHabbo(habbo); + } + } + } + } + + public void idle(Habbo habbo) + { + habbo.getRoomUnit().setIdle(); + this.sendComposer(new RoomUnitIdleComposer(habbo.getRoomUnit()).compose()); + } + + public void unIdle(Habbo habbo) + { + habbo.getRoomUnit().resetIdleTimer(); + this.sendComposer(new RoomUnitIdleComposer(habbo.getRoomUnit()).compose()); + } + + public void dance(Habbo habbo, DanceType danceType) + { + habbo.getRoomUnit().setDanceType(danceType); + this.sendComposer(new RoomUserDanceComposer(habbo.getRoomUnit()).compose()); + } + + public void addToWordFilter(String word) + { + synchronized (this.wordFilterWords) + { + if (this.wordFilterWords.contains(word)) + return; + + this.wordFilterWords.add(word); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_wordfilter VALUES (?, ?)")) + { + statement.setInt(1, this.getId()); + statement.setString(2, word); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public void removeFromWordFilter(String word) + { + synchronized (this.wordFilterWords) + { + this.wordFilterWords.remove(word); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_wordfilter WHERE room_id = ? AND word = ?")) + { + statement.setInt(1, this.getId()); + statement.setString(2, word); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public THashSet getWiredHighscoreData(WiredHighscoreScoreType scoreType, WiredHighscoreClearType clearType) + { + if(!this.wiredHighscoreData.containsKey(scoreType)) + { + this.loadWiredHighscoreData(scoreType, clearType); + } + + return this.wiredHighscoreData.get(scoreType).get(clearType); + } + + public void loadWiredHighscoreData(WiredHighscoreScoreType scoreType, WiredHighscoreClearType clearType) + { + this.wiredHighscoreData.clear(); + THashSet wiredData = new THashSet(); + + try + { + String query = "SELECT " + + "SUM(score + team_score) as total_score, " + + "COUNT(*) as wins, " + + "users.username, " + + "room_game_scores.*, " + + "GROUP_CONCAT(users.username) as usernames " + + "FROM room_game_scores " + + "INNER JOIN users ON room_game_scores.user_id = users.id " + + "WHERE room_id = ? AND game_start_timestamp >= ? "; + + int timestamp = 0; + if(clearType != WiredHighscoreClearType.ALLTIME) + { + if(clearType == WiredHighscoreClearType.MONTHLY) + { + timestamp = Emulator.getIntUnixTimestamp() - (31 * 24 * 60 * 60); + } + else if(clearType == WiredHighscoreClearType.WEEKLY) + { + timestamp = Emulator.getIntUnixTimestamp() - (7 * 24 * 60 * 60); + } + else if(clearType == WiredHighscoreClearType.DAILY) + { + timestamp = Emulator.getIntUnixTimestamp() - (24 * 60 * 60); + } + } + + /* + SELECT SUM(score + team_score) as total_score, COUNT(*) as wins, users.username, score, GROUP_CONCAT(users.username) as usernames FROM room_game_scores INNER JOIN users ON room_game_scores.user_id = users.id WHERE room_id = 0 GROUP BY game_start_timestamp, game_name, team_id ORDER BY total_score ASC, wins DESC LIMIT 10 + */ + if(scoreType == WiredHighscoreScoreType.CLASSIC) + { + query += "GROUP BY game_start_timestamp, user_id, team_id ORDER BY total_score DESC"; + } + else if(scoreType == WiredHighscoreScoreType.MOSTWIN) + { + query += "GROUP BY game_start_timestamp, game_name, team_id ORDER BY wins DESC, total_score ASC"; + } + else if(scoreType == WiredHighscoreScoreType.PERTEAM) + { + query += "GROUP BY game_start_timestamp, team_id ORDER BY team_score DESC"; + } + + query += " LIMIT " + Emulator.getConfig().getValue("wired.highscores.displaycount"); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement(query)) + { + statement.setInt(1, this.id); + statement.setInt(2, timestamp); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + wiredData.add(new WiredHighscoreData(set.getString("usernames").split(","), set.getInt("score"), set.getInt("team_score"), set.getInt("total_score"))); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + THashMap> dataMap = new THashMap>(); + dataMap.put(clearType, wiredData); + this.wiredHighscoreData.put(scoreType, dataMap); + } + + public void handleWordQuiz(Habbo habbo, String answer) + { + synchronized (this.userVotes) + { + if (!this.wordQuiz.isEmpty() && !this.hasVotedInWordQuiz(habbo)) + { + answer = answer.replace(":", ""); + + if (answer.equals("0")) + { + this.noVotes++; + } + else if (answer.equals("1")) + { + this.yesVotes++; + } + + this.sendComposer(new SimplePollAnswerComposer(habbo.getHabboInfo().getId(), answer, this.noVotes, this.yesVotes).compose()); + this.userVotes.add(habbo.getHabboInfo().getId()); + } + } + } + + public void startWordQuiz(String question, int duration) + { + if (!hasActiveWordQuiz()) + { + this.wordQuiz = question; + this.noVotes = 0; + this.yesVotes = 0; + this.userVotes.clear(); + this.wordQuizEnd = Emulator.getIntUnixTimestamp() + (duration / 1000); + this.sendComposer(new SimplePollStartComposer(duration, question).compose()); + } + } + + public boolean hasActiveWordQuiz() + { + return Emulator.getIntUnixTimestamp() < this.wordQuizEnd; + } + + public boolean hasVotedInWordQuiz(Habbo habbo) + { + return this.userVotes.contains(habbo.getHabboInfo().getId()); + } + + public void alert(String message) + { + this.sendComposer(new GenericAlertComposer(message).compose()); + } + + public int itemCount() + { + return this.roomItems.size(); + } + + public void setJukeBoxActive(boolean jukeBoxActive) + { + this.jukeboxActive = jukeBoxActive; + this.needsUpdate = true; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomBan.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomBan.java new file mode 100644 index 00000000..14de5f4c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomBan.java @@ -0,0 +1,61 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RoomBan +{ + public final int roomId; + public final int userId; + public final String username; + public final int endTimestamp; + + public RoomBan(int roomId, int userId, String username, int endTimestamp) + { + this.roomId = roomId; + this.userId = userId; + this.username = username; + this.endTimestamp = endTimestamp; + } + + public RoomBan(ResultSet set) throws SQLException + { + this.roomId = set.getInt("room_id"); + this.userId = set.getInt("user_id"); + this.username = set.getString("username"); + this.endTimestamp = set.getInt("ends"); + } + + public void insert() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_bans (room_id, user_id, ends) VALUES (?, ?, ?)")) + { + statement.setInt(1, this.roomId); + statement.setInt(2, this.userId); + statement.setInt(3, this.endTimestamp); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void delete() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_bans WHERE room_id = ? AND user_id = ?")) + { + statement.setInt(1, this.roomId); + statement.setInt(2, this.userId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomCategory.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomCategory.java new file mode 100644 index 00000000..cb95129a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomCategory.java @@ -0,0 +1,73 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.habbohotel.navigation.ListMode; + +import java.sql.ResultSet; +import java.sql.SQLException; + +@SuppressWarnings("NullableProblems") +public class RoomCategory implements Comparable { + + private int id; + private int minRank; + private String caption; + private String captionSave; + private boolean canTrade; + private int maxUserCount; + private boolean official; + private ListMode displayMode; + + public RoomCategory(ResultSet set) throws SQLException + { + this.id = set.getInt("id"); + this.minRank = set.getInt("min_rank"); + this.caption = set.getString("caption"); + this.captionSave = set.getString("caption_save"); + this.canTrade = set.getBoolean("can_trade"); + this.maxUserCount = set.getInt("max_user_count"); + this.official = set.getString("public").equals("1"); + this.displayMode = ListMode.fromType(set.getInt("list_type")); + } + + public int getId() { + return this.id; + } + + public int getMinRank() { + return this.minRank; + } + + public String getCaption() + { + return this.caption; + } + + public String getCaptionSave() + { + return this.captionSave; + } + + public boolean isCanTrade() { + return this.canTrade; + } + + public int getMaxUserCount() + { + return this.maxUserCount; + } + + public boolean isPublic() + { + return this.official; + } + + public ListMode getDisplayMode() + { + return this.displayMode; + } + + @Override + public int compareTo(RoomCategory o) { + return o.getId() - this.getId(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java new file mode 100644 index 00000000..baf0e7b8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java @@ -0,0 +1,298 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.Incoming; +import com.eu.habbo.messages.incoming.MessageHandler; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; + +public class RoomChatMessage implements Runnable, ISerialize +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean SAVE_ROOM_CHATS = false; + public static int[] BANNED_BUBBLES = {}; + + private String message; + private String unfilteredMessage; + private RoomChatMessageBubbles bubble; + private final Habbo habbo; + private Habbo targetHabbo; + private final RoomUnit roomUnit; + private byte emotion; + public boolean isCommand = false; + public boolean filtered = false; + private static final List chatColors = Arrays.asList("@red@", "@cyan@", "@blue@", "@green@", "@purple@"); + + public RoomChatMessage(MessageHandler message) + { + if(message.packet.getMessageId() == Incoming.RoomUserWhisperEvent) + { + String data = message.packet.readString(); + this.targetHabbo = message.client.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(data.split(" ")[0]); + this.message = data.substring(data.split(" ")[0].length() + 1, data.length()); + } + else + { + this.message = message.packet.readString(); + } + try + { + this.bubble = RoomChatMessageBubbles.getBubble(message.packet.readInt()); + } + catch (Exception e) + { + this.bubble = RoomChatMessageBubbles.NORMAL; + } + + if(message.client != null && message.client.getHabbo() != null && !message.client.getHabbo().hasPermission("acc_anychatcolor")) + { + for(Integer i : RoomChatMessage.BANNED_BUBBLES) + { + if(i == this.bubble.getType()) + { + this.bubble = RoomChatMessageBubbles.NORMAL; + } + } + } + + this.unfilteredMessage = this.message; + this.habbo = message.client.getHabbo(); + this.roomUnit = habbo.getRoomUnit(); + + this.checkEmotion(); + + this.filter(); + } + + public RoomChatMessage(RoomChatMessage chatMessage) + { + this.message = chatMessage.getMessage(); + this.unfilteredMessage = chatMessage.getUnfilteredMessage(); + this.habbo = chatMessage.getHabbo(); + this.targetHabbo = chatMessage.getTargetHabbo(); + this.bubble = chatMessage.getBubble(); + this.roomUnit = chatMessage.roomUnit; + this.emotion = (byte)chatMessage.getEmotion(); + } + + public RoomChatMessage(String message, RoomUnit roomUnit, RoomChatMessageBubbles bubble) + { + this.message = message; + this.unfilteredMessage = message; + this.habbo = null; + this.bubble = bubble; + this.roomUnit = roomUnit; + } + + public RoomChatMessage(String message, Habbo habbo, RoomChatMessageBubbles bubble) + { + this.message = message; + this.unfilteredMessage = message; + this.habbo = habbo; + this.bubble = bubble; + this.checkEmotion(); + this.roomUnit = habbo.getRoomUnit(); + this.message = this.message.replace("\r", "").replace("\n", ""); + + if(this.bubble.isOverridable() && this.getHabbo().getHabboStats().chatColor != RoomChatMessageBubbles.NORMAL) + this.bubble = this.getHabbo().getHabboStats().chatColor; + } + + public RoomChatMessage(String message, Habbo habbo, Habbo targetHabbo, RoomChatMessageBubbles bubble) + { + this.message = message; + this.unfilteredMessage = message; + this.habbo = habbo; + this.targetHabbo = targetHabbo; + this.bubble = bubble; + this.checkEmotion(); + this.roomUnit = this.habbo.getRoomUnit(); + this.message = this.message.replace("\r", "").replace("\n", ""); + + if(this.bubble.isOverridable() && this.getHabbo().getHabboStats().chatColor != RoomChatMessageBubbles.NORMAL) + this.bubble = this.getHabbo().getHabboStats().chatColor; + } + + private void checkEmotion() + { + if(this.message.contains(":)") || this.message.contains(":-)") || this.message.contains(":]")) + { + this.emotion = 1; + } + else if(this.message.contains(":@") || this.message.contains(">:(")) + { + this.emotion = 2; + } + else if(this.message.contains(":o") || this.message.contains(":O") || this.message.contains(":0") || this.message.contains("O.o") || this.message.contains("o.O") || this.message.contains("O.O")) + { + this.emotion = 3; + } + else if(this.message.contains(":(") || this.message.contains(":-(") || this.message.contains(":[")) + { + this.emotion = 4; + } + } + + @Override + public synchronized void run() + { + if(habbo == null) + return; + + if(SAVE_ROOM_CHATS) + { + if(this.message.length() > 255) + { + try + { + this.message = this.message.substring(0, 254); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO chatlogs_room (user_from_id, user_to_id, message, timestamp, room_id) VALUES (?, ?, ?, ?, ?)")) + { + statement.setInt(1,this.habbo.getHabboInfo().getId()); + + if(this.targetHabbo != null) + statement.setInt(2, this.targetHabbo.getHabboInfo().getId()); + else + statement.setInt(2, 0); + + statement.setString(3, this.unfilteredMessage); + statement.setInt(4, Emulator.getIntUnixTimestamp()); + + if(this.habbo.getHabboInfo().getCurrentRoom() != null) + { + statement.setInt(5, this.habbo.getHabboInfo().getCurrentRoom().getId()); + } + else + { + statement.setInt(5, 0); + } + + statement.executeUpdate(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public String getMessage() + { + return this.message; + } + + public String getUnfilteredMessage() + { + return this.unfilteredMessage; + } + + public void setMessage(String message) + { + this.message = message; + } + + public RoomChatMessageBubbles getBubble() + { + return this.bubble; + } + + public Habbo getHabbo() { + return this.habbo; + } + + public Habbo getTargetHabbo() + { + return this.targetHabbo; + } + + public int getEmotion() + { + return this.emotion; + } + + @Override + public void serialize(ServerMessage message) + { + if(this.habbo != null && this.bubble.isOverridable()) + { + if (!this.habbo.hasPermission("acc_anychatcolor")) + { + for (Integer i : RoomChatMessage.BANNED_BUBBLES) + { + if (i == this.bubble.getType()) + { + this.bubble = RoomChatMessageBubbles.NORMAL; + break; + } + } + } + } + + if (!this.getBubble().getPermission().isEmpty()) + { + if (this.habbo != null && !this.habbo.hasPermission(this.getBubble().getPermission())) + { + this.bubble = RoomChatMessageBubbles.NORMAL; + } + } + + try + { + message.appendInt(this.roomUnit.getId()); + message.appendString(this.getMessage()); + message.appendInt(this.getEmotion()); + message.appendInt(this.getBubble().getType()); + message.appendInt(0); + message.appendInt(this.getMessage().length()); + } + catch(Exception e) + { + e.printStackTrace(); + } + } + + public void filter() + { + if(!habbo.getHabboStats().hasActiveClub()) + { + for (String chatColor : chatColors) { + message = message.replace(chatColor, ""); + } + } + + if(Emulator.getConfig().getBoolean("hotel.wordfilter.enabled") && Emulator.getConfig().getBoolean("hotel.wordfilter.rooms")) + { + if(!habbo.hasPermission("acc_chat_no_filter")) + { + if (!Emulator.getGameEnvironment().getWordFilter().autoReportCheck(this)) + { + if (!Emulator.getGameEnvironment().getWordFilter().hideMessageCheck(this.message)) + { + Emulator.getGameEnvironment().getWordFilter().filter(this, this.habbo); + return; + } + } + else + { + habbo.mute(Emulator.getConfig().getInt("hotel.wordfilter.automute")); + } + + this.message = ""; + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessageBubbles.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessageBubbles.java new file mode 100644 index 00000000..0aa0b1ae --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessageBubbles.java @@ -0,0 +1,89 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomChatMessageBubbles +{ + NORMAL(0, "", true), + ALERT(1, "", true), + BOT(2, "", true), + RED(3, "", true), + BLUE(4, "", true), + YELLOW(5, "", true), + GREEN(6, "", true), + BLACK(7, "", true), + FORTUNE_TELLER(8, "", false), + ZOMBIE_ARM(9, "", true), + SKELETON(10, "", true), + LIGHT_BLUE(11, "", true), + PINK(12, "", true), + PURPLE(13, "", true), + DARK_YEWLLOW(14, "", true), + DARK_BLUE(15, "", true), + HEARTS(16, "", true), + ROSES(17, "", true), + UNUSED(18, "", true), //? + PIG(19, "", true), + DOG(20, "", true), + BLAZE_IT(21, "", true), + DRAGON(22, "", true), + STAFF(23, "", false), + BATS(24, "", true), + MESSENGER(25, "", true), + STEAMPUNK(26, "", true), + THUNDER(27, "", true), + PARROT(28, "", false), + PIRATE(29, "", false), + BOT_LIGHT_BLUE(30, "", true), + BOT_LIGHT_GRAY(31, "", true), + SCARY_THING(32, "", true), + FRANK(33, "", true), + WIRED(34, "", false), + GOAT(35, "", true), + SANTA(36, "", true), + AMBASSADOR(37, "acc_ambassador", false), + UNKNOWN_38(38, "", true), + UNKNOWN_39(39, "", true), + UNKNOWN_40(40, "", true), + UNKNOWN_41(41, "", true), + UNKNOWN_42(42, "", true), + UNKNOWN_43(43, "", true), + UNKNOWN_44(44, "", true), + UNKNOWN_45(45, "", true); + + private final int type; + private final String permission; + private final boolean overridable; + + RoomChatMessageBubbles(int type, String permission, boolean overridable) + { + this.type = type; + this.permission = permission; + this.overridable = overridable; + } + + public int getType() + { + return this.type; + } + + public String getPermission() + { + return this.permission; + } + + public boolean isOverridable() + { + return this.overridable; + } + + public static RoomChatMessageBubbles getBubble(int bubbleId) + { + try + { + return values()[bubbleId]; + } + catch (Exception e) + { + return NORMAL; + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatType.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatType.java new file mode 100644 index 00000000..641e35c5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatType.java @@ -0,0 +1,8 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomChatType +{ + TALK, + SHOUT, + WHISPER +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java new file mode 100644 index 00000000..884261be --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java @@ -0,0 +1,636 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; +import gnu.trove.set.hash.THashSet; + +import java.awt.*; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; + +public class RoomLayout +{ + public static double MAXIMUM_STEP_HEIGHT = 1.1; + public static boolean ALLOW_FALLING = true; + protected static final int BASICMOVEMENTCOST = 10; + protected static final int DIAGONALMOVEMENTCOST = 14; + + public boolean CANMOVEDIAGONALY = true; + private String name; + private short doorX; + private short doorY; + private short doorZ; + private int doorDirection; + private String heightmap; + private int mapSize; + private int mapSizeX; + private int mapSizeY; + private RoomTile[][] roomTiles; + private RoomTile doorTile; + private Room room; + + public RoomLayout(ResultSet set, Room room) throws SQLException + { + this.room = room; + try + { + this.name = set.getString("name"); + this.doorX = set.getShort("door_x"); + this.doorY = set.getShort("door_y"); + + this.doorDirection = set.getInt("door_dir"); + this.heightmap = set.getString("heightmap"); + + this.parse(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public void parse() + { + String[] modelTemp = this.heightmap.replace("\n", "").split(Character.toString('\r')); + + this.mapSize = 0; + this.mapSizeX = modelTemp[0].length(); + this.mapSizeY = modelTemp.length; + this.roomTiles = new RoomTile[this.mapSizeX][this.mapSizeY]; + + for (short y = 0; y < this.mapSizeY; y++) + { + if(modelTemp[y].isEmpty() || modelTemp[y].equalsIgnoreCase("\r")) + { + continue; + } + + for (short x = 0; x < this.mapSizeX; x++) + { + if(modelTemp[y].length() != this.mapSizeX) + { + break; + } + + String square = modelTemp[y].substring(x, x + 1).trim().toLowerCase(); + RoomTileState state = RoomTileState.OPEN; + short height = 0; + if (square.equalsIgnoreCase("x")) + { + state = RoomTileState.BLOCKED; + } + else + { + if (square.isEmpty()) { + height = 0; + } + else if (Emulator.isNumeric(square)) + { + height = Short.parseShort(square); + } + else + { + height = (short) (10 + "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(square.toUpperCase())); + } + } + this.mapSize += 1; + + this.roomTiles[x][y] = new RoomTile(x, y, height, state, true, true); + } + } + + this.doorTile = this.roomTiles[this.doorX][this.doorY]; + + if (this.doorTile != null) + { + this.doorTile.allowStack(false); + RoomTile doorFrontTile = this.getTileInFront(this.doorTile, this.doorDirection); + + if (doorFrontTile != null && this.tileExists(doorFrontTile.x, doorFrontTile.y)) + { + if (this.roomTiles[doorFrontTile.x][doorFrontTile.y].state != RoomTileState.BLOCKED) + { + if (this.doorZ != this.roomTiles[doorFrontTile.x][doorFrontTile.y].z || this.roomTiles[this.doorX][this.doorY].state != this.roomTiles[doorFrontTile.x][doorFrontTile.y].state) + { + this.doorZ = this.roomTiles[doorFrontTile.x][doorFrontTile.y].z; + this.roomTiles[this.doorX][this.doorY].state = RoomTileState.OPEN; + } + } + } + } + } + + public String getName() + { + return name; + } + + public short getDoorX() + { + return this.doorX; + } + + public void setDoorX(short doorX) + { + this.doorX = doorX; + } + + public short getDoorY() + { + return this.doorY; + } + + public void setDoorY(short doorY) + { + this.doorY = doorY; + } + + public int getDoorZ() + { + return this.doorZ; + } + + public RoomTile getDoorTile() + { + return this.doorTile; + } + + public int getDoorDirection() + { + return this.doorDirection; + } + + public void setDoorDirection(int doorDirection) + { + this.doorDirection = doorDirection; + } + + public void setHeightmap(String heightMap) + { + this.heightmap = heightMap; + } + + public String getHeightmap() + { + return this.heightmap; + } + + public int getMapSize() + { + return this.mapSize; + } + + public int getMapSizeX() + { + return this.mapSizeX; + } + + public int getMapSizeY() + { + return this.mapSizeY; + } + + public short getHeightAtSquare(int x, int y) + { + if(x < 0 || + y < 0 || + x >= this.getMapSizeX() || + y >= this.getMapSizeY()) + return 0; + + return this.roomTiles[x][y].z; + } + + public double getStackHeightAtSquare(int x, int y) + { + if(x < 0 || + y < 0 || + x >= this.getMapSizeX() || + y >= this.getMapSizeY()) + return 0; + + return this.roomTiles[x][y].getStackHeight(); + } + + public double getRelativeHeightAtSquare(int x, int y) + { + if(x < 0 || + y < 0 || + x >= this.getMapSizeX() || + y >= this.getMapSizeY()) + return 0; + + return this.roomTiles[x][y].relativeHeight(); + } + + public RoomTile getTile(short x, short y) + { + if (tileExists(x, y)) + { + return this.roomTiles[x][y]; + } + + return null; + } + + public boolean tileExists(short x, short y) + { + return !(x < 0 || y < 0 || x >= this.getMapSizeX() || y >= this.getMapSizeY()); + } + + public boolean tileWalkable(short x, short y) + { + return this.tileExists(x, y) && this.roomTiles[x][y].state == RoomTileState.OPEN && this.roomTiles[x][y].isWalkable(); + } + + public RoomTileState getStateAt(short x, short y) + { + return this.roomTiles[x][y].state; + } + public String getRelativeMap() + { + return this.heightmap.replace("\r\n", "\r").substring(0, this.heightmap.replace("\r\n", "\r").length()); + } + + public final Deque findPath(RoomTile oldTile, RoomTile newTile) + { + LinkedList openList = new LinkedList(); + try + { + if (this.room == null || !this.room.isLoaded() || oldTile == null || newTile == null || oldTile.equals(newTile) || (!newTile.isWalkable() && !this.room.canSitOrLayAt(newTile.x, newTile.y))) + return openList; + + List closedList = new LinkedList(); + + openList.add(oldTile.copy()); + + long startMillis = System.currentTimeMillis(); + while (true) + { + if (System.currentTimeMillis() - startMillis > 25) + { + return new LinkedList<>(); + } + + RoomTile current = lowestFInOpen(openList); + closedList.add(current); + openList.remove(current); + + if ((current.x == newTile.x) && (current.y == newTile.y)) + { + return calcPath(findTile(openList, (short)oldTile.x, (short)oldTile.y), current); + } + + List adjacentNodes = getAdjacent(openList, current, newTile.x, newTile.y); + + for (RoomTile currentAdj : adjacentNodes) + { + if (!currentAdj.isWalkable() && !(currentAdj.equals(newTile) && room.canSitOrLayAt(currentAdj.x, currentAdj.y))){ closedList.add(currentAdj); openList.remove(currentAdj); continue;} + //if (!room.getLayout().tileWalkable((short) currentAdj.x, (short) currentAdj.y)) continue; + + double height = (room.getLayout().getStackHeightAtSquare(currentAdj.x, currentAdj.y) - room.getLayout().getStackHeightAtSquare(current.x, current.y)); + + if ((!ALLOW_FALLING && height < -MAXIMUM_STEP_HEIGHT) || (height > MAXIMUM_STEP_HEIGHT && !room.canLayAt(currentAdj.x, currentAdj.y))) + continue; + + if (!this.room.isAllowWalkthrough() && room.hasHabbosAt(currentAdj.x, currentAdj.y)) continue; + + //if (room.hasPetsAt(currentAdj.x, currentAdj.y)) continue; + + if (!openList.contains(currentAdj) || (currentAdj.x == newTile.x && currentAdj.y == newTile.y && (room.canSitOrLayAt(newTile.x, newTile.y) && !room.hasHabbosAt(newTile.x, newTile.y)))) + { + currentAdj.setPrevious(current); + currentAdj.sethCosts(findTile(openList, (short)newTile.x, (short)newTile.y)); + currentAdj.setgCosts(current); + openList.add(currentAdj); + } + else if (currentAdj.getgCosts() > currentAdj.calculategCosts(current)) + { + currentAdj.setPrevious(current); + currentAdj.setgCosts(current); + } + } + if (openList.isEmpty()) + { + return new LinkedList(); + } + } + } + catch(Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + return new LinkedList<>(); + } + + private RoomTile findTile(List tiles, short x, short y) + { + for (RoomTile tile : tiles) + { + if (x == tile.x && y == tile.y) + { + return tile; + } + } + + RoomTile tile = this.getTile(x, y); + + if (tile != null) + { + return tile.copy(); + } + return null; + } + + private Deque calcPath(RoomTile start, RoomTile goal) + { + LinkedList path = new LinkedList(); + if (start == null) + return path; + + RoomTile curr = goal; + while (curr != null) + { + path.addFirst(curr); + curr = curr.getPrevious(); + if ((curr != null) && (start != null) && (curr.equals(start))) { + return path; + } + } + return path; + } + + private RoomTile lowestFInOpen(List openList) + { + if(openList == null) + return null; + + RoomTile cheapest = openList.get(0); + for (RoomTile anOpenList : openList) + { + if (anOpenList.getfCosts() < cheapest.getfCosts()) + { + cheapest = anOpenList; + } + } + return cheapest; + } + + private List getAdjacent(List closedList, RoomTile node, int newX, int newY) + { + short x = node.x; + short y = node.y; + List adj = new LinkedList(); + boolean canSitOrLayAt = room.canSitOrLayAt(newX, newY); + if (x > 0) + { + RoomTile temp = findTile(adj, (short) (x - 1), y); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(false); + adj.add(temp); + } + } + if (x < this.mapSizeX) + { + RoomTile temp = findTile(closedList, (short) (x + 1), y); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(false); + adj.add(temp); + } + } + if (y > 0) + { + RoomTile temp = findTile(closedList, x, (short) (y - 1)); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(false); + adj.add(temp); + } + } + if (y < this.mapSizeY) + { + RoomTile temp = findTile(closedList, x, (short) (y + 1)); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(false); + adj.add(temp); + } + } + if (CANMOVEDIAGONALY) + { + if ((x < this.mapSizeX) && (y < this.mapSizeY)) + { + RoomTile temp = findTile(closedList, (short) (x + 1), (short) (y + 1)); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(true); + adj.add(temp); + } + } + if ((x > 0) && (y > 0)) + { + RoomTile temp = findTile(closedList, (short) (x - 1), (short) (y - 1)); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(true); + adj.add(temp); + } + } + if ((x > 0) && (y < this.mapSizeY)) + { + RoomTile temp = findTile(closedList, (short) (x - 1), (short) (y + 1)); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(true); + adj.add(temp); + } + } + if ((x < this.mapSizeX) && (y > 0)) + { + RoomTile temp = findTile(closedList, (short) (x + 1), (short) (y - 1)); + if (temp != null && (((temp.isWalkable()) && (!closedList.contains(temp))) || (temp.x == newX && temp.y == newY && canSitOrLayAt))) + { + temp.isDiagonally(true); + adj.add(temp); + } + } + } + return adj; + } + + public void moveDiagonally(boolean value) + { + this.CANMOVEDIAGONALY = value; + } + + public static boolean squareInSquare(Rectangle outerSquare, Rectangle innerSquare) + { + if(outerSquare.x > innerSquare.x) + return false; + + if(outerSquare.y > innerSquare.y) + return false; + + if(outerSquare.x + outerSquare.width < innerSquare.x + innerSquare.width) + return false; + + if(outerSquare.y + outerSquare.height < innerSquare.y + innerSquare.height) + return false; + + return true; + } + + public static boolean pointInSquare(int x1, int y1, int x2, int y2, int pointX, int pointY) + { + return (pointX >= x1 && pointY >= y1) && (pointX <= x2 && pointY <= y2); + } + + public static boolean tilesAdjecent(RoomTile one, RoomTile two) + { + return !(one == null || two == null) && !(Math.abs(one.x - two.x) > 1) && !(Math.abs(one.y - two.y) > 1); + } + + public RoomTile getTileInFront(RoomTile tile, int rotation) + { + return this.getTileInFront(tile, rotation, 0); + } + + public RoomTile getTileInFront(RoomTile tile, int rotation, int offset) + { + int offsetX = 0; + int offsetY = 0; + + rotation = rotation % 8; + switch (rotation) + { + case 0: offsetY--; break; + case 1: offsetX++; offsetY--; break; + case 2: offsetX++; break; + case 3: offsetX++; offsetY++; break; + case 4: offsetY++; break; + case 5: offsetX--; offsetY++; break; + case 6: offsetX--; break; + case 7: offsetX--; offsetY--; break; + } + + short x = tile.x; + short y = tile.y; + + for (int i = 0; i <= offset; i++) + { + x += offsetX; + y += offsetY; + } + + return this.getTile(x, y); + } + + public List getTilesInFront(RoomTile tile, int rotation, int amount) + { + List tiles = new ArrayList<>(amount); + RoomTile previous = tile; + for (int i = 0; i < amount; i++) + { + RoomTile t = this.getTileInFront(previous, rotation, 1); + + if (t != null) + { + previous = t; + tiles.add(t); + } + else + { + break; + } + } + + return tiles; + } + + public List getTilesAround(RoomTile tile) + { + List tiles = new ArrayList(8); + + if (tile != null) + { + for (int i = 0; i < 8; i++) + { + RoomTile t = this.getTileInFront(tile, i); + if (t != null) + { + tiles.add(t); + } + } + } + + return tiles; + } + + public static Rectangle getRectangle(int x, int y, int width, int length, int rotation) + { + rotation = (rotation % 8); + + if(rotation == 2 || rotation == 6) + { + return new Rectangle(x, y, length, width); + } + + return new Rectangle(x, y, width, length); + } + + public THashSet getTilesAt(RoomTile tile, int width, int length, int rotation) + { + THashSet pointList = new THashSet(width * length, 0.1f); + + if (tile != null) + { + if (rotation == 0 || rotation == 4) + { + for (short i = tile.x; i <= (tile.x + (width - 1)); i++) + { + for (short j = tile.y; j <= (tile.y + (length - 1)); j++) + { + RoomTile t = this.getTile(i, j); + + if (t != null) + { + pointList.add(t); + } + } + } + } + else if (rotation == 2 || rotation == 6) + { + for (short i = tile.x; i <= (tile.x + (length - 1)); i++) + { + for (short j = tile.y; j <= (tile.y + (width - 1)); j++) + { + RoomTile t = this.getTile(i, j); + + if (t != null) + { + pointList.add(t); + } + } + } + } + } + + return pointList; + } + + public static boolean tilesAdjecent(RoomTile tile, RoomTile comparator, int width, int length, int rotation) + { + Rectangle rectangle = getRectangle(comparator.x, comparator.y, width, length, rotation); + rectangle = new Rectangle(rectangle.x - 1, rectangle.y -1, rectangle.width + 2, rectangle.height + 2); + + return rectangle.contains(tile.x, tile.y); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java new file mode 100644 index 00000000..50244566 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -0,0 +1,1727 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.RoomUserPetComposer; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.navigation.NavigatorFilterComparator; +import com.eu.habbo.habbohotel.navigation.NavigatorFilterField; +import com.eu.habbo.habbohotel.navigation.NavigatorManager; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.PetData; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.polls.Poll; +import com.eu.habbo.habbohotel.polls.PollManager; +import com.eu.habbo.habbohotel.users.*; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.incoming.users.UserNuxEvent; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericErrorMessagesComposer; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewComposer; +import com.eu.habbo.messages.outgoing.polls.PollStartComposer; +import com.eu.habbo.messages.outgoing.polls.infobus.SimplePollAnswersComposer; +import com.eu.habbo.messages.outgoing.polls.infobus.SimplePollStartComposer; +import com.eu.habbo.messages.outgoing.rooms.*; +import com.eu.habbo.messages.outgoing.rooms.items.RoomFloorItemsComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RoomWallItemsComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetComposer; +import com.eu.habbo.messages.outgoing.rooms.promotions.RoomPromotionMessageComposer; +import com.eu.habbo.messages.outgoing.rooms.users.*; +import com.eu.habbo.messages.outgoing.users.MutedWhisperComposer; +import com.eu.habbo.plugin.events.navigator.NavigatorRoomCreatedEvent; +import com.eu.habbo.plugin.events.rooms.RoomUncachedEvent; +import com.eu.habbo.plugin.events.users.UserEnterRoomEvent; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TIntProcedure; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class RoomManager +{ + //Configuration. Loaded from database & updated accordingly. + public static int MAXIMUM_ROOMS_USER = 25; + public static int MAXIMUM_ROOMS_VIP = 35; + public static int HOME_ROOM_ID = 0; + + private final THashMap roomCategories; + private final List mapNames; + private final ConcurrentHashMap activeRooms; + + public RoomManager() + { + long millis = System.currentTimeMillis(); + this.roomCategories = new THashMap(); + this.mapNames = new ArrayList(); + this.activeRooms = new ConcurrentHashMap(); + this.loadRoomCategories(); + this.loadRoomModels(); + + Emulator.getLogging().logStart("Room Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void loadRoomModels() + { + this.mapNames.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM room_models")) + { + while(set.next()) + { + this.mapNames.add(set.getString("name")); + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public CustomRoomLayout loadCustomLayout(Room room) + { + RoomLayout layout = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM room_models_custom WHERE id = ? LIMIT 1")) + { + statement.setInt(1, room.getId()); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + layout = new CustomRoomLayout(set, room); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return (CustomRoomLayout) layout; + } + + private void loadRoomCategories() + { + this.roomCategories.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM navigator_flatcats")) + { + while(set.next()) + { + this.roomCategories.put(set.getInt("id"), new RoomCategory(set)); + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void loadPublicRooms() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM rooms WHERE is_public = ? OR is_staff_picked = ? ORDER BY id DESC")) + { + statement.setString(1, "1"); + statement.setString(2, "1"); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Room room = new Room(set); + room.preventUncaching = true; + this.activeRooms.put(set.getInt("id"), room); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private static final int page = 0; + public THashMap> findRooms(NavigatorFilterField filterField, String value, int category) + { + THashMap> rooms = new THashMap>(); + String query = filterField.databaseQuery + " AND rooms.state != 'invisible' " + (category >= 0 ? "AND rooms.category = '" + category + "'" : "") + " ORDER BY rooms.users, rooms.id DESC LIMIT " + (page * NavigatorManager.MAXIMUM_RESULTS_PER_PAGE) + "" + ((page * NavigatorManager.MAXIMUM_RESULTS_PER_PAGE) + NavigatorManager.MAXIMUM_RESULTS_PER_PAGE); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement(query)) + { + statement.setString(1, (filterField.comparator == NavigatorFilterComparator.EQUALS ? value : "%" + value + "%")); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Room room = this.activeRooms.get(set.getInt("id")); + + if (room == null) + { + room = new Room(set); + this.activeRooms.put(set.getInt("id"), room); + } + + if (!rooms.containsKey(set.getInt("category"))) + { + rooms.put(set.getInt("category"), new ArrayList()); + } + + rooms.get(set.getInt("category")).add(room); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return rooms; + } + + public RoomCategory getCategory(int id) + { + for (RoomCategory category : this.roomCategories.values()) + { + if (category.getId() == id) + return category; + } + + return null; + } + + public RoomCategory getCategory(String name) + { + for (RoomCategory category : this.roomCategories.values()) + { + if (category.getCaption().equalsIgnoreCase(name)) + { + return category; + } + } + + return null; + } + + public RoomCategory getCategoryBySafeCaption(String safeCaption) + { + for (RoomCategory category : this.roomCategories.values()) + { + if (category.getCaptionSave().equalsIgnoreCase(safeCaption)) + { + return category; + } + } + + return null; + } + + public List roomCategoriesForHabbo(Habbo habbo) + { + List categories = new ArrayList(); + for(RoomCategory category : this.roomCategories.values()) + { + if(category.getMinRank() <= habbo.getHabboInfo().getRank().getId()) + categories.add(category); + } + + Collections.sort(categories); + + return categories; + } + + public boolean hasCategory(int categoryId, Habbo habbo) + { + for(RoomCategory category : this.roomCategories.values()) + { + if(category.getId() == categoryId) + { + if(category.getMinRank() <= habbo.getHabboInfo().getRank().getId()) + { + return true; + } + } + } + + return false; + } + + public THashMap getRoomCategories() + { + return this.roomCategories; + } + + public List getRoomsByScore() + { + List rooms = new ArrayList(); + rooms.addAll(this.activeRooms.values()); + Collections.sort(rooms, Room.SORT_SCORE); + + return rooms; + } + + public List getActiveRooms(int categoryId) + { + List rooms = new ArrayList(); + for (Room room : this.activeRooms.values()) + { + if (categoryId == room.getCategory() || categoryId == -1) + rooms.add(room); + } + Collections.sort(rooms); + return rooms; + } + + //TODO Move to HabboInfo class. + public List getRoomsForHabbo(Habbo habbo) + { + List rooms = new ArrayList(); + for(Room room : this.activeRooms.values()) + { + if(room.getOwnerId() == habbo.getHabboInfo().getId()) + rooms.add(room); + } + Collections.sort(rooms, Room.SORT_ID); + return rooms; + } + + public List getRoomsForHabbo(String username) + { + Habbo h = Emulator.getGameEnvironment().getHabboManager().getHabbo(username); + if(h != null) + { + return getRoomsForHabbo(h); + } + + List rooms = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM rooms WHERE owner_name = ? ORDER BY id DESC LIMIT 25")) + { + statement.setString(1, username); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + rooms.add(this.loadRoom(set.getInt("id"))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return rooms; + } + + public Room loadRoom(int id) + { + Room room = null; + + if(this.activeRooms.containsKey(id)) + { + room = this.activeRooms.get(id); + + if (room.isPreLoaded() && !room.isLoaded()) + { + room.loadData(); + } + + return room; + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM rooms WHERE id = ? LIMIT 1")) + { + statement.setInt(1, id); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + room = new Room(set); + room.loadData(); + } + } + + if(room != null) + { + this.activeRooms.put(room.getId(), room); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return room; + } + + /** + * Creates and preloads a room. + * @param ownerId + * @param ownerName + * @param name + * @param description + * @param modelName + * @param usersMax + * @param categoryId + * @return + */ + public Room createRoom(int ownerId, String ownerName, String name, String description, String modelName, int usersMax, int categoryId) + { + Room room = null; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO rooms (owner_id, owner_name, name, description, model, users_max, category) VALUES (?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, ownerId); + statement.setString(2, ownerName); + statement.setString(3, name); + statement.setString(4, description); + statement.setString(5, modelName); + statement.setInt(6, usersMax); + statement.setInt(7, categoryId); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + room = this.loadRoom(set.getInt(1)); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return room; + } + + /** + * Creates a room for the given Habbo and also preloads the room. + * @param habbo + * @param name + * @param description + * @param modelName + * @param usersMax + * @param categoryId + * @return + */ + public Room createRoomForHabbo(Habbo habbo, String name, String description, String modelName, int usersMax, int categoryId) + { + Room room = this.createRoom(habbo.getHabboInfo().getId(), habbo.getHabboInfo().getUsername(), name, description, modelName, usersMax, categoryId); + + Emulator.getPluginManager().fireEvent(new NavigatorRoomCreatedEvent(habbo, room)); + + return room; + } + + public void loadRoomsForHabbo(Habbo habbo) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM rooms WHERE owner_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (!this.activeRooms.containsKey(set.getInt("id"))) + this.activeRooms.put(set.getInt("id"), new Room(set)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void unloadRoomsForHabbo(Habbo habbo) + { + List roomsToDispose = new ArrayList(); + for(Room room : this.activeRooms.values()) + { + if(!room.isPublicRoom() && !room.isStaffPromotedRoom() && room.getOwnerId() == habbo.getHabboInfo().getId() && room.getUserCount() == 0) + { + roomsToDispose.add(room); + } + } + + for(Room room : roomsToDispose) + { + if (Emulator.getPluginManager().fireEvent(new RoomUncachedEvent(room)).isCancelled()) + continue; + + this.activeRooms.remove(room.getId()); + room.dispose(); + } + } + + public void clearInactiveRooms() + { + THashSet roomsToDispose = new THashSet(); + for(Room room : this.activeRooms.values()) + { + if(!room.isPublicRoom() && !room.isStaffPromotedRoom() && !Emulator.getGameServer().getGameClientManager().containsHabbo(room.getOwnerId()) && room.isPreLoaded()) + { + roomsToDispose.add(room); + } + } + + for(Room room : roomsToDispose) + { + if(room.getUserCount() == 0) + this.activeRooms.remove(room.getId()); + room.dispose(); + } + } + + public boolean layoutExists(String name) + { + return this.mapNames.contains(name); + } + + public RoomLayout loadLayout(String name, Room room) + { + RoomLayout layout = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM room_models WHERE name LIKE ? LIMIT 1")) + { + statement.setString(1, name); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + layout = new RoomLayout(set, room); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return layout; + } + + public void unloadRoom(Room room) + { + room.dispose(); + } + + public void voteForRoom(Habbo habbo, Room room) + { + if(habbo.getHabboInfo().getCurrentRoom() != null && room != null && habbo.getHabboInfo().getCurrentRoom() == room) + { + if(this.hasVotedForRoom(habbo, room)) + return; + + room.setScore(room.getScore() + 1); + room.setNeedsUpdate(true); + habbo.getHabboStats().votedRooms.push(room.getId()); + for(Habbo h : room.getHabbos()) + { + h.getClient().sendResponse(new RoomScoreComposer(room.getScore(), !this.hasVotedForRoom(h, room))); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_votes VALUES (?, ?)")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, room.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + boolean hasVotedForRoom(Habbo habbo, Room room) + { + if(room.getOwnerId() == habbo.getHabboInfo().getId()) + return true; + + for(int i : habbo.getHabboStats().votedRooms.toArray()) + { + if(i == room.getId()) + return true; + } + + return false; + } + + public Room getRoom(int roomId) + { + return this.activeRooms.get(roomId); + } + + public ArrayList getActiveRooms() + { + return new ArrayList(this.activeRooms.values()); + } + + public int loadedRoomsCount() + { + return this.activeRooms.size(); + } + + public void enterRoom(Habbo habbo, int roomId, String password) + { + this.enterRoom(habbo, roomId, password, false, null); + } + + public void enterRoom(Habbo habbo, int roomId, String password, boolean overrideChecks) + { + this.enterRoom(habbo, roomId, password, overrideChecks, null); + } + + public void enterRoom(Habbo habbo, int roomId, String password, boolean overrideChecks, RoomTile doorLocation) + { + Room room = loadRoom(roomId); + + if(room == null) + return; + + if (habbo.getHabboInfo().getLoadingRoom() != 0 && room.getId() != habbo.getHabboInfo().getLoadingRoom()) + { + habbo.getClient().sendResponse(new HotelViewComposer()); + habbo.getHabboInfo().setLoadingRoom(0); + return; + } + + if(Emulator.getPluginManager().fireEvent(new UserEnterRoomEvent(habbo, room)).isCancelled()) + { + if(habbo.getHabboInfo().getCurrentRoom() == null) + { + habbo.getClient().sendResponse(new HotelViewComposer()); + habbo.getHabboInfo().setLoadingRoom(0); + return; + } + } + + if (room.isBanned(habbo) && !habbo.hasPermission("acc_anyroomowner") && !habbo.hasPermission("acc_enteranyroom")) + { + habbo.getClient().sendResponse(new RoomEnterErrorComposer(RoomEnterErrorComposer.ROOM_ERROR_BANNED)); + return; + } + + if (habbo.getHabboInfo().getRoomQueueId() != roomId) + { + Room queRoom = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if (queRoom != null) + { + queRoom.removeFromQueue(habbo); + } + } + + if(overrideChecks || + room.isOwner(habbo) || + room.getState() == RoomState.OPEN || + room.getState() == RoomState.INVISIBLE || + habbo.hasPermission("acc_anyroomowner") || + habbo.hasPermission("acc_enteranyroom") || + room.hasRights(habbo) || + (room.hasGuild() && room.guildRightLevel(habbo) > 2)) + { + this.openRoom(habbo, room, doorLocation); + } + else if(room.getState() == RoomState.LOCKED) + { + boolean rightsFound = false; + + synchronized (room.roomUnitLock) + { + for (Habbo current : room.getHabbos()) + { + if (room.hasRights(current) || current.getHabboInfo().getId() == room.getOwnerId() || (room.hasGuild() && room.guildRightLevel(current) >= 2)) + { + current.getClient().sendResponse(new DoorbellAddUserComposer(habbo.getHabboInfo().getUsername())); + rightsFound = true; + } + } + } + + if(!rightsFound) + { + habbo.getClient().sendResponse(new RoomAccessDeniedComposer("")); + habbo.getClient().sendResponse(new HotelViewComposer()); + habbo.getHabboInfo().setLoadingRoom(0); + return; + } + + habbo.getHabboInfo().setRoomQueueId(roomId); + habbo.getClient().sendResponse(new DoorbellAddUserComposer("")); + room.addToQueue(habbo); + } + else if(room.getState() == RoomState.PASSWORD) + { + if(room.getPassword().equalsIgnoreCase(password)) + this.openRoom(habbo, room, doorLocation); + else + { + habbo.getClient().sendResponse(new GenericErrorMessagesComposer(-100002)); + habbo.getClient().sendResponse(new HotelViewComposer()); + habbo.getHabboInfo().setLoadingRoom(0); + } + } + } + + void openRoom(Habbo habbo, Room room, RoomTile doorLocation) + { + if (room == null) + return; + + if (Emulator.getConfig().getBoolean("hotel.room.enter.logs")) + { + this.logEnter(habbo, room); + } + + if (habbo.getHabboInfo().getRoomQueueId() > 0) + { + Room r = Emulator.getGameEnvironment().getRoomManager().getRoom(habbo.getHabboInfo().getRoomQueueId()); + + if (r != null) + { + r.removeFromQueue(habbo); + } + } + habbo.getHabboInfo().setRoomQueueId(0); + habbo.getClient().sendResponse(new HideDoorbellComposer("")); + + if (habbo.getRoomUnit() == null) + habbo.setRoomUnit(new RoomUnit()); + + if (habbo.getRoomUnit().getCurrentLocation() == null) + { + habbo.getRoomUnit().setLocation(room.getLayout().getDoorTile()); + } + habbo.getRoomUnit().setRoomUnitType(RoomUnitType.USER); + if(room.isBanned(habbo)) + { + habbo.getClient().sendResponse(new RoomEnterErrorComposer(RoomEnterErrorComposer.ROOM_ERROR_BANNED)); + return; + } + + if (room.getUserCount() >= room.getUsersMax() && !habbo.hasPermission("acc_fullrooms") && !room.hasRights(habbo)) + { + habbo.getClient().sendResponse(new RoomEnterErrorComposer(RoomEnterErrorComposer.ROOM_ERROR_GUESTROOM_FULL)); + return; + } + + habbo.getRoomUnit().getStatus().clear(); + habbo.getRoomUnit().cmdTeleport = false; + + habbo.getClient().sendResponse(new RoomOpenComposer()); + + habbo.getRoomUnit().setInRoom(true); + if (habbo.getHabboInfo().getCurrentRoom() != room && habbo.getHabboInfo().getCurrentRoom() != null) + { + habbo.getHabboInfo().getCurrentRoom().removeHabbo(habbo); + } else if (!habbo.getHabboStats().blockFollowing && habbo.getHabboInfo().getCurrentRoom() == null) + { + habbo.getMessenger().connectionChanged(habbo, true, true); + } + + if (habbo.getHabboInfo().getLoadingRoom() != 0) + { + Room oldRoom = Emulator.getGameEnvironment().getRoomManager().getRoom(habbo.getHabboInfo().getLoadingRoom()); + if (oldRoom != null) + { + oldRoom.removeFromQueue(habbo); + } + } + + habbo.getHabboInfo().setLoadingRoom(room.getId()); + + if (habbo.getRoomUnit().isTeleporting) + { + habbo.getRoomUnit().setLocation(doorLocation); + } + + habbo.getClient().sendResponse(new RoomModelComposer(room)); + + if (!room.getWallPaint().equals("0.0")) + habbo.getClient().sendResponse(new RoomPaintComposer("wallpaper", room.getWallPaint())); + + if (!room.getFloorPaint().equals("0.0")) + habbo.getClient().sendResponse(new RoomPaintComposer("floor", room.getFloorPaint())); + + habbo.getClient().sendResponse(new RoomPaintComposer("landscape", room.getBackgroundPaint())); + + room.refreshRightsForHabbo(habbo); + + habbo.getClient().sendResponse(new RoomScoreComposer(room.getScore(), !this.hasVotedForRoom(habbo, room))); + + if (room.isPromoted()) + { + habbo.getClient().sendResponse(new RoomPromotionMessageComposer(room, room.getPromotion())); + } + else + { + habbo.getClient().sendResponse(new RoomPromotionMessageComposer(null, null)); + } + + if(room.getOwnerId() != habbo.getHabboInfo().getId()) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomEntry")); + } + } + + public void enterRoom(final Habbo habbo, final Room room) + { + if (habbo.getHabboInfo().getLoadingRoom() != room.getId()) + { + if (habbo.getHabboInfo().getLoadingRoom() != 0) + { + habbo.getClient().sendResponse(new HotelViewComposer()); + } + return; + } + + habbo.getHabboInfo().setLoadingRoom(0); + habbo.getHabboInfo().setCurrentRoom(room); + habbo.getRoomUnit().setPathFinderRoom(room); + habbo.getRoomUnit().setHandItem(0); + + habbo.getRoomUnit().setRightsLevel(RoomRightLevels.NONE); + room.refreshRightsForHabbo(habbo); + if (habbo.getRoomUnit().isKicked && !habbo.getRoomUnit().canWalk()) + { + habbo.getRoomUnit().setCanWalk(true); + } + habbo.getRoomUnit().isKicked = false; + + if (!habbo.getRoomUnit().isTeleporting) + { + habbo.getRoomUnit().setLocation(room.getLayout().getTile(room.getLayout().getDoorX(), room.getLayout().getDoorY())); + RoomTile doorTile = room.getLayout().getTile(room.getLayout().getDoorX(), room.getLayout().getDoorY()); + + if (doorTile != null) + { + habbo.getRoomUnit().setZ(doorTile.getStackHeight()); + } + + habbo.getRoomUnit().setBodyRotation(RoomUserRotation.values()[room.getLayout().getDoorDirection()]); + habbo.getRoomUnit().setHeadRotation(RoomUserRotation.values()[room.getLayout().getDoorDirection()]); + } + habbo.getRoomUnit().setPathFinderRoom(room); + habbo.getRoomUnit().resetIdleTimer(); + + room.addHabbo(habbo); + if (!room.getCurrentHabbos().isEmpty()) + { + // ServerMessage m = new RoomUsersComposer(habbo).compose().appendResponse(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + + room.sendComposer(new RoomUsersComposer(habbo).compose()); + room.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + + + synchronized (room.roomUnitLock) + { + habbo.getClient().sendResponse(new RoomUsersComposer(room.getHabbos())); + habbo.getClient().sendResponse(new RoomUserStatusComposer(room.getHabbos())); + } + + if (habbo.getHabboStats().guild != 0) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(habbo.getHabboStats().guild); + + if (guild != null) + { + room.sendComposer(new RoomUsersAddGuildBadgeComposer(guild).compose()); + } + } + + int effect = habbo.getInventory().getEffectsComponent().activatedEffect ; + + if (effect == 0) + { + effect = habbo.getHabboInfo().getRank().getRoomEffect(); + } + + if (effect > 0) + { + habbo.getRoomUnit().setEffectId(effect); + } + + room.sendComposer(new RoomUserEffectComposer(habbo.getRoomUnit()).compose()); + } + + + habbo.getClient().sendResponse(new RoomUsersComposer(room.getCurrentBots().valueCollection(), true)); + if (!room.getCurrentBots().isEmpty()) + { + TIntObjectIterator botIterator = room.getCurrentBots().iterator(); + for (int i = room.getCurrentBots().size(); i-- > 0; ) + { + try + { + botIterator.advance(); + } + catch (NoSuchElementException e) + { + break; + } + Bot bot = botIterator.value(); + if (!bot.getRoomUnit().getDanceType().equals(DanceType.NONE)) + { + habbo.getClient().sendResponse(new RoomUserDanceComposer(bot.getRoomUnit())); + } + + habbo.getClient().sendResponse(new RoomUserStatusComposer(bot.getRoomUnit())); + } + } + + habbo.getClient().sendResponse(new RoomPaneComposer(room, room.isOwner(habbo))); + + habbo.getClient().sendResponse(new RoomThicknessComposer(room)); + + habbo.getClient().sendResponse(new RoomDataComposer(room, habbo.getClient().getHabbo(), false, true)); + + habbo.getClient().sendResponse(new RoomWallItemsComposer(room)); + + { + final THashSet floorItems = new THashSet(); + + room.getFloorItems().forEach(new TObjectProcedure() + { + @Override + public boolean execute(HabboItem object) + { + floorItems.add(object); + if (floorItems.size() == 250) + { + habbo.getClient().sendResponse(new RoomFloorItemsComposer(room.getFurniOwnerNames(), floorItems)); + floorItems.clear(); + } + + return true; + } + }); + + habbo.getClient().sendResponse(new RoomFloorItemsComposer(room.getFurniOwnerNames(), floorItems)); + floorItems.clear(); + } + + if (!room.getCurrentPets().isEmpty()) + { + habbo.getClient().sendResponse(new RoomPetComposer(room.getCurrentPets())); + for (AbstractPet pet : room.getCurrentPets().valueCollection()) + { + habbo.getClient().sendResponse(new RoomUserStatusComposer(pet.getRoomUnit())); + } + } + + if (!habbo.getHabboStats().allowTalk()) + { + habbo.getHabboStats().mutedBubbleTracker = true; + int remainingMuteTime = habbo.getHabboStats().remainingMuteTime(); + habbo.getClient().sendResponse(new FloodCounterComposer(remainingMuteTime)); + habbo.getClient().sendResponse(new MutedWhisperComposer(remainingMuteTime)); + room.sendComposer(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.MUTED).compose()); + } + else if (habbo.getHabboStats().mutedBubbleTracker) + { + habbo.getHabboStats().mutedBubbleTracker = false; + } + + THashMap guildBadges = new THashMap(); + for (Habbo roomHabbo : room.getHabbos()) + { + { + if (roomHabbo.getRoomUnit().getDanceType().getType() > 0) + { + habbo.getClient().sendResponse(new RoomUserDanceComposer(roomHabbo.getRoomUnit())); + } + + if (roomHabbo.getRoomUnit().getHandItem() > 0) + { + habbo.getClient().sendResponse(new RoomUserHandItemComposer(roomHabbo.getRoomUnit())); + } + + if (roomHabbo.getRoomUnit().getEffectId() > 0) + { + habbo.getClient().sendResponse(new RoomUserEffectComposer(roomHabbo.getRoomUnit())); + } + + if (roomHabbo.getRoomUnit().isIdle()) + { + habbo.getClient().sendResponse(new RoomUnitIdleComposer(roomHabbo.getRoomUnit())); + } + + if (roomHabbo.getHabboStats().ignoredUsers.contains(habbo.getHabboInfo().getId())) + { + roomHabbo.getClient().sendResponse(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.IGNORED)); + } + + if (!roomHabbo.getHabboStats().allowTalk()) + { + habbo.getClient().sendResponse(new RoomUserIgnoredComposer(roomHabbo, RoomUserIgnoredComposer.MUTED)); + } + else if (habbo.getHabboStats().ignoredUsers.contains(roomHabbo.getHabboInfo().getId())) + { + habbo.getClient().sendResponse(new RoomUserIgnoredComposer(roomHabbo, RoomUserIgnoredComposer.IGNORED)); + } + + if (roomHabbo.getHabboStats().guild != 0 && !guildBadges.containsKey(roomHabbo.getHabboStats().guild)) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(roomHabbo.getHabboStats().guild); + + if (guild != null) + { + guildBadges.put(roomHabbo.getHabboStats().guild, guild.getBadge()); + } + } + + if (roomHabbo.getRoomUnit().getRoomUnitType().equals(RoomUnitType.PET)) + { + try + { + habbo.getClient().sendResponse(new RoomUserRemoveComposer(roomHabbo.getRoomUnit())); + habbo.getClient().sendResponse(new RoomUserPetComposer(((PetData)roomHabbo.getHabboStats().cache.get("pet_type")).getType(), (Integer)roomHabbo.getHabboStats().cache.get("pet_race"), (String)roomHabbo.getHabboStats().cache.get("pet_color"), roomHabbo)); + } + catch (Exception e) + { + + } + } + } + } + + habbo.getClient().sendResponse(new RoomUsersGuildBadgesComposer(guildBadges)); + + if (room.hasRights(habbo) || (room.hasGuild() && room.guildRightLevel(habbo) >= 2)) + { + if (!room.getHabboQueue().isEmpty()) + { + for (Habbo waiting : room.getHabboQueue().valueCollection()) + { + habbo.getClient().sendResponse(new DoorbellAddUserComposer(waiting.getHabboInfo().getUsername())); + } + } + } + + if (room.getPollId() > 0) + { + if (!PollManager.donePoll(habbo.getClient().getHabbo(), room.getPollId())) + { + Poll poll = Emulator.getGameEnvironment().getPollManager().getPoll(room.getPollId()); + + if (poll != null) + { + habbo.getClient().sendResponse(new PollStartComposer(poll)); + } + } + } + + if (room.hasActiveWordQuiz()) + { + habbo.getClient().sendResponse(new SimplePollStartComposer((Emulator.getIntUnixTimestamp() - room.wordQuizEnd) * 1000, room.wordQuiz)); + + if (room.hasVotedInWordQuiz(habbo)) + { + habbo.getClient().sendResponse(new SimplePollAnswersComposer(habbo.getHabboInfo().getId(), room.noVotes, room.yesVotes)); + } + } + + WiredHandler.handle(WiredTriggerType.ENTER_ROOM, habbo.getRoomUnit(), room, null); + room.habboEntered(habbo); + + if (!habbo.getHabboStats().nux && room.isOwner(habbo)) + { + UserNuxEvent.handle(habbo); + } + } + + void logEnter(Habbo habbo, Room room) + { + habbo.getHabboStats().roomEnterTimestamp = Emulator.getIntUnixTimestamp(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_enter_log (room_id, user_id, timestamp) VALUES(?, ?, ?)")) + { + statement.setInt(1, room.getId()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.setInt(3, (int)(habbo.getHabboStats().roomEnterTimestamp)); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void leaveRoom(Habbo habbo, Room room) + { + if(habbo.getHabboInfo().getCurrentRoom() != null && habbo.getHabboInfo().getCurrentRoom() == room) + { + habbo.getRoomUnit().setPathFinderRoom(null); + if (habbo.getHabboInfo().getRiding() != null) + { + if (habbo.getHabboInfo().getRiding().getRoomUnit() != null) + { + habbo.getHabboInfo().getRiding().getRoomUnit().setGoalLocation(habbo.getHabboInfo().getRiding().getRoomUnit().getCurrentLocation()); + } + habbo.getHabboInfo().getRiding().setTask(PetTasks.FREE); + habbo.getHabboInfo().getRiding().setRider(null); + habbo.getHabboInfo().setRiding(null); + } + + if (!room.isOwner(habbo)) + { + room.pickupPetsForHabbo(habbo); + } + this.logExit(habbo); + room.removeHabbo(habbo); + room.sendComposer(new RoomUserRemoveComposer(habbo.getRoomUnit()).compose()); + habbo.getClient().sendResponse(new HotelViewComposer()); + habbo.getHabboInfo().setCurrentRoom(null); + habbo.getRoomUnit().isKicked = false; + + if (room.getOwnerId() != habbo.getHabboInfo().getId()) + { + AchievementManager.progressAchievement(room.getOwnerId(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoHosting"), (int)Math.floor((Emulator.getIntUnixTimestamp() - habbo.getHabboStats().roomEnterTimestamp) / 60000)); + } + } + } + public void logExit(Habbo habbo) + { + if(habbo.getRoomUnit().getCacheable().containsKey("control")) + { + Habbo control = (Habbo)habbo.getRoomUnit().getCacheable().remove("control"); + control.getRoomUnit().getCacheable().remove("controller"); + } + + Room room = habbo.getHabboInfo().getCurrentRoom(); + if(room != null) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE room_enter_log SET exit_timestamp = ? WHERE user_id = ? AND room_id = ? ORDER BY timestamp DESC LIMIT 1")) + { + statement.setInt(1, Emulator.getIntUnixTimestamp()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.setInt(3, room.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public Set getTags() + { + Map tagCount = new HashMap(); + + for(Room room : this.activeRooms.values()) + { + for(String s : room.getTags().split(";")) + { + int i = 0; + if(tagCount.get(s) != null) + i++; + + tagCount.put(s, i++); + } + } + return new TreeMap(tagCount).keySet(); + } + + public ArrayList getPublicRooms() + { + ArrayList rooms = new ArrayList(); + + for(Room room : this.activeRooms.values()) + { + if(room.isPublicRoom() || room.isStaffPromotedRoom() || this.roomCategories.get(room.getCategory()).isPublic()) + { + rooms.add(room); + } + } + + return rooms; + } + + public ArrayList getPopularRooms(int count) + { + ArrayList rooms = new ArrayList(); + + for (Room room : this.activeRooms.values()) + { + if (!room.isPublicRoom() && room.getUserCount() > 0) + { + rooms.add(room); + } + } + + if (rooms.isEmpty()) + { + return rooms; + } + + Collections.sort(rooms); + + return new ArrayList(rooms.subList(0, (rooms.size() < count ? rooms.size() : count))); + } + + public ArrayList getPopularRooms(int count, int category) + { + ArrayList rooms = new ArrayList(); + + for (Room room : this.activeRooms.values()) + { + if (!room.isPublicRoom() && room.getCategory() == category) + { + rooms.add(room); + } + } + + if (rooms.isEmpty()) + { + return rooms; + } + + Collections.sort(rooms); + + return new ArrayList(rooms.subList(0, (rooms.size() < count ? rooms.size() : count))); + } + + public Map> getPopularRoomsByCategory(int count) + { + Map> rooms = new HashMap>(); + + for (Room room : this.activeRooms.values()) + { + if (!room.isPublicRoom()) + { + if (!rooms.containsKey(room.getCategory())) + { + rooms.put(room.getCategory(), new ArrayList()); + } + + rooms.get(room.getCategory()).add(room); + } + } + + Map> result = new HashMap>(); + + for (Map.Entry> set : rooms.entrySet()) + { + if (set.getValue().isEmpty()) + continue; + + Collections.sort(set.getValue()); + + result.put(set.getKey(), new ArrayList(set.getValue().subList(0, (set.getValue().size() < count ? set.getValue().size() : count)))); + } + + return result; + } + + public ArrayList getRoomsWithName(String name) + { + ArrayList rooms = new ArrayList(); + + for (Room room : this.activeRooms.values()) + { + if (room.getName().toLowerCase().contains(name.toLowerCase())) + { + rooms.add(room); + } + } + + if(rooms.size() < 25) + { + rooms.addAll(getOfflineRoomsWithName(name)); + } + + Collections.sort(rooms); + + return rooms; + } + + private ArrayList getOfflineRoomsWithName(String name) + { + ArrayList rooms = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, rooms.* FROM rooms INNER JOIN users ON owner_id = users.id WHERE name LIKE ? ORDER BY id DESC LIMIT 25")) + { + statement.setString(1, "%"+name+"%"); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (this.activeRooms.containsKey(set.getInt("id"))) + continue; + + Room r = new Room(set); + rooms.add(r); + this.activeRooms.put(r.getId(), r); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return rooms; + } + + public ArrayList getRoomsWithTag(String tag) + { + ArrayList rooms = new ArrayList(); + + for (Room room : this.activeRooms.values()) + { + for (String s : room.getTags().split(";")) + { + if (s.toLowerCase().equals(tag.toLowerCase())) + { + rooms.add(room); + break; + } + } + } + + Collections.sort(rooms); + + return rooms; + } + + public ArrayList getGroupRoomsWithName(String name) + { + ArrayList rooms = new ArrayList(); + + for (Room room : this.activeRooms.values()) + { + if (room.getGuildId() == 0) + continue; + + if (room.getName().toLowerCase().contains(name.toLowerCase())) + rooms.add(room); + } + + if(rooms.size() < 25) + { + rooms.addAll(this.getOfflineGroupRoomsWithName(name)); + } + + Collections.sort(rooms); + + return rooms; + } + + private ArrayList getOfflineGroupRoomsWithName(String name) + { + ArrayList rooms = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, rooms.* FROM rooms INNER JOIN users ON rooms.owner_id = users.id WHERE name LIKE ? AND guild_id != 0 ORDER BY id DESC LIMIT 25")) + { + statement.setString(1, "%"+name+"%"); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (this.activeRooms.containsKey(set.getInt("id"))) + continue; + + Room r = new Room(set); + rooms.add(r); + + this.activeRooms.put(r.getId(), r); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return rooms; + } + + public ArrayList getRoomsFriendsNow(Habbo habbo) + { + ArrayList rooms = new ArrayList(); + + for(MessengerBuddy buddy : habbo.getMessenger().getFriends().values()) + { + if(buddy.getOnline() == 0) + continue; + + Habbo friend = Emulator.getGameEnvironment().getHabboManager().getHabbo(buddy.getId()); + + if(friend == null || friend.getHabboInfo().getCurrentRoom() == null) + continue; + + rooms.add(friend.getHabboInfo().getCurrentRoom()); + } + + Collections.sort(rooms); + + return rooms; + } + + public ArrayList getRoomsFriendsOwn(Habbo habbo) + { + ArrayList rooms = new ArrayList(); + + for(MessengerBuddy buddy : habbo.getMessenger().getFriends().values()) + { + if(buddy.getOnline() == 0) + continue; + + Habbo friend = Emulator.getGameEnvironment().getHabboManager().getHabbo(buddy.getId()); + + if(friend == null) + continue; + + rooms.addAll(this.getRoomsForHabbo(friend)); + } + + Collections.sort(rooms); + + return rooms; + } + + public ArrayList getRoomsVisited(Habbo habbo, boolean includeSelf, int limit) + { + ArrayList rooms = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.* FROM room_enter_log INNER JOIN rooms ON room_enter_log.room_id = rooms.id WHERE user_id = ? AND timestamp >= ? AND rooms.owner_id != ? GROUP BY rooms.id ORDER BY timestamp DESC LIMIT " + limit)) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, Emulator.getIntUnixTimestamp() - 259200); + statement.setInt(3, (includeSelf ? 0 : habbo.getHabboInfo().getId())); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Room room = this.activeRooms.get(set.getInt("id")); + + if (room == null) + { + room = new Room(set); + + this.activeRooms.put(room.getId(), room); + } + + rooms.add(room); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + Collections.sort(rooms); + + return rooms; + } + + public ArrayList getRoomsFavourite(Habbo habbo) + { + final ArrayList rooms = new ArrayList(); + + habbo.getHabboStats().getFavoriteRooms().forEach(new TIntProcedure() + { + @Override + public boolean execute(int value) + { + Room room = loadRoom(value); + + if (room != null) + { + rooms.add(room); + } + return true; + } + }); + + return rooms; + } + + public List getGroupRooms(Habbo habbo, int limit) + { + final ArrayList rooms = new ArrayList(); + + for (Guild guild : Emulator.getGameEnvironment().getGuildManager().getGuilds(habbo.getHabboInfo().getId())) + { + if (guild.getOwnerId() != habbo.getHabboInfo().getId()) + { + Room room = this.loadRoom(guild.getRoomId()); + + if (room != null) + { + rooms.add(room); + } + } + } + + Collections.sort(rooms); + + return rooms.subList(0, (rooms.size() > limit ? limit : rooms.size())); + } + + public ArrayList getRoomsWithRights(Habbo habbo) + { + ArrayList rooms = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT rooms.* FROM rooms INNER JOIN room_rights ON room_rights.room_id = rooms.id WHERE room_rights.user_id = ? ORDER BY rooms.id DESC LIMIT 30")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (this.activeRooms.containsKey(set.getInt("id"))) + { + rooms.add(this.activeRooms.get(set.getInt("id"))); + } + else + { + rooms.add(new Room(set)); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return rooms; + } + + public ArrayList getRoomsWithAdminRights(Habbo habbo) + { + ArrayList rooms = new ArrayList<>(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM rooms INNER JOIN guilds_members ON guilds_members.guild_id = rooms.guild_id WHERE guilds_members.user_id = ? AND level_id = 0")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + if (this.activeRooms.containsKey(set.getInt("id"))) + { + rooms.add(this.activeRooms.get(set.getInt("id"))); + } + else + { + rooms.add(new Room(set)); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return rooms; + } + + public ArrayList getRoomsInGroup(Habbo habbo) + { + return new ArrayList(); + } + + public ArrayList getRoomsPromoted() + { + ArrayList r = new ArrayList(); + + for(Room room : this.getActiveRooms()) + { + if(room.isPromoted()) + { + r.add(room); + } + } + + return r; + } + + public List filterRoomsByOwner(List rooms, String filter) + { + ArrayList r = new ArrayList(); + + for(Room room : rooms) + { + if(room.getOwnerName().equalsIgnoreCase(filter)) + r.add(room); + } + + return r; + } + + public List filterRoomsByName(List rooms, String filter) + { + ArrayList r = new ArrayList(); + + for(Room room : rooms) + { + if(room.getName().toLowerCase().contains(filter.toLowerCase())) + r.add(room); + } + + return r; + } + + public List filterRoomsByNameAndDescription(List rooms, String filter) + { + ArrayList r = new ArrayList(); + + for(Room room : rooms) + { + if(room.getName().toLowerCase().contains(filter.toLowerCase()) || room.getDescription().toLowerCase().contains(filter.toLowerCase())) + r.add(room); + } + + return r; + } + + public List filterRoomsByTag(List rooms, String filter) + { + ArrayList r = new ArrayList(); + + for(Room room : rooms) + { + if(room.getTags().split(";").length == 0) + continue; + + for(String s : room.getTags().split(";")) + { + if(s.equalsIgnoreCase(filter)) + r.add(room); + } + } + + return r; + } + + public List filterRoomsByGroup(List rooms, String filter) + { + ArrayList r = new ArrayList(); + + for(Room room : rooms) + { + if(room.getGuildId() == 0) + continue; + + if(Emulator.getGameEnvironment().getGuildManager().getGuild(room.getGuildId()).getName().toLowerCase().contains(filter.toLowerCase())) + r.add(room); + } + + return r; + } + + public synchronized void dispose() + { + for (Room room : this.activeRooms.values()) + { + room.dispose(); + } + + this.activeRooms.clear(); + + Emulator.getLogging().logShutdownLine("Room Manager -> Disposed!"); + } + + public CustomRoomLayout insertCustomLayout(Room room, String map, int doorX, int doorY, int doorDirection) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_models_custom (id, name, door_x, door_y, door_dir, heightmap) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE door_x = ?, door_y = ?, door_dir = ?, heightmap = ?")) + { + statement.setInt(1, room.getId()); + statement.setString(2, "custom_" + room.getId()); + statement.setInt(3, doorX); + statement.setInt(4, doorY); + statement.setInt(5, doorDirection); + statement.setString(6, map); + statement.setInt(7, doorX); + statement.setInt(8, doorY); + statement.setInt(9, doorDirection); + statement.setString(10, map); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + e.printStackTrace(); + } + + return this.loadCustomLayout(room); + } + + public void banUserFromRoom(Habbo rights, int userId, int roomId, RoomBanTypes length) + { + Room room = this.getRoom(roomId); + + if (room == null) + return; + + if (rights != null && !room.hasRights(rights)) + return; + + String name = ""; + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + if (habbo != null) + { + if (habbo.hasPermission("acc_unkickable")) + { + return; + } + + name = habbo.getHabboInfo().getUsername(); + } + else + { + HabboInfo info = HabboManager.getOfflineHabboInfo(userId); + + if (info != null) + { + if (info.getRank().hasPermission("acc_unkickable", false)) + { + return; + } + name = info.getUsername(); + } + } + + if (name.isEmpty()) + { + return; + } + + RoomBan roomBan = new RoomBan(roomId, userId, name, Emulator.getIntUnixTimestamp() + length.duration); + roomBan.insert(); + + room.addRoomBan(roomBan); + + if (habbo != null) + { + if (habbo.getHabboInfo().getCurrentRoom() == room) + { + room.removeHabbo(habbo); + habbo.getClient().sendResponse(new RoomEnterErrorComposer(RoomEnterErrorComposer.ROOM_ERROR_BANNED)); + } + } + } + + public enum RoomBanTypes + { + RWUAM_BAN_USER_HOUR(60 * 60), + RWUAM_BAN_USER_DAY(24 * 60 * 60), + RWUAM_BAN_USER_PERM(10 * 365 * 24 * 60 * 60); + + public int duration; + + RoomBanTypes(int duration) + { + this.duration = duration; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomMoodlightData.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomMoodlightData.java new file mode 100644 index 00000000..c8530bf5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomMoodlightData.java @@ -0,0 +1,93 @@ +package com.eu.habbo.habbohotel.rooms; + +public class RoomMoodlightData +{ + private int id; + private boolean enabled; + private boolean backgroundOnly; + private String color; + private int intensity; + + public RoomMoodlightData(int id, boolean enabled, boolean backgroundOnly, String color, int intensity) + { + this.id = id; + this.enabled = enabled; + this.backgroundOnly = backgroundOnly; + this.color = color; + this.intensity = intensity; + } + + public int getId() + { + return this.id; + } + + public void setId(int id) + { + this.id = id; + } + + public boolean isEnabled() + { + return this.enabled; + } + + public void enable() + { + this.enabled = true; + } + + public void disable() + { + this.enabled = false; + } + + public boolean isBackgroundOnly() + { + return this.backgroundOnly; + } + + public void setBackgroundOnly(boolean backgroundOnly) + { + this.backgroundOnly = backgroundOnly; + } + + public String getColor() + { + return this.color; + } + + public void setColor(String color) + { + this.color = color; + } + + public int getIntensity() + { + return this.intensity; + } + + public void setIntensity(int intensity) + { + this.intensity = intensity; + } + + public String toString() + { + return (this.enabled ? 2 : 1) + "," + this.id + "," + (this.backgroundOnly ? 2 : 1) + "," + this.color + "," + this.intensity; + } + + public static RoomMoodlightData fromString(String s) + { + String[] data = s.split(","); + + if(data.length == 5) + { + return new RoomMoodlightData(Integer.valueOf(data[1]), data[0].equalsIgnoreCase("2"), data[2].equalsIgnoreCase("2"), data[3], Integer.valueOf(data[4])); + } + else + { + return new RoomMoodlightData(1, true, true, "#000000", 255); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java new file mode 100644 index 00000000..c6dc3e5b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomPromotion.java @@ -0,0 +1,93 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RoomPromotion +{ + private final Room room; + private String title; + private String description; + private int endTimestamp; + public boolean needsUpdate; + + public RoomPromotion(Room room, String title, String description, int endTimestamp) + { + this.room = room; + this.title = title; + this.description = description; + this.endTimestamp = endTimestamp; + } + + public RoomPromotion(Room room, ResultSet set) throws SQLException + { + this.room = room; + this.title = set.getString("title"); + this.description = set.getString("description"); + this.endTimestamp = set.getInt("end_timestamp"); + } + + public void save() + { + if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE room_promotions SET title = ?, description = ? WHERE room_id = ?")) + { + statement.setString(1, this.title); + statement.setString(2, this.description); + statement.setInt(3, this.room.getId()); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.needsUpdate = false; + } + } + + public Room getRoom() + { + return this.room; + } + + public String getTitle() + { + return this.title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getDescription() + { + return this.description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public int getEndTimestamp() + { + return this.endTimestamp; + } + + public void setEndTimestamp(int endTimestamp) + { + this.endTimestamp = endTimestamp; + } + + public void addEndTimestamp(int time) + { + this.endTimestamp += time; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightLevels.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightLevels.java new file mode 100644 index 00000000..65c6f368 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightLevels.java @@ -0,0 +1,61 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomRightLevels +{ + /** + * No Rights. + */ + NONE (0), + + /** + * Rights given by the room owner. + */ + RIGHTS (1), + + /** + * Rights trough guild allowing members to build. + */ + GUILD_RIGHTS(2), + + /** + * Rights as Admin of the guild. + */ + GUILD_ADMIN (3), + + /** + * Room owner rights. + */ + OWNER (4), + + /** + * Moderator rights. + */ + MODERATOR (5), + + /** + * Six. Unknown. + */ + SIX (6), + + /** + * Seven. Unknown. + */ + SEVEN (7), + + /** + * Eight. Unknown. + */ + EIGHT (8), + + /** + * Nine. Unknown. + */ + NINE (9); + + public final int level; + + RoomRightLevels(int level) + { + this.level = level; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java new file mode 100644 index 00000000..51e15d82 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java @@ -0,0 +1,933 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.ICycleable; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameGate; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameScoreboard; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiTeleporter; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiTimer; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.gates.InteractionBattleBanzaiGate; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.scoreboards.InteractionBattleBanzaiScoreboard; +import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.InteractionFootballScoreboard; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTimer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.gates.InteractionFreezeGate; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards.InteractionFreezeScoreboard; +import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredExtraRandom; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.habbohotel.wired.WiredConditionType; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.Map; + +public class RoomSpecialTypes +{ + private final THashMap banzaiTeleporters; + private final THashMap nests; + private final THashMap petDrinks; + private final THashMap petFoods; + private final THashMap petToys; + private final THashMap rollers; + + private final THashMap> wiredTriggers; + private final THashMap> wiredEffects; + private final THashMap> wiredConditions; + private final THashMap wiredExtras; + + private final THashMap gameScoreboards; + private final THashMap gameGates; + private final THashMap gameTimers; + + private final THashMap freezeExitTile; + private final THashMap undefined; + private final THashSet cycleTasks; + + public RoomSpecialTypes() + { + this.banzaiTeleporters = new THashMap<>(0); + this.nests = new THashMap<>(0); + this.petDrinks = new THashMap<>(0); + this.petFoods = new THashMap<>(0); + this.petToys = new THashMap<>(0); + this.rollers = new THashMap<>(0); + + this.wiredTriggers = new THashMap<>(0); + this.wiredEffects = new THashMap<>(0); + this.wiredConditions = new THashMap<>(0); + this.wiredExtras = new THashMap<>(0); + + this.gameScoreboards = new THashMap<>(0); + this.gameGates = new THashMap<>(0); + this.gameTimers = new THashMap<>(0); + + this.freezeExitTile = new THashMap<>(0); + this.undefined = new THashMap<>(0); + this.cycleTasks = new THashSet<>(0); + } + + /* + Banzai Teleporter + */ + public InteractionBattleBanzaiTeleporter getBanzaiTeleporter(int itemId) + { + return this.banzaiTeleporters.get(itemId); + } + + public void addBanzaiTeleporter(InteractionBattleBanzaiTeleporter item) + { + this.banzaiTeleporters.put(item.getId(), item); + } + + public void removeBanzaiTeleporter(InteractionBattleBanzaiTeleporter item) + { + this.banzaiTeleporters.remove(item.getId()); + } + + public THashSet getBanzaiTeleporters() + { + synchronized (this.banzaiTeleporters) + { + THashSet battleBanzaiTeleporters = new THashSet(); + battleBanzaiTeleporters.addAll(this.banzaiTeleporters.values()); + + return battleBanzaiTeleporters; + } + } + + public InteractionBattleBanzaiTeleporter getRandomTeleporter() + { + synchronized (this.banzaiTeleporters) + { + return (InteractionBattleBanzaiTeleporter) this.banzaiTeleporters.values().toArray()[Emulator.getRandom().nextInt(this.banzaiTeleporters.size())]; + } + } + + /* + Nests + */ + public InteractionNest getNest(int itemId) + { + return this.nests.get(itemId); + } + + public void addNest(InteractionNest item) + { + this.nests.put(item.getId(), item); + } + + public void removeNest(InteractionNest item) + { + this.nests.remove(item.getId()); + } + + public THashSet getNests() + { + synchronized (this.nests) + { + THashSet nests = new THashSet(); + nests.addAll(this.nests.values()); + + return nests; + } + } + + /* + Pet Drinks + */ + public InteractionPetDrink getPetDrink(int itemId) + { + return this.petDrinks.get(itemId); + } + + public void addPetDrink(InteractionPetDrink item) + { + this.petDrinks.put(item.getId(), item); + } + + public void removePetDrink(InteractionPetDrink item) + { + this.petDrinks.remove(item.getId()); + } + + public THashSet getPetDrinks() + { + synchronized (this.petDrinks) + { + THashSet petDrinks = new THashSet(); + petDrinks.addAll(this.petDrinks.values()); + + return petDrinks; + } + } + + /* + Pet Foods. + */ + public InteractionPetFood getPetFood(int itemId) + { + return this.petFoods.get(itemId); + } + + public void addPetFood(InteractionPetFood item) + { + this.petFoods.put(item.getId(), item); + } + + public void removePetFood(InteractionPetFood petFood) + { + this.petFoods.remove(petFood.getId()); + } + + public THashSet getPetFoods() + { + synchronized (this.petFoods) + { + THashSet petFoods = new THashSet(); + petFoods.addAll(this.petFoods.values()); + + return petFoods; + } + } + + /* + Pet Toys. + */ + public InteractionPetToy getPetToy(int itemId) + { + return this.petToys.get(itemId); + } + + public void addPetToy(InteractionPetToy item) + { + this.petToys.put(item.getId(), item); + } + + public void removePetToy(InteractionPetToy petToy) + { + this.petToys.remove(petToy.getId()); + } + + public THashSet getPetToys() + { + synchronized (this.petToys) + { + THashSet petToys = new THashSet(); + petToys.addAll(this.petToys.values()); + + return petToys; + } + } + + /* + Rollers + */ + public InteractionRoller getRoller(int itemId) + { + synchronized (this.rollers) + { + return this.rollers.get(itemId); + } + } + + public void addRoller(InteractionRoller item) + { + synchronized (this.rollers) + { + this.rollers.put(item.getId(), item); + } + } + + public void removeRoller(InteractionRoller roller) + { + synchronized (this.rollers) + { + this.rollers.remove(roller.getId()); + } + } + + public THashMap getRollers() + { + return rollers; + } + + /* + Wired Triggers + */ + public InteractionWiredTrigger getTrigger(int itemId) + { + synchronized (this.wiredTriggers) + { + for (Map.Entry> map : this.wiredTriggers.entrySet()) + { + for (InteractionWiredTrigger trigger : map.getValue()) + { + if (trigger.getId() == itemId) + return trigger; + } + } + + return null; + } + } + + public THashSet getTriggers() + { + synchronized (this.wiredTriggers) + { + THashSet triggers = new THashSet(); + + for (Map.Entry> map : this.wiredTriggers.entrySet()) + { + triggers.addAll(map.getValue()); + } + + return triggers; + } + } + + public THashSet getTriggers(WiredTriggerType type) + { + return this.wiredTriggers.get(type); + } + + public THashSet getTriggers(int x, int y) + { + synchronized (this.wiredTriggers) + { + THashSet triggers = new THashSet(); + + for (Map.Entry> map : this.wiredTriggers.entrySet()) + { + for (InteractionWiredTrigger trigger : map.getValue()) + { + if (trigger.getX() == x && trigger.getY() == y) + triggers.add(trigger); + } + } + + return triggers; + } + } + + public void addTrigger(InteractionWiredTrigger trigger) + { + synchronized (this.wiredTriggers) + { + if (!this.wiredTriggers.containsKey(trigger.getType())) + this.wiredTriggers.put(trigger.getType(), new THashSet()); + + this.wiredTriggers.get(trigger.getType()).add(trigger); + } + } + + public void removeTrigger(InteractionWiredTrigger trigger) + { + synchronized (this.wiredTriggers) + { + this.wiredTriggers.get(trigger.getType()).remove(trigger); + + if (this.wiredTriggers.get(trigger.getType()).isEmpty()) + { + this.wiredTriggers.remove(trigger.getType()); + } + } + } + + /* + Wired Effects + */ + public InteractionWiredEffect getEffect(int itemId) + { + synchronized (this.wiredEffects) + { + for (Map.Entry> map : this.wiredEffects.entrySet()) + { + for (InteractionWiredEffect effect : map.getValue()) + { + if (effect.getId() == itemId) + return effect; + } + } + } + + return null; + } + + public THashSet getEffects() + { + synchronized (this.wiredEffects) + { + THashSet effects = new THashSet(); + + for (Map.Entry> map : this.wiredEffects.entrySet()) + { + effects.addAll(map.getValue()); + } + + return effects; + } + } + + public THashSet getEffects(WiredEffectType type) + { + return this.wiredEffects.get(type); + } + + public THashSet getEffects(int x, int y) + { + synchronized (this.wiredEffects) + { + THashSet effects = new THashSet(); + + for (Map.Entry> map : this.wiredEffects.entrySet()) + { + for (InteractionWiredEffect effect : map.getValue()) + { + if (effect.getX() == x && effect.getY() == y) + effects.add(effect); + } + } + + return effects; + } + } + + public void addEffect(InteractionWiredEffect effect) + { + synchronized (this.wiredEffects) + { + if (!this.wiredEffects.containsKey(effect.getType())) + this.wiredEffects.put(effect.getType(), new THashSet()); + + this.wiredEffects.get(effect.getType()).add(effect); + } + } + + public void removeEffect(InteractionWiredEffect effect) + { + synchronized (this.wiredEffects) + { + this.wiredEffects.get(effect.getType()).remove(effect); + + if (this.wiredEffects.get(effect.getType()).isEmpty()) + { + this.wiredEffects.remove(effect.getType()); + } + } + } + + /* + Wired Conditions + */ + public InteractionWiredCondition getCondition(int itemId) + { + synchronized (this.wiredConditions) + { + for (Map.Entry> map : this.wiredConditions.entrySet()) + { + for (InteractionWiredCondition condition : map.getValue()) + { + if (condition.getId() == itemId) + return condition; + } + } + } + + return null; + } + + public THashSet getConditions() + { + synchronized (this.wiredConditions) + { + THashSet conditions = new THashSet(); + + for (Map.Entry> map : this.wiredConditions.entrySet()) + { + conditions.addAll(map.getValue()); + } + + return conditions; + } + } + + public THashSet getConditions(WiredConditionType type) + { + synchronized (this.wiredConditions) + { + return this.wiredConditions.get(type); + } + } + + public THashSet getConditions(int x, int y) + { + synchronized (this.wiredConditions) + { + THashSet conditions = new THashSet(); + + for (Map.Entry> map : this.wiredConditions.entrySet()) + { + for (InteractionWiredCondition condition : map.getValue()) + { + if (condition.getX() == x && condition.getY() == y) + conditions.add(condition); + } + } + + return conditions; + } + } + + public void addCondition(InteractionWiredCondition condition) + { + synchronized (this.wiredConditions) + { + if (!this.wiredConditions.containsKey(condition.getType())) + this.wiredConditions.put(condition.getType(), new THashSet()); + + this.wiredConditions.get(condition.getType()).add(condition); + } + } + + public void removeCondition(InteractionWiredCondition condition) + { + synchronized (this.wiredConditions) + { + this.wiredConditions.get(condition.getType()).remove(condition); + + if (this.wiredConditions.get(condition.getType()).isEmpty()) + { + this.wiredConditions.remove(condition.getType()); + } + } + } + + /* + Wired Extra + */ + public THashSet getExtras(int x, int y) + { + synchronized (this.wiredExtras) + { + THashSet extras = new THashSet(); + + for (Map.Entry map : this.wiredExtras.entrySet()) + { + if (map.getValue().getX() == x && map.getValue().getY() == y) + { + extras.add(map.getValue()); + } + } + + return extras; + } + } + + public void addExtra(InteractionWiredExtra extra) + { + synchronized (this.wiredExtras) + { + this.wiredExtras.put(extra.getId(), extra); + } + } + + public void removeExtra(InteractionWiredExtra extra) + { + synchronized (this.wiredExtras) + { + this.wiredExtras.remove(extra); + } + } + + public boolean hasExtraType(short x, short y, Class type) + { + synchronized (this.wiredExtras) + { + for (Map.Entry map : this.wiredExtras.entrySet()) + { + if (map.getValue().getX() == x && map.getValue().getY() == y && map.getValue().getClass().isAssignableFrom(type)) + { + return true; + } + } + } + + return false; + } + + /* + GameScoreboards + */ + public InteractionGameScoreboard getGameScorebord(int itemId) + { + return this.gameScoreboards.get(itemId); + } + + public void addGameScoreboard(InteractionGameScoreboard scoreboard) + { + this.gameScoreboards.put(scoreboard.getId(), scoreboard); + } + + public void removeScoreboard(InteractionGameScoreboard scoreboard) + { + this.gameScoreboards.remove(scoreboard.getId()); + } + + public THashMap getFreezeScoreboards() + { + synchronized (this.gameScoreboards) + { + THashMap boards = new THashMap(); + + for (Map.Entry set : this.gameScoreboards.entrySet()) + { + if (set.getValue() instanceof InteractionFreezeScoreboard) + { + boards.put(set.getValue().getId(), (InteractionFreezeScoreboard) set.getValue()); + } + } + + return boards; + } + } + + public THashMap getFreezeScoreboards(GameTeamColors teamColor) + { + synchronized (this.gameScoreboards) + { + THashMap boards = new THashMap(); + + for (Map.Entry set : this.gameScoreboards.entrySet()) + { + if (set.getValue() instanceof InteractionFreezeScoreboard) + { + if (((InteractionFreezeScoreboard) set.getValue()).teamColor.equals(teamColor)) + boards.put(set.getValue().getId(), (InteractionFreezeScoreboard) set.getValue()); + } + } + + return boards; + } + } + + public THashMap getBattleBanzaiScoreboards() + { + synchronized (this.gameScoreboards) + { + THashMap boards = new THashMap(); + + for (Map.Entry set : this.gameScoreboards.entrySet()) + { + if (set.getValue() instanceof InteractionBattleBanzaiScoreboard) + { + boards.put(set.getValue().getId(), (InteractionBattleBanzaiScoreboard) set.getValue()); + } + } + + return boards; + } + } + + public THashMap getBattleBanzaiScoreboards(GameTeamColors teamColor) + { + synchronized (this.gameScoreboards) + { + THashMap boards = new THashMap(); + + for (Map.Entry set : this.gameScoreboards.entrySet()) + { + if (set.getValue() instanceof InteractionBattleBanzaiScoreboard) + { + if (((InteractionBattleBanzaiScoreboard) set.getValue()).teamColor.equals(teamColor)) + boards.put(set.getValue().getId(), (InteractionBattleBanzaiScoreboard) set.getValue()); + } + } + + return boards; + } + } + + public THashMap getFootballScoreboards() + { + synchronized (this.gameScoreboards) + { + THashMap boards = new THashMap(); + + for (Map.Entry set : this.gameScoreboards.entrySet()) + { + if (set.getValue() instanceof InteractionFootballScoreboard) + { + boards.put(set.getValue().getId(), (InteractionFootballScoreboard) set.getValue()); + } + } + + return boards; + } + } + + public THashMap getFootballScoreboards(GameTeamColors teamColor) + { + synchronized (this.gameScoreboards) + { + THashMap boards = new THashMap(); + + for (Map.Entry set : this.gameScoreboards.entrySet()) + { + if (set.getValue() instanceof InteractionFootballScoreboard) + { + if (((InteractionFootballScoreboard) set.getValue()).teamColor.equals(teamColor)) + boards.put(set.getValue().getId(), (InteractionFootballScoreboard) set.getValue()); + } + } + + return boards; + } + } + + /* + GameGates + */ + public InteractionGameGate getGameGate(int itemId) + { + return this.gameGates.get(itemId); + } + + public void addGameGate(InteractionGameGate gameGate) + { + this.gameGates.put(gameGate.getId(), gameGate); + } + + public void removeGameGate(InteractionGameGate gameGate) + { + this.gameGates.remove(gameGate.getId()); + } + + public THashMap getFreezeGates() + { + synchronized (this.gameGates) + { + THashMap gates = new THashMap(); + + for (Map.Entry set : this.gameGates.entrySet()) + { + if (set.getValue() instanceof InteractionFreezeGate) + { + gates.put(set.getValue().getId(), (InteractionFreezeGate) set.getValue()); + } + } + + return gates; + } + } + + public THashMap getBattleBanzaiGates() + { + synchronized (this.gameGates) + { + THashMap gates = new THashMap(); + + for (Map.Entry set : this.gameGates.entrySet()) + { + if (set.getValue() instanceof InteractionBattleBanzaiGate) + { + gates.put(set.getValue().getId(), (InteractionBattleBanzaiGate) set.getValue()); + } + } + + return gates; + } + } + + /* + GameTimers + */ + public InteractionGameTimer getGameTimer(int itemId) + { + return this.gameTimers.get(itemId); + } + + public void addGameTimer(InteractionGameTimer gameTimer) + { + this.gameTimers.put(gameTimer.getId(), gameTimer); + } + + public void removeGameTimer(InteractionGameTimer gameTimer) + { + this.gameTimers.remove(gameTimer.getId()); + } + + public THashMap getGameTimers() + { + return this.gameTimers; + } + + public THashMap getFreezeTimers() + { + synchronized (this.gameTimers) + { + THashMap timers = new THashMap(); + + for (Map.Entry set : this.gameTimers.entrySet()) + { + if (set.getValue() instanceof InteractionFreezeTimer) + { + timers.put(set.getValue().getId(), (InteractionFreezeTimer) set.getValue()); + } + } + + return timers; + } + } + + public THashMap getBattleBanzaiTimers() + { + synchronized (this.gameTimers) + { + THashMap timers = new THashMap(); + + for (Map.Entry set : this.gameTimers.entrySet()) + { + if (set.getValue() instanceof InteractionBattleBanzaiTimer) + { + timers.put(set.getValue().getId(), (InteractionBattleBanzaiTimer) set.getValue()); + } + } + + return timers; + } + } + + /* + Freeze Exit Tile + */ + public InteractionFreezeExitTile getFreezeExitTile() + { + for(InteractionFreezeExitTile t : this.freezeExitTile.values()) + { + return t; + } + + return null; + } + + public InteractionFreezeExitTile getRandomFreezeExitTile() + { + synchronized (this.freezeExitTile) + { + return (InteractionFreezeExitTile) this.freezeExitTile.values().toArray()[Emulator.getRandom().nextInt(this.freezeExitTile.size())]; + } + } + + public void addFreezeExitTile(InteractionFreezeExitTile freezeExitTile) + { + this.freezeExitTile.put(freezeExitTile.getId(), freezeExitTile); + } + + public THashMap getFreezeExitTiles() + { + return this.freezeExitTile; + } + + public void removeFreezeExitTile(InteractionFreezeExitTile freezeExitTile) + { + this.freezeExitTile.remove(freezeExitTile.getId()); + } + + public boolean hasFreezeExitTile() + { + return !this.freezeExitTile.isEmpty(); + } + + public void addUndefined(HabboItem item) + { + synchronized (this.undefined) + { + this.undefined.put(item.getId(), item); + } + } + + public void removeUndefined(HabboItem item) + { + synchronized (this.undefined) + { + this.undefined.remove(item.getId()); + } + } + + public THashSet getItemsOfType(Class type) + { + THashSet items = new THashSet(); + synchronized (this.undefined) + { + for(HabboItem item : this.undefined.values()) + { + if(item.getClass() == type) + items.add(item); + } + } + + return items; + } + + public HabboItem getLowestItemsOfType(Class type) + { + HabboItem i = null; + synchronized (this.undefined) + { + for (HabboItem item : this.undefined.values()) + { + if (i == null || item.getZ() < i.getZ()) + { + if (item.getClass().isAssignableFrom(type)) + { + i = item; + } + } + } + } + + return i; + } + + public THashSet getCycleTasks() + { + return this.cycleTasks; + } + + public void addCycleTask(ICycleable task) + { + this.cycleTasks.add(task); + } + + public void removeCycleTask(ICycleable task) + { + this.cycleTasks.remove(task); + } + + public synchronized void dispose() + { + this.banzaiTeleporters.clear(); + this.nests.clear(); + this.petDrinks.clear(); + this.petFoods.clear(); + this.rollers.clear(); + + this.wiredTriggers.clear(); + this.wiredEffects.clear(); + this.wiredConditions.clear(); + + this.gameScoreboards.clear(); + this.gameGates.clear(); + this.gameTimers.clear(); + + this.freezeExitTile.clear(); + this.undefined.clear(); + this.cycleTasks.clear(); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomState.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomState.java new file mode 100644 index 00000000..f673cd7a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomState.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomState +{ + OPEN(0), + LOCKED(1), + PASSWORD(2), + INVISIBLE(3); + + private final int state; + + RoomState(int state) + { + this.state = state; + } + + public int getState() + { + return this.state; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java new file mode 100644 index 00000000..a9a24aee --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java @@ -0,0 +1,227 @@ +package com.eu.habbo.habbohotel.rooms; + +public class RoomTile +{ + public final short x; + public final short y; + public final short z; + public RoomTileState state = RoomTileState.OPEN; + + private double stackHeight = 0; + private boolean allowStack = true; + private boolean walkable = true; + + /** + * Pathfinder + */ + private RoomTile previous = null; + private boolean diagonally; + private short movementPanelty; + private short gCosts; + private short hCosts; + + /** + * @param x + * @param y + * @param z + * @param state + * @param walkable + * @param allowStack + */ + public RoomTile(short x, short y, short z, RoomTileState state, boolean walkable, boolean allowStack) + { + this.x = x; + this.y = y; + this.z = z; + this.stackHeight = z; + + this.state = state; + + this.walkable = walkable; + this.allowStack = allowStack; + if (this.state == RoomTileState.BLOCKED) + { + this.allowStack = false; + this.walkable = false; + } + } + + public RoomTile(RoomTile tile) + { + this.x = tile.x; + this.y = tile.y; + this.z = tile.z; + this.stackHeight = tile.stackHeight; + this.state = tile.state; + this.walkable = tile.walkable; + this.allowStack = tile.allowStack; + this.diagonally = tile.diagonally; + this.gCosts = tile.gCosts; + this.hCosts = tile.hCosts; + + if (this.state == RoomTileState.BLOCKED) + { + this.allowStack = false; + this.walkable = false; + } + } + + public double getStackHeight() + { + return this.stackHeight; + } + + public void setStackHeight(double stackHeight) + { + if (stackHeight >= 0) + { + this.stackHeight = stackHeight; + this.allowStack = true; + } + else + { + this.allowStack = false; + this.stackHeight = this.z; + } + } + + public boolean allowStack() + { + return this.allowStack; + } + + public void allowStack(boolean allowStack) + { + this.allowStack = allowStack; + } + + public short relativeHeight() + { + if (this.state == RoomTileState.BLOCKED || !allowStack) + { + return Short.MAX_VALUE; + } + + return (short) (this.stackHeight * 256.0); + } + + @Override + public boolean equals(Object o) + { + return o instanceof RoomTile && + ((RoomTile) o).x == this.x && + ((RoomTile) o).y == this.y; + } + + public RoomTile copy() + { + return new RoomTile(this); + } + + public double distance(RoomTile roomTile) + { + double x = this.x - roomTile.x; + double y = this.y - roomTile.y; + return Math.sqrt(x * x + y * y); + } + + public boolean isDiagonally() + { + return this.diagonally; + } + + public void isDiagonally(boolean isDiagonally) + { + this.diagonally = isDiagonally; + } + + public RoomTile getPrevious() + { + return this.previous; + } + + public void setPrevious(RoomTile previous) + { + this.previous = previous; + } + + public void setMovementPanelty(short movementPanelty) + { + this.movementPanelty = movementPanelty; + } + + public int getfCosts() + { + return this.gCosts + this.hCosts; + } + + public int getgCosts() + { + return this.gCosts; + } + + private void setgCosts(short gCosts) + { + this.gCosts = (short)(gCosts + this.movementPanelty); + } + + void setgCosts(RoomTile previousRoomTile, int basicCost) + { + setgCosts((short)(previousRoomTile.getgCosts() + basicCost)); + } + + public void setgCosts(RoomTile previousRoomTile) + { + setgCosts(previousRoomTile, this.diagonally ? RoomLayout.DIAGONALMOVEMENTCOST : RoomLayout.BASICMOVEMENTCOST); + } + + public int calculategCosts(RoomTile previousRoomTile) + { + if (this.diagonally) + { + return previousRoomTile.getgCosts() + 14 + this.movementPanelty; + } + + return previousRoomTile.getgCosts() + 10 + this.movementPanelty; + } + + public int calculategCosts(RoomTile previousRoomTile, int movementCost) + { + return previousRoomTile.getgCosts() + movementCost + this.movementPanelty; + } + + int gethCosts() + { + return this.hCosts; + } + + void sethCosts(short hCosts) + { + this.hCosts = hCosts; + } + + public void sethCosts(RoomTile parent) + { + this.hCosts = (short)((Math.abs(this.x - parent.x) + Math.abs(this.y - parent.y)) * (parent.diagonally ? RoomLayout.DIAGONALMOVEMENTCOST : RoomLayout.BASICMOVEMENTCOST)); + } + + public String toString() + { + return "RoomTile (" + this.x + ", " + this.y + ", " + this.z + "): h: " + this.hCosts + " g: " + this.gCosts + " f: " + this.getfCosts(); + } + + public boolean isWalkable() + { + return this.walkable && this.state != RoomTileState.BLOCKED; + } + + public void setWalkable(boolean walkable) + { + this.walkable = walkable; + } + + public boolean is(short x, short y) + { + return this.x == x && this.y == y; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTileState.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTileState.java new file mode 100644 index 00000000..5ea976cc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTileState.java @@ -0,0 +1,10 @@ +package com.eu.habbo.habbohotel.rooms; + +/** + * Created on 6-9-2014 14:44. + */ +public enum RoomTileState +{ + OPEN, + BLOCKED +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTrade.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTrade.java new file mode 100644 index 00000000..881e2913 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTrade.java @@ -0,0 +1,313 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.messages.outgoing.trading.*; +import gnu.trove.set.hash.THashSet; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class RoomTrade +{ + //Configuration. Loaded from database & updated accordingly. + public static boolean TRADING_ENABLED = true; + + private final List users; + private boolean tradeCompleted; + private final Room room; + + public RoomTrade(Habbo userOne, Habbo userTwo, Room room) + { + this.users = new ArrayList(); + this.tradeCompleted = false; + + this.users.add(new RoomTradeUser(userOne)); + this.users.add(new RoomTradeUser(userTwo)); + this.room = room; + + + for(RoomTradeUser roomTradeUser : this.users) + { + if(!roomTradeUser.getHabbo().getRoomUnit().getStatus().containsKey("trd")) + { + roomTradeUser.getHabbo().getRoomUnit().getStatus().put("trd", ""); + if(!roomTradeUser.getHabbo().getRoomUnit().isWalking()) + room.sendComposer(new RoomUserStatusComposer(roomTradeUser.getHabbo().getRoomUnit()).compose()); + } + } + + sendMessageToUsers(new TradeStartComposer(this)); + } + + public void offerItem(Habbo habbo, HabboItem item) + { + RoomTradeUser user = getRoomTradeUserForHabbo(habbo); + + if(user.getItems().contains(item)) + return; + + user.getItems().add(item); + + clearAccepted(); + updateWindow(); + } + + public void offerMultipleItems(Habbo habbo, THashSet items) + { + RoomTradeUser user = getRoomTradeUserForHabbo(habbo); + + for(HabboItem item : items) + { + if(!user.getItems().contains(item)) + { + user.getItems().add(item); + } + } + + clearAccepted(); + updateWindow(); + } + + public void removeItem(Habbo habbo, HabboItem item) + { + RoomTradeUser user = getRoomTradeUserForHabbo(habbo); + + if(!user.getItems().contains(item)) + return; + + user.getItems().remove(item); + + clearAccepted(); + updateWindow(); + } + + public void accept(Habbo habbo, boolean value) + { + RoomTradeUser user = getRoomTradeUserForHabbo(habbo); + + user.setAccepted(value); + + sendMessageToUsers(new TradeAcceptedComposer(user)); + boolean accepted = true; + for(RoomTradeUser roomTradeUser : this.users) + { + if(!roomTradeUser.getAccepted()) + accepted = false; + } + if(accepted) + { + sendMessageToUsers(new TradingWaitingConfirmComposer()); + } + } + + public void confirm(Habbo habbo) + { + RoomTradeUser user = getRoomTradeUserForHabbo(habbo); + + user.confirm(); + + sendMessageToUsers(new TradeAcceptedComposer(user)); + boolean accepted = true; + for(RoomTradeUser roomTradeUser : this.users) + { + if(!roomTradeUser.getConfirmed()) + accepted = false; + } + if(accepted) + { + if (tradeItems()) + { + closeWindow(); + sendMessageToUsers(new TradeCompleteComposer()); + } + this.room.stopTrade(this); + } + } + + boolean tradeItems() + { + for(RoomTradeUser roomTradeUser : this.users) + { + for(HabboItem item : roomTradeUser.getItems()) + { + if(roomTradeUser.getHabbo().getInventory().getItemsComponent().getHabboItem(item.getId()) == null) + { + sendMessageToUsers(new TradeClosedComposer(roomTradeUser.getHabbo().getRoomUnit().getId(), TradeClosedComposer.ITEMS_NOT_FOUND)); + return false; + } + } + } + + RoomTradeUser userOne = this.users.get(0); + RoomTradeUser userTwo = this.users.get(1); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + + int tradeId = 0; + + boolean logTrades = Emulator.getConfig().getBoolean("hotel.log.trades"); + if (logTrades) + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO room_trade_log (user_one_id, user_two_id, user_one_ip, user_two_ip, timestamp, user_one_item_count, user_two_item_count) VALUES (?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, userOne.getHabbo().getHabboInfo().getId()); + statement.setInt(2, userTwo.getHabbo().getHabboInfo().getId()); + statement.setString(3, userOne.getHabbo().getHabboInfo().getIpLogin()); + statement.setString(4, userTwo.getHabbo().getHabboInfo().getIpLogin()); + statement.setInt(5, Emulator.getIntUnixTimestamp()); + statement.setInt(6, userOne.getItems().size()); + statement.setInt(7, userTwo.getItems().size()); + statement.executeUpdate(); + try (ResultSet generatedKeys = statement.getGeneratedKeys()) + { + if (generatedKeys.next()) + { + tradeId = generatedKeys.getInt(1); + } + } + } + } + + int userOneId = userOne.getHabbo().getHabboInfo().getId(); + int userTwoId = userTwo.getHabbo().getHabboInfo().getId(); + + try (PreparedStatement statement = connection.prepareStatement("UPDATE items SET user_id = ? WHERE id = ? LIMIT 1")) + { + try (PreparedStatement stmt = connection.prepareStatement("INSERT INTO room_trade_log_items (id, item_id, user_id) VALUES (?, ?, ?)")) + { + for (HabboItem item : userOne.getItems()) + { + item.setUserId(userTwoId); + statement.setInt(1, userTwoId); + statement.setInt(2, item.getId()); + userOne.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); + userTwo.getHabbo().getInventory().getItemsComponent().addItem(item); + statement.addBatch(); + + if (logTrades) + { + stmt.setInt(1, tradeId); + stmt.setInt(2, item.getId()); + stmt.setInt(3, userOneId); + stmt.addBatch(); + } + } + + for (HabboItem item : userTwo.getItems()) + { + item.setUserId(userOneId); + statement.setInt(1, userOneId); + statement.setInt(2, item.getId()); + userTwo.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); + userOne.getHabbo().getInventory().getItemsComponent().addItem(item); + statement.addBatch(); + + if (logTrades) + { + stmt.setInt(1, tradeId); + stmt.setInt(2, item.getId()); + stmt.setInt(3, userTwoId); + stmt.addBatch(); + } + } + + if (logTrades) + { + stmt.executeBatch(); + } + } + + statement.executeBatch(); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + userOne.getHabbo().getClient().sendResponse(new AddHabboItemComposer(userTwo.getItems())); + userTwo.getHabbo().getClient().sendResponse(new AddHabboItemComposer(userOne.getItems())); + + userOne.getHabbo().getClient().sendResponse(new InventoryRefreshComposer()); + userTwo.getHabbo().getClient().sendResponse(new InventoryRefreshComposer()); + return true; + } + + void clearAccepted() + { + for(RoomTradeUser user : this.users) + { + user.setAccepted(false); + } + } + + void updateWindow() + { + this.sendMessageToUsers(new TradeUpdateComposer(this)); + } + + private void closeWindow() + { + removeStatusses(); + + sendMessageToUsers(new TradeCloseWindowComposer()); + } + + public void stopTrade(Habbo habbo) + { + this.removeStatusses(); + this.clearAccepted(); + for (RoomTradeUser user : this.users) + { + user.clearItems(); + } + this.updateWindow(); + this.sendMessageToUsers(new TradeClosedComposer(habbo.getHabboInfo().getId(), TradeClosedComposer.USER_CANCEL_TRADE)); + this.room.stopTrade(this); + } + + private void removeStatusses() + { + for(RoomTradeUser user : this.users) + { + Habbo habbo = user.getHabbo(); + + if(habbo == null) + continue; + + habbo.getRoomUnit().getStatus().remove("trd"); + this.room.sendComposer(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + } + } + + public RoomTradeUser getRoomTradeUserForHabbo(Habbo habbo) + { + for(RoomTradeUser roomTradeUser : this.users) + { + if(roomTradeUser.getHabbo() == habbo) + return roomTradeUser; + } + return null; + } + + void sendMessageToUsers(MessageComposer message) + { + for(RoomTradeUser roomTradeUser : this.users) + { + roomTradeUser.getHabbo().getClient().sendResponse(message); + } + } + + public List getRoomTradeUsers() + { + return this.users; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTradeUser.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTradeUser.java new file mode 100644 index 00000000..9803eabf --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTradeUser.java @@ -0,0 +1,62 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.set.hash.THashSet; + +public class RoomTradeUser +{ + private final Habbo habbo; + private boolean accepted; + private boolean confirmed; + private final THashSet items; + + public RoomTradeUser(Habbo habbo) + { + this.habbo = habbo; + this.accepted = false; + this.confirmed = false; + this.items = new THashSet(); + } + + public Habbo getHabbo() + { + return this.habbo; + } + + public boolean getAccepted() + { + return this.accepted; + } + + public boolean getConfirmed() + { + return this.confirmed; + } + + public void setAccepted(boolean value) + { + this.accepted = value; + } + + public void confirm() + { + this.confirmed = true; + } + + public void addItem(HabboItem item) + { + this.items.add(item); + } + + public THashSet getItems() + { + return this.items; + } + + public void clearItems() + { + this.items.clear(); + } +} + diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java new file mode 100644 index 00000000..7ffd56fb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java @@ -0,0 +1,663 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionGuildGate; +import com.eu.habbo.habbohotel.items.interactions.InteractionMultiHeight; +import com.eu.habbo.habbohotel.items.interactions.InteractionTeleport; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeBlock; +import com.eu.habbo.habbohotel.users.DanceType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.roomunit.RoomUnitLookAtPointEvent; +import com.eu.habbo.plugin.events.roomunit.RoomUnitSetGoalEvent; +import com.eu.habbo.plugin.events.users.UserIdleEvent; +import com.eu.habbo.plugin.events.users.UserTakeStepEvent; +import com.eu.habbo.threading.runnables.RoomUnitKick; +import com.eu.habbo.util.pathfinding.Rotation; +import gnu.trove.map.TMap; +import gnu.trove.map.hash.THashMap; + +import java.util.Deque; +import java.util.LinkedList; + +public class RoomUnit +{ + private int id; + private RoomTile startLocation; + private RoomTile previousLocation; + private RoomTile currentLocation; + private RoomTile goalLocation; + + private double z; + + private int tilesWalked; + + private boolean inRoom; + private boolean canWalk; + private boolean fastWalk = false; + public boolean animateWalk = false; + public boolean cmdTeleport = false; + public boolean cmdSit = false; + public boolean cmdLay = false; + public boolean sitUpdate = false; + public boolean isTeleporting = false; + public boolean isKicked = false; + + private final THashMap status; + private final THashMap cacheable; + private RoomUserRotation bodyRotation = RoomUserRotation.NORTH; + private RoomUserRotation headRotation = RoomUserRotation.NORTH; + private DanceType danceType; + private RoomUnitType roomUnitType; + private Deque path = new LinkedList<>(); + private int handItem; + private long handItemTimestamp; + private int walkTimeOut; + private int effectId; + + private int idleTimer; + private Room room; + private RoomRightLevels rightsLevel = RoomRightLevels.NONE; + + public RoomUnit() + { + this.id = 0; + this.inRoom = false; + this.canWalk = true; + this.status = new THashMap(); + this.cacheable = new THashMap(); + this.roomUnitType = RoomUnitType.UNKNOWN; + this.bodyRotation = RoomUserRotation.NORTH; + this.bodyRotation = RoomUserRotation.NORTH; + this.danceType = DanceType.NONE; + this.handItem = 0; + this.handItemTimestamp = 0; + this.walkTimeOut = Emulator.getIntUnixTimestamp(); + this.effectId = 0; + this.isKicked = false; + } + + public void clearWalking() + { + this.goalLocation = null; + this.startLocation = this.currentLocation; + this.inRoom = false; + + synchronized (this.status) + { + this.status.clear(); + } + + this.cacheable.clear(); + } + + public void stopWalking() + { + synchronized (this.status) + { + this.status.remove("mv"); + this.setGoalLocation(this.currentLocation); + } + } + + public boolean cycle(Room room) + { + try + { + /** + * !this.status.containsKey("mv") && + */ + if (!this.isWalking() && !isKicked) + { + if (this.status.remove("mv") == null) + { + return true; + } + } + + if (this.status.containsKey("mv")) + { + this.status.remove("mv"); + } + if (this.status.containsKey("lay")) + { + this.status.remove("lay"); + } + if (this.status.containsKey("sit")) + { + this.status.remove("sit"); + } + + if (this.path == null || this.path.isEmpty()) + return true; + + if (this.fastWalk && this.path.size() >= 3) + { + this.path.poll(); + this.path.poll(); + } + + RoomTile next = this.path.poll(); + + if (this.path.isEmpty()) + { + this.sitUpdate = true; + + if (room.hasHabbosAt(next.x, next.y)) + { + return false; + } + } + + Deque peekPath = room.getLayout().findPath(this.currentLocation, this.path.peek()); + if (peekPath.size() >= 3) + { + peekPath.pop(); //Start + peekPath.removeLast(); //End + + if (peekPath.peek() != next) + { + next = peekPath.poll(); + for (int i = 0; i < peekPath.size(); i++) + { + this.path.addFirst(peekPath.removeLast()); + } + } + } + + if (next == null) + return true; + + Habbo habbo = room.getHabbo(this); + + if (this.status.containsKey("ded")) + { + this.status.remove("ded"); + } + + if (habbo != null) + { + if (this.isIdle()) + { + UserIdleEvent event = new UserIdleEvent(habbo, UserIdleEvent.IdleReason.WALKED, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (!event.idle) + { + room.unIdle(habbo); + this.idleTimer = 0; + } + } + } + + if (Emulator.getPluginManager().isRegistered(UserTakeStepEvent.class, false)) + { + Event e = new UserTakeStepEvent(habbo, room.getLayout().getTile(this.getX(), this.getY()), next); + Emulator.getPluginManager().fireEvent(e); + + if (e.isCancelled()) + return true; + } + } + + HabboItem item = room.getTopItemAt(next.x, next.y); + + + //if(!(this.path.size() == 0 && canSitNextTile)) + { + if (!room.tileWalkable(next.x, next.y) && !(item instanceof InteractionTeleport)) + { + this.room = room; + this.findPath(); + + if (!this.path.isEmpty()) + { + next = this.path.pop(); + item = room.getTopItemAt(next.x, next.y); + } + else + { + this.status.remove("mv"); + return false; + } + + } + } + + boolean canSitNextTile = room.canSitAt(next.x, next.y); + + if (canSitNextTile) + { + HabboItem lowestChair = room.getLowestChair(next); + + if (lowestChair != null) + item = lowestChair; + } + + double zHeight = 0.0D; + + if (habbo != null) + { + if (habbo.getHabboInfo().getRiding() != null) + { + zHeight += 1.0D; + } + } + + HabboItem habboItem = room.getTopItemAt(this.getX(), this.getY()); + if (habboItem != null) + { + if (habboItem != item || !RoomLayout.pointInSquare(habboItem.getX(), habboItem.getY(), habboItem.getX() + habboItem.getBaseItem().getWidth() - 1, habboItem.getY() + habboItem.getBaseItem().getLength() - 1, next.x, next.y)) + habboItem.onWalkOff(this, room, null); + } + + this.tilesWalked++; + + RoomUserRotation oldRotation = this.getBodyRotation(); + this.setRotation(RoomUserRotation.values()[Rotation.Calculate(this.getX(), this.getY(), next.x, next.y)]); + if (item != null) + { + if (item != habboItem || !RoomLayout.pointInSquare(item.getX(), item.getY(), item.getX() + item.getBaseItem().getWidth() - 1, item.getY() + item.getBaseItem().getLength() - 1, this.getX(), this.getY())) + { + if (item.canWalkOn(this, room, null)) + { + item.onWalkOn(this, room, null); + } + else if (item instanceof InteractionGuildGate) + { + this.setRotation(oldRotation); + this.tilesWalked--; + this.setGoalLocation(this.currentLocation); + this.status.remove("mv"); + room.sendComposer(new RoomUserStatusComposer(this).compose()); + return false; + } + } + else + { + item.onWalk(this, room, null); + } + + zHeight += item.getZ(); + + if (!item.getBaseItem().allowSit() && !item.getBaseItem().allowLay()) + { + zHeight += item.getBaseItem().getHeight(); + + if (item instanceof InteractionMultiHeight) + { + if (item.getExtradata().length() == 0) + { + item.setExtradata("0"); + } + zHeight += Item.getCurrentHeight(item); + } + else if (item instanceof InteractionFreezeBlock) + { + zHeight -= item.getBaseItem().getHeight(); + } + } + } + else + { + zHeight += room.getLayout().getHeightAtSquare(next.x, next.y); + } + + this.previousLocation = this.currentLocation; + this.status.put("mv", next.x + "," + next.y + "," + zHeight); + if (habbo != null) + { + if (habbo.getHabboInfo().getRiding() != null) + { + RoomUnit ridingUnit = habbo.getHabboInfo().getRiding().getRoomUnit(); + + if (ridingUnit != null) + { + ridingUnit.getStatus().put("mv", next.x + "," + next.y + "," + (zHeight - 1.0)); + } + } + } + //room.sendComposer(new RoomUserStatusComposer(this).compose()); + + this.setZ(zHeight); + this.setCurrentLocation(room.getLayout().getTile((short) next.x, (short) next.y)); + this.resetIdleTimer(); + + if (habbo != null) + { + if (next.x == room.getLayout().getDoorX() && next.y == room.getLayout().getDoorY() && (!room.isPublicRoom()) || (room.isPublicRoom() && Emulator.getConfig().getBoolean("hotel.room.public.doortile.kick"))) + { + Emulator.getThreading().run(new RoomUnitKick(habbo, room, false), 500); + } + } + + return false; + + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + return false; + } + } + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public RoomTile getCurrentLocation() + { + return this.currentLocation; + } + + public short getX() + { + return this.currentLocation.x; + } + + public short getY() + { + return this.currentLocation.y; + } + + public double getZ() + { + return this.z; + } + + public void setZ(double z) + { + this.z = z; + } + + public boolean isInRoom() { + return inRoom; + } + + public synchronized void setInRoom(boolean inRoom) { + this.inRoom = inRoom; + } + + public RoomUnitType getRoomUnitType() { + return roomUnitType; + } + + public synchronized void setRoomUnitType(RoomUnitType roomUnitType) { + this.roomUnitType = roomUnitType; + } + + public void setRotation(RoomUserRotation rotation) + { + this.bodyRotation = rotation; + this.headRotation = rotation; + } + + public RoomUserRotation getBodyRotation() { + return bodyRotation; + } + + public void setBodyRotation(RoomUserRotation bodyRotation) { + this.bodyRotation = bodyRotation; + } + + public RoomUserRotation getHeadRotation() { + return headRotation; + } + + public void setHeadRotation(RoomUserRotation headRotation) + { + this.headRotation = headRotation; + } + + public DanceType getDanceType() { + return danceType; + } + + public synchronized void setDanceType(DanceType danceType) { + this.danceType = danceType; + } + + public void setCanWalk(boolean value) + { + this.canWalk = value; + } + + public boolean canWalk() + { + return this.canWalk; + } + + public void setFastWalk(boolean fastWalk) + { + this.fastWalk = fastWalk; + } + + public boolean isFastWalk() + { + return this.fastWalk; + } + + public RoomTile getStartLocation() + { + return this.startLocation; + } + + public int tilesWalked() + { + return this.tilesWalked; + } + + public RoomTile getGoal() + { + return this.goalLocation; + } + + public void setGoalLocation(RoomTile goalLocation) + { + this.setGoalLocation(goalLocation, false); + } + + public void setGoalLocation(RoomTile goalLocation, boolean noReset) + { + if (Emulator.getPluginManager().isRegistered(RoomUnitSetGoalEvent.class, false)) + { + Event event = new RoomUnitSetGoalEvent(this.room, this, goalLocation); + Emulator.getPluginManager().fireEvent(event); + + if (event.isCancelled()) + return; + } + + this.startLocation = this.currentLocation; + + if (goalLocation != null && !noReset) + { + this.goalLocation = goalLocation; + this.tilesWalked = 0; + this.findPath(); + this.cmdSit = false; + } + } + + public void setLocation(RoomTile location) + { + if (location != null) + { + this.startLocation = location; + this.previousLocation = location; + this.currentLocation = location; + this.goalLocation = location; + } + } + + public void setCurrentLocation(RoomTile location) + { + if (location != null) + { + this.currentLocation = location; + } + } + + public RoomTile getPreviousLocation() + { + return this.previousLocation; + } + + public void setPreviousLocation(RoomTile previousLocation) + { + this.previousLocation = previousLocation; + } + + public void setPathFinderRoom(Room room) + { + this.room = room; + } + + public void findPath() + { + if (this.room != null && this.room.getLayout() != null && this.goalLocation != null && (this.goalLocation.isWalkable() || this.room.canSitOrLayAt(this.goalLocation.x, this.goalLocation.y))) + { + this.path = this.room.getLayout().findPath(this.currentLocation, this.goalLocation); + } + } + + public boolean isAtGoal() + { + return this.currentLocation.equals(this.goalLocation); + } + + public boolean isWalking() + { + return !isAtGoal() && this.canWalk; + } + + public synchronized THashMap getStatus() + { + return this.status; + } + + public synchronized boolean hasStatus(String key) + { + return this.status.containsKey(key); + } + + public TMap getCacheable() + { + return this.cacheable; + } + + public int getHandItem() + { + return this.handItem; + } + + public void setHandItem(int handItem) + { + this.handItem = handItem; + this.handItemTimestamp = System.currentTimeMillis(); + } + + public long getHandItemTimestamp() + { + return this.handItemTimestamp; + } + + public int getEffectId() + { + return this.effectId; + } + + public void setEffectId(int effectId) + { + this.effectId = effectId; + } + + public int getWalkTimeOut() + { + return this.walkTimeOut; + } + + public void setWalkTimeOut(int walkTimeOut) + { + this.walkTimeOut = walkTimeOut; + } + + public void increaseIdleTimer() + { + this.idleTimer++; + } + + public boolean isIdle() + { + return this.idleTimer > Room.IDLE_CYCLES; //Amount of room cycles / 2 = seconds. + } + + public int getIdleTimer() + { + return this.idleTimer; + } + + public void resetIdleTimer() + { + this.idleTimer = 0; + } + + public void setIdle() + { + this.idleTimer = Room.IDLE_CYCLES + 1; + } + + public void lookAtPoint(RoomTile location) + { + if(Emulator.getPluginManager().isRegistered(RoomUnitLookAtPointEvent.class, false)) + { + Event lookAtPointEvent = new RoomUnitLookAtPointEvent(this.room, this, location); + Emulator.getPluginManager().fireEvent(lookAtPointEvent); + + if(lookAtPointEvent.isCancelled()) + return; + } + + if (this.status.containsKey("lay")) + { + return; + } + + if (!this.status.containsKey("sit")) + { + this.bodyRotation = (RoomUserRotation.values()[Rotation.Calculate(this.getX(), this.getY(), location.x, location.y)]); + } + + RoomUserRotation rotation = (RoomUserRotation.values()[Rotation.Calculate(this.getX(), this.getY(), location.x, location.y)]); + + if (Math.abs(rotation.getValue() - this.bodyRotation.getValue()) <= 1) + { + this.headRotation = rotation; + } + } + + public Deque getPath() + { + return path; + } + + public RoomRightLevels getRightsLevel() + { + return rightsLevel; + } + + public void setRightsLevel(RoomRightLevels rightsLevel) + { + this.rightsLevel = rightsLevel; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitEffect.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitEffect.java new file mode 100644 index 00000000..0789d712 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitEffect.java @@ -0,0 +1,227 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomUnitEffect +{ + //(\w+)\s(\w+)\s(\w+) + //\2\(\1\), + NONE(0), + SPOTLIGHT(1), + HOVERBOARD(2), + UFOBLUE(3), + TWINKLE(4), + TORCH(5), + JETPACK(6), + BUTTERFLIES(7), + FIREFLIES(8), + LOVE(9), + FLIES(10), + XRAY(11), + ICE(12), + GHOST(13), + HOVERBOARDPINK(14), + HOVERBOARDYELLOW(15), + MICROPHONE(16), + UFOPINK(17), + UFOYELLOW(18), + CARPOLICE(19), + CARAMBULANCE(20), + CARDOLLAR(21), + CARTOPFUEL(22), + TOTEMMAN(23), + TOTEMMERDRAGON(24), + TOTEMEAGLE(25), + TOTEMMIX(26), + VIKING(27), + SPLASH(28), + SWIMMING(29), + WADE(30), + CHEETOS(31), + DESPICABLEME(32), + BBRED(33), + BBGREEN(34), + BBBLUE(35), + BBYELLOW(36), + WADEINSWAMP(37), + ICESKATINGBOYS(38), + ICESKATINGGIRLS(39), + ESRED(40), + ESGREEN(41), + ESBLUE(42), + ESYELLOW(43), + SIMS(44), + TAGGEDICESKATINGBOYS(45), + TAGGEDICESKATINGGIRLS(46), + MEGAMIND(47), + CARDOGGY(48), + ESREDUNTOUCHABLE(49), + ESGREENUNTOUCHABLE(50), + ESBLUEUNTOUCHABLE(51), + ESYELLOWUNTOUCHABLE(52), + EASTERCHICKS(53), + EASTERBUNNY(54), + ROLLERSKATINGBOYS(55), + ROLLERSKATINGGIRLS(56), + TAGGEDROLLERSKATINGBOYS(57), + TAGGEDROLLERSKATINGGIRLS(58), + SUNNYDELIGHT(59), + RANGO(60), + DISNEYCHANNELEFFECT1(61), + DISNEYCHANNELEFFECT2(62), + DISNEYCHANNELEFFECT3(63), + CANDLE(64), + MOBILE0800(65), + DISNEYWIZARDSOFWAVERLY(66), + RIOPARROT(67), + EASTERTAGGING(68), + VOLKSWAGEN(69), + KUNGFUPANDA(70), + SKATEBOARD1(71), + SKATEBOARD2(72), + CHUPACHUPS(73), + LEI1(74), + LEI2(75), + LEI3(76), + RIDING(77), + PERRY(78), + ALIENMASK(79), + GIANTMOUTH(80), + SWAMPCREATUREMASK(81), + INKBLOTMASK(82), + MIMEMASK(83), + MUMMYMASK(84), + PUMPKINMASK(85), + SCARECROWMASK(86), + WOLFMASK(87), + ZOMBIEMASK(88), + BACKKNIFE(89), + BUTTERYFLYWINGS1(90), + FAIRYWINGS1(91), + GHOSTSHEET(92), + HEADLESS(93), + LIISUTRUCK(94), + SNOWWARRED(95), + SNOWWARBLUE(96), + SNOWBOARDPLCH(97), + SNOWSTORMCROSSHAIR(98), + NIKO(99), + DRAGON(100), + BANGGUN(101), + STAFF(102), + RIDINGSADDLE2(103), + PIE(104), + DUBBELFRISSS(105), + BLUETORCH(106), + PLASTOPODCHAIR(107), + NINJADISAPPEAR(108), + MEDAL1(109), + MEDAL2(110), + MEDAL3(111), + SPIDERMAN(112), + RAINCLOUD(113), + STRONGARMS(114), + RINGMASTER(115), + FLY(116), + EXECUTIONER(117), + EVILCLOWN(118), + DARKALIENMASK(119), + GIANTMOUTH2(120), + SWAMPCREATUREMASK2(121), + INKBLOTMASK2(122), + MIMEMASK2(123), + MUMMY2MASK(124), + FROSTPUMPKINMASK(125), + SCARECROWMASK2(126), + EVILWOLFMASK(127), + ZOMBIEMASK2(128), + BACKKNIFE2(129), + BUTTERYFLYWINGS2(130), + FAIRYWINGS2(131), + GLOWINGGHOSTSHEET(132), + HEADLESS2(133), + SNAKEBODY(134), + PUPPETMASTER(135), + BACKWALKINGSHOES(136), + GOLDSPOTLIGHT(137), + GOLDENGLASSES(138), + GOLDMICROPHONE(139), + HABNAMDANCE(140), + FLOWERMASK(141), + GOATMASK(142), + FEATHERMASK1(143), + FEATHERMASK2(144), + FEATHERMASK3(145), + FEATHERMASK4(146), + PEACOCK1MASK(147), + PEACOCK2MASK(148), + PEACOCK3MASK(149), + PEACOCK4MASK(150), + GOATMASK2(151), + GOATMASK3(152), + FLOWERMASK2(153), + MASSIVEEGG(154), + BCRYSTAL(155), + GCRYSTAL(156), + PIMPLE(157), + PINATA(158), + BARREL(159), + PIRATECAPTAIN(160), + PIRATECREW(161), + PIRATESWORD(162), + HEADONTHEGROUND(163), + PIRATEGUN(164), + SPINNINGTHUMBSUP(165), + GOBLIN(166), + MUTANT(167), + SPINNINGHEATS(168), + SLIMED(169), + DUCK(170), + SPACEBUNNY(171), + REDVIKING(172), + GREENVIKING(173), + HOVERBOARDGREEN(174), + REDAIRPLANE(175), + BLUEAIRPLANE(176), + TARANDFEATHER(177), + AMBASSADOR(178), + LUCHADOR(179), + DAYOFTHEDEAD(180), + DAYOFTHEDEAD2(181), + CYBERPUNKGUN(182), + FOSSILHAMMER(183), + SPLASHEVIL(184), + SWIMEVIL(185), + MAGICWAND(186), + BOT(187), + CAMERABOT(188), + MOBILEDISCO(189), + MOBILEDISCO2(190), + HOVERPLANK(191), + WATERINGCAN(192), + TRAMPOLINEJUMP(193), + TREADMILL(194), + CROSSTRAINER(195); + + private int id; + RoomUnitEffect(int id) + { + this.id = id; + } + + public int getId() + { + return this.id; + } + + public static RoomUnitEffect fromId(int id) + { + for (RoomUnitEffect effect : RoomUnitEffect.values()) + { + if (effect.id == id) + { + return effect; + } + } + + return RoomUnitEffect.NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitType.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitType.java new file mode 100644 index 00000000..f6efe8bc --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitType.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomUnitType +{ + USER(1), + BOT(4), + PET(2), + UNKNOWN(3); + + private final int typeId; + + RoomUnitType(int typeId) + { + this.typeId = typeId; + } + + public int getTypeId() + { + return this.typeId; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserAction.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserAction.java new file mode 100644 index 00000000..52b672a9 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserAction.java @@ -0,0 +1,37 @@ +package com.eu.habbo.habbohotel.rooms; + +public enum RoomUserAction +{ + NONE(0), + WAVE(1), + BLOW_KISS(2), + LAUGH(3), + UNKNOWN(4), + IDLE(5), + JUMP(6), + THUMB_UP(7); + + private final int action; + RoomUserAction(int action) + { + this.action = action; + } + + public int getAction() + { + return this.action; + } + + public static RoomUserAction fromValue(int value) + { + for (RoomUserAction action : RoomUserAction.values()) + { + if (action.getAction() == value) + { + return action; + } + } + + return NONE; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserRotation.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserRotation.java new file mode 100644 index 00000000..b3d5522f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUserRotation.java @@ -0,0 +1,51 @@ +package com.eu.habbo.habbohotel.rooms; + +/** + * Created on 13-9-2014 17:14. + */ +public enum RoomUserRotation { + NORTH(0), + NORTH_EAST(1), + EAST(2), + SOUTH_EAST(3), + SOUTH(4), + SOUTH_WEST(5), + WEST(6), + NORTH_WEST(7); + + private final int direction; + + RoomUserRotation(int direction) + { + this.direction = direction; + } + + public int getValue() + { + return this.direction; + } + + public static RoomUserRotation fromValue(int rotation) + { + rotation %= 8; + for (RoomUserRotation rot : values()) + { + if (rot.getValue() == rotation) + { + return rot; + } + } + + return NORTH; + } + + public static RoomUserRotation counterClockwise(RoomUserRotation rotation) + { + return fromValue(rotation.getValue() + 7); + } + + public static RoomUserRotation clockwise(RoomUserRotation rotation) + { + return fromValue(rotation.getValue() + 9); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java new file mode 100644 index 00000000..4dd95975 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java @@ -0,0 +1,295 @@ +package com.eu.habbo.habbohotel.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Disposable; +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.habbohotel.items.interactions.InteractionJukeBox; +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.*; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class TraxManager implements Disposable +{ + private final Room room; + private final List songs = new ArrayList<>(0); + private int totalLength = 0; + private int startedTimestamp; + private InteractionMusicDisc currentlyPlaying = null; + private int playingIndex = 0; + + private boolean disposed = false; + + public TraxManager(Room room) + { + this.room = room; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM room_trax_playlist WHERE room_id = ?")) + { + statement.setInt(1, this.room.getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + HabboItem musicDisc = this.room.getHabboItem(set.getInt("item_id")); + if (musicDisc != null && musicDisc instanceof InteractionMusicDisc) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) musicDisc).getSongId()); + + if (track != null) + { + this.songs.add((InteractionMusicDisc) musicDisc); + this.totalLength += track.getLength(); + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void cycle() + { + if (this.isPlaying()) + { + if (timePlaying() >= this.totalLength) + { + this.play(0); + //restart + } + + if (Emulator.getIntUnixTimestamp() >= this.startedTimestamp + this.currentSong().getLength()) + { + this.play((this.playingIndex + 1) % this.songs.size()); + } + } + } + + public void play(int index) + { + if (this.currentlyPlaying == null) + { + for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionJukeBox.class)) + { + item.setExtradata("1"); + this.room.updateItem(item); + } + } + + if (!this.songs.isEmpty()) + { + index = index % this.songs.size(); + + this.currentlyPlaying = this.songs.get(index); + + if (this.currentlyPlaying != null) + { + this.room.setJukeBoxActive(true); + this.startedTimestamp = Emulator.getIntUnixTimestamp(); + this.playingIndex = index; + } + + this.room.sendComposer(new JukeBoxNowPlayingMessageComposer(Emulator.getGameEnvironment().getItemManager().getSoundTrack(this.currentlyPlaying.getSongId()), this.playingIndex, 0).compose()); + } + else + { + this.stop(); + } + } + + public void stop() + { + this.room.setJukeBoxActive(false); + this.currentlyPlaying = null; + this.startedTimestamp = 0; + this.playingIndex = 0; + + for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionJukeBox.class)) + { + item.setExtradata("0"); + this.room.updateItem(item); + } + + this.room.sendComposer(new JukeBoxNowPlayingMessageComposer(null, -1, 0).compose()); + } + + public SoundTrack currentSong() + { + return Emulator.getGameEnvironment().getItemManager().getSoundTrack(this.songs.get(this.playingIndex).getSongId()); + } + + public void addSong(int itemId) + { + HabboItem musicDisc = this.room.getHabboItem(itemId); + + if (musicDisc != null && musicDisc instanceof InteractionMusicDisc) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) musicDisc).getSongId()); + + if (track != null) + { + this.totalLength += track.getLength(); + this.songs.add((InteractionMusicDisc) musicDisc); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_trax_playlist (room_id, item_id) VALUES (?, ?)")) + { + statement.setInt(1, this.room.getId()); + statement.setInt(2, itemId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + return; + } + + this.room.sendComposer(new JukeBoxPlayListComposer(this.songs, this.totalLength).compose()); + this.room.sendComposer(new JukeBoxMySongsComposer(this.myList()).compose()); + } + } + } + + public void removeSong(int itemId) + { + InteractionMusicDisc musicDisc = this.fromItemId(itemId); + + if (musicDisc != null) + { + this.songs.remove(musicDisc); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_trax_playlist WHERE room_id = ? AND item_id = ? LIMIT 1")) + { + statement.setInt(1, this.room.getId()); + statement.setInt(2, itemId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + return; + } + + this.totalLength -= Emulator.getGameEnvironment().getItemManager().getSoundTrack(musicDisc.getSongId()).getLength(); + if (this.currentlyPlaying == musicDisc) + { + this.play(this.playingIndex); + } + + this.room.sendComposer(new JukeBoxPlayListComposer(this.songs, this.totalLength).compose()); + } + this.room.sendComposer(new JukeBoxMySongsComposer(this.myList()).compose()); + } + + public int timePlaying() + { + return Emulator.getIntUnixTimestamp() - this.startedTimestamp; + } + + public int totalLength() + { + return totalLength; + } + + public List getSongs() + { + return songs; + } + + public boolean isPlaying() + { + return this.currentlyPlaying != null; + } + + public List soundTrackList() + { + List trax = new ArrayList<>(this.songs.size()); + + for (InteractionMusicDisc musicDisc : this.songs) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(musicDisc.getSongId()); + + if (track != null) + { + trax.add(track); + } + } + + return trax; + } + + public List myList() + { + List trax = new ArrayList<>(); + + for (HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionMusicDisc.class)) + { + if (!this.songs.contains(item)) + { + trax.add((InteractionMusicDisc) item); + } + } + + return trax; + } + + public InteractionMusicDisc fromItemId(int itemId) + { + for (InteractionMusicDisc musicDisc : this.songs) + { + if (musicDisc.getId() == itemId) + { + return musicDisc; + } + } + + return null; + } + + public void clearPlayList() + { + this.songs.clear(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_trax_playlist WHERE room_id = ?")) + { + statement.setInt(1, this.room.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void updateCurrentPlayingSong(Habbo habbo) + { + if (this.isPlaying()) + { + habbo.getClient().sendResponse(new JukeBoxNowPlayingMessageComposer(Emulator.getGameEnvironment().getItemManager().getSoundTrack(this.currentlyPlaying.getSongId()), this.playingIndex, 1000 * (Emulator.getIntUnixTimestamp() - this.startedTimestamp))); + } + else + { + habbo.getClient().sendResponse(new JukeBoxNowPlayingMessageComposer(null, -1, 0)); + } + } + + @Override + public void dispose() + { + this.disposed = true; + } + + @Override + public boolean disposed() + { + return this.disposed; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/DanceType.java b/src/main/java/com/eu/habbo/habbohotel/users/DanceType.java new file mode 100644 index 00000000..c0f5e08e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/DanceType.java @@ -0,0 +1,22 @@ +package com.eu.habbo.habbohotel.users; + +public enum DanceType +{ + NONE(0), + HAB_HOP(1), + POGO_MOGO(2), + DUCK_FUNK(3), + THE_ROLLIE(4); + + private final int type; + + DanceType(int type) + { + this.type = type; + } + + public int getType() + { + return this.type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java b/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java new file mode 100644 index 00000000..2db0dda5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java @@ -0,0 +1,558 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.MessagesForYouComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.StaffAlertWithLinkComposer; +import com.eu.habbo.messages.outgoing.inventory.*; +import com.eu.habbo.messages.outgoing.rooms.FloodCounterComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserIgnoredComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.*; +import com.eu.habbo.plugin.events.users.UserCreditsEvent; +import com.eu.habbo.plugin.events.users.UserDisconnectEvent; +import com.eu.habbo.plugin.events.users.UserPointsEvent; +import gnu.trove.set.hash.THashSet; + +import java.net.InetSocketAddress; +import java.sql.ResultSet; + +public class Habbo implements Runnable +{ + private GameClient client; + + private final HabboInfo habboInfo; + private final HabboStats habboStats; + private final Messenger messenger; + private final HabboInventory habboInventory; + private RoomUnit roomUnit; + + private volatile boolean update; + private volatile boolean disconnected = false; + private volatile boolean disconnecting = false; + + public boolean firstVisit = false; + + public Habbo(ResultSet set) + { + this.client = null; + this.habboInfo = new HabboInfo(set); + this.habboStats = HabboStats.load(this); + this.habboInventory = new HabboInventory(this); + + this.messenger = new Messenger(); + this.messenger.loadFriends(this); + this.messenger.loadFriendRequests(this); + + this.roomUnit = new RoomUnit(); + this.roomUnit.setRoomUnitType(RoomUnitType.USER); + + this.update = false; + } + + public boolean isOnline() + { + return this.habboInfo.isOnline(); + } + + void isOnline(boolean value) + { + this.habboInfo.setOnline(value); + this.update(); + } + + void update() + { + this.update = true; + Emulator.getThreading().run(this); + } + + void needsUpdate(boolean value) + { + this.update = value; + } + + boolean needsUpdate() + { + return this.update; + } + + public Messenger getMessenger() + { + return this.messenger; + } + + public HabboInfo getHabboInfo() + { + return this.habboInfo; + } + + public HabboStats getHabboStats() + { + return this.habboStats; + } + + public HabboInventory getInventory() + { + return this.habboInventory; + } + + public RoomUnit getRoomUnit() + { + return this.roomUnit; + } + + public void setRoomUnit(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + public GameClient getClient() + { + return this.client; + } + + public void setClient(GameClient client) + { + this.client = client; + } + + /* + Called upon succesfull SSO Login. NOT socket connection. + */ + public void connect() + { + if (!Emulator.getConfig().getBoolean("networking.tcp.proxy")) + { + this.habboInfo.setIpLogin(((InetSocketAddress) this.client.getChannel().remoteAddress()).getAddress().getHostAddress()); + } + + this.isOnline(true); + + this.messenger.connectionChanged(this, true, false); + + Emulator.getGameEnvironment().getRoomManager().loadRoomsForHabbo(this); + Emulator.getLogging().logUserLine(this.habboInfo.getUsername() + " logged in from IP " + this.habboInfo.getIpLogin()); + } + + + public synchronized void disconnect() + { + if (!Emulator.isShuttingDown) + { + Emulator.getPluginManager().fireEvent(new UserDisconnectEvent(this)); + } + + if(this.disconnected || this.disconnecting) + return; + + this.disconnecting = true; + + try + { + if (this.getHabboInfo().getCurrentRoom() != null) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(this, this.getHabboInfo().getCurrentRoom()); + } + if (this.getHabboInfo().getRoomQueueId() > 0) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getHabboInfo().getRoomQueueId()); + + if (room != null) + { + room.removeFromQueue(this); + } + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + Emulator.getGameEnvironment().getGuideManager().userLogsOut(this); + this.isOnline(false); + this.needsUpdate(true); + this.run(); + this.getInventory().dispose(); + this.messenger.connectionChanged(this, false, false); + this.messenger.dispose(); + this.disconnected = true; + AchievementManager.saveAchievements(this); + + this.habboStats.dispose(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + return; + } + finally + { + Emulator.getGameEnvironment().getRoomManager().unloadRoomsForHabbo(this); + Emulator.getGameEnvironment().getHabboManager().removeHabbo(this); + } + Emulator.getLogging().logUserLine(this.habboInfo.getUsername() + " disconnected."); + this.client = null; + } + @Override + public void run() + { + if(this.needsUpdate()) + { + this.habboInfo.run(); + this.needsUpdate(false); + } + } + + /** + * Checks if the Habbo has the allowed permission. + * + * @param key The permission to check. + * @return True if the Habbo has the permission. + */ + public boolean hasPermission(String key) + { + return hasPermission(key, false); + } + + /** + * Checks if the Habbo has the allowed permission. + * + * @param key The permission to check. + * @param hasRoomRights True if the Habbo is the room owner. + * @return True if the Habbo has the permission. + */ + public boolean hasPermission(String key, boolean hasRoomRights) + { + return Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this, key, hasRoomRights); + } + + /** + * Gives credits to the Habbo and updates the credits balance in game. + * + * @param credits The amount of credits to give. + */ + public void giveCredits(int credits) + { + if (credits == 0) + return; + + UserCreditsEvent event = new UserCreditsEvent(this, credits); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + this.getHabboInfo().addCredits(event.credits); + this.client.sendResponse(new UserCreditsComposer(this.client.getHabbo())); + } + + /** + * Gives pixels to the Habbo and updates the pixels balance in game. + * + * @param pixels The amount of pixels to give. + */ + public void givePixels(int pixels) + { + if (pixels == 0) + return; + + + UserPointsEvent event = new UserPointsEvent(this, pixels, 0); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + this.getHabboInfo().addPixels(event.points); + this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + } + + /** + * Gives points to the Habbo and updates the points balance in game. + * + * @param points The amount of points to give. + */ + public void givePoints(int points) + { + this.givePoints(Emulator.getConfig().getInt("seasonal.primary.type"), points); + } + + /** + * Gives points to the Habbo and updates the points balance in game. + * + * @param type The points type to give. + * @param points The amount of points to give. + */ + public void givePoints(int type, int points) + { + if (points == 0) + return; + + UserPointsEvent event = new UserPointsEvent(this, points, type); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + this.getHabboInfo().addCurrencyAmount(event.type, event.points); + this.client.sendResponse(new UserPointsComposer(this.client.getHabbo().getHabboInfo().getCurrencyAmount(type), event.points, event.type)); + } + + /** + * Whispers a message to the Habbo. + * + * @param message The message to whisper. + */ + public void whisper(String message) + { + this.whisper(message, this.habboStats.chatColor); + } + + /** + * Whispers a message to the Habbo. + * + * @param message The message to whisper. + * @param bubble The chat bubble type to use. + */ + public void whisper(String message, RoomChatMessageBubbles bubble) + { + if (this.getRoomUnit().isInRoom()) + { + this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(message, client.getHabbo().getRoomUnit(), bubble))); + } + } + + /** + * Makes the Habbo talk in the room. + * + * @param message The message to say. + */ + public void talk(String message) + { + this.talk(message, this.habboStats.chatColor); + } + + /** + * Makes the Habbo talk in the room. + * + * @param message The message to say. + * @param bubble The chat bubble type to use. + */ + public void talk(String message, RoomChatMessageBubbles bubble) + { + if (this.getRoomUnit().isInRoom()) + { + this.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(message, client.getHabbo().getRoomUnit(), bubble)).compose()); + } + } + + /** + * Makes the Habbo shout in the room. + * + * @param message The message to shout. + */ + public void shout(String message) + { + this.shout(message, this.habboStats.chatColor); + } + + /** + * Makes the Habbo shout in the room. + * + * @param message The message to shout. + * @param bubble The chat bubble type to use. + */ + public void shout(String message, RoomChatMessageBubbles bubble) + { + if (this.getRoomUnit().isInRoom()) + { + this.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTalkComposer(new RoomChatMessage(message, client.getHabbo().getRoomUnit(), bubble)).compose()); + } + } + + /** + * Sends an alert to the Habbo. + * + * @param message The message the alert contains. + */ + public void alert(String message) + { + this.client.sendResponse(new GenericAlertComposer(message)); + } + + /** + * Sends an old style alert to the Habbo. + * + * @param messages The messages the alert contains. + */ + public void alert(String[] messages) + { + this.client.sendResponse(new MessagesForYouComposer(messages)); + } + + /** + * Sends an alert with url to the Habbo. + * + * @param message The message the alert contains. + * @param url The URL the alert contains. + */ + public void alertWithUrl(String message, String url) + { + this.client.sendResponse(new StaffAlertWithLinkComposer(message, url)); + } + + /** + * Forwards the Habbo to a room. + * + * @param id The id of the room to go to. + */ + public void goToRoom(int id) + { + this.client.sendResponse(new ForwardToRoomComposer(id)); + } + + /** + * Adds a new furniture to the inventory and also updates the client. + * @param item The furniture to add. + */ + public void addFurniture(HabboItem item) + { + this.habboInventory.getItemsComponent().addItem(item); + this.client.sendResponse(new AddHabboItemComposer(item)); + this.client.sendResponse(new InventoryRefreshComposer()); + } + + /** + * Adds new furniture to the inventory and also updates the client. + * @param items The furniture to add. + */ + public void addFurniture(THashSet items) + { + this.habboInventory.getItemsComponent().addItems(items); + this.client.sendResponse(new AddHabboItemComposer(items)); + this.client.sendResponse(new InventoryRefreshComposer()); + } + + /** + * Removes a furniture from the inventory and also updates the client. + * @param item The furniture to remove. + */ + public void removeFurniture(HabboItem item) + { + this.habboInventory.getItemsComponent().removeHabboItem(item); + this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + } + + /** + * Adds a bot to the HabboInventory. + * @param bot The bot to add. + */ + public void addBot(Bot bot) + { + this.habboInventory.getBotsComponent().addBot(bot); + this.client.sendResponse(new AddBotComposer(bot)); + } + + /** + * Removes a bot from the HabboInventory. + * @param bot The bot to remove. + */ + public void removeBot(Bot bot) + { + this.habboInventory.getBotsComponent().removeBot(bot); + this.client.sendResponse(new RemoveBotComposer(bot)); + } + + /** + * Deletes a bot from the database. Also picks it up from the room or removes it from the inventory. + * @param bot The Bot to delete. + */ + public void deleteBot(Bot bot) + { + this.removeBot(bot); + bot.getRoom().removeBot(bot); + Emulator.getGameEnvironment().getBotManager().deleteBot(bot); + } + + /** + * Adds a pet to the HabboInventory. + * @param pet The Pet to add. + */ + public void addPet(Pet pet) + { + this.habboInventory.getPetsComponent().addPet(pet); + this.client.sendResponse(new AddPetComposer(pet)); + } + + /** + * Removes a pet from the HabboInventory. + * @param pet The Pet to remove. + */ + public void removePet(Pet pet) + { + this.habboInventory.getPetsComponent().removePet(pet); + this.client.sendResponse(new RemovePetComposer(pet)); + } + + /** + * Creates a new badge and adds it to the HabboInventory. + * @param code The badgecode to use. + * @return true if succesfully added. False otherwise. + */ + public boolean addBadge(String code) + { + if (this.habboInventory.getBadgesComponent().getBadge(code) == null) + { + HabboBadge badge = BadgesComponent.createBadge(code, this); + this.habboInventory.getBadgesComponent().addBadge(badge); + this.client.sendResponse(new AddUserBadgeComposer(badge)); + return true; + } + + return false; + } + + /** + * Deletes a badge from the database and removes it from the inventory. + * @param badge The Badge to delete. + */ + public void deleteBadge(HabboBadge badge) + { + this.habboInventory.getBadgesComponent().removeBadge(badge); + BadgesComponent.deleteBadge(this.getHabboInfo().getUsername(), badge); + this.client.sendResponse(new InventoryBadgesComposer(this)); + } + + public void mute(int seconds) + { + if (!this.hasPermission("acc_no_mute")) + { + int remaining = this.habboStats.addMuteTime(seconds); + this.client.sendResponse(new FloodCounterComposer(remaining)); + this.client.sendResponse(new MutedWhisperComposer(remaining)); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) + { + room.sendComposer(new RoomUserIgnoredComposer(this, RoomUserIgnoredComposer.MUTED).compose()); + } + } + } + + public void unMute() + { + this.habboStats.unMute(); + this.client.sendResponse(new FloodCounterComposer(3)); + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) + { + room.sendComposer(new RoomUserIgnoredComposer(this, RoomUserIgnoredComposer.UNIGNORED).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboBadge.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboBadge.java new file mode 100644 index 00000000..65b1fc2d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboBadge.java @@ -0,0 +1,112 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; + +import java.sql.*; + +public class HabboBadge implements Runnable +{ + private int id; + private String code; + private int slot; + private Habbo habbo; + private boolean needsUpdate; + private boolean needsInsert; + + public HabboBadge(ResultSet set, Habbo habbo) throws SQLException + { + this.id = set.getInt("id"); + this.code = set.getString("badge_code"); + this.slot = set.getInt("slot_id"); + this.habbo = habbo; + this.needsUpdate = false; + this.needsInsert = false; + } + + public HabboBadge(int id, String code, int slot, Habbo habbo) + { + this.id = id; + this.code = code; + this.slot = slot; + this.habbo = habbo; + this.needsUpdate = false; + this.needsInsert = true; + } + + public int getId() + { + return id; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public void setSlot(int slot) + { + this.slot = slot; + } + + public int getSlot() + { + return slot; + } + + @Override + public void run() + { + try + { + if(this.needsInsert) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_badges (user_id, slot_id, badge_code) VALUES (?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + statement.setInt(2, this.slot); + statement.setString(3, this.code); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) + { + if (set.next()) + { + this.id = set.getInt(1); + } + } + } + this.needsInsert = false; + } + else if(this.needsUpdate) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_badges SET slot_id = ?, badge_code = ? WHERE id = ? AND user_id = ?")) + { + statement.setInt(1, this.slot); + statement.setString(2, this.code); + statement.setInt(3, this.id); + statement.setInt(4, this.habbo.getHabboInfo().getId()); + statement.execute(); + } + this.needsUpdate = false; + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void needsUpdate(boolean needsUpdate) + { + this.needsUpdate = needsUpdate; + } + + public void needsInsert(boolean needsInsert) + { + this.needsInsert = needsInsert; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboGender.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboGender.java new file mode 100644 index 00000000..4a31b81b --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboGender.java @@ -0,0 +1,7 @@ +package com.eu.habbo.habbohotel.users; + +public enum HabboGender +{ + M, + F +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java new file mode 100644 index 00000000..d3cea308 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java @@ -0,0 +1,491 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.permissions.Rank; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.rooms.Room; +import gnu.trove.map.hash.TIntIntHashMap; +import gnu.trove.procedure.TIntIntProcedure; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +public class HabboInfo implements Runnable +{ + private String username; + private String motto; + private String look; + private HabboGender gender; + private String mail; + private String sso; + private String ipRegister; + private String ipLogin; + + private int id; + private int accountCreated; + private int achievementScore; + private Rank rank; + + private int credits; + private int lastOnline; + private int lastLogin; + + private int homeRoom; + + private boolean online; + private int loadingRoom; + private Room currentRoom; + private int roomQueueId; + + private HorsePet riding; + + private Class currentGame; + private TIntIntHashMap currencies; + private GamePlayer gamePlayer; + + private int photoRoomId; + private int photoTimestamp; + private String photoURL; + private String photoJSON; + private int webPublishTimestamp; + private String machineID; + + public HabboInfo(ResultSet set) + { + try + { + this.id = set.getInt("id"); + this.username = set.getString("username"); + this.motto = set.getString("motto"); + this.look = set.getString("look"); + this.gender = HabboGender.valueOf(set.getString("gender")); + this.mail = set.getString("mail"); + this.sso = set.getString("auth_ticket"); + this.ipRegister = set.getString("ip_register"); + this.ipLogin = set.getString("ip_current"); + this.rank = Emulator.getGameEnvironment().getPermissionsManager().getRank(set.getInt("rank")); + + if (this.rank == null) + { + Emulator.getLogging().logErrorLine("No existing rank found with id " + set.getInt("rank") + ". Make sure an entry in the permissions table exists."); + } + + this.accountCreated = set.getInt("account_created"); + this.credits = set.getInt("credits"); + this.homeRoom = set.getInt("home_room"); + this.lastOnline = set.getInt("last_online"); + this.machineID = set.getString("machine_id"); + this.lastLogin = Emulator.getIntUnixTimestamp(); + this.online = false; + this.currentRoom = null; + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.loadCurrencies(); + } + + private void loadCurrencies() + { + this.currencies = new TIntIntHashMap(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_currency WHERE user_id = ?")) + { + statement.setInt(1, this.id); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.currencies.put(set.getInt("type"), set.getInt("amount")); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private void saveCurrencies() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_currency (user_id, type, amount) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE amount = ?")) + { + this.currencies.forEachEntry(new TIntIntProcedure() + { + @Override + public boolean execute(int a, int b) + { + try + { + statement.setInt(1, getId()); + statement.setInt(2, a); + statement.setInt(3, b); + statement.setInt(4, b); + statement.addBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + return true; + } + }); + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public int getCurrencyAmount(int type) + { + return this.currencies.get(type); + } + + public TIntIntHashMap getCurrencies() + { + return this.currencies; + } + + public void addCurrencyAmount(int type, int amount) + { + this.currencies.adjustOrPutValue(type, amount, amount); + this.run(); + } + + public void setCurrencyAmount(int type, int amount) + { + this.currencies.put(type, amount); + this.run(); + } + + public int getId() + { + return this.id; + } + + public String getUsername() + { + return this.username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getMotto() + { + return this.motto; + } + + public void setMotto(String motto) + { + this.motto = motto; + } + + public Rank getRank() + { + return this.rank; + } + + public void setRank(Rank rank) + { + this.rank = rank; + } + + public String getLook() + { + return this.look; + } + + public void setLook(String look) { this.look = look; } + + public HabboGender getGender() + { + return this.gender; + } + + public void setGender(HabboGender gender) { + this.gender = gender; + } + + public String getMail() { + return mail; + } + + public void setMail(String mail) { + this.mail = mail; + } + + public String getSso() { + return sso; + } + + public void setSso(String sso) { + this.sso = sso; + } + + public String getIpRegister() { + return ipRegister; + } + + public void setIpRegister(String ipRegister) { + this.ipRegister = ipRegister; + } + + public String getIpLogin() + { + return this.ipLogin; + } + + public void setIpLogin(String ipLogin) + { + this.ipLogin = ipLogin; + } + + public int getAccountCreated() + { + return this.accountCreated; + } + + public void setAccountCreated(int accountCreated) { + this.accountCreated = accountCreated; + } + + public boolean canBuy(CatalogItem item) + { + return this.credits >= item.getCredits() && this.getCurrencies().get(item.getPointsType()) >= item.getPoints(); + } + + public int getCredits() + { + return credits; + } + + public void setCredits(int credits) + { + this.credits = credits; + this.run(); + } + + public void addCredits(int credits) + { + this.credits += credits; + this.run(); + } + + public int getPixels() + { + return this.getCurrencyAmount(0); + } + + public void setPixels(int pixels) + { + this.setCurrencyAmount(0, pixels); + this.run(); + } + + public void addPixels(int pixels) + { + this.addCurrencyAmount(0, pixels); + this.run(); + } + + public int getLastOnline() + { + return this.lastOnline; + } + + public void setLastOnline(int lastOnline) + { + this.lastOnline = lastOnline; + } + + public int getHomeRoom() + { + return this.homeRoom; + } + + public void setHomeRoom(int homeRoom) + { + this.homeRoom = homeRoom; + } + + public boolean isOnline() + { + return this.online; + } + + public void setOnline(boolean value) + { + this.online = value; + } + + public int getLoadingRoom() + { + return this.loadingRoom; + } + + public void setLoadingRoom(int loadingRoom) + { + this.loadingRoom = loadingRoom; + } + + public Room getCurrentRoom() + { + return this.currentRoom; + } + + public void setCurrentRoom(Room room) + { + this.currentRoom = room; + } + + public int getRoomQueueId() + { + return this.roomQueueId; + } + + public void setRoomQueueId(int roomQueueId) + { + this.roomQueueId = roomQueueId; + } + + public HorsePet getRiding() + { + return riding; + } + + public void setRiding(HorsePet riding) + { + this.riding = riding; + } + + public Class getCurrentGame() + { + return this.currentGame; + } + + public void setCurrentGame(Class currentGame) + { + this.currentGame = currentGame; + } + + public boolean isInGame() + { + return this.currentGame != null; + } + + public synchronized GamePlayer getGamePlayer() + { + return this.gamePlayer; + } + + public synchronized void setGamePlayer(GamePlayer gamePlayer) + { + this.gamePlayer = gamePlayer; + } + + public int getPhotoRoomId() + { + return this.photoRoomId; + } + + public void setPhotoRoomId(int roomId) + { + this.photoRoomId = roomId; + } + + public int getPhotoTimestamp() + { + return this.photoTimestamp; + } + + public void setPhotoTimestamp(int photoTimestamp) + { + this.photoTimestamp = photoTimestamp; + } + + public String getPhotoURL() + { + return this.photoURL; + } + + public void setPhotoURL(String photoURL) + { + this.photoURL = photoURL; + } + + public String getPhotoJSON() + { + return this.photoJSON; + } + + public void setPhotoJSON(String photoJSON) + { + this.photoJSON = photoJSON; + } + + public int getWebPublishTimestamp() + { + return this.webPublishTimestamp; + } + + public void setWebPublishTimestamp(int webPublishTimestamp) + { + this.webPublishTimestamp = webPublishTimestamp; + } + + public String getMachineID() + { + return this.machineID; + } + + public void setMachineID(String machineID) + { + this.machineID = machineID; + } + + @Override + public void run() + { + this.saveCurrencies(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET motto = ?, online = ?, look = ?, gender = ?, credits = ?, last_login = ?, last_online = ?, home_room = ?, ip_current = ?, rank = ?, machine_id = ?, username = ? WHERE id = ?")) + { + statement.setString(1, this.motto); + statement.setString(2, this.online ? "1" : "0"); + statement.setString(3, this.look); + statement.setString(4, this.gender.name()); + statement.setInt(5, this.credits); + statement.setInt(7, this.lastOnline); + statement.setInt(6, Emulator.getIntUnixTimestamp()); + statement.setInt(8, this.homeRoom); + statement.setString(9, this.ipLogin); + statement.setInt(10, this.rank.getId()); + statement.setString(11, this.machineID); + statement.setString(12, this.username); + statement.setInt(13, this.id); + statement.executeUpdate(); + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public int getBonusRarePoints() + { + return this.getCurrencyAmount(Emulator.getConfig().getInt("hotelview.promotional.points.type")); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java new file mode 100644 index 00000000..25bdd3c5 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java @@ -0,0 +1,205 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceOffer; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceState; +import com.eu.habbo.habbohotel.users.inventory.*; +import gnu.trove.set.hash.THashSet; + +public class HabboInventory +{ + //Configuration. Loaded from database & updated accordingly. + public static int MAXIMUM_ITEMS = 10000; + + private WardrobeComponent wardrobeComponent; + private BadgesComponent badgesComponent; + private BotsComponent botsComponent; + private EffectsComponent effectsComponent; + private ItemsComponent itemsComponent; + private PetsComponent petsComponent; + + private final THashSet items; + private final Habbo habbo; + + public HabboInventory(Habbo habbo) + { + this.habbo = habbo; + try + { + this.badgesComponent = new BadgesComponent(this.habbo); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.botsComponent = new BotsComponent(this.habbo); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.effectsComponent = new EffectsComponent(this.habbo); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.itemsComponent = new ItemsComponent(this, this.habbo); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.petsComponent = new PetsComponent(this.habbo); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + try + { + this.wardrobeComponent = new WardrobeComponent(this.habbo); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + this.items = MarketPlace.getOwnOffers(this.habbo); + } + + public WardrobeComponent getWardrobeComponent() + { + return this.wardrobeComponent; + } + + public void setWardrobeComponent(WardrobeComponent wardrobeComponent) + { + this.wardrobeComponent = wardrobeComponent; + } + + public BadgesComponent getBadgesComponent() + { + return this.badgesComponent; + } + + public void setBadgesComponent(BadgesComponent badgesComponent) + { + this.badgesComponent = badgesComponent; + } + + public BotsComponent getBotsComponent() + { + return this.botsComponent; + } + + public void setBotsComponent(BotsComponent botsComponent) + { + this.botsComponent = botsComponent; + } + + public EffectsComponent getEffectsComponent() + { + return this.effectsComponent; + } + + public void setEffectsComponent(EffectsComponent effectsComponent) + { + this.effectsComponent = effectsComponent; + } + + public ItemsComponent getItemsComponent() + { + return this.itemsComponent; + } + + public void setItemsComponent(ItemsComponent itemsComponent) + { + this.itemsComponent = itemsComponent; + } + + public PetsComponent getPetsComponent() + { + return this.petsComponent; + } + + public void setPetsComponent(PetsComponent petsComponent) + { + this.petsComponent = petsComponent; + } + + public void dispose() + { + this.badgesComponent.dispose(); + this.botsComponent.dispose(); + this.effectsComponent.dispose(); + this.itemsComponent.dispose(); + this.petsComponent.dispose(); + this.wardrobeComponent.dispose(); + + this.badgesComponent = null; + this.botsComponent = null; + this.effectsComponent = null; + this.itemsComponent = null; + this.petsComponent = null; + this.wardrobeComponent = null; + } + + public void addMarketplaceOffer(MarketPlaceOffer marketPlaceOffer) + { + this.items.add(marketPlaceOffer); + } + + public void removeMarketplaceOffer(MarketPlaceOffer marketPlaceOffer) + { + this.items.remove(marketPlaceOffer); + } + + public THashSet getMarketplaceItems() + { + return this.items; + } + + public int getSoldPriceTotal() + { + int i = 0; + for(MarketPlaceOffer offer : this.items) + { + if(offer.getState().equals(MarketPlaceState.SOLD)) + { + i+= offer.getPrice(); + } + } + return i; + } + + public MarketPlaceOffer getOffer(int id) + { + for(MarketPlaceOffer offer : this.items) + { + if(offer.getOfferId() == id) + return offer; + } + + return null; + } + + public Habbo getHabbo() + { + return this.habbo; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java new file mode 100644 index 00000000..25d89a64 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java @@ -0,0 +1,420 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.IEventTriggers; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.wired.WiredEffectType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ServerMessage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public abstract class HabboItem implements Runnable, IEventTriggers +{ + private int id; + private int userId; + private int roomId; + private Item baseItem; + private String wallPosition; + private short x; + private short y; + private double z; + private int rotation; + private String extradata; + private int limitedStack; + private int limitedSells; + private boolean needsUpdate = false; + private boolean needsDelete = false; + + public HabboItem(ResultSet set, Item baseItem) throws SQLException + { + this.id = set.getInt("id"); + this.userId = set.getInt("user_id"); + this.roomId = set.getInt("room_id"); + this.baseItem = baseItem; + this.wallPosition = set.getString("wall_pos"); + this.x = set.getShort("x"); + this.y = set.getShort("y"); + this.z = set.getDouble("z"); + this.rotation = set.getInt("rot"); + this.extradata = set.getString("extra_data"); + this.limitedStack = Integer.parseInt(set.getString("limited_data").split(":")[0]); + this.limitedSells = Integer.parseInt(set.getString("limited_data").split(":")[1]); + } + + public HabboItem(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) + { + this.id = id; + this.userId = userId; + this.roomId = 0; + this.baseItem = item; + this.wallPosition = ""; + this.x = 0; + this.y = 0; + this.z = 0; + this.rotation = 0; + this.extradata = extradata; + this.limitedSells = limitedSells; + this.limitedStack = limitedStack; + } + + public void serializeFloorData(ServerMessage serverMessage) + { + try + { + serverMessage.appendInt(this.getId()); + serverMessage.appendInt(this.baseItem.getSpriteId()); + serverMessage.appendInt32(this.x); + serverMessage.appendInt32(this.y); + serverMessage.appendInt(getRotation()); + serverMessage.appendString(Double.toString(this.z)); + + serverMessage.appendString((this.getBaseItem().getInteractionType().getType() == InteractionTrophy.class || this.getBaseItem().getInteractionType().getType() == InteractionCrackable.class || this.getBaseItem().getName().toLowerCase().equals("gnome_box")) ? "1.0" : ((this.getBaseItem().allowWalk() || this.getBaseItem().allowSit() && this.roomId != 0) ? Item.getCurrentHeight(this) + "" : "")); + //serverMessage.appendString( ? "1.0" : ((this.getBaseItem().allowWalk() || this.getBaseItem().allowSit() && this.roomId != 0) ? Item.getCurrentHeight(this) : "")); + + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public void serializeExtradata(ServerMessage serverMessage) + { + if(this.isLimited()) + { + serverMessage.appendInt(this.getLimitedSells()); + serverMessage.appendInt(this.getLimitedStack()); + } + } + + public void serializeWallData(ServerMessage serverMessage) + { + serverMessage.appendString(this.getId() + ""); + serverMessage.appendInt(this.baseItem.getSpriteId()); + serverMessage.appendString(this.wallPosition); + + if(this instanceof InteractionPostIt) + serverMessage.appendString(this.extradata.split(" ")[0]); + else + serverMessage.appendString(this.extradata); + serverMessage.appendInt(-1); + serverMessage.appendInt(this.getBaseItem().getStateCount() > 1 || this instanceof InteractionCrackable || this instanceof InteractionMultiHeight ? 1 : 0); + serverMessage.appendInt(this.getUserId()); + } + + public int getId() + { + return this.id; + } + + public int getUserId() + { + return this.userId; + } + + public void setUserId(int userId) + { + this.userId = userId; + } + + public int getRoomId() + { + return this.roomId; + } + + public void setRoomId(int roomId) + { + this.roomId = roomId; + } + + public Item getBaseItem() + { + return this.baseItem; + } + + public String getWallPosition() + { + return this.wallPosition; + } + + public void setWallPosition(String wallPosition) + { + this.wallPosition = wallPosition; + } + + public short getX() + { + return this.x; + } + + public void setX(short x) + { + this.x = x; + } + + public short getY() + { + return this.y; + } + + public void setY(short y) + { + this.y = y; + } + + public double getZ() + { + return this.z; + } + + public void setZ(double z) + { + this.z = z; + } + + public int getRotation() + { + return this.rotation; + } + + public void setRotation(int rotation) + { + this.rotation = (byte)(rotation % 8); + } + + public String getExtradata() + { + return this.extradata; + } + + public void setExtradata(String extradata) + { + this.extradata = extradata; + } + + public boolean needsUpdate() + { + return this.needsUpdate; + } + + public void needsUpdate(boolean value) + { + this.needsUpdate = value; + } + + public void needsDelete(boolean value) + { + this.needsDelete = value; + } + + public boolean isLimited() + { + return this.limitedStack > 0; + } + + public int getLimitedStack() + { + return limitedStack; + } + + public int getLimitedSells() + { + return limitedSells; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + if (this.needsDelete) + { + this.needsUpdate = false; + this.needsDelete = false; + + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM items WHERE id = ?")) + { + statement.setInt(1, this.getId()); + statement.execute(); + } + } + else if (this.needsUpdate) + { + try (PreparedStatement statement = connection.prepareStatement("UPDATE items SET user_id = ?, room_id = ?, wall_pos = ?, x = ?, y = ?, z = ?, rot = ?, extra_data = ?, limited_data = ? WHERE id = ?")) + { + statement.setInt(1, this.userId); + statement.setInt(2, this.roomId); + statement.setString(3, this.wallPosition); + statement.setInt(4, this.x); + statement.setInt(5, this.y); + statement.setDouble(6, this.z); + statement.setInt(7, this.rotation); + statement.setString(8, this instanceof InteractionGuildGate ? "" : this.getDatabaseExtraData()); + statement.setString(9, this.limitedStack + ":" + this.limitedSells); + statement.setInt(10, this.id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + Emulator.getLogging().logErrorLine("SQLException trying to save HabboItem: " + this.toString()); + } + + this.needsUpdate = false; + } + + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public static RoomTile getSquareInFront(RoomLayout roomLayout, HabboItem item) + { + return roomLayout.getTileInFront(roomLayout.getTile(item.getX(), item.getY()), item.getRotation()); + } + + public abstract boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects); + + public abstract boolean isWalkable(); + + @Override + public void onClick(GameClient client, Room room, Object[] objects) throws Exception + { + if(client != null && this.getBaseItem().getType() == FurnitureType.FLOOR) + { + if (objects != null && objects.length >= 2) + { + if (objects[1] instanceof WiredEffectType) + { + return; + } + } + + if (objects == null || !(objects.length == 2 && objects[1] instanceof WiredEffectType)) + { + WiredHandler.handle(WiredTriggerType.STATE_CHANGED, client.getHabbo().getRoomUnit(), room, new Object[]{this}); + } + } + } + + @Override + public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + WiredHandler.handle(WiredTriggerType.WALKS_ON_FURNI, roomUnit, room, new Object[]{this}); + } + + @Override + public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception + { + WiredHandler.handle(WiredTriggerType.WALKS_OFF_FURNI, roomUnit, room, new Object[]{this}); + } + + public abstract void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception; + + + public void onPlace(Room room) + { + + } + + public void onPickUp(Room room) + { + if(this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) + { + for (Habbo habbo : room.getHabbosOnItem(this)) + { + if (this.getBaseItem().getEffectM() > 0 && habbo.getHabboInfo().getGender().equals(HabboGender.M) && habbo.getRoomUnit().getEffectId() == this.getBaseItem().getEffectM()) + { + room.giveEffect(habbo, 0); + return; + } + + if (this.getBaseItem().getEffectF() > 0 && habbo.getHabboInfo().getGender().equals(HabboGender.F) && habbo.getRoomUnit().getEffectId() == this.getBaseItem().getEffectF()) + { + room.giveEffect(habbo, 0); + return; + } + } + } + } + + public void onMove(Room room, RoomTile oldLocation, RoomTile newLocation) + { + if(this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) + { + List oldHabbos = new ArrayList(); + List newHabbos = new ArrayList(); + + for (RoomTile tile : room.getLayout().getTilesAt(oldLocation, this.getBaseItem().getWidth(), this.getBaseItem().getLength(), this.getRotation())) + { + oldHabbos.addAll(room.getHabbosAt(tile)); + } + + for (RoomTile tile : room.getLayout().getTilesAt(oldLocation, this.getBaseItem().getWidth(), this.getBaseItem().getLength(), this.getRotation())) + { + newHabbos.addAll(room.getHabbosAt(tile)); + } + + oldHabbos.removeAll(newHabbos); + + for (Habbo habbo : oldHabbos) + { + if (this.getBaseItem().getEffectM() > 0 && habbo.getHabboInfo().getGender().equals(HabboGender.M) && habbo.getRoomUnit().getEffectId() == this.getBaseItem().getEffectM()) + { + room.giveEffect(habbo, 0); + return; + } + + if (this.getBaseItem().getEffectF() > 0 && habbo.getHabboInfo().getGender().equals(HabboGender.F) && habbo.getRoomUnit().getEffectId() == this.getBaseItem().getEffectF()) + { + room.giveEffect(habbo, 0); + return; + } + } + + for (Habbo habbo : newHabbos) + { + if (this.getBaseItem().getEffectM() > 0 && habbo.getHabboInfo().getGender().equals(HabboGender.M) && habbo.getRoomUnit().getEffectId() != this.getBaseItem().getEffectM()) + { + room.giveEffect(habbo, this.getBaseItem().getEffectM()); + return; + } + + if (this.getBaseItem().getEffectF() > 0 && habbo.getHabboInfo().getGender().equals(HabboGender.F) && habbo.getRoomUnit().getEffectId() != this.getBaseItem().getEffectF()) + { + room.giveEffect(habbo, this.getBaseItem().getEffectF()); + return; + } + } + } + } + + public String getDatabaseExtraData() + { + return this.getExtradata(); + } + + @Override + public String toString() + { + return "ID: " + this.id + ", BaseID: " + this.getBaseItem().getId() + ", X: " + this.x + ", Y: " + this.y + ", Z: " + this.z + ", Extradata: " + this.extradata; + } + + public boolean allowWiredResetState() + { + return false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboManager.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboManager.java new file mode 100644 index 00000000..36601509 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboManager.java @@ -0,0 +1,405 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.permissions.Rank; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.catalog.*; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceConfigComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolComposer; +import com.eu.habbo.messages.outgoing.users.UserPerksComposer; +import com.eu.habbo.messages.outgoing.users.UserPermissionsComposer; +import com.eu.habbo.messages.rcon.RCONMessage; +import com.eu.habbo.plugin.events.users.UserRegisteredEvent; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; + +public class HabboManager +{ + //Configuration. Loaded from database & updated accordingly. + public static String WELCOME_MESSAGE = ""; + public static boolean NAMECHANGE_ENABLED = false; + + private final ConcurrentHashMap onlineHabbos; + + public HabboManager() + { + long millis = System.currentTimeMillis(); + + this.onlineHabbos = new ConcurrentHashMap(); + + Emulator.getLogging().logStart("Habbo Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + } + + public void addHabbo(Habbo habbo) + { + this.onlineHabbos.put(habbo.getHabboInfo().getId(), habbo); + } + + public void removeHabbo(Habbo habbo) + { + this.onlineHabbos.remove(habbo.getHabboInfo().getId()); + } + + public Habbo getHabbo(int id) + { + return this.onlineHabbos.get(id); + } + + public Habbo getHabbo(String username) + { + synchronized (this.onlineHabbos) + { + for (Map.Entry map : this.onlineHabbos.entrySet()) + { + if (map.getValue().getHabboInfo().getUsername().equalsIgnoreCase(username)) + return map.getValue(); + } + } + + return null; + } + + public Habbo loadHabbo(String sso) + { + Habbo habbo = null; + ResultSet set = null; + + int userId = 0; + try(Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT id FROM users WHERE auth_ticket = ? LIMIT 1")) + { + statement.setString(1, sso); + try (ResultSet s = statement.executeQuery()) + { + if (s.next()) + { + userId = s.getInt("id"); + } + } + statement.close(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + habbo = cloneCheck(userId); + if (habbo != null) + { + habbo.getClient().sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("loggedin.elsewhere"))); + Emulator.getGameServer().getGameClientManager().disposeClient(habbo.getClient().getChannel()); + habbo = null; + } + + ModToolBan ban = Emulator.getGameEnvironment().getModToolManager().checkForBan(userId); + if (ban != null) + { + return null; + } + + try(Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE auth_ticket LIKE ? LIMIT 1")) + { + statement.setString(1, sso); + set = statement.executeQuery(); + + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + catch (Exception ex) + { + Emulator.getLogging().logErrorLine(ex); + } + + try + { + if (set.next()) + { + habbo = new Habbo(set); + + if (habbo.firstVisit) + { + Emulator.getPluginManager().fireEvent(new UserRegisteredEvent(habbo)); + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET auth_ticket = ? WHERE auth_ticket LIKE ? AND id = ? LIMIT 1")) + { + statement.setString(1, null); + statement.setString(2, sso); + statement.setInt(3, habbo.getHabboInfo().getId()); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + set.close(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return habbo; + } + + public static HabboInfo getOfflineHabboInfo(int id) + { + HabboInfo info = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE id = ? LIMIT 1")) + { + statement.setInt(1, id); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + info = new HabboInfo(set); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return info; + } + + public static HabboInfo getOfflineHabboInfo(String username) + { + HabboInfo info = null; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE username = ? LIMIT 1")) + { + statement.setString(1, username); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + info = new HabboInfo(set); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return info; + } + + public int getOnlineCount() + { + return this.onlineHabbos.size(); + } + + public Habbo cloneCheck(int id) + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(id); + + return habbo; + } + + public void sendPacketToHabbosWithPermission(ServerMessage message, String perm) + { + synchronized (this.onlineHabbos) + { + for(Habbo habbo : this.onlineHabbos.values()) + { + if(habbo.hasPermission(perm)) + { + habbo.getClient().sendResponse(message); + } + } + } + } + + public ConcurrentHashMap getOnlineHabbos() + { + return this.onlineHabbos; + } + + public synchronized void dispose() + { + Object[] toDisconnect = this.onlineHabbos.values().toArray(); + List scheduledFutures = new ArrayList<>(); + this.onlineHabbos.clear(); + for (Object habbo : toDisconnect) + { + scheduledFutures.add(Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + ((Habbo) habbo).disconnect(); + } + })); + } + + while (!scheduledFutures.isEmpty()) + { + List toRemove = new ArrayList<>(); + for (ScheduledFuture future : scheduledFutures) + { + if (future.isDone()) + { + toRemove.add(future); + } + } + scheduledFutures.removeAll(toRemove); + } + Emulator.getLogging().logShutdownLine("Habbo Manager -> Disposed!"); + } + + public ArrayList getCloneAccounts(Habbo habbo, int limit) + { + ArrayList habboInfo = new ArrayList(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE ip_register = ? OR ip_current = ? AND id != ? ORDER BY id DESC LIMIT ?")) + { + statement.setString(1, habbo.getHabboInfo().getIpRegister()); + statement.setString(2, habbo.getClient().getChannel().remoteAddress().toString()); + statement.setInt(3, habbo.getHabboInfo().getId()); + statement.setInt(4, limit); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + habboInfo.add(new HabboInfo(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return habboInfo; + } + + public List> getNameChanges(int userId, int limit) + { + List> nameChanges = new ArrayList<>(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT timestamp, new_name FROM namechange_log WHERE user_id = ? ORDER by timestamp DESC LIMIT ?")) + { + statement.setInt(1, userId); + statement.setInt(2, limit); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + nameChanges.add(new AbstractMap.SimpleEntry(set.getInt("timestamp"), set.getString("new_name"))); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return nameChanges; + } + + /** + * Sets the rank for an user. + * Updates the database if the user is offline. + * @param userId The ID of the user. + * @param rankId The new rank ID for the user. + * @throws Exception When the rank does not exist. + */ + public void setRank(int userId, int rankId) throws Exception + { + Habbo habbo = this.getHabbo(userId); + + if (!Emulator.getGameEnvironment().getPermissionsManager().rankExists(rankId)) + { + throw new Exception("Rank ID (" + rankId + ") does not exist"); + } + + Rank rank = Emulator.getGameEnvironment().getPermissionsManager().getRank(rankId); + + if(habbo != null) + { + habbo.getHabboInfo().setRank(rank); + habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); + habbo.getClient().sendResponse(new UserPerksComposer(habbo)); + + if (habbo.hasPermission("acc_supporttool")) + { + habbo.getClient().sendResponse(new ModToolComposer(habbo)); + } + habbo.getHabboInfo().run(); + + habbo.getClient().sendResponse(new CatalogUpdatedComposer()); + habbo.getClient().sendResponse(new CatalogModeComposer(0)); + habbo.getClient().sendResponse(new DiscountComposer()); + habbo.getClient().sendResponse(new MarketplaceConfigComposer()); + habbo.getClient().sendResponse(new GiftConfigurationComposer()); + habbo.getClient().sendResponse(new RecyclerLogicComposer()); + habbo.getClient().sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("commands.generic.cmd_give_rank.new_rank").replace("id", rank.getName()))); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET rank = ? WHERE id = ? LIMIT 1")) + { + statement.setInt(1, rankId); + statement.setInt(2, userId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public void giveCredits(int userId, int credits) + { + Habbo habbo = this.getHabbo(userId); + if (habbo != null) + { + habbo.giveCredits(credits); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement= connection.prepareStatement("UPDATE users SET credits = credits + ? WHERE id = ? LIMIT 1")) + { + statement.setInt(1, credits); + statement.setInt(2, userId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public void staffAlert(String message) + { + message = Emulator.getTexts().getValue("commands.generic.cmd_staffalert.title") + "\r\n" + message; + ServerMessage msg = new GenericAlertComposer(message).compose(); + Emulator.getGameEnvironment().getHabboManager().sendPacketToHabbosWithPermission(msg, "cmd_staffalert"); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorPersonalDisplayMode.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorPersonalDisplayMode.java new file mode 100644 index 00000000..5f71ccb8 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorPersonalDisplayMode.java @@ -0,0 +1,25 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.habbohotel.navigation.DisplayMode; +import com.eu.habbo.habbohotel.navigation.ListMode; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class HabboNavigatorPersonalDisplayMode +{ + public ListMode listMode; + public DisplayMode displayMode; + + public HabboNavigatorPersonalDisplayMode(ListMode listMode, DisplayMode collapsed) + { + this.listMode = listMode; + this.displayMode = collapsed; + } + + public HabboNavigatorPersonalDisplayMode(ResultSet set) throws SQLException + { + this.listMode = set.getString("list_type").equals("thumbnails") ? ListMode.THUMBNAILS : ListMode.LIST; + this.displayMode = DisplayMode.valueOf(set.getString("display").toUpperCase()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorWindowSettings.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorWindowSettings.java new file mode 100644 index 00000000..cad77afb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboNavigatorWindowSettings.java @@ -0,0 +1,149 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.navigation.DisplayMode; +import com.eu.habbo.habbohotel.navigation.ListMode; +import gnu.trove.map.hash.THashMap; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +public class HabboNavigatorWindowSettings +{ + private final int userId; + public int x = 100; + public int y = 100; + public int width = 425; + public int height = 535; + public boolean openSearches = false; + public int unknown = 0; + public final THashMap displayModes = new THashMap<>(2); + + public HabboNavigatorWindowSettings(int userId) + { + this.userId = userId; + } + + public HabboNavigatorWindowSettings(ResultSet set) throws SQLException + { + this.userId = set.getInt("user_id"); + this.x = set.getInt("x"); + this.y = set.getInt("y"); + this.width = set.getInt("width"); + this.height = set.getInt("height"); + this.openSearches = set.getString("open_searches").equals("1"); + this.unknown = 0; + } + + public void addDisplayMode(String category, HabboNavigatorPersonalDisplayMode displayMode) + { + this.displayModes.put(category, displayMode); + } + + public boolean hasDisplayMode(String category) + { + return this.displayModes.containsKey(category); + } + + public void insertDisplayMode(String category, ListMode listMode, DisplayMode displayMode) + { + if (!this.displayModes.containsKey(category)) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("INSERT INTO users_navigator_settings (user_id, caption, list_type, display) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, this.userId); + statement.setString(2, category); + statement.setString(3, listMode.name().toLowerCase()); + statement.setString(4, displayMode.name().toLowerCase()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.displayModes.put(category, new HabboNavigatorPersonalDisplayMode(listMode, displayMode)); + } + } + + public void setDisplayMode(String category, DisplayMode displayMode) + { + HabboNavigatorPersonalDisplayMode personalDisplayMode = this.displayModes.get(category); + + if (personalDisplayMode != null) + { + personalDisplayMode.displayMode = displayMode; + } + else + { + insertDisplayMode(category, ListMode.LIST, displayMode); + } + } + + public void setListMode(String category, ListMode listMode) + { + HabboNavigatorPersonalDisplayMode personalDisplayMode = this.displayModes.get(category); + + if (personalDisplayMode != null) + { + personalDisplayMode.listMode = listMode; + } + else + { + insertDisplayMode(category, listMode, DisplayMode.VISIBLE); + } + } + + public DisplayMode getDisplayModeForCategory(String category) + { + return this.getDisplayModeForCategory(category, DisplayMode.VISIBLE); + } + + public DisplayMode getDisplayModeForCategory(String category, DisplayMode standard) + { + if (this.displayModes.containsKey(category)) + { + return this.displayModes.get(category).displayMode; + } + + return standard; + } + + public ListMode getListModeForCategory(String category) + { + return this.getListModeForCategory(category, ListMode.LIST); + } + + public ListMode getListModeForCategory(String category, ListMode standard) + { + if (this.displayModes.containsKey(category)) + { + return this.displayModes.get(category).listMode; + } + + return standard; + } + + public void save(Connection connection) + { + try (PreparedStatement statement = connection.prepareStatement("UPDATE users_navigator_settings SET list_type = ?, display = ? WHERE user_id = ? AND caption = ? LIMIT 1")) + { + for (Map.Entry set : this.displayModes.entrySet()) + { + statement.setString(1, set.getValue().listMode.name().toLowerCase()); + statement.setString(2, set.getValue().displayMode.name().toLowerCase()); + statement.setInt(3, this.userId); + statement.setString(4, set.getKey()); + statement.execute(); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboStats.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboStats.java new file mode 100644 index 00000000..f7909722 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboStats.java @@ -0,0 +1,613 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.TalentTrackType; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.hash.THashMap; +import gnu.trove.stack.array.TIntArrayStack; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class HabboStats implements Runnable +{ + private final int timeLoggedIn = Emulator.getIntUnixTimestamp(); + + private Habbo habbo; + + public int achievementScore; + public int respectPointsReceived; + public int respectPointsGiven; + public int respectPointsToGive; + + public int petRespectPointsToGive; + + public boolean blockFollowing; + public boolean blockFriendRequests; + public boolean blockRoomInvites; + public boolean blockStaffAlerts; + public boolean allowTrade; + public boolean preferOldChat; + public boolean blockCameraFollow; + public RoomChatMessageBubbles chatColor; + + private int clubExpireTimestamp; + + public int volumeSystem; + public int volumeFurni; + public int volumeTrax; + + public int guild; + public List guilds; + + public String[] tags; + + public TIntArrayStack votedRooms; + public int loginStreak; + public int rentedItemId; + public int rentedTimeEnd; + public int hofPoints; + public boolean ignorePets; + public boolean ignoreBots; + + private final THashMap achievementProgress; + private final THashMap achievementCache; + private final THashMap recentPurchases; + private final TIntArrayList favoriteRooms; + public final TIntArrayList ignoredUsers; + public final TIntArrayList secretRecipes; + + public int citizenshipLevel = -1; + public int helpersLevel = -1; + + public final HabboNavigatorWindowSettings navigatorWindowSettings; + public final THashMap cache; + + public long roomEnterTimestamp; + public int chatCounter; + public long lastChat; + public long lastUsersSearched; + public boolean nux = false; + public boolean nuxReward = false; + public int nuxStep = 1; + + private int muteEndTime = 0; + public int mutedCount = 0; + public boolean mutedBubbleTracker = false; + + public String changeNameChecked = ""; + public TIntArrayList calendarRewardsClaimed; + + public boolean allowNameChange = false; + + private HabboStats(ResultSet set, Habbo habbo) throws SQLException + { + this.cache = new THashMap(0); + this.achievementProgress = new THashMap(0); + this.achievementCache = new THashMap(0); + this.recentPurchases = new THashMap(0); + this.favoriteRooms = new TIntArrayList(0); + this.ignoredUsers = new TIntArrayList(0); + this.secretRecipes = new TIntArrayList(0); + this.calendarRewardsClaimed = new TIntArrayList(0); + + this.habbo = habbo; + + this.achievementScore = set.getInt("achievement_score"); + this.respectPointsReceived = set.getInt("respects_received"); + this.respectPointsGiven = set.getInt("respects_given"); + this.petRespectPointsToGive = set.getInt("daily_pet_respect_points"); + this.respectPointsToGive = set.getInt("daily_respect_points"); + this.blockFollowing = set.getString("block_following").equals("1"); + this.blockFriendRequests = set.getString("block_friendrequests").equals("1"); + this.blockRoomInvites = set.getString("block_roominvites").equals("1"); + this.preferOldChat = set.getString("old_chat").equals("1"); + this.blockCameraFollow = set.getString("block_camera_follow").equals("1"); + this.guild = set.getInt("guild_id"); + this.guilds = new ArrayList<>(); + this.tags = set.getString("tags").split(";"); + this.allowTrade = set.getString("can_trade").equals("1"); + this.votedRooms = new TIntArrayStack(); + this.clubExpireTimestamp = set.getInt("club_expire_timestamp"); + this.loginStreak = set.getInt("login_streak"); + this.rentedItemId = set.getInt("rent_space_id"); + this.rentedTimeEnd = set.getInt("rent_space_endtime"); + this.volumeSystem = set.getInt("volume_system"); + this.volumeFurni = set.getInt("volume_furni"); + this.volumeTrax = set.getInt("volume_trax"); + this.chatColor = RoomChatMessageBubbles.getBubble(set.getInt("chat_color")); + this.hofPoints = set.getInt("hof_points"); + this.blockStaffAlerts = set.getString("block_alerts").equals("1"); + this.citizenshipLevel = set.getInt("talent_track_citizenship_level"); + this.helpersLevel = set.getInt("talent_track_helpers_level"); + this.ignoreBots = set.getString("ignore_bots").equalsIgnoreCase("1"); + this.ignorePets = set.getString("ignore_pets").equalsIgnoreCase("1"); + this.nux = set.getString("nux").equals("1"); + this.muteEndTime = set.getInt("mute_end_timestamp"); + this.allowNameChange = set.getString("allow_name_change").equalsIgnoreCase("1"); + this.nuxReward = nux; + + try (PreparedStatement statement = set.getStatement().getConnection().prepareStatement("SELECT * FROM user_window_settings WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + try (ResultSet nSet = statement.executeQuery()) + { + if (nSet.next()) + { + this.navigatorWindowSettings = new HabboNavigatorWindowSettings(nSet); + } + else + { + try (PreparedStatement stmt = statement.getConnection().prepareStatement("INSERT INTO user_window_settings (user_id) VALUES (?)")) + { + stmt.setInt(1, this.habbo.getHabboInfo().getId()); + stmt.executeUpdate(); + } + + this.navigatorWindowSettings = new HabboNavigatorWindowSettings(habbo.getHabboInfo().getId()); + } + } + } + + try (PreparedStatement statement = set.getStatement().getConnection().prepareStatement("SELECT * FROM users_navigator_settings WHERE user_id = ?")) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + try (ResultSet nSet = statement.executeQuery()) + { + while (nSet.next()) + { + this.navigatorWindowSettings.addDisplayMode(nSet.getString("caption"), new HabboNavigatorPersonalDisplayMode(nSet)); + } + } + } + + try (PreparedStatement favoriteRoomsStatement = set.getStatement().getConnection().prepareStatement("SELECT * FROM users_favorite_rooms WHERE user_id = ?")) + { + favoriteRoomsStatement.setInt(1, this.habbo.getHabboInfo().getId()); + try (ResultSet favoriteSet = favoriteRoomsStatement.executeQuery()) + { + while (favoriteSet.next()) + { + this.favoriteRooms.add(favoriteSet.getInt("room_id")); + } + } + + } + + try (PreparedStatement recipesStatement = set.getStatement().getConnection().prepareStatement("SELECT * FROM users_recipes WHERE user_id = ?")) + { + recipesStatement.setInt(1, this.habbo.getHabboInfo().getId()); + try (ResultSet recipeSet = recipesStatement.executeQuery()) + { + while (recipeSet.next()) + { + this.secretRecipes.add(recipeSet.getInt("recipe")); + } + } + } + + try (PreparedStatement calendarRewardsStatement = set.getStatement().getConnection().prepareStatement("SELECT * FROM calendar_rewards_claimed WHERE user_id = ?")) + { + calendarRewardsStatement.setInt(1, this.habbo.getHabboInfo().getId()); + try (ResultSet rewardSet = calendarRewardsStatement.executeQuery()) + { + while (rewardSet.next()) + { + this.calendarRewardsClaimed.add(rewardSet.getInt("reward_id")); + } + } + } + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("UPDATE users_settings SET achievement_score = ?, respects_received = ?, respects_given = ?, daily_respect_points = ?, block_following = ?, block_friendrequests = ?, online_time = online_time + ?, guild_id = ?, daily_pet_respect_points = ?, club_expire_timestamp = ?, login_streak = ?, rent_space_id = ?, rent_space_endtime = ?, volume_system = ?, volume_furni = ?, volume_trax = ?, block_roominvites = ?, old_chat = ?, block_camera_follow = ?, chat_color = ?, hof_points = ?, block_alerts = ?, talent_track_citizenship_level = ?, talent_track_helpers_level = ?, ignore_bots = ?, ignore_pets = ?, nux = ?, mute_end_timestamp = ?, allow_name_change = ? WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, this.achievementScore); + statement.setInt(2, this.respectPointsReceived); + statement.setInt(3, this.respectPointsGiven); + statement.setInt(4, this.respectPointsToGive); + statement.setString(5, this.blockFollowing ? "1" : "0"); + statement.setString(6, this.blockFriendRequests ? "1" : "0"); + statement.setInt(7, Emulator.getIntUnixTimestamp() - this.timeLoggedIn); + statement.setInt(8, this.guild); + statement.setInt(9, this.petRespectPointsToGive); + statement.setInt(10, this.clubExpireTimestamp); + statement.setInt(11, this.loginStreak); + statement.setInt(12, this.rentedItemId); + statement.setInt(13, this.rentedTimeEnd); + statement.setInt(14, this.volumeSystem); + statement.setInt(15, this.volumeFurni); + statement.setInt(16, this.volumeTrax); + statement.setString(17, this.blockRoomInvites ? "1" : "0"); + statement.setString(18, this.preferOldChat ? "1" : "0"); + statement.setString(19, this.blockCameraFollow ? "1" : "0"); + statement.setInt(20, this.chatColor.getType()); + statement.setInt(21, this.hofPoints); + statement.setString(22, this.blockStaffAlerts ? "1" : "0"); + statement.setInt(23, this.citizenshipLevel); + statement.setInt(24, this.helpersLevel); + statement.setString(25, this.ignoreBots ? "1" : "0"); + statement.setString(26, this.ignorePets ? "1" : "0"); + statement.setString(27, this.nux ? "1" : "0"); + statement.setInt(28, this.muteEndTime); + statement.setString(29, this.allowNameChange ? "1" : "0"); + statement.setInt(30, this.habbo.getHabboInfo().getId()); + statement.executeUpdate(); + } + + try (PreparedStatement statement = connection.prepareStatement("UPDATE user_window_settings SET x = ?, y = ?, width = ?, height = ?, open_searches = ? WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, this.navigatorWindowSettings.x); + statement.setInt(2, this.navigatorWindowSettings.y); + statement.setInt(3, this.navigatorWindowSettings.width); + statement.setInt(4, this.navigatorWindowSettings.height); + statement.setString(5, this.navigatorWindowSettings.openSearches ? "1" : "0"); + statement.setInt(6, this.habbo.getHabboInfo().getId()); + statement.executeUpdate(); + } + + this.navigatorWindowSettings.save(connection); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void dispose() + { + this.run(); + this.habbo = null; + this.recentPurchases.clear(); + } + + private static HabboStats createNewStats(Habbo habbo) + { + habbo.firstVisit = true; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_settings (user_id) VALUES (?)")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return load(habbo); + } + + public static HabboStats load(Habbo habbo) + { + HabboStats stats = null; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try(PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_settings WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + set.first(); + if (set.getRow() != 0) + { + stats = new HabboStats(set, habbo); + } + else + { + stats = createNewStats(habbo); + } + } + } + + if(stats != null) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT guild_id FROM guilds_members WHERE user_id = ? AND level_id < 3 LIMIT 100")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + + int i = 0; + while (set.next()) + { + stats.guilds.add(set.getInt("guild_id")); + i++; + } + } + } + + Collections.sort(stats.guilds); + + try (PreparedStatement statement = connection.prepareStatement("SELECT room_id FROM room_votes WHERE user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + stats.votedRooms.push(set.getInt("room_id")); + } + } + } + + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_achievements WHERE user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Achievement achievement = Emulator.getGameEnvironment().getAchievementManager().getAchievement(set.getString("achievement_name")); + + if (achievement != null) + { + stats.achievementProgress.put(achievement, set.getInt("progress")); + } + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return stats; + } + + public void addGuild(int guildId) + { + if (!this.guilds.contains(guildId)) + { + this.guilds.add(guildId); + } + } + + public void removeGuild(int guildId) + { + this.guilds.remove((Integer)guildId); + } + + public boolean hasGuild(int guildId) + { + for(int i : this.guilds) + { + if(i == guildId) + return true; + } + + return false; + } + + public int getAchievementScore() + { + return this.achievementScore; + } + + public void addAchievementScore(int achievementScore) + { + this.achievementScore += achievementScore; + } + + public int getAchievementProgress(Achievement achievement) + { + if(this.achievementProgress.containsKey(achievement)) + return this.achievementProgress.get(achievement); + + return -1; + } + + public void setProgress(Achievement achievement, int progress) + { + this.achievementProgress.put(achievement, progress); + } + + public int getRentedTimeEnd() + { + return this.rentedTimeEnd; + } + + public void setRentedTimeEnd(int rentedTimeEnd) + { + this.rentedTimeEnd = rentedTimeEnd; + } + + public int getRentedItemId() + { + return this.rentedItemId; + } + + public void setRentedItemId(int rentedItemId) + { + this.rentedItemId = rentedItemId; + } + + public boolean canRentSpace() + { + return this.rentedTimeEnd < Emulator.getIntUnixTimestamp(); + } + + public int getClubExpireTimestamp() + { + return this.clubExpireTimestamp; + } + + public void setClubExpireTimestamp(int clubExpireTimestamp) + { + this.clubExpireTimestamp = clubExpireTimestamp; + } + + public boolean hasActiveClub() + { + return this.clubExpireTimestamp > Emulator.getIntUnixTimestamp(); + } + + public THashMap getAchievementProgress() + { + return this.achievementProgress; + } + + public THashMap getAchievementCache() + { + return this.achievementCache; + } + + public void addPurchase(CatalogItem item) + { + if(!this.recentPurchases.containsKey(item.getId())) + { + this.recentPurchases.put(item.getId(), item); + } + } + + public THashMap getRecentPurchases() + { + return this.recentPurchases; + } + + public void disposeRecentPurchases() + { + this.recentPurchases.clear(); + } + + public boolean addFavoriteRoom(int roomId) + { + if (this.favoriteRooms.contains(roomId)) + return false; + + if (Emulator.getConfig().getInt("hotel.rooms.max.favorite") <= this.favoriteRooms.size()) + return false; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_favorite_rooms (user_id, room_id) VALUES (?, ?)");) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + statement.setInt(2, roomId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.favoriteRooms.add(roomId); + return true; + } + + public void removeFavoriteRoom(int roomId) + { + if (this.favoriteRooms.remove(roomId)) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM users_favorite_rooms WHERE user_id = ? AND room_id = ? LIMIT 1")) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + statement.setInt(2, roomId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public boolean hasFavoriteRoom(int roomId) + { + return this.favoriteRooms.contains(roomId); + } + + public TIntArrayList getFavoriteRooms() + { + return this.favoriteRooms; + } + + public boolean hasRecipe(int id) + { + return this.secretRecipes.contains(id); + } + + public boolean addRecipe(int id) + { + if (this.secretRecipes.contains(id)) + return false; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_recipes (user_id, recipe) VALUES (?, ?)")) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + statement.setInt(2, id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.secretRecipes.add(id); + return true; + } + + public int talentTrackLevel(TalentTrackType type) + { + if (type == TalentTrackType.CITIZENSHIP) + return this.citizenshipLevel; + else if (type == TalentTrackType.HELPER) + return this.helpersLevel; + + return -1; + } + + public void setTalentLevel(TalentTrackType type, int level) + { + if (type == TalentTrackType.CITIZENSHIP) + this.citizenshipLevel = level; + else if (type == TalentTrackType.HELPER) + this.helpersLevel = level; + } + + public int getMuteEndTime() + { + return this.muteEndTime; + } + + public int addMuteTime(int seconds) + { + if (remainingMuteTime() == 0) + { + this.muteEndTime = Emulator.getIntUnixTimestamp(); + } + + this.mutedBubbleTracker = true; + this.muteEndTime += seconds; + + return remainingMuteTime(); + } + + public int remainingMuteTime() + { + return Math.max(0, this.muteEndTime - Emulator.getIntUnixTimestamp()); + } + + public boolean allowTalk() + { + return this.remainingMuteTime() == 0; + } + + public void unMute() + { + this.muteEndTime = 0; + this.mutedBubbleTracker = false; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/SignType.java b/src/main/java/com/eu/habbo/habbohotel/users/SignType.java new file mode 100644 index 00000000..8e27b0cb --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/SignType.java @@ -0,0 +1,36 @@ +package com.eu.habbo.habbohotel.users; + +public enum SignType +{ + ZERO(0), + ONE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + LOVE(11), + HATE(12), + EXCLAMATION(13), + SMILE(14), + FOOTBALL(15), + CARD_YELLOW(16), + CARD_RED(17), + NONE(100); + + private final int id; + + SignType(int id) + { + this.id = id; + } + + public int getId() + { + return this.id; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/BadgesComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/BadgesComponent.java new file mode 100644 index 00000000..3751cd20 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/BadgesComponent.java @@ -0,0 +1,198 @@ +package com.eu.habbo.habbohotel.users.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class BadgesComponent +{ + private final THashSet badges = new THashSet(); + + public BadgesComponent(Habbo habbo) + { + this.badges.addAll(loadBadges(habbo)); + } + + private static THashSet loadBadges(Habbo habbo) + { + THashSet badgesList = new THashSet(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_badges WHERE user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + badgesList.add(new HabboBadge(set, habbo)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return badgesList; + } + + public static void resetSlots(Habbo habbo) + { + for(HabboBadge badge : habbo.getInventory().getBadgesComponent().getBadges()) + { + if(badge.getSlot() == 0) + continue; + + badge.setSlot(0); + badge.needsUpdate(true); + Emulator.getThreading().run(badge); + } + } + + public ArrayList getWearingBadges() + { + synchronized (this.badges) + { + ArrayList badgesList = new ArrayList(); + for (HabboBadge badge : this.badges) + { + if (badge.getSlot() == 0) + continue; + + badgesList.add(badge); + } + + Collections.sort(badgesList, new Comparator() + { + @Override + public int compare(HabboBadge o1, HabboBadge o2) + { + return o1.getSlot() - o2.getSlot(); + } + }); + return badgesList; + } + } + + public THashSet getBadges() + { + return this.badges; + } + + public static ArrayList getBadgesOfflineHabbo(int userId) + { + ArrayList badgesList = new ArrayList(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_badges WHERE slot_id > 0 AND user_id = ? ORDER BY slot_id ASC")) + { + statement.setInt(1, userId); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + badgesList.add(new HabboBadge(set, null)); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + return badgesList; + } + + public boolean hasBadge(String badge) + { + return this.getBadge(badge) != null; + } + + public HabboBadge getBadge(String badgeCode) + { + synchronized (this.badges) + { + for (HabboBadge badge : this.badges) + { + if (badge.getCode().equalsIgnoreCase(badgeCode)) + return badge; + } + return null; + } + } + + public void addBadge(HabboBadge badge) + { + synchronized (this.badges) + { + this.badges.add(badge); + } + } + + public HabboBadge removeBadge(String badge) + { + synchronized (this.badges) + { + for(HabboBadge b : this.badges) + { + if(b.getCode().equalsIgnoreCase(badge)) + { + this.badges.remove(b); + return b; + } + } + } + + return null; + } + + public void removeBadge(HabboBadge badge) + { + synchronized (this.badges) + { + this.badges.remove(badge); + } + } + + public void dispose() + { + synchronized (this.badges) + { + this.badges.clear(); + } + } + + public static HabboBadge createBadge(String code, Habbo habbo) + { + HabboBadge badge = new HabboBadge(0, code, 0, habbo); + badge.run(); + habbo.getInventory().getBadgesComponent().addBadge(badge); + return badge; + } + + + public static void deleteBadge(String username, HabboBadge badge) + { + deleteBadge(username, badge.getCode()); + } + + public static void deleteBadge(String username, String badge) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE users_badges FROM users_badges INNER JOIN users ON users_badges.user_id = users.id WHERE users.username LIKE ? AND badge_code LIKE ?")) + { + statement.setString(1, username); + statement.setString(2, badge); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java new file mode 100644 index 00000000..3708178f --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java @@ -0,0 +1,89 @@ +package com.eu.habbo.habbohotel.users.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.map.hash.THashMap; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +public class BotsComponent { + + private final THashMap bots = new THashMap(); + + public BotsComponent(Habbo habbo) + { + this.loadBots(habbo); + } + + private void loadBots(Habbo habbo) + { + synchronized (this.bots) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots INNER JOIN users ON users.id = bots.user_id WHERE user_id = ? AND room_id = 0 ORDER BY id ASC")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Bot bot = Emulator.getGameEnvironment().getBotManager().loadBot(set); + if (bot != null) + { + this.bots.put(set.getInt("id"), bot); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public Bot getBot(int botId) + { + return this.bots.get(botId); + } + + public void addBot(Bot bot) + { + synchronized (this.bots) + { + this.bots.put(bot.getId(), bot); + } + } + + public void removeBot(Bot bot) + { + synchronized (this.bots) + { + this.bots.remove(bot.getId()); + } + } + + public THashMap getBots() + { + return this.bots; + } + + public void dispose() + { + synchronized (this.bots) + { + for (Map.Entry map : this.bots.entrySet()) + { + if (map.getValue().needsUpdate()) + { + Emulator.getThreading().run(map.getValue()); + } + } + this.bots.clear(); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/EffectsComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/EffectsComponent.java new file mode 100644 index 00000000..ee6e2884 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/EffectsComponent.java @@ -0,0 +1,248 @@ +package com.eu.habbo.habbohotel.users.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.inventory.EffectsListAddComposer; +import com.eu.habbo.messages.outgoing.inventory.EffectsListEffectEnableComposer; +import com.eu.habbo.messages.outgoing.inventory.EffectsListRemoveComposer; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class EffectsComponent +{ + public final THashMap effects; + public final Habbo habbo; + public int activatedEffect = 0; + + public EffectsComponent(Habbo habbo) + { + this.effects = new THashMap<>(); + this.habbo = habbo; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_effects WHERE user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.effects.put(set.getInt("effect"), new HabboEffect(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public HabboEffect createEffect(int effectId) + { + HabboEffect effect = null; + synchronized (this.effects) + { + if (this.effects.containsKey(effectId)) + { + effect = this.effects.get(effectId); + + if (effect.total <= 99) + { + effect.total++; + } + } + else + { + effect = new HabboEffect(effectId, this.habbo.getHabboInfo().getId()); + effect.insert(); + } + + this.addEffect(effect); + } + + return effect; + } + + public void addEffect(HabboEffect effect) + { + this.effects.put(effect.effect, effect); + + this.habbo.getClient().sendResponse(new EffectsListAddComposer(effect)); + } + + public void dispose() + { + synchronized (this.effects) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_effects SET duration = ?, activation_timestamp = ?, total = ? WHERE user_id = ? AND effect = ?")) + { + this.effects.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(HabboEffect effect) + { + try + { + statement.setInt(1, effect.duration); + statement.setInt(2, effect.activationTimestamp); + statement.setInt(3, effect.total); + statement.setInt(4, effect.userId); + statement.setInt(5, effect.effect); + statement.addBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return true; + } + }); + + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.effects.clear(); + } + } + + public boolean ownsEffect(int effectId) + { + return this.effects.containsKey(effectId); + } + + public void activateEffect(int effectId) + { + HabboEffect effect = this.effects.get(effectId); + + if (effect != null) + { + if (effect.isRemaining()) + { + effect.activationTimestamp = Emulator.getIntUnixTimestamp(); + } + else + { + this.habbo.getClient().sendResponse(new EffectsListRemoveComposer(effect)); + } + } + } + + public void enableEffect(int effectId) + { + HabboEffect effect = this.effects.get(effectId); + + if (effect != null) + { + if (!effect.isActivated()) + { + this.activateEffect(effect.effect); + } + + this.activatedEffect = effectId; + + if (this.habbo.getHabboInfo().getCurrentRoom() != null) + { + this.habbo.getHabboInfo().getCurrentRoom().giveEffect(this.habbo, effectId); + } + + this.habbo.getClient().sendResponse(new EffectsListEffectEnableComposer(effect)); + } + } + + public boolean hasActivatedEffect(int effectId) + { + HabboEffect effect = this.effects.get(effectId); + + if (effect != null) + { + return effect.isActivated(); + } + + return false; + } + + public static class HabboEffect + { + public int effect; + public int userId; + public int duration = 86400; + public int activationTimestamp = -1; + public int total = 1; + public boolean enabled = false; + + public HabboEffect(ResultSet set) throws SQLException + { + this.effect = set.getInt("effect"); + this.userId = set.getInt("user_id"); + this.duration = set.getInt("duration"); + this.activationTimestamp = set.getInt("activation_timestamp"); + this.total = set.getInt("total"); + } + + public HabboEffect(int effect, int userId) + { + this.effect = effect; + this.userId = userId; + } + + public boolean isActivated() + { + return this.activationTimestamp >= 0; + } + + public boolean isRemaining() + { + if (this.total > 0) + { + if (this.activationTimestamp >= 0) + { + if (Emulator.getIntUnixTimestamp() - this.activationTimestamp >= this.duration) + { + this.activationTimestamp = -1; + this.total--; + } + } + } + + return this.total > 0; + } + + public void insert() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_effects (user_id, effect, total, duration) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, this.userId); + statement.setInt(2, this.effect); + statement.setInt(3, this.total); + statement.setInt(4, this.duration); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public void delete() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM users_effects WHERE user_id = ? AND effect = ?")) + { + statement.setInt(1, this.userId); + statement.setInt(2, this.effect); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java new file mode 100644 index 00000000..7a57813e --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java @@ -0,0 +1,215 @@ +package com.eu.habbo.habbohotel.users.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.plugin.events.inventory.InventoryItemAddedEvent; +import com.eu.habbo.plugin.events.inventory.InventoryItemRemovedEvent; +import com.eu.habbo.plugin.events.inventory.InventoryItemsAddedEvent; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.NoSuchElementException; + +public class ItemsComponent +{ + private final TIntObjectMap items = TCollections.synchronizedMap(new TIntObjectHashMap()); + + private final HabboInventory inventory; + + public ItemsComponent(HabboInventory inventory, Habbo habbo) + { + this.inventory = inventory; + this.items.putAll(loadItems(habbo)); + } + + public static THashMap loadItems(Habbo habbo) + { + THashMap itemsList = new THashMap(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM items WHERE room_id = ? AND user_id = ?")) + { + statement.setInt(1, 0); + statement.setInt(2, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + try + { + HabboItem item = Emulator.getGameEnvironment().getItemManager().loadHabboItem(set); + + if (item != null) + { + itemsList.put(set.getInt("id"), item); + } + else + { + Emulator.getLogging().logErrorLine("Failed to load HabboItem: " + set.getInt("id")); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return itemsList; + } + + public void addItem(HabboItem item) + { + if(item == null) + { + return; + } + + InventoryItemAddedEvent event = new InventoryItemAddedEvent(inventory, item); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + { + return; + } + + synchronized (this.items) + { + this.items.put(event.item.getId(), event.item); + } + } + + public void addItems(THashSet items) + { + InventoryItemsAddedEvent event = new InventoryItemsAddedEvent(inventory, items); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + { + return; + } + + synchronized (this.items) + { + for (HabboItem item : event.items) + { + if(item == null) + { + continue; + } + + this.items.put(item.getId(), item); + } + } + } + + public HabboItem getHabboItem(int itemId) + { + return this.items.get(itemId); + } + + public HabboItem getAndRemoveHabboItem(final Item item) + { + final HabboItem[] habboItem = {null}; + synchronized (this.items) + { + this.items.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(HabboItem object) + { + if (object.getBaseItem() == item) + { + habboItem[0] = object; + return false; + } + + return true; + } + }); + } + this.removeHabboItem(habboItem[0]); + return habboItem[0]; + } + + public void removeHabboItem(int itemId) + { + this.items.remove(itemId); + } + + public void removeHabboItem(HabboItem item) + { + InventoryItemRemovedEvent event = new InventoryItemRemovedEvent(inventory, item); + if (Emulator.getPluginManager().fireEvent(event).isCancelled()) + { + return; + } + + synchronized (this.items) + { + this.items.remove(event.item.getId()); + } + } + + public TIntObjectMap getItems() + { + return this.items; + } + + public THashSet getItemsAsValueCollection() + { + THashSet items = new THashSet(); + items.addAll(this.items.valueCollection()); + + return items; + } + + public int itemCount() + { + return this.items.size(); + } + + public void dispose() + { + synchronized (this.items) + { + TIntObjectIterator items = this.items.iterator(); + + if (items == null) + { + Emulator.getLogging().logErrorLine(new RuntimeException("Items is NULL!")); + return; + } + + if (!this.items.isEmpty()) + { + for (int i = this.items.size(); i-- > 0; ) + { + try + { + items.advance(); + } catch (NoSuchElementException e) + { + break; + } + if (items.value().needsUpdate()) + Emulator.getThreading().run(items.value()); + } + } + + this.items.clear(); + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/PetsComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/PetsComponent.java new file mode 100644 index 00000000..e2b0543a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/PetsComponent.java @@ -0,0 +1,114 @@ +package com.eu.habbo.habbohotel.users.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetManager; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.TCollections; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.NoSuchElementException; +import java.util.Set; + +public class PetsComponent +{ + private final TIntObjectMap pets = TCollections.synchronizedMap(new TIntObjectHashMap()); + + public PetsComponent(Habbo habbo) + { + this.loadPets(habbo); + } + + private void loadPets(Habbo habbo) + { + synchronized (this.pets) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_pets WHERE user_id = ? AND room_id = 0")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.pets.put(set.getInt("id"), PetManager.loadPet(set)); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + + public Pet getPet(int id) + { + return this.pets.get(id); + } + + public void addPet(Pet pet) + { + synchronized (this.pets) + { + this.pets.put(pet.getId(), pet); + } + } + + public void addPets(Set pets) + { + synchronized (this.pets) + { + for (Pet p : pets) + { + this.pets.put(p.getId(), p); + } + } + } + + public void removePet(AbstractPet pet) + { + synchronized (this.pets) + { + this.pets.remove(pet.getId()); + } + } + + public TIntObjectMap getPets() + { + return this.pets; + } + + public int getPetsCount() + { + return this.pets.size(); + } + + public void dispose() + { + synchronized (this.pets) + { + TIntObjectIterator petIterator = this.pets.iterator(); + + for (int i = this.pets.size(); i-- > 0; ) + { + try + { + petIterator.advance(); + } catch (NoSuchElementException e) + { + break; + } + if (petIterator.value().needsUpdate) + Emulator.getThreading().run(petIterator.value()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/WardrobeComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/WardrobeComponent.java new file mode 100644 index 00000000..d7c3a2b0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/WardrobeComponent.java @@ -0,0 +1,194 @@ +package com.eu.habbo.habbohotel.users.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import gnu.trove.TIntCollection; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.TIntSet; +import gnu.trove.set.hash.TIntHashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class WardrobeComponent +{ + private final THashMap looks; + private final TIntSet clothing; + + public WardrobeComponent(Habbo habbo) + { + this.looks = new THashMap<>(); + this.clothing = new TIntHashSet(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_wardrobe WHERE user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + this.looks.put(set.getInt("slot_id"), new WardrobeItem(set, habbo)); + } + } + } + + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM users_clothing WHERE user_id = ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + Integer value = set.getInt("clothing_id"); + + if (value != null) + { + this.clothing.add(value); + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + public WardrobeItem createLook(Habbo habbo, int slotId, String look) + { + return new WardrobeItem(habbo.getHabboInfo().getGender(), look, slotId, habbo); + } + + public THashMap getLooks() + { + return this.looks; + } + + public TIntCollection getClothing() + { + return this.clothing; + } + + public void dispose() + { + this.looks.values().stream().filter(item -> item.needsInsert || item.needsUpdate).forEach(item -> { + Emulator.getThreading().run(item); + }); + + this.looks.clear(); + } + + public class WardrobeItem implements Runnable + { + private int slotId; + private HabboGender gender; + private Habbo habbo; + private String look; + private boolean needsInsert = false; + private boolean needsUpdate = false; + + private WardrobeItem(ResultSet set, Habbo habbo) throws SQLException + { + this.gender = HabboGender.valueOf(set.getString("gender")); + this.look = set.getString("look"); + this.slotId = set.getInt("slot_id"); + this.habbo = habbo; + } + + private WardrobeItem(HabboGender gender, String look, int slotId, Habbo habbo) + { + this.gender = gender; + this.look = look; + this.slotId = slotId; + this.habbo = habbo; + } + + public synchronized HabboGender getGender() + { + return gender; + } + + public synchronized void setGender(HabboGender gender) + { + this.gender = gender; + } + + public Habbo getHabbo() + { + return habbo; + } + + public void setHabbo(Habbo habbo) + { + this.habbo = habbo; + } + + public synchronized String getLook() + { + return look; + } + + public synchronized void setLook(String look) + { + this.look = look; + } + + public void setNeedsInsert(boolean needsInsert) + { + this.needsInsert = needsInsert; + } + + public void setNeedsUpdate(boolean needsUpdate) + { + this.needsUpdate = needsUpdate; + } + + public int getSlotId() + { + return slotId; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + if(this.needsInsert) + { + this.needsInsert = false; + this.needsUpdate = false; + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO users_wardrobe (slot_id, look, user_id, gender) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, this.slotId); + statement.setString(2, this.look); + statement.setInt(3, this.habbo.getHabboInfo().getId()); + statement.setString(4, this.gender.name()); + statement.execute(); + } + } + + if(this.needsUpdate) + { + this.needsUpdate = false; + try (PreparedStatement statement = connection.prepareStatement("UPDATE users_wardrobe SET look = ? WHERE slot_id = ? AND user_id = ?")) + { + statement.setString(1, this.look); + statement.setInt(2, this.slotId); + statement.setInt(3, this.habbo.getHabboInfo().getId()); + statement.execute(); + } + } + } + catch(SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredConditionType.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredConditionType.java new file mode 100644 index 00000000..878ecf0c --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredConditionType.java @@ -0,0 +1,36 @@ +package com.eu.habbo.habbohotel.wired; + +public enum WiredConditionType +{ + MATCH_SSHOT(0), + FURNI_HAVE_HABBO(1), + TRIGGER_ON_FURNI(2), + TIME_MORE_THAN(3), + TIME_LESS_THAN(4), + USER_COUNT(5), + ACTOR_IN_TEAM(6), + FURNI_HAS_FURNI(7), + STUFF_IS(8), + ACTOR_IN_GROUP(10), + ACTOR_WEARS_BADGE(11), + ACTOR_WEARS_EFFECT(12), + NOT_MATCH_SSHOT(13), + NOT_FURNI_HAVE_HABBO(14), + NOT_ACTOR_ON_FURNI(15), + NOT_USER_COUNT(16), + NOT_ACTOR_IN_TEAM(17), + NOT_FURNI_HAVE_FURNI(18), + NOT_STUFF_IS(19), + NOT_ACTOR_IN_GROUP(21), + NOT_ACTOR_WEARS_BADGE(22), + NOT_ACTOR_WEARS_EFFECT(23), + DATE_RANGE(24), + ACTOR_HAS_HANDITEM(25); + + public final int code; + + WiredConditionType(int code) + { + this.code = code; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredEffectType.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredEffectType.java new file mode 100644 index 00000000..68bc38e3 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredEffectType.java @@ -0,0 +1,38 @@ +package com.eu.habbo.habbohotel.wired; + +public enum WiredEffectType +{ + TOGGLE_STATE(0), + RESET_TIMERS(1), + MATCH_SSHOT(3), + MOVE_ROTATE(4), + GIVE_SCORE(6), + SHOW_MESSAGE(7), + TELEPORT(8), + JOIN_TEAM(9), + LEAVE_TEAM(10), + CHASE(11), + FLEE(12), + MOVE_DIRECTION(13), + GIVE_SCORE_TEAM(14), + TOGGLE_RANDOM(15), + MOVE_FURNI_TO(16), + GIVE_REWARD(17), + CALL_STACKS(18), + KICK_USER(19), + MUTE_TRIGGER(20), + BOT_TELEPORT(21), + BOT_MOVE(22), + BOT_TALK(23), + BOT_GIVE_HANDITEM(24), + BOT_FOLLOW_AVATAR(25), + BOT_CLOTHES(26), + BOT_TALK_TO_AVATAR(27); + + public final int code; + + WiredEffectType(int code) + { + this.code = code; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredGiveRewardItem.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredGiveRewardItem.java new file mode 100644 index 00000000..f3503397 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredGiveRewardItem.java @@ -0,0 +1,38 @@ +package com.eu.habbo.habbohotel.wired; + +public class WiredGiveRewardItem +{ + public final int id; + public final boolean badge; + public final String data; + public final int probability; + + public WiredGiveRewardItem(int id, boolean badge, String data, int probability) + { + this.id = id; + this.badge = badge; + this.data = data; + this.probability = probability; + } + + public WiredGiveRewardItem(String dataString) + { + String[] data = dataString.split(","); + + this.id = Integer.valueOf(data[0]); + this.badge = data[1].equalsIgnoreCase("0"); + this.data = data[2]; + this.probability = Integer.valueOf(data[3]); + } + + @Override + public String toString() + { + return this.id + "," + (this.badge ? 0 : 1) + "," + this.data + "," + probability; + } + + public String wiredString() + { + return (this.badge ? 0 : 1) + "," + this.data + "," + probability; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java new file mode 100644 index 00000000..8ab5dc41 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java @@ -0,0 +1,459 @@ +package com.eu.habbo.habbohotel.wired; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredExtra; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.items.interactions.wired.WiredTriggerReset; +import com.eu.habbo.habbohotel.items.interactions.wired.effects.WiredEffectGiveReward; +import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredExtraRandom; +import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredExtraUnseen; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.catalog.PurchaseOKComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.items.ItemStateComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; +import com.eu.habbo.plugin.events.furniture.wired.WiredConditionFailedEvent; +import com.eu.habbo.plugin.events.furniture.wired.WiredStackExecutedEvent; +import com.eu.habbo.plugin.events.furniture.wired.WiredStackTriggeredEvent; +import com.eu.habbo.plugin.events.users.UserWiredRewardReceived; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class WiredHandler +{ + //Configuration. Loaded from database & updated accordingly. + public static int MAXIMUM_FURNI_SELECTION = 5; + public static int TELEPORT_DELAY = 500; + + public static boolean handle(WiredTriggerType triggerType, RoomUnit roomUnit, Room room, Object[] stuff) + { + boolean talked = false; + + if (room == null) + return false; + + if(!room.isLoaded()) + return false; + + if(room.getRoomSpecialTypes() == null) + return false; + + THashSet triggers = room.getRoomSpecialTypes().getTriggers(triggerType); + + if(triggers == null || triggers.isEmpty()) + return false; + + List triggeredTiles = new ArrayList<>(); + for(InteractionWiredTrigger trigger : triggers) + { + RoomTile tile = room.getLayout().getTile(trigger.getX(), trigger.getY()); + + if (triggeredTiles.contains(tile)) + continue; + + if(handle(trigger, roomUnit, room, stuff)) + { + if(triggerType.equals(WiredTriggerType.SAY_SOMETHING)) + talked = true; + + triggeredTiles.add(tile); + } + } + + return talked; + } + + public static boolean handle(InteractionWiredTrigger trigger, final RoomUnit roomUnit, final Room room, final Object[] stuff) + { + if(trigger.execute(roomUnit, room, stuff)) + { + trigger.activateBox(room); + + THashSet conditions = room.getRoomSpecialTypes().getConditions(trigger.getX(), trigger.getY()); + THashSet effects = room.getRoomSpecialTypes().getEffects(trigger.getX(), trigger.getY()); + + if(Emulator.getPluginManager().fireEvent(new WiredStackTriggeredEvent(room, roomUnit, trigger, effects, conditions)).isCancelled()) + return false; + + for(InteractionWiredCondition condition : conditions) + { + if(condition.execute(roomUnit, room, stuff)) + { + condition.activateBox(room); + } + else + { + if(!Emulator.getPluginManager().fireEvent(new WiredConditionFailedEvent(room, roomUnit, trigger, condition)).isCancelled()) + return false; + } + } + + + boolean hasExtraRandom = room.getRoomSpecialTypes().hasExtraType(trigger.getX(), trigger.getY(), WiredExtraRandom.class); + boolean hasExtraUnseen = room.getRoomSpecialTypes().hasExtraType(trigger.getX(), trigger.getY(), WiredExtraUnseen.class); + THashSet extras = room.getRoomSpecialTypes().getExtras(trigger.getX(), trigger.getY()); + + for (InteractionWiredExtra extra : extras) + { + extra.activateBox(room); + } + + List effectList = new ArrayList<>(effects); + + if (hasExtraRandom || hasExtraUnseen) + { + Collections.shuffle(effectList); + } + + long millis = System.currentTimeMillis(); + + if (hasExtraUnseen) + { + for (InteractionWiredExtra extra : room.getRoomSpecialTypes().getExtras(trigger.getX(), trigger.getY())) + { + if (extra instanceof WiredExtraUnseen) + { + extra.setExtradata(extra.getExtradata().equals("1") ? "0" : "1"); + InteractionWiredEffect effect = ((WiredExtraUnseen) extra).getUnseenEffect(effectList); + triggerEffect(effect, roomUnit, room, stuff, millis); + break; + } + } + } + else + { + for (final InteractionWiredEffect effect : effectList) + { + boolean executed = triggerEffect(effect, roomUnit, room, stuff, millis); + if (hasExtraRandom && executed) + { + break; + } + } + } + + return !Emulator.getPluginManager().fireEvent(new WiredStackExecutedEvent(room, roomUnit, trigger, effects, conditions)).isCancelled(); + } + + return false; + } + + private static boolean triggerEffect(InteractionWiredEffect effect, RoomUnit roomUnit, Room room, Object[] stuff, long millis) + { + boolean executed = false; + if (effect.canExecute(millis)) + { + executed = true; + if (!effect.requiresTriggeringUser() || (roomUnit != null && effect.requiresTriggeringUser())) + { + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + if (room.isLoaded()) + { + try + { + effect.execute(roomUnit, room, stuff); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + effect.activateBox(room); + } + } + }, effect.getDelay() * 500); + } + } + + return executed; + } + + + public static boolean executeEffectsAtTiles(THashSet tiles, final RoomUnit roomUnit, final Room room, final Object[] stuff) + { + for(RoomTile tile : tiles) + { + if(room != null) + { + THashSet items = room.getItemsAt(tile); + + long millis = System.currentTimeMillis(); + for(final HabboItem item : items) + { + if(item instanceof InteractionWiredEffect) + { + triggerEffect((InteractionWiredEffect) item, roomUnit, room, stuff, millis); + } + } + } + } + + return true; + } + + public static void dropRewards(int wiredId) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM wired_rewards_given WHERE wired_item = ?")) + { + statement.setInt(1, wiredId); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + private static void giveReward(Habbo habbo, WiredEffectGiveReward wiredBox, WiredGiveRewardItem reward) + { + if(wiredBox.limit > 0) + wiredBox.given++; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO wired_rewards_given (wired_item, user_id, reward_id, timestamp) VALUES ( ?, ?, ?, ?)")) + { + statement.setInt(1, wiredBox.getId()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.setInt(3, reward.id); + statement.setInt(4, Emulator.getIntUnixTimestamp()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if(reward.badge) + { + UserWiredRewardReceived rewardReceived = new UserWiredRewardReceived(habbo, wiredBox, "badge", reward.data); + if(Emulator.getPluginManager().fireEvent(rewardReceived).isCancelled()) + return; + + if(rewardReceived.value.isEmpty()) + return; + + HabboBadge badge = new HabboBadge(0, rewardReceived.value, 0, habbo); + Emulator.getThreading().run(badge); + habbo.getInventory().getBadgesComponent().addBadge(badge); + habbo.getClient().sendResponse(new AddUserBadgeComposer(badge)); + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_RECEIVED_BADGE)); + } + else + { + String[] data = reward.data.split("#"); + + if (data.length == 2) + { + UserWiredRewardReceived rewardReceived = new UserWiredRewardReceived(habbo, wiredBox, data[0], data[1]); + if(Emulator.getPluginManager().fireEvent(rewardReceived).isCancelled()) + return; + + if(rewardReceived.value.isEmpty()) + return; + + if(rewardReceived.type.equalsIgnoreCase("credits")) + { + int credits = Integer.valueOf(rewardReceived.value); + habbo.giveCredits(credits); + } + else if(rewardReceived.type.equalsIgnoreCase("pixels")) + { + int pixels = Integer.valueOf(rewardReceived.value); + habbo.givePixels(pixels); + } + else if(rewardReceived.type.equalsIgnoreCase("points")) + { + int points = Integer.valueOf(rewardReceived.value); + habbo.givePoints(points); + } + else if(rewardReceived.type.equalsIgnoreCase("furni")) + { + Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem(Integer.valueOf(rewardReceived.value)); + if(baseItem != null) + { + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(habbo.getHabboInfo().getId(), baseItem, 0, 0, ""); + + if(item != null) + { + habbo.getClient().sendResponse(new AddHabboItemComposer(item)); + habbo.getClient().getHabbo().getInventory().getItemsComponent().addItem(item); + habbo.getClient().sendResponse(new PurchaseOKComposer(null)); + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_RECEIVED_ITEM)); + } + } + } + else if(rewardReceived.type.equalsIgnoreCase("respect")) + { + habbo.getHabboStats().respectPointsReceived += Integer.valueOf(rewardReceived.value); + } + else if (rewardReceived.type.equalsIgnoreCase("cata")) + { + CatalogItem item = Emulator.getGameEnvironment().getCatalogManager().getCatalogItem(Integer.valueOf(rewardReceived.value)); + + if (item != null) + { + Emulator.getGameEnvironment().getCatalogManager().purchaseItem(null, item, habbo, 1, "", true); + } + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_RECEIVED_ITEM)); + } + } + } + } + + public static boolean getReward(Habbo habbo, WiredEffectGiveReward wiredBox) + { + if(wiredBox.limit > 0) + { + if(wiredBox.limit - wiredBox.given == 0) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.LIMITED_NO_MORE_AVAILABLE)); + return false; + } + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) as rows, wired_rewards_given.* FROM wired_rewards_given WHERE user_id = ? AND wired_item = ? ORDER BY timestamp DESC LIMIT ?")) + { + statement.setInt(1, habbo.getHabboInfo().getId()); + statement.setInt(2, wiredBox.getId()); + statement.setInt(3, wiredBox.rewardItems.size()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.first()) + { + if (set.getInt("rows") >= 1) + { + if (wiredBox.limit == 0) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALREADY_RECEIVED)); + return false; + } + } + + set.beforeFirst(); + if (set.next()) + { + if (wiredBox.limit == WiredEffectGiveReward.LIMIT_N_MINUTES) + { + if (Emulator.getIntUnixTimestamp() - set.getInt("timestamp") <= 60) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALREADY_RECEIVED_THIS_MINUTE)); + return false; + } + } + + if (wiredBox.uniqueRewards) + { + if (set.getInt("rows") == wiredBox.rewardItems.size()) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALL_COLLECTED)); + return false; + } + } + + if (wiredBox.limit == WiredEffectGiveReward.LIMIT_N_HOURS) + { + if (!(Emulator.getIntUnixTimestamp() - set.getInt("timestamp") >= (3600 * wiredBox.limitationInterval))) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALREADY_RECEIVED_THIS_HOUR)); + return false; + } + } + + if (wiredBox.limit == WiredEffectGiveReward.LIMIT_N_DAY) + { + if (!(Emulator.getIntUnixTimestamp() - set.getInt("timestamp") >= (86400 * wiredBox.limitationInterval))) + { + habbo.getClient().sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALREADY_RECEIVED_THIS_TODAY)); + return false; + } + } + } + + if (wiredBox.uniqueRewards) + { + for (WiredGiveRewardItem item : wiredBox.rewardItems) + { + set.beforeFirst(); + boolean found = false; + + while (set.next()) + { + if (set.getInt("reward_id") == item.id) + found = true; + } + + if (!found) + { + giveReward(habbo, wiredBox, item); + return true; + } + } + } + else + { + int randomNumber = Emulator.getRandom().nextInt(101); + + int count = 0; + for (WiredGiveRewardItem item : wiredBox.rewardItems) + { + if (randomNumber >= count && randomNumber <= (count + item.probability)) + { + giveReward(habbo, wiredBox, item); + return true; + } + + count += item.probability; + } + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return false; + } + + public static void resetTimers(Room room) + { + if(!room.isLoaded()) + return; + + THashSet triggers = room.getRoomSpecialTypes().getTriggers(WiredTriggerType.AT_GIVEN_TIME); + + if (triggers != null) + { + for (InteractionWiredTrigger trigger : triggers) + { + ((WiredTriggerReset) trigger).resetTimer(); + } + } + + room.setLastTimerReset(Emulator.getIntUnixTimestamp()); + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreClearType.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreClearType.java new file mode 100644 index 00000000..a13f7134 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreClearType.java @@ -0,0 +1,16 @@ +package com.eu.habbo.habbohotel.wired; + +public enum WiredHighscoreClearType +{ + ALLTIME(0), + DAILY(1), + WEEKLY(2), + MONTHLY(3); + + public final int type; + + WiredHighscoreClearType(int type) + { + this.type = type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreData.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreData.java new file mode 100644 index 00000000..5fce052a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreData.java @@ -0,0 +1,18 @@ +package com.eu.habbo.habbohotel.wired; + +public class WiredHighscoreData +{ + public String[] usernames; + public int score; + public int teamScore; + public int totalScore; + + public WiredHighscoreData(String[] usernames, int score, int teamScore, int totalScore) + { + this.usernames = usernames; + + this.score = score; + this.teamScore = teamScore; + this.totalScore = totalScore; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreScoreType.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreScoreType.java new file mode 100644 index 00000000..10d8334d --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHighscoreScoreType.java @@ -0,0 +1,15 @@ +package com.eu.habbo.habbohotel.wired; + +public enum WiredHighscoreScoreType +{ + PERTEAM(0), + MOSTWIN(1), + CLASSIC(2); + + public final int type; + + WiredHighscoreScoreType(int type) + { + this.type = type; + } +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredMatchFurniSetting.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredMatchFurniSetting.java new file mode 100644 index 00000000..a981713a --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredMatchFurniSetting.java @@ -0,0 +1,33 @@ +package com.eu.habbo.habbohotel.wired; + +public class WiredMatchFurniSetting +{ + public final int itemId; + public final String state; + public final int rotation; + public final int x; + public final int y; + public final double z; + + public WiredMatchFurniSetting(int itemId, String state, int rotation, int x, int y, double z) + { + this.itemId = itemId; + this.state = state.replace("\t\t\t", " "); + this.rotation = rotation; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String toString() + { + return this.toString(true); + } + + public String toString(boolean includeState) + { + return itemId + "-" + (state.isEmpty() || !includeState ? " " : state) + "-" + rotation + "-" + x + "-" + y + "-" + z; + } + +} diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredTriggerType.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredTriggerType.java new file mode 100644 index 00000000..8bd9a339 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredTriggerType.java @@ -0,0 +1,27 @@ +package com.eu.habbo.habbohotel.wired; + +public enum WiredTriggerType +{ + SAY_SOMETHING(0), + WALKS_ON_FURNI(1), + WALKS_OFF_FURNI(2), + AT_GIVEN_TIME(3), + STATE_CHANGED(4), + PERIODICALLY(6), + ENTER_ROOM(7), + GAME_STARTS(8), + GAME_ENDS(9), + SCORE_ACHIEVED(10), + COLLISION(11), + PERIODICALLY_LONG(12), + BOT_REACHED_STF(13), + BOT_REACHED_AVTR(14), + SAY_COMMAND(0); + + public final int code; + + WiredTriggerType(int code) + { + this.code = code; + } +} diff --git a/src/main/java/com/eu/habbo/messages/ClientMessage.java b/src/main/java/com/eu/habbo/messages/ClientMessage.java new file mode 100644 index 00000000..aa733d04 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/ClientMessage.java @@ -0,0 +1,106 @@ +package com.eu.habbo.messages; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class ClientMessage +{ + private final int header; + private final ByteBuf buffer; + + public ByteBuf getBuffer() + { + return this.buffer; + } + + public int getMessageId() + { + return this.header; + } + + public ClientMessage(int messageId, ByteBuf buffer) + { + this.header = messageId; + this.buffer = ((buffer == null) || (buffer.readableBytes() == 0) ? Unpooled.EMPTY_BUFFER : buffer); + } + + public ClientMessage clone() throws CloneNotSupportedException + { + return new ClientMessage(this.header, this.buffer.duplicate()); + } + + public int readShort() + { + try + { + return this.buffer.readShort(); + } + catch (Exception e) + { + } + + return 0; + } + + public Integer readInt() + { + try + { + return this.buffer.readInt(); + } + catch (Exception e) + { + } + + return 0; + } + + public boolean readBoolean() + { + try + { + return this.buffer.readByte() == 1; + } + catch (Exception e) + { + } + + return false; + } + + public String readString() + { + try + { + int length = readShort(); + byte[] data = new byte[length]; + this.buffer.readBytes(data); + String s = new String(data); + return s; + } + catch (Exception e) + { + return ""; + } + } + + public String getMessageBody() + { + String consoleText = this.buffer.toString(Charset.defaultCharset()); + + for (int i = -1; i < 31; i++) { + consoleText = consoleText.replace(Character.toString((char)i), "[" + i + "]"); + } + + return consoleText; + } + + public int bytesAvailable() + { + return this.buffer.readableBytes(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/ISerialize.java b/src/main/java/com/eu/habbo/messages/ISerialize.java new file mode 100644 index 00000000..85662dfe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/ISerialize.java @@ -0,0 +1,6 @@ +package com.eu.habbo.messages; + +public abstract interface ISerialize +{ + public abstract void serialize(ServerMessage message); +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/PacketManager.java b/src/main/java/com/eu/habbo/messages/PacketManager.java new file mode 100644 index 00000000..1735d223 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -0,0 +1,596 @@ +package com.eu.habbo.messages; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.incoming.Incoming; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.incoming.achievements.*; +import com.eu.habbo.messages.incoming.ambassadors.*; +import com.eu.habbo.messages.incoming.camera.*; +import com.eu.habbo.messages.incoming.catalog.*; +import com.eu.habbo.messages.incoming.catalog.marketplace.*; +import com.eu.habbo.messages.incoming.catalog.recycler.*; +import com.eu.habbo.messages.incoming.crafting.*; +import com.eu.habbo.messages.incoming.events.calendar.AdventCalendarForceOpenEvent; +import com.eu.habbo.messages.incoming.events.calendar.AdventCalendarOpenDayEvent; +import com.eu.habbo.messages.incoming.floorplaneditor.*; +import com.eu.habbo.messages.incoming.friends.*; +import com.eu.habbo.messages.incoming.gamecenter.*; +import com.eu.habbo.messages.incoming.guardians.*; +import com.eu.habbo.messages.incoming.guides.*; +import com.eu.habbo.messages.incoming.guilds.*; +import com.eu.habbo.messages.incoming.handshake.*; +import com.eu.habbo.messages.incoming.helper.*; +import com.eu.habbo.messages.incoming.hotelview.*; +import com.eu.habbo.messages.incoming.inventory.*; +import com.eu.habbo.messages.incoming.modtool.*; +import com.eu.habbo.messages.incoming.navigator.*; +import com.eu.habbo.messages.incoming.polls.*; +import com.eu.habbo.messages.incoming.rooms.*; +import com.eu.habbo.messages.incoming.rooms.bots.*; +import com.eu.habbo.messages.incoming.rooms.items.*; +import com.eu.habbo.messages.incoming.rooms.items.jukebox.*; +import com.eu.habbo.messages.incoming.rooms.items.rentablespace.*; +import com.eu.habbo.messages.incoming.rooms.items.youtube.YoutubeRequestNextVideoEvent; +import com.eu.habbo.messages.incoming.rooms.items.youtube.YoutubeRequestPlayListEvent; +import com.eu.habbo.messages.incoming.rooms.items.youtube.YoutubeRequestVideoDataEvent; +import com.eu.habbo.messages.incoming.rooms.pets.*; +import com.eu.habbo.messages.incoming.rooms.promotions.*; +import com.eu.habbo.messages.incoming.rooms.users.*; +import com.eu.habbo.messages.incoming.trading.*; +import com.eu.habbo.messages.incoming.unknown.*; +import com.eu.habbo.messages.incoming.users.*; +import com.eu.habbo.messages.incoming.wired.*; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; +import gnu.trove.map.hash.THashMap; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PacketManager +{ + private final THashMap> incoming; + private final THashMap> callables; + private static final List logList = new ArrayList(); + + public PacketManager() throws Exception + { + this.incoming = new THashMap>(); + this.callables = new THashMap>(); + + this.registerHandshake(); + this.registerCatalog(); + this.registerEvent(); + this.registerFriends(); + this.registerNavigator(); + this.registerUsers(); + this.registerHotelview(); + this.registerInventory(); + this.registerRooms(); + this.registerPolls(); + this.registerUnknown(); + this.registerModTool(); + this.registerTrading(); + this.registerGuilds(); + this.registerPets(); + this.registerWired(); + this.registerAchievements(); + this.registerFloorPlanEditor(); + this.registerAmbassadors(); + this.registerGuides(); + this.registerCrafting(); + this.registerCamera(); + this.registerGameCenter(); + } + + public void registerHandler(Integer header, Class handler) throws Exception + { + if (header < 0) + return; + + if (this.incoming.containsKey(header)) + { + throw new Exception("Header already registered. Failed to register " + handler.getName() + " with header " + header); + } + + this.incoming.putIfAbsent(header, handler); + } + + public void registerCallable(Integer header, Map.Entry objectMethodEntry) + { + this.callables.put(header, objectMethodEntry); + } + + public void unregisterCallable(Integer header) + { + this.callables.remove(header); + } + + public void handlePacket(GameClient client, ClientMessage packet) + { + if(client == null || Emulator.isShuttingDown) + return; + + if (client.getHabbo() == null && !(packet.getMessageId() == Incoming.SecureLoginEvent || packet.getMessageId() == Incoming.MachineIDEvent)) + return; + + try + { + if(this.isRegistered(packet.getMessageId())) + { + if(PacketManager.DEBUG_SHOW_PACKETS) + Emulator.getLogging().logPacketLine("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + packet.getMessageId() + "] => " + packet.getMessageBody()); + + if (logList.contains(packet.getMessageId()) && client.getHabbo() != null) + { + System.out.println(("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + client.getHabbo().getHabboInfo().getUsername() + "][" + packet.getMessageId() + "] => " + packet.getMessageBody())); + } + + final MessageHandler handler = this.incoming.get(packet.getMessageId()).newInstance(); + + handler.client = client; + handler.packet = packet; + + if (this.callables.containsKey(packet.getMessageId())) + { + Map.Entry entry = this.callables.get(packet.getMessageId()); + + if (entry.getKey() != null) + { + entry.getValue().invoke(entry.getKey(), handler); + } + } + + if (!handler.isCancelled) + { + handler.handle(); + } + } + else + { + if(PacketManager.DEBUG_SHOW_PACKETS) + Emulator.getLogging().logPacketLine("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + Logging.ANSI_RED + "UNDEFINED" + Logging.ANSI_RESET + "][" + packet.getMessageId() + "] => " + packet.getMessageBody()); + } + } + catch(Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + boolean isRegistered(int header) + { + return this.incoming.containsKey(header); + } + + private void registerAmbassadors() throws Exception + { + this.registerHandler(Incoming.AmbassadorAlertCommandEvent, AmbassadorAlertCommandEvent.class); + this.registerHandler(Incoming.AmbassadorVisitCommandEvent, AmbassadorVisitCommandEvent.class); + } + + private void registerCatalog() throws Exception + { + this.registerHandler(Incoming.RequestRecylerLogicEvent, RequestRecyclerLogicEvent.class); + this.registerHandler(Incoming.RequestDiscountEvent, RequestDiscountEvent.class); + this.registerHandler(Incoming.RequestGiftConfigurationEvent, RequestGiftConfigurationEvent.class); + this.registerHandler(Incoming.GetMarketplaceConfigEvent, RequestMarketplaceConfigEvent.class); + this.registerHandler(Incoming.RequestCatalogModeEvent, RequestCatalogModeEvent.class); + this.registerHandler(Incoming.RequestCatalogIndexEvent, RequestCatalogIndexEvent.class); + this.registerHandler(Incoming.RequestCatalogPageEvent, RequestCatalogPageEvent.class); + this.registerHandler(Incoming.CatalogBuyItemAsGiftEvent, CatalogBuyItemAsGiftEvent.class); + this.registerHandler(Incoming.CatalogBuyItemEvent, CatalogBuyItemEvent.class); + this.registerHandler(Incoming.RedeemVoucherEvent, RedeemVoucherEvent.class); + this.registerHandler(Incoming.ReloadRecyclerEvent, ReloadRecyclerEvent.class); + this.registerHandler(Incoming.RecycleEvent, RecycleEvent.class); + this.registerHandler(Incoming.OpenRecycleBoxEvent, OpenRecycleBoxEvent.class); + this.registerHandler(Incoming.RequestOwnItemsEvent, RequestOwnItemsEvent.class); + this.registerHandler(Incoming.TakeBackItemEvent, TakeBackItemEvent.class); + this.registerHandler(Incoming.RequestOffersEvent, RequestOffersEvent.class); + this.registerHandler(Incoming.RequestItemInfoEvent, RequestItemInfoEvent.class); + this.registerHandler(Incoming.BuyItemEvent, BuyItemEvent.class); + this.registerHandler(Incoming.RequestSellItemEvent, RequestSellItemEvent.class); + this.registerHandler(Incoming.SellItemEvent, SellItemEvent.class); + this.registerHandler(Incoming.RequestCreditsEvent, RequestCreditsEvent.class); + this.registerHandler(Incoming.RequestPetBreedsEvent, RequestPetBreedsEvent.class); + this.registerHandler(Incoming.CheckPetNameEvent, CheckPetNameEvent.class); + this.registerHandler(Incoming.GetClubDataEvent, RequestClubDataEvent.class); + this.registerHandler(Incoming.RequestClubGiftsEvent, RequestClubGiftsEvent.class); + this.registerHandler(Incoming.CatalogSearchedItemEvent, CatalogSearchedItemEvent.class); + } + + private void registerEvent() throws Exception + { + this.registerHandler(Incoming.AdventCalendarOpenDayEvent, AdventCalendarOpenDayEvent.class); + this.registerHandler(Incoming.AdventCalendarForceOpenEvent, AdventCalendarForceOpenEvent.class); + } + + private void registerHandshake() throws Exception + { + this.registerHandler(Incoming.ReleaseVersionEvent, ReleaseVersionEvent.class); + this.registerHandler(Incoming.GenerateSecretKeyEvent, GenerateSecretKeyEvent.class); + this.registerHandler(Incoming.RequestBannerToken, RequestBannerToken.class); + this.registerHandler(Incoming.SecureLoginEvent, SecureLoginEvent.class); + this.registerHandler(Incoming.MachineIDEvent, MachineIDEvent.class); + this.registerHandler(Incoming.UsernameEvent, UsernameEvent.class); + this.registerHandler(Incoming.PingEvent, PingEvent.class); + } + + private void registerFriends() throws Exception + { + this.registerHandler(Incoming.RequestFriendsEvent, RequestFriendsEvent.class); + this.registerHandler(Incoming.ChangeRelationEvent, ChangeRelationEvent.class); + this.registerHandler(Incoming.RemoveFriendEvent, RemoveFriendEvent.class); + this.registerHandler(Incoming.SearchUserEvent, SearchUserEvent.class); + this.registerHandler(Incoming.FriendRequestEvent, FriendRequestEvent.class); + this.registerHandler(Incoming.AcceptFriendRequest, AcceptFriendRequestEvent.class); + this.registerHandler(Incoming.DeclineFriendRequest, DeclineFriendRequestEvent.class); + this.registerHandler(Incoming.FriendPrivateMessageEvent, FriendPrivateMessageEvent.class); + this.registerHandler(Incoming.RequestFriendRequestEvent, RequestFriendRequestsEvent.class); + this.registerHandler(Incoming.StalkFriendEvent, StalkFriendEvent.class); + this.registerHandler(Incoming.RequestInitFriendsEvent, RequestInitFriendsEvent.class); + this.registerHandler(Incoming.FindNewFriendsEvent, FindNewFriendsEvent.class); + this.registerHandler(Incoming.InviteFriendsEvent, InviteFriendsEvent.class); + } + + private void registerUsers() throws Exception + { + this.registerHandler(Incoming.RequestUserDataEvent, RequestUserDataEvent.class); + this.registerHandler(Incoming.RequestUserCreditsEvent, RequestUserCreditsEvent.class); + this.registerHandler(Incoming.RequestUserClubEvent, RequestUserClubEvent.class); + this.registerHandler(Incoming.RequestMeMenuSettingsEvent, RequestMeMenuSettingsEvent.class); + this.registerHandler(Incoming.RequestUserCitizinShipEvent, RequestUserCitizinShipEvent.class); + this.registerHandler(Incoming.RequestUserProfileEvent, RequestUserProfileEvent.class); + this.registerHandler(Incoming.RequestProfileFriendsEvent, RequestProfileFriendsEvent.class); + this.registerHandler(Incoming.RequestUserWardrobeEvent, RequestUserWardrobeEvent.class); + this.registerHandler(Incoming.SaveWardrobeEvent, SaveWardrobeEvent.class); + this.registerHandler(Incoming.SaveMottoEvent, SaveMottoEvent.class); + this.registerHandler(Incoming.UserSaveLookEvent, UserSaveLookEvent.class); + this.registerHandler(Incoming.UserWearBadgeEvent, UserWearBadgeEvent.class); + this.registerHandler(Incoming.RequestWearingBadgesEvent, RequestWearingBadgesEvent.class); + this.registerHandler(Incoming.SaveUserVolumesEvent, SaveUserVolumesEvent.class); + this.registerHandler(Incoming.SaveBlockCameraFollowEvent, SaveBlockCameraFollowEvent.class); + this.registerHandler(Incoming.SaveIgnoreRoomInvitesEvent, SaveIgnoreRoomInvitesEvent.class); + this.registerHandler(Incoming.SavePreferOldChatEvent, SavePreferOldChatEvent.class); + this.registerHandler(Incoming.ActivateEffectEvent, ActivateEffectEvent.class); + this.registerHandler(Incoming.EnableEffectEvent, EnableEffectEvent.class); + this.registerHandler(Incoming.UserActivityEvent, UserActivityEvent.class); + this.registerHandler(Incoming.UserNuxEvent, UserNuxEvent.class); + this.registerHandler(Incoming.PickNewUserGiftEvent, PickNewUserGiftEvent.class); + this.registerHandler(Incoming.ChangeNameCheckUsernameEvent, ChangeNameCheckUsernameEvent.class); + this.registerHandler(Incoming.ConfirmChangeNameEvent, ConfirmChangeNameEvent.class); + } + + private void registerNavigator() throws Exception + { + this.registerHandler(Incoming.RequestRoomCategoriesEvent, RequestRoomCategoriesEvent.class); + this.registerHandler(Incoming.RequestPopularRoomsEvent, RequestPopularRoomsEvent.class); + this.registerHandler(Incoming.RequestHighestScoreRoomsEvent, RequestHighestScoreRoomsEvent.class); + this.registerHandler(Incoming.RequestMyRoomsEvent, RequestMyRoomsEvent.class); + this.registerHandler(Incoming.RequestCanCreateRoomEvent, RequestCanCreateRoomEvent.class); + this.registerHandler(Incoming.RequestPromotedRoomsEvent, RequestPromotedRoomsEvent.class); + this.registerHandler(Incoming.RequestCreateRoomEvent, RequestCreateRoomEvent.class); + this.registerHandler(Incoming.RequestTagsEvent, RequestTagsEvent.class); + this.registerHandler(Incoming.SearchRoomsByTagEvent, SearchRoomsByTagEvent.class); + this.registerHandler(Incoming.SearchRoomsEvent, SearchRoomsEvent.class); + this.registerHandler(Incoming.SearchRoomsFriendsNowEvent, SearchRoomsFriendsNowEvent.class); + this.registerHandler(Incoming.SearchRoomsFriendsOwnEvent, SearchRoomsFriendsOwnEvent.class); + this.registerHandler(Incoming.SearchRoomsWithRightsEvent, SearchRoomsWithRightsEvent.class); + this.registerHandler(Incoming.SearchRoomsInGroupEvent, SearchRoomsInGroupEvent.class); + this.registerHandler(Incoming.SearchRoomsMyFavoriteEvent, SearchRoomsMyFavouriteEvent.class); + this.registerHandler(Incoming.SearchRoomsVisitedEvent, SearchRoomsVisitedEvent.class); + this.registerHandler(Incoming.RequestNewNavigatorDataEvent, RequestNewNavigatorDataEvent.class); + this.registerHandler(Incoming.RequestNewNavigatorRoomsEvent, RequestNewNavigatorRoomsEvent.class); + this.registerHandler(Incoming.NewNavigatorActionEvent, NewNavigatorActionEvent.class); + this.registerHandler(Incoming.RequestNavigatorSettingsEvent, RequestNavigatorSettingsEvent.class); + this.registerHandler(Incoming.SaveWindowSettingsEvent, SaveWindowSettingsEvent.class); + this.registerHandler(Incoming.RequestDeleteRoomEvent, RequestDeleteRoomEvent.class); + this.registerHandler(Incoming.NavigatorCategoryListModeEvent, NavigatorCategoryListModeEvent.class); + this.registerHandler(Incoming.NavigatorCollapseCategoryEvent, NavigatorCollapseCategoryEvent.class); + this.registerHandler(Incoming.NavigatorUncollapseCategoryEvent, NavigatorUncollapseCategoryEvent.class); + } + + private void registerHotelview() throws Exception + { + this.registerHandler(Incoming.HotelViewEvent, HotelViewEvent.class); + this.registerHandler(Incoming.HotelViewRequestBonusRareEvent, HotelViewRequestBonusRareEvent.class); + this.registerHandler(Incoming.RequestNewsListEvent, RequestNewsListEvent.class); + this.registerHandler(Incoming.HotelViewDataEvent, HotelViewDataEvent.class); + this.registerHandler(Incoming.HotelViewRequestBadgeRewardEvent, HotelViewRequestBadgeRewardEvent.class); + this.registerHandler(Incoming.HotelViewClaimBadgeRewardEvent, HotelViewClaimBadgeRewardEvent.class); + } + + private void registerInventory() throws Exception + { + this.registerHandler(Incoming.TestInventoryEvent, TestInventoryEvent.class); + this.registerHandler(Incoming.RequestInventoryBadgesEvent, RequestInventoryBadgesEvent.class); + this.registerHandler(Incoming.RequestInventoryBotsEvent, RequestInventoryBotsEvent.class); + this.registerHandler(Incoming.RequestInventoryItemsEvent, RequestInventoryItemsEvent.class); + this.registerHandler(Incoming.RequestInventoryPetsEvent, RequestInventoryPetsEvent.class); + } + + void registerRooms() throws Exception + { + this.registerHandler(Incoming.RequestRoomLoadEvent, RequestRoomLoadEvent.class); + this.registerHandler(Incoming.RequestHeightmapEvent, RequestRoomHeightmapEvent.class); + this.registerHandler(Incoming.RequestRoomHeightmapEvent, RequestRoomHeightmapEvent.class); + this.registerHandler(Incoming.RoomVoteEvent, RoomVoteEvent.class); + this.registerHandler(Incoming.RequestRoomDataEvent, RequestRoomDataEvent.class); + this.registerHandler(Incoming.RoomSettingsSaveEvent, RoomSettingsSaveEvent.class); + this.registerHandler(Incoming.RoomPlaceItemEvent, RoomPlaceItemEvent.class); + this.registerHandler(Incoming.RotateMoveItemEvent, RotateMoveItemEvent.class); + this.registerHandler(Incoming.MoveWallItemEvent, MoveWallItemEvent.class); + this.registerHandler(Incoming.RoomPickupItemEvent, RoomPickupItemEvent.class); + this.registerHandler(Incoming.RoomPlacePaintEvent, RoomPlacePaintEvent.class); + this.registerHandler(Incoming.RoomUserStartTypingEvent, RoomUserStartTypingEvent.class); + this.registerHandler(Incoming.RoomUserStopTypingEvent, RoomUserStopTypingEvent.class); + this.registerHandler(Incoming.ToggleFloorItemEvent, ToggleFloorItemEvent.class); + this.registerHandler(Incoming.ToggleWallItemEvent, ToggleWallItemEvent.class); + this.registerHandler(Incoming.RoomBackgroundEvent, RoomBackgroundEvent.class); + this.registerHandler(Incoming.MannequinSaveNameEvent, MannequinSaveNameEvent.class); + this.registerHandler(Incoming.MannequinSaveLookEvent, MannequinSaveLookEvent.class); + this.registerHandler(Incoming.FootballGateSaveLookEvent, FootballGateSaveLookEvent.class); + this.registerHandler(Incoming.AdvertisingSaveEvent, AdvertisingSaveEvent.class); + this.registerHandler(Incoming.RequestRoomSettingsEvent, RequestRoomSettingsEvent.class); + this.registerHandler(Incoming.MoodLightSettingsEvent, MoodLightSettingsEvent.class); + this.registerHandler(Incoming.MoodLightTurnOnEvent, MoodLightTurnOnEvent.class); + this.registerHandler(Incoming.RoomUserDropHandItemEvent, RoomUserDropHandItemEvent.class); + this.registerHandler(Incoming.RoomUserLookAtPoint, RoomUserLookAtPoint.class); + this.registerHandler(Incoming.RoomUserTalkEvent, RoomUserTalkEvent.class); + this.registerHandler(Incoming.RoomUserShoutEvent, RoomUserShoutEvent.class); + this.registerHandler(Incoming.RoomUserWhisperEvent, RoomUserWhisperEvent.class); + this.registerHandler(Incoming.RoomUserActionEvent, RoomUserActionEvent.class); + this.registerHandler(Incoming.RoomUserSitEvent, RoomUserSitEvent.class); + this.registerHandler(Incoming.RoomUserDanceEvent, RoomUserDanceEvent.class); + this.registerHandler(Incoming.RoomUserSignEvent, RoomUserSignEvent.class); + this.registerHandler(Incoming.RoomUserWalkEvent, RoomUserWalkEvent.class); + this.registerHandler(Incoming.RoomUserGiveRespectEvent, RoomUserGiveRespectEvent.class); + this.registerHandler(Incoming.RoomUserGiveRightsEvent, RoomUserGiveRightsEvent.class); + this.registerHandler(Incoming.RoomRemoveRightsEvent, RoomRemoveRightsEvent.class); + this.registerHandler(Incoming.RequestRoomRightsEvent, RequestRoomRightsEvent.class); + this.registerHandler(Incoming.RoomRemoveAllRightsEvent, RoomRemoveAllRightsEvent.class); + this.registerHandler(Incoming.RoomUserRemoveRightsEvent, RoomUserRemoveRightsEvent.class); + this.registerHandler(Incoming.BotPlaceEvent, BotPlaceEvent.class); + this.registerHandler(Incoming.BotPickupEvent, BotPickupEvent.class); + this.registerHandler(Incoming.BotSaveSettingsEvent, BotSaveSettingsEvent.class); + this.registerHandler(Incoming.BotSettingsEvent, BotSettingsEvent.class); + this.registerHandler(Incoming.TriggerDiceEvent, TriggerDiceEvent.class); + this.registerHandler(Incoming.CloseDiceEvent, CloseDiceEvent.class); + this.registerHandler(Incoming.TriggerColorWheelEvent, TriggerColorWheelEvent.class); + this.registerHandler(Incoming.RedeemItemEvent, RedeemItemEvent.class); + this.registerHandler(Incoming.PetPlaceEvent, PetPlaceEvent.class); + this.registerHandler(Incoming.RoomUserKickEvent, RoomUserKickEvent.class); + this.registerHandler(Incoming.SetStackHelperHeightEvent, SetStackHelperHeightEvent.class); + this.registerHandler(Incoming.TriggerOneWayGateEvent, TriggerOneWayGateEvent.class); + this.registerHandler(Incoming.HandleDoorbellEvent, HandleDoorbellEvent.class); + this.registerHandler(Incoming.RedeemClothingEvent, RedeemClothingEvent.class); + this.registerHandler(Incoming.PostItPlaceEvent, PostItPlaceEvent.class); + this.registerHandler(Incoming.PostItRequestDataEvent, PostItRequestDataEvent.class); + this.registerHandler(Incoming.PostItSaveDataEvent, PostItSaveDataEvent.class); + this.registerHandler(Incoming.PostItDeleteEvent, PostItDeleteEvent.class); + this.registerHandler(Incoming.MoodLightSaveSettingsEvent, MoodLightSaveSettingsEvent.class); + this.registerHandler(Incoming.RentSpaceEvent, RentSpaceEvent.class); + this.registerHandler(Incoming.RentSpaceCancelEvent, RentSpaceCancelEvent.class); + this.registerHandler(Incoming.SetHomeRoomEvent, SetHomeRoomEvent.class); + this.registerHandler(Incoming.RoomUserGiveHandItemEvent, RoomUserGiveHandItemEvent.class); + this.registerHandler(Incoming.RoomMuteEvent, RoomMuteEvent.class); + this.registerHandler(Incoming.RequestRoomWordFilterEvent, RequestRoomWordFilterEvent.class); + this.registerHandler(Incoming.RoomWordFilterModifyEvent, RoomWordFilterModifyEvent.class); + this.registerHandler(Incoming.RoomStaffPickEvent, RoomStaffPickEvent.class); + this.registerHandler(Incoming.RoomRequestBannedUsersEvent, RoomRequestBannedUsersEvent.class); + this.registerHandler(Incoming.JukeBoxRequestTrackCodeEvent, JukeBoxRequestTrackCodeEvent.class); + this.registerHandler(Incoming.JukeBoxRequestTrackDataEvent, JukeBoxRequestTrackDataEvent.class); + this.registerHandler(Incoming.JukeBoxAddSoundTrackEvent, JukeBoxAddSoundTrackEvent.class); + this.registerHandler(Incoming.JukeBoxRemoveSoundTrackEvent, JukeBoxRemoveSoundTrackEvent.class); + this.registerHandler(Incoming.JukeBoxRequestPlayListEvent, JukeBoxRequestPlayListEvent.class); + this.registerHandler(Incoming.JukeBoxEventOne, JukeBoxEventOne.class); + this.registerHandler(Incoming.JukeBoxEventTwo, JukeBoxEventTwo.class); + this.registerHandler(Incoming.SavePostItStickyPoleEvent, SavePostItStickyPoleEvent.class); + this.registerHandler(Incoming.RequestPromotionRoomsEvent, RequestPromotionRoomsEvent.class); + this.registerHandler(Incoming.BuyRoomPromotionEvent, BuyRoomPromotionEvent.class); + this.registerHandler(Incoming.EditRoomPromotionMessageEvent, UpdateRoomPromotionEvent.class); + this.registerHandler(Incoming.IgnoreRoomUserEvent, IgnoreRoomUserEvent.class); + this.registerHandler(Incoming.UnIgnoreRoomUserEvent, UnIgnoreRoomUserEvent.class); + this.registerHandler(Incoming.RoomUserMuteEvent, RoomUserMuteEvent.class); + this.registerHandler(Incoming.RoomUserBanEvent, RoomUserBanEvent.class); + this.registerHandler(Incoming.UnbanRoomUserEvent, UnbanRoomUserEvent.class); + this.registerHandler(Incoming.RequestRoomUserTagsEvent, RequestRoomUserTagsEvent.class); + this.registerHandler(Incoming.YoutubeRequestPlayListEvent, YoutubeRequestPlayListEvent.class); + this.registerHandler(Incoming.YoutubeRequestNextVideoEvent, YoutubeRequestNextVideoEvent.class); + this.registerHandler(Incoming.YoutubeRequestVideoDataEvent, YoutubeRequestVideoDataEvent.class); + this.registerHandler(Incoming.RoomFavoriteEvent, RoomFavoriteEvent.class); + } + + void registerPolls() throws Exception + { + this.registerHandler(Incoming.CancelPollEvent, CancelPollEvent.class); + this.registerHandler(Incoming.GetPollDataEvent, GetPollDataEvent.class); + this.registerHandler(Incoming.AnswerPollEvent, AnswerPollEvent.class); + } + + void registerModTool() throws Exception + { + this.registerHandler(Incoming.ModToolRequestRoomInfoEvent, ModToolRequestRoomInfoEvent.class); + this.registerHandler(Incoming.ModToolRequestRoomChatlogEvent, ModToolRequestRoomChatlogEvent.class); + this.registerHandler(Incoming.ModToolRequestUserInfoEvent, ModToolRequestUserInfoEvent.class); + this.registerHandler(Incoming.ModToolPickTicketEvent, ModToolPickTicketEvent.class); + this.registerHandler(Incoming.ModToolCloseTicketEvent, ModToolCloseTicketEvent.class); + this.registerHandler(Incoming.ModToolReleaseTicketEvent, ModToolReleaseTicketEvent.class); + this.registerHandler(Incoming.ModToolAlertEvent, ModToolAlertEvent.class); + this.registerHandler(Incoming.ModToolWarnEvent, ModToolAlertEvent.class); + this.registerHandler(Incoming.ModToolKickEvent, ModToolKickEvent.class); + this.registerHandler(Incoming.ModToolRoomAlertEvent, ModToolRoomAlertEvent.class); + this.registerHandler(Incoming.ModToolChangeRoomSettingsEvent, ModToolChangeRoomSettingsEvent.class); + this.registerHandler(Incoming.ModToolRequestRoomVisitsEvent, ModToolRequestRoomVisitsEvent.class); + this.registerHandler(Incoming.ModToolRequestIssueChatlogEvent, ModToolRequestIssueChatlogEvent.class); + this.registerHandler(Incoming.ModToolRequestRoomUserChatlogEvent, ModToolRequestRoomUserChatlogEvent.class); + this.registerHandler(Incoming.ModToolRequestUserChatlogEvent, ModToolRequestUserChatlogEvent.class); + this.registerHandler(Incoming.ModToolSanctionAlertEvent, ModToolSanctionAlertEvent.class); + this.registerHandler(Incoming.ModToolSanctionMuteEvent, ModToolSanctionMuteEvent.class); + this.registerHandler(Incoming.ModToolSanctionBanEvent, ModToolSanctionBanEvent.class); + this.registerHandler(Incoming.ModToolSanctionTradeLockEvent, ModToolSanctionTradeLockEvent.class); + this.registerHandler(Incoming.ModToolIssueChangeTopicEvent, ModToolIssueChangeTopicEvent.class); + this.registerHandler(Incoming.ModToolIssueDefaultSanctionEvent, ModToolIssueDefaultSanctionEvent.class); + + this.registerHandler(Incoming.RequestReportRoomEvent, RequestReportRoomEvent.class); + this.registerHandler(Incoming.RequestReportUserBullyingEvent, RequestReportUserBullyingEvent.class); + this.registerHandler(Incoming.ReportBullyEvent, ReportBullyEvent.class); + this.registerHandler(Incoming.ReportEvent, ReportEvent.class); + this.registerHandler(Incoming.ReportFriendPrivateChatEvent, ReportFriendPrivateChatEvent.class); + } + + void registerTrading() throws Exception + { + this.registerHandler(Incoming.TradeStartEvent, TradeStartEvent.class); + this.registerHandler(Incoming.TradeOfferItemEvent, TradeOfferItemEvent.class); + this.registerHandler(Incoming.TradeOfferMultipleItemsEvent, TradeOfferMultipleItemsEvent.class); + this.registerHandler(Incoming.TradeCancelOfferItemEvent, TradeCancelOfferItemEvent.class); + this.registerHandler(Incoming.TradeAcceptEvent, TradeAcceptEvent.class); + this.registerHandler(Incoming.TradeUnAcceptEvent, TradeUnAcceptEvent.class); + this.registerHandler(Incoming.TradeConfirmEvent, TradeConfirmEvent.class); + this.registerHandler(Incoming.TradeCloseEvent, TradeCloseEvent.class); + this.registerHandler(Incoming.TradeCancelEvent, TradeCancelEvent.class); + } + + void registerGuilds() throws Exception + { + this.registerHandler(Incoming.RequestGuildBuyRoomsEvent, RequestGuildBuyRoomsEvent.class); + this.registerHandler(Incoming.RequestGuildPartsEvent, RequestGuildPartsEvent.class); + this.registerHandler(Incoming.RequestGuildBuyEvent, RequestGuildBuyEvent.class); + this.registerHandler(Incoming.RequestGuildInfoEvent, RequestGuildInfoEvent.class); + this.registerHandler(Incoming.RequestGuildManageEvent, RequestGuildManageEvent.class); + this.registerHandler(Incoming.RequestGuildMembersEvent, RequestGuildMembersEvent.class); + this.registerHandler(Incoming.RequestGuildJoinEvent, RequestGuildJoinEvent.class); + this.registerHandler(Incoming.GuildChangeNameDescEvent, GuildChangeNameDescEvent.class); + this.registerHandler(Incoming.GuildChangeBadgeEvent, GuildChangeBadgeEvent.class); + this.registerHandler(Incoming.GuildChangeColorsEvent, GuildChangeColorsEvent.class); + this.registerHandler(Incoming.GuildRemoveAdminEvent, GuildRemoveAdminEvent.class); + this.registerHandler(Incoming.GuildRemoveMemberEvent, GuildRemoveMemberEvent.class); + this.registerHandler(Incoming.GuildChangeSettingsEvent, GuildChangeSettingsEvent.class); + this.registerHandler(Incoming.GuildAcceptMembershipEvent, GuildAcceptMembershipEvent.class); + this.registerHandler(Incoming.GuildDeclineMembershipEvent, GuildDeclineMembershipEvent.class); + this.registerHandler(Incoming.GuildSetAdminEvent, GuildSetAdminEvent.class); + this.registerHandler(Incoming.GuildSetFavoriteEvent, GuildSetFavoriteEvent.class); + this.registerHandler(Incoming.RequestOwnGuildsEvent, RequestOwnGuildsEvent.class); + this.registerHandler(Incoming.RequestGuildFurniWidgetEvent, RequestGuildFurniWidgetEvent.class); + this.registerHandler(Incoming.GuildConfirmRemoveMemberEvent, GuildConfirmRemoveMemberEvent.class); + this.registerHandler(Incoming.GuildRemoveFavoriteEvent, GuildRemoveFavoriteEvent.class); + this.registerHandler(Incoming.GuildDeleteEvent, GuildDeleteEvent.class); + //this.registerHandler(Incoming.GetHabboGuildBadgesMessageEvent, GetHabboGuildBadgesMessageEvent.class); + } + + void registerPets() throws Exception + { + this.registerHandler(Incoming.RequestPetInformationEvent, RequestPetInformationEvent.class); + this.registerHandler(Incoming.PetPickupEvent, PetPickupEvent.class); + this.registerHandler(Incoming.ScratchPetEvent, ScratchPetEvent.class); + this.registerHandler(Incoming.RequestPetTrainingPanelEvent, RequestPetTrainingPanelEvent.class); + this.registerHandler(Incoming.HorseUseItemEvent, HorseUseItemEvent.class); + this.registerHandler(Incoming.HorseRideSettingsEvent, HorseRideSettingsEvent.class); + this.registerHandler(Incoming.HorseRideEvent, HorseRideEvent.class); + this.registerHandler(Incoming.ToggleMonsterplantBreedableEvent, ToggleMonsterplantBreedableEvent.class); + this.registerHandler(Incoming.CompostMonsterplantEvent, CompostMonsterplantEvent.class); + this.registerHandler(Incoming.BreedPetsEvent, BreedPetsEvent.class); + this.registerHandler(Incoming.MovePetEvent, MovePetEvent.class); + this.registerHandler(Incoming.PetPackageNameEvent, PetPackageNameEvent.class); + } + + void registerWired() throws Exception + { + this.registerHandler(Incoming.WiredTriggerSaveDataEvent, WiredTriggerSaveDataEvent.class); + this.registerHandler(Incoming.WiredEffectSaveDataEvent, WiredEffectSaveDataEvent.class); + this.registerHandler(Incoming.WiredConditionSaveDataEvent, WiredConditionSaveDataEvent.class); + } + + void registerUnknown() throws Exception + { + this.registerHandler(Incoming.RequestResolutionEvent, RequestResolutionEvent.class); + this.registerHandler(Incoming.RequestTalenTrackEvent, RequestTalentTrackEvent.class); + this.registerHandler(Incoming.UnknownEvent1, UnknownEvent1.class); + } + + void registerFloorPlanEditor() throws Exception + { + this.registerHandler(Incoming.FloorPlanEditorSaveEvent, FloorPlanEditorSaveEvent.class); + this.registerHandler(Incoming.FloorPlanEditorRequestBlockedTilesEvent, FloorPlanEditorRequestBlockedTilesEvent.class); + this.registerHandler(Incoming.FloorPlanEditorRequestDoorSettingsEvent, FloorPlanEditorRequestDoorSettingsEvent.class); + } + + void registerAchievements() throws Exception + { + this.registerHandler(Incoming.RequestAchievementsEvent, RequestAchievementsEvent.class); + this.registerHandler(Incoming.RequestAchievementConfigurationEvent, RequestAchievementConfigurationEvent.class); + } + + void registerGuides() throws Exception + { + this.registerHandler(Incoming.RequestGuideToolEvent, RequestGuideToolEvent.class); + this.registerHandler(Incoming.RequestGuideAssistanceEvent, RequestGuideAssistanceEvent.class); + this.registerHandler(Incoming.GuideUserTypingEvent, GuideUserTypingEvent.class); + this.registerHandler(Incoming.GuideReportHelperEvent, GuideReportHelperEvent.class); + this.registerHandler(Incoming.GuideRecommendHelperEvent, GuideRecommendHelperEvent.class); + this.registerHandler(Incoming.GuideUserMessageEvent, GuideUserMessageEvent.class); + this.registerHandler(Incoming.GuideCancelHelpRequestEvent, GuideCancelHelpRequestEvent.class); + this.registerHandler(Incoming.GuideHandleHelpRequestEvent, GuideHandleHelpRequestEvent.class); + this.registerHandler(Incoming.GuideInviteUserEvent, GuideInviteUserEvent.class); + this.registerHandler(Incoming.GuideVisitUserEvent, GuideVisitUserEvent.class); + this.registerHandler(Incoming.GuideCloseHelpRequestEvent, GuideCloseHelpRequestEvent.class); + + this.registerHandler(Incoming.GuardianNoUpdatesWantedEvent, GuardianNoUpdatesWantedEvent.class); + this.registerHandler(Incoming.GuardianAcceptRequestEvent, GuardianAcceptRequestEvent.class); + this.registerHandler(Incoming.GuardianVoteEvent, GuardianVoteEvent.class); + } + + void registerCrafting() throws Exception + { + this.registerHandler(Incoming.RequestCraftingRecipesEvent, RequestCraftingRecipesEvent.class); + this.registerHandler(Incoming.CraftingAddRecipeEvent, CraftingAddRecipeEvent.class); + this.registerHandler(Incoming.CraftingCraftItemEvent, CraftingCraftItemEvent.class); + this.registerHandler(Incoming.CraftingCraftSecretEvent, CraftingCraftSecretEvent.class); + this.registerHandler(Incoming.RequestCraftingRecipesAvailableEvent, RequestCraftingRecipesAvailableEvent.class); + } + + void registerCamera() throws Exception + { + this.registerHandler(Incoming.CameraRoomPictureEvent, CameraRoomPictureEvent.class); + this.registerHandler(Incoming.RequestCameraConfigurationEvent, RequestCameraConfigurationEvent.class); + this.registerHandler(Incoming.CameraPurchaseEvent, CameraPurchaseEvent.class); + this.registerHandler(Incoming.CameraRoomThumbnailEvent, CameraRoomThumbnailEvent.class); + this.registerHandler(Incoming.CameraPublishToWebEvent, CameraPublishToWebEvent.class); + } + + void registerGameCenter() throws Exception + { + this.registerHandler(Incoming.GameCenterRequestGamesEvent, GameCenterRequestGamesEvent.class); + this.registerHandler(Incoming.GameCenterRequestAccountStatusEvent, GameCenterRequestAccountStatusEvent.class); + this.registerHandler(Incoming.GameCenterJoinGameEvent, GameCenterJoinGameEvent.class); + this.registerHandler(Incoming.GameCenterLoadGameEvent, GameCenterLoadGameEvent.class); + this.registerHandler(Incoming.GameCenterLeaveGameEvent, GameCenterLeaveGameEvent.class); + this.registerHandler(Incoming.GameCenterEvent, GameCenterEvent.class); + this.registerHandler(Incoming.GameCenterRequestGameStatusEvent, GameCenterRequestGameStatusEvent.class); + } + + @EventHandler + public static void onConfigurationUpdated(EmulatorConfigUpdatedEvent event) + { + logList.clear(); + + for (String s : Emulator.getConfig().getValue("debug.show.headers").split(";")) + { + try + { + logList.add(Integer.valueOf(s)); + } + catch (Exception e) + { + + } + } + } + + public static boolean DEBUG_SHOW_PACKETS = false; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/PacketManager_1006.java b/src/main/java/com/eu/habbo/messages/PacketManager_1006.java new file mode 100644 index 00000000..ba570d25 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/PacketManager_1006.java @@ -0,0 +1,429 @@ +package com.eu.habbo.messages; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.incoming.Incoming; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.incoming.achievements.RequestAchievementsEvent; +import com.eu.habbo.messages.incoming.ambassadors.AmbassadorAlertCommandEvent; +import com.eu.habbo.messages.incoming.ambassadors.AmbassadorVisitCommandEvent; +import com.eu.habbo.messages.incoming.catalog.*; +import com.eu.habbo.messages.incoming.catalog.marketplace.*; +import com.eu.habbo.messages.incoming.catalog.recycler.OpenRecycleBoxEvent; +import com.eu.habbo.messages.incoming.catalog.recycler.RecycleEvent; +import com.eu.habbo.messages.incoming.catalog.recycler.ReloadRecyclerEvent; +import com.eu.habbo.messages.incoming.catalog.recycler.RequestRecyclerLogicEvent; +import com.eu.habbo.messages.incoming.floorplaneditor.FloorPlanEditorRequestBlockedTilesEvent; +import com.eu.habbo.messages.incoming.floorplaneditor.FloorPlanEditorRequestDoorSettingsEvent; +import com.eu.habbo.messages.incoming.floorplaneditor.FloorPlanEditorSaveEvent; +import com.eu.habbo.messages.incoming.friends.*; +import com.eu.habbo.messages.incoming.guilds.*; +import com.eu.habbo.messages.incoming.handshake.*; +import com.eu.habbo.messages.incoming.helper.RequestTalentTrackEvent; +import com.eu.habbo.messages.incoming.hotelview.HotelViewDataEvent; +import com.eu.habbo.messages.incoming.hotelview.HotelViewEvent; +import com.eu.habbo.messages.incoming.hotelview.HotelViewRequestBonusRareEvent; +import com.eu.habbo.messages.incoming.hotelview.RequestNewsListEvent; +import com.eu.habbo.messages.incoming.inventory.RequestInventoryBadgesEvent; +import com.eu.habbo.messages.incoming.inventory.RequestInventoryBotsEvent; +import com.eu.habbo.messages.incoming.inventory.RequestInventoryItemsEvent; +import com.eu.habbo.messages.incoming.inventory.RequestInventoryPetsEvent; +import com.eu.habbo.messages.incoming.modtool.*; +import com.eu.habbo.messages.incoming.navigator.*; +import com.eu.habbo.messages.incoming.polls.AnswerPollEvent; +import com.eu.habbo.messages.incoming.polls.CancelPollEvent; +import com.eu.habbo.messages.incoming.polls.GetPollDataEvent; +import com.eu.habbo.messages.incoming.rooms.*; +import com.eu.habbo.messages.incoming.rooms.bots.BotPickupEvent; +import com.eu.habbo.messages.incoming.rooms.bots.BotPlaceEvent; +import com.eu.habbo.messages.incoming.rooms.bots.BotSaveSettingsEvent; +import com.eu.habbo.messages.incoming.rooms.bots.BotSettingsEvent; +import com.eu.habbo.messages.incoming.rooms.items.*; +import com.eu.habbo.messages.incoming.rooms.items.jukebox.JukeBoxEventOne; +import com.eu.habbo.messages.incoming.rooms.items.jukebox.JukeBoxEventTwo; +import com.eu.habbo.messages.incoming.rooms.items.jukebox.JukeBoxRequestPlayListEvent; +import com.eu.habbo.messages.incoming.rooms.items.rentablespace.RentSpaceCancelEvent; +import com.eu.habbo.messages.incoming.rooms.items.rentablespace.RentSpaceEvent; +import com.eu.habbo.messages.incoming.rooms.pets.*; +import com.eu.habbo.messages.incoming.rooms.users.*; +import com.eu.habbo.messages.incoming.trading.*; +import com.eu.habbo.messages.incoming.unknown.RequestResolutionEvent; +import com.eu.habbo.messages.incoming.unknown.UnknownEvent1; +import com.eu.habbo.messages.incoming.users.*; +import com.eu.habbo.messages.incoming.wired.WiredConditionSaveDataEvent; +import com.eu.habbo.messages.incoming.wired.WiredEffectSaveDataEvent; +import com.eu.habbo.messages.incoming.wired.WiredTriggerSaveDataEvent; +import gnu.trove.map.hash.THashMap; + +public class PacketManager_1006 +{ + + private final THashMap> incoming; + + public PacketManager_1006() + { + this.incoming = new THashMap>(); + + this.registerCatalog(); + this.registerHandshake(); + this.registerFriends(); + this.registerNavigator(); + this.registerUsers(); + this.registerHotelview(); + this.registerInventory(); + this.registerRooms(); + this.registerPolls(); + this.registerUnknown(); + this.registerModTool(); + this.registerTrading(); + this.registerGuilds(); + this.registerPets(); + this.registerWired(); + this.registerAchievements(); + this.registerFloorPlanEditor(); + this.registerAmbassadors(); + } + + void registerHandler(Integer header, Class handler) + { + this.incoming.putIfAbsent(header, handler); + } + + public void handlePacket(GameClient client, ClientMessage packet) + { + if(client == null) + return; + + try + { + if(this.isRegistered(packet.getMessageId())) + { + if(Emulator.getConfig().getBoolean("debug.show.packets")) + Emulator.getLogging().logPacketLine("[CLIENT][" + packet.getMessageId() + "] => " + packet.getMessageBody()); + + MessageHandler handler = this.incoming.get(packet.getMessageId()).newInstance(); + + handler.client = client; + handler.packet = packet; + + handler.handle(); + + } + else + { + if(Emulator.getConfig().getBoolean("debug.show.packets")) + Emulator.getLogging().logPacketLine("[CLIENT][UNDEFINED][" + packet.getMessageId() + "] => " + packet.getMessageBody()); + } + } + catch(Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + boolean isRegistered(int header) + { + return this.incoming.containsKey(header); + } + + private void registerAmbassadors() + { + this.registerHandler(Incoming.AmbassadorAlertCommandEvent, AmbassadorAlertCommandEvent.class); + this.registerHandler(Incoming.AmbassadorVisitCommandEvent, AmbassadorVisitCommandEvent.class); + } + + private void registerCatalog() + { + this.registerHandler(Incoming.RequestRecylerLogicEvent, RequestRecyclerLogicEvent.class); + this.registerHandler(Incoming.RequestDiscountEvent, RequestDiscountEvent.class); + this.registerHandler(Incoming.RequestGiftConfigurationEvent, RequestGiftConfigurationEvent.class); + this.registerHandler(Incoming.GetMarketplaceConfigEvent, RequestMarketplaceConfigEvent.class); + this.registerHandler(Incoming.RequestCatalogModeEvent, RequestCatalogModeEvent.class); + this.registerHandler(Incoming.RequestCatalogIndexEvent, RequestCatalogIndexEvent.class); + this.registerHandler(Incoming.RequestCatalogPageEvent, RequestCatalogPageEvent.class); + this.registerHandler(Incoming.CatalogBuyItemAsGiftEvent, CatalogBuyItemAsGiftEvent.class); + this.registerHandler(Incoming.CatalogBuyItemEvent, CatalogBuyItemEvent.class); + this.registerHandler(Incoming.RedeemVoucherEvent, RedeemVoucherEvent.class); + this.registerHandler(Incoming.ReloadRecyclerEvent, ReloadRecyclerEvent.class); + this.registerHandler(Incoming.RecycleEvent, RecycleEvent.class); + this.registerHandler(Incoming.OpenRecycleBoxEvent, OpenRecycleBoxEvent.class); + this.registerHandler(Incoming.RequestOwnItemsEvent, RequestOwnItemsEvent.class); + this.registerHandler(Incoming.TakeBackItemEvent, TakeBackItemEvent.class); + this.registerHandler(Incoming.RequestOffersEvent, RequestOffersEvent.class); + this.registerHandler(Incoming.RequestItemInfoEvent, RequestItemInfoEvent.class); + this.registerHandler(Incoming.BuyItemEvent, BuyItemEvent.class); + this.registerHandler(Incoming.RequestSellItemEvent, RequestSellItemEvent.class); + this.registerHandler(Incoming.SellItemEvent, SellItemEvent.class); + this.registerHandler(Incoming.RequestCreditsEvent, RequestCreditsEvent.class); + this.registerHandler(Incoming.RequestPetBreedsEvent, RequestPetBreedsEvent.class); + this.registerHandler(Incoming.CheckPetNameEvent, CheckPetNameEvent.class); + this.registerHandler(Incoming.GetClubDataEvent, RequestClubDataEvent.class); + this.registerHandler(Incoming.RequestClubGiftsEvent, RequestClubGiftsEvent.class); + this.registerHandler(Incoming.CatalogSearchedItemEvent, CatalogSearchedItemEvent.class); + } + + private void registerHandshake() + { + this.registerHandler(Incoming.ReleaseVersionEvent, ReleaseVersionEvent.class); + this.registerHandler(Incoming.GenerateSecretKeyEvent, GenerateSecretKeyEvent.class); + this.registerHandler(Incoming.RequestBannerToken, RequestBannerToken.class); + this.registerHandler(Incoming.SecureLoginEvent, SecureLoginEvent.class); + this.registerHandler(Incoming.MachineIDEvent, MachineIDEvent.class); + this.registerHandler(Incoming.UsernameEvent, UsernameEvent.class); + this.registerHandler(Incoming.PingEvent, PingEvent.class); + } + + private void registerFriends() + { + this.registerHandler(Incoming.RequestFriendsEvent, RequestFriendsEvent.class); + this.registerHandler(Incoming.ChangeRelationEvent, ChangeRelationEvent.class); + this.registerHandler(Incoming.RemoveFriendEvent, RemoveFriendEvent.class); + this.registerHandler(Incoming.SearchUserEvent, SearchUserEvent.class); + this.registerHandler(Incoming.FriendRequestEvent, FriendRequestEvent.class); + this.registerHandler(Incoming.AcceptFriendRequest, AcceptFriendRequestEvent.class); + this.registerHandler(Incoming.FriendPrivateMessageEvent, FriendPrivateMessageEvent.class); + this.registerHandler(Incoming.RequestFriendRequestEvent, RequestFriendRequestsEvent.class); + this.registerHandler(Incoming.StalkFriendEvent, StalkFriendEvent.class); + this.registerHandler(Incoming.RequestInitFriendsEvent , RequestInitFriendsEvent.class); + this.registerHandler(Incoming.FindNewFriendsEvent, FindNewFriendsEvent.class); + this.registerHandler(Incoming.InviteFriendsEvent, InviteFriendsEvent.class); + } + + private void registerUsers() + { + this.registerHandler(Incoming.RequestUserDataEvent, RequestUserDataEvent.class); + this.registerHandler(Incoming.RequestUserCreditsEvent, RequestUserCreditsEvent.class); + this.registerHandler(Incoming.RequestUserClubEvent, RequestUserClubEvent.class); + this.registerHandler(Incoming.RequestMeMenuSettingsEvent, RequestMeMenuSettingsEvent.class); + this.registerHandler(Incoming.RequestUserCitizinShipEvent, RequestUserCitizinShipEvent.class); + this.registerHandler(Incoming.RequestUserProfileEvent, RequestUserProfileEvent.class); + this.registerHandler(Incoming.RequestProfileFriendsEvent, RequestProfileFriendsEvent.class); + this.registerHandler(Incoming.RequestUserWardrobeEvent, RequestUserWardrobeEvent.class); + this.registerHandler(Incoming.SaveWardrobeEvent, SaveWardrobeEvent.class); + this.registerHandler(Incoming.SaveMottoEvent, SaveMottoEvent.class); + this.registerHandler(Incoming.UserSaveLookEvent, UserSaveLookEvent.class); + this.registerHandler(Incoming.UserWearBadgeEvent, UserWearBadgeEvent.class); + this.registerHandler(Incoming.RequestWearingBadgesEvent, RequestWearingBadgesEvent.class); + this.registerHandler(Incoming.SaveUserVolumesEvent, SaveUserVolumesEvent.class); + this.registerHandler(Incoming.SaveBlockCameraFollowEvent, SaveBlockCameraFollowEvent.class); + this.registerHandler(Incoming.SaveIgnoreRoomInvitesEvent, SaveIgnoreRoomInvitesEvent.class); + this.registerHandler(Incoming.SavePreferOldChatEvent, SavePreferOldChatEvent.class); + } + + private void registerNavigator() + { + this.registerHandler(Incoming.RequestRoomCategoriesEvent, RequestRoomCategoriesEvent.class); + this.registerHandler(Incoming.RequestPublicRoomsEvent, RequestPublicRoomsEvent.class); + this.registerHandler(Incoming.RequestPopularRoomsEvent, RequestPopularRoomsEvent.class); + this.registerHandler(Incoming.RequestHighestScoreRoomsEvent, RequestHighestScoreRoomsEvent.class); + this.registerHandler(Incoming.RequestMyRoomsEvent, RequestMyRoomsEvent.class); + this.registerHandler(Incoming.RequestCanCreateRoomEvent, RequestCanCreateRoomEvent.class); + this.registerHandler(Incoming.RequestPromotedRoomsEvent, RequestPromotedRoomsEvent.class); + this.registerHandler(Incoming.RequestCreateRoomEvent, RequestCreateRoomEvent.class); + this.registerHandler(Incoming.RequestTagsEvent, RequestTagsEvent.class); + this.registerHandler(Incoming.SearchRoomsByTagEvent, SearchRoomsByTagEvent.class); + this.registerHandler(Incoming.SearchRoomsEvent, SearchRoomsEvent.class); + this.registerHandler(Incoming.SearchRoomsFriendsNowEvent, SearchRoomsFriendsNowEvent.class); + this.registerHandler(Incoming.SearchRoomsFriendsOwnEvent, SearchRoomsFriendsOwnEvent.class); + this.registerHandler(Incoming.SearchRoomsWithRightsEvent, SearchRoomsWithRightsEvent.class); + this.registerHandler(Incoming.SearchRoomsInGroupEvent, SearchRoomsInGroupEvent.class); + this.registerHandler(Incoming.SearchRoomsMyFavoriteEvent, SearchRoomsMyFavouriteEvent.class); + this.registerHandler(Incoming.SearchRoomsVisitedEvent, SearchRoomsVisitedEvent.class); + this.registerHandler(Incoming.RequestNewNavigatorDataEvent, RequestNewNavigatorDataEvent.class); + this.registerHandler(Incoming.RequestNewNavigatorRoomsEvent, RequestNewNavigatorRoomsEvent.class); + this.registerHandler(Incoming.NewNavigatorActionEvent, NewNavigatorActionEvent.class); + } + + private void registerHotelview() + { + this.registerHandler(Incoming.HotelViewEvent, HotelViewEvent.class); + this.registerHandler(Incoming.HotelViewRequestBonusRareEvent, HotelViewRequestBonusRareEvent.class); + this.registerHandler(Incoming.RequestNewsListEvent, RequestNewsListEvent.class); + this.registerHandler(Incoming.HotelViewDataEvent, HotelViewDataEvent.class); + } + + private void registerInventory() + { + this.registerHandler(Incoming.RequestInventoryBadgesEvent, RequestInventoryBadgesEvent.class); + this.registerHandler(Incoming.RequestInventoryBotsEvent, RequestInventoryBotsEvent.class); + this.registerHandler(Incoming.RequestInventoryItemsEvent, RequestInventoryItemsEvent.class); + this.registerHandler(Incoming.RequestInventoryPetsEvent, RequestInventoryPetsEvent.class); + } + + void registerRooms() + { + this.registerHandler(Incoming.RequestRoomLoadEvent, RequestRoomLoadEvent.class); + this.registerHandler(Incoming.RequestHeightmapEvent, RequestRoomHeightmapEvent.class); + this.registerHandler(Incoming.RequestRoomHeightmapEvent, RequestRoomHeightmapEvent.class); + this.registerHandler(Incoming.RoomVoteEvent, RoomVoteEvent.class); + this.registerHandler(Incoming.RequestRoomDataEvent, RequestRoomDataEvent.class); + this.registerHandler(Incoming.RoomSettingsSaveEvent, RoomSettingsSaveEvent.class); + this.registerHandler(Incoming.RoomPlaceItemEvent, RoomPlaceItemEvent.class); + this.registerHandler(Incoming.RotateMoveItemEvent, RotateMoveItemEvent.class); + this.registerHandler(Incoming.MoveWallItemEvent, MoveWallItemEvent.class); + this.registerHandler(Incoming.RoomPickupItemEvent, RoomPickupItemEvent.class); + this.registerHandler(Incoming.RoomPlacePaintEvent, RoomPlacePaintEvent.class); + this.registerHandler(Incoming.RoomUserStartTypingEvent, RoomUserStartTypingEvent.class); + this.registerHandler(Incoming.RoomUserStopTypingEvent, RoomUserStopTypingEvent.class); + this.registerHandler(Incoming.ToggleFloorItemEvent, ToggleFloorItemEvent.class); + this.registerHandler(Incoming.ToggleWallItemEvent, ToggleWallItemEvent.class); + this.registerHandler(Incoming.RoomBackgroundEvent, RoomBackgroundEvent.class); + this.registerHandler(Incoming.MannequinSaveNameEvent, MannequinSaveNameEvent.class); + this.registerHandler(Incoming.MannequinSaveLookEvent, MannequinSaveLookEvent.class); + this.registerHandler(Incoming.AdvertisingSaveEvent, AdvertisingSaveEvent.class); + this.registerHandler(Incoming.RequestRoomSettingsEvent, RequestRoomSettingsEvent.class); + this.registerHandler(Incoming.MoodLightSettingsEvent, MoodLightSettingsEvent.class); + this.registerHandler(Incoming.MoodLightTurnOnEvent, MoodLightTurnOnEvent.class); + this.registerHandler(Incoming.RoomUserDropHandItemEvent, RoomUserDropHandItemEvent.class); + this.registerHandler(Incoming.RoomUserLookAtPoint, RoomUserLookAtPoint.class); + this.registerHandler(Incoming.RoomUserTalkEvent, RoomUserTalkEvent.class); + this.registerHandler(Incoming.RoomUserShoutEvent, RoomUserShoutEvent.class); + this.registerHandler(Incoming.RoomUserWhisperEvent, RoomUserWhisperEvent.class); + this.registerHandler(Incoming.RoomUserActionEvent, RoomUserActionEvent.class); + this.registerHandler(Incoming.RoomUserSitEvent, RoomUserSitEvent.class); + this.registerHandler(Incoming.RoomUserDanceEvent, RoomUserDanceEvent.class); + this.registerHandler(Incoming.RoomUserSignEvent, RoomUserSignEvent.class); + this.registerHandler(Incoming.RoomUserWalkEvent, RoomUserWalkEvent.class); + this.registerHandler(Incoming.RoomUserGiveRespectEvent, RoomUserGiveRespectEvent.class); + this.registerHandler(Incoming.RoomUserGiveRightsEvent, RoomUserGiveRightsEvent.class); + this.registerHandler(Incoming.RequestRoomRightsEvent, RequestRoomRightsEvent.class); + this.registerHandler(Incoming.RoomRemoveAllRightsEvent, RoomRemoveAllRightsEvent.class); + this.registerHandler(Incoming.RoomUserRemoveRightsEvent, RoomUserRemoveRightsEvent.class); + this.registerHandler(Incoming.BotPlaceEvent, BotPlaceEvent.class); + this.registerHandler(Incoming.BotPickupEvent, BotPickupEvent.class); + this.registerHandler(Incoming.BotSaveSettingsEvent, BotSaveSettingsEvent.class); + this.registerHandler(Incoming.BotSettingsEvent, BotSettingsEvent.class); + this.registerHandler(Incoming.TriggerDiceEvent, TriggerDiceEvent.class); + this.registerHandler(Incoming.CloseDiceEvent, CloseDiceEvent.class); + this.registerHandler(Incoming.TriggerColorWheelEvent, TriggerColorWheelEvent.class); + this.registerHandler(Incoming.RedeemItemEvent, RedeemItemEvent.class); + this.registerHandler(Incoming.PetPlaceEvent, PetPlaceEvent.class); + this.registerHandler(Incoming.RoomUserKickEvent, RoomUserKickEvent.class); + this.registerHandler(Incoming.SetStackHelperHeightEvent, SetStackHelperHeightEvent.class); + this.registerHandler(Incoming.TriggerOneWayGateEvent, TriggerOneWayGateEvent.class); + this.registerHandler(Incoming.HandleDoorbellEvent, HandleDoorbellEvent.class); + this.registerHandler(Incoming.RedeemClothingEvent, RedeemClothingEvent.class); + this.registerHandler(Incoming.PostItPlaceEvent, PostItPlaceEvent.class); + this.registerHandler(Incoming.PostItRequestDataEvent, PostItRequestDataEvent.class); + this.registerHandler(Incoming.PostItSaveDataEvent, PostItSaveDataEvent.class); + this.registerHandler(Incoming.PostItDeleteEvent, PostItDeleteEvent.class); + this.registerHandler(Incoming.MoodLightSaveSettingsEvent, MoodLightSaveSettingsEvent.class); + this.registerHandler(Incoming.RentSpaceEvent, RentSpaceEvent.class); + this.registerHandler(Incoming.RentSpaceCancelEvent, RentSpaceCancelEvent.class); + this.registerHandler(Incoming.SetHomeRoomEvent, SetHomeRoomEvent.class); + this.registerHandler(Incoming.RoomUserGiveHandItemEvent, RoomUserGiveHandItemEvent.class); + this.registerHandler(Incoming.RoomMuteEvent, RoomMuteEvent.class); + this.registerHandler(Incoming.RequestRoomWordFilterEvent, RequestRoomWordFilterEvent.class); + this.registerHandler(Incoming.RoomWordFilterModifyEvent, RoomWordFilterModifyEvent.class); + this.registerHandler(Incoming.RoomStaffPickEvent, RoomStaffPickEvent.class); + this.registerHandler(Incoming.RoomRequestBannedUsersEvent, RoomRequestBannedUsersEvent.class); + this.registerHandler(Incoming.JukeBoxRequestTrackCodeEvent, JukeBoxRequestTrackCodeEvent.class); + this.registerHandler(Incoming.JukeBoxRequestTrackDataEvent, JukeBoxRequestTrackDataEvent.class); + this.registerHandler(Incoming.JukeBoxRequestPlayListEvent, JukeBoxRequestPlayListEvent.class); + this.registerHandler(Incoming.JukeBoxEventOne, JukeBoxEventOne.class); + this.registerHandler(Incoming.JukeBoxEventTwo, JukeBoxEventTwo.class); + } + + void registerPolls() + { + this.registerHandler(Incoming.CancelPollEvent, CancelPollEvent.class); + this.registerHandler(Incoming.GetPollDataEvent, GetPollDataEvent.class); + this.registerHandler(Incoming.AnswerPollEvent, AnswerPollEvent.class); + } + + void registerModTool() + { + this.registerHandler(Incoming.ModToolRequestRoomInfoEvent, ModToolRequestRoomInfoEvent.class); + this.registerHandler(Incoming.ModToolRequestRoomChatlogEvent, ModToolRequestRoomChatlogEvent.class); + this.registerHandler(Incoming.ModToolRequestUserInfoEvent, ModToolRequestUserInfoEvent.class); + this.registerHandler(Incoming.ModToolPickTicketEvent, ModToolPickTicketEvent.class); + this.registerHandler(Incoming.ModToolCloseTicketEvent, ModToolCloseTicketEvent.class); + this.registerHandler(Incoming.ModToolReleaseTicketEvent, ModToolReleaseTicketEvent.class); + this.registerHandler(Incoming.ModToolAlertEvent, ModToolAlertEvent.class); + this.registerHandler(Incoming.ModToolWarnEvent, ModToolAlertEvent.class); + this.registerHandler(Incoming.ModToolKickEvent, ModToolKickEvent.class); + this.registerHandler(Incoming.ModToolRoomAlertEvent, ModToolRoomAlertEvent.class); + this.registerHandler(Incoming.ModToolRequestUserChatlogEvent, ModToolRequestUserChatlogEvent.class); + this.registerHandler(Incoming.ModToolChangeRoomSettingsEvent, ModToolChangeRoomSettingsEvent.class); + this.registerHandler(Incoming.ModToolRequestRoomVisitsEvent, ModToolRequestRoomVisitsEvent.class); + this.registerHandler(Incoming.ModToolRequestIssueChatlogEvent, ModToolRequestIssueChatlogEvent.class); + this.registerHandler(Incoming.ModToolRequestRoomUserChatlogEvent, ModToolRequestRoomUserChatlogEvent.class); + + this.registerHandler(Incoming.RequestReportRoomEvent, RequestReportRoomEvent.class); + this.registerHandler(Incoming.ReportEvent, ReportEvent.class); + } + + void registerTrading() + { + this.registerHandler(Incoming.TradeStartEvent, TradeStartEvent.class); + this.registerHandler(Incoming.TradeOfferItemEvent, TradeOfferItemEvent.class); + this.registerHandler(Incoming.TradeCancelOfferItemEvent, TradeCancelOfferItemEvent.class); + this.registerHandler(Incoming.TradeAcceptEvent, TradeAcceptEvent.class); + this.registerHandler(Incoming.TradeUnAcceptEvent, TradeUnAcceptEvent.class); + this.registerHandler(Incoming.TradeConfirmEvent, TradeConfirmEvent.class); + this.registerHandler(Incoming.TradeCloseEvent, TradeCloseEvent.class); + } + + void registerGuilds() + { + this.registerHandler(Incoming.RequestGuildBuyRoomsEvent, RequestGuildBuyRoomsEvent.class); + this.registerHandler(Incoming.RequestGuildPartsEvent, RequestGuildPartsEvent.class); + this.registerHandler(Incoming.RequestGuildBuyEvent, RequestGuildBuyEvent.class); + this.registerHandler(Incoming.RequestGuildInfoEvent, RequestGuildInfoEvent.class); + this.registerHandler(Incoming.RequestGuildManageEvent, RequestGuildManageEvent.class); + this.registerHandler(Incoming.RequestGuildMembersEvent, RequestGuildMembersEvent.class); + this.registerHandler(Incoming.RequestGuildJoinEvent, RequestGuildJoinEvent.class); + this.registerHandler(Incoming.GuildChangeNameDescEvent, GuildChangeNameDescEvent.class); + this.registerHandler(Incoming.GuildChangeBadgeEvent, GuildChangeBadgeEvent.class); + this.registerHandler(Incoming.GuildChangeColorsEvent, GuildChangeColorsEvent.class); + this.registerHandler(Incoming.GuildRemoveAdminEvent, GuildRemoveAdminEvent.class); + this.registerHandler(Incoming.GuildRemoveMemberEvent, GuildRemoveMemberEvent.class); + this.registerHandler(Incoming.GuildChangeSettingsEvent, GuildChangeSettingsEvent.class); + this.registerHandler(Incoming.GuildAcceptMembershipEvent, GuildAcceptMembershipEvent.class); + this.registerHandler(Incoming.GuildDeclineMembershipEvent, GuildDeclineMembershipEvent.class); + this.registerHandler(Incoming.GuildSetAdminEvent, GuildSetAdminEvent.class); + this.registerHandler(Incoming.GuildSetFavoriteEvent, GuildSetFavoriteEvent.class); + this.registerHandler(Incoming.RequestOwnGuildsEvent, RequestOwnGuildsEvent.class); + this.registerHandler(Incoming.RequestGuildFurniWidgetEvent, RequestGuildFurniWidgetEvent.class); + this.registerHandler(Incoming.GuildConfirmRemoveMemberEvent, GuildConfirmRemoveMemberEvent.class); + //this.registerHandler(Incoming.GuildRemoveFavoriteEvent, GuildRemoveFavoriteEvent.class); + this.registerHandler(Incoming.GuildDeleteEvent, GuildDeleteEvent.class); + } + + void registerPets() + { + this.registerHandler(Incoming.RequestPetInformationEvent, RequestPetInformationEvent.class); + this.registerHandler(Incoming.PetPickupEvent, PetPickupEvent.class); + this.registerHandler(Incoming.ScratchPetEvent, ScratchPetEvent.class); + this.registerHandler(Incoming.RequestPetTrainingPanelEvent, RequestPetTrainingPanelEvent.class); + this.registerHandler(Incoming.HorseUseItemEvent, HorseUseItemEvent.class); + this.registerHandler(Incoming.HorseRideSettingsEvent, HorseRideSettingsEvent.class); + this.registerHandler(Incoming.HorseRideEvent, HorseRideEvent.class); + } + + void registerWired() + { + this.registerHandler(Incoming.WiredTriggerSaveDataEvent, WiredTriggerSaveDataEvent.class); + this.registerHandler(Incoming.WiredEffectSaveDataEvent, WiredEffectSaveDataEvent.class); + this.registerHandler(Incoming.WiredConditionSaveDataEvent, WiredConditionSaveDataEvent.class); + } + + void registerUnknown() + { + this.registerHandler(Incoming.RequestResolutionEvent, RequestResolutionEvent.class); + this.registerHandler(Incoming.RequestTalenTrackEvent, RequestTalentTrackEvent.class); //TODO + this.registerHandler(Incoming.UnknownEvent1, UnknownEvent1.class); + } + + void registerFloorPlanEditor() + { + this.registerHandler(Incoming.FloorPlanEditorSaveEvent, FloorPlanEditorSaveEvent.class); + this.registerHandler(Incoming.FloorPlanEditorRequestBlockedTilesEvent, FloorPlanEditorRequestBlockedTilesEvent.class); + this.registerHandler(Incoming.FloorPlanEditorRequestDoorSettingsEvent, FloorPlanEditorRequestDoorSettingsEvent.class); + } + + void registerAchievements() + { + this.registerHandler(Incoming.RequestAchievementsEvent, RequestAchievementsEvent.class); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/ServerMessage.java b/src/main/java/com/eu/habbo/messages/ServerMessage.java new file mode 100644 index 00000000..5b4cc06f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/ServerMessage.java @@ -0,0 +1,272 @@ +package com.eu.habbo.messages; + +import com.eu.habbo.Emulator; + +import java.io.IOException; +import java.nio.charset.Charset; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.buffer.Unpooled; + +public class ServerMessage +{ + private int header; + private ByteBufOutputStream stream; + private ByteBuf channelBuffer; + + public ServerMessage() {} + + public ServerMessage(int header) + { + this.header = header; + this.channelBuffer = Unpooled.buffer(); + this.stream = new ByteBufOutputStream(this.channelBuffer); + try + { + this.stream.writeInt(0); + this.stream.writeShort(header); + } + catch (Exception e) + { + Emulator.getLogging().handleException(e); + } + } + + public ServerMessage init(int id) + { + this.header = id; + this.channelBuffer = Unpooled.buffer(); + this.stream = new ByteBufOutputStream(this.channelBuffer); + + try + { + this.stream.writeInt(0); + this.stream.writeShort(id); + } + catch (Exception e) + { + Emulator.getLogging().handleException(e); + } + return this; + } + + public void appendRawBytes(byte[] bytes) + { + try + { + this.stream.write(bytes); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendString(String obj) + { + if (obj == null) + { + this.appendString(""); + return; + } + + try + { + byte[] data = obj.getBytes(); + this.stream.writeShort(data.length); + this.stream.write(data); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendChar(int obj) + { + try + { + this.stream.writeChar(obj); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendChars(Object obj) + { + try + { + this.stream.writeChars(obj.toString()); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + @Deprecated + public void appendInt32(Integer obj) + { + try + { + this.stream.writeInt(obj.intValue()); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendInt(Integer obj) + { + try + { + this.stream.writeInt(obj.intValue()); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendInt32(Short obj) + { + this.appendShort(0); + this.appendShort(obj); + } + + public void appendInt32(Byte obj) + { + try + { + this.stream.writeInt((int) obj); + } + catch (IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendInt32(Boolean obj) + { + try + { + this.stream.writeInt(obj ? 1 : 0); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendShort(int obj) + { + try + { + this.stream.writeShort((short) obj); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendByte(Integer b) + { + try + { + this.stream.writeByte(b.intValue()); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendBoolean(Boolean obj) + { + try + { + this.stream.writeBoolean(obj.booleanValue()); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendDouble(double d) + { + try + { + this.stream.writeDouble(d); + } + catch (IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public void appendDouble(Double obj) + { + try + { + this.stream.writeDouble(obj.doubleValue()); + } + catch (IOException e) + { + Emulator.getLogging().logPacketError(e); + } + } + + public ServerMessage appendResponse(ServerMessage obj) + { + try + { + this.stream.write(obj.get().array()); + } + catch(IOException e) + { + Emulator.getLogging().logPacketError(e); + } + + return this; + } + + public void append(ISerialize obj) + { + obj.serialize(this); + } + + public String getBodyString() + { + ByteBuf buffer = this.stream.buffer().duplicate(); + + buffer.setInt(0, buffer.writerIndex() - 4); + + String consoleText = buffer.toString(Charset.forName("UTF-8")); + + for (int i = 0; i < 14; i++) { + consoleText = consoleText.replace(Character.toString((char)i), "[" + i + "]"); + } + + buffer.discardSomeReadBytes(); + + return consoleText; + } + + public int getHeader() + { + return this.header; + } + + public ByteBuf get() + { + this.channelBuffer.setInt(0, this.channelBuffer.writerIndex() - 4); + + return this.channelBuffer.copy(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/Incoming.java b/src/main/java/com/eu/habbo/messages/incoming/Incoming.java new file mode 100644 index 00000000..f2378928 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/Incoming.java @@ -0,0 +1,369 @@ +package com.eu.habbo.messages.incoming; + +public class Incoming +{ + public static final int ChangeNameCheckUsernameEvent = 3950; + public static final int ConfirmChangeNameEvent = 2977; + public static final int ActivateEffectEvent = 2959; + public static final int EnableEffectEvent = 1752; + public static final int UserActivityEvent = 3457; + public static final int NavigatorCategoryListModeEvent = 1202; + public static final int NavigatorCollapseCategoryEvent = 1834; + public static final int NavigatorUncollapseCategoryEvent = 637; + public static final int PickNewUserGiftEvent = 1822; + public static final int FootballGateSaveLookEvent = 924; // PRODUCTION-201611291003-338511768 + public static final int MannequinSaveLookEvent = 2209; // PRODUCTION-201611291003-338511768 + public static final int RequestCatalogPageEvent = 412; //PRODUCTION-201611291003-338511768 + public static final int RequestWearingBadgesEvent = 2091; // PRODUCTION-201611291003-338511768 + public static final int BotPickupEvent = 3323; // PRODUCTION-201611291003-338511768 + public static final int HorseRideEvent = 1036; // PRODUCTION-201611291003-338511768 + public static final int RequestCreateRoomEvent = 2752; // PRODUCTION-201611291003-338511768 + public static final int SaveMottoEvent = 2228; // PRODUCTION-201611291003-338511768 + public static final int GenerateSecretKeyEvent = -1;//3575 + public static final int ModToolAlertEvent = 1840; // PRODUCTION-201611291003-338511768 + public static final int TradeAcceptEvent = 3863; // PRODUCTION-201611291003-338511768 + public static final int RequestCatalogModeEvent = 1195; // PRODUCTION-201611291003-338511768 + public static final int RequestUserCreditsEvent = 273; // PRODUCTION-201611291003-338511768 + public static final int FriendPrivateMessageEvent = 3567; // PRODUCTION-201611291003-338511768 + public static final int CloseDiceEvent = 1533; // PRODUCTION-201611291003-338511768 + public static final int RoomUserRemoveRightsEvent = 2064; // PRODUCTION-201611291003-338511768 + public static final int RoomRemoveRightsEvent = 3182; // PRODUCTION-201611291003-338511768 + public static final int GuildDeclineMembershipEvent = 1894; // PRODUCTION-201611291003-338511768 + public static final int AnswerPollEvent = 3505; // PRODUCTION-201611291003-338511768 + public static final int UserWearBadgeEvent = 644; // PRODUCTION-201611291003-338511768 + public static final int RoomVoteEvent = 3582; // PRODUCTION-201611291003-338511768 + public static final int RoomUserSignEvent = 1975; // PRODUCTION-201611291003-338511768 + public static final int RequestUserDataEvent = 357; // PRODUCTION-201611291003-338511768 + public static final int RoomUserShoutEvent = 2085; // PRODUCTION-201611291003-338511768 + public static final int ScratchPetEvent = 3202; // PRODUCTION-201611291003-338511768 + public static final int RoomUserWalkEvent = 3320; // PRODUCTION-201611291003-338511768 + public static final int RequestUserTagsEvent = 17; // PRODUCTION-201611291003-338511768 + public static final int RequestTagsEvent = 826; // PRODUCTION-201611291003-338511768 + public static final int GetMarketplaceConfigEvent = 2597; // PRODUCTION-201611291003-338511768 + public static final int RequestHeightmapEvent = 3898; // PRODUCTION-201611291003-338511768 + public static final int TradeCloseEvent = 2551; // PRODUCTION-201611291003-338511768 + public static final int CatalogBuyItemEvent = 3492; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildMembersEvent = 312; // PRODUCTION-201611291003-338511768 + public static final int RequestPetInformationEvent = 2934; // PRODUCTION-201611291003-338511768 + public static final int RoomUserWhisperEvent = 1543; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestUserInfoEvent = 3295; // PRODUCTION-201611291003-338511768 + public static final int RotateMoveItemEvent = 248; // PRODUCTION-201611291003-338511768 + public static final int CancelPollEvent = 1773; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomLoadEvent = 2312; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildPartsEvent = 813; // PRODUCTION-201611291003-338511768 + public static final int RoomPlacePaintEvent = 711; // PRODUCTION-201611291003-338511768 + public static final int RequestPopularRoomsEvent = 2758; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestRoomInfoEvent = 707; // PRODUCTION-201611291003-338511768 + public static final int FriendRequestEvent = 3157; // PRODUCTION-201611291003-338511768 + public static final int RecycleEvent = 2771; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomCategoriesEvent = 3027; //1371; // PRODUCTION-201611291003-338511768 + public static final int ToggleWallItemEvent = 210; // PRODUCTION-201611291003-338511768 + public static final int RoomUserTalkEvent = 1314; // PRODUCTION-201611291003-338511768 + public static final int HotelViewDataEvent = 2912; // PRODUCTION-201611291003-338511768 + public static final int RoomUserDanceEvent = 2080; // PRODUCTION-201611291003-338511768 + public static final int RequestUserProfileEvent = 3265; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsFriendsNowEvent = 1786; // PRODUCTION-201611291003-338511768 + public static final int SetStackHelperHeightEvent = 3839; // PRODUCTION-201611291003-338511768 + public static final int RedeemVoucherEvent = 339; // PRODUCTION-201611291003-338511768 + public static final int HorseUseItemEvent = 1328; // PRODUCTION-201611291003-338511768 + public static final int BuyItemEvent = 1603; // PRODUCTION-201611291003-338511768 + public static final int AdvertisingSaveEvent = 3608; // PRODUCTION-201611291003-338511768 + public static final int RequestPetTrainingPanelEvent = 2161; // PRODUCTION-201611291003-338511768 + public static final int RoomBackgroundEvent = 2880; // PRODUCTION-201611291003-338511768 + public static final int RequestNewsListEvent = 1827; // PRODUCTION-201611291003-338511768 + public static final int RequestPromotedRoomsEvent = 2908; // PRODUCTION-201611291003-338511768 + public static final int GuildSetAdminEvent = 2894; // PRODUCTION-201611291003-338511768 + public static final int GetClubDataEvent = 3285; // PRODUCTION-201611291003-338511768 + public static final int RequestMeMenuSettingsEvent = 2388; // PRODUCTION-201611291003-338511768 + public static final int MannequinSaveNameEvent = 2850; // PRODUCTION-201611291003-338511768 + public static final int SellItemEvent = 3447; // PRODUCTION-201611291003-338511768 + public static final int GuildAcceptMembershipEvent = 3386; // PRODUCTION-201611291003-338511768 + public static final int RequestBannerToken = -1;//2619 + public static final int RequestRecylerLogicEvent = 398; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildJoinEvent = 998; // PRODUCTION-201611291003-338511768 + public static final int RequestCatalogIndexEvent = 2529; // PRODUCTION-201611291003-338511768 + public static final int RequestInventoryPetsEvent = 3095; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestRoomVisitsEvent = 3526; // PRODUCTION-201611291003-338511768 + public static final int ModToolWarnEvent = -1;//3763 + public static final int RequestItemInfoEvent = 3288; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestRoomChatlogEvent = 2587; // PRODUCTION-201611291003-338511768 + public static final int UserSaveLookEvent = 2730; // PRODUCTION-201611291003-338511768 + public static final int ToggleFloorItemEvent = 99; // PRODUCTION-201611291003-338511768 + public static final int TradeUnAcceptEvent = 1444; // PRODUCTION-201611291003-338511768 + public static final int WiredTriggerSaveDataEvent = 1520; // PRODUCTION-201611291003-338511768 + public static final int RoomRemoveAllRightsEvent = 2683; // PRODUCTION-201611291003-338511768 + public static final int TakeBackItemEvent = 434; // PRODUCTION-201611291003-338511768 + public static final int OpenRecycleBoxEvent = 3558; // PRODUCTION-201611291003-338511768 + public static final int GuildChangeNameDescEvent = 3137; // PRODUCTION-201611291003-338511768 + public static final int RequestSellItemEvent = 848; // PRODUCTION-201611291003-338511768 + public static final int ModToolChangeRoomSettingsEvent = 3260; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestUserChatlogEvent = 1391;//203 + public static final int GuildChangeSettingsEvent = 3435; // PRODUCTION-201611291003-338511768 + public static final int RoomUserDropHandItemEvent = 2814; // PRODUCTION-201611291003-338511768 + public static final int RequestProfileFriendsEvent = 2138; // TODO!!! + public static final int TradeCancelOfferItemEvent = 3845; // PRODUCTION-201611291003-338511768 + public static final int TriggerDiceEvent = 1990; // PRODUCTION-201611291003-338511768 + public static final int GetPollDataEvent = 109; // PRODUCTION-201611291003-338511768 + public static final int MachineIDEvent = 2490; // PRODUCTION-201611291003-338511768 + public static final int RequestDiscountEvent = 223; // PRODUCTION-201611291003-338511768 + public static final int RequestFriendRequestEvent = 2448; // PRODUCTION-201611291003-338511768 + public static final int RoomSettingsSaveEvent = 1969; // PRODUCTION-201611291003-338511768 + public static final int AcceptFriendRequest = 137; // PRODUCTION-201611291003-338511768 + public static final int DeclineFriendRequest = 2890; //835; //TODO + public static final int ReleaseVersionEvent = 4000;//4000 + public static final int SearchRoomsMyFavoriteEvent = 2578; // PRODUCTION-201611291003-338511768 + public static final int TradeStartEvent = 1481; // PRODUCTION-201611291003-338511768 + public static final int RequestTargetOfferEvent = 2487; // PRODUCTION-201611291003-338511768 + public static final int ClientActionsMessageEvent = 3457; // PRODUCTION-201611291003-338511768 + public static final int UknownMessageEventSomethingSomething = 1827; // PRODUCTION-201611291003-338511768 + public static final int ChangeRelationEvent = 3768; // PRODUCTION-201611291003-338511768 + public static final int RoomUserSitEvent = 2235; // PRODUCTION-201611291003-338511768 + public static final int RequestCanCreateRoomEvent = 2128; // PRODUCTION-201611291003-338511768 + public static final int ModToolKickEvent = 2582; // PRODUCTION-201611291003-338511768 + public static final int MoveWallItemEvent = 168; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsEvent = 3943; // PRODUCTION-201611291003-338511768 + public static final int RequestHighestScoreRoomsEvent = 2939; // PRODUCTION-201611291003-338511768 + public static final int CatalogBuyItemAsGiftEvent = 1411; // PRODUCTION-201611291003-338511768 + public static final int RoomUserGiveRespectEvent = 2694; // PRODUCTION-201611291003-338511768 + public static final int RemoveFriendEvent = 1689; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsFriendsOwnEvent = 2266; // PRODUCTION-201611291003-338511768 + public static final int GuildSetFavoriteEvent = 3549; // PRODUCTION-201611291003-338511768 + public static final int PetPlaceEvent = 2647; // PRODUCTION-201611291003-338511768 + public static final int BotSettingsEvent = 1986; // PRODUCTION-201611291003-338511768 + public static final int StalkFriendEvent = 3997; // PRODUCTION-201611291003-338511768 + public static final int RoomPickupItemEvent = 3456; // PRODUCTION-201611291003-338511768 + public static final int RedeemItemEvent = 3115; // PRODUCTION-201611291003-338511768 + public static final int RequestFriendsEvent = 1523; // PRODUCTION-201611291003-338511768 + public static final int RequestAchievementsEvent = 219; // PRODUCTION-201611291003-338511768 + public static final int GuildChangeColorsEvent = 1764; // PRODUCTION-201611291003-338511768 + public static final int RequestInventoryBadgesEvent = 2769; // PRODUCTION-201611291003-338511768 + public static final int TestInventoryEvent = 3500; // PRODUCTION-201611291003-338511768 + public static final int RequestPetBreedsEvent = 1756; // PRODUCTION-201611291003-338511768 + public static final int GuildChangeBadgeEvent = 1991; // PRODUCTION-201611291003-338511768 + public static final int ModToolBanEvent = -1; // PRODUCTION-201611291003-338511768 + public static final int SaveWardrobeEvent = 800; // PRODUCTION-201611291003-338511768 + public static final int HotelViewEvent = 105; // PRODUCTION-201611291003-338511768 + public static final int ModToolPickTicketEvent = 15; // PRODUCTION-201611291003-3385117681572; + public static final int ModToolReleaseTicketEvent = 1572; // PRODUCTION-201611291003-338511768 + public static final int ModToolCloseTicketEvent = 2067; // PRODUCTION-201611291003-338511768 + public static final int TriggerColorWheelEvent = 2144; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsByTagEvent = -1;//1956 + public static final int RequestPublicRoomsEvent = 1229; // PRODUCTION-201611291003-338511768 + public static final int RequestResolutionEvent = 359; // PRODUCTION-201611291003-338511768 + public static final int RequestInventoryItemsEvent = 3150; // PRODUCTION-201611291003-338511768 + public static final int ModToolRoomAlertEvent = 3842; // PRODUCTION-201611291003-338511768 + public static final int WiredEffectSaveDataEvent = 2281; // PRODUCTION-201611291003-338511768 + public static final int CheckPetNameEvent = 2109; // PRODUCTION-201611291003-338511768 + public static final int SecureLoginEvent = 2419; // PRODUCTION-201611291003-338511768 + public static final int BotSaveSettingsEvent = 2624; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildBuyEvent = 230; // PRODUCTION-201611291003-338511768 + public static final int SearchUserEvent = 1210; // PRODUCTION-201611291003-338511768 + public static final int GuildConfirmRemoveMemberEvent = 3593; // PRODUCTION-201611291003-338511768 + public static final int GuildRemoveMemberEvent = 593; // PRODUCTION-201611291003-338511768 + public static final int WiredConditionSaveDataEvent = 3203; // PRODUCTION-201611291003-338511768 + public static final int RoomUserLookAtPoint = 3301; // PRODUCTION-201611291003-338511768 + public static final int MoodLightTurnOnEvent = 2296; // PRODUCTION-201611291003-338511768 + public static final int MoodLightSettingsEvent = 2813; // PRODUCTION-201611291003-338511768 + public static final int RequestMyRoomsEvent = 2277; // PRODUCTION-201611291003-338511768 + public static final int RequestCreditsEvent = 2650; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsInGroupEvent = 39; // PRODUCTION-201611291003-338511768 + public static final int HorseRideSettingsEvent = 1472; // PRODUCTION-201611291003-338511768 + public static final int HandleDoorbellEvent = 1644; // PRODUCTION-201611291003-338511768 + public static final int RoomUserKickEvent = 1320; // PRODUCTION-201611291003-338511768 + public static final int RoomPlaceItemEvent = 1258; // PRODUCTION-201611291003-338511768 + public static final int RequestInventoryBotsEvent = 3848; // PRODUCTION-201611291003-338511768 + public static final int RequestUserWardrobeEvent = 2742; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomRightsEvent = 3385; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildBuyRoomsEvent = 798; // PRODUCTION-201611291003-338511768 + public static final int BotPlaceEvent = 1592; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsWithRightsEvent = 272; // PRODUCTION-201611291003-338511768 + public static final int HotelViewRequestBonusRareEvent = 957; // PRODUCTION-201611291003-338511768 + public static final int GuildRemoveAdminEvent = 722; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomSettingsEvent = 3129; // PRODUCTION-201611291003-338511768 + public static final int RequestOffersEvent = 2407; // PRODUCTION-201611291003-338511768 + public static final int RequestUserCitizinShipEvent = 2127; // PRODUCTION-201611291003-338511768 + public static final int RoomUserStopTypingEvent = 1474; // PRODUCTION-201611291003-338511768 + public static final int RoomUserStartTypingEvent = 1597; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildManageEvent = 1004; // PRODUCTION-201611291003-338511768 + public static final int RequestUserClubEvent = 3166; // PRODUCTION-201611291003-338511768 + public static final int PetPickupEvent = 1581; // PRODUCTION-201611291003-338511768 + public static final int RequestOwnGuildsEvent = 367; // PRODUCTION-201611291003-338511768 + public static final int SearchRoomsVisitedEvent = 2264; // PRODUCTION-201611291003-338511768 + public static final int TradeOfferItemEvent = 3107; // PRODUCTION-201611291003-338511768 + public static final int TradeOfferMultipleItemsEvent = 1263; // PRODUCTION-201611291003-338511768 + public static final int TradeConfirmEvent = 2760; // PRODUCTION-201611291003-338511768 + public static final int RoomUserGiveRightsEvent = 808; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildInfoEvent = 2991; // PRODUCTION-201611291003-338511768 + public static final int ReloadRecyclerEvent = 1342; // PRODUCTION-201611291003-338511768 + public static final int RoomUserActionEvent = 2456; // PRODUCTION-201611291003-338511768 + public static final int RequestGiftConfigurationEvent = 418; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomDataEvent = 2230; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomHeightmapEvent = 2300; // PRODUCTION-201611291003-338511768 + public static final int RequestGuildFurniWidgetEvent = 2651; // PRODUCTION-201611291003-338511768 + public static final int RequestOwnItemsEvent = 2105; // PRODUCTION-201611291003-338511768 + public static final int RequestReportRoomEvent = 3267; // PRODUCTION-201611291003-338511768 + public static final int ReportEvent = 1691; // PRODUCTION-201611291003-338511768 + public static final int TriggerOneWayGateEvent = 2765; // PRODUCTION-201611291003-338511768 + public static final int FloorPlanEditorSaveEvent = 875; // PRODUCTION-201611291003-338511768 + public static final int FloorPlanEditorRequestDoorSettingsEvent = 3559; // PRODUCTION-201611291003-338511768 + public static final int FloorPlanEditorRequestBlockedTilesEvent = 1687; // PRODUCTION-201611291003-338511768 + public static final int UnknownEvent1 = 1371; // PRODUCTION-201611291003-338511768 + public static final int RequestTalenTrackEvent = 196; // PRODUCTION-201611291003-338511768 + public static final int RequestNewNavigatorDataEvent = 2110; // PRODUCTION-201611291003-338511768 + public static final int RequestNewNavigatorRoomsEvent = 249; // PRODUCTION-201611291003-338511768 + public static final int RedeemClothingEvent = 3374; // PRODUCTION-201611291003-338511768 + public static final int NewNavigatorActionEvent = 1703; // PRODUCTION-201611291003-338511768 + public static final int PostItPlaceEvent = 2248; // PRODUCTION-201611291003-338511768 + public static final int PostItRequestDataEvent = 3964; // PRODUCTION-201611291003-338511768 + public static final int PostItSaveDataEvent = 3666; // PRODUCTION-201611291003-338511768 + public static final int PostItDeleteEvent = 3336; // PRODUCTION-201611291003-338511768 + public static final int MoodLightSaveSettingsEvent = 1648; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestIssueChatlogEvent = 211; // PRODUCTION-201611291003-338511768 + public static final int ModToolRequestRoomUserChatlogEvent = -1; // PRODUCTION-201611291003-338511768 + public static final int UsernameEvent = 3878; // PRODUCTION-201611291003-338511768 + public static final int RequestClubGiftsEvent = 487; // PRODUCTION-201611291003-338511768 + public static final int RentSpaceEvent = 2946; // PRODUCTION-201611291003-338511768 + public static final int RentSpaceCancelEvent = 1667; // PRODUCTION-201611291003-338511768 + public static final int RequestInitFriendsEvent = 2781; // PRODUCTION-201611291003-338511768 + public static final int RequestCameraConfigurationEvent = 796; // PRODUCTION-201611291003-338511768 + public static final int PingEvent = 295; // PRODUCTION-201611291003-338511768 + public static final int FindNewFriendsEvent = 516; // PRODUCTION-201611291003-338511768 + public static final int InviteFriendsEvent = 1276; // PRODUCTION-201611291003-338511768 + public static final int GuildRemoveFavoriteEvent = 1820; // PRODUCTION-201611291003-338511768 + public static final int GuildDeleteEvent = 1134; // PRODUCTION-201611291003-338511768 + public static final int SetHomeRoomEvent = 1740; // PRODUCTION-201611291003-338511768 + public static final int RoomUserGiveHandItemEvent = 2941; // PRODUCTION-201611291003-338511768 + public static final int AmbassadorVisitCommandEvent = 2970; // PRODUCTION-201611291003-338511768 + public static final int AmbassadorAlertCommandEvent = 2996; // PRODUCTION-201611291003-338511768 + public static final int SaveUserVolumesEvent = 1367; // PRODUCTION-201611291003-338511768 + public static final int SavePreferOldChatEvent = 1262; // PRODUCTION-201611291003-338511768 + public static final int SaveIgnoreRoomInvitesEvent = 1086; // PRODUCTION-201611291003-338511768 + public static final int SaveBlockCameraFollowEvent = 1461; // PRODUCTION-201611291003-338511768 + public static final int RoomMuteEvent = 3637; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomWordFilterEvent = 1911; // PRODUCTION-201611291003-338511768 + public static final int RoomWordFilterModifyEvent = 3001; // PRODUCTION-201611291003-338511768 + public static final int RequestRoomUserTagsEvent = 17; // PRODUCTION-201611291003-338511768 + public static final int CatalogSearchedItemEvent = 2594; // PRODUCTION-201611291003-338511768 + public static final int JukeBoxRequestTrackCodeEvent = 3189; // PRODUCTION-201611291003-338511768 + public static final int JukeBoxRequestTrackDataEvent = 3082; // PRODUCTION-201611291003-338511768 + public static final int RoomStaffPickEvent = 1918; // PRODUCTION-201611291003-338511768 + public static final int RoomRequestBannedUsersEvent = 2267; // PRODUCTION-201611291003-338511768 + public static final int JukeBoxRequestPlayListEvent = 1325; // PRODUCTION-201611291003-338511768 + public static final int JukeBoxEventOne = 2304; // PRODUCTION-201611291003-338511768 + public static final int JukeBoxEventTwo = 1435; // PRODUCTION-201611291003-338511768 + public static final int RoomUserMuteEvent = 3485; // PRODUCTION-201611291003-338511768 + //public static final int JukeBoxEventThree = 3846; + public static final int RequestDeleteRoomEvent = 532; // PRODUCTION-201611291003-338511768 + public static final int RequestPromotionRoomsEvent = 1075; // PRODUCTION-201611291003-338511768 + public static final int BuyRoomPromotionEvent = 777; // PRODUCTION-201611291003-338511768 + public static final int RequestGuideToolEvent = 1922; // PRODUCTION-201611291003-338511768 + public static final int RequestGuideAssistanceEvent = 3338; // PRODUCTION-201611291003-338511768 + public static final int GuideUserTypingEvent = 519; // PRODUCTION-201611291003-338511768 + public static final int GuideReportHelperEvent = 3969; // PRODUCTION-201611291003-338511768 + public static final int GuideRecommendHelperEvent = 477; // PRODUCTION-201611291003-338511768 + public static final int GuideUserMessageEvent = 3899; // PRODUCTION-201611291003-338511768 + public static final int GuideCancelHelpRequestEvent = 291; // PRODUCTION-201611291003-338511768 + public static final int GuideHandleHelpRequestEvent = 1424; // PRODUCTION-201611291003-338511768 + public static final int GuideVisitUserEvent = 1052; // PRODUCTION-201611291003-338511768 + public static final int GuideInviteUserEvent = 234; // PRODUCTION-201611291003-338511768 + public static final int GuideCloseHelpRequestEvent = 887; // PRODUCTION-201611291003-338511768 + public static final int GuardianNoUpdatesWantedEvent = 2501; // PRODUCTION-201611291003-338511768 + public static final int GuardianVoteEvent = 3961; // PRODUCTION-201611291003-338511768 + public static final int GuardianAcceptRequestEvent = 3365; // PRODUCTION-201611291003-338511768 + public static final int RequestGameConfigurationsEvent = 741; // PRODUCTION-201611291003-338511768 + public static final int RequestAchievementConfigurationEvent = -1; // PRODUCTION-201611291003-338511768 + public static final int RequestReportUserBullyingEvent = 3786; // PRODUCTION-201611291003-338511768 + public static final int ReportBullyEvent = 3060; // PRODUCTION-201611291003-338511768 + public static final int CameraRoomPictureEvent = 3226; // PRODUCTION-201611291003-338511768 + public static final int CameraRoomThumbnailEvent = 1982; // PRODUCTION-201611291003-338511768 + public static final int SavePostItStickyPoleEvent = 3283; // PRODUCTION-201611291003-338511768 + public static final int HotelViewClaimBadgeEvent = 3077; // PRODUCTION-201611291003-338511768 + public static final int HotelViewRequestCommunityGoalEvent = 1145; // PRODUCTION-201611291003-338511768 + public static final int HotelViewRequestConcurrentUsersEvent = 1343; // PRODUCTION-201611291003-338511768 + public static final int HotelViewConcurrentUsersButtonEvent = 3872; // PRODUCTION-201611291003-338511768 + public static final int IgnoreRoomUserEvent = 1117; // PRODUCTION-201611291003-338511768 + public static final int UnIgnoreRoomUserEvent = 2061; // PRODUCTION-201611291003-338511768 + public static final int UnbanRoomUserEvent = 992; // PRODUCTION-201611291003-338511768 + public static final int RoomUserBanEvent = 1477; // PRODUCTION-201611291003-338511768 + public static final int RequestNavigatorSettingsEvent = 1782; // PRODUCTION-201611291003-338511768 + public static final int SaveWindowSettingsEvent = 3159; // PRODUCTION-201611291003-338511768 + public static final int GetHabboGuildBadgesMessageEvent = 21; // PRODUCTION-201611291003-338511768 + + public static final int RequestCraftingRecipesEvent = 1173; // PRODUCTION-201611291003-338511768 + public static final int RequestCraftingRecipesAvailableEvent = 3086; // PRODUCTION-201611291003-338511768 + public static final int CraftingAddRecipeEvent = 633; // PRODUCTION-201611291003-338511768 + public static final int CraftingCraftItemEvent = 3591; // PRODUCTION-201611291003-338511768 + public static final int CraftingCraftSecretEvent = 1251; // PRODUCTION-201611291003-338511768 + + public static final int AdventCalendarOpenDayEvent = 2257; // PRODUCTION-201611291003-338511768 + public static final int AdventCalendarForceOpenEvent = 3889; // PRODUCTION-201611291003-338511768 + public static final int CameraPurchaseEvent = 2408; // PRODUCTION-201611291003-338511768 + public static final int RoomFavoriteEvent = 3817; // PRODUCTION-201611291003-338511768 + + public static final int YoutubeRequestPlayListEvent = 336; // PRODUCTION-201611291003-338511768 + public static final int YoutubeRequestNextVideoEvent = 3005; // PRODUCTION-201611291003-338511768 + public static final int YoutubeRequestVideoDataEvent = 2069; // PRODUCTION-201611291003-338511768 + + public static final int EditRoomPromotionMessageEvent = 3707; + public static final int HotelViewRequestBadgeRewardEvent = 2318; + public static final int HotelViewClaimBadgeRewardEvent = -1; + + public static final int JukeBoxAddSoundTrackEvent = 753; + public static final int JukeBoxRemoveSoundTrackEvent = 3050; + public static final int ToggleMonsterplantBreedableEvent = 3379; + public static final int CompostMonsterplantEvent = 3835; + public static final int BreedPetsEvent = 1638; + public static final int MovePetEvent = 3449; + public static final int PetPackageNameEvent = 3698; + + public static final int GameCenterRequestGamesEvent = 741; + public static final int GameCenterRequestAccountStatusEvent = 3171; + public static final int GameCenterRequestGameStatusEvent = 11; + public static final int CameraPublishToWebEvent = 2068; + + public static final int GameCenterJoinGameEvent = 1458; + public static final int GameCenterLoadGameEvent = 1054; + public static final int GameCenterEvent = 2914; + public static final int GameCenterLeaveGameEvent = 3207; + + public static final int ModToolSanctionAlertEvent = 229; + public static final int ModToolSanctionMuteEvent = 1945; + public static final int ModToolSanctionBanEvent = 2766; + public static final int ModToolSanctionTradeLockEvent = 3742; + public static final int UserNuxEvent = 1299; + + public static final int ReportFriendPrivateChatEvent = 2950; + public static final int ModToolIssueChangeTopicEvent = 1392; + public static final int ModToolIssueDefaultSanctionEvent = 2717; + + public static final int TradeCancelEvent = 2341; + + + public static final int UNKNOWN_SNOWSTORM_6000 = 6000; + public static final int UNKNOWN_SNOWSTORM_6001 = 6001; + public static final int UNKNOWN_SNOWSTORM_6002 = 6002; + public static final int UNKNOWN_SNOWSTORM_6003 = 6003; + public static final int UNKNOWN_SNOWSTORM_6004 = 6004; + public static final int UNKNOWN_SNOWSTORM_6005 = 6005; + public static final int UNKNOWN_SNOWSTORM_6006 = 6006; + public static final int UNKNOWN_SNOWSTORM_6007 = 6007; + public static final int UNKNOWN_SNOWSTORM_6008 = 6008; + public static final int UNKNOWN_SNOWSTORM_6009 = 6009; + public static final int UNKNOWN_SNOWSTORM_6010 = 6010; + public static final int UNKNOWN_SNOWSTORM_6011 = 6011; + public static final int SnowStormJoinQueueEvent = 6012; + public static final int UNKNOWN_SNOWSTORM_6013 = 6013; + public static final int UNKNOWN_SNOWSTORM_6014 = 6014; + public static final int UNKNOWN_SNOWSTORM_6015 = 6015; + public static final int UNKNOWN_SNOWSTORM_6016 = 6016; + public static final int UNKNOWN_SNOWSTORM_6017 = 6017; + public static final int UNKNOWN_SNOWSTORM_6018 = 6018; + public static final int UNKNOWN_SNOWSTORM_6019 = 6019; + public static final int UNKNOWN_SNOWSTORM_6020 = 6020; + public static final int UNKNOWN_SNOWSTORM_6021 = 6021; + public static final int UNKNOWN_SNOWSTORM_6022 = 6022; + public static final int UNKNOWN_SNOWSTORM_6023 = 6023; + public static final int UNKNOWN_SNOWSTORM_6024 = 6024; + public static final int UNKNOWN_SNOWSTORM_6025 = 6025; + public static final int SnowStormUserPickSnowballEvent = 6026; +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/Incoming_1006.java b/src/main/java/com/eu/habbo/messages/incoming/Incoming_1006.java new file mode 100644 index 00000000..d52066bd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/Incoming_1006.java @@ -0,0 +1,676 @@ +package com.eu.habbo.messages.incoming; + +public class Incoming_1006 +{ + + + /* + Achievements + */ + //public static final int RequestAchievementsEvent = 2562; + + /* + Wired + */ + /*public static final int WiredTriggerSaveDataEvent = 3201; + public static final int WiredEffectSaveDataEvent = 3006; + public static final int WiredConditionSaveDataEvent = 1041;*/ + + /* + Pets + */ + /*public static final int RequestPetInformationEvent = 777; + public static final int PetPickupEvent = 863; + public static final int ScratchPetEvent = 3464; + public static final int RequestPetTrainingPanelEvent = 2476; + public static final int HorseUseItemEvent = 1616; + public static final int HorseRideSettingsEvent = 2448; + public static final int HorseRideEvent = 3268;*/ + + /* + Groups + */ + /* public static final int RequestGuildBuyRoomsEvent = 701; + public static final int RequestGuildPartsEvent = 2344; + public static final int RequestGuildBuyEvent = 872; + public static final int RequestGuildInfoEvent = 2079; + public static final int RequestGuildManageEvent = 2418; + public static final int RequestGuildMembersEvent = 2382; + public static final int RequestGuildJoinEvent = 77; + public static final int GuildChangeNameDescEvent = 3232; + public static final int GuildChangeBadgeEvent = 1475; + public static final int GuildChangeColorsEvent = 463; + public static final int GuildRemoveMemberEvent = 3002; + public static final int GuildRemoveAdminEvent = 3264; + public static final int GuildChangeSettingsEvent = 2156; + public static final int GuildAcceptMembershipEvent = 1066; + public static final int GuildDeclineMembershipEvent = 1320; + public static final int GuildSetAdminEvent = 2957; + public static final int GuildSetFavoriteEvent = 1463; + public static final int RequestOwnGuildsEvent = 2240; + public static final int RequestGuildFurniWidgetEvent = 3031; + + /* + Trading + */ + /*public static final int TradeStartEvent = 466; + public static final int TradeOfferItemEvent = 2223; + public static final int TradeCancelOfferItemEvent = 373; + public static final int TradeAcceptEvent = 1062; + public static final int TradeUnAcceptEvent = 1131; + public static final int TradeConfirmEvent = 1144; + public static final int TradeCloseEvent = 3387; + + /* + ModTool + */ + /* public static final int ModToolRequestRoomInfoEvent = 225; + public static final int ModToolRequestRoomChatlogEvent = 1903; + public static final int ModToolRequestUserInfoEvent = 3077; + public static final int ModToolPickTicketEvent = 3975; + public static final int ModToolAlertEvent = 1980; + public static final int ModToolKickEvent = 3418; + public static final int ModToolBanEvent = 2930; + public static final int ModToolWarnEvent = 3763; + public static final int ModToolRequestUserChatlogEvent = 203; + public static final int ModToolRoomAlertEvent = 295; + public static final int ModToolChangeRoomSettingsEvent = 2530; + public static final int ModToolRequestRoomVisitsEvent = 2549; + + /* + Catalog + */ + /*public static final int Unknown3 = 3794; //Catalogue Initialized Composer? + public static final int RequestRecylerLogicEvent = 1077; + public static final int RequestCatalogIndexEvent = 81; + public static final int GetMarketplaceConfigEvent = 1952; //Configuration IDs composer? + public static final int RequestDiscountEvent = 3794; + public static final int RequestCatalogModeEvent = 3406; + public static final int RequestGiftConfigurationEvent = 382; + public static final int RequestCatalogPageEvent = 1754; + public static final int CatalogBuyItemEvent = 2967; + public static final int CatalogBuyItemAsGiftEvent = 2474; + public static final int RedeemVoucherEvent = 1571; + public static final int ReloadRecyclerEvent = 2779; + public static final int RecycleEvent = 2318; + public static final int OpenRecycleBoxEvent = 3977; + public static final int RequestPetBreedsEvent = 1064; + public static final int CheckPetNameEvent = 678; + public static final int GetClubDataEvent = 1608; + + /* + Polls + */ + /* public static final int CancelPollEvent = 276; + public static final int GetPollDataEvent = 1960; + public static final int AnswerPollEvent = 1847; + + /* + Marketplace + */ + /*public static final int RequestOwnItemsEvent = 829; + public static final int TakeBackItemEvent = 2910; + public static final int RequestOffersEvent = 541; + public static final int RequestItemInfoEvent = 36; + public static final int BuyItemEvent = 3878; + public static final int RequestSellItemEvent = 2087; + public static final int SellItemEvent = 172; + public static final int RequestCreditsEvent = 2138; + + + /* + Handshake + */ + /* public static final int ReleaseVersionEvent = 4000; + public static final int RequestBannerToken = 2619; + public static final int GenerateSecretKeyEvent = 3575; + public static final int MachineIDEvent = 512; + public static final int SecureLoginEvent = 1309; + + /* + Friends + */ + /*public static final int RequestFriendsEvent = 776; + public static final int ChangeRelationEvent = 2521; + public static final int RemoveFriendEvent = 2786; + public static final int SearchUserEvent = 1267; + public static final int FriendRequestEvent = 3765; + public static final int AcceptFriendRequest = 333; + public static final int FriendPrivateMessageEvent = 1527; + public static final int RequestFriendRequestEvent = 275; + public static final int StalkFriendEvent = 3394; + + /* + HotelView + */ + /* public static final int HotelViewEvent = 3266; + public static final int RequestBonusRareEvent = 1199; + public static final int RequestNewsListEvent = 896; + public static final int HotelViewDataEvent = 595; + + /* + Navigator + */ + /*public static final int RequestRoomCategoriesEvent = 1431; + public static final int RequestPublicRoomsEvent = 3735; + public static final int RequestPopularRoomsEvent = 235; + public static final int RequestHighestScoreRoomsEvent = 1728; + public static final int RequestMyRoomsEvent = 2676; + public static final int RequestCanCreateRoomEvent = 3844; + public static final int RequestPromotedRoomsEvent = 3030; + public static final int RequestCreateRoomEvent = 3524; + public static final int RequestTagsEvent = 1337; + public static final int SearchRoomsByTagEvent = 1956; + public static final int SearchRoomsEvent = 3551; + public static final int SearchRoomsFriendsNowEvent = 3306; + public static final int SearchRoomsFriendsOwnEvent = 3478; + public static final int SearchRoomsWithRightsEvent = 3785; + public static final int SearchRoomsInGroupEvent = 1160; + public static final int SearchRoomsMyFavoriteEvent = 1532; + public static final int SearchRoomsVisitedEvent = 589; + + + /* + Rooms + */ + /* public static final int RequestRoomLoadEvent = 3751; //3751 + public static final int RoomVoteEvent = 242; + public static final int RequestRoomSettingsEvent = 3741; + public static final int RequestHeightmapEvent = 308; + public static final int RequestRoomDataEvent = 183; + public static final int RoomSettingsSaveEvent = 2384; + public static final int RoomUserTalkEvent = 3349; + public static final int RoomUserShoutEvent = 936; + public static final int RoomUserWhisperEvent = 1362; + public static final int RoomUserActionEvent = 475; + public static final int RoomUserSitEvent = 484; + public static final int RoomUserDanceEvent = 1139; + public static final int RoomUserSignEvent = 2189; + public static final int RoomUserGiveRespectEvent = 2041; + public static final int RoomUserWalkEvent = 951; + public static final int RoomPlaceItemEvent = 474; + public static final int RotateMoveItemEvent = 194; + public static final int MoveWallItemEvent = 1029; + public static final int RoomPickupItemEvent = 152; + public static final int RoomPlacePaintEvent = 874; + public static final int RoomUserStartTypingEvent = 3684; + public static final int RoomUserStopTypingEvent = 2005; + public static final int ToggleFloorItemEvent = 120; + public static final int ToggleWallItemEvent = 2650; + public static final int RoomUserLookAtPoint = 1365; + public static final int RoomBackgroundEvent = 2715; + public static final int MannequinSaveNameEvent = 2098; + public static final int MannequinSaveLookEvent = 1804; + public static final int AdvertisingSaveEvent = 68; + public static final int RoomUserDropHandItemEvent = 157; + public static final int BotPlaceEvent = 148; + public static final int BotPickupEvent = 2865; + public static final int BotSaveSettingsEvent = 1384; + public static final int BotSettingsEvent = 3098; + public static final int TriggerDiceEvent = 987; + public static final int CloseDiceEvent = 1739; + public static final int TriggerColorWheelEvent = 2367; + public static final int MoodLightSettingsEvent = 2468; + public static final int MoodLightTurnOnEvent = 1181; + public static final int RedeemItemEvent = 3599; + public static final int RequestRoomRightsEvent = 2928; + public static final int RoomRemoveAllRightsEvent = 405; + public static final int RoomUserGiveRightsEvent = 2221; + public static final int RoomUserRemoveRightsEvent = 3639; + public static final int PetPlaceEvent = 3711; + public static final int RoomUserKickEvent = 1874; + public static final int SetStackHelperHeightEvent = 2540; + + /* + Users + */ + /* public static final int RequestUserDataEvent = 112; + public static final int RequestUserCreditsEvent = 938; + public static final int RequestUserClubEvent = 3874; + public static final int RequestMeMenuSettingsEvent = 671; + public static final int RequestUserCitizinShipEvent = 3096; + public static final int RequestUserProfileEvent = 532; + public static final int RequestProfileFriendsEvent = 3925; + public static final int RequestUserTagsEvent = 3102; + public static final int RequestUserWardrobeEvent = 1251; + public static final int SaveWardrobeEvent = 637; + public static final int UserSaveLookEvent = 2404; + public static final int SaveMottoEvent = 2832; + public static final int UserWearBadgeEvent = 2473; + public static final int RequestWearingBadgesEvent = 3968; + + /* + Inventory + */ + /* public static final int RequestInventoryItemsEvent = 372; // 1223 + public static final int RequestInventoryPetsEvent = 1900; + public static final int RequestInventoryBadgesEvent = 3072; + public static final int RequestInventoryBotsEvent = 1351; + + /* + Not correctly implemented + */ + /*public static final int RequestResolutionEvent = 1854;*/ + + /*public static final int MannequinSaveLookEvent = 2252;//1804 + public static final int RequestCatalogPageEvent = 1904;//1754 + public static final int RequestWearingBadgesEvent = 3364;//3968 + public static final int BotPickupEvent = 1890;//2865 + public static final int HorseRideEvent = 1425;//3268 + public static final int RequestCreateRoomEvent = 1075;//3524 + public static final int SaveMottoEvent = 3060;//2832 + public static final int GenerateSecretKeyEvent = 2342;//3575 + public static final int ModToolAlertEvent = 641;//1980 + public static final int TradeAcceptEvent = 843;//1062 + public static final int RequestCatalogModeEvent = 2941;//3406 + public static final int RequestUserCreditsEvent = 3985;//938 + public static final int FriendPrivateMessageEvent = 2046;//1527 + public static final int CloseDiceEvent = 2438;//1739 + public static final int RoomUserRemoveRightsEvent = 1872;//3639 + public static final int GuildDeclineMembershipEvent = 3464;//1320 + public static final int AnswerPollEvent = 3647;//1847 + public static final int UserWearBadgeEvent = 2265;//2473 + public static final int RoomVoteEvent = -242;//242 + public static final int RoomUserSignEvent = 1037;//2189 + public static final int RequestUserDataEvent = 3243;//112 + public static final int RoomUserShoutEvent = 1559;//936 + public static final int ScratchPetEvent = 2363;//3464 + public static final int RoomUserWalkEvent = 3264;//951 + public static final int RequestUserTagsEvent = 3364;//3102 + public static final int RequestTagsEvent = 3906;//1337 + public static final int GetMarketplaceConfigEvent = 1142;//1952 + public static final int RequestHeightmapEvent = 2450;//308 + public static final int TradeCloseEvent = 759;//3387 + public static final int CatalogBuyItemEvent = 3269;//2967 + public static final int RequestGuildMembersEvent = 556;//2382 + public static final int RequestPetInformationEvent = 1330;//777 + public static final int RoomUserWhisperEvent = 3700;//1362 + public static final int ModToolRequestUserInfoEvent = 852;//3077 + public static final int RotateMoveItemEvent = 3753;//194 + public static final int CancelPollEvent = 797;//276 + public static final int RequestRoomLoadEvent = 2144;//3751 //2086 //2144 + public static final int RequestGuildPartsEvent = 2165;//2344 + public static final int RoomPlacePaintEvent = 2534;//874 + public static final int RequestPopularRoomsEvent = 1627;//2346;//235 + public static final int ModToolRequestRoomInfoEvent = 346;//225 + public static final int FriendRequestEvent = 3667;//3765 + public static final int RecycleEvent = 2627;//2318 + public static final int RequestRoomCategoriesEvent = 783;//1431 + public static final int ToggleWallItemEvent = 3649;//2650 + public static final int RoomUserTalkEvent = 2462;//3349 + public static final int HotelViewDataEvent = 3813;//595 + public static final int RoomUserDanceEvent = 1764;//1139 + public static final int RequestUserProfileEvent = 1299;//532 + public static final int SearchRoomsFriendsNowEvent = 542;//3306 + public static final int SetStackHelperHeightEvent = 3280;//2540 + public static final int RedeemVoucherEvent = 114;//1571 + public static final int HorseUseItemEvent = 1105;//1616 + public static final int BuyItemEvent = 3161;//3878 + public static final int AdvertisingSaveEvent = 3645;//68 + public static final int RequestPetTrainingPanelEvent = 2867;//2476 + public static final int RoomBackgroundEvent = 1275;//2715 + public static final int RequestNewsListEvent = 1205;//896 + public static final int RequestPromotedRoomsEvent = 3527;//3030 + public static final int GuildSetAdminEvent = 1954;//2957 + public static final int GetClubDataEvent = 1232;//1608 + public static final int RequestMeMenuSettingsEvent = 254;//671 + public static final int MannequinSaveNameEvent = 2872;//2098 + public static final int SellItemEvent = 1147;//172 + public static final int GuildAcceptMembershipEvent = 816;//1066 + public static final int RequestBannerToken = 1497;//2619 + public static final int RequestRecylerLogicEvent = 2669;//1077 + public static final int RequestGuildJoinEvent = 1971;//77 + public static final int RequestCatalogIndexEvent = 1789;//81 + public static final int RequestInventoryPetsEvent = 3555;//1900 + public static final int ModToolRequestRoomVisitsEvent = 1854;//2549 + public static final int ModToolWarnEvent = 2891;//3763 + public static final int RequestItemInfoEvent = 2326;//36 + public static final int ModToolRequestRoomChatlogEvent = 2285;//1903 + public static final int UserSaveLookEvent = 2889;//2404 + public static final int ToggleFloorItemEvent = 2970;//120 + public static final int TradeUnAcceptEvent = 1287;//1131 + public static final int WiredTriggerSaveDataEvent = 3931;//3201 + public static final int RoomRemoveAllRightsEvent = 36;//405 + public static final int TakeBackItemEvent = 560;//2910 + public static final int OpenRecycleBoxEvent = 3502;//3977 + public static final int GuildChangeNameDescEvent = 3503;//3232 + public static final int RequestSellItemEvent = 1380;//2087 + public static final int ModToolChangeRoomSettingsEvent = 2571;//2530 + public static final int ModToolRequestUserChatlogEvent = 600;//203 + public static final int GuildChangeSettingsEvent = 1026;//2156 + public static final int RoomUserDropHandItemEvent = 1699;//157 + public static final int RequestProfileFriendsEvent = 3510;//3925 + public static final int TradeCancelOfferItemEvent = 2646;//373 + public static final int TriggerDiceEvent = 1000;//987 + public static final int GetPollDataEvent = 491;//1960 + public static final int MachineIDEvent = -512;//512 + public static final int RequestDiscountEvent = 458;//3794 + public static final int RequestFriendRequestEvent = 1823;//275 + public static final int RoomSettingsSaveEvent = 1824;//2384 + public static final int AcceptFriendRequest = 3110;//333 + public static final int ReleaseVersionEvent = 4000;//4000 + public static final int SearchRoomsMyFavoriteEvent = 1181;//1532 + public static final int TradeStartEvent = 2842;//466 + public static final int ChangeRelationEvent = 668;//2521 + public static final int RoomUserSitEvent = 2292;//484 + public static final int RequestCanCreateRoomEvent = 3929;//3844 + public static final int ModToolKickEvent = 1132;//3418 + public static final int MoveWallItemEvent = 3043;//1029 + public static final int SearchRoomsEvent = 2188;//3551 + public static final int RequestHighestScoreRoomsEvent = 1379;//1728 + public static final int CatalogBuyItemAsGiftEvent = 3186;//2474 + public static final int RoomUserGiveRespectEvent = 2901;//2041 + public static final int RemoveFriendEvent = 3767;//2786 + public static final int SearchRoomsFriendsOwnEvent = 1870;//3478 + public static final int GuildSetFavoriteEvent = 2864;//1463 + public static final int PetPlaceEvent = 81;//3711 + public static final int BotSettingsEvent = 3630;//3098 + public static final int StalkFriendEvent = 3829;//3394 + public static final int RoomPickupItemEvent = 2316;//152 + public static final int RedeemItemEvent = 3333;//3599 + public static final int RequestFriendsEvent = 2386;//776 + public static final int RequestAchievementsEvent = 3474;//2562 + public static final int GuildChangeColorsEvent = 3260;//463 + public static final int RequestInventoryBadgesEvent = 2480;//3072 + public static final int RequestPetBreedsEvent = 3851;//1064 + public static final int GuildChangeBadgeEvent = 2754;//1475 + public static final int ModToolBanEvent = 574;//2930 + public static final int SaveWardrobeEvent = 1188;//637 + public static final int HotelViewEvent = 1784;//3266 + public static final int ModToolPickTicketEvent = 3088;//3975 + public static final int ModToolReleaseTicketEvent = 734; + public static final int ModToolCloseTicketEvent = 1837; + public static final int TriggerColorWheelEvent = 2882;//2367 + public static final int SearchRoomsByTagEvent = -1956;//1956 + public static final int RequestPublicRoomsEvent = 2021;//3735 //UPDATED OLD 3178 + public static final int RequestResolutionEvent = 3871;//1854 + public static final int Unknown3 = 458;//3794 + public static final int RequestInventoryItemsEvent = 1920;//372 + public static final int ModToolRoomAlertEvent = 1863;//295 + public static final int WiredEffectSaveDataEvent = 1645;//3006 + public static final int CheckPetNameEvent = 3567;//678 + public static final int SecureLoginEvent = 1957;//1309 + public static final int BotSaveSettingsEvent = 736;//1384 + public static final int RequestGuildBuyEvent = 2594;//872 + public static final int SearchUserEvent = 3026;//1267 + public static final int GuildRemoveMemberEvent = 353;//3002 + public static final int WiredConditionSaveDataEvent = 2096;//1041 + public static final int RoomUserLookAtPoint = 2115;//1365 + public static final int MoodLightTurnOnEvent = 883;//1181 + public static final int MoodLightSettingsEvent = 3878;//2468 + public static final int RequestMyRoomsEvent = 2360;//2676 + public static final int RequestCreditsEvent = 1623;//2138 + public static final int SearchRoomsInGroupEvent = 2066;//1160 + public static final int HorseRideSettingsEvent = 1731;//2448 + public static final int HandleDoorbellEvent = 91; + public static final int RoomUserKickEvent = 1718;//1874 + public static final int RoomPlaceItemEvent = 2554;//474 + public static final int RequestInventoryBotsEvent = 3549;//1351 + public static final int RequestUserWardrobeEvent = 3057;//1251 + public static final int RequestRoomRightsEvent = 2197;//2928 + public static final int RequestGuildBuyRoomsEvent = 1035;//701 + public static final int BotPlaceEvent = 2143;//148 + public static final int SearchRoomsWithRightsEvent = 307;//3785 + public static final int RequestBonusRareEvent = 1966;//1199 + public static final int GuildRemoveAdminEvent = 864;//3264 + public static final int RequestRoomSettingsEvent = 2176;//3741 + public static final int RequestOffersEvent = 2688;//541 + public static final int RequestUserCitizinShipEvent = 2151;//3096 + public static final int RoomUserStopTypingEvent = 3890;//2005 + public static final int RoomUserStartTypingEvent = 3896;//3684 + public static final int RequestGuildManageEvent = 3169;//2418 + public static final int RequestUserClubEvent = 2189;//3874 + public static final int PetPickupEvent = -3167;//863 + public static final int RequestOwnGuildsEvent = 484;//2240 + public static final int SearchRoomsVisitedEvent = 24;//589 + public static final int TradeOfferItemEvent = 1324;//2223 + public static final int TradeConfirmEvent = 3866;//1144 + public static final int RoomUserGiveRightsEvent = 3167;//2221 + public static final int RequestGuildInfoEvent = 331;//2079 + public static final int ReloadRecyclerEvent = 72;//2779 + public static final int RoomUserActionEvent = 2000;//475 + public static final int RequestGiftConfigurationEvent = 102;//382 + public static final int RequestRoomDataEvent = 2086;//183 + public static final int RequestRoomHeightmapEvent = 3075; + public static final int RequestGuildFurniWidgetEvent = 3239;//3031 + public static final int RequestOwnItemsEvent = 1486;//829 + public static final int RequestReportRoomEvent = 2343; + public static final int ReportEvent = 330; + public static final int TriggerOneWayGateEvent = 408; + public static final int FloorPlanEditorSaveEvent = 2324; + public static final int FloorPlanEditorRequestDoorSettingsEvent = 1168; + public static final int FloorPlanEditorRequestBlockedTilesEvent = 1241;*/ + + public static final int MannequinSaveLookEvent = 3770;//1804 //Updated + public static final int RequestCatalogPageEvent = 2914;//1754 //Updated + public static final int RequestWearingBadgesEvent = 3466;//3968 //Updated + public static final int BotPickupEvent = 665;//2865 //Updated + public static final int HorseRideEvent = 1027;//3268 //Updated + public static final int CreateRoomEvent = 238;//3524 //Updated + public static final int SaveMottoEvent = 1037;//2832 //Updated + public static final int GenerateSecretKeyEvent = -1;//3575 + public static final int ModToolAlertEvent = 2890;//1980 //Updated + public static final int TradeAcceptEvent = 368;//1062 //Updated + public static final int RequestCatalogModeEvent = 2711;//3406 //Updated + public static final int RequestUserCreditsEvent = 2845;//938 //Updated + public static final int FriendPrivateMessageEvent = 3710;//1527 //Updated + public static final int CloseDiceEvent = 57;//1739 //Updated + public static final int RoomUserRemoveRightsEvent = 1599;//3639 //Updated + public static final int GuildDeclineMembershipEvent = 1328;//1320 //Updated + public static final int AnswerPollEvent = 2135;//1847 //Updated + public static final int UserWearBadgeEvent = 741;//2473 //Updated + public static final int RoomVoteEvent = -242;//242 + public static final int RoomUserSignEvent = 2065;//2189 //Updated + public static final int RequestUserDataEvent = 882;//112 //Updated + public static final int RoomUserShoutEvent = 1788;//936 //Updated + public static final int ScratchPetEvent = 965;//3464 //Updated + public static final int RoomUserWalkEvent = 3690;//951 //Updated + public static final int RequestUserTagsEvent = 3430;//3102 //Updated + public static final int RequestTagsEvent = 753;//1337 //Updated + public static final int GetMarketplaceConfigEvent = 3774;//1952 //Updated + public static final int RequestHeightmapEvent = 859;//308 //Updated + public static final int TradeCloseEvent = 3012;//3387 //Updated + public static final int CatalogBuyItemEvent = 3964;//2967 //Updated + public static final int RequestGuildMembersEvent = 3204;//2382 //Updated + public static final int RequestPetInformationEvent = 2827;//777 //Updated + public static final int RoomUserWhisperEvent = 3908;//1362 //Updated + public static final int ModToolRequestUserInfoEvent = 607;//3077 //Updated + public static final int RotateMoveItemEvent = 1219;//194 //Updated + public static final int CancelPollEvent = 1628;//276 //Updated + public static final int RequestRoomLoadEvent = 1988;//3751 //2086 //2144 //Updated + public static final int RequestGuildPartsEvent = 1902;//2344 //Updated + public static final int RoomPlacePaintEvent = 1892;//874 //Updated + public static final int RequestPopularRoomsEvent = 464;//2346;//235 //Updated + public static final int ModToolRequestRoomInfoEvent = 1450;//225 //Updated + public static final int FriendRequestEvent = 2791;//3765 //Updated + public static final int RecycleEvent = 3277;//2318 //Updated + public static final int RequestRoomCategoriesEvent = 3498;//1431 //Updated + public static final int ToggleWallItemEvent = 3050;//2650 //Updated + public static final int RoomUserTalkEvent = 104;//3349 //Updated + public static final int HotelViewDataEvent = 2507;//595 //Updated //2269 + public static final int RoomUserDanceEvent = 649;//1139 //Updated + public static final int RequestUserProfileEvent = 1389;//532 //Updated + public static final int SearchRoomsFriendsNowEvent = 1082;//3306 //Updated + public static final int SetStackHelperHeightEvent = 2790;//2540 //Updated + public static final int RedeemVoucherEvent = 3024;//1571 //Updated + public static final int HorseUseItemEvent = 2590;//1616 //Updated + public static final int BuyItemEvent = 2847;//3878 //Updated + public static final int AdvertisingSaveEvent = 1829;//68 //Updated + public static final int RequestPetTrainingPanelEvent = 2251;//2476 //Updated + public static final int RoomBackgroundEvent = 2496;//2715 //Updated + public static final int RequestNewsListEvent = 1134;//896 //Updated + public static final int RequestPromotedRoomsEvent = 1558;//3030 //Updated + public static final int GuildSetAdminEvent = 3704;//2957 //Updated + public static final int GetClubDataEvent = 3240;//1608 //Updated + public static final int RequestMeMenuSettingsEvent = 2169;//671 //Updated + public static final int MannequinSaveNameEvent = 1289;//2098 //Updated + public static final int SellItemEvent = 1522;//172 //Updated + public static final int GuildAcceptMembershipEvent = 538;//1066 //Updated + public static final int RequestBannerToken = -1;//2619 + public static final int RequestRecylerLogicEvent = 1170;//1077 //Updated + public static final int RequestGuildJoinEvent = 794;//77 //Updated + public static final int RequestCatalogIndexEvent = 2806;//81 //Updated + public static final int RequestInventoryPetsEvent = 3760;//1900 //Updated + public static final int ModToolRequestRoomVisitsEvent = 2287;//2549 //Updated + public static final int ModToolWarnEvent = 2890;//3763 //Updated + public static final int RequestItemInfoEvent = 2042;//36 //Updated + public static final int ModToolRequestRoomChatlogEvent = 3209;//1903 //Updated + public static final int UserSaveLookEvent = 2242;//2404 //Updated + public static final int ToggleFloorItemEvent = 2693;//120 //Updated + public static final int TradeUnAcceptEvent = 126;//1131 //Updated + public static final int WiredTriggerSaveDataEvent = 3593;//3201 //Updated + public static final int RoomRemoveAllRightsEvent = 3764;//405 //Updated + public static final int TakeBackItemEvent = 1455;//2910 //Updated + public static final int OpenRecycleBoxEvent = 0x0F00;//3977 //Updated + public static final int GuildChangeNameDescEvent = 1485;//3232 //Updated + public static final int RequestSellItemEvent = 876;//2087 //Updated + public static final int ModToolChangeRoomSettingsEvent = 3244;//2530 //Updated + public static final int ModToolRequestUserChatlogEvent = 3209;//203 //Updated + public static final int GuildChangeSettingsEvent = 2258;//2156 //Updated + public static final int RoomUserDropHandItemEvent = 1108;//157 //Updated + public static final int RequestProfileFriendsEvent = 3701;//3925 //Updated + public static final int TradeCancelOfferItemEvent = 2170;//373 //Updated + public static final int TriggerDiceEvent = 386;//987 //Updated + public static final int GetPollDataEvent = 2263;//1960 //Updated + public static final int MachineIDEvent = 686;//512 + public static final int RequestDiscountEvent = 1995;//3794 //Updated + public static final int RequestFriendRequestEvent = 3739;//275 //Updated + public static final int RoomSettingsSaveEvent = 1290;//2384 //Updated + public static final int AcceptFriendRequest = 3383;//333 //Updated + public static final int ReleaseVersionEvent = 4000;//4000 //Updated + public static final int SearchRoomsMyFavoriteEvent = 3124;//1532 //Updated + public static final int TradeStartEvent = 3304;//466 //Updated + public static final int ChangeRelationEvent = 2632;//2521 //Updated + public static final int RoomUserSitEvent = 272;//484 //Updated + public static final int RequestCanCreateRoomEvent = 3903;//3844 //Updated //unsure + public static final int ModToolKickEvent = 1459;//3418 //Updated + public static final int MoveWallItemEvent = 3455;//1029 //Updated + public static final int SearchRoomsEvent = 3844;//3551 //Updated + public static final int RequestHighestScoreRoomsEvent = 1814;//1728 //Updaed + public static final int CatalogBuyItemAsGiftEvent = 1066;//2474 //Updated + public static final int RoomUserGiveRespectEvent = 3121;//2041 //Updated + public static final int RemoveFriendEvent = 1535;//2786 //Updated + public static final int SearchRoomsFriendsOwnEvent = 725;//3478 //Updated + public static final int GuildSetFavoriteEvent = 2754;//1463 //Updated + public static final int PetPlaceEvent = 1961;//3711 //Updated + public static final int BotSettingsEvent = 3292;//3098 //Updated + public static final int StalkFriendEvent = 1925;//3394 //Updated + public static final int RoomPickupItemEvent = 2463;//152 //Updated + public static final int RedeemItemEvent = 1242;//3599 //Updated + public static final int RequestFriendsEvent = 1904;//776 //Updated + public static final int RequestAchievementsEvent = 2697;//2562 //Updated + public static final int GuildChangeColorsEvent = 3873;//463 //Updated + public static final int RequestInventoryBadgesEvent = 2450;//3072 //Updated + public static final int RequestPetBreedsEvent = 2828;//1064 //Updated + public static final int GuildChangeBadgeEvent = 838;//1475 //Updated + public static final int ModToolBanEvent = 701;//2930 //Updated + public static final int SaveWardrobeEvent = 2921;//637 //Updated + public static final int HotelViewEvent = 3603;//3266 //Updated + public static final int ModToolPickTicketEvent = 2980;//3975 //Updated + public static final int ModToolReleaseTicketEvent = 3905; //Updated + public static final int ModToolCloseTicketEvent = 3904; //Updated + public static final int TriggerColorWheelEvent = 2556;//2367 //Updated + public static final int SearchRoomsByTagEvent = 3844;//1956 //Updated + public static final int RequestPublicRoomsEvent = 2057;//3735 //UPDATED OLD 3178 //Updated + public static final int RequestResolutionEvent = 305;//1854 //Updated + public static final int RequestInventoryItemsEvent = 2194;//372 //Updated + public static final int ModToolRoomAlertEvent = 2550;//295 //Updated + public static final int WiredEffectSaveDataEvent = 2856;//3006 //Updated + public static final int CheckPetNameEvent = 3699;//678 //Updated + public static final int SecureLoginEvent = 2243;//1309 //Updated + public static final int BotSaveSettingsEvent = 1607;//1384 //Updated + public static final int RequestGuildBuyEvent = 569;//872 //Updated + public static final int SearchUserEvent = 3576;//1267 //Updated + public static final int GuildConfirmRemoveMemberEvent = 3394; + public static final int GuildRemoveMemberEvent = 1764;//3002 //Updated + public static final int WiredConditionSaveDataEvent = 3268;//1041 //Updated + public static final int RoomUserLookAtPoint = 2283;//1365 //Updated + public static final int MoodLightTurnOnEvent = 3924;//1181 //Updated + public static final int MoodLightSettingsEvent = 2821;//2468 //Updated + public static final int RequestMyRoomsEvent = 948;//2676 //Updated + public static final int RequestCreditsEvent = 3896;//2138 //Updated + public static final int SearchRoomsInGroupEvent = 2851;//1160 //Updated + public static final int HorseRideSettingsEvent = 427;//2448 //Updated + public static final int KnockKnockResponseEvent = 853; //Updated + public static final int RoomUserKickEvent = 313;//1874 //Updated + public static final int RoomPlaceItemEvent = 3571;//474 //Updated + public static final int RequestInventoryBotsEvent = 1343;//1351 //Updated + public static final int RequestUserWardrobeEvent = 2976;//1251 //Updated + public static final int RequestRoomRightsEvent = 63;//2928 //Updated + public static final int RequestGuildBuyRoomsEvent = 2945;//701 //Updated + public static final int BotPlaceEvent = 3906;//148 //Updated + public static final int SearchRoomsWithRightsEvent = 1699;//3785 //Updated + public static final int HotelViewRequestBonusRareEvent = 1521;//1199 //Updated + public static final int GuildRemoveAdminEvent = 904;//3264 //Updated + public static final int RequestRoomSettingsEvent = 1794;//3741 //Updated + public static final int RequestOffersEvent = 100;//541 //Updated + public static final int RequestUserCitizinShipEvent = 3556;//3096 //Updated + public static final int RoomUserStopTypingEvent = 1712;//2005 //Updated + public static final int RoomUserStartTypingEvent = 3128;//3684 //Updated + public static final int RequestGuildManageEvent = 3931;//2418 //Updated + public static final int RequestUserClubEvent = 675;//3874 //Updated + public static final int PetPickupEvent = 1294;//863 //Updated + public static final int RequestOwnGuildsEvent = 2690;//2240 //Updated + public static final int SearchRoomsVisitedEvent = 3561;//589 //Updated + public static final int TradeOfferItemEvent = 2090;//2223 //Updated + public static final int TradeConfirmEvent = 1503;//1144 //Updated + public static final int RoomUserGiveRightsEvent = 503;//2221 //Updated + public static final int RequestGuildInfoEvent = 844;//2079 //Updated + public static final int ReloadRecyclerEvent = 3895;//2779 //Updated + public static final int RoomUserActionEvent = 2522;//475 //Updated + public static final int RequestGiftConfigurationEvent = 756;//382 //Updated + public static final int RequestRoomDataEvent = 2022;//183 //Updated + public static final int RequestRoomHeightmapEvent = 3936; //Updated + public static final int RequestGuildFurniWidgetEvent = 54;//3031 //Updated + public static final int RequestOwnItemsEvent = 1816;//829 //Updated + public static final int RequestReportRoomEvent = 2842; //Updated + public static final int ReportEvent = 2073; //Updated + public static final int TriggerOneWayGateEvent = 3752; //Updated + public static final int FloorPlanEditorSaveEvent = 3509; //Updated + public static final int FloorPlanEditorRequestDoorSettingsEvent = 2691; //Updated + public static final int FloorPlanEditorRequestBlockedTilesEvent = 2246; //Updated + public static final int UnknownEvent1 = 3365; + public static final int RequestTalenTrackEvent = 1741; + public static final int RequestNewNavigatorDataEvent = 1192; + public static final int RequestNewNavigatorRoomsEvent = 3669; + public static final int RedeemClothingEvent = 2536; + public static final int NewNavigatorActionEvent = 1344; + public static final int PostItPlaceEvent = 1688; + public static final int PostItRequestDataEvent = 3702; + public static final int PostItSaveDataEvent = 3504; + public static final int PostItDeleteEvent = 779; + public static final int MoodLightSaveSettingsEvent = 900; + public static final int ModToolRequestIssueChatlogEvent = 620; + public static final int ModToolRequestRoomUserChatlogEvent = 1352; + public static final int UsernameEvent = 820; + public static final int RequestClubGiftsEvent = 425; + public static final int RentSpaceEvent = 1382; + public static final int RentSpaceCancelEvent = 3038; + public static final int RequestInitFriendsEvent = 3503; + public static final int RequestCameraConfigurationEvent = 2257; + public static final int PingEvent = 862; + public static final int FindNewFriendsEvent = 3421; + public static final int InviteFriendsEvent = 370; + public static final int GuildeRemoveFavoriteEvent = 3259; + public static final int GuildDeleteEvent = 1581; + public static final int SetHomeRoomEvent = 1772; + public static final int RoomUserGiveHandItemEvent = 2797; + public static final int AmbassadorVisitCommandEvent = 487; + public static final int AmbassadorAlertCommandEvent = 3992; + public static final int SaveUserVolumesEvent = 1914; + public static final int SavePreferOldChatEvent = 3131; + public static final int SaveIgnoreRoomInvitesEvent = 542; + public static final int SaveBlockCameraFollowEvent = 2477; + public static final int RoomMuteEvent = 2571; + public static final int RequestRoomWordFilterEvent = 3305; + public static final int RoomWordFilterModifyEvent = 3415; + public static final int CatalogSearchedItemEvent = 346; + public static final int JukeBoxRequestTrackCodeEvent = 716; + public static final int JukeBoxRequestTrackDataEvent = 3453; + public static final int RoomStaffPickEvent = 3139; + public static final int RoomRequestBannedUsersEvent = 2226; + public static final int JukeBoxRequestPlayListEvent = 68; + public static final int JukeBoxEventOne = 3448; + public static final int JukeBoxEventTwo = 2457; + public static final int JukeBoxEventThree = 2693; +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/Incoming_20160101.java b/src/main/java/com/eu/habbo/messages/incoming/Incoming_20160101.java new file mode 100644 index 00000000..5c58059e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/Incoming_20160101.java @@ -0,0 +1,299 @@ +package com.eu.habbo.messages.incoming; + +public class Incoming_20160101 +{ + public static final int MannequinSaveLookEvent = 3936;//1804 + public static final int RequestCatalogPageEvent = 39;//1754 + public static final int RequestWearingBadgesEvent = 2226;//3968 + public static final int BotPickupEvent = 644;//2865 + public static final int HorseRideEvent = 1440;//3268 + public static final int RequestCreateRoomEvent = 3077;//3524 + public static final int SaveMottoEvent = 3515;//2832 //1037 + public static final int GenerateSecretKeyEvent = -1;//3575 + public static final int ModToolAlertEvent = 2375;//1980 + public static final int TradeAcceptEvent = 3374;//1062 + public static final int RequestCatalogModeEvent = 2267;//3406 + public static final int RequestUserCreditsEvent = 3697;//938 //Updated + public static final int FriendPrivateMessageEvent = 1981;//1527 + public static final int CloseDiceEvent = 191;//1739 + public static final int RoomUserRemoveRightsEvent = 40;//3639 + public static final int RoomRemoveRightsEvent = 879; + public static final int GuildDeclineMembershipEvent = 403;//1320 + public static final int AnswerPollEvent = 3757;//1847 + public static final int UserWearBadgeEvent = 2752;//2473 + public static final int RoomVoteEvent = 336;//242 + public static final int RoomUserSignEvent = 2966;//2189 + public static final int RequestUserDataEvent = 186;//112 //Updated + public static final int RoomUserShoutEvent = 2101;//936 + public static final int ScratchPetEvent = 1618;//3464 + public static final int RoomUserWalkEvent = 1737;//951 + public static final int RequestUserTagsEvent = 1722;//3102 + public static final int RequestTagsEvent = 1685;//1337 + public static final int GetMarketplaceConfigEvent = 1604;//1952 + public static final int RequestHeightmapEvent = 2125;//308 + public static final int TradeCloseEvent = 2967;//3387 + public static final int CatalogBuyItemEvent = 2830;//2967 + public static final int RequestGuildMembersEvent = 205;//2382 + public static final int RequestPetInformationEvent = 2232;//777 + public static final int RoomUserWhisperEvent = 878;//1362 + public static final int ModToolRequestUserInfoEvent = 2984;//3077 + public static final int RotateMoveItemEvent = 1781;//194 + public static final int CancelPollEvent = 2538;//276 + public static final int RequestRoomLoadEvent = 407;//3751 //2086 //2144 + public static final int RequestGuildPartsEvent = 1670;//2344 + public static final int RoomPlacePaintEvent = 728;//874 + public static final int RequestPopularRoomsEvent = 3022;//2346;//235 + public static final int ModToolRequestRoomInfoEvent = 182;//225 + public static final int FriendRequestEvent = 3775;//3765 + public static final int RecycleEvent = 2920;//2318 + public static final int RequestRoomCategoriesEvent = 2506;//1431 //Updated + public static final int ToggleWallItemEvent = 3396;//2650 + public static final int RoomUserTalkEvent = 670;//3349 + public static final int HotelViewDataEvent = 3544;//595 //2269 //Updated + public static final int HotelViewRequestBadgeRewardEvent = 2318; + public static final int HotelViewClaimBadgeRewardEvent = 2388; + public static final int RoomUserDanceEvent = 645;//1139 + public static final int RequestUserProfileEvent = 3591;//532 + public static final int SearchRoomsFriendsNowEvent = 3281;//3306 + public static final int SetStackHelperHeightEvent = 1248;//2540 + public static final int RedeemVoucherEvent = 489;//1571 + public static final int HorseUseItemEvent = 870;//1616 + public static final int BuyItemEvent = 3699;//3878 + public static final int AdvertisingSaveEvent = 3156;//68 + public static final int RequestPetTrainingPanelEvent = 2088;//2476 + public static final int RoomBackgroundEvent = 1061;//2715 + public static final int RequestNewsListEvent = 3895;//896 + public static final int RequestPromotedRoomsEvent = 1812;//3030 //Updated + public static final int GuildSetAdminEvent = 465;//2957 + public static final int GetClubDataEvent = 715;//1608 + public static final int RequestMeMenuSettingsEvent = 3906;//671 //Updated + public static final int MannequinSaveNameEvent = 2406;//2098 + public static final int SellItemEvent = 0xFF;//172 + public static final int GuildAcceptMembershipEvent = 2259;//1066 //Updated + public static final int RequestBannerToken = -1;//2619 + public static final int RequestRecylerLogicEvent = 3258;//1077 + public static final int RequestGuildJoinEvent = 2615;//77 + public static final int RequestCatalogIndexEvent = 2511;//81 + public static final int RequestInventoryPetsEvent = 263;//1900 + public static final int ModToolRequestRoomVisitsEvent = 730;//2549 + public static final int ModToolWarnEvent = -1;//3763 + public static final int RequestItemInfoEvent = 1203;//36 + public static final int ModToolRequestRoomChatlogEvent = 2312;//1903 + public static final int UserSaveLookEvent = 0x0A00;//2404 + public static final int ToggleFloorItemEvent = 3846;//120 + public static final int TradeUnAcceptEvent = 1153;//1131 + public static final int WiredTriggerSaveDataEvent = 1897;//3201 + public static final int RoomRemoveAllRightsEvent = 1404;//405 + public static final int TakeBackItemEvent = 1862;//2910 + public static final int OpenRecycleBoxEvent = 1515;//3977 + public static final int GuildChangeNameDescEvent = 1062;//3232 + public static final int RequestSellItemEvent = 1647;//2087 + public static final int ModToolChangeRoomSettingsEvent = 3458;//2530 + public static final int ModToolRequestUserChatlogEvent = -1;//203 + public static final int GuildChangeSettingsEvent = 3180;//2156 + public static final int RoomUserDropHandItemEvent = 1751;//157 + public static final int RequestProfileFriendsEvent = 866;//3925 + public static final int TradeCancelOfferItemEvent = 1033;//373 + public static final int TriggerDiceEvent = 1182;//987 + public static final int GetPollDataEvent = 2580;//1960 + public static final int MachineIDEvent = 1471;//512 + public static final int RequestDiscountEvent = 1294;//3794 + public static final int RequestFriendRequestEvent = 2485;//275 + public static final int RoomSettingsSaveEvent = 2074;//2384 + public static final int AcceptFriendRequest = 45;//333 + public static final int DeclineFriendRequest = 835; + public static final int ReleaseVersionEvent = 4000;//4000 + public static final int SearchRoomsMyFavoriteEvent = 1346;//1532 + public static final int TradeStartEvent = 3313;//466 + public static final int RequestTargetOfferEvent = 3446; //New In Production20160101 + public static final int ClientActionsMessageEvent = 2386; //New In Production20160101 + public static final int UknownMessageEventSomethingSomething = 3895; //New In Production20160101 + public static final int ChangeRelationEvent = 2112;//2521 + public static final int RoomUserSitEvent = 1565;//484 + public static final int RequestCanCreateRoomEvent = 361;//3844 //unsure + public static final int ModToolKickEvent = 3589;//3418 + public static final int MoveWallItemEvent = 609;//1029 + public static final int SearchRoomsEvent = 898;//3551 + public static final int RequestHighestScoreRoomsEvent = 2031;//1728 + public static final int CatalogBuyItemAsGiftEvent = 21;//2474 + public static final int RoomUserGiveRespectEvent = 1955;//2041 + public static final int RemoveFriendEvent = 698;//2786 + public static final int SearchRoomsFriendsOwnEvent = 642;//3478 + public static final int GuildSetFavoriteEvent = 2625;//1463 + public static final int PetPlaceEvent = 223;//3711 + public static final int BotSettingsEvent = 2544;//3098 + public static final int StalkFriendEvent = 2280;//3394 + public static final int RoomPickupItemEvent = 636;//152 + public static final int RedeemItemEvent = 1676;//3599 + public static final int RequestFriendsEvent = 2349;//776 //Updated + public static final int RequestAchievementsEvent = 2931;//2562 + public static final int GuildChangeColorsEvent = 1443;//463 <--- Updated till here. + public static final int RequestInventoryBadgesEvent = 166;//3072 + public static final int TestInventoryEvent = 2740; + public static final int RequestPetBreedsEvent = 2505;//1064 + public static final int GuildChangeBadgeEvent = 2959;//1475 + public static final int ModToolBanEvent = 2595;//2930 + public static final int SaveWardrobeEvent = 55;//637 + public static final int HotelViewEvent = 3576;//3266 + public static final int ModToolPickTicketEvent = 3973;//3975 + public static final int ModToolReleaseTicketEvent = 3800; + public static final int ModToolCloseTicketEvent = 50; + public static final int TriggerColorWheelEvent = 2651;//2367 + public static final int SearchRoomsByTagEvent = -1;//1956 + public static final int RequestPublicRoomsEvent = 1336;//3735 OLD 3178 + public static final int RequestResolutionEvent = 542;//1854 + public static final int RequestInventoryItemsEvent = 352;//372 + public static final int ModToolRoomAlertEvent = 781;//295 + public static final int WiredEffectSaveDataEvent = 3431;//3006 + public static final int CheckPetNameEvent = 159;//678 + public static final int SecureLoginEvent = 1778;//1309 //Updated + public static final int BotSaveSettingsEvent = 678;//1384 + public static final int RequestGuildBuyEvent = 2546;//872 + public static final int SearchUserEvent = 3375;//1267 + public static final int GuildConfirmRemoveMemberEvent = 649; + public static final int GuildRemoveMemberEvent = 714;//3002 + public static final int WiredConditionSaveDataEvent = 488;//1041 //3620 incorrect header? + public static final int RoomUserLookAtPoint = 3744;//1365 + public static final int MoodLightTurnOnEvent = 1826;//1181 + public static final int MoodLightSettingsEvent = 3472;//2468 + public static final int RequestMyRoomsEvent = 2955;//2676 + public static final int RequestCreditsEvent = 1207;//2138 + public static final int SearchRoomsInGroupEvent = 2002;//1160 + public static final int HorseRideSettingsEvent = 1993;//2448 + public static final int HandleDoorbellEvent = 2356; + public static final int RoomUserKickEvent = 3929;//1874 + public static final int RoomPlaceItemEvent = 579;//474 + public static final int RequestInventoryBotsEvent = 363;//1351 + public static final int RequestUserWardrobeEvent = 765;//1251 + public static final int RequestRoomRightsEvent = 2734;//2928 + public static final int RequestGuildBuyRoomsEvent = 468;//701 + public static final int BotPlaceEvent = 2321;//148 //Updated <--- Updated till here + public static final int SearchRoomsWithRightsEvent = 1272;//3785 + public static final int HotelViewRequestBonusRareEvent = 538;//1199 //Updated + public static final int GuildRemoveAdminEvent = 2725;//3264 + public static final int RequestRoomSettingsEvent = 1014;//3741 + public static final int RequestOffersEvent = 442;//541 + public static final int RequestUserCitizinShipEvent = 1605;//3096 + public static final int RoomUserStopTypingEvent = 1114;//2005 + public static final int RoomUserStartTypingEvent = 3362;//3684 + public static final int RequestGuildManageEvent = 2547;//2418 + public static final int RequestUserClubEvent = 12;//3874 //Updated + public static final int PetPickupEvent = 2342;//863 + public static final int RequestOwnGuildsEvent = 3046;//2240 + public static final int SearchRoomsVisitedEvent = 1475;//589 + public static final int TradeOfferItemEvent = 114;//2223 + public static final int TradeConfirmEvent = 2399;//1144 + public static final int RoomUserGiveRightsEvent = 3574;//2221 + public static final int RequestGuildInfoEvent = 3211;//2079 + public static final int ReloadRecyclerEvent = 1715;//2779 //Updated + public static final int RoomUserActionEvent = 3639;//475 + public static final int RequestGiftConfigurationEvent = 1928;//382 + public static final int RequestRoomDataEvent = 1164;//183 //Updated + public static final int RequestRoomHeightmapEvent = 2768; + public static final int RequestGuildFurniWidgetEvent = 41;//3031 + public static final int RequestOwnItemsEvent = 3829;//829 + public static final int RequestReportRoomEvent = 1839; + public static final int ReportEvent = 963; + public static final int TriggerOneWayGateEvent = 0x0B00; + public static final int FloorPlanEditorSaveEvent = 1287; + public static final int FloorPlanEditorRequestDoorSettingsEvent = 2623; + public static final int FloorPlanEditorRequestBlockedTilesEvent = 24; + public static final int UnknownEvent1 = 3672; + public static final int RequestTalenTrackEvent = 1284; + public static final int RequestNewNavigatorDataEvent = 882; //Updated + public static final int RequestNewNavigatorRoomsEvent = 2722; + public static final int RedeemClothingEvent = 818; + public static final int NewNavigatorActionEvent = 1874; + public static final int PostItPlaceEvent = 425; + public static final int PostItRequestDataEvent = 2796; + public static final int PostItSaveDataEvent = 342; + public static final int PostItDeleteEvent = 2777; + public static final int MoodLightSaveSettingsEvent = 856; + public static final int ModToolRequestIssueChatlogEvent = 3484; + public static final int ModToolRequestRoomUserChatlogEvent = 695; + public static final int UsernameEvent = 2577; + public static final int RequestClubGiftsEvent = 3302; + public static final int RentSpaceEvent = 3486; + public static final int RentSpaceCancelEvent = 1314; + public static final int RequestInitFriendsEvent = 2151; //Updated + public static final int RequestCameraConfigurationEvent = 1341; + public static final int PingEvent = 1789; //Updated + public static final int FindNewFriendsEvent = 1264; + public static final int InviteFriendsEvent = 2694; + public static final int GuildRemoveFavoriteEvent = 1412; + public static final int GuildDeleteEvent = 747; + public static final int SetHomeRoomEvent = 2501; + public static final int RoomUserGiveHandItemEvent = 3315; + public static final int AmbassadorVisitCommandEvent = 1098; + public static final int AmbassadorAlertCommandEvent = 1068; + public static final int SaveUserVolumesEvent = 3820; + public static final int SavePreferOldChatEvent = 2006; + public static final int SaveIgnoreRoomInvitesEvent = 1379; + public static final int SaveBlockCameraFollowEvent = 526; + public static final int RoomMuteEvent = 2462; + public static final int RequestRoomWordFilterEvent = 1348; + public static final int RoomWordFilterModifyEvent = 0x0100; + public static final int RequestRoomUserTagsEvent = 1722; + public static final int CatalogSearchedItemEvent = 2180; + public static final int JukeBoxRequestTrackCodeEvent = 3585; + public static final int JukeBoxRequestTrackDataEvent = 3418; + public static final int JukeBoxAddSoundTrackEvent = 1878; + public static final int RoomStaffPickEvent = 510; + public static final int RoomRequestBannedUsersEvent = 581; + public static final int JukeBoxRequestPlayListEvent = 2541; + public static final int JukeBoxEventOne = 1042; + public static final int JukeBoxEventTwo = 815; + public static final int RoomUserMuteEvent = 2997; + //public static final int JukeBoxEventThree = 3846; + public static final int RequestDeleteRoomEvent = 722; + public static final int RequestPromotionRoomsEvent = 3616; + public static final int BuyRoomPromotionEvent = 3078; + public static final int RequestGuideToolEvent = 3716; + public static final int RequestGuideAssistanceEvent = 491; + public static final int GuideUserTypingEvent = 3333; + public static final int GuideReportHelperEvent = 121; + public static final int GuideRecommendHelperEvent = 116; + public static final int GuideUserMessageEvent = 3392; + public static final int GuideCancelHelpRequestEvent = 3530; + public static final int GuideHandleHelpRequestEvent = 2975; + public static final int GuideVisitUserEvent = 3325; + public static final int GuideInviteUserEvent = 918; + public static final int GuideCloseHelpRequestEvent = 1100; + public static final int GuardianNoUpdatesWantedEvent = 1006; + public static final int GuardianVoteEvent = 1913; + public static final int GuardianAcceptRequestEvent = 3668; + public static final int RequestGameConfigurationsEvent = 2993; //Updated + public static final int RequestAchievementConfigurationEvent = 751; //Updated + public static final int RequestReportUserBullyingEvent = 2973; + public static final int ReportBullyEvent = 1803; + public static final int CameraRoomPictureEvent = 2274; + public static final int CameraRoomThumbnailEvent = 1366; + public static final int SavePostItStickyPoleEvent = 3155; + public static final int HotelViewRequestCommunityGoalEvent = 2059; + public static final int HotelViewRequestConcurrentUsersEvent = 484; + public static final int HotelViewConcurrentUsersButtonEvent = 2295; + public static final int IgnoreRoomUserEvent = 2394; + public static final int UnIgnoreRoomUserEvent = 3023; + public static final int UnbanRoomUserEvent = 3060; + public static final int RoomUserBanEvent = 3940; + public static final int RequestNavigatorSettingsEvent = 1086; + public static final int SaveWindowSettingsEvent = 272; + public static final int GetHabboGuildBadgesMessageEvent = 301; + public static final int EditRoomPromotionMessageEvent = 3707; + + public static final int RequestCraftingRecipesEvent = 426; + public static final int RequestCraftingRecipesAvailableEvent = 1653; + public static final int CraftingAddRecipeEvent = 3654; + public static final int CraftingCraftItemEvent = 2934; + public static final int CraftingCraftSecretEvent = 1622; + + public static final int AdventCalendarOpenDayEvent = 724; + public static final int AdventCalendarForceOpenEvent = 2879; + public static final int CameraPurchaseEvent = 1903; + public static final int RoomFavoriteEvent = 3092; + + public static final int YoutubeRequestPlayListEvent = 3517; + public static final int YoutubeRequestNextVideoEvent = 1843; + public static final int YoutubeRequestVideoDataEvent = 890; + public static final int StartSafetyQuizEvent = 2652; +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/Incoming_Back.java b/src/main/java/com/eu/habbo/messages/incoming/Incoming_Back.java new file mode 100644 index 00000000..ab741322 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/Incoming_Back.java @@ -0,0 +1,718 @@ +package com.eu.habbo.messages.incoming; + +public class Incoming_Back +{ + + + /* + Achievements + */ + //public static final int RequestAchievementsEvent = 2562; + + /* + Wired + */ + /*public static final int WiredTriggerSaveDataEvent = 3201; + public static final int WiredEffectSaveDataEvent = 3006; + public static final int WiredConditionSaveDataEvent = 1041;*/ + + /* + Pets + */ + /*public static final int RequestPetInformationEvent = 777; + public static final int PetPickupEvent = 863; + public static final int ScratchPetEvent = 3464; + public static final int RequestPetTrainingPanelEvent = 2476; + public static final int HorseUseItemEvent = 1616; + public static final int HorseRideSettingsEvent = 2448; + public static final int HorseRideEvent = 3268;*/ + + /* + Groups + */ + /* public static final int RequestGuildBuyRoomsEvent = 701; + public static final int RequestGuildPartsEvent = 2344; + public static final int RequestGuildBuyEvent = 872; + public static final int RequestGuildInfoEvent = 2079; + public static final int RequestGuildManageEvent = 2418; + public static final int RequestGuildMembersEvent = 2382; + public static final int RequestGuildJoinEvent = 77; + public static final int GuildChangeNameDescEvent = 3232; + public static final int GuildChangeBadgeEvent = 1475; + public static final int GuildChangeColorsEvent = 463; + public static final int GuildRemoveMemberEvent = 3002; + public static final int GuildRemoveAdminEvent = 3264; + public static final int GuildChangeSettingsEvent = 2156; + public static final int GuildAcceptMembershipEvent = 1066; + public static final int GuildDeclineMembershipEvent = 1320; + public static final int GuildSetAdminEvent = 2957; + public static final int GuildSetFavoriteEvent = 1463; + public static final int RequestOwnGuildsEvent = 2240; + public static final int RequestGuildFurniWidgetEvent = 3031; + + /* + Trading + */ + /*public static final int TradeStartEvent = 466; + public static final int TradeOfferItemEvent = 2223; + public static final int TradeCancelOfferItemEvent = 373; + public static final int TradeAcceptEvent = 1062; + public static final int TradeUnAcceptEvent = 1131; + public static final int TradeConfirmEvent = 1144; + public static final int TradeCloseEvent = 3387; + + /* + ModTool + */ + /* public static final int ModToolRequestRoomInfoEvent = 225; + public static final int ModToolRequestRoomChatlogEvent = 1903; + public static final int ModToolRequestUserInfoEvent = 3077; + public static final int ModToolPickTicketEvent = 3975; + public static final int ModToolAlertEvent = 1980; + public static final int ModToolKickEvent = 3418; + public static final int ModToolBanEvent = 2930; + public static final int ModToolWarnEvent = 3763; + public static final int ModToolRequestUserChatlogEvent = 203; + public static final int ModToolRoomAlertEvent = 295; + public static final int ModToolChangeRoomSettingsEvent = 2530; + public static final int ModToolRequestRoomVisitsEvent = 2549; + + /* + Catalog + */ + /*public static final int Unknown3 = 3794; //Catalogue Initialized Composer? + public static final int RequestRecylerLogicEvent = 1077; + public static final int RequestCatalogIndexEvent = 81; + public static final int GetMarketplaceConfigEvent = 1952; //Configuration IDs composer? + public static final int RequestDiscountEvent = 3794; + public static final int RequestCatalogModeEvent = 3406; + public static final int RequestGiftConfigurationEvent = 382; + public static final int RequestCatalogPageEvent = 1754; + public static final int CatalogBuyItemEvent = 2967; + public static final int CatalogBuyItemAsGiftEvent = 2474; + public static final int RedeemVoucherEvent = 1571; + public static final int ReloadRecyclerEvent = 2779; + public static final int RecycleEvent = 2318; + public static final int OpenRecycleBoxEvent = 3977; + public static final int RequestPetBreedsEvent = 1064; + public static final int CheckPetNameEvent = 678; + public static final int GetClubDataEvent = 1608; + + /* + Polls + */ + /* public static final int CancelPollEvent = 276; + public static final int GetPollDataEvent = 1960; + public static final int AnswerPollEvent = 1847; + + /* + Marketplace + */ + /*public static final int RequestOwnItemsEvent = 829; + public static final int TakeBackItemEvent = 2910; + public static final int RequestOffersEvent = 541; + public static final int RequestItemInfoEvent = 36; + public static final int BuyItemEvent = 3878; + public static final int RequestSellItemEvent = 2087; + public static final int SellItemEvent = 172; + public static final int RequestCreditsEvent = 2138; + + + /* + Handshake + */ + /* public static final int ReleaseVersionEvent = 4000; + public static final int RequestBannerToken = 2619; + public static final int GenerateSecretKeyEvent = 3575; + public static final int MachineIDEvent = 512; + public static final int SecureLoginEvent = 1309; + + /* + Friends + */ + /*public static final int RequestFriendsEvent = 776; + public static final int ChangeRelationEvent = 2521; + public static final int RemoveFriendEvent = 2786; + public static final int SearchUserEvent = 1267; + public static final int FriendRequestEvent = 3765; + public static final int AcceptFriendRequest = 333; + public static final int FriendPrivateMessageEvent = 1527; + public static final int RequestFriendRequestEvent = 275; + public static final int StalkFriendEvent = 3394; + + /* + HotelView + */ + /* public static final int HotelViewEvent = 3266; + public static final int RequestBonusRareEvent = 1199; + public static final int RequestNewsListEvent = 896; + public static final int HotelViewDataEvent = 595; + + /* + Navigator + */ + /*public static final int RequestRoomCategoriesEvent = 1431; + public static final int RequestPublicRoomsEvent = 3735; + public static final int RequestPopularRoomsEvent = 235; + public static final int RequestHighestScoreRoomsEvent = 1728; + public static final int RequestMyRoomsEvent = 2676; + public static final int RequestCanCreateRoomEvent = 3844; + public static final int RequestPromotedRoomsEvent = 3030; + public static final int RequestCreateRoomEvent = 3524; + public static final int RequestTagsEvent = 1337; + public static final int SearchRoomsByTagEvent = 1956; + public static final int SearchRoomsEvent = 3551; + public static final int SearchRoomsFriendsNowEvent = 3306; + public static final int SearchRoomsFriendsOwnEvent = 3478; + public static final int SearchRoomsWithRightsEvent = 3785; + public static final int SearchRoomsInGroupEvent = 1160; + public static final int SearchRoomsMyFavoriteEvent = 1532; + public static final int SearchRoomsVisitedEvent = 589; + + + /* + Rooms + */ + /* public static final int RequestRoomLoadEvent = 3751; //3751 + public static final int RoomVoteEvent = 242; + public static final int RequestRoomSettingsEvent = 3741; + public static final int RequestHeightmapEvent = 308; + public static final int RequestRoomDataEvent = 183; + public static final int RoomSettingsSaveEvent = 2384; + public static final int RoomUserTalkEvent = 3349; + public static final int RoomUserShoutEvent = 936; + public static final int RoomUserWhisperEvent = 1362; + public static final int RoomUserActionEvent = 475; + public static final int RoomUserSitEvent = 484; + public static final int RoomUserDanceEvent = 1139; + public static final int RoomUserSignEvent = 2189; + public static final int RoomUserGiveRespectEvent = 2041; + public static final int RoomUserWalkEvent = 951; + public static final int RoomPlaceItemEvent = 474; + public static final int RotateMoveItemEvent = 194; + public static final int MoveWallItemEvent = 1029; + public static final int RoomPickupItemEvent = 152; + public static final int RoomPlacePaintEvent = 874; + public static final int RoomUserStartTypingEvent = 3684; + public static final int RoomUserStopTypingEvent = 2005; + public static final int ToggleFloorItemEvent = 120; + public static final int ToggleWallItemEvent = 2650; + public static final int RoomUserLookAtPoint = 1365; + public static final int RoomBackgroundEvent = 2715; + public static final int MannequinSaveNameEvent = 2098; + public static final int MannequinSaveLookEvent = 1804; + public static final int AdvertisingSaveEvent = 68; + public static final int RoomUserDropHandItemEvent = 157; + public static final int BotPlaceEvent = 148; + public static final int BotPickupEvent = 2865; + public static final int BotSaveSettingsEvent = 1384; + public static final int BotSettingsEvent = 3098; + public static final int TriggerDiceEvent = 987; + public static final int CloseDiceEvent = 1739; + public static final int TriggerColorWheelEvent = 2367; + public static final int MoodLightSettingsEvent = 2468; + public static final int MoodLightTurnOnEvent = 1181; + public static final int RedeemItemEvent = 3599; + public static final int RequestRoomRightsEvent = 2928; + public static final int RoomRemoveAllRightsEvent = 405; + public static final int RoomUserGiveRightsEvent = 2221; + public static final int RoomUserRemoveRightsEvent = 3639; + public static final int PetPlaceEvent = 3711; + public static final int RoomUserKickEvent = 1874; + public static final int SetStackHelperHeightEvent = 2540; + + /* + Users + */ + /* public static final int RequestUserDataEvent = 112; + public static final int RequestUserCreditsEvent = 938; + public static final int RequestUserClubEvent = 3874; + public static final int RequestMeMenuSettingsEvent = 671; + public static final int RequestUserCitizinShipEvent = 3096; + public static final int RequestUserProfileEvent = 532; + public static final int RequestProfileFriendsEvent = 3925; + public static final int RequestUserTagsEvent = 3102; + public static final int RequestUserWardrobeEvent = 1251; + public static final int SaveWardrobeEvent = 637; + public static final int UserSaveLookEvent = 2404; + public static final int SaveMottoEvent = 2832; + public static final int UserWearBadgeEvent = 2473; + public static final int RequestWearingBadgesEvent = 3968; + + /* + Inventory + */ + /* public static final int RequestInventoryItemsEvent = 372; // 1223 + public static final int RequestInventoryPetsEvent = 1900; + public static final int RequestInventoryBadgesEvent = 3072; + public static final int RequestInventoryBotsEvent = 1351; + + /* + Not correctly implemented + */ + /*public static final int RequestResolutionEvent = 1854;*/ + + /*public static final int MannequinSaveLookEvent = 2252;//1804 + public static final int RequestCatalogPageEvent = 1904;//1754 + public static final int RequestWearingBadgesEvent = 3364;//3968 + public static final int BotPickupEvent = 1890;//2865 + public static final int HorseRideEvent = 1425;//3268 + public static final int RequestCreateRoomEvent = 1075;//3524 + public static final int SaveMottoEvent = 3060;//2832 + public static final int GenerateSecretKeyEvent = 2342;//3575 + public static final int ModToolAlertEvent = 641;//1980 + public static final int TradeAcceptEvent = 843;//1062 + public static final int RequestCatalogModeEvent = 2941;//3406 + public static final int RequestUserCreditsEvent = 3985;//938 + public static final int FriendPrivateMessageEvent = 2046;//1527 + public static final int CloseDiceEvent = 2438;//1739 + public static final int RoomUserRemoveRightsEvent = 1872;//3639 + public static final int GuildDeclineMembershipEvent = 3464;//1320 + public static final int AnswerPollEvent = 3647;//1847 + public static final int UserWearBadgeEvent = 2265;//2473 + public static final int RoomVoteEvent = -242;//242 + public static final int RoomUserSignEvent = 1037;//2189 + public static final int RequestUserDataEvent = 3243;//112 + public static final int RoomUserShoutEvent = 1559;//936 + public static final int ScratchPetEvent = 2363;//3464 + public static final int RoomUserWalkEvent = 3264;//951 + public static final int RequestUserTagsEvent = 3364;//3102 + public static final int RequestTagsEvent = 3906;//1337 + public static final int GetMarketplaceConfigEvent = 1142;//1952 + public static final int RequestHeightmapEvent = 2450;//308 + public static final int TradeCloseEvent = 759;//3387 + public static final int CatalogBuyItemEvent = 3269;//2967 + public static final int RequestGuildMembersEvent = 556;//2382 + public static final int RequestPetInformationEvent = 1330;//777 + public static final int RoomUserWhisperEvent = 3700;//1362 + public static final int ModToolRequestUserInfoEvent = 852;//3077 + public static final int RotateMoveItemEvent = 3753;//194 + public static final int CancelPollEvent = 797;//276 + public static final int RequestRoomLoadEvent = 2144;//3751 //2086 //2144 + public static final int RequestGuildPartsEvent = 2165;//2344 + public static final int RoomPlacePaintEvent = 2534;//874 + public static final int RequestPopularRoomsEvent = 1627;//2346;//235 + public static final int ModToolRequestRoomInfoEvent = 346;//225 + public static final int FriendRequestEvent = 3667;//3765 + public static final int RecycleEvent = 2627;//2318 + public static final int RequestRoomCategoriesEvent = 783;//1431 + public static final int ToggleWallItemEvent = 3649;//2650 + public static final int RoomUserTalkEvent = 2462;//3349 + public static final int HotelViewDataEvent = 3813;//595 + public static final int RoomUserDanceEvent = 1764;//1139 + public static final int RequestUserProfileEvent = 1299;//532 + public static final int SearchRoomsFriendsNowEvent = 542;//3306 + public static final int SetStackHelperHeightEvent = 3280;//2540 + public static final int RedeemVoucherEvent = 114;//1571 + public static final int HorseUseItemEvent = 1105;//1616 + public static final int BuyItemEvent = 3161;//3878 + public static final int AdvertisingSaveEvent = 3645;//68 + public static final int RequestPetTrainingPanelEvent = 2867;//2476 + public static final int RoomBackgroundEvent = 1275;//2715 + public static final int RequestNewsListEvent = 1205;//896 + public static final int RequestPromotedRoomsEvent = 3527;//3030 + public static final int GuildSetAdminEvent = 1954;//2957 + public static final int GetClubDataEvent = 1232;//1608 + public static final int RequestMeMenuSettingsEvent = 254;//671 + public static final int MannequinSaveNameEvent = 2872;//2098 + public static final int SellItemEvent = 1147;//172 + public static final int GuildAcceptMembershipEvent = 816;//1066 + public static final int RequestBannerToken = 1497;//2619 + public static final int RequestRecylerLogicEvent = 2669;//1077 + public static final int RequestGuildJoinEvent = 1971;//77 + public static final int RequestCatalogIndexEvent = 1789;//81 + public static final int RequestInventoryPetsEvent = 3555;//1900 + public static final int ModToolRequestRoomVisitsEvent = 1854;//2549 + public static final int ModToolWarnEvent = 2891;//3763 + public static final int RequestItemInfoEvent = 2326;//36 + public static final int ModToolRequestRoomChatlogEvent = 2285;//1903 + public static final int UserSaveLookEvent = 2889;//2404 + public static final int ToggleFloorItemEvent = 2970;//120 + public static final int TradeUnAcceptEvent = 1287;//1131 + public static final int WiredTriggerSaveDataEvent = 3931;//3201 + public static final int RoomRemoveAllRightsEvent = 36;//405 + public static final int TakeBackItemEvent = 560;//2910 + public static final int OpenRecycleBoxEvent = 3502;//3977 + public static final int GuildChangeNameDescEvent = 3503;//3232 + public static final int RequestSellItemEvent = 1380;//2087 + public static final int ModToolChangeRoomSettingsEvent = 2571;//2530 + public static final int ModToolRequestUserChatlogEvent = 600;//203 + public static final int GuildChangeSettingsEvent = 1026;//2156 + public static final int RoomUserDropHandItemEvent = 1699;//157 + public static final int RequestProfileFriendsEvent = 3510;//3925 + public static final int TradeCancelOfferItemEvent = 2646;//373 + public static final int TriggerDiceEvent = 1000;//987 + public static final int GetPollDataEvent = 491;//1960 + public static final int MachineIDEvent = -512;//512 + public static final int RequestDiscountEvent = 458;//3794 + public static final int RequestFriendRequestEvent = 1823;//275 + public static final int RoomSettingsSaveEvent = 1824;//2384 + public static final int AcceptFriendRequest = 3110;//333 + public static final int ReleaseVersionEvent = 4000;//4000 + public static final int SearchRoomsMyFavoriteEvent = 1181;//1532 + public static final int TradeStartEvent = 2842;//466 + public static final int ChangeRelationEvent = 668;//2521 + public static final int RoomUserSitEvent = 2292;//484 + public static final int RequestCanCreateRoomEvent = 3929;//3844 + public static final int ModToolKickEvent = 1132;//3418 + public static final int MoveWallItemEvent = 3043;//1029 + public static final int SearchRoomsEvent = 2188;//3551 + public static final int RequestHighestScoreRoomsEvent = 1379;//1728 + public static final int CatalogBuyItemAsGiftEvent = 3186;//2474 + public static final int RoomUserGiveRespectEvent = 2901;//2041 + public static final int RemoveFriendEvent = 3767;//2786 + public static final int SearchRoomsFriendsOwnEvent = 1870;//3478 + public static final int GuildSetFavoriteEvent = 2864;//1463 + public static final int PetPlaceEvent = 81;//3711 + public static final int BotSettingsEvent = 3630;//3098 + public static final int StalkFriendEvent = 3829;//3394 + public static final int RoomPickupItemEvent = 2316;//152 + public static final int RedeemItemEvent = 3333;//3599 + public static final int RequestFriendsEvent = 2386;//776 + public static final int RequestAchievementsEvent = 3474;//2562 + public static final int GuildChangeColorsEvent = 3260;//463 + public static final int RequestInventoryBadgesEvent = 2480;//3072 + public static final int RequestPetBreedsEvent = 3851;//1064 + public static final int GuildChangeBadgeEvent = 2754;//1475 + public static final int ModToolBanEvent = 574;//2930 + public static final int SaveWardrobeEvent = 1188;//637 + public static final int HotelViewEvent = 1784;//3266 + public static final int ModToolPickTicketEvent = 3088;//3975 + public static final int ModToolReleaseTicketEvent = 734; + public static final int ModToolCloseTicketEvent = 1837; + public static final int TriggerColorWheelEvent = 2882;//2367 + public static final int SearchRoomsByTagEvent = -1956;//1956 + public static final int RequestPublicRoomsEvent = 2021;//3735 //UPDATED OLD 3178 + public static final int RequestResolutionEvent = 3871;//1854 + public static final int Unknown3 = 458;//3794 + public static final int RequestInventoryItemsEvent = 1920;//372 + public static final int ModToolRoomAlertEvent = 1863;//295 + public static final int WiredEffectSaveDataEvent = 1645;//3006 + public static final int CheckPetNameEvent = 3567;//678 + public static final int SecureLoginEvent = 1957;//1309 + public static final int BotSaveSettingsEvent = 736;//1384 + public static final int RequestGuildBuyEvent = 2594;//872 + public static final int SearchUserEvent = 3026;//1267 + public static final int GuildRemoveMemberEvent = 353;//3002 + public static final int WiredConditionSaveDataEvent = 2096;//1041 + public static final int RoomUserLookAtPoint = 2115;//1365 + public static final int MoodLightTurnOnEvent = 883;//1181 + public static final int MoodLightSettingsEvent = 3878;//2468 + public static final int RequestMyRoomsEvent = 2360;//2676 + public static final int RequestCreditsEvent = 1623;//2138 + public static final int SearchRoomsInGroupEvent = 2066;//1160 + public static final int HorseRideSettingsEvent = 1731;//2448 + public static final int HandleDoorbellEvent = 91; + public static final int RoomUserKickEvent = 1718;//1874 + public static final int RoomPlaceItemEvent = 2554;//474 + public static final int RequestInventoryBotsEvent = 3549;//1351 + public static final int RequestUserWardrobeEvent = 3057;//1251 + public static final int RequestRoomRightsEvent = 2197;//2928 + public static final int RequestGuildBuyRoomsEvent = 1035;//701 + public static final int BotPlaceEvent = 2143;//148 + public static final int SearchRoomsWithRightsEvent = 307;//3785 + public static final int RequestBonusRareEvent = 1966;//1199 + public static final int GuildRemoveAdminEvent = 864;//3264 + public static final int RequestRoomSettingsEvent = 2176;//3741 + public static final int RequestOffersEvent = 2688;//541 + public static final int RequestUserCitizinShipEvent = 2151;//3096 + public static final int RoomUserStopTypingEvent = 3890;//2005 + public static final int RoomUserStartTypingEvent = 3896;//3684 + public static final int RequestGuildManageEvent = 3169;//2418 + public static final int RequestUserClubEvent = 2189;//3874 + public static final int PetPickupEvent = -3167;//863 + public static final int RequestOwnGuildsEvent = 484;//2240 + public static final int SearchRoomsVisitedEvent = 24;//589 + public static final int TradeOfferItemEvent = 1324;//2223 + public static final int TradeConfirmEvent = 3866;//1144 + public static final int RoomUserGiveRightsEvent = 3167;//2221 + public static final int RequestGuildInfoEvent = 331;//2079 + public static final int ReloadRecyclerEvent = 72;//2779 + public static final int RoomUserActionEvent = 2000;//475 + public static final int RequestGiftConfigurationEvent = 102;//382 + public static final int RequestRoomDataEvent = 2086;//183 + public static final int RequestRoomHeightmapEvent = 3075; + public static final int RequestGuildFurniWidgetEvent = 3239;//3031 + public static final int RequestOwnItemsEvent = 1486;//829 + public static final int RequestReportRoomEvent = 2343; + public static final int ReportEvent = 330; + public static final int TriggerOneWayGateEvent = 408; + public static final int FloorPlanEditorSaveEvent = 2324; + public static final int FloorPlanEditorRequestDoorSettingsEvent = 1168; + public static final int FloorPlanEditorRequestBlockedTilesEvent = 1241;*/ + + public static final int MannequinSaveLookEvent = 3770;//1804 //Updated + public static final int RequestCatalogPageEvent = 2914;//1754 //Updated + public static final int RequestWearingBadgesEvent = 3466;//3968 //Updated + public static final int BotPickupEvent = 665;//2865 //Updated + public static final int HorseRideEvent = 1027;//3268 //Updated + public static final int RequestCreateRoomEvent = 238;//3524 //Updated + public static final int SaveMottoEvent = 289;//2832 //Updated //1037 + public static final int GenerateSecretKeyEvent = -1;//3575 + public static final int ModToolAlertEvent = 2890;//1980 //Updated + public static final int TradeAcceptEvent = 368;//1062 //Updated + public static final int RequestCatalogModeEvent = 2711;//3406 //Updated + public static final int RequestUserCreditsEvent = 2845;//938 //Updated + public static final int FriendPrivateMessageEvent = 3710;//1527 //Updated + public static final int CloseDiceEvent = 57;//1739 //Updated + public static final int RoomUserRemoveRightsEvent = 1599;//3639 //Updated + public static final int GuildDeclineMembershipEvent = 1328;//1320 //Updated + public static final int AnswerPollEvent = 2135;//1847 //Updated + public static final int UserWearBadgeEvent = 741;//2473 //Updated + public static final int RoomVoteEvent = -242;//242 + public static final int RoomUserSignEvent = 2065;//2189 //Updated + public static final int RequestUserDataEvent = 882;//112 //Updated + public static final int RoomUserShoutEvent = 1788;//936 //Updated + public static final int ScratchPetEvent = 965;//3464 //Updated + public static final int RoomUserWalkEvent = 3690;//951 //Updated + public static final int RequestUserTagsEvent = 3430;//3102 //Updated + public static final int RequestTagsEvent = 753;//1337 //Updated + public static final int GetMarketplaceConfigEvent = 3774;//1952 //Updated + public static final int RequestHeightmapEvent = 859;//308 //Updated + public static final int TradeCloseEvent = 3012;//3387 //Updated + public static final int CatalogBuyItemEvent = 3964;//2967 //Updated + public static final int RequestGuildMembersEvent = 3204;//2382 //Updated + public static final int RequestPetInformationEvent = 2827;//777 //Updated + public static final int RoomUserWhisperEvent = 3908;//1362 //Updated + public static final int ModToolRequestUserInfoEvent = 607;//3077 //Updated + public static final int RotateMoveItemEvent = 1219;//194 //Updated + public static final int CancelPollEvent = 1628;//276 //Updated + public static final int RequestRoomLoadEvent = 1988;//3751 //2086 //2144 //Updated + public static final int RequestGuildPartsEvent = 1902;//2344 //Updated + public static final int RoomPlacePaintEvent = 1892;//874 //Updated + public static final int RequestPopularRoomsEvent = 464;//2346;//235 //Updated + public static final int ModToolRequestRoomInfoEvent = 1450;//225 //Updated + public static final int FriendRequestEvent = 2791;//3765 //Updated + public static final int RecycleEvent = 3277;//2318 //Updated + public static final int RequestRoomCategoriesEvent = 3498;//1431 //Updated + public static final int ToggleWallItemEvent = 3050;//2650 //Updated + public static final int RoomUserTalkEvent = 104;//3349 //Updated + public static final int HotelViewDataEvent = 2507;//595 //Updated //2269 + public static final int RoomUserDanceEvent = 649;//1139 //Updated + public static final int RequestUserProfileEvent = 1389;//532 //Updated + public static final int SearchRoomsFriendsNowEvent = 1082;//3306 //Updated + public static final int SetStackHelperHeightEvent = 2790;//2540 //Updated + public static final int RedeemVoucherEvent = 3024;//1571 //Updated + public static final int HorseUseItemEvent = 2590;//1616 //Updated + public static final int BuyItemEvent = 2847;//3878 //Updated + public static final int AdvertisingSaveEvent = 1829;//68 //Updated + public static final int RequestPetTrainingPanelEvent = 2251;//2476 //Updated + public static final int RoomBackgroundEvent = 2496;//2715 //Updated + public static final int RequestNewsListEvent = 1134;//896 //Updated + public static final int RequestPromotedRoomsEvent = 1558;//3030 //Updated + public static final int GuildSetAdminEvent = 3704;//2957 //Updated + public static final int GetClubDataEvent = 3240;//1608 //Updated + public static final int RequestMeMenuSettingsEvent = 2169;//671 //Updated + public static final int MannequinSaveNameEvent = 1289;//2098 //Updated + public static final int SellItemEvent = 1522;//172 //Updated + public static final int GuildAcceptMembershipEvent = 538;//1066 //Updated + public static final int RequestBannerToken = -1;//2619 + public static final int RequestRecylerLogicEvent = 1170;//1077 //Updated + public static final int RequestGuildJoinEvent = 794;//77 //Updated + public static final int RequestCatalogIndexEvent = 2806;//81 //Updated + public static final int RequestInventoryPetsEvent = 3760;//1900 //Updated + public static final int ModToolRequestRoomVisitsEvent = 2287;//2549 //Updated + public static final int ModToolWarnEvent = 2890;//3763 //Updated + public static final int RequestItemInfoEvent = 2042;//36 //Updated + public static final int ModToolRequestRoomChatlogEvent = 3209;//1903 //Updated + public static final int UserSaveLookEvent = 2242;//2404 //Updated + public static final int ToggleFloorItemEvent = 2693;//120 //Updated + public static final int TradeUnAcceptEvent = 126;//1131 //Updated + public static final int WiredTriggerSaveDataEvent = 3593;//3201 //Updated + public static final int RoomRemoveAllRightsEvent = 3764;//405 //Updated + public static final int TakeBackItemEvent = 1455;//2910 //Updated + public static final int OpenRecycleBoxEvent = 0x0F00;//3977 //Updated + public static final int GuildChangeNameDescEvent = 1485;//3232 //Updated + public static final int RequestSellItemEvent = 876;//2087 //Updated + public static final int ModToolChangeRoomSettingsEvent = 3244;//2530 //Updated + public static final int ModToolRequestUserChatlogEvent = 3209;//203 //Updated + public static final int GuildChangeSettingsEvent = 2258;//2156 //Updated + public static final int RoomUserDropHandItemEvent = 1108;//157 //Updated + public static final int RequestProfileFriendsEvent = 3701;//3925 //Updated + public static final int TradeCancelOfferItemEvent = 2170;//373 //Updated + public static final int TriggerDiceEvent = 386;//987 //Updated + public static final int GetPollDataEvent = 2263;//1960 //Updated + public static final int MachineIDEvent = 686;//512 + public static final int RequestDiscountEvent = 1995;//3794 //Updated + public static final int RequestFriendRequestEvent = 3739;//275 //Updated + public static final int RoomSettingsSaveEvent = 1290;//2384 //Updated + public static final int AcceptFriendRequest = 3383;//333 //Updated + public static final int ReleaseVersionEvent = 4000;//4000 //Updated + public static final int SearchRoomsMyFavoriteEvent = 3124;//1532 //Updated + public static final int TradeStartEvent = 3304;//466 //Updated + public static final int ChangeRelationEvent = 2632;//2521 //Updated + public static final int RoomUserSitEvent = 272;//484 //Updated + public static final int RequestCanCreateRoomEvent = 3903;//3844 //Updated //unsure + public static final int ModToolKickEvent = 1459;//3418 //Updated + public static final int MoveWallItemEvent = 3455;//1029 //Updated + public static final int SearchRoomsEvent = 3844;//3551 //Updated + public static final int RequestHighestScoreRoomsEvent = 1814;//1728 //Updaed + public static final int CatalogBuyItemAsGiftEvent = 1066;//2474 //Updated + public static final int RoomUserGiveRespectEvent = 3121;//2041 //Updated + public static final int RemoveFriendEvent = 1535;//2786 //Updated + public static final int SearchRoomsFriendsOwnEvent = 725;//3478 //Updated + public static final int GuildSetFavoriteEvent = 2754;//1463 //Updated + public static final int PetPlaceEvent = 1961;//3711 //Updated + public static final int BotSettingsEvent = 3292;//3098 //Updated + public static final int StalkFriendEvent = 1925;//3394 //Updated + public static final int RoomPickupItemEvent = 2463;//152 //Updated + public static final int RedeemItemEvent = 1242;//3599 //Updated + public static final int RequestFriendsEvent = 1904;//776 //Updated + public static final int RequestAchievementsEvent = 2697;//2562 //Updated + public static final int GuildChangeColorsEvent = 3873;//463 //Updated + public static final int RequestInventoryBadgesEvent = 2450;//3072 //Updated + public static final int RequestPetBreedsEvent = 2828;//1064 //Updated + public static final int GuildChangeBadgeEvent = 838;//1475 //Updated + public static final int ModToolBanEvent = 701;//2930 //Updated + public static final int SaveWardrobeEvent = 2921;//637 //Updated + public static final int HotelViewEvent = 3603;//3266 //Updated + public static final int ModToolPickTicketEvent = 2980;//3975 //Updated + public static final int ModToolReleaseTicketEvent = 3905; //Updated + public static final int ModToolCloseTicketEvent = 3904; //Updated + public static final int TriggerColorWheelEvent = 2556;//2367 //Updated + public static final int SearchRoomsByTagEvent = 3844;//1956 //Updated + public static final int RequestPublicRoomsEvent = 2057;//3735 //UPDATED OLD 3178 //Updated + public static final int RequestResolutionEvent = 305;//1854 //Updated + public static final int RequestInventoryItemsEvent = 2194;//372 //Updated + public static final int ModToolRoomAlertEvent = 2550;//295 //Updated + public static final int WiredEffectSaveDataEvent = 2856;//3006 //Updated + public static final int CheckPetNameEvent = 3699;//678 //Updated + public static final int SecureLoginEvent = 2243;//1309 //Updated + public static final int BotSaveSettingsEvent = 1607;//1384 //Updated + public static final int RequestGuildBuyEvent = 569;//872 //Updated + public static final int SearchUserEvent = 3576;//1267 //Updated + public static final int GuildConfirmRemoveMemberEvent = 3394; + public static final int GuildRemoveMemberEvent = 1764;//3002 //Updated + public static final int WiredConditionSaveDataEvent = 3268;//1041 //Updated + public static final int RoomUserLookAtPoint = 2283;//1365 //Updated + public static final int MoodLightTurnOnEvent = 3924;//1181 //Updated + public static final int MoodLightSettingsEvent = 2821;//2468 //Updated + public static final int RequestMyRoomsEvent = 948;//2676 //Updated + public static final int RequestCreditsEvent = 3896;//2138 //Updated + public static final int SearchRoomsInGroupEvent = 2851;//1160 //Updated + public static final int HorseRideSettingsEvent = 427;//2448 //Updated + public static final int KnockKnockResponseEvent = 853; //Updated + public static final int RoomUserKickEvent = 313;//1874 //Updated + public static final int RoomPlaceItemEvent = 3571;//474 //Updated + public static final int RequestInventoryBotsEvent = 1343;//1351 //Updated + public static final int RequestUserWardrobeEvent = 2976;//1251 //Updated + public static final int RequestRoomRightsEvent = 63;//2928 //Updated + public static final int RequestGuildBuyRoomsEvent = 2945;//701 //Updated + public static final int BotPlaceEvent = 3906;//148 //Updated + public static final int SearchRoomsWithRightsEvent = 1699;//3785 //Updated + public static final int HotelViewRequestBonusRareEvent = 1521;//1199 //Updated + public static final int GuildRemoveAdminEvent = 904;//3264 //Updated + public static final int RequestRoomSettingsEvent = 1794;//3741 //Updated + public static final int RequestOffersEvent = 100;//541 //Updated + public static final int RequestUserCitizinShipEvent = 3556;//3096 //Updated + public static final int RoomUserStopTypingEvent = 1712;//2005 //Updated + public static final int RoomUserStartTypingEvent = 3128;//3684 //Updated + public static final int RequestGuildManageEvent = 3931;//2418 //Updated + public static final int RequestUserClubEvent = 675;//3874 //Updated + public static final int PetPickupEvent = 1294;//863 //Updated + public static final int RequestOwnGuildsEvent = 2690;//2240 //Updated + public static final int SearchRoomsVisitedEvent = 3561;//589 //Updated + public static final int TradeOfferItemEvent = 2090;//2223 //Updated + public static final int TradeConfirmEvent = 1503;//1144 //Updated + public static final int RoomUserGiveRightsEvent = 503;//2221 //Updated + public static final int RequestGuildInfoEvent = 844;//2079 //Updated + public static final int ReloadRecyclerEvent = 3895;//2779 //Updated + public static final int RoomUserActionEvent = 2522;//475 //Updated + public static final int RequestGiftConfigurationEvent = 756;//382 //Updated + public static final int RequestRoomDataEvent = 2022;//183 //Updated + public static final int RequestRoomHeightmapEvent = 3936; //Updated + public static final int RequestGuildFurniWidgetEvent = 54;//3031 //Updated + public static final int RequestOwnItemsEvent = 1816;//829 //Updated + public static final int RequestReportRoomEvent = 2842; //Updated + public static final int ReportEvent = 2073; //Updated + public static final int TriggerOneWayGateEvent = 3752; //Updated + public static final int FloorPlanEditorSaveEvent = 3509; //Updated + public static final int FloorPlanEditorRequestDoorSettingsEvent = 2691; //Updated + public static final int FloorPlanEditorRequestBlockedTilesEvent = 2246; //Updated + public static final int UnknownEvent1 = 3365; + public static final int RequestTalenTrackEvent = 1741; + public static final int RequestNewNavigatorDataEvent = 1192; + public static final int RequestNewNavigatorRoomsEvent = 3669; + public static final int RedeemClothingEvent = 2536; + public static final int NewNavigatorActionEvent = 1344; + public static final int PostItPlaceEvent = 1688; + public static final int PostItRequestDataEvent = 3702; + public static final int PostItSaveDataEvent = 3504; + public static final int PostItDeleteEvent = 779; + public static final int MoodLightSaveSettingsEvent = 900; + public static final int ModToolRequestIssueChatlogEvent = 620; + public static final int ModToolRequestRoomUserChatlogEvent = 1352; + public static final int UsernameEvent = 820; + public static final int RequestClubGiftsEvent = 425; + public static final int RentSpaceEvent = 1382; + public static final int RentSpaceCancelEvent = 3038; + public static final int RequestInitFriendsEvent = 3503; + public static final int RequestCameraConfigurationEvent = 2257; + public static final int PingEvent = 862; + public static final int FindNewFriendsEvent = 3421; + public static final int InviteFriendsEvent = 370; + public static final int GuildeRemoveFavoriteEvent = 3259; + public static final int GuildDeleteEvent = 1581; + public static final int SetHomeRoomEvent = 1772; + public static final int RoomUserGiveHandItemEvent = 2797; + public static final int AmbassadorVisitCommandEvent = 487; + public static final int AmbassadorAlertCommandEvent = 3992; + public static final int SaveUserVolumesEvent = 1914; + public static final int SavePreferOldChatEvent = 3131; + public static final int SaveIgnoreRoomInvitesEvent = 542; + public static final int SaveBlockCameraFollowEvent = 2477; + public static final int RoomMuteEvent = 2571; + public static final int RequestRoomWordFilterEvent = 3305; + public static final int RoomWordFilterModifyEvent = 3415; + public static final int RequestRoomUserTagsEvent = 3430; + public static final int CatalogSearchedItemEvent = 346; + public static final int JukeBoxRequestTrackCodeEvent = 716; + public static final int JukeBoxRequestTrackDataEvent = 3453; + public static final int RoomStaffPickEvent = 3139; + public static final int RoomRequestBannedUsersEvent = 2226; + public static final int JukeBoxRequestPlayListEvent = 68; + public static final int JukeBoxEventOne = 3448; + public static final int JukeBoxEventTwo = 2457; + public static final int JukeBoxEventThree = 2693; + public static final int RequestDeleteRoomEvent = 3071; + public static final int RequestPromotionRoomsEvent = 2730; + public static final int BuyRoomPromotionEvent = 2363; + + + public static final int RequestGuideToolEvent = 3003; + public static final int RequestGuideAssistanceEvent = 2158; + public static final int GuideUserTypingEvent = 705; + public static final int GuideReportHelperEvent = 393; + public static final int GuideRecommendHelperEvent = 151; + public static final int GuideUserMessageEvent = 721; + public static final int GuideCancelHelpRequestEvent = 1166; + public static final int GuideHandleHelpRequestEvent = 459; + public static final int GuideVisitUserEvent = 2776; + public static final int GuideInviteUserEvent = 409; + public static final int GuideCloseHelpRequestEvent = 2751; + + public static final int GuardianNoUpdatesWantedEvent = 1929; + public static final int GuardianVoteEvent = 1371; + public static final int GuardianAcceptRequestEvent = 1278; + + public static final int RequestGameConfigurationsEvent = 2994; + public static final int RequestAchievementConfigurationEvent = 3160; + + public static final int RequestReportUserBullyingEvent = 62; + public static final int ReportBullyEvent = 3061; + + public static final int CameraParserShit = 3800; + public static final int SavePostItStickyPoleEvent = 2637; + + public static final int HotelViewClaimBadgeEvent = 1298; + public static final int HotelViewRequestCommunityGoalEvent = 1204; + public static final int HotelViewRequestConcurrentUsersEvent = 3489; + public static final int HotelViewConcurrentUsersButtonEvent = 984; + + public static final int IgnoreRoomUserEvent = 3546; + public static final int UnIgnoreRoomUserEvent = 3909; + public static final int UnbanRoomUserEvent = 2374; + + public static final int RequestNavigatorSettingsEvent = 3202; + public static final int SaveWindowSettingsEvent = 2276; +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java b/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java new file mode 100644 index 00000000..4e479253 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.ClientMessage; + +public abstract class MessageHandler +{ + public GameClient client; + public ClientMessage packet; + public boolean isCancelled = false; + + public abstract void handle() throws Exception; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementConfigurationEvent.java b/src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementConfigurationEvent.java new file mode 100644 index 00000000..9d456bc9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementConfigurationEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.achievements; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryAchievementsComposer; + +public class RequestAchievementConfigurationEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new InventoryAchievementsComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementsEvent.java new file mode 100644 index 00000000..0d2b5b2a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/achievements/RequestAchievementsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.achievements; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.achievements.AchievementListComposer; + +public class RequestAchievementsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new AchievementListComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorAlertCommandEvent.java b/src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorAlertCommandEvent.java new file mode 100644 index 00000000..3ed0a873 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorAlertCommandEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.incoming.ambassadors; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; + +public class AmbassadorAlertCommandEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_ambassador")) + { + int userId = this.packet.readInt(); + + Habbo habbo = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(userId); + + if(habbo != null) + { + habbo.getClient().sendResponse(new BubbleAlertComposer("ambassador.alert.warning")); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorVisitCommandEvent.java b/src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorVisitCommandEvent.java new file mode 100644 index 00000000..f05fff7d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/ambassadors/AmbassadorVisitCommandEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.ambassadors; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; + +public class AmbassadorVisitCommandEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_ambassador")) + { + String username = this.packet.readString(); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(username); + + if(habbo != null) + { + if(habbo.getHabboInfo().getCurrentRoom() != null) + { + this.client.sendResponse(new ForwardToRoomComposer(habbo.getHabboInfo().getCurrentRoom().getId())); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/camera/CameraPublishToWebEvent.java b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraPublishToWebEvent.java new file mode 100644 index 00000000..c81e1542 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraPublishToWebEvent.java @@ -0,0 +1,64 @@ +package com.eu.habbo.messages.incoming.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.camera.CameraPublishWaitMessageComposer; +import com.eu.habbo.messages.outgoing.camera.CameraPurchaseSuccesfullComposer; +import com.eu.habbo.plugin.events.users.UserPublishPictureEvent; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class CameraPublishToWebEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboInfo().getPhotoTimestamp() != 0) + { + if (!this.client.getHabbo().getHabboInfo().getPhotoJSON().isEmpty()) + { + if (this.client.getHabbo().getHabboInfo().getPhotoJSON().contains(this.client.getHabbo().getHabboInfo().getPhotoTimestamp() + "")) + { + int timestamp = Emulator.getIntUnixTimestamp(); + + boolean published = false; + int timeDiff = timestamp - this.client.getHabbo().getHabboInfo().getWebPublishTimestamp(); + int wait = 0; + if (timeDiff < Emulator.getConfig().getInt("camera.publish.delay")) + { + wait = timeDiff - Emulator.getConfig().getInt("camera.publish.delay"); + } + else + { + UserPublishPictureEvent publishPictureEvent = new UserPublishPictureEvent(this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getPhotoURL(), timestamp, this.client.getHabbo().getHabboInfo().getPhotoRoomId()); + if (!Emulator.getPluginManager().fireEvent(publishPictureEvent).isCancelled()) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO camera_web (user_id, room_id, timestamp, url) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, this.client.getHabbo().getHabboInfo().getId()); + statement.setInt(2, publishPictureEvent.roomId); + statement.setInt(3, publishPictureEvent.timestamp); + statement.setString(4, publishPictureEvent.URL); + statement.execute(); + this.client.getHabbo().getHabboInfo().setWebPublishTimestamp(timestamp); + published = true; + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + else + { + return; + } + } + + this.client.sendResponse(new CameraPublishWaitMessageComposer(published, wait, published ? this.client.getHabbo().getHabboInfo().getPhotoURL() : "")); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/camera/CameraPurchaseEvent.java b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraPurchaseEvent.java new file mode 100644 index 00000000..41b98f74 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraPurchaseEvent.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.incoming.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.camera.CameraPurchaseSuccesfullComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.plugin.events.users.UserPurchasePictureEvent; + +public class CameraPurchaseEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboInfo().getPhotoTimestamp() != 0) + { + if (!this.client.getHabbo().getHabboInfo().getPhotoJSON().isEmpty()) + { + if (this.client.getHabbo().getHabboInfo().getPhotoJSON().contains(this.client.getHabbo().getHabboInfo().getPhotoTimestamp() + "")) + { + if (Emulator.getPluginManager().fireEvent(new UserPurchasePictureEvent(this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getPhotoURL(), this.client.getHabbo().getHabboInfo().getCurrentRoom().getId(), this.client.getHabbo().getHabboInfo().getPhotoTimestamp())).isCancelled()) + { + return; + } + + HabboItem photoItem = Emulator.getGameEnvironment().getItemManager().createItem(this.client.getHabbo().getHabboInfo().getId(), Emulator.getGameEnvironment().getItemManager().getItem(Emulator.getConfig().getInt("camera.item_id")), 0, 0, this.client.getHabbo().getHabboInfo().getPhotoJSON()); + + if (photoItem != null) + { + photoItem.setExtradata(photoItem.getExtradata().replace("%id%", photoItem.getId() + "")); + photoItem.needsUpdate(true); + this.client.getHabbo().getInventory().getItemsComponent().addItem(photoItem); + this.client.sendResponse(new CameraPurchaseSuccesfullComposer()); + this.client.sendResponse(new AddHabboItemComposer(photoItem)); + this.client.sendResponse(new InventoryRefreshComposer()); + this.client.getHabbo().giveCredits(-Emulator.getConfig().getInt("camera.price.credits")); + this.client.getHabbo().givePixels(-Emulator.getConfig().getInt("camera.price.points")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("CameraPhotoCount")); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomPictureEvent.java b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomPictureEvent.java new file mode 100644 index 00000000..a5be6bf5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomPictureEvent.java @@ -0,0 +1,51 @@ +package com.eu.habbo.messages.incoming.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.camera.CameraPublishWaitMessageComposer; +import com.eu.habbo.messages.outgoing.camera.CameraURLComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.networking.camera.CameraClient; +import com.eu.habbo.networking.camera.messages.outgoing.CameraRenderImageComposer; +import com.eu.habbo.util.crypto.ZIP; + +import java.io.ByteArrayOutputStream; +import java.util.zip.Inflater; + +public class CameraRoomPictureEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (!this.client.getHabbo().hasPermission("acc_camera")) + { + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("camera.permission"))); + return; + } + + if (CameraClient.isLoggedIn) + { + this.packet.getBuffer().readFloat(); + + byte[] data = this.packet.getBuffer().readBytes(this.packet.getBuffer().readableBytes()).array(); + + String content = new String(ZIP.inflate(data)); + CameraRenderImageComposer composer = new CameraRenderImageComposer(this.client.getHabbo().getHabboInfo().getId(), this.client.getHabbo().getHabboInfo().getCurrentRoom().getBackgroundTonerColor().getRGB(), 320, 320, content); + this.client.getHabbo().getHabboInfo().setPhotoJSON(Emulator.getConfig().getValue("camera.extradata").replace("%timestamp%", composer.timestamp + "")); + this.client.getHabbo().getHabboInfo().setPhotoTimestamp(composer.timestamp); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + this.client.getHabbo().getHabboInfo().setPhotoRoomId(this.client.getHabbo().getHabboInfo().getCurrentRoom().getId()); + } + + Emulator.getCameraClient().sendMessage(composer); + } + else + { + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("camera.disabled"))); + } + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomThumbnailEvent.java b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomThumbnailEvent.java new file mode 100644 index 00000000..7f35f6a1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/camera/CameraRoomThumbnailEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.incoming.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.camera.CameraRoomThumbnailSavedComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.networking.camera.CameraClient; +import com.eu.habbo.networking.camera.messages.outgoing.CameraRenderImageComposer; +import com.eu.habbo.util.crypto.ZIP; + +public class CameraRoomThumbnailEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (!this.client.getHabbo().hasPermission("acc_camera")) + { + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("camera.permission"))); + return; + } + + if (!this.client.getHabbo().getHabboInfo().getCurrentRoom().isOwner(this.client.getHabbo())) + return; + + if (CameraClient.isLoggedIn) + { + this.packet.getBuffer().readFloat(); + byte[] data = this.packet.getBuffer().readBytes(this.packet.getBuffer().readableBytes()).array(); + String content = new String(ZIP.inflate(data)); + + CameraRenderImageComposer composer = new CameraRenderImageComposer(this.client.getHabbo().getHabboInfo().getId(), this.client.getHabbo().getHabboInfo().getCurrentRoom().getBackgroundTonerColor().getRGB(), 110, 110, content); + + this.client.getHabbo().getHabboInfo().setPhotoJSON(Emulator.getConfig().getValue("camera.extradata").replace("%timestamp%", composer.timestamp + "")); + this.client.getHabbo().getHabboInfo().setPhotoTimestamp(composer.timestamp); + + Emulator.getCameraClient().sendMessage(composer); + } + else + { + this.client.sendResponse(new CameraRoomThumbnailSavedComposer()); + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("camera.disabled"))); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/camera/RequestCameraConfigurationEvent.java b/src/main/java/com/eu/habbo/messages/incoming/camera/RequestCameraConfigurationEvent.java new file mode 100644 index 00000000..14be39cd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/camera/RequestCameraConfigurationEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.camera.CameraPriceComposer; + +public class RequestCameraConfigurationEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new CameraPriceComposer(Emulator.getConfig().getInt("camera.price.credits"), Emulator.getConfig().getInt("camera.price.points"), Emulator.getConfig().getInt("camera.price.points.publish"))); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemAsGiftEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemAsGiftEvent.java new file mode 100644 index 00000000..e8d320c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemAsGiftEvent.java @@ -0,0 +1,437 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogLimitedConfiguration; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.*; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; +import com.eu.habbo.threading.runnables.ShutdownEmulator; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Calendar; + +public class CatalogBuyItemAsGiftEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (ShutdownEmulator.timestamp > 0) + { + this.client.sendResponse(new HotelWillCloseInMinutesComposer((ShutdownEmulator.timestamp - Emulator.getIntUnixTimestamp()) / 60)); + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + int pageId = this.packet.readInt(); + int itemId = this.packet.readInt(); + String extraData = this.packet.readString(); + String username = this.packet.readString(); + String message = this.packet.readString(); + int spriteId = this.packet.readInt(); + int color = this.packet.readInt(); + int ribbonId = this.packet.readInt(); + boolean showName = this.packet.readBoolean(); + + int count = 1; + int userId = 0; + + if(!Emulator.getGameEnvironment().getCatalogManager().giftWrappers.containsKey(spriteId) && !Emulator.getGameEnvironment().getCatalogManager().giftFurnis.containsKey(spriteId)) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + Emulator.getGameEnvironment(); + Emulator.getGameEnvironment().getItemManager(); + + Integer iItemId = Emulator.getGameEnvironment().getCatalogManager().giftWrappers.get(spriteId); + + if(iItemId == null) + iItemId = Emulator.getGameEnvironment().getCatalogManager().giftFurnis.get(spriteId); + + if(iItemId == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + Item giftItem = Emulator.getGameEnvironment().getItemManager().getItem(iItemId); + + if(giftItem == null) + { + giftItem = Emulator.getGameEnvironment().getItemManager().getItem((Integer)Emulator.getGameEnvironment().getCatalogManager().giftFurnis.values().toArray()[Emulator.getRandom().nextInt(Emulator.getGameEnvironment().getCatalogManager().giftFurnis.size())]); + + if(giftItem == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(username); + + if(habbo == null) + { + try (PreparedStatement statement = connection.prepareStatement("SELECT id FROM users WHERE username = ?")) + { + statement.setString(1, username); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + userId = set.getInt(1); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + else + { + userId = habbo.getHabboInfo().getId(); + } + + if(userId == 0) + { + this.client.sendResponse(new GiftReceiverNotFoundComposer()); + return; + } + + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().catalogPages.get(pageId); + + if(page == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + if(page.getRank() > this.client.getHabbo().getHabboInfo().getRank().getId() || !page.isEnabled() || !page.isVisible()) + { + this.client.sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.ILLEGAL)); + return; + } + + CatalogItem item = page.getCatalogItem(itemId); + + Item cBaseItem = null; + + if(item == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + if(item.isClubOnly() && !this.client.getHabbo().getHabboStats().hasActiveClub()) + { + this.client.sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.REQUIRES_CLUB)); + return; + } + + for(Item baseItem : item.getBaseItems()) + { + if(!baseItem.allowGift()) + { + this.client.sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.ILLEGAL)); + return; + } + } + + if (item.isLimited()) + { + if (item.getLimitedStack() == item.getLimitedSells()) + { + this.client.sendResponse(new AlertLimitedSoldOutComposer()); + return; + } + item.sellRare(); + } + + int totalCredits = 0; + int totalPoints = 0; + + CatalogLimitedConfiguration limitedConfiguration = null; + int limitedStack = 0; + int limitedNumber = 0; + if (item.isLimited()) + { + count = 1; + if (Emulator.getGameEnvironment().getCatalogManager().getLimitedConfig(item).available() == 0) + { + habbo.getClient().sendResponse(new AlertLimitedSoldOutComposer()); + return; + } + + limitedConfiguration = Emulator.getGameEnvironment().getCatalogManager().getLimitedConfig(item); + + if (limitedConfiguration == null) + { + limitedConfiguration = Emulator.getGameEnvironment().getCatalogManager().createOrUpdateLimitedConfig(item); + } + + limitedNumber = limitedConfiguration.getNumber(); + limitedStack = limitedConfiguration.getTotalSet(); + } + + THashSet itemsList = new THashSet(); + + boolean badgeFound = false; + for (Item baseItem : item.getBaseItems()) + { + if (baseItem.getType() == FurnitureType.BADGE) + { + if (habbo != null) + { + if(habbo.getInventory().getBadgesComponent().hasBadge(baseItem.getName())) + { + badgeFound = true; + } + } + else + { + int c = 0; + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) as c FROM users_badges WHERE user_id = ? AND badge_code LIKE ?")) + { + statement.setInt(1, userId); + statement.setString(2, baseItem.getName()); + try (ResultSet rSet = statement.executeQuery()) + { + if (rSet.next()) + { + c = rSet.getInt("c"); + } + } + } + + if (c != 0) + { + badgeFound = true; + } + } + } + } + + if (badgeFound) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.ALREADY_HAVE_BADGE)); + return; + } + + for(int i = 0; i < count; i++) + { + if (item.getCredits() <= this.client.getHabbo().getHabboInfo().getCredits() - totalCredits) + { + if( + item.getPoints() <= this.client.getHabbo().getHabboInfo().getCurrencyAmount(item.getPointsType()) - totalPoints) + //item.getPointsType() == 0 && item.getPoints() <= this.client.getHabbo().getHabboInfo().getPixels() - totalPoints || + // item.getPoints() <= this.client.getHabbo().getHabboInfo().getPoints()) + { + if ((i + 1) % 6 != 0 && item.isHaveOffer() || !item.isHaveOffer()) + { + totalCredits += item.getCredits(); + totalPoints += item.getPoints(); + } + + for (int j = 0; j < item.getAmount(); j++) + { + if (item.getAmount() > 1 || item.getBaseItems().size() > 1) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + for (Item baseItem : item.getBaseItems()) + { + if (item.getItemAmount(baseItem.getId()) > 1) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + for(int k = 0; k < item.getItemAmount(baseItem.getId()); k++) + { + cBaseItem = baseItem; + if (!baseItem.getName().contains("avatar_effect")) + { + if (baseItem.getType() == FurnitureType.BADGE) + { + if (!badgeFound) + { + if (habbo != null) + { + HabboBadge badge = new HabboBadge(0, baseItem.getName(), 0, habbo); + Emulator.getThreading().run(badge); + habbo.getInventory().getBadgesComponent().addBadge(badge); + } + else + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO users_badges (user_id, badge_code) VALUES (?, ?)")) + { + statement.setInt(1, userId); + statement.setString(2, baseItem.getName()); + statement.execute(); + } + } + + badgeFound = true; + } + } + else if(item.getName().startsWith("rentable_bot_")) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + else if(Item.isPet(baseItem)) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + else + { + if (baseItem.getInteractionType().getType() == InteractionTrophy.class || baseItem.getInteractionType().getType() == InteractionBadgeDisplay.class) + { + extraData = this.client.getHabbo().getHabboInfo().getUsername() + (char) 9 + Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + (Calendar.getInstance().get(Calendar.MONTH) + 1) + "-" + Calendar.getInstance().get(Calendar.YEAR) + (char) 9 + extraData; + } + + if (baseItem.getInteractionType().getType() == InteractionTeleport.class || baseItem.getInteractionType().getType() == InteractionTeleportTile.class) + { + HabboItem teleportOne = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, limitedStack, limitedNumber, extraData); + HabboItem teleportTwo = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, limitedStack, limitedNumber, extraData); + Emulator.getGameEnvironment().getItemManager().insertTeleportPair(teleportOne.getId(), teleportTwo.getId()); + itemsList.add(teleportOne); + itemsList.add(teleportTwo); + } + else if(baseItem.getInteractionType().getType() == InteractionHopper.class) + { + HabboItem hopper = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, limitedNumber, limitedNumber, extraData); + + Emulator.getGameEnvironment().getItemManager().insertHopper(hopper); + + itemsList.add(hopper); + } + else if(baseItem.getInteractionType().getType() == InteractionGuildFurni.class || baseItem.getInteractionType().getType() == InteractionGuildGate.class) + { + InteractionGuildFurni habboItem = (InteractionGuildFurni)Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, limitedStack, limitedNumber, extraData); + habboItem.setExtradata(""); + habboItem.needsUpdate(true); + int guildId; + try + { + guildId = Integer.parseInt(extraData); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + Emulator.getThreading().run(habboItem); + Emulator.getGameEnvironment().getGuildManager().setGuild(habboItem, guildId); + itemsList.add(habboItem); + } + else + { + HabboItem habboItem = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, limitedStack, limitedNumber, extraData); + itemsList.add(habboItem); + } + } + } + else + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("error.catalog.buy.not_yet"))); + return; + } + } + } + } + } + } + } + + String giftData = itemsList.size() + "\t"; + + for(HabboItem i : itemsList) + { + giftData += i.getId() + "\t"; + } + + giftData += color + "\t" + ribbonId + "\t" + (showName ? "1" : "0") + "\t" + (message.replace("\t", "")) + "\t" + this.client.getHabbo().getHabboInfo().getUsername() + "\t" + this.client.getHabbo().getHabboInfo().getLook(); + + HabboItem gift = Emulator.getGameEnvironment().getItemManager().createGift(username, giftItem, giftData, 0, 0); + + if(gift == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GiftGiver")); + if(habbo != null) + { + habbo.getClient().sendResponse(new AddHabboItemComposer(gift)); + habbo.getClient().getHabbo().getInventory().getItemsComponent().addItem(gift); + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}notifications/gift.gif"); + keys.put("message", Emulator.getTexts().getValue("generic.gift.received.anonymous")); + if (showName) + { + keys.put("message", Emulator.getTexts().getValue("generic.gift.received").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys)); + } + + AchievementManager.progressAchievement(userId, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GiftReceiver")); + + if(!this.client.getHabbo().hasPermission("acc_infinite_credits")) + { + if (totalCredits > 0) + { + this.client.getHabbo().giveCredits(-totalCredits); + } + } + if(totalPoints > 0) + { + if(item.getPointsType() == 0 && !this.client.getHabbo().hasPermission("acc_infinite_pixels")) { + this.client.getHabbo().getHabboInfo().addPixels(-totalPoints); + }else if(!this.client.getHabbo().hasPermission("acc_infinite_points")) { + this.client.getHabbo().getHabboInfo().addCurrencyAmount(item.getPointsType(), -totalPoints); + } + this.client.sendResponse(new UserPointsComposer(this.client.getHabbo().getHabboInfo().getCurrencyAmount(item.getPointsType()), -totalPoints, item.getPointsType())); + } + + this.client.sendResponse(new PurchaseOKComposer(item)); + } + catch(Exception e) + { + Emulator.getLogging().logPacketError(e); + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemEvent.java new file mode 100644 index 00000000..0b77d811 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemEvent.java @@ -0,0 +1,222 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.catalog.ClubOffer; +import com.eu.habbo.habbohotel.catalog.layouts.ClubBuyLayout; +import com.eu.habbo.habbohotel.catalog.layouts.RecentPurchasesLayout; +import com.eu.habbo.habbohotel.catalog.layouts.RoomBundleLayout; +import com.eu.habbo.habbohotel.catalog.layouts.VipBuyLayout; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.*; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.users.*; +import com.eu.habbo.threading.runnables.ShutdownEmulator; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + +public class CatalogBuyItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (ShutdownEmulator.timestamp > 0) + { + this.client.sendResponse(new HotelWillCloseInMinutesComposer((ShutdownEmulator.timestamp - Emulator.getIntUnixTimestamp()) / 60)); + return; + } + + int pageId = this.packet.readInt(); + int itemId = this.packet.readInt(); + String extraData = this.packet.readString(); + int count = this.packet.readInt(); + + try + { + if (this.client.getHabbo().getInventory().getItemsComponent().itemCount() > HabboInventory.MAXIMUM_ITEMS) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("inventory.full"))); + return; + } + } + catch (Exception e) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + } + + CatalogPage page = null; + + if(pageId == -12345678) + { + for(CatalogPage p : Emulator.getGameEnvironment().getCatalogManager().getCatalogPages(-1, this.client.getHabbo())) + { + if(p.getCatalogItem(itemId) != null) + { + page = p; + break; + } + else + { + for(CatalogPage p2 : Emulator.getGameEnvironment().getCatalogManager().getCatalogPages(p.getId(), this.client.getHabbo())) + { + if(p2.getCatalogItem(itemId) != null) + { + page = p2; + break; + } + } + } + } + } + else + { + page = Emulator.getGameEnvironment().getCatalogManager().catalogPages.get(pageId); + + if(page instanceof RoomBundleLayout) + { + final CatalogItem[] item = new CatalogItem[1]; + page.getCatalogItems().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CatalogItem object) + { + item[0] = object; + return false; + } + }); + + if(item[0] == null || item[0].getCredits() > this.client.getHabbo().getHabboInfo().getCredits() || item[0].getPoints() > this.client.getHabbo().getHabboInfo().getCurrencyAmount(item[0].getPointsType())) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + ((RoomBundleLayout)page).buyRoom(this.client.getHabbo()); + + if (!this.client.getHabbo().hasPermission("acc_infinite_credits")) + { + this.client.getHabbo().getHabboInfo().addCredits(-item[0].getCredits()); + } + + if (!this.client.getHabbo().hasPermission("acc_inifinte_points")) + { + this.client.getHabbo().getHabboInfo().addCurrencyAmount(item[0].getPointsType(), -item[0].getPoints()); + } + + this.client.sendResponse(new PurchaseOKComposer()); + + final boolean[] badgeFound = {false}; + item[0].getBaseItems().stream().filter(i -> i.getType() == FurnitureType.BADGE).forEach(i -> { + if (!this.client.getHabbo().getInventory().getBadgesComponent().hasBadge(i.getName())) + { + HabboBadge badge = new HabboBadge(0, i.getName(), 0, this.client.getHabbo()); + Emulator.getThreading().run(badge); + this.client.getHabbo().getInventory().getBadgesComponent().addBadge(badge); + this.client.sendResponse(new AddUserBadgeComposer(badge)); + THashMap keys = new THashMap(); + keys.put("display", "BUBBLE"); + keys.put("image", "${image.library.url}album1584/" + badge.getCode() + ".gif"); + keys.put("message", Emulator.getTexts().getValue("commands.generic.cmd_badge.received")); + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys)); //:test 1992 s:npc.gift.received i:2 s:npc_name s:Admin s:image s:${image.library.url}album1584/ADM.gif); + } + else + { + badgeFound[0] = true; + } + }); + + if (badgeFound[0]) + { + this.client.getHabbo().getClient().sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.ALREADY_HAVE_BADGE)); + } + + return; + } + } + + if(page == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + if(page.getRank() > this.client.getHabbo().getHabboInfo().getRank().getId()) + { + this.client.sendResponse(new AlertPurchaseUnavailableComposer(AlertPurchaseUnavailableComposer.ILLEGAL)); + return; + } + + if(page instanceof ClubBuyLayout || page instanceof VipBuyLayout) + { + ClubOffer item = Emulator.getGameEnvironment().getCatalogManager().clubOffers.get(itemId); + + if(item == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR).compose()); + return; + } + + int totalDays = 0; + int totalCredits = 0; + int totalDuckets = 0; + + for(int i = 0; i < count; i++) + { + totalDays += item.getDays(); + totalCredits += item.getCredits(); + totalDuckets += item.getPoints(); + } + + if(totalDays > 0) + { + if(this.client.getHabbo().getHabboInfo().getCurrencyAmount(item.getPointsType()) < totalDuckets) + return; + + if (this.client.getHabbo().getHabboInfo().getCredits() < totalCredits) + return; + + if (!this.client.getHabbo().hasPermission("acc_infinite_credits")) + this.client.getHabbo().getHabboInfo().addCredits(-totalCredits); + + if (!this.client.getHabbo().hasPermission("acc_infinite_points")) + this.client.getHabbo().getHabboInfo().addCurrencyAmount(item.getPointsType(), -totalDuckets); + + if(this.client.getHabbo().getHabboStats().getClubExpireTimestamp() <= Emulator.getIntUnixTimestamp()) + this.client.getHabbo().getHabboStats().setClubExpireTimestamp(Emulator.getIntUnixTimestamp()); + + this.client.getHabbo().getHabboStats().setClubExpireTimestamp(this.client.getHabbo().getHabboStats().getClubExpireTimestamp() + (totalDays * 86400)); + this.client.sendResponse(new UserPermissionsComposer(this.client.getHabbo())); + this.client.sendResponse(new UserClubComposer(this.client.getHabbo())); + + if (totalCredits > 0) + this.client.sendResponse(new UserCreditsComposer(this.client.getHabbo())); + + if (totalDuckets > 0) + this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + + this.client.sendResponse(new PurchaseOKComposer(null)); + this.client.sendResponse(new InventoryRefreshComposer()); + } + return; + } + + CatalogItem item; + + if(page instanceof RecentPurchasesLayout) + item = this.client.getHabbo().getHabboStats().getRecentPurchases().get(itemId); + else + item = page.getCatalogItem(itemId); + + Emulator.getGameEnvironment().getCatalogManager().purchaseItem(page, item, this.client.getHabbo(), count, extraData, false); + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogSearchedItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogSearchedItemEvent.java new file mode 100644 index 00000000..5706cdb9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogSearchedItemEvent.java @@ -0,0 +1,42 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.CatalogSearchResultComposer; +import gnu.trove.iterator.TIntObjectIterator; + +public class CatalogSearchedItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int offerId = this.packet.readInt(); + + int pageId = Emulator.getGameEnvironment().getCatalogManager().offerDefs.get(offerId); + + if(pageId != 0) + { + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(pageId); + + if (page != null) + { + TIntObjectIterator iterator = page.getCatalogItems().iterator(); + + while (iterator.hasNext()) + { + iterator.advance(); + + CatalogItem item = iterator.value(); + + if (item.getOfferId() == offerId) + { + this.client.sendResponse(new CatalogSearchResultComposer(item)); + return; + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/CheckPetNameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/CheckPetNameEvent.java new file mode 100644 index 00000000..339c1014 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/CheckPetNameEvent.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.PetNameErrorComposer; +import org.apache.commons.lang3.StringUtils; + +public class CheckPetNameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String petName = this.packet.readString(); + + int minLength = Emulator.getConfig().getInt("hotel.pets.name.length.min"); + int maxLength = Emulator.getConfig().getInt("hotel.pets.name.length.max"); + + if(petName.length() < minLength) + { + this.client.sendResponse(new PetNameErrorComposer(PetNameErrorComposer.NAME_TO_SHORT, minLength + "")); + } + else if(petName.length() > maxLength) + { + this.client.sendResponse(new PetNameErrorComposer(PetNameErrorComposer.NAME_TO_LONG, maxLength + "")); + } + else if(!StringUtils.isAlphanumeric(petName)) + { + this.client.sendResponse(new PetNameErrorComposer(PetNameErrorComposer.FORBIDDEN_CHAR, petName)); + } + else + { + this.client.sendResponse(new PetNameErrorComposer(PetNameErrorComposer.NAME_OK, petName)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackCodeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackCodeEvent.java new file mode 100644 index 00000000..4e3d2f39 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackCodeEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxTrackCodeComposer; + +public class JukeBoxRequestTrackCodeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String songName = this.packet.readString(); + + final SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(songName); + + if(track != null) + { + this.client.sendResponse(new JukeBoxTrackCodeComposer(track)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackDataEvent.java new file mode 100644 index 00000000..2bd66ed9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/JukeBoxRequestTrackDataEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxTrackDataComposer; + +import java.util.ArrayList; +import java.util.List; + +public class JukeBoxRequestTrackDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int count = this.packet.readInt(); + + List tracks = new ArrayList(count); + + for(int i = 0; i < count; i++) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(this.packet.readInt()); + + if(track != null) + tracks.add(track); + } + + this.client.sendResponse(new JukeBoxTrackDataComposer(tracks)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RedeemVoucherEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RedeemVoucherEvent.java new file mode 100644 index 00000000..690ebe08 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RedeemVoucherEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.RedeemVoucherErrorComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer; +import com.eu.habbo.threading.runnables.ShutdownEmulator; + +public class RedeemVoucherEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (ShutdownEmulator.timestamp > 0) + { + this.client.sendResponse(new HotelWillCloseInMinutesComposer((ShutdownEmulator.timestamp - Emulator.getIntUnixTimestamp()) / 60)); + return; + } + + String voucherCode = this.packet.readString(); + + if(voucherCode.contains(" ")) + { + this.client.sendResponse(new RedeemVoucherErrorComposer(RedeemVoucherErrorComposer.TECHNICAL_ERROR)); + return; + } + + Emulator.getGameEnvironment().getCatalogManager().redeemVoucher(this.client, voucherCode); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogIndexEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogIndexEvent.java new file mode 100644 index 00000000..ecf094ac --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogIndexEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.CatalogPagesListComposer; + +public class RequestCatalogIndexEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + //this.client.sendResponse(new CatalogPagesListComposer(this.client.getHabbo(), "NORMAL")); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogModeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogModeEvent.java new file mode 100644 index 00000000..9e6fcb5e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogModeEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.CatalogModeComposer; +import com.eu.habbo.messages.outgoing.catalog.CatalogPagesListComposer; + +public class RequestCatalogModeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception { + + String MODE = this.packet.readString(); + if(MODE.equalsIgnoreCase("normal")) + { + this.client.sendResponse(new CatalogModeComposer(0)); + this.client.sendResponse(new CatalogPagesListComposer(this.client.getHabbo(), MODE)); + } + else + { + this.client.sendResponse(new CatalogModeComposer(1)); + this.client.sendResponse(new CatalogPagesListComposer(this.client.getHabbo(), MODE)); + } + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogPageEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogPageEvent.java new file mode 100644 index 00000000..f4c48088 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestCatalogPageEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.CatalogPageComposer; + +public class RequestCatalogPageEvent extends MessageHandler +{ + + @Override + public void handle() throws Exception + { + int catalogPageId = this.packet.readInt(); + int unknown = this.packet.readInt(); + String mode = this.packet.readString(); + + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().catalogPages.get(catalogPageId); + + if (catalogPageId > 0 && page != null) + { + if (page.getRank() <= this.client.getHabbo().getHabboInfo().getRank().getId() && page.isEnabled()) + { + this.client.sendResponse(new CatalogPageComposer(page, this.client.getHabbo(), mode)); + } + else + { + if(!page.isVisible()) + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.catalog.page").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%pagename%", page.getCaption())); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubDataEvent.java new file mode 100644 index 00000000..4745dbf3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubDataEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.unknown.ClubDataComposer; + +public class RequestClubDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new ClubDataComposer(this.client.getHabbo(), this.packet.readInt())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubGiftsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubGiftsEvent.java new file mode 100644 index 00000000..2114e7bb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestClubGiftsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.ClubGiftsComposer; + +public class RequestClubGiftsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new ClubGiftsComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestDiscountEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestDiscountEvent.java new file mode 100644 index 00000000..cfd156a5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestDiscountEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.DiscountComposer; + +public class RequestDiscountEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new DiscountComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestGiftConfigurationEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestGiftConfigurationEvent.java new file mode 100644 index 00000000..a2dd78df --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestGiftConfigurationEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.GiftConfigurationComposer; + +public class RequestGiftConfigurationEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new GiftConfigurationComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestMarketplaceConfigEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestMarketplaceConfigEvent.java new file mode 100644 index 00000000..4962d6cf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestMarketplaceConfigEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceConfigComposer; + +public class RequestMarketplaceConfigEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new MarketplaceConfigComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestPetBreedsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestPetBreedsEvent.java new file mode 100644 index 00000000..6d210713 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/RequestPetBreedsEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.PetBreedsComposer; + +public class RequestPetBreedsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String petName = this.packet.readString(); + this.client.sendResponse(new PetBreedsComposer(petName, Emulator.getGameEnvironment().getPetManager().getBreeds(petName))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java new file mode 100644 index 00000000..4b4c0274 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class BuyItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int offerId = this.packet.readInt(); + + MarketPlace.buyItem(offerId, this.client); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java new file mode 100644 index 00000000..f4b78542 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RequestCreditsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + MarketPlace.getCredits(this.client); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestItemInfoEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestItemInfoEvent.java new file mode 100644 index 00000000..f12912d4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestItemInfoEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceItemInfoComposer; + +public class RequestItemInfoEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.packet.readInt(); + int id = this.packet.readInt(); + + this.client.sendResponse(new MarketplaceItemInfoComposer(id)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOffersEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOffersEvent.java new file mode 100644 index 00000000..18cf4a40 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOffersEvent.java @@ -0,0 +1,51 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceOffer; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceOffersComposer; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class RequestOffersEvent extends MessageHandler +{ + public final static Map cachedResults = new ConcurrentHashMap<>(0); + @Override + public void handle() throws Exception + { + int min = this.packet.readInt(); + int max = this.packet.readInt(); + String query = this.packet.readString(); + int type = this.packet.readInt(); + + boolean tryCache = false; + if (min == -1 && max == -1 && query.isEmpty()) + { + tryCache = true; + } + + if (tryCache) + { + ServerMessage message = cachedResults.get(type); + if (message != null) + { + this.client.sendResponse(message); + return; + } + } + + List offers = MarketPlace.getOffers(min, max, query, type); + + ServerMessage message = new MarketplaceOffersComposer(offers).compose(); + if (tryCache) + { + cachedResults.put(type, message); + } + + this.client.sendResponse(message); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOwnItemsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOwnItemsEvent.java new file mode 100644 index 00000000..02503e48 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestOwnItemsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceOwnItemsComposer; + +public class RequestOwnItemsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new MarketplaceOwnItemsComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestSellItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestSellItemEvent.java new file mode 100644 index 00000000..21be3e08 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestSellItemEvent.java @@ -0,0 +1,18 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceSellItemComposer; + +public class RequestSellItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(MarketPlace.MARKETPLACE_ENABLED) + this.client.sendResponse(new MarketplaceSellItemComposer(1, 0, 0)); + else + this.client.sendResponse(new MarketplaceSellItemComposer(3, 0, 0)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/SellItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/SellItemEvent.java new file mode 100644 index 00000000..4986d99c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/SellItemEvent.java @@ -0,0 +1,59 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceItemPostedComposer; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceSellItemComposer; + +public class SellItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + + if(!MarketPlace.MARKETPLACE_ENABLED) + { + this.client.sendResponse(new MarketplaceSellItemComposer(3, 0, 0)); + return; + } + + int credits = this.packet.readInt(); + + int unknown = this.packet.readInt(); + int itemId = this.packet.readInt(); + + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(itemId); + if(item != null) + { + if (!item.getBaseItem().allowMarketplace()) + { + String message = Emulator.getTexts().getValue("scripter.warning.marketplace.forbidden").replace("%username%", client.getHabbo().getHabboInfo().getUsername()).replace("%itemname%", item.getBaseItem().getName()).replace("%credits%", credits + ""); + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + if(credits < 0) + { + String message = Emulator.getTexts().getValue("scripter.warning.marketplace.negative").replace("%username%", client.getHabbo().getHabboInfo().getUsername()).replace("%itemname%", item.getBaseItem().getName()).replace("%credits%", credits + ""); + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + if(MarketPlace.sellItem(this.client, item, credits)) + { + this.client.sendResponse(new MarketplaceItemPostedComposer(MarketplaceItemPostedComposer.POST_SUCCESS)); + } + else + { + this.client.sendResponse(new MarketplaceItemPostedComposer(MarketplaceItemPostedComposer.FAILED_TECHNICAL_ERROR)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java new file mode 100644 index 00000000..98927a7f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TakeBackItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int offerId = this.packet.readInt(); + MarketPlace.takeBackItem(this.client.getHabbo(), offerId); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/OpenRecycleBoxEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/OpenRecycleBoxEvent.java new file mode 100644 index 00000000..67110b0e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/OpenRecycleBoxEvent.java @@ -0,0 +1,75 @@ +package com.eu.habbo.messages.incoming.catalog.recycler; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionGift; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.UpdateStackHeightComposer; +import com.eu.habbo.messages.outgoing.rooms.items.PresentItemOpenedComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.threading.runnables.OpenGift; + +public class OpenRecycleBoxEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + HabboItem item = room.getHabboItem(this.packet.readInt()); + + if(item == null) + return; + + if(item instanceof InteractionGift) + { + if(item.getBaseItem().getName().contains("present_wrap")) + { + ((InteractionGift) item).explode = true; + room.updateItem(item); + } + + Emulator.getThreading().run(new OpenGift(item, this.client.getHabbo(), room), item.getBaseItem().getName().contains("present_wrap") ? 1000 : 0); + } + else + { + if (item.getExtradata().length() == 0) + { + this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(Emulator.getTexts().getValue("error.recycler.box.empty"), this.client.getHabbo(), this.client.getHabbo(), RoomChatMessageBubbles.BOT))); + } else + { + HabboItem reward = Emulator.getGameEnvironment().getItemManager().handleOpenRecycleBox(this.client.getHabbo(), item); + + if (reward != null) + { + this.client.getHabbo().getInventory().getItemsComponent().addItem(reward); + this.client.sendResponse(new AddHabboItemComposer(reward)); + this.client.sendResponse(new InventoryRefreshComposer()); + + this.client.sendResponse(new PresentItemOpenedComposer(reward, item.getExtradata(), true)); + } + } + room.sendComposer(new RemoveFloorItemComposer(item).compose()); + room.removeHabboItem(item); + + } + + if(item.getRoomId() == 0) + { + room.updateTile(room.getLayout().getTile(item.getX(), item.getY())); + room.sendComposer(new UpdateStackHeightComposer(item.getX(), item.getY(), room.getStackHeight(item.getX(), item.getY(), true)).compose()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java new file mode 100644 index 00000000..c0539bd4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java @@ -0,0 +1,82 @@ +package com.eu.habbo.messages.incoming.catalog.recycler; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.items.ItemManager; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer; +import com.eu.habbo.messages.outgoing.catalog.RecyclerCompleteComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.HotelWillCloseInMinutesComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; +import com.eu.habbo.threading.runnables.ShutdownEmulator; +import gnu.trove.set.hash.THashSet; + +public class RecycleEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (ShutdownEmulator.timestamp > 0) + { + this.client.sendResponse(new HotelWillCloseInMinutesComposer((ShutdownEmulator.timestamp - Emulator.getIntUnixTimestamp()) / 60)); + return; + } + + if(Emulator.getGameEnvironment().getCatalogManager().ecotronItem != null && ItemManager.RECYCLER_ENABLED) + { + THashSet items = new THashSet(); + + int count = this.packet.readInt(); + + for (int i = 0; i < count; i++) + { + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(this.packet.readInt()); + + if (item == null) + return; + + if (item.getBaseItem().allowRecyle()) + { + items.add(item); + } + } + + if (items.size() == count) + { + for (HabboItem item : items) + { + this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); + this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + } + else + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + HabboItem reward = Emulator.getGameEnvironment().getItemManager().handleRecycle(this.client.getHabbo(), Emulator.getGameEnvironment().getCatalogManager().getRandomRecyclerPrize().getId() + ""); + if(reward == null) + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + + this.client.sendResponse(new AddHabboItemComposer(reward)); + this.client.getHabbo().getInventory().getItemsComponent().addItem(reward); + this.client.sendResponse(new RecyclerCompleteComposer(RecyclerCompleteComposer.RECYCLING_COMPLETE)); + this.client.sendResponse(new InventoryRefreshComposer()); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("FurnimaticQuest")); + } + else + { + this.client.sendResponse(new RecyclerCompleteComposer(RecyclerCompleteComposer.RECYCLING_CLOSED)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/ReloadRecyclerEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/ReloadRecyclerEvent.java new file mode 100644 index 00000000..9a4a6310 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/ReloadRecyclerEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog.recycler; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.ReloadRecyclerComposer; + +public class ReloadRecyclerEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new ReloadRecyclerComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RequestRecyclerLogicEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RequestRecyclerLogicEvent.java new file mode 100644 index 00000000..3cc72436 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RequestRecyclerLogicEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.catalog.recycler; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.RecyclerLogicComposer; + +public class RequestRecyclerLogicEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new RecyclerLogicComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingAddRecipeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingAddRecipeEvent.java new file mode 100644 index 00000000..b9500156 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingAddRecipeEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertLimitedSoldOutComposer; +import com.eu.habbo.messages.outgoing.crafting.CraftingRecipeComposer; + +public class CraftingAddRecipeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String recipeName = this.packet.readString(); + CraftingRecipe recipe = Emulator.getGameEnvironment().getCraftingManager().getRecipe(recipeName); + + if (recipe != null) + { + if (!recipe.canBeCrafted()) + { + this.client.sendResponse(new AlertLimitedSoldOutComposer()); + return; + } + + this.client.sendResponse(new CraftingRecipeComposer(recipe)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java new file mode 100644 index 00000000..4f16e912 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java @@ -0,0 +1,91 @@ +package com.eu.habbo.messages.incoming.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.crafting.CraftingAltar; +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertLimitedSoldOutComposer; +import com.eu.habbo.messages.outgoing.crafting.CraftingResultComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItems; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TObjectProcedure; + +import java.util.Map; + +public class CraftingCraftItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int craftingTable = this.packet.readInt(); + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(craftingTable); + CraftingAltar altar = Emulator.getGameEnvironment().getCraftingManager().getAltar(item.getBaseItem()); + CraftingRecipe recipe = altar.getRecipe(this.packet.readString()); + + if (recipe != null) + { + if (!recipe.canBeCrafted()) + { + this.client.sendResponse(new AlertLimitedSoldOutComposer()); + return; + } + + TIntObjectHashMap toRemove = new TIntObjectHashMap(); + for (Map.Entry set : recipe.getIngredients().entrySet()) + { + for (int i = 0; i < set.getValue(); i++) + { + HabboItem habboItem = this.client.getHabbo().getInventory().getItemsComponent().getAndRemoveHabboItem(set.getKey()); + + if (habboItem == null) + { + return; + } + + toRemove.put(habboItem.getId(), habboItem); + } + } + + HabboItem rewardItem = Emulator.getGameEnvironment().getItemManager().createItem(this.client.getHabbo().getHabboInfo().getId(), recipe.getReward(), 0, 0, ""); + + if (rewardItem != null) + { + if (recipe.isLimited()) + { + recipe.decrease(); + } + + if (!recipe.getAchievement().isEmpty()) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement(recipe.getAchievement())); + } + + this.client.sendResponse(new CraftingResultComposer(recipe)); + this.client.getHabbo().getInventory().getItemsComponent().addItem(rewardItem); + this.client.sendResponse(new AddHabboItemComposer(rewardItem)); + toRemove.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(HabboItem object) + { + client.sendResponse(new RemoveHabboItemComposer(object.getId())); + return true; + } + }); + this.client.sendResponse(new InventoryRefreshComposer()); + + Emulator.getThreading().run(new QueryDeleteHabboItems(toRemove)); + return; + } + + } + + this.client.sendResponse(new CraftingResultComposer(null)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java new file mode 100644 index 00000000..f641ecc0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java @@ -0,0 +1,104 @@ +package com.eu.habbo.messages.incoming.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.crafting.CraftingAltar; +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertLimitedSoldOutComposer; +import com.eu.habbo.messages.outgoing.crafting.CraftingResultComposer; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.Map; +import java.util.Set; + +public class CraftingCraftSecretEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int altarId = this.packet.readInt(); + int count = this.packet.readInt(); + + HabboItem craftingAltar = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(altarId); + + if (craftingAltar != null) + { + CraftingAltar altar = Emulator.getGameEnvironment().getCraftingManager().getAltar(craftingAltar.getBaseItem()); + + if (altar != null) + { + Set habboItems = new THashSet(); + Map items = new THashMap(); + + for (int i = 0; i < count; i++) + { + HabboItem habboItem = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(this.packet.readInt()); + + if (habboItem == null) + { + this.client.sendResponse(new CraftingResultComposer(null)); + return; + } + + habboItems.add(habboItem); + + if (!items.containsKey(habboItem.getBaseItem())) + { + items.put(habboItem.getBaseItem(), 0); + } + + items.put(habboItem.getBaseItem(), items.get(habboItem.getBaseItem()) + 1); + } + + CraftingRecipe recipe = altar.getRecipe(items); + + if (recipe != null) + { + if (!recipe.canBeCrafted()) + { + this.client.sendResponse(new AlertLimitedSoldOutComposer()); + return; + } + + HabboItem rewardItem = Emulator.getGameEnvironment().getItemManager().createItem(this.client.getHabbo().getHabboInfo().getId(), recipe.getReward(), 0, 0, ""); + + if (rewardItem != null) + { + if (recipe.isLimited()) + { + recipe.decrease(); + } + + if (!recipe.getAchievement().isEmpty()) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement(recipe.getAchievement())); + } + + this.client.sendResponse(new CraftingResultComposer(recipe)); + this.client.getHabbo().getHabboStats().addRecipe(recipe.getId()); + this.client.getHabbo().getInventory().getItemsComponent().addItem(rewardItem); + this.client.sendResponse(new AddHabboItemComposer(rewardItem)); + for (HabboItem item : habboItems) + { + this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); + this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + this.client.sendResponse(new InventoryRefreshComposer()); + return; + } + } + } + } + + this.client.sendResponse(new CraftingResultComposer(null)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesAvailableEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesAvailableEvent.java new file mode 100644 index 00000000..025b1261 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesAvailableEvent.java @@ -0,0 +1,68 @@ +package com.eu.habbo.messages.incoming.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.crafting.CraftingAltar; +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.crafting.CraftingRecipeComposer; +import com.eu.habbo.messages.outgoing.crafting.CraftingRecipesAvailableComposer; +import com.eu.habbo.messages.outgoing.crafting.CraftingResultComposer; +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +public class RequestCraftingRecipesAvailableEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int altarId = this.packet.readInt(); + + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(altarId); + + CraftingAltar altar = Emulator.getGameEnvironment().getCraftingManager().getAltar(item.getBaseItem()); + + if (altar != null) + { + Map items = new THashMap(); + + int count = this.packet.readInt(); + for (int i = 0; i < count; i++) + { + HabboItem habboItem = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(this.packet.readInt()); + + if (habboItem != null) + { + if (!items.containsKey(habboItem.getBaseItem())) + { + items.put(habboItem.getBaseItem(), 0); + } + + items.put(habboItem.getBaseItem(), items.get(habboItem.getBaseItem()) + 1); + } + } + + Map recipes = altar.matchRecipes(items); + + boolean found = false; + int c = recipes.size(); + for (Map.Entry set : recipes.entrySet()) + { + if (this.client.getHabbo().getHabboStats().hasRecipe(set.getKey().getId())) + { + c--; + continue; + } + + if (set.getValue()) + { + found = true; + break; + } + } + this.client.sendResponse(new CraftingRecipesAvailableComposer(c, found)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesEvent.java new file mode 100644 index 00000000..440b0221 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/RequestCraftingRecipesEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.crafting; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.crafting.CraftingAltar; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.crafting.CraftableProductsComposer; +import com.eu.habbo.messages.outgoing.crafting.CraftingRecipesAvailableComposer; + +public class RequestCraftingRecipesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item != null) + { + CraftingAltar altar = Emulator.getGameEnvironment().getCraftingManager().getAltar(item.getBaseItem()); + + if (altar != null) + { + this.client.sendResponse(new CraftableProductsComposer(altar.getRecipesForHabbo(this.client.getHabbo()), altar.getIngredients())); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarForceOpenEvent.java b/src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarForceOpenEvent.java new file mode 100644 index 00000000..87cdf6b4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarForceOpenEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.events.calendar; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class AdventCalendarForceOpenEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String campaign = this.packet.readString(); + int day = this.packet.readInt(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarOpenDayEvent.java b/src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarOpenDayEvent.java new file mode 100644 index 00000000..d219ce3f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/events/calendar/AdventCalendarOpenDayEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.incoming.events.calendar; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.events.calendar.AdventCalendarProductComposer; + +public class AdventCalendarOpenDayEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String campaign = this.packet.readString(); + int day = this.packet.readInt(); + + Emulator.getGameEnvironment().getCatalogManager().claimCalendarReward(this.client.getHabbo(), day); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestBlockedTilesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestBlockedTilesEvent.java new file mode 100644 index 00000000..aaafccf9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestBlockedTilesEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.floorplaneditor; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.floorplaneditor.FloorPlanEditorBlockedTilesComposer; + +public class FloorPlanEditorRequestBlockedTilesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + this.client.sendResponse(new FloorPlanEditorBlockedTilesComposer(this.client.getHabbo().getHabboInfo().getCurrentRoom())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestDoorSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestDoorSettingsEvent.java new file mode 100644 index 00000000..6ed783ee --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorRequestDoorSettingsEvent.java @@ -0,0 +1,18 @@ +package com.eu.habbo.messages.incoming.floorplaneditor; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.floorplaneditor.FloorPlanEditorDoorSettingsComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomFloorThicknessUpdatedComposer; + +public class FloorPlanEditorRequestDoorSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + this.client.sendResponse(new FloorPlanEditorDoorSettingsComposer(this.client.getHabbo().getHabboInfo().getCurrentRoom())); + this.client.sendResponse(new RoomFloorThicknessUpdatedComposer(this.client.getHabbo().getHabboInfo().getCurrentRoom())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java new file mode 100644 index 00000000..b56bff53 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java @@ -0,0 +1,123 @@ +package com.eu.habbo.messages.incoming.floorplaneditor; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.CustomRoomLayout; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.Collection; + +public class FloorPlanEditorSaveEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (!this.client.getHabbo().hasPermission("acc_floorplan_editor")) + { + this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("floorplan.permission"))); + return; + } + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + String map = this.packet.readString(); + + if(map.isEmpty() || map.length() == 0) + return; + + int lengthX = -1; + + String[] data = map.split(((char)13) + ""); + + if(data.length > 64) + { + this.client.sendResponse(new GenericAlertComposer("Incorrect Floorplan! Maximum size of 64 x 64")); + return; + } + + for(String s : data) + { + if(lengthX == -1) + { + lengthX = s.length(); + } + + if(s.length() != lengthX || s.length() > 50) + { + this.client.sendResponse(new GenericAlertComposer("Incorrect Floorplan! Maximum size of 64 x 64")); + return; + } + } + + int doorX = this.packet.readInt(); + int doorY = this.packet.readInt(); + int doorRotation = this.packet.readInt(); + int wallSize = this.packet.readInt(); + int floorSize = this.packet.readInt(); + int wallHeight = -1; + + if (doorX < 0 || doorY < 0) + return; + + if(this.packet.bytesAvailable() >= 4) + wallHeight = this.packet.readInt(); + + RoomLayout layout = room.getLayout(); + + if(layout instanceof CustomRoomLayout) + { + layout.setDoorX((short) doorX); + layout.setDoorY((short) doorY); + layout.setDoorDirection(doorRotation); + layout.setHeightmap(map); + layout.parse(); + + if (layout.getDoorTile() == null) + { + this.client.sendResponse(new GenericAlertComposer("Error")); + ((CustomRoomLayout)layout).needsUpdate(false); + Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); + return; + } + ((CustomRoomLayout)layout).needsUpdate(true); + Emulator.getThreading().run((CustomRoomLayout)layout); + } + else + { + layout = Emulator.getGameEnvironment().getRoomManager().insertCustomLayout(room, map, doorX, doorY, doorRotation); + } + + if(layout != null) + { + room.setHasCustomLayout(true); + room.setNeedsUpdate(true); + room.setLayout(layout); + room.setWallSize(wallSize); + room.setFloorSize(floorSize); + room.setWallHeight(wallHeight); + room.save(); + Collection habbos = new ArrayList(room.getUserCount()); + habbos.addAll(room.getHabbos()); + Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); + room = Emulator.getGameEnvironment().getRoomManager().loadRoom(room.getId()); + ServerMessage message = new ForwardToRoomComposer(room.getId()).compose(); + for (Habbo habbo : habbos) + { + habbo.getClient().sendResponse(message); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/AcceptFriendRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/AcceptFriendRequestEvent.java new file mode 100644 index 00000000..12c27c3c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/AcceptFriendRequestEvent.java @@ -0,0 +1,50 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class AcceptFriendRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int count = this.packet.readInt(); + int userId; + + for(int i = 0; i < count; i++) + { + userId = this.packet.readInt(); + + if(userId == 0) + return; + + if(this.client.getHabbo().getMessenger().getFriends().containsKey(userId)) + continue; + + this.client.getHabbo().getMessenger().acceptFriendRequest(userId, this.client.getHabbo().getHabboInfo().getId()); + + int progress = this.client.getHabbo().getHabboStats().getAchievementProgress(Emulator.getGameEnvironment().getAchievementManager().getAchievement("FriendListSize")); + + int toProgress = 1; + + Achievement achievement = Emulator.getGameEnvironment().getAchievementManager().getAchievement("FriendListSize"); + + if(achievement == null) + return; + + if (progress > 0) + { + toProgress = this.client.getHabbo().getMessenger().getFriends().size() - progress; + + if(toProgress < 0) + { + return; + } + } + + AchievementManager.progressAchievement(this.client.getHabbo(), achievement, toProgress); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/ChangeRelationEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/ChangeRelationEvent.java new file mode 100644 index 00000000..ab72e687 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/ChangeRelationEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.UpdateFriendComposer; +import com.eu.habbo.plugin.events.users.friends.UserRelationShipEvent; + +public class ChangeRelationEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + int relationId = this.packet.readInt(); + + MessengerBuddy buddy = this.client.getHabbo().getMessenger().getFriends().get(userId); + if(buddy != null && relationId >= 0 && relationId <= 3) + { + UserRelationShipEvent event = new UserRelationShipEvent(this.client.getHabbo(), buddy, relationId); + if (!event.isCancelled()) + { + buddy.setRelation(event.relationShip); + this.client.sendResponse(new UpdateFriendComposer(buddy)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/DeclineFriendRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/DeclineFriendRequestEvent.java new file mode 100644 index 00000000..3bff2274 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/DeclineFriendRequestEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class DeclineFriendRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + boolean all = this.packet.readBoolean(); + + if (all) + { + this.client.getHabbo().getMessenger().deleteAllFriendRequests(this.client.getHabbo().getHabboInfo().getId()); + } + else + { + int count = this.packet.readInt(); + + for (int i = 0; i < count; i++) + { + this.client.getHabbo().getMessenger().deleteFriendRequests(this.packet.readInt(), this.client.getHabbo().getHabboInfo().getId()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/FindNewFriendsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/FindNewFriendsEvent.java new file mode 100644 index 00000000..c8dc373c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/FindNewFriendsEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.FriendFindingRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class FindNewFriendsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + List roomCategories = Emulator.getGameEnvironment().getRoomManager().roomCategoriesForHabbo(this.client.getHabbo()); + Collections.shuffle(roomCategories); + + for (RoomCategory category : roomCategories) + { + List rooms = Emulator.getGameEnvironment().getRoomManager().getActiveRooms(category.getId()); + + if(!rooms.isEmpty()) + { + Room room = rooms.get(0); + + if (room.getUserCount() > 0) + { + if (room != null) + { + this.client.sendResponse(new ForwardToRoomComposer(room.getId())); + return; + } + } + } + } + + this.client.sendResponse(new FriendFindingRoomComposer(FriendFindingRoomComposer.NO_ROOM_FOUND)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/FriendPrivateMessageEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/FriendPrivateMessageEvent.java new file mode 100644 index 00000000..e7520a58 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/FriendPrivateMessageEvent.java @@ -0,0 +1,69 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.habbohotel.messenger.Message; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.modtool.WordFilter; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.FriendChatMessageComposer; +import com.eu.habbo.plugin.events.users.friends.UserFriendChatEvent; + +public class FriendPrivateMessageEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + String message = this.packet.readString(); + + if (!this.client.getHabbo().getHabboStats().allowTalk()) + { + return; + } + + long millis = System.currentTimeMillis(); + if (millis - this.client.getHabbo().getHabboStats().lastChat < 750) + { + return; + } + this.client.getHabbo().getHabboStats().lastChat = millis; + + if(userId == Emulator.publicChatBuddy.getId()) + { + if(message.startsWith(":")) + { + CommandHandler.handleCommand(this.client, message); + return; + } + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new FriendChatMessageComposer(new Message(this.client.getHabbo().getHabboInfo().getId(), -1, message)).compose(), "acc_staff_chat", this.client); + return; + } + + MessengerBuddy buddy = this.client.getHabbo().getMessenger().getFriend(userId); + if (buddy == null) + { + return; + } + + UserFriendChatEvent event = new UserFriendChatEvent(this.client.getHabbo(), buddy, message); + if(Emulator.getPluginManager().fireEvent(event).isCancelled()) + return; + + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(userId); + + if(habbo == null) + return; + + Message chatMessage = new Message(this.client.getHabbo().getHabboInfo().getId(), userId, event.message); + Emulator.getThreading().run(chatMessage); + + if (WordFilter.ENABLED_FRIENDCHAT) + { + chatMessage.setMessage(Emulator.getGameEnvironment().getWordFilter().filter(chatMessage.getMessage(), this.client.getHabbo())); + } + + Emulator.getGameServer().getGameClientManager().getClient(habbo).sendResponse(new FriendChatMessageComposer(chatMessage)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/FriendRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/FriendRequestEvent.java new file mode 100644 index 00000000..703cb866 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/FriendRequestEvent.java @@ -0,0 +1,98 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.FriendRequest; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.FriendRequestComposer; +import com.eu.habbo.messages.outgoing.friends.FriendRequestErrorComposer; +import com.eu.habbo.plugin.events.users.friends.UserRequestFriendshipEvent; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Created on 25-8-2014 18:11. + */ +public class FriendRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String username = packet.readString(); + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(username); + + if(Emulator.getPluginManager().fireEvent(new UserRequestFriendshipEvent(this.client.getHabbo(), username, habbo)).isCancelled()) + { + this.client.sendResponse(new FriendRequestErrorComposer(2)); + return; + } + + int id = 0; + boolean allowFriendRequests = true; + + FriendRequest friendRequest = this.client.getHabbo().getMessenger().findFriendRequest(username); + if (friendRequest != null) + { + this.client.getHabbo().getMessenger().acceptFriendRequest(friendRequest.getId(), this.client.getHabbo().getHabboInfo().getId()); + return; + } + + if(!Messenger.canFriendRequest(this.client.getHabbo(), username)) + { + this.client.sendResponse(new FriendRequestErrorComposer(FriendRequestErrorComposer.TARGET_NOT_FOUND)); + return; + } + + if(habbo == null) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users_settings.block_friendrequests, users.id FROM users INNER JOIN users_settings ON users.id = users_settings.user_id WHERE username = ? LIMIT 1")) + { + statement.setString(1, username); + try (ResultSet set = statement.executeQuery()) + { + while (set.next()) + { + id = set.getInt("id"); + allowFriendRequests = set.getString("block_friendrequests").equalsIgnoreCase("0"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + return; + } + } + else + { + id = habbo.getHabboInfo().getId(); + allowFriendRequests = !habbo.getHabboStats().blockFriendRequests; + if(allowFriendRequests) + habbo.getClient().sendResponse(new FriendRequestComposer(this.client.getHabbo())); + } + + if(id != 0) + { + if(!allowFriendRequests) + { + this.client.sendResponse(new FriendRequestErrorComposer(FriendRequestErrorComposer.TARGET_NOT_ACCEPTING_REQUESTS)); + return; + } + + if(this.client.getHabbo().getMessenger().getFriends().values().size() >= Messenger.MAXIMUM_FRIENDS) + { + this.client.sendResponse(new FriendRequestErrorComposer(FriendRequestErrorComposer.FRIEND_LIST_OWN_FULL)); + return; + } + Messenger.makeFriendRequest(this.client.getHabbo().getHabboInfo().getId(), id); + } + else + { + this.client.sendResponse(new FriendRequestErrorComposer(FriendRequestErrorComposer.TARGET_NOT_FOUND)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/InviteFriendsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/InviteFriendsEvent.java new file mode 100644 index 00000000..f64b27f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/InviteFriendsEvent.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.RoomInviteComposer; + +public class InviteFriendsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboStats().allowTalk()) + { + int[] userIds = new int[this.packet.readInt()]; + + for (int i = 0; i < userIds.length; i++) + { + userIds[i] = this.packet.readInt(); + } + + String message = this.packet.readString(); + + for (int i : userIds) + { + if (i == 0) + continue; + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(i); + + if (habbo != null) + { + if (!habbo.getHabboStats().blockRoomInvites) + { + habbo.getClient().sendResponse(new RoomInviteComposer(this.client.getHabbo().getHabboInfo().getId(), message)); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/RemoveFriendEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/RemoveFriendEvent.java new file mode 100644 index 00000000..bb96a1e3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/RemoveFriendEvent.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.RemoveFriendComposer; +import gnu.trove.list.array.TIntArrayList; + +public class RemoveFriendEvent extends MessageHandler +{ + + private final TIntArrayList removedFriends; + + public RemoveFriendEvent() + { + this.removedFriends = new TIntArrayList(); + } + + @Override + public void handle() throws Exception + { + int count = this.packet.readInt(); + for(int i = 0; i < count; i++) + { + int habboId = this.packet.readInt(); + this.removedFriends.add(habboId); + + Messenger.unfriend(this.client.getHabbo().getHabboInfo().getId(), habboId); + this.client.getHabbo().getMessenger().removeBuddy(habboId); + + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(habboId); + + if(habbo != null) + { + habbo.getMessenger().removeBuddy(this.client.getHabbo()); + Emulator.getGameServer().getGameClientManager().getClient(habbo).sendResponse(new RemoveFriendComposer(this.client.getHabbo().getHabboInfo().getId())); + } + } + + this.client.sendResponse(new RemoveFriendComposer(this.removedFriends)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendRequestsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendRequestsEvent.java new file mode 100644 index 00000000..4f6b94ab --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendRequestsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.LoadFriendRequestsComposer; + +public class RequestFriendRequestsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new LoadFriendRequestsComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendsEvent.java new file mode 100644 index 00000000..cf29484d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/RequestFriendsEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.FriendsComposer; +import com.eu.habbo.messages.outgoing.friends.MessengerInitComposer; + +public class RequestFriendsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + /*ArrayList messages = new ArrayList(); + + messages.add(new FriendsComposer(this.client.getHabbo()).compose()); + messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + + this.client.sendResponses(messages);*/ + + //this.client.sendResponse(new FriendsComposer(this.client.getHabbo())); + + //this.client.sendResponse(new MessengerInitComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/RequestInitFriendsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/RequestInitFriendsEvent.java new file mode 100644 index 00000000..9704f776 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/RequestInitFriendsEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.FriendsComposer; +import com.eu.habbo.messages.outgoing.friends.MessengerInitComposer; + +import java.util.ArrayList; + +public class RequestInitFriendsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + ArrayList messages = new ArrayList(); +// + messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + messages.add(new FriendsComposer(this.client.getHabbo()).compose()); + this.client.sendResponses(messages); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/SearchUserEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/SearchUserEvent.java new file mode 100644 index 00000000..5e7dab56 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/SearchUserEvent.java @@ -0,0 +1,45 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.UserSearchResultComposer; +import gnu.trove.set.hash.THashSet; + +import java.util.concurrent.ConcurrentHashMap; + +public class SearchUserEvent extends MessageHandler +{ + public static ConcurrentHashMap> cachedResults = new ConcurrentHashMap<>(); + + @Override + public void handle() throws Exception + { + if (System.currentTimeMillis() - this.client.getHabbo().getHabboStats().lastUsersSearched < 3000) + return; + + String username = this.packet.readString().replace(" ", "").toLowerCase(); + + if (username.isEmpty()) + return; + + if (username.length() > 15) + { + username = username.substring(0, 15); + } + + if (this.client.getHabbo().getMessenger() != null) + { + THashSet buddies = cachedResults.get(username); + + if (buddies == null) + { + buddies = Messenger.searchUsers(username); + cachedResults.put(username, buddies); + } + + this.client.sendResponse(new UserSearchResultComposer(buddies, this.client.getHabbo().getMessenger().getFriends(username), this.client.getHabbo())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/friends/StalkFriendEvent.java b/src/main/java/com/eu/habbo/messages/incoming/friends/StalkFriendEvent.java new file mode 100644 index 00000000..a7b81665 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/friends/StalkFriendEvent.java @@ -0,0 +1,57 @@ +package com.eu.habbo.messages.incoming.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.StalkErrorComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class StalkFriendEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int friendId = this.packet.readInt(); + + MessengerBuddy buddy = this.client.getHabbo().getMessenger().getFriend(friendId); + + if(buddy == null) + { + this.client.sendResponse(new StalkErrorComposer(StalkErrorComposer.NOT_IN_FRIEND_LIST)); + return; + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(friendId); + + if(habbo == null || !habbo.isOnline()) + { + this.client.sendResponse(new StalkErrorComposer(StalkErrorComposer.FRIEND_OFFLINE)); + return; + } + + if(habbo.getHabboStats().blockFollowing) + { + this.client.sendResponse(new StalkErrorComposer(StalkErrorComposer.FRIEND_BLOCKED_STALKING)); + return; + } + + if(habbo.getHabboInfo().getCurrentRoom() == null) + { + this.client.sendResponse(new StalkErrorComposer(StalkErrorComposer.FRIEND_NOT_IN_ROOM)); + return; + } + + if(habbo.getHabboInfo().getCurrentRoom() != this.client.getHabbo().getHabboInfo().getCurrentRoom()) + { + this.client.sendResponse(new ForwardToRoomComposer(habbo.getHabboInfo().getCurrentRoom().getId())); + } + else + { + this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(Emulator.getTexts().getValue("stalk.failed.same.room").replace("%user%", habbo.getHabboInfo().getUsername()), this.client.getHabbo(), this.client.getHabbo(), RoomChatMessageBubbles.ALERT))); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterEvent.java new file mode 100644 index 00000000..71af22b1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterEvent.java @@ -0,0 +1,11 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GameCenterEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterJoinGameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterJoinGameEvent.java new file mode 100644 index 00000000..3b5b4641 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterJoinGameEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.gamecenter.GameCenterAchievementsConfigurationComposer; +import com.eu.habbo.messages.outgoing.gamecenter.basejump.BaseJumpJoinQueueComposer; +import com.eu.habbo.messages.outgoing.gamecenter.basejump.BaseJumpLoadGameComposer; +import com.eu.habbo.messages.outgoing.gamecenter.basejump.BaseJumpLoadGameURLComposer; + +public class GameCenterJoinGameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int gameId = this.packet.readInt(); + + if (gameId == 3) //BaseJump + { + this.client.sendResponse(new GameCenterAchievementsConfigurationComposer()); + this.client.sendResponse(new BaseJumpLoadGameURLComposer()); + this.client.sendResponse(new BaseJumpLoadGameComposer(this.client, 3)); + } + else if (gameId == 4) + { + this.client.sendResponse(new BaseJumpJoinQueueComposer(4)); + this.client.sendResponse(new BaseJumpLoadGameURLComposer()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLeaveGameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLeaveGameEvent.java new file mode 100644 index 00000000..2d12ff08 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLeaveGameEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.gamecenter.basejump.BaseJumpUnloadGameComposer; + +public class GameCenterLeaveGameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new BaseJumpUnloadGameComposer()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLoadGameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLoadGameEvent.java new file mode 100644 index 00000000..148a804b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterLoadGameEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GameCenterLoadGameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int gameId = this.packet.readInt(); + + if (gameId == 3) + { + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestAccountStatusEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestAccountStatusEvent.java new file mode 100644 index 00000000..93e8b7ea --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestAccountStatusEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.gamecenter.GameCenterAccountInfoComposer; + +public class GameCenterRequestAccountStatusEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new GameCenterAccountInfoComposer(this.packet.readInt(), 10)); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGameStatusEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGameStatusEvent.java new file mode 100644 index 00000000..da4a9d99 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGameStatusEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.gamecenter.GameCenterGameComposer; + +public class GameCenterRequestGameStatusEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new GameCenterGameComposer(this.packet.readInt(), GameCenterGameComposer.OK)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGamesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGamesEvent.java new file mode 100644 index 00000000..5df6e1ff --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/gamecenter/GameCenterRequestGamesEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.gamecenter; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.gamecenter.GameCenterAchievementsConfigurationComposer; + +public class GameCenterRequestGamesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new GameCenterAchievementsConfigurationComposer()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianAcceptRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianAcceptRequestEvent.java new file mode 100644 index 00000000..abd4ebbc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianAcceptRequestEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.guardians; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GuardianAcceptRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Emulator.getGameEnvironment().getGuideManager().acceptTicket(this.client.getHabbo(), this.packet.readBoolean()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianNoUpdatesWantedEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianNoUpdatesWantedEvent.java new file mode 100644 index 00000000..505a8ccc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianNoUpdatesWantedEvent.java @@ -0,0 +1,12 @@ +package com.eu.habbo.messages.incoming.guardians; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GuardianNoUpdatesWantedEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + //TODO: Add dont care about ticket updates. + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianVoteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianVoteEvent.java new file mode 100644 index 00000000..93efd24f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guardians/GuardianVoteEvent.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.incoming.guardians; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.guides.GuardianVoteType; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GuardianVoteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int voteType = this.packet.readInt(); + + GuardianTicket ticket = Emulator.getGameEnvironment().getGuideManager().getTicketForGuardian(this.client.getHabbo()); + + if(ticket != null) + { + GuardianVoteType type = GuardianVoteType.NOT_VOTED; + + if(voteType == 0) + { + type = GuardianVoteType.ACCEPTABLY; + } + else if(voteType == 1) + { + type = GuardianVoteType.BADLY; + } + else if(voteType == 2) + { + type = GuardianVoteType.AWFULLY; + } + else + { + Emulator.getLogging().logErrorLine("Uknown vote type: " + voteType); + } + + ticket.vote(this.client.getHabbo(), type); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideCancelHelpRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideCancelHelpRequestEvent.java new file mode 100644 index 00000000..facbd04a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideCancelHelpRequestEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GuideCancelHelpRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByNoob(this.client.getHabbo()); + + if(tour != null) + { + tour.end(); + Emulator.getGameEnvironment().getGuideManager().endSession(tour); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideCloseHelpRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideCloseHelpRequestEvent.java new file mode 100644 index 00000000..f8284319 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideCloseHelpRequestEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GuideCloseHelpRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHabbo(this.client.getHabbo()); + + if(tour != null) + { + Emulator.getGameEnvironment().getGuideManager().endSession(tour); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideHandleHelpRequestEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideHandleHelpRequestEvent.java new file mode 100644 index 00000000..19857b95 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideHandleHelpRequestEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GuideHandleHelpRequestEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHelper(this.client.getHabbo()); + + if(tour == null) + { + return; + } + + boolean accepted = this.packet.readBoolean(); + + if(!accepted) + { + Emulator.getGameEnvironment().getGuideManager().declineTour(tour); + } + else + { + Emulator.getGameEnvironment().getGuideManager().startSession(tour, this.client.getHabbo()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideInviteUserEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideInviteUserEvent.java new file mode 100644 index 00000000..2ce04829 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideInviteUserEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionInvitedToGuideRoomComposer; + +public class GuideInviteUserEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHelper(this.client.getHabbo()); + + if(tour != null) + { + ServerMessage message = new GuideSessionInvitedToGuideRoomComposer(this.client.getHabbo().getHabboInfo().getCurrentRoom()).compose(); + tour.getNoob().getClient().sendResponse(message); + tour.getHelper().getClient().sendResponse(message); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideRecommendHelperEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideRecommendHelperEvent.java new file mode 100644 index 00000000..719d1325 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideRecommendHelperEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideRecommendStatus; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionDetachedComposer; + +public class GuideRecommendHelperEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + boolean recommend = this.packet.readBoolean(); + + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByNoob(this.client.getHabbo()); + + if(tour != null) + { + Emulator.getGameEnvironment().getGuideManager().recommend(tour, recommend); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideReportHelperEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideReportHelperEvent.java new file mode 100644 index 00000000..097adc67 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideReportHelperEvent.java @@ -0,0 +1,51 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionDetachedComposer; +import com.eu.habbo.messages.outgoing.guides.GuideSessionEndedComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolReportReceivedAlertComposer; + +public class GuideReportHelperEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String message = this.packet.readString(); + + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHabbo(this.client.getHabbo()); + + if(tour != null) + { + Habbo reported = tour.getHelper(); + + if(reported == this.client.getHabbo()) + { + reported = tour.getNoob(); + } + + ModToolIssue issue = new ModToolIssue(this.client.getHabbo().getHabboInfo().getId(), + this.client.getHabbo().getHabboInfo().getUsername(), + reported.getHabboInfo().getId(), + reported.getHabboInfo().getUsername(), + 0, + message, + ModToolTicketType.GUIDE_SYSTEM); + + + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + this.client.sendResponse(new ModToolReportReceivedAlertComposer(ModToolReportReceivedAlertComposer.REPORT_RECEIVED)); + + this.client.sendResponse(new GuideSessionDetachedComposer()); + this.client.sendResponse(new GuideSessionEndedComposer(GuideSessionEndedComposer.HELP_CASE_CLOSED)); + + reported.getClient().sendResponse(new GuideSessionDetachedComposer()); + reported.getClient().sendResponse(new GuideSessionEndedComposer(GuideSessionEndedComposer.HELP_CASE_CLOSED)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserMessageEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserMessageEvent.java new file mode 100644 index 00000000..38df6e88 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserMessageEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideChatMessage; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionMessageComposer; + +public class GuideUserMessageEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHabbo(this.client.getHabbo()); + + if(tour != null) + { + GuideChatMessage chatMessage = new GuideChatMessage(this.client.getHabbo().getHabboInfo().getId(), this.packet.readString(), Emulator.getIntUnixTimestamp()); + tour.addMessage(chatMessage); + ServerMessage serverMessage = new GuideSessionMessageComposer(chatMessage).compose(); + tour.getHelper().getClient().sendResponse(serverMessage); + tour.getNoob().getClient().sendResponse(serverMessage); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserTypingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserTypingEvent.java new file mode 100644 index 00000000..03fda8d2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideUserTypingEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionPartnerIsTypingComposer; + +public class GuideUserTypingEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + boolean typing = this.packet.readBoolean(); + + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHabbo(this.client.getHabbo()); + + if(tour != null) + { + if(tour.getHelper() == this.client.getHabbo()) + { + tour.getNoob().getClient().sendResponse(new GuideSessionPartnerIsTypingComposer(typing)); + } + else + { + tour.getHelper().getClient().sendResponse(new GuideSessionPartnerIsTypingComposer(typing)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/GuideVisitUserEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideVisitUserEvent.java new file mode 100644 index 00000000..bf8a9f11 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/GuideVisitUserEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionRequesterRoomComposer; + +public class GuideVisitUserEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuideTour tour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHelper(this.client.getHabbo()); + + if(tour != null) + { + this.client.sendResponse(new GuideSessionRequesterRoomComposer(tour.getNoob().getHabboInfo().getCurrentRoom())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideAssistanceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideAssistanceEvent.java new file mode 100644 index 00000000..ad829d2c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideAssistanceEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideSessionErrorComposer; + +public class RequestGuideAssistanceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int type = this.packet.readInt(); + String message = this.packet.readString(); + + GuideTour activeTour = Emulator.getGameEnvironment().getGuideManager().getGuideTourByHabbo(this.client.getHabbo()); + + if(activeTour != null) + { + this.client.sendResponse(new GuideSessionErrorComposer(GuideSessionErrorComposer.SOMETHING_WRONG_REQUEST)); + return; + } + + GuideTour tour = new GuideTour(this.client.getHabbo(), message); + tour.setStartTime(Emulator.getIntUnixTimestamp()); + + Emulator.getGameEnvironment().getGuideManager().findHelper(tour); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideToolEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideToolEvent.java new file mode 100644 index 00000000..40d60f97 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guides/RequestGuideToolEvent.java @@ -0,0 +1,48 @@ +package com.eu.habbo.messages.incoming.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guides.GuideToolsComposer; + +public class RequestGuideToolEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + boolean onDuty = this.packet.readBoolean(); + + if(onDuty) + { + boolean tourRequests = this.packet.readBoolean(); + boolean helperRequests = this.packet.readBoolean(); + boolean bullyReports = this.packet.readBoolean(); + + if(!this.client.getHabbo().hasPermission("acc_helper_use_guide_tool")) + return; + + if(helperRequests && !this.client.getHabbo().hasPermission("acc_helper_give_guide_tours")) + helperRequests = false; + + if(bullyReports && !this.client.getHabbo().hasPermission("acc_helper_judge_chat_reviews")) + bullyReports = false; + + if (helperRequests) + { + Emulator.getGameEnvironment().getGuideManager().setOnGuide(this.client.getHabbo(), onDuty); + } + + if(bullyReports) + { + Emulator.getGameEnvironment().getGuideManager().setOnGuardian(this.client.getHabbo(), onDuty); + } + + this.client.sendResponse(new GuideToolsComposer(onDuty)); + } + else + { + Emulator.getGameEnvironment().getGuideManager().setOnGuide(this.client.getHabbo(), onDuty); + Emulator.getGameEnvironment().getGuideManager().setOnGuardian(this.client.getHabbo(), onDuty); + this.client.sendResponse(new GuideToolsComposer(onDuty)); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GetHabboGuildBadgesMessageEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GetHabboGuildBadgesMessageEvent.java new file mode 100644 index 00000000..97e33856 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GetHabboGuildBadgesMessageEvent.java @@ -0,0 +1,12 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GetHabboGuildBadgesMessageEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildAcceptMembershipEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildAcceptMembershipEvent.java new file mode 100644 index 00000000..0af3e9ea --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildAcceptMembershipEvent.java @@ -0,0 +1,79 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildManager; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.guilds.GuildRank; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildAcceptMemberErrorComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildMembersComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildRefreshMembersListComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsComposer; +import com.eu.habbo.plugin.events.guilds.GuildAcceptedMembershipEvent; + +public class GuildAcceptMembershipEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + int userId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild == null || (guild.getOwnerId() != this.client.getHabbo().getHabboInfo().getId() && !Emulator.getGameEnvironment().getGuildManager().getOnlyAdmins(guild).containsKey(this.client.getHabbo().getHabboInfo().getId()) && !this.client.getHabbo().hasPermission("acc_guild_admin"))) + return; + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if(habbo != null) + { + if (habbo.getHabboStats().hasGuild(guild.getId())) + { + this.client.sendResponse(new GuildAcceptMemberErrorComposer(guild.getId(), GuildAcceptMemberErrorComposer.ALREADY_ACCEPTED)); + return; + } + else + { + //Check the user has requested + GuildMember member = Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild, habbo); + if(member == null || member.getRank().type != GuildRank.REQUESTED.type) + { + this.client.sendResponse(new GuildAcceptMemberErrorComposer(guild.getId(), GuildAcceptMemberErrorComposer.NO_LONGER_MEMBER)); + return; + } + else + { + GuildAcceptedMembershipEvent event = new GuildAcceptedMembershipEvent(guild, userId, habbo); + Emulator.getPluginManager().fireEvent(event); + if(!event.isCancelled()) + { + habbo.getHabboStats().addGuild(guild.getId()); + Emulator.getGameEnvironment().getGuildManager().joinGuild(guild, this.client, habbo.getHabboInfo().getId(), true); + guild.decreaseRequestCount(); + guild.increaseMemberCount(); + this.client.sendResponse(new GuildRefreshMembersListComposer(guild)); + Room room = habbo.getHabboInfo().getCurrentRoom(); + if(room != null) + { + if(room.getGuildId() == guildId) + { + habbo.getClient().sendResponse(new GuildInfoComposer(guild, habbo.getClient(), false, Emulator.getGameEnvironment().getGuildManager().getGuildMember(guildId, userId))); + room.refreshRightsForHabbo(habbo); + } + } + } + } + } + } + else + { + Emulator.getGameEnvironment().getGuildManager().joinGuild(guild, this.client, userId, true); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeBadgeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeBadgeEvent.java new file mode 100644 index 00000000..0e7e864f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeBadgeEvent.java @@ -0,0 +1,73 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.guilds.GuildChangedBadgeEvent; + +public class GuildChangeBadgeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + if (guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()); + + if (room == null || room.getId() != guild.getRoomId()) + return; + + int count = this.packet.readInt(); + + String badge = ""; + + byte base = 1; + + while (base < count) + { + int id = this.packet.readInt(); + int color = this.packet.readInt(); + int pos = this.packet.readInt(); + + if (base == 1) + { + badge += "b"; + } else + { + badge += "s"; + } + + badge += (id < 100 ? "0" : "") + (id < 10 ? "0" : "") + id + (color < 10 ? "0" : "") + color + "" + pos; + + base += 3; + } + + if (guild.getBadge().toLowerCase().equals(badge.toLowerCase())) + return; + + GuildChangedBadgeEvent badgeEvent = new GuildChangedBadgeEvent(guild, badge); + Emulator.getPluginManager().fireEvent(badgeEvent); + + if (badgeEvent.isCancelled()) + return; + + guild.setBadge(badgeEvent.badge); + guild.needsUpdate = true; + + if (Emulator.getConfig().getBoolean("imager.internal.enabled")) + { + Emulator.getBadgeImager().generate(guild); + } + + room.refreshGuild(guild); + Emulator.getThreading().run(guild); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeColorsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeColorsEvent.java new file mode 100644 index 00000000..dbe63572 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeColorsEvent.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.items.interactions.InteractionGuildFurni; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.plugin.events.guilds.GuildChangedColorsEvent; +import gnu.trove.set.hash.THashSet; + +public class GuildChangeColorsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + GuildChangedColorsEvent colorsEvent = new GuildChangedColorsEvent(guild, this.packet.readInt(), this.packet.readInt()); + Emulator.getPluginManager().fireEvent(colorsEvent); + + if (colorsEvent.isCancelled()) + return; + + if (guild.getColorOne() != colorsEvent.colorOne || guild.getColorTwo() != colorsEvent.colorTwo) + { + guild.setColorOne(colorsEvent.colorOne); + guild.setColorTwo(colorsEvent.colorTwo); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()); + + if (room != null && room.getUserCount() > 0) + { + room.refreshGuild(guild); + + room.refreshGuildColors(guild); + } + guild.needsUpdate = true; + Emulator.getThreading().run(guild); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeNameDescEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeNameDescEvent.java new file mode 100644 index 00000000..b52370c4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeNameDescEvent.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.plugin.events.guilds.GuildChangedNameEvent; +import gnu.trove.set.hash.THashSet; + +public class GuildChangeNameDescEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + GuildChangedNameEvent nameEvent = new GuildChangedNameEvent(guild, this.packet.readString(), this.packet.readString()); + Emulator.getPluginManager().fireEvent(nameEvent); + + if (nameEvent.isCancelled()) + return; + + if (guild.getName().equals(nameEvent.name) && guild.getDescription().equals(nameEvent.description)) + return; + + guild.setName(nameEvent.name); + guild.setDescription(nameEvent.description); + guild.needsUpdate = true; + guild.run(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()); + + if (room != null && !room.getCurrentHabbos().isEmpty()) + { + room.refreshGuild(guild); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeSettingsEvent.java new file mode 100644 index 00000000..9f3e573a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildChangeSettingsEvent.java @@ -0,0 +1,45 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildState; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.guilds.GuildChangedSettingsEvent; + +public class GuildChangeSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()); + + if (room == null) + return; + + GuildChangedSettingsEvent settingsEvent = new GuildChangedSettingsEvent(guild, this.packet.readInt(), this.packet.readInt()); + Emulator.getPluginManager().fireEvent(settingsEvent); + + if (settingsEvent.isCancelled()) + return; + + guild.setState(GuildState.valueOf(settingsEvent.state)); + guild.setRights(settingsEvent.rights); + + room.refreshGuild(guild); + + guild.needsUpdate = true; + + Emulator.getThreading().run(guild); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildConfirmRemoveMemberEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildConfirmRemoveMemberEvent.java new file mode 100644 index 00000000..a4f5af90 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildConfirmRemoveMemberEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.guilds.GuildRank; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildConfirmRemoveMemberComposer; + +public class GuildConfirmRemoveMemberEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + int userId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if (guild != null) + { + GuildMember member = Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild, this.client.getHabbo()); + if (userId == this.client.getHabbo().getHabboInfo().getId() || guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || member.getRank().equals(GuildRank.ADMIN) || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(guild.getRoomId()); + int count = 0; + if (room != null) + { + count = room.getUserFurniCount(userId); + } + this.client.sendResponse(new GuildConfirmRemoveMemberComposer(userId, count)); + } + } + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeclineMembershipEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeclineMembershipEvent.java new file mode 100644 index 00000000..27a2263e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeclineMembershipEvent.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.guilds.GuildRank; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildMembersComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildRefreshMembersListComposer; +import com.eu.habbo.plugin.events.guilds.GuildDeclinedMembershipEvent; + +public class GuildDeclineMembershipEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + int userId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if (guild != null) + { + GuildMember member = Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild, this.client.getHabbo()); + if (userId == this.client.getHabbo().getHabboInfo().getId() || guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || member.getRank().equals(GuildRank.ADMIN) || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + guild.decreaseRequestCount(); + Emulator.getGameEnvironment().getGuildManager().removeMember(guild, userId); + this.client.sendResponse(new GuildMembersComposer(guild, Emulator.getGameEnvironment().getGuildManager().getGuildMembers(guild, 0, 0, ""), this.client.getHabbo(), 0, 0, "", true)); + this.client.sendResponse(new GuildRefreshMembersListComposer(guild)); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + Emulator.getPluginManager().fireEvent(new GuildDeclinedMembershipEvent(guild, userId, habbo, this.client.getHabbo())); + + if (habbo != null) + { + Room room = habbo.getHabboInfo().getCurrentRoom(); + if (room != null) + { + if (room.getGuildId() == guildId) + { + habbo.getClient().sendResponse(new GuildInfoComposer(guild, habbo.getClient(), false, null)); + } + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeleteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeleteEvent.java new file mode 100644 index 00000000..ab22dd1f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildDeleteEvent.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.RemoveGuildFromRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomDataComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomEntryInfoComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomSettingsComposer; +import com.eu.habbo.plugin.events.guilds.GuildDeletedEvent; + +public class GuildDeleteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) //TODO Add staff permission override. + { + Emulator.getGameEnvironment().getGuildManager().deleteGuild(guild); + Emulator.getPluginManager().fireEvent(new GuildDeletedEvent(guild, this.client.getHabbo())); + Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()).sendComposer(new RemoveGuildFromRoomComposer(guildId).compose()); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if (guild.getRoomId() == this.client.getHabbo().getHabboInfo().getCurrentRoom().getId()) + { + this.client.sendResponse(new RoomDataComposer(this.client.getHabbo().getHabboInfo().getCurrentRoom(), this.client.getHabbo(), false, false)); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveAdminEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveAdminEvent.java new file mode 100644 index 00000000..3145690b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveAdminEvent.java @@ -0,0 +1,53 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildConfirmRemoveMemberComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildMemberUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsComposer; +import com.eu.habbo.plugin.events.guilds.GuildRemovedAdminEvent; + +public class GuildRemoveAdminEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + int userId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(guild.getRoomId()); + Emulator.getGameEnvironment().getGuildManager().removeAdmin(guild, userId); + + Habbo habbo = room.getHabbo(userId); + GuildRemovedAdminEvent removedAdminEvent = new GuildRemovedAdminEvent(guild, userId, habbo); + Emulator.getPluginManager().fireEvent(removedAdminEvent); + + if (removedAdminEvent.isCancelled()) + return; + + if (habbo != null) + { + habbo.getClient().sendResponse(new GuildInfoComposer(guild, this.client, false, Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild.getId(), userId))); + + room.refreshRightsForHabbo(habbo); + } + GuildMember guildMember = Emulator.getGameEnvironment().getGuildManager().getGuildMember(guildId, userId); + + this.client.sendResponse(new GuildMemberUpdateComposer(guild, guildMember)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveFavoriteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveFavoriteEvent.java new file mode 100644 index 00000000..59fa227a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveFavoriteEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserProfileComposer; +import com.eu.habbo.plugin.events.guilds.GuildRemovedFavoriteEvent; + +public class GuildRemoveFavoriteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboStats().hasGuild(guildId)) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + GuildRemovedFavoriteEvent favoriteEvent = new GuildRemovedFavoriteEvent(guild, this.client.getHabbo()); + Emulator.getPluginManager().fireEvent(favoriteEvent); + if(favoriteEvent.isCancelled()) + return; + + this.client.getHabbo().getHabboStats().guild = 0; + + this.client.sendResponse(new UserProfileComposer(this.client.getHabbo(), this.client)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveMemberEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveMemberEvent.java new file mode 100644 index 00000000..29438520 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildRemoveMemberEvent.java @@ -0,0 +1,73 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.guilds.GuildRank; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildConfirmRemoveMemberComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildRefreshMembersListComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsComposer; +import com.eu.habbo.plugin.events.guilds.GuildRemovedMemberEvent; + +public class GuildRemoveMemberEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + int userId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + + if (guild != null) + { + GuildMember member = Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild, this.client.getHabbo()); + if (userId == this.client.getHabbo().getHabboInfo().getId() || guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || member.getRank().equals(GuildRank.ADMIN) || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + GuildRemovedMemberEvent removedMemberEvent = new GuildRemovedMemberEvent(guild, userId, habbo); + Emulator.getPluginManager().fireEvent(removedMemberEvent); + if (removedMemberEvent.isCancelled()) + return; + + Emulator.getGameEnvironment().getGuildManager().removeMember(guild, userId); + guild.decreaseMemberCount(); + + if (userId != this.client.getHabbo().getHabboInfo().getId()) + { + this.client.sendResponse(new GuildRefreshMembersListComposer(guild)); + } + + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(guild.getRoomId()); + + if (habbo != null) + { + habbo.getHabboStats().removeGuild(guild.getId()); + if (habbo.getHabboStats().guild == guildId) + habbo.getHabboStats().guild = 0; + + if (room != null && habbo.getHabboInfo().getCurrentRoom() == room) + { + room.refreshRightsForHabbo(habbo); + } + + habbo.getClient().sendResponse(new GuildInfoComposer(guild, habbo.getClient(), false, null)); + } + + if (room != null) + { + if (room.getGuildId() == guildId) + { + room.ejectUserFurni(userId); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetAdminEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetAdminEvent.java new file mode 100644 index 00000000..19a960f9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetAdminEvent.java @@ -0,0 +1,56 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildMemberUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsComposer; +import com.eu.habbo.plugin.events.guilds.GuildGivenAdminEvent; + +public class GuildSetAdminEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + int userId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if (guild != null) + { + if (guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_guild_admin")) + { + Emulator.getGameEnvironment().getGuildManager().setAdmin(guild, userId); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + GuildGivenAdminEvent adminEvent = new GuildGivenAdminEvent(guild, userId, habbo, this.client.getHabbo()); + Emulator.getPluginManager().fireEvent(adminEvent); + if (adminEvent.isCancelled()) + return; + + if (habbo != null) + { + Room room = habbo.getHabboInfo().getCurrentRoom(); + if (room != null) + { + if (room.getGuildId() == guildId) + { + room.refreshRightsForHabbo(habbo); + } + } + } + + GuildMember guildMember = Emulator.getGameEnvironment().getGuildManager().getGuildMember(guildId, userId); + + this.client.sendResponse(new GuildMemberUpdateComposer(guild, guildMember)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetFavoriteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetFavoriteEvent.java new file mode 100644 index 00000000..a173a6aa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/GuildSetFavoriteEvent.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildFavoriteRoomUserUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUsersAddGuildBadgeComposer; +import com.eu.habbo.messages.outgoing.users.UserProfileComposer; +import com.eu.habbo.plugin.events.guilds.GuildFavoriteSetEvent; + +public class GuildSetFavoriteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(this.client.getHabbo().getHabboStats().hasGuild(guildId)) + { + GuildFavoriteSetEvent favoriteSetEvent = new GuildFavoriteSetEvent(guild, this.client.getHabbo()); + Emulator.getPluginManager().fireEvent(favoriteSetEvent); + + if(favoriteSetEvent.isCancelled()) + return; + + this.client.getHabbo().getHabboStats().guild = guildId; + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + + if(guild != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new GuildFavoriteRoomUserUpdateComposer(this.client.getHabbo().getRoomUnit(), guild).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUsersAddGuildBadgeComposer(guild).compose()); + } + } + + this.client.sendResponse(new UserProfileComposer(this.client.getHabbo(), this.client)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyEvent.java new file mode 100644 index 00000000..ddb6fec4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyEvent.java @@ -0,0 +1,110 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer; +import com.eu.habbo.messages.outgoing.catalog.PurchaseOKComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildBoughtComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; +import com.eu.habbo.plugin.events.guilds.GuildPurchasedEvent; + +import java.util.List; + +public class RequestGuildBuyEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (!this.client.getHabbo().hasPermission("acc_infinite_credits")) + { + int guildPrice = Emulator.getConfig().getInt("catalog.guild.price"); + if (this.client.getHabbo().getHabboInfo().getCredits() >= guildPrice) + { + this.client.getHabbo().giveCredits(-guildPrice); + } + else + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + return; + } + } + + String name = this.packet.readString(); + String description = this.packet.readString(); + + int roomId = this.packet.readInt(); + + Room r = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(r != null) + { + if(r.getOwnerId() == this.client.getHabbo().getHabboInfo().getId()) + { + if (r.getGuildId() == 0) + { + int colorOne = this.packet.readInt(); + int colorTwo = this.packet.readInt(); + + int count = this.packet.readInt(); + + String badge = ""; + + byte base = 1; + + while(base < count) + { + int id = this.packet.readInt(); + int color = this.packet.readInt(); + int pos = this.packet.readInt(); + + if(base == 1) + { + badge += "b"; + } + else + { + badge += "s"; + } + + badge += (id < 100 ? "0" : "") + (id < 10 ? "0" : "") + id + (color < 10 ? "0" : "") + color + "" + pos; + + base += 3; + } + + Guild guild = Emulator.getGameEnvironment().getGuildManager().createGuild(this.client.getHabbo(), roomId, r.getName(), name, description, badge, colorOne, colorTwo); + r.setGuild(guild.getId()); + r.setNeedsUpdate(true); + + if (Emulator.getConfig().getBoolean("imager.internal.enabled")) + { + Emulator.getBadgeImager().generate(guild); + } + + this.client.sendResponse(new PurchaseOKComposer()); + this.client.sendResponse(new GuildBoughtComposer(guild)); + for (Habbo habbo : r.getHabbos()) + { + habbo.getClient().sendResponse(new GuildInfoComposer(guild, habbo.getClient(), false, null)); + } + r.refreshGuild(guild); + + Emulator.getPluginManager().fireEvent(new GuildPurchasedEvent(guild, this.client.getHabbo())); + + Emulator.getGameEnvironment().getGuildManager().addGuild(guild); + } + } + else + { + String message = Emulator.getTexts().getValue("scripter.warning.guild.buy.owner").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%roomname%", r.getName().replace("%owner%", r.getOwnerName())); + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyRoomsEvent.java new file mode 100644 index 00000000..fe2d0e92 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildBuyRoomsEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildBuyRoomsComposer; +import gnu.trove.set.hash.THashSet; + +import java.util.List; + +public class RequestGuildBuyRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + List rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo()); + + THashSet roomList = new THashSet(); + + for(Room room : rooms) + { + if(room.getGuildId() == 0) + roomList.add(room); + } + + this.client.sendResponse(new GuildBuyRoomsComposer(roomList)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildFurniWidgetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildFurniWidgetEvent.java new file mode 100644 index 00000000..f1a6e546 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildFurniWidgetEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildFurniWidgetComposer; + +public class RequestGuildFurniWidgetEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + int guildId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(item != null && guild != null) + this.client.sendResponse(new GuildFurniWidgetComposer(this.client.getHabbo(), guild, item)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildInfoEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildInfoEvent.java new file mode 100644 index 00000000..61042013 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildInfoEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; + +public class RequestGuildInfoEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + boolean newWindow = this.packet.readBoolean(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild != null) + { + this.client.sendResponse(new GuildInfoComposer(guild, this.client, newWindow, Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild, this.client.getHabbo()))); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildJoinEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildJoinEvent.java new file mode 100644 index 00000000..2dc20f0c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildJoinEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildState; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildInfoComposer; +import com.eu.habbo.messages.outgoing.guilds.GuildJoinErrorComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsComposer; + +public class RequestGuildJoinEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboStats().hasGuild(guildId)) + return; + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild == null) + return; + + if(guild.getState() == GuildState.CLOSED) + { + this.client.sendResponse(new GuildJoinErrorComposer(GuildJoinErrorComposer.GROUP_CLOSED)); + return; + } + + Emulator.getGameEnvironment().getGuildManager().joinGuild(guild, this.client, 0, false); + this.client.sendResponse(new GuildInfoComposer(guild, this.client, false, Emulator.getGameEnvironment().getGuildManager().getGuildMember(guild, this.client.getHabbo()))); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null || room.getGuildId() != guildId) + return; + + room.refreshRightsForHabbo(this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildManageEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildManageEvent.java new file mode 100644 index 00000000..2053a601 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildManageEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildManageComposer; + +public class RequestGuildManageEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.packet.readInt()); + + this.client.sendResponse(new GuildManageComposer(guild)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildMembersEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildMembersEvent.java new file mode 100644 index 00000000..b963fb3c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildMembersEvent.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.guilds.GuildRank; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildMembersComposer; + +public class RequestGuildMembersEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int groupId = this.packet.readInt(); + int pageId = this.packet.readInt(); + String query = this.packet.readString(); + int levelId = this.packet.readInt(); + + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(groupId); + + if (g != null) + { + boolean isAdmin = this.client.getHabbo().hasPermission("acc_guild_admin"); + if (!isAdmin && this.client.getHabbo().getHabboStats().hasGuild(g.getId())) + { + GuildMember member = Emulator.getGameEnvironment().getGuildManager().getGuildMember(g, this.client.getHabbo()); + isAdmin = member != null && member.getRank().equals(GuildRank.ADMIN); + } + + this.client.sendResponse(new GuildMembersComposer(g, Emulator.getGameEnvironment().getGuildManager().getGuildMembers(g, pageId, levelId, query), this.client.getHabbo(), pageId, levelId, query, isAdmin)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildPartsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildPartsEvent.java new file mode 100644 index 00000000..37f79cc2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestGuildPartsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildPartsComposer; + +public class RequestGuildPartsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new GuildPartsComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestOwnGuildsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestOwnGuildsEvent.java new file mode 100644 index 00000000..4745c364 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/RequestOwnGuildsEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.incoming.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.GuildListComposer; +import gnu.trove.set.hash.THashSet; + +public class RequestOwnGuildsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + THashSet guilds = new THashSet(); + + for(int i : this.client.getHabbo().getHabboStats().guilds) + { + if(i == 0) + continue; + + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(i); + + if (g != null) + { + guilds.add(g); + } + } + + this.client.sendResponse(new GuildListComposer(guilds, this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java new file mode 100644 index 00000000..7bce2cec --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumDataEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumDataComposer; + +public class GuildForumDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = packet.readInt(); + + this.client.sendResponse(new GuildForumDataComposer(Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(guildId), this.client.getHabbo())); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java new file mode 100644 index 00000000..f69a3afe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumListEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumListComposer; +import gnu.trove.set.hash.THashSet; + +public class GuildForumListEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int mode = this.packet.readInt(); + int page = this.packet.readInt(); + int amount = this.packet.readInt(); + + switch(page) + { + case 0: + this.client.sendResponse(new GuildForumListComposer(Emulator.getGameEnvironment().getGuildForumManager().getGuildForums(this.client.getHabbo()), this.client.getHabbo(), mode)); + break; + case 1: + break; + case 2: + break; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateMessageEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateMessageEvent.java new file mode 100644 index 00000000..62bd8a40 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateMessageEvent.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumComment; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumAddCommentComposer; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumThreadMessagesComposer; +import com.eu.habbo.messages.outgoing.guilds.forums.UnknownGuildForumComposer6; + + +public class GuildForumModerateMessageEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = packet.readInt(); + int threadId = packet.readInt(); + int messageId = packet.readInt(); + int state = packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + if(guild == null || guild.getOwnerId() != this.client.getHabbo().getHabboInfo().getId()) + return; + + GuildForum forum = Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(guildId); + GuildForumThread thread = forum.getThread(threadId); + + if (thread != null) + { + GuildForumComment comment = thread.getComment(messageId); + comment.setState(GuildForum.ThreadState.fromValue(state)); + comment.setAdminId(this.client.getHabbo().getHabboInfo().getId()); + comment.setAdminName(this.client.getHabbo().getHabboInfo().getUsername()); + Emulator.getThreading().run(comment); + + this.client.sendResponse(new UnknownGuildForumComposer6(guildId, threadId, comment)); + + } else + { + // TODO: throwing an error + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateThreadEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateThreadEvent.java new file mode 100644 index 00000000..ca48abf6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumModerateThreadEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumThreadMessagesComposer; + + +public class GuildForumModerateThreadEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = packet.readInt(); + int threadId = packet.readInt(); + int state = packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + if(guild == null || guild.getOwnerId() != this.client.getHabbo().getHabboInfo().getId()) + return; + + GuildForum forum = Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(guildId); + GuildForumThread thread = forum.getThread(threadId); + thread.setState(GuildForum.ThreadState.fromValue(state)); + thread.setAdminId(this.client.getHabbo().getHabboInfo().getId()); + thread.setAdminName(this.client.getHabbo().getHabboInfo().getUsername()); + Emulator.getThreading().run(thread); + + this.client.sendResponse(new GuildForumThreadMessagesComposer(thread)); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumPostThreadEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumPostThreadEvent.java new file mode 100644 index 00000000..6f5d7dc4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumPostThreadEvent.java @@ -0,0 +1,55 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumComment; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.*; + + +public class GuildForumPostThreadEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = this.packet.readInt(); + int threadId = this.packet.readInt(); // if 0 == forum message != thread + String subject = this.packet.readString(); + String message = this.packet.readString(); + + //TODO: Add check if user has guild + //TODO: Add check if threads can be posted. + + final GuildForum forum = Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(guildId); + + final GuildForumThread thread; + if (forum != null) + { + if (threadId == 0) + { + thread = forum.createThread(this.client.getHabbo(), subject, message); + + GuildForumComment comment = new GuildForumComment(guildId, threadId, this.client.getHabbo().getHabboInfo().getId(), + this.client.getHabbo().getHabboInfo().getUsername(), this.client.getHabbo().getHabboInfo().getLook(), message); + thread.addComment(comment); + + this.client.sendResponse(new GuildForumThreadMessagesComposer(thread)); + } + else + { + thread = forum.getThread(threadId); + GuildForumComment comment = thread.addComment(this.client.getHabbo(), message); + + if (comment != null) + { + this.client.sendResponse(new GuildForumAddCommentComposer(comment)); + } + else + { + //TODO Display error + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsEvent.java new file mode 100644 index 00000000..9c62bbf4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumDataComposer; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumThreadsComposer; + +public class GuildForumThreadsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int groupdId = packet.readInt(); + int index = packet.readInt(); + + this.client.sendResponse(new GuildForumThreadsComposer(Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(groupdId), index)); + this.client.sendResponse(new GuildForumDataComposer(Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(groupdId), this.client.getHabbo())); + //TODO read guild id; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsMessagesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsMessagesEvent.java new file mode 100644 index 00000000..d214f443 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumThreadsMessagesEvent.java @@ -0,0 +1,40 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumCommentsComposer; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumDataComposer; + +public class GuildForumThreadsMessagesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = packet.readInt(); + int threadId = packet.readInt(); + int index = packet.readInt(); //40 + int limit = packet.readInt(); //20 + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + if(guild == null) + return; + + GuildForum forum = Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(guildId); + GuildForumThread thread = forum.getThread(threadId); + + + if (thread.getState() == GuildForum.ThreadState.HIDDEN_BY_ADMIN && guild.getOwnerId() != this.client.getHabbo().getHabboInfo().getId()) + { + this.client.sendResponse(new BubbleAlertComposer("forums.error.access_denied")); + } else + { + this.client.sendResponse(new GuildForumCommentsComposer(guildId, threadId, index, thread.getComments(index, limit))); + } + + this.client.sendResponse(new GuildForumDataComposer(Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(guildId), this.client.getHabbo())); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumUpdateSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumUpdateSettingsEvent.java new file mode 100644 index 00000000..71060f5d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/guilds/forums/GuildForumUpdateSettingsEvent.java @@ -0,0 +1,42 @@ +package com.eu.habbo.messages.incoming.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.SettingsState; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumCommentsComposer; +import com.eu.habbo.messages.outgoing.guilds.forums.GuildForumDataComposer; + +public class GuildForumUpdateSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int guildId = packet.readInt(); + int canRead = packet.readInt(); + int postMessages = packet.readInt(); + int postThreads = packet.readInt(); + int modForum = packet.readInt(); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(guildId); + + if(guild == null || guild.getOwnerId() != this.client.getHabbo().getHabboInfo().getId()) + return; + + this.client.sendResponse(new GuildForumDataComposer(Emulator.getGameEnvironment().getGuildForumManager().getGuildForum(1), this.client.getHabbo())); + + guild.setReadForum(SettingsState.fromValue(canRead)); + guild.setPostMessages(SettingsState.fromValue(postMessages)); + guild.setPostThreads(SettingsState.fromValue(postThreads)); + guild.setModForum(SettingsState.fromValue(modForum)); + guild.needsUpdate = true; + Emulator.getThreading().run(guild); + + + + + //TODO: DATABASE SAVING, PERMISSION CHECK + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/GenerateSecretKeyEvent.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/GenerateSecretKeyEvent.java new file mode 100644 index 00000000..1e6fbff3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/GenerateSecretKeyEvent.java @@ -0,0 +1,11 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class GenerateSecretKeyEvent extends MessageHandler { + + @Override + public void handle() throws Exception { + this.packet.readString(); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/MachineIDEvent.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/MachineIDEvent.java new file mode 100644 index 00000000..93c04b12 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/MachineIDEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.handshake.MachineIDComposer; + +public class MachineIDEvent extends MessageHandler { + + @Override + public void handle() throws Exception { + this.packet.readString(); + this.client.setMachineId(this.packet.readString()); + if (this.client.getHabbo() != null && this.client.getHabbo().getHabboInfo() != null) + { + this.client.getHabbo().getHabboInfo().setMachineID(this.client.getMachineId()); + } + + if (Emulator.getGameEnvironment().getModToolManager().hasMACBan(this.client)) + { + this.client.getChannel().close(); + return; + } + + this.client.sendResponse(new MachineIDComposer(this.client)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/PingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/PingEvent.java new file mode 100644 index 00000000..18878961 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/PingEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.handshake.PongComposer; + +public class PingEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PongComposer(this.packet.readInt())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/ReleaseVersionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/ReleaseVersionEvent.java new file mode 100644 index 00000000..828a5f20 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/ReleaseVersionEvent.java @@ -0,0 +1,12 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ReleaseVersionEvent extends MessageHandler { + + @Override + public void handle() throws Exception + { + this.packet.readString(); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/RequestBannerToken.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/RequestBannerToken.java new file mode 100644 index 00000000..7ec6e352 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/RequestBannerToken.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.handshake.BannerTokenComposer; + +public class RequestBannerToken extends MessageHandler { + + @Override + public void handle() throws Exception + { + this.client.sendResponse(new BannerTokenComposer("Stop loggin, Imma ban your ass", false)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java new file mode 100644 index 00000000..37b4a822 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java @@ -0,0 +1,153 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.achievements.AchievementListComposer; +import com.eu.habbo.messages.outgoing.gamecenter.GameCenterAccountInfoComposer; +import com.eu.habbo.messages.outgoing.gamecenter.GameCenterGameListComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.handshake.*; +import com.eu.habbo.messages.outgoing.inventory.InventoryAchievementsComposer; +import com.eu.habbo.messages.outgoing.inventory.UserEffectsListComposer; +import com.eu.habbo.messages.outgoing.modtool.CfhTopicsMessageComposer; +import com.eu.habbo.messages.outgoing.users.FavoriteRoomsCountComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolComposer; +import com.eu.habbo.messages.outgoing.navigator.*; +import com.eu.habbo.messages.outgoing.unknown.BuildersClubExpiredComposer; +import com.eu.habbo.messages.outgoing.unknown.NewUserIdentityComposer; +import com.eu.habbo.messages.outgoing.users.*; +import com.eu.habbo.plugin.events.users.UserLoginEvent; + +import java.util.ArrayList; + +public class SecureLoginEvent extends MessageHandler +{ + /************************************************************************************************* + * + ##### ####### # # ####### ####### ####### ###### ### ####### + # # # # ## # # # # # # # # # + # # # # # # # # # # # # # # # + # # # # # # # # # # ##### # # # # + # # # # # # # # # # # # # # # + # # # # # ## # # # # # # # # + ##### ####### # # ####### # ####### ###### ### # + * -The General + *************************************************************************************************/ + + @Override + public void handle() throws Exception + { + if(!Emulator.isReady) + return; + + String sso = this.packet.readString().replace(" ", ""); + + if (sso == null || sso.isEmpty()) + { + this.client.getChannel().close(); + } + + if(this.client.getHabbo() == null) + { + if (Emulator.getGameEnvironment().getModToolManager().hasIPBan(this.client.getChannel())) + { + this.client.getChannel().close(); + return; + } + + Habbo habbo = null; + synchronized (this.client.getChannel()) + { + habbo = Emulator.getGameEnvironment().getHabboManager().loadHabbo(sso); + } + if(habbo != null) + { + try + { + habbo.setClient(this.client); + this.client.setHabbo(habbo); + this.client.getHabbo().connect(); + + if (this.client.getHabbo().getHabboInfo() == null) + { + Emulator.getGameServer().getGameClientManager().disposeClient(this.client.getChannel()); + return; + } + Emulator.getThreading().run(habbo); + Emulator.getGameEnvironment().getHabboManager().addHabbo(habbo); + } + catch (Exception e) + { + Emulator.getGameServer().getGameClientManager().disposeClient(this.client.getChannel()); + return; + } + ArrayList messages = new ArrayList(); + + messages.add(new SecureLoginOKComposer().compose()); + messages.add(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), 0).compose()); + messages.add(new UserEffectsListComposer(habbo).compose()); + messages.add(new UserClothesComposer(this.client.getHabbo()).compose()); + messages.add(new NewUserIdentityComposer().compose()); + messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); + messages.add(new SessionRightsComposer().compose()); + messages.add(new SomeConnectionComposer().compose()); + messages.add(new DebugConsoleComposer().compose()); + messages.add(new UserAchievementScoreComposer(this.client.getHabbo()).compose()); + messages.add(new UnknownComposer4().compose()); + messages.add(new UnknownComposer5().compose()); + messages.add(new BuildersClubExpiredComposer().compose()); + messages.add(new CfhTopicsMessageComposer().compose()); + messages.add(new FavoriteRoomsCountComposer(this.client.getHabbo()).compose()); + messages.add(new GameCenterGameListComposer().compose()); + messages.add(new GameCenterAccountInfoComposer(3, 100).compose()); + messages.add(new GameCenterAccountInfoComposer(0, 100).compose()); + + //messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + //messages.add(new FriendsComposer(this.client.getHabbo()).compose()); + messages.add(new UserClubComposer(this.client.getHabbo()).compose()); + + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + messages.add(new ModToolComposer(this.client.getHabbo()).compose()); + } + + this.client.sendResponses(messages); + + //Hardcoded + this.client.sendResponse(new NewNavigatorSettingsComposer(this.client.getHabbo().getHabboStats().navigatorWindowSettings)); + this.client.sendResponse(new NewNavigatorMetaDataComposer()); + this.client.sendResponse(new NewNavigatorLiftedRoomsComposer()); + this.client.sendResponse(new NewNavigatorCollapsedCategoriesComposer()); + this.client.sendResponse(new NewNavigatorSavedSearchesComposer()); + this.client.sendResponse(new NewNavigatorEventCategoriesComposer()); + this.client.sendResponse(new InventoryRefreshComposer()); + this.client.sendResponse(new ForumsTestComposer()); + this.client.sendResponse(new InventoryAchievementsComposer()); + this.client.sendResponse(new AchievementListComposer(this.client.getHabbo())); + + Emulator.getPluginManager().fireEvent(new UserLoginEvent(habbo, this.client.getChannel().localAddress())); + + if (Emulator.getConfig().getBoolean("hotel.welcome.alert.enabled")) + { + final Habbo finalHabbo = habbo; + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + client.sendResponse(new GenericAlertComposer(HabboManager.WELCOME_MESSAGE.replace("%username%", finalHabbo.getHabboInfo().getUsername()).replace("%user%", finalHabbo.getHabboInfo().getUsername()))); + } + }, Emulator.getConfig().getInt("hotel.welcome.alert.delay", 5000)); + } + } + else + { + this.client.getChannel().close(); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent_BACKUP.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent_BACKUP.java new file mode 100644 index 00000000..ff8b67f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent_BACKUP.java @@ -0,0 +1,153 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.friends.FriendsComposer; +import com.eu.habbo.messages.outgoing.users.FavoriteRoomsCountComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.handshake.DebugConsoleComposer; +import com.eu.habbo.messages.outgoing.handshake.SecureLoginOKComposer; +import com.eu.habbo.messages.outgoing.handshake.SessionRightsComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolComposer; +import com.eu.habbo.messages.outgoing.navigator.*; +import com.eu.habbo.messages.outgoing.unknown.NewUserIdentityComposer; +import com.eu.habbo.messages.outgoing.users.*; +import com.eu.habbo.plugin.events.users.UserLoginEvent; + +import java.util.ArrayList; + +public class SecureLoginEvent_BACKUP extends MessageHandler +{ + /************************************************************************************************* + * + ##### ####### # # ####### ####### ####### ###### ### ####### + # # # # ## # # # # # # # # # + # # # # # # # # # # # # # # # + # # # # # # # # # # ##### # # # # + # # # # # # # # # # # # # # # + # # # # # ## # # # # # # # # + ##### ####### # # ####### # ####### ###### ### # + * -The General + *************************************************************************************************/ + + @Override + public void handle() throws Exception + { + + if(!Emulator.isReady) + return; + + String sso = this.packet.readString(); + + if(this.client.getHabbo() == null) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().loadHabbo(sso); + if(habbo != null) + { + habbo.setClient(this.client); + this.client.setHabbo(habbo); + this.client.getHabbo().connect(); + //this.client.sendResponse(new DebugConsoleComposer()); + Emulator.getThreading().run(habbo); + Emulator.getGameEnvironment().getHabboManager().addHabbo(habbo); + + ArrayList messages = new ArrayList(); + + /*messages.add(new SecureLoginOKComposer().compose()); + messages.add(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), this.client.getHabbo().getHabboInfo().getHomeRoom()).compose()); + messages.add(new FriendsComposer(this.client.getHabbo()).compose()); + messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + messages.add(new HotelViewDataComposer(",2013-05-08 13:00,gamesmaker;2013-05-11 13:00", "").compose()); + messages.add(new AddHabboItemComposer(this.client.getHabbo().getInventory().getItemsComponent().getItemsAsValueCollection()).compose()); + + for(int i = 0; i < 9; i++) + { + messages.add(new MinimailCountComposer().compose()); + } + messages.add(new UserEffectsListComposer().compose()); + + this.client.sendResponses(messages);*/ + + /*messages.add(new SecureLoginOKComposer().compose()); + messages.add(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), this.client.getHabbo().getHabboInfo().getHomeRoom()).compose()); + messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); + messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + messages.add(new FriendsComposer(this.client.getHabbo()).compose());*/ + + messages.add(new SecureLoginOKComposer().compose()); + messages.add(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), 0).compose()); + messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); + messages.add(new UserClubComposer(this.client.getHabbo()).compose()); + messages.add(new DebugConsoleComposer().compose()); + messages.add(new UserAchievementScoreComposer(this.client.getHabbo()).compose()); + messages.add(new NewUserIdentityComposer().compose()); + messages.add(new UserPerksComposer(habbo).compose()); + messages.add(new SessionRightsComposer().compose()); + messages.add(new FavoriteRoomsCountComposer(habbo).compose()); + messages.add(new FriendsComposer(this.client.getHabbo()).compose()); + //messages.add(new NewUserIdentityComposer().compose()); + //messages.add(new UserDataComposer(this.client.getHabbo()).compose()); + //messages.add(new SessionRightsComposer().compose()); + //messages.add(new MinimailCountComposer().compose()); + //messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + //messages.add(new FriendsComposer(this.client.getHabbo()).compose()); + + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + messages.add(new ModToolComposer(this.client.getHabbo()).compose()); + } + + this.client.sendResponses(messages); + + //Hardcoded + this.client.sendResponse(new NewNavigatorMetaDataComposer()); + this.client.sendResponse(new NewNavigatorLiftedRoomsComposer()); + this.client.sendResponse(new NewNavigatorCollapsedCategoriesComposer()); + this.client.sendResponse(new NewNavigatorSavedSearchesComposer()); + this.client.sendResponse(new NewNavigatorEventCategoriesComposer()); + //this.client.sendResponse(new HotelViewComposer()); + //this.client.sendResponse(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), this.client.getHabbo().getHabboInfo().getHomeRoom())); + //this.client.sendResponse(new UserEffectsListComposer()); + + + /* ServerMessage msg = new MinimailCountComposer().compose(); + for(int i = 0; i < 9; i++) + { + //Not sure why habbo does this. ohwell. + this.client.sendResponse(msg); + }*/ +/* + this.client.sendResponse(new DebugConsoleComposer()); + this.client.sendResponse(new MessengerInitComposer(this.client.getHabbo())); + this.client.sendResponse(new NewUserIdentityComposer()); + this.client.sendResponse(new UserPermissionsComposer(this.client.getHabbo())); + this.client.sendResponse(new UserPerksComposer()); + this.client.sendResponse(new SessionRightsComposer()); + + + //this.client.sendResponse(new AddHabboItemComposer(this.client.getHabbo().getInventory().getItemsComponent().getItemsAsValueCollection())); + this.client.sendResponse(new UserClothesComposer()); + + //this.client.sendResponse(new UnknownComposer4()); + //this.client.sendResponse(new UnknownComposer5()); + this.client.sendResponse(new BuildersClubExpiredComposer()); + this.client.sendResponse(new FavoriteRoomsCountComposer()); + this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + this.client.sendResponse(new UserAchievementScoreComposer(this.client.getHabbo())); + this.client.sendResponse(new HotelViewDataComposer(",2013-05-08 13:00,gamesmaker;2013-05-11 13:00", ""));*/ + + + Emulator.getPluginManager().fireEvent(new UserLoginEvent(habbo, this.client.getChannel().localAddress())); + + } + else + { + this.client.sendResponse(new GenericAlertComposer("Can't connect *sadpanda*")); + + this.client.getChannel().close(); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer4.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer4.java new file mode 100644 index 00000000..69d92501 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer4.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownComposer4 extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer4); + this.response.appendBoolean(true); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer5.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer5.java new file mode 100644 index 00000000..99843ed0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/UnknownComposer5.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownComposer5 extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer5); + this.response.appendInt(0); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/handshake/UsernameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/handshake/UsernameEvent.java new file mode 100644 index 00000000..30908631 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/UsernameEvent.java @@ -0,0 +1,109 @@ +package com.eu.habbo.messages.incoming.handshake; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.events.calendar.AdventCalendarDataComposer; +import com.eu.habbo.messages.outgoing.unknown.NuxAlertComposer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.time.temporal.ChronoUnit; +import java.util.Calendar; +import java.util.Date; + +public class UsernameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + boolean calendar = false; + if (!this.client.getHabbo().getHabboStats().getAchievementProgress().containsKey(Emulator.getGameEnvironment().getAchievementManager().getAchievement("Login"))) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("Login")); + calendar = true; + } + else + { + + long daysBetween = ChronoUnit.DAYS.between(new Date((long)this.client.getHabbo().getHabboInfo().getLastOnline() * 1000l).toInstant(), new Date().toInstant()); + + + Date lastLogin = new Date(this.client.getHabbo().getHabboInfo().getLastOnline()); + Calendar c1 = Calendar.getInstance(); // today + c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday + + Calendar c2 = Calendar.getInstance(); + c2.setTime(lastLogin); // your date + + if (daysBetween == 1) + { + if (this.client.getHabbo().getHabboStats().getAchievementProgress().get(Emulator.getGameEnvironment().getAchievementManager().getAchievement("Login")) == this.client.getHabbo().getHabboStats().loginStreak) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("Login")); + } + this.client.getHabbo().getHabboStats().loginStreak++; + calendar = true; + } else + { + if (((lastLogin.getTime() / 1000) - Emulator.getIntUnixTimestamp()) > 86400) + { + this.client.getHabbo().getHabboStats().loginStreak = 0; + } + } + } + + if (!this.client.getHabbo().getHabboStats().getAchievementProgress().containsKey(Emulator.getGameEnvironment().getAchievementManager().getAchievement("RegistrationDuration"))) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RegistrationDuration"), 0); + } + else + { + int daysRegistered = ((Emulator.getIntUnixTimestamp() - this.client.getHabbo().getHabboInfo().getAccountCreated()) / 86400); + + int days = this.client.getHabbo().getHabboStats().getAchievementProgress( + Emulator.getGameEnvironment().getAchievementManager().getAchievement("RegistrationDuration") + ); + + if (daysRegistered - days > 0) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RegistrationDuration"), daysRegistered - days); + } + } + + if(!this.client.getHabbo().getHabboStats().getAchievementProgress().containsKey(Emulator.getGameEnvironment().getAchievementManager().getAchievement("TraderPass"))) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("TraderPass")); + } + + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement achievementQueueStatement = connection.prepareStatement("SELECT * FROM users_achievements_queue WHERE user_id = ?")) + { + achievementQueueStatement.setInt(1, this.client.getHabbo().getHabboInfo().getId()); + + try (ResultSet achievementSet = achievementQueueStatement.executeQuery()) + { + while (achievementSet.next()) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement(achievementSet.getInt("achievement_id")), achievementSet.getInt("amount")); + } + } + + try (PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM users_achievements_queue WHERE user_id = ?")) + { + deleteStatement.setInt(1, this.client.getHabbo().getHabboInfo().getId()); + deleteStatement.execute(); + } + } + + if (calendar) + { + this.client.sendResponse(new AdventCalendarDataComposer("xmas11", Emulator.getGameEnvironment().getCatalogManager().calendarRewards.size(), this.client.getHabbo().getHabboStats().loginStreak, this.client.getHabbo().getHabboStats().calendarRewardsClaimed, true)); + this.client.sendResponse(new NuxAlertComposer("openView/calendar")); + } + + + this.client.getHabbo().getHabboInfo().setLastOnline(Emulator.getIntUnixTimestamp()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/helper/RequestTalentTrackEvent.java b/src/main/java/com/eu/habbo/messages/incoming/helper/RequestTalentTrackEvent.java new file mode 100644 index 00000000..fa54713b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/helper/RequestTalentTrackEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.helper; + +import com.eu.habbo.habbohotel.achievements.TalentTrackType; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.achievements.talenttrack.TalentTrackComposer; + +public class RequestTalentTrackEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new TalentTrackComposer(this.client.getHabbo(), TalentTrackType.valueOf(this.packet.readString().toUpperCase()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewClaimBadgeRewardEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewClaimBadgeRewardEvent.java new file mode 100644 index 00000000..2b60a131 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewClaimBadgeRewardEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.hotelview; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; + +public class HotelViewClaimBadgeRewardEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String request = this.packet.readString(); + + if (Emulator.getConfig().getBoolean("hotelview.badgereward." + request +".enabled")) + { + String badgeCode = Emulator.getConfig().getValue("hotelview.badgereward." + request +"badge"); + + if (!badgeCode.isEmpty()) + { + if (!this.client.getHabbo().getInventory().getBadgesComponent().hasBadge(badgeCode)) + { + HabboBadge badge = BadgesComponent.createBadge(badgeCode, this.client.getHabbo()); + this.client.sendResponse(new AddUserBadgeComposer(badge)); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewDataEvent.java new file mode 100644 index 00000000..540efb7f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewDataEvent.java @@ -0,0 +1,68 @@ +package com.eu.habbo.messages.incoming.hotelview; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewDataComposer; + +public class HotelViewDataEvent extends MessageHandler { + + @Override + public void handle() + { + + /*String[] data = hotelViewData.split(","); + + if(data.length > 1) + { + this.client.sendResponse(new HotelViewDataComposer(hotelViewData, data[data.length - 1].replace(";", ""))); + System.out.println("Hotelview Data: " + hotelViewData); + } + else + { + System.out.println("Hotelview Data error: " + hotelViewData); + this.client.sendResponse(new HotelViewDataComposer(hotelViewData, "")); + }*/ + /*String hotelViewData = this.packet.readString(); + + String[] types = hotelViewData.split(";"); + + for(String s : types) + { + if(!s.contains(",")) + continue; + + String[] data = s.split(","); + this.client.sendResponse(new HotelViewDataComposer(hotelViewData, data[data.length - 1])); + }*/ + + try + { + String data = this.packet.readString(); + if (data.contains(";")) + { + String[] d = data.split(";"); + + for (String s : d) + { + if (s.contains(",")) + { + this.client.sendResponse(new HotelViewDataComposer(s, s.split(",")[s.split(",").length - 1])); + } else + { + this.client.sendResponse(new HotelViewDataComposer(data, s)); + } + + break; + } + + //this.client.sendResponse(new HotelViewDataComposer("2013-05-08 13:0", "gamesmaker")); + } else + { + this.client.sendResponse(new HotelViewDataComposer(data, data.split(",")[data.split(",").length - 1])); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewEvent.java new file mode 100644 index 00000000..796b3904 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewEvent.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.incoming.hotelview; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.HallOfFameComposer; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewComposer; + +public class HotelViewEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.getHabbo().getHabboInfo().setLoadingRoom(0); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getCurrentRoom()); + } + + if (this.client.getHabbo().getHabboInfo().getRoomQueueId() != 0) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.client.getHabbo().getHabboInfo().getRoomQueueId()); + + if (room != null) + { + room.removeFromQueue(this.client.getHabbo()); + } + else + { + this.client.getHabbo().getHabboInfo().setRoomQueueId(0); + } + } + + if(this.client.getHabbo().getRoomUnit() != null) + { + this.client.getHabbo().getRoomUnit().clearWalking(); + this.client.getHabbo().getRoomUnit().setInRoom(false); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBadgeRewardEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBadgeRewardEvent.java new file mode 100644 index 00000000..826ff511 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBadgeRewardEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.hotelview; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewBadgeButtonConfigComposer; + +public class HotelViewRequestBadgeRewardEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String badge = this.packet.readString(); + this.client.sendResponse(new HotelViewBadgeButtonConfigComposer(Emulator.getConfig().getValue("hotelview.badgereward." + badge + ".badge"), Emulator.getConfig().getBoolean("hotelview.badgereward." + badge + ".enabled"))); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBonusRareEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBonusRareEvent.java new file mode 100644 index 00000000..0794ef2a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/HotelViewRequestBonusRareEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.hotelview; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.*; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; +import com.eu.habbo.messages.outgoing.users.UserDataComposer; +import com.eu.habbo.messages.outgoing.users.UserHomeRoomComposer; + +public class HotelViewRequestBonusRareEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new BonusRareComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/RequestNewsListEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/RequestNewsListEvent.java new file mode 100644 index 00000000..81d26415 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/RequestNewsListEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.hotelview; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.*; + +public class RequestNewsListEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new HotelViewDataComposer("2013-05-08 13:0", "gamesmaker")); + this.client.sendResponse(new HallOfFameComposer()); + this.client.sendResponse(new NewsListComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBadgesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBadgesEvent.java new file mode 100644 index 00000000..1f68d625 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBadgesEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.inventory; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryAchievementsComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryBadgesComposer; + +public class RequestInventoryBadgesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new InventoryBadgesComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBotsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBotsEvent.java new file mode 100644 index 00000000..eadb080c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryBotsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.inventory; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryBotsComposer; + +public class RequestInventoryBotsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new InventoryBotsComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryItemsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryItemsEvent.java new file mode 100644 index 00000000..09d8a406 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryItemsEvent.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.incoming.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryItemsComposer; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; + +import java.util.NoSuchElementException; + +public class RequestInventoryItemsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int totalItems = this.client.getHabbo().getInventory().getItemsComponent().getItems().size(); + int pages = (int) Math.ceil((double) totalItems / 1000.0); + + if (pages == 0) + { + pages = 1; + } + + synchronized (this.client.getHabbo().getInventory().getItemsComponent().getItems()) + { + TIntObjectMap items = new TIntObjectHashMap(); + TIntObjectIterator iterator = this.client.getHabbo().getInventory().getItemsComponent().getItems().iterator(); + int count = 0; + int page = 0; + for (int i = this.client.getHabbo().getInventory().getItemsComponent().getItems().size(); i-- > 0; ) + { + if (count == 0) + { + page++; + } + + try + { + iterator.advance(); + items.put(iterator.key(), iterator.value()); + count++; + } + catch (NoSuchElementException e) + { + Emulator.getLogging().logErrorLine(e); + break; + } + + if (count == 1000) + { + this.client.sendResponse(new InventoryItemsComposer(page, pages, items)); + count = 0; + items.clear(); + } + } + + this.client.sendResponse(new InventoryItemsComposer(page, pages, items)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryPetsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryPetsEvent.java new file mode 100644 index 00000000..d98a020e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/inventory/RequestInventoryPetsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.inventory; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryPetsComposer; + +public class RequestInventoryPetsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new InventoryPetsComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/inventory/TestInventoryEvent.java b/src/main/java/com/eu/habbo/messages/incoming/inventory/TestInventoryEvent.java new file mode 100644 index 00000000..503300e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/inventory/TestInventoryEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.inventory; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryItemsComposer; + +public class TestInventoryEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + //this.client.sendResponse(new InventoryItemsComposer(this.client.getHabbo(), items)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolAlertEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolAlertEvent.java new file mode 100644 index 00000000..3fbc88aa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolAlertEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ModToolAlertEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + Emulator.getGameEnvironment().getModToolManager().alert(this.client.getHabbo(), Emulator.getGameEnvironment().getHabboManager().getHabbo(this.packet.readInt()), this.packet.readString()); + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.kick").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolChangeRoomSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolChangeRoomSettingsEvent.java new file mode 100644 index 00000000..122a5a95 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolChangeRoomSettingsEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomState; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import gnu.trove.procedure.TObjectProcedure; + +public class ModToolChangeRoomSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.packet.readInt()); + + if (room != null) + { + boolean lockDoor = this.packet.readInt() == 1; + boolean changeTitle = this.packet.readInt() == 1; + boolean kickUsers = this.packet.readInt() == 1; + + Emulator.getGameEnvironment().getModToolManager().roomAction(room, this.client.getHabbo(), kickUsers, lockDoor, changeTitle); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.roomsettings").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolCloseTicketEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolCloseTicketEvent.java new file mode 100644 index 00000000..f071b964 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolCloseTicketEvent.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ModToolCloseTicketEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int state = this.packet.readInt(); + int something = this.packet.readInt(); + int ticketId = this.packet.readInt(); + + ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(ticketId); + + if (issue == null || issue.modId != this.client.getHabbo().getHabboInfo().getId()) + return; + + Habbo sender = Emulator.getGameEnvironment().getHabboManager().getHabbo(issue.senderId); + + switch (state) + { + case 1: + Emulator.getGameEnvironment().getModToolManager().closeTicketAsUseless(issue, sender); + break; + + case 2: + Emulator.getGameEnvironment().getModToolManager().closeTicketAsAbusive(issue, sender); + break; + + case 3: + Emulator.getGameEnvironment().getModToolManager().closeTicketAsHandled(issue, sender); + break; + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.ticket.close").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueChangeTopicEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueChangeTopicEvent.java new file mode 100644 index 00000000..0577df33 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueChangeTopicEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.threading.runnables.UpdateModToolIssue; + +public class ModToolIssueChangeTopicEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int ticketId = this.packet.readInt(); + int unknownInt = this.packet.readInt(); + int categoryId = this.packet.readInt(); + + ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(ticketId); + + if (issue != null) + { + issue.category = categoryId; + new UpdateModToolIssue(issue).run(); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java new file mode 100644 index 00000000..b6fced42 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java @@ -0,0 +1,57 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.*; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ModToolIssueDefaultSanctionEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + int issueId = this.packet.readInt(); + int unknown = this.packet.readInt(); + int category = this.packet.readInt(); + + ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(issueId); + + if (issue.modId == this.client.getHabbo().getHabboInfo().getId()) + { + CfhTopic modToolCategory = Emulator.getGameEnvironment().getModToolManager().getCfhTopic(category); + + if (modToolCategory != null) + { + ModToolPreset defaultSanction = modToolCategory.defaultSanction; + + if (defaultSanction != null) + { + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(issue.reportedId); + + if (defaultSanction.banLength > 0) + { + Emulator.getGameEnvironment().getModToolManager().ban(issue.reportedId, this.client.getHabbo(), defaultSanction.message, defaultSanction.banLength * 86400, ModToolBanType.ACCOUNT, modToolCategory.id); + } + else if (defaultSanction.muteLength > 0) + { + + if (target != null) + { + target.mute(defaultSanction.muteLength * 86400); + } + } + } + } + + issue.state = ModToolTicketState.CLOSED; + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + } + else + { + this.client.getHabbo().alert(Emulator.getTexts().getValue("supporttools.not_ticket_owner")); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java new file mode 100644 index 00000000..5ac473d3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +public class ModToolKickEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Emulator.getGameEnvironment().getModToolManager().kick(this.client.getHabbo(), Emulator.getGameEnvironment().getHabboManager().getHabbo(this.packet.readInt()), this.packet.readString()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolPickTicketEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolPickTicketEvent.java new file mode 100644 index 00000000..89fa7eb0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolPickTicketEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketState; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolIssueInfoComposer; + +public class ModToolPickTicketEvent extends MessageHandler +{ + public static boolean send = false; + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + this.packet.readInt(); + ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(this.packet.readInt()); + + if(issue != null) + { + if(issue.state == ModToolTicketState.PICKED) + { + this.client.sendResponse(new ModToolIssueInfoComposer(issue)); + this.client.sendResponse(new GenericAlertComposer("Picking issue failedd: \rTicket already picked or does not exist!")); + + return; + } + + //this.client.sendResponse(new ModToolIssueInfoComposer(issue)); + Emulator.getGameEnvironment().getModToolManager().pickTicket(issue, this.client.getHabbo()); + } + else + { + this.client.sendResponse(new GenericAlertComposer("Picking issue failed: \rTicket already picked or does not exist!")); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.ticket.pick").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolReleaseTicketEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolReleaseTicketEvent.java new file mode 100644 index 00000000..2f2e8712 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolReleaseTicketEvent.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketState; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ModToolReleaseTicketEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int count = this.packet.readInt(); + + while (count != 0) + { + count--; + + int ticketId = this.packet.readInt(); + + ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(ticketId); + + if (issue == null) + continue; + + if (issue.modId != this.client.getHabbo().getHabboInfo().getId()) + continue; + + issue.modId = 0; + issue.modName = ""; + issue.state = ModToolTicketState.OPEN; + + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.ticket.release").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestIssueChatlogEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestIssueChatlogEvent.java new file mode 100644 index 00000000..49b76404 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestIssueChatlogEvent.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolIssueChatlogComposer; + +import java.util.ArrayList; + +public class ModToolRequestIssueChatlogEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(this.packet.readInt()); + + if(issue != null) + { + ArrayList chatlog; + + if (issue.type == ModToolTicketType.IM) + { + chatlog = Emulator.getGameEnvironment().getModToolManager().getMessengerChatlog(issue.reportedId, issue.senderId); + } + else + { + if (issue.roomId > 0) + { + chatlog = Emulator.getGameEnvironment().getModToolManager().getRoomChatlog(issue.roomId); + } else + { + chatlog = new ArrayList(); + chatlog.addAll(Emulator.getGameEnvironment().getModToolManager().getUserChatlog(issue.reportedId)); + chatlog.addAll(Emulator.getGameEnvironment().getModToolManager().getUserChatlog(issue.senderId)); + } + } + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(issue.roomId); + String roomName = ""; + + if(room != null) + { + roomName = room.getName(); + } + this.client.sendResponse(new ModToolIssueChatlogComposer(issue, chatlog, roomName)); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.chatlog").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomChatlogEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomChatlogEvent.java new file mode 100644 index 00000000..94da0b1d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomChatlogEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolRoomChatlogComposer; + +public class ModToolRequestRoomChatlogEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + this.packet.readInt(); + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.packet.readInt()); + + if(room != null) + this.client.sendResponse(new ModToolRoomChatlogComposer(room, Emulator.getGameEnvironment().getModToolManager().getRoomChatlog(room.getId()))); + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.chatlog").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomInfoEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomInfoEvent.java new file mode 100644 index 00000000..d790487a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomInfoEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolRoomInfoComposer; + +public class ModToolRequestRoomInfoEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + //int roomId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + //Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if (room != null) + { + this.client.sendResponse(new ModToolRoomInfoComposer(room)); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.roominfo").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomUserChatlogEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomUserChatlogEvent.java new file mode 100644 index 00000000..ae5349dd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomUserChatlogEvent.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolRoomChatlogComposer; + +public class ModToolRequestRoomUserChatlogEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int userId = this.packet.readInt(); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if(habbo != null) + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + this.client.sendResponse(new ModToolRoomChatlogComposer(room, Emulator.getGameEnvironment().getModToolManager().getRoomChatlog(room.getId()))); + } + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.chatlog").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomVisitsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomVisitsEvent.java new file mode 100644 index 00000000..334a468d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestRoomVisitsEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolUserRoomVisitsComposer; + +public class ModToolRequestRoomVisitsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int userId = this.packet.readInt(); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if(habbo != null) + this.client.sendResponse(new ModToolUserRoomVisitsComposer(habbo, Emulator.getGameEnvironment().getModToolManager().requestUserRoomVisits(habbo))); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserChatlogEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserChatlogEvent.java new file mode 100644 index 00000000..12e31e71 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserChatlogEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolManager; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolUserChatlogComposer; + +public class ModToolRequestUserChatlogEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int userId = this.packet.readInt(); + String username = HabboManager.getOfflineHabboInfo(userId).getUsername(); + + this.client.sendResponse(new ModToolUserChatlogComposer(Emulator.getGameEnvironment().getModToolManager().getUserRoomVisitsAndChatlogs(userId), userId, username)); + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.chatlog").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserInfoEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserInfoEvent.java new file mode 100644 index 00000000..58f9efa6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRequestUserInfoEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolManager; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ModToolRequestUserInfoEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + ModToolManager.requestUserInfo(this.client, this.packet); + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.userinfo").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRoomAlertEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRoomAlertEvent.java new file mode 100644 index 00000000..a1634761 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolRoomAlertEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.modtool.ModToolIssueHandledComposer; + +public class ModToolRoomAlertEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + int type = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) + { + room.alert(this.packet.readString()); + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.roomalert").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java new file mode 100644 index 00000000..54085bd6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolIssueHandledComposer; + +public class ModToolSanctionAlertEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + String message = this.packet.readString(); + int cfhTopic = this.packet.readInt(); + + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if (habbo != null) + { + habbo.alert(message); + } + else + { + this.client.sendResponse(new ModToolIssueHandledComposer(Emulator.getTexts().getValue("generic.user.not_found").replace("%user%", Emulator.getConfig().getValue("hotel.player.name")))); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java new file mode 100644 index 00000000..f9f47bbf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java @@ -0,0 +1,50 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolBanType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ModToolSanctionBanEvent extends MessageHandler +{ + public final int BAN_18_HOURS = 3; + public final int BAN_7_DAYS = 4; + public final int BAN_30_DAYS_STEP_1 = 5; + public final int BAN_30_DAYS_STEP_2 = 7; + public final int BAN_100_YEARS = 6; + public final int BAN_AVATAR_ONLY_100_YEARS = 106; + + public final int DAY_IN_SECONDS = 24 * 60 * 60; + + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + String message = this.packet.readString(); + int cfhTopic = this.packet.readInt(); + int banType = this.packet.readInt(); + boolean unknown = this.packet.readBoolean(); + + int duration = 0; + + switch (banType) + { + case BAN_18_HOURS: duration = 18 * 60 * 60; break; + case BAN_7_DAYS: duration = 7 * DAY_IN_SECONDS; break; + case BAN_30_DAYS_STEP_1: + case BAN_30_DAYS_STEP_2: + duration = 30 * DAY_IN_SECONDS; break; + case BAN_100_YEARS: + case BAN_AVATAR_ONLY_100_YEARS: + duration = Emulator.getIntUnixTimestamp(); + } + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + Emulator.getGameEnvironment().getModToolManager().ban(userId, this.client.getHabbo(), message, duration, ModToolBanType.ACCOUNT, cfhTopic); + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.modtools.ban").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername())); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java new file mode 100644 index 00000000..16b9d5f3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolIssueHandledComposer; + +public class ModToolSanctionMuteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + String message = this.packet.readString(); + int cfhTopic = this.packet.readInt(); + + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if (habbo != null) + { + habbo.mute(60 * 60); + habbo.alert(message); + this.client.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_mute.muted").replace("%user%", habbo.getHabboInfo().getUsername())); + } + else + { + this.client.sendResponse(new ModToolIssueHandledComposer(Emulator.getTexts().getValue("generic.user.not_found").replace("%user%", Emulator.getConfig().getValue("hotel.player.name")))); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java new file mode 100644 index 00000000..52289598 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ModToolIssueHandledComposer; + +public class ModToolSanctionTradeLockEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + String message = this.packet.readString(); + int duration = this.packet.readInt(); + int cfhTopic = this.packet.readInt(); + + if (this.client.getHabbo().hasPermission("acc_supporttool")) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if (habbo != null) + { + habbo.getHabboStats().allowTrade = false; + habbo.alert(message); + } + else + { + this.client.sendResponse(new ModToolIssueHandledComposer(Emulator.getTexts().getValue("generic.user.not_found").replace("%user%", Emulator.getConfig().getValue("hotel.player.name")))); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportBullyEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportBullyEvent.java new file mode 100644 index 00000000..dd415a20 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportBullyEvent.java @@ -0,0 +1,69 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.BullyReportedMessageComposer; +import com.eu.habbo.messages.outgoing.modtool.HelperRequestDisabledComposer; + +import java.util.ArrayList; + +public class ReportBullyEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboStats().allowTalk()) + { + this.client.sendResponse(new HelperRequestDisabledComposer()); + return; + } + + int userId = this.packet.readInt(); + int roomId = this.packet.readInt(); + + if(userId == this.client.getHabbo().getHabboInfo().getId()) + { + return; + } + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + Habbo habbo = room.getHabbo(userId); + + if(habbo != null) + { + GuardianTicket ticket = Emulator.getGameEnvironment().getGuideManager().getOpenReportedHabboTicket(habbo); + + if(ticket != null) + { + this.client.sendResponse(new BullyReportedMessageComposer(BullyReportedMessageComposer.ALREADY_REPORTED)); + return; + } + + ArrayList chatLog = Emulator.getGameEnvironment().getModToolManager().getRoomChatlog(roomId); + + if(chatLog.isEmpty()) + { + this.client.sendResponse(new BullyReportedMessageComposer(BullyReportedMessageComposer.NO_CHAT)); + return; + } + + Emulator.getGameEnvironment().getGuideManager().addGuardianTicket(new GuardianTicket(this.client.getHabbo(), habbo, chatLog)); + + this.client.sendResponse(new BullyReportedMessageComposer(BullyReportedMessageComposer.RECEIVED)); + } + else + { + } + } + else + { + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportEvent.java new file mode 100644 index 00000000..7547afe4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportEvent.java @@ -0,0 +1,150 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.modtool.*; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.*; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserIgnoredComposer; +import com.eu.habbo.threading.runnables.InsertModToolIssue; + +import java.util.ArrayList; +import java.util.List; + +public class ReportEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(!this.client.getHabbo().getHabboStats().allowTalk()) + { + this.client.sendResponse(new HelperRequestDisabledComposer()); + return; + } + + String message = this.packet.readString(); + int topic = this.packet.readInt(); + int userId = this.packet.readInt(); + int roomId = this.packet.readInt(); + int messageCount = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + List issues = Emulator.getGameEnvironment().getModToolManager().openTicketsForHabbo(this.client.getHabbo()); + if(!issues.isEmpty()) + { + //this.client.sendResponse(new GenericAlertComposer("You've got still a pending ticket. Wait till the moderators are done reviewing your ticket.")); + this.client.sendResponse(new ReportRoomFormComposer(issues)); + return; + } + + CfhTopic cfhTopic = Emulator.getGameEnvironment().getModToolManager().getCfhTopic(topic); + + if(userId != -1) + { + Habbo reported = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if(reported != null) + { + if (cfhTopic != null && cfhTopic.action == CfhActionType.GUARDIANS && Emulator.getGameEnvironment().getGuideManager().activeGuardians()) + { + GuardianTicket ticket = Emulator.getGameEnvironment().getGuideManager().getOpenReportedHabboTicket(reported); + + if(ticket != null) + { + this.client.sendResponse(new BullyReportedMessageComposer(BullyReportedMessageComposer.ALREADY_REPORTED)); + return; + } + + ArrayList chatLog = Emulator.getGameEnvironment().getModToolManager().getRoomChatlog(roomId); + + if(chatLog.isEmpty()) + { + this.client.sendResponse(new BullyReportedMessageComposer(BullyReportedMessageComposer.NO_CHAT)); + return; + } + + Emulator.getGameEnvironment().getGuideManager().addGuardianTicket(new GuardianTicket(this.client.getHabbo(), reported, chatLog)); + + this.client.sendResponse(new BullyReportedMessageComposer(BullyReportedMessageComposer.RECEIVED)); + } + else + { + ModToolIssue issue = new ModToolIssue(this.client.getHabbo().getHabboInfo().getId(), this.client.getHabbo().getHabboInfo().getUsername(), reported.getHabboInfo().getId(), reported.getHabboInfo().getUsername(), roomId, message, ModToolTicketType.NORMAL); + issue.category = topic; + new InsertModToolIssue(issue).run(); + + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + this.client.sendResponse(new ModToolReportReceivedAlertComposer(ModToolReportReceivedAlertComposer.REPORT_RECEIVED)); + + if (cfhTopic != null) + { + if (cfhTopic.action != CfhActionType.MODS) + { + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + if (issue.state == ModToolTicketState.OPEN) + { + if (cfhTopic.action == CfhActionType.AUTO_IGNORE) + { + client.getHabbo().getHabboStats().ignoredUsers.add(reported.getHabboInfo().getId()); + client.sendResponse(new RoomUserIgnoredComposer(reported, RoomUserIgnoredComposer.IGNORED)); + } + + client.sendResponse(new ModToolIssueHandledComposer(cfhTopic.reply).compose()); + Emulator.getGameEnvironment().getModToolManager().closeTicketAsHandled(issue, null); + } + } + }, 30 * 1000); + } + } + } + } + } + else + { + ModToolIssue issue = new ModToolIssue(this.client.getHabbo().getHabboInfo().getId(), this.client.getHabbo().getHabboInfo().getUsername(), room != null ? room.getOwnerId() : 0, room != null ? room.getOwnerName() : "", roomId, message, ModToolTicketType.ROOM); + issue.category = topic; + new InsertModToolIssue(issue).run(); + + this.client.sendResponse(new ModToolReportReceivedAlertComposer(ModToolReportReceivedAlertComposer.REPORT_RECEIVED)); + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + + if(cfhTopic != null) + { + if(cfhTopic.action != CfhActionType.MODS) + { + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + if(issue.state == ModToolTicketState.OPEN) + { + if(cfhTopic.action == CfhActionType.AUTO_IGNORE) + { + client.getHabbo().getHabboStats().ignoredUsers.add(issue.reportedId); + Habbo reported = Emulator.getGameEnvironment().getHabboManager().getHabbo(issue.reportedId); + if (reported != null) + { + client.sendResponse(new RoomUserIgnoredComposer(reported, RoomUserIgnoredComposer.IGNORED)); + } + } + + client.sendResponse(new ModToolIssueHandledComposer(cfhTopic.reply).compose()); + Emulator.getGameEnvironment().getModToolManager().closeTicketAsHandled(issue, null); + } + } + }, 30 * 1000); + } + } + + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportFriendPrivateChatEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportFriendPrivateChatEvent.java new file mode 100644 index 00000000..30364678 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/ReportFriendPrivateChatEvent.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.HelperRequestDisabledComposer; +import com.eu.habbo.threading.runnables.InsertModToolIssue; + +import java.util.ArrayList; + +public class ReportFriendPrivateChatEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(!this.client.getHabbo().getHabboStats().allowTalk()) + { + this.client.sendResponse(new HelperRequestDisabledComposer()); + return; + } + + String message = this.packet.readString(); + int category = this.packet.readInt(); + int userId = this.packet.readInt(); + int count = this.packet.readInt(); + ArrayList chatLogs = new ArrayList<>(); + + HabboInfo info = null; + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + if (target != null) + { + info = target.getHabboInfo(); + } + else + { + info = HabboManager.getOfflineHabboInfo(userId); + } + + if (info != null) + { + for (int i = 0; i < count; i++) + { + int chatUserId = this.packet.readInt(); + String username = this.packet.readInt() == info.getId() ? info.getUsername() : this.client.getHabbo().getHabboInfo().getUsername(); + + chatLogs.add(new ModToolChatLog(0, chatUserId, username, packet.readString())); + } + } + + ModToolIssue issue = new ModToolIssue(this.client.getHabbo().getHabboInfo().getId(), this.client.getHabbo().getHabboInfo().getUsername(), userId, info.getUsername(), 0, message, ModToolTicketType.IM); + issue.category = category; + issue.chatLogs = chatLogs; + new InsertModToolIssue(issue).run(); + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportRoomEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportRoomEvent.java new file mode 100644 index 00000000..5b976b55 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportRoomEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.ReportRoomFormComposer; + +public class RequestReportRoomEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new ReportRoomFormComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportUserBullyingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportUserBullyingEvent.java new file mode 100644 index 00000000..1006079c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/RequestReportUserBullyingEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.modtool.BullyReportRequestComposer; + +import java.util.Calendar; + +public class RequestReportUserBullyingEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + GuardianTicket ticket = Emulator.getGameEnvironment().getGuideManager().getRecentTicket(this.client.getHabbo()); + + if(ticket != null) + { + if(!ticket.isFinished()) + { + this.client.sendResponse(new BullyReportRequestComposer(BullyReportRequestComposer.ONGOING_HELPER_CASE, 1)); + return; + } + + if((Calendar.getInstance().getTime().getTime() / 1000) - ticket.getDate().getTime() < Emulator.getConfig().getInt("guardians.reporting.cooldown")) + { + this.client.sendResponse(new BullyReportRequestComposer(BullyReportRequestComposer.TOO_RECENT, 1)); + return; + } + } + + this.client.sendResponse(new BullyReportRequestComposer(BullyReportRequestComposer.START_REPORT, 0)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/modtool/StartSafetyQuizEvent.java b/src/main/java/com/eu/habbo/messages/incoming/modtool/StartSafetyQuizEvent.java new file mode 100644 index 00000000..b64f564a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/modtool/StartSafetyQuizEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class StartSafetyQuizEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String quizName = this.packet.readString(); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SafetyQuizGraduate")); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCategoryListModeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCategoryListModeEvent.java new file mode 100644 index 00000000..7805a7c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCategoryListModeEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.navigation.ListMode; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class NavigatorCategoryListModeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String category = this.packet.readString(); + int viewMode = this.packet.readInt(); + + RoomCategory roomCategory = Emulator.getGameEnvironment().getRoomManager().getCategory(category); + this.client.getHabbo().getHabboStats().navigatorWindowSettings.setListMode( + roomCategory != null ? roomCategory.getCaptionSave() : category, viewMode == 1 ? ListMode.THUMBNAILS : ListMode.LIST); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCollapseCategoryEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCollapseCategoryEvent.java new file mode 100644 index 00000000..e58c5949 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorCollapseCategoryEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.navigation.DisplayMode; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class NavigatorCollapseCategoryEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String category = this.packet.readString(); + this.client.getHabbo().getHabboStats().navigatorWindowSettings.setDisplayMode(category, DisplayMode.COLLAPSED); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorUncollapseCategoryEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorUncollapseCategoryEvent.java new file mode 100644 index 00000000..45e6cc56 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/NavigatorUncollapseCategoryEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.habbohotel.navigation.DisplayMode; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class NavigatorUncollapseCategoryEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String category = this.packet.readString(); + this.client.getHabbo().getHabboStats().navigatorWindowSettings.setDisplayMode(category, DisplayMode.VISIBLE); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/NewNavigatorActionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/NewNavigatorActionEvent.java new file mode 100644 index 00000000..293136c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/NewNavigatorActionEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.users.UserHomeRoomComposer; + +import java.util.ArrayList; +import java.util.Collections; + +public class NewNavigatorActionEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String data = this.packet.readString(); + + if(data.equals("random_friending_room")) + { + ArrayList rooms = Emulator.getGameEnvironment().getRoomManager().getActiveRooms(); + if(!rooms.isEmpty()) + { + Collections.shuffle(rooms); + this.client.sendResponse(new ForwardToRoomComposer(rooms.get(0).getId())); + } + } + else + { + this.client.sendResponse(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), this.client.getHabbo().getHabboInfo().getHomeRoom())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCanCreateRoomEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCanCreateRoomEvent.java new file mode 100644 index 00000000..d682beee --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCanCreateRoomEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.CanCreateRoomComposer; + +public class RequestCanCreateRoomEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int count = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo()).size(); + int max = this.client.getHabbo().getHabboStats().hasActiveClub() ? RoomManager.MAXIMUM_ROOMS_VIP : RoomManager.MAXIMUM_ROOMS_USER; + this.client.sendResponse(new CanCreateRoomComposer(count, max)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java new file mode 100644 index 00000000..75de9909 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java @@ -0,0 +1,68 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewComposer; +import com.eu.habbo.messages.outgoing.navigator.CanCreateRoomComposer; +import com.eu.habbo.messages.outgoing.navigator.RoomCreatedComposer; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomOpenComposer; + +public class RequestCreateRoomEvent extends MessageHandler { + + @Override + public void handle() throws Exception + { + String name = this.packet.readString(); + String description = this.packet.readString(); + String modelName = this.packet.readString(); + int categoryId = this.packet.readInt(); + int maxUsers = this.packet.readInt(); + int tradeType = this.packet.readInt(); + + if(!Emulator.getGameEnvironment().getRoomManager().layoutExists(modelName)) + { + Emulator.getLogging().logErrorLine("[SCRIPTER] Incorrect layout name \""+modelName+"\". " + this.client.getHabbo().getHabboInfo().getUsername()); + return; + } + + RoomCategory category = Emulator.getGameEnvironment().getRoomManager().getCategory(categoryId); + + if(category == null || category.getMinRank() > this.client.getHabbo().getHabboInfo().getRank().getId()) + { + Emulator.getLogging().logErrorLine("[SCRIPTER] Incorrect rank or non existing category ID: \""+categoryId+"\"." + this.client.getHabbo().getHabboInfo().getUsername()); + return; + } + + if(maxUsers > 250) + return; + + if(tradeType > 2) + return; + + int count = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo()).size(); + int max = this.client.getHabbo().getHabboStats().hasActiveClub() ? RoomManager.MAXIMUM_ROOMS_VIP : RoomManager.MAXIMUM_ROOMS_USER; + + if(count >= max) + { + this.client.sendResponse(new CanCreateRoomComposer(count, max)); + return; + } + + final Room room = Emulator.getGameEnvironment().getRoomManager().createRoomForHabbo(this.client.getHabbo(), name, description, modelName, maxUsers, categoryId); + + if(room != null) + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getCurrentRoom()); + } + + this.client.sendResponse(new RoomCreatedComposer(room)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestDeleteRoomEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestDeleteRoomEvent.java new file mode 100644 index 00000000..1062ed7f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestDeleteRoomEvent.java @@ -0,0 +1,98 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.navigator.NavigatorRoomDeletedEvent; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class RequestDeleteRoomEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + if (room.isOwner(this.client.getHabbo())) + { + if(Emulator.getPluginManager().fireEvent(new NavigatorRoomDeletedEvent(this.client.getHabbo(), room)).isCancelled()) + { + return; + } + + room.ejectAll(); + room.ejectUserFurni(room.getOwnerId()); + + if(room.getGuildId() > 0) + { + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(room.getGuildId()); + + if(guild != null) + { + Emulator.getGameEnvironment().getGuildManager().deleteGuild(guild); + } + } + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM rooms WHERE id = ? LIMIT 1")) + { + statement.setInt(1, roomId); + statement.execute(); + } + + room.preventUnloading = false; + + if (room.hasCustomLayout()) + { + try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM room_models_custom WHERE id = ? LIMIT 1")) + { + stmt.setInt(1, roomId); + stmt.execute(); + } + } + + Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); + + try (PreparedStatement rights = connection.prepareStatement("DELETE FROM room_rights WHERE room_id = ?")) + { + rights.setInt(1, roomId); + rights.execute(); + } + + try (PreparedStatement votes = connection.prepareStatement("DELETE FROM room_votes WHERE room_id = ?")) + { + votes.setInt(1, roomId); + votes.execute(); + } + + try (PreparedStatement filter = connection.prepareStatement("DELETE FROM room_wordfilter WHERE room_id = ?")) + { + filter.setInt(1, roomId); + filter.execute(); + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + else + { + String message = Emulator.getTexts().getValue("scripter.warning.room.delete").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%roomname%", room.getName()).replace("%roomowner%", room.getOwnerName()); + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestHighestScoreRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestHighestScoreRoomsEvent.java new file mode 100644 index 00000000..39f90aac --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestHighestScoreRoomsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class RequestHighestScoreRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsByScore())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestMyRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestMyRoomsEvent.java new file mode 100644 index 00000000..dc3a359a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestMyRoomsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class RequestMyRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNavigatorSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNavigatorSettingsEvent.java new file mode 100644 index 00000000..a4c148a0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNavigatorSettingsEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.navigator.*; + +public class RequestNavigatorSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { +// this.client.sendResponse(new NewNavigatorMetaDataComposer()); +// this.client.sendResponse(new NewNavigatorLiftedRoomsComposer()); +// this.client.sendResponse(new NewNavigatorCollapsedCategoriesComposer()); +// this.client.sendResponse(new NewNavigatorSavedSearchesComposer()); +// this.client.sendResponse(new NewNavigatorEventCategoriesComposer()); + this.client.sendResponse(new NewNavigatorSettingsComposer(this.client.getHabbo().getHabboStats().navigatorWindowSettings)); +// this.client.sendResponse(new InventoryRefreshComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorDataEvent.java new file mode 100644 index 00000000..93ad55ff --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorDataEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.*; + +public class RequestNewNavigatorDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new NewNavigatorSettingsComposer(this.client.getHabbo().getHabboStats().navigatorWindowSettings)); + this.client.sendResponse(new NewNavigatorMetaDataComposer()); + this.client.sendResponse(new NewNavigatorLiftedRoomsComposer()); + this.client.sendResponse(new NewNavigatorCollapsedCategoriesComposer()); + this.client.sendResponse(new NewNavigatorSavedSearchesComposer()); + this.client.sendResponse(new NewNavigatorEventCategoriesComposer()); + this.client.sendResponse(new NewNavigatorSettingsComposer(this.client.getHabbo().getHabboStats().navigatorWindowSettings)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java new file mode 100644 index 00000000..7ee1c7e8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestNewNavigatorRoomsEvent.java @@ -0,0 +1,301 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.navigation.*; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.NewNavigatorSearchResultsComposer; + +import java.util.*; + +public class RequestNewNavigatorRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { +// String searchCode = this.packet.readString(); +// String text = this.packet.readString(); +// +// List rooms = new ArrayList(); +// String key = "popular"; +// +// if(searchCode.equalsIgnoreCase("official_view")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().getPublicRooms(); +// key = "official-root"; +// } +// else if(searchCode.equalsIgnoreCase("hotel_view")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().getActiveRooms(); +// key = "popular"; +// } +// else if(searchCode.equalsIgnoreCase("roomads_view")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsPromoted(); +// key = "top_promotions"; +// } +// else if(searchCode.equalsIgnoreCase("myworld_view")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo()); +// key = "my"; +// } +// else +// { +// } +// +// if(text.contains(":")) +// { +// String filterType = text.split(":")[0]; +// String filterData = ""; +// int index = 0; +// for(String s : text.split(":")) +// { +// if(index == 0) +// { +// ++index; +// continue; +// } +// +// filterData+= s; +// } +// +// if(filterType.equalsIgnoreCase("owner")) +// { +// if(searchCode.equalsIgnoreCase("hotel_view") || searchCode.equalsIgnoreCase("myworld_view")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(filterData); +// } +// +// rooms = Emulator.getGameEnvironment().getRoomManager().filterRoomsByOwner(rooms, filterData); +// } +// else if(filterType.equalsIgnoreCase("tag")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().filterRoomsByTag(rooms, filterData); +// } +// else if(filterType.equalsIgnoreCase("group")) +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().filterRoomsByGroup(rooms, filterData); +// } +// else +// { +// } +// } +// else +// { +// rooms = Emulator.getGameEnvironment().getRoomManager().filterRoomsByNameAndDescription(rooms, text); +// } +// +// Collections.sort(rooms); +// List resultLists = new ArrayList(); +// resultLists.add(new SearchResultList(key, text, SearchAction.MORE, ListMode.LIST, false, rooms)); +// this.client.sendResponse(new NewNavigatorSearchResultsComposer(searchCode, text, resultLists)); + +// String view = this.packet.readString(); +// +// if (view.isEmpty()) +// { +// view = "official_view"; +// } +// +// String query = this.packet.readString(); +// String part = query; +// +// NavigatorFilter filter = Emulator.getGameEnvironment().getNavigatorManager().filters.get(view); +// +// if (filter != null) +// { +// List rooms = filter.getRooms(); +// +// Method field = null; +// +// if (query.contains(":")) +// { +// String[] parts = query.split(":"); +// +// String filterField = ""; +// if (parts.length > 1) +// { +// filterField = parts[0]; +// part = parts[1]; +// } +// else +// { +// filterField = parts[0].replace(":", ""); +// part = ""; +// } +// +// field = Emulator.getGameEnvironment().getNavigatorManager().filterSettings.get(filterField).getKey(); +// } +// +// if (field != null) +// { +// rooms = filter.filterBy(field, part, rooms); +// } +// else +// { +// List newRooms = new ArrayList(); +// +// for (Map.Entry set : Emulator.getGameEnvironment().getNavigatorManager().filterSettings.values()) +// { +// for (Room room : filter.filterBy(set.getKey(), part, rooms)) +// { +// if (!newRooms.contains(room)) +// { +// newRooms.add(room); +// } +// } +// } +// +// rooms = newRooms; +// } +// +// this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, filter.getResult(rooms, part))); +// } + + String view = this.packet.readString(); + String query = this.packet.readString(); + + NavigatorFilter filter = Emulator.getGameEnvironment().getNavigatorManager().filters.get(view); + RoomCategory category = Emulator.getGameEnvironment().getRoomManager().getCategoryBySafeCaption(view); + + String filterField = "anything"; + String part = query; + NavigatorFilterField field = Emulator.getGameEnvironment().getNavigatorManager().filterSettings.get(filterField); + if (filter != null) + { + if (query.contains(":")) + { + String[] parts = query.split(":"); + + if (parts.length > 1) + { + filterField = parts[0]; + part = parts[1]; + } else + { + filterField = parts[0].replace(":", ""); + if (!Emulator.getGameEnvironment().getNavigatorManager().filterSettings.containsKey(filterField)) + { + filterField = "anything"; + } + } + } + + if (Emulator.getGameEnvironment().getNavigatorManager().filterSettings.get(filterField) != null) + { + field = Emulator.getGameEnvironment().getNavigatorManager().filterSettings.get(filterField); + } + } + + if (field == null || query.isEmpty()) + { + if (filter == null) + return; + + List resultLists = filter.getResult(this.client.getHabbo()); + this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, resultLists)); + return; + } + + if (filter == null && category != null) + { + filter = Emulator.getGameEnvironment().getNavigatorManager().filters.get("hotel_view"); + } + + if (filter == null) + return; + + try + { + List resultLists = new ArrayList<>(); + + resultLists.addAll(filter.getResult(this.client.getHabbo(), field, part, category != null ? category.getId() : -1)); + + if (resultLists == null) + { + resultLists = new ArrayList<>(); + } + +// if (query.isEmpty()) +// { +// resultLists.add(new SearchResultList(1, view, view, SearchAction.BACK, ListMode.LIST, DisplayMode.VISIBLE, Emulator.getGameEnvironment().getRoomManager().getPopularRooms(10), true, false)); +// } + filter.filter(field.field, part, resultLists); + + Collections.sort(resultLists); + this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, resultLists)); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } +// } +// else +// { +// RoomCategory category = Emulator.getGameEnvironment().getRoomManager().getCategoryBySafeCaption(view); +// +// List resultLists = new ArrayList(); +// this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, resultLists)); +// +// if (category != null) +// { +// resultLists.add(new SearchResultList(1, view, query, SearchAction.BACK, ListMode.LIST, DisplayMode.VISIBLE, Emulator.getGameEnvironment().getRoomManager()., true, false)); +// } +// +// filter = Emulator.getGameEnvironment().getNavigatorManager().filters.get("hotel_view"); +// +// filter(resultLists, filter, query); +// +// this.client.sendResponse(new NewNavigatorSearchResultsComposer(view, query, resultLists)); +// } + } + + private void filter(List resultLists, NavigatorFilter filter, String part) + { + List toRemove = new ArrayList(); + Map> filteredRooms = new HashMap>(); + + for (NavigatorFilterField field : Emulator.getGameEnvironment().getNavigatorManager().filterSettings.values()) + { + for (SearchResultList result : resultLists) + { + if (result.filter) + { + List rooms = new ArrayList(); + rooms.addAll(result.rooms.subList(0, result.rooms.size())); + filter.filterRooms(field.field, part, rooms); + + if (!filteredRooms.containsKey(result.order)) + { + filteredRooms.put(result.order, new HashMap()); + } + + for (Room room : rooms) + { + filteredRooms.get(result.order).put(room.getId(), room); + } + } + } + } + + for (Map.Entry> set : filteredRooms.entrySet()) + { + for (SearchResultList resultList : resultLists) + { + if (resultList.filter) + { + resultList.rooms.clear(); + resultList.rooms.addAll(set.getValue().values()); + + if (resultList.rooms.isEmpty()) + { + toRemove.add(resultList); + } + } + } + } + + resultLists.removeAll(toRemove); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPopularRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPopularRoomsEvent.java new file mode 100644 index 00000000..f3745766 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPopularRoomsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class RequestPopularRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getActiveRooms(-1))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPromotedRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPromotedRoomsEvent.java new file mode 100644 index 00000000..8d4ee3ee --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPromotedRoomsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class RequestPromotedRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsPromoted())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPublicRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPublicRoomsEvent.java new file mode 100644 index 00000000..2961d89c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestPublicRoomsEvent.java @@ -0,0 +1,10 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RequestPublicRoomsEvent extends MessageHandler { + + @Override + public void handle() throws Exception { + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestRoomCategoriesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestRoomCategoriesEvent.java new file mode 100644 index 00000000..d6776cd4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestRoomCategoriesEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.CanCreateEventComposer; +import com.eu.habbo.messages.outgoing.navigator.NewNavigatorCategoryUserCountComposer; +import com.eu.habbo.messages.outgoing.navigator.NewNavigatorEventCategoriesComposer; +import com.eu.habbo.messages.outgoing.navigator.RoomCategoriesComposer; + +import java.util.List; + +public class RequestRoomCategoriesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + List roomCategoryList = Emulator.getGameEnvironment().getRoomManager().roomCategoriesForHabbo(this.client.getHabbo()); + this.client.sendResponse(new RoomCategoriesComposer(roomCategoryList)); + //this.client.sendResponse(new NewNavigatorEventCategoriesComposer()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestTagsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestTagsEvent.java new file mode 100644 index 00000000..29d3fdaa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestTagsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.TagsComposer; + +public class RequestTagsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new TagsComposer(Emulator.getGameEnvironment().getRoomManager().getTags())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SaveWindowSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SaveWindowSettingsEvent.java new file mode 100644 index 00000000..8cff4916 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SaveWindowSettingsEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.habbohotel.users.HabboNavigatorWindowSettings; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class SaveWindowSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + HabboNavigatorWindowSettings windowSettings = this.client.getHabbo().getHabboStats().navigatorWindowSettings; + + windowSettings.x = this.packet.readInt(); + windowSettings.y = this.packet.readInt(); + + windowSettings.width = this.packet.readInt(); + windowSettings.height = this.packet.readInt(); + + windowSettings.openSearches = this.packet.readBoolean(); + int unknown = this.packet.readInt(); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsByTagEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsByTagEvent.java new file mode 100644 index 00000000..6812a143 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsByTagEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsByTagEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String tag = this.packet.readString(); + + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsWithTag(tag))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsEvent.java new file mode 100644 index 00000000..6bf74938 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsEvent.java @@ -0,0 +1,83 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.permissions.Rank; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; +import com.eu.habbo.plugin.events.navigator.NavigatorSearchResultEvent; +import com.mysql.fabric.Server; +import gnu.trove.map.hash.THashMap; + +import java.util.ArrayList; + +public class SearchRoomsEvent extends MessageHandler +{ + public final static THashMap> cachedResults = new THashMap<>(4); + + @Override + public void handle() throws Exception + { + String name = this.packet.readString(); + + String prefix = ""; + String query = name; + ArrayList rooms; + + ServerMessage message = null; + if (cachedResults.containsKey(this.client.getHabbo().getHabboInfo().getRank())) + { + message = cachedResults.get(this.client.getHabbo().getHabboInfo().getRank()).get((name + "\t" + query).toLowerCase()); + } + else + { + cachedResults.put(this.client.getHabbo().getHabboInfo().getRank(), new THashMap<>()); + } + + if (message == null) + { + if (name.startsWith("owner:")) + { + query = name.split("owner:")[1]; + prefix = "owner:"; + rooms = (ArrayList) Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(name); + } + else if (name.startsWith("tag:")) + { + query = name.split("tag:")[1]; + prefix = "tag:"; + rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithTag(name); + } + else if (name.startsWith("group:")) + { + query = name.split("group:")[1]; + prefix = "group:"; + rooms = Emulator.getGameEnvironment().getRoomManager().getGroupRoomsWithName(name); + } + else + { + rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithName(name); + } + + message = new PrivateRoomsComposer(rooms).compose(); + THashMap map = cachedResults.get(this.client.getHabbo().getHabboInfo().getRank()); + + if (map == null) + { + map = new THashMap(1); + } + + map.put((name + "\t" + query).toLowerCase(), message); + cachedResults.put(this.client.getHabbo().getHabboInfo().getRank(), map); + + NavigatorSearchResultEvent event = new NavigatorSearchResultEvent(this.client.getHabbo(), prefix, query, rooms); + if(Emulator.getPluginManager().fireEvent(event).isCancelled()) + { + return; + } + } + + this.client.sendResponse(message); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsNowEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsNowEvent.java new file mode 100644 index 00000000..85be3ab5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsNowEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsFriendsNowEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsFriendsNow(this.client.getHabbo()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsOwnEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsOwnEvent.java new file mode 100644 index 00000000..d18dc9e8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsFriendsOwnEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsFriendsOwnEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsFriendsOwn(this.client.getHabbo()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsInGroupEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsInGroupEvent.java new file mode 100644 index 00000000..cedb70fc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsInGroupEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsInGroupEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsInGroup(this.client.getHabbo()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsMyFavouriteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsMyFavouriteEvent.java new file mode 100644 index 00000000..1b9c742b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsMyFavouriteEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsMyFavouriteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsFavourite(this.client.getHabbo()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsVisitedEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsVisitedEvent.java new file mode 100644 index 00000000..18c775fb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsVisitedEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsVisitedEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsVisited(this.client.getHabbo(), false, 25))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsWithRightsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsWithRightsEvent.java new file mode 100644 index 00000000..2dec1cb1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsWithRightsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.navigator; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer; + +public class SearchRoomsWithRightsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsWithRights(this.client.getHabbo()))); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/polls/AnswerPollEvent.java b/src/main/java/com/eu/habbo/messages/incoming/polls/AnswerPollEvent.java new file mode 100644 index 00000000..c99a6360 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/polls/AnswerPollEvent.java @@ -0,0 +1,74 @@ +package com.eu.habbo.messages.incoming.polls; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.polls.Poll; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.WiredRewardAlertComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class AnswerPollEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int pollId = this.packet.readInt(); + int questionId = this.packet.readInt(); + int count = this.packet.readInt(); + + String answer = ""; + for(int i = 0; i < count; i++) + { + answer += ":" + this.packet.readString(); + } + + if (pollId == 0 && questionId <= 0) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().handleWordQuiz(this.client.getHabbo(), answer); + return; + } + + answer = answer.substring(1); + + Poll poll = Emulator.getGameEnvironment().getPollManager().getPoll(pollId); + + if(poll != null) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO polls_answers(poll_id, user_id, question_id, answer) VALUES(?, ?, ?, ?) ON DUPLICATE KEY UPDATE answer=VALUES(answer)")) + { + statement.setInt(1, pollId); + statement.setInt(2, this.client.getHabbo().getHabboInfo().getId()); + statement.setInt(3, questionId); + statement.setString(4, answer); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if(poll.lastQuestionId == questionId) + { + if(poll.getBadgeReward().length() > 0) + { + if(this.client.getHabbo().getInventory().getBadgesComponent().getBadge(poll.getBadgeReward()) == null) + { + HabboBadge badge = new HabboBadge(0, poll.getBadgeReward(), 0, this.client.getHabbo()); + Emulator.getThreading().run(badge); + this.client.getHabbo().getInventory().getBadgesComponent().addBadge(badge); + this.client.sendResponse(new AddUserBadgeComposer(badge)); + this.client.sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_RECEIVED_BADGE)); + } + else + { + this.client.sendResponse(new WiredRewardAlertComposer(WiredRewardAlertComposer.REWARD_ALREADY_RECEIVED)); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/polls/CancelPollEvent.java b/src/main/java/com/eu/habbo/messages/incoming/polls/CancelPollEvent.java new file mode 100644 index 00000000..175e0160 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/polls/CancelPollEvent.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.incoming.polls; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.polls.Poll; +import com.eu.habbo.habbohotel.polls.PollManager; +import com.eu.habbo.messages.incoming.MessageHandler; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class CancelPollEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int pollId = this.packet.readInt(); + + + Poll poll = Emulator.getGameEnvironment().getPollManager().getPoll(pollId); + + if(poll != null) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO polls_answers (poll_id, user_id, question_id, answer) VALUES (?, ?, ?, ?)")) + { + statement.setInt(1, pollId); + statement.setInt(2, this.client.getHabbo().getHabboInfo().getId()); + statement.setInt(3, 0); + statement.setString(4, ""); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/polls/GetPollDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/polls/GetPollDataEvent.java new file mode 100644 index 00000000..7725c655 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/polls/GetPollDataEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.polls; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.polls.Poll; +import com.eu.habbo.habbohotel.polls.PollManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.polls.PollQuestionsComposer; + +public class GetPollDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int pollId = this.packet.readInt(); + + Poll poll = Emulator.getGameEnvironment().getPollManager().getPoll(pollId); + + if(poll != null) + { + this.client.sendResponse(new PollQuestionsComposer(poll)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/HandleDoorbellEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/HandleDoorbellEvent.java new file mode 100644 index 00000000..6fdb6f3c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/HandleDoorbellEvent.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.hotelview.HotelViewComposer; +import com.eu.habbo.messages.outgoing.rooms.HideDoorbellComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomAccessDeniedComposer; + +public class HandleDoorbellEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null && this.client.getHabbo().getHabboInfo().getCurrentRoom().hasRights(this.client.getHabbo())) + { + String username = this.packet.readString(); + boolean accepted = this.packet.readBoolean(); + + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(username); + + if(habbo != null && habbo.getHabboInfo().getRoomQueueId() == this.client.getHabbo().getHabboInfo().getCurrentRoom().getId()) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().removeFromQueue(habbo); + + if (accepted) + { + habbo.getClient().sendResponse(new HideDoorbellComposer("")); + Emulator.getGameEnvironment().getRoomManager().enterRoom(habbo, this.client.getHabbo().getHabboInfo().getCurrentRoom().getId(), "", true); + } + else + { + habbo.getClient().sendResponse(new RoomAccessDeniedComposer("")); + habbo.getClient().sendResponse(new HotelViewComposer()); + } + habbo.getHabboInfo().setRoomQueueId(0); + } + + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestHeightmapEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestHeightmapEvent.java new file mode 100644 index 00000000..ac7e1600 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestHeightmapEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RequestHeightmapEvent extends MessageHandler { + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getLoadingRoom() > 0) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.client.getHabbo().getHabboInfo().getLoadingRoom()); + + if(room != null) + { + Emulator.getGameEnvironment().getRoomManager().enterRoom(this.client.getHabbo(), room); + + return; + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomDataEvent.java new file mode 100644 index 00000000..b316bd05 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomDataEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomDataComposer; + +public class RequestRoomDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(this.packet.readInt()); + + int something = packet.readInt(); + int something2 = packet.readInt(); + if(room != null) + { + boolean unknown = true; + + if(something == 0 && something2 == 1) + { + unknown = false; + } + + //this.client.getHabbo().getHabboInfo().getCurrentRoom() != room + this.client.sendResponse(new RoomDataComposer(room, this.client.getHabbo(), true, unknown)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomHeightmapEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomHeightmapEvent.java new file mode 100644 index 00000000..e32d5c61 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomHeightmapEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomHeightMapComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomRelativeMapComposer; + +public class RequestRoomHeightmapEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getLoadingRoom() > 0) + { + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(this.client.getHabbo().getHabboInfo().getLoadingRoom()); + + if (room != null) + { + this.client.sendResponse(new RoomRelativeMapComposer(room)); + + this.client.sendResponse(new RoomHeightMapComposer(room)); + + Emulator.getGameEnvironment().getRoomManager().enterRoom(this.client.getHabbo(), room); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomLoadEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomLoadEvent.java new file mode 100644 index 00000000..0474b56f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomLoadEvent.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; + +public class RequestRoomLoadEvent extends MessageHandler +{ + + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + String password = this.packet.readString(); + + if(this.client.getHabbo().getHabboInfo().getLoadingRoom() == 0 && this.client.getHabbo().getHabboStats().roomEnterTimestamp + 1000 < System.currentTimeMillis()) + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) + { + Emulator.getGameEnvironment().getRoomManager().logExit(this.client.getHabbo()); + + if (this.client.getHabbo().getRoomUnit() != null) + { + room.sendComposer(new RoomUserRemoveComposer(this.client.getHabbo().getRoomUnit()).compose()); + } + room.removeHabbo(this.client.getHabbo()); + this.client.getHabbo().getHabboInfo().setCurrentRoom(null); + } + Emulator.getGameEnvironment().getRoomManager().enterRoom(this.client.getHabbo(), roomId, password); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomRightsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomRightsEvent.java new file mode 100644 index 00000000..86ae3306 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomRightsEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsListComposer; + +public class RequestRoomRightsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + this.client.sendResponse(new RoomRightsListComposer(room)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomSettingsEvent.java new file mode 100644 index 00000000..b3385ab4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomSettingsEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomSettingsComposer; + +public class RequestRoomSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + this.client.sendResponse(new RoomSettingsComposer(room)); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModChatFloodFilterSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModChatHearRangeSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModChatScrollSpeedSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModDoorModeSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModWalkthroughSeen")); + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomWordFilterEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomWordFilterEvent.java new file mode 100644 index 00000000..69a2ebad --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RequestRoomWordFilterEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomFilterWordsComposer; + +public class RequestRoomWordFilterEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.packet.readInt()); + + if(room != null && room.hasRights(this.client.getHabbo())) + { + this.client.sendResponse(new RoomFilterWordsComposer(room)); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModRoomFilterSeen")); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomBackgroundEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomBackgroundEvent.java new file mode 100644 index 00000000..5ff1a071 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomBackgroundEvent.java @@ -0,0 +1,47 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.plugin.events.furniture.FurnitureRoomTonerEvent; + +public class RoomBackgroundEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null) + return; + + if(room.hasRights(this.client.getHabbo()) || this.client.getHabbo().hasPermission("acc_placefurni")) + { + HabboItem item = room.getHabboItem(itemId); + + if(item == null) + return; + + int hue = this.packet.readInt(); + int saturation = this.packet.readInt(); + int brightness = this.packet.readInt(); + + FurnitureRoomTonerEvent event = (FurnitureRoomTonerEvent)Emulator.getPluginManager().fireEvent(new FurnitureRoomTonerEvent(item, this.client.getHabbo(), hue, saturation, brightness)); + + if(event.isCancelled()) + return; + + hue = event.hue % 256; + saturation = event.saturation % 256; + brightness = event.brightness % 256; + + item.setExtradata(item.getExtradata().split(":")[0] + ":" + hue + ":" + saturation + ":" + brightness); + item.needsUpdate(true); + Emulator.getThreading().run(item); + room.updateItem(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomFavoriteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomFavoriteEvent.java new file mode 100644 index 00000000..9b872f0c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomFavoriteEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.FavoriteRoomChangedComposer; + +public class RoomFavoriteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + boolean added = true; + if (room != null) + { + if (this.client.getHabbo().getHabboStats().hasFavoriteRoom(roomId)) + { + this.client.getHabbo().getHabboStats().removeFavoriteRoom(roomId); + added = false; + } + else + { + if (!this.client.getHabbo().getHabboStats().addFavoriteRoom(roomId)) + { + return; + } + } + + this.client.sendResponse(new FavoriteRoomChangedComposer(roomId, added)); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomMuteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomMuteEvent.java new file mode 100644 index 00000000..d93fe57a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomMuteEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomMutedComposer; + +public class RoomMuteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if(room.isOwner(this.client.getHabbo())) + { + room.setMuted(!room.isMuted()); + this.client.sendResponse(new RoomMutedComposer(room)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomPlacePaintEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomPlacePaintEvent.java new file mode 100644 index 00000000..2130a5ec --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomPlacePaintEvent.java @@ -0,0 +1,61 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomPaintComposer; + +public class RoomPlacePaintEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || room.hasRights(this.client.getHabbo()) || this.client.getHabbo().hasPermission("acc_placefurni")) + { + int itemId = this.packet.readInt(); + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(itemId); + + if(item == null) + { + this.client.sendResponse(new RemoveHabboItemComposer(itemId)); + return; + } + + if(item.getBaseItem().getName().equals("floor")) + { + room.setFloorPaint(item.getExtradata()); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoFloor")); + } + else if(item.getBaseItem().getName().equals("wallpaper")) + { + room.setWallPaint(item.getExtradata()); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoWallpaper")); + } + else if(item.getBaseItem().getName().equals("landscape")) + { + room.setBackgroundPaint(item.getExtradata()); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoLandscape")); + } + else + return; + + this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); + room.setNeedsUpdate(true); + room.sendComposer(new RoomPaintComposer(item.getBaseItem().getName(), item.getExtradata()).compose()); + item.needsDelete(true); + Emulator.getThreading().run(item); + this.client.sendResponse(new RemoveHabboItemComposer(itemId)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveAllRightsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveAllRightsEvent.java new file mode 100644 index 00000000..1cc8f2bf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveAllRightsEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomRightsComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveRightsComposer; +import gnu.trove.procedure.TIntProcedure; + +public class RoomRemoveAllRightsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + final Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null || room.getId() != this.packet.readInt()) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + room.getRights().forEach(new TIntProcedure() + { + @Override + public boolean execute(int value) + { + Habbo habbo = room.getHabbo(value); + + if(habbo != null) + { + room.sendComposer(new RoomUserRemoveRightsComposer(room, value).compose()); + habbo.getRoomUnit().getStatus().remove("flatctrl"); + habbo.getClient().sendResponse(new RoomRightsComposer(RoomRightLevels.NONE)); + } + + return true; + } + }); + + room.removeAllRights(); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveRightsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveRightsEvent.java new file mode 100644 index 00000000..cacb289e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRemoveRightsEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomRemoveRightsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + Emulator.getGameEnvironment().getRoomManager().getRoom(roomId).removeRights(this.client.getHabbo().getHabboInfo().getId()); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRequestBannedUsersEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRequestBannedUsersEvent.java new file mode 100644 index 00000000..1fc7115f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomRequestBannedUsersEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomBannedUsersComposer; + +public class RoomRequestBannedUsersEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + this.client.sendResponse(new RoomBannedUsersComposer(room)); + } + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModChatFloodFilterSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModChatHearRangeSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModChatScrollSpeedSeen")); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModDoorModeSeen")); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomSettingsSaveEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomSettingsSaveEvent.java new file mode 100644 index 00000000..ac616c77 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomSettingsSaveEvent.java @@ -0,0 +1,145 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.habbohotel.rooms.RoomState; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.*; + +public class RoomSettingsSaveEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + if(room.isOwner(this.client.getHabbo())) + { + String name = this.packet.readString(); + + if (name.isEmpty()) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.ROOM_NAME_MISSING, "")); + return; + } + + if (!Emulator.getGameEnvironment().getWordFilter().filter(name, this.client.getHabbo()).equals(name)) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.ROOM_NAME_BADWORDS, "")); + return; + } + + String description = this.packet.readString(); + if (!Emulator.getGameEnvironment().getWordFilter().filter(description, this.client.getHabbo()).equals(description)) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.ROOM_DESCRIPTION_BADWORDS, "")); + return; + } + + RoomState state = RoomState.values()[this.packet.readInt() % RoomState.values().length]; + + String password = this.packet.readString(); + if (state == RoomState.PASSWORD && password.isEmpty()) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.PASSWORD_REQUIRED, "")); + return; + } + + int usersMax = this.packet.readInt(); + int categoryId = this.packet.readInt(); + String tags = ""; + int count = Math.min(this.packet.readInt(), 2); + for(int i = 0; i < count; i++) + { + String tag = this.packet.readString(); + + if (tag.length() > 15) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.TAGS_TOO_LONG, "")); + return; + } + tags += tag + ";"; + } + + if (!Emulator.getGameEnvironment().getWordFilter().filter(tags, this.client.getHabbo()).equals(tags)) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.ROOM_TAGS_BADWWORDS, "")); + return; + } + + + if (!tags.isEmpty()) + { + for (String s : Emulator.getConfig().getValue("hotel.room.tags.staff").split(";")) + { + if (tags.contains(s)) + { + this.client.sendResponse(new RoomEditSettingsErrorComposer(room.getId(), RoomEditSettingsErrorComposer.RESTRICTED_TAGS, "1")); + return; + } + } + } + + room.setName(name); + room.setDescription(description); + room.setState(state); + room.setPassword(password); + room.setUsersMax(usersMax); + + + if(Emulator.getGameEnvironment().getRoomManager().hasCategory(categoryId, this.client.getHabbo())) + room.setCategory(categoryId); + else + { + RoomCategory category = Emulator.getGameEnvironment().getRoomManager().getCategory(categoryId); + + String message = ""; + + if(category == null) + { + message = Emulator.getTexts().getValue("scripter.warning.roomsettings.category.nonexisting").replace("%username%", client.getHabbo().getHabboInfo().getUsername()); + } + else + { + message = Emulator.getTexts().getValue("scripter.warning.roomsettings.category.permission").replace("%username%", client.getHabbo().getHabboInfo().getUsername()).replace("%category%", Emulator.getGameEnvironment().getRoomManager().getCategory(categoryId) + ""); + } + + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + } + + + room.setTags(tags); + room.setTradeMode(this.packet.readInt()); + room.setAllowPets(this.packet.readBoolean()); + room.setAllowPetsEat(this.packet.readBoolean()); + room.setAllowWalkthrough(this.packet.readBoolean()); + room.setHideWall(this.packet.readBoolean()); + room.setWallSize(this.packet.readInt()); + room.setFloorSize(this.packet.readInt()); + room.setMuteOption(this.packet.readInt()); + room.setKickOption(this.packet.readInt()); + room.setBanOption(this.packet.readInt()); + room.setChatMode(this.packet.readInt()); + room.setChatWeight(this.packet.readInt()); + room.setChatSpeed(this.packet.readInt()); + room.setChatDistance(Math.abs(this.packet.readInt())); + room.setChatProtection(this.packet.readInt()); + room.setNeedsUpdate(true); + + room.sendComposer(new RoomThicknessComposer(room).compose()); + room.sendComposer(new RoomChatSettingsComposer(room).compose()); + room.sendComposer(new RoomSettingsUpdatedComposer(room).compose()); + this.client.sendResponse(new RoomSettingsSavedComposer(room)); + //TODO Find packet for update room name. + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomStaffPickEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomStaffPickEvent.java new file mode 100644 index 00000000..a67feb11 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomStaffPickEvent.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomDataComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomPaneComposer; + +public class RoomStaffPickEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().hasPermission("acc_staff_pick")) + { + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + room.setStaffPromotedRoom(!room.isStaffPromotedRoom()); + room.setNeedsUpdate(true); + + if(room.isStaffPromotedRoom()) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(room.getOwnerId()); + + if(habbo != null) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("Spr")); + } + } + + this.client.sendResponse(new RoomDataComposer(room, this.client.getHabbo(), false, false)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomVoteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomVoteEvent.java new file mode 100644 index 00000000..a5fc3e8a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomVoteEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomVoteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Emulator.getGameEnvironment().getRoomManager().voteForRoom(this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getCurrentRoom()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomWordFilterModifyEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomWordFilterModifyEvent.java new file mode 100644 index 00000000..309263bf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/RoomWordFilterModifyEvent.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomWordFilterModifyEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + boolean add = this.packet.readBoolean(); + String word = this.packet.readString(); + + if (word.length() > 25) + { + word = word.substring(0, 24); + } + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + if (add) + { + room.addToWordFilter(word); + } + else + { + room.removeFromWordFilter(word); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/SetHomeRoomEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/SetHomeRoomEvent.java new file mode 100644 index 00000000..a7f3566c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/SetHomeRoomEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.incoming.rooms; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserHomeRoomComposer; + +public class SetHomeRoomEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomId = this.packet.readInt(); + + if(roomId != this.client.getHabbo().getHabboInfo().getHomeRoom()) + { + this.client.getHabbo().getHabboInfo().setHomeRoom(roomId); + this.client.sendResponse(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), this.client.getHabbo().getHabboInfo().getHomeRoom())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPickupEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPickupEvent.java new file mode 100644 index 00000000..eed36bcc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPickupEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.rooms.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.AddBotComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; + +public class BotPickupEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + Emulator.getGameEnvironment().getBotManager().pickUpBot(this.packet.readInt(), this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPlaceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPlaceEvent.java new file mode 100644 index 00000000..fe72d83d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotPlaceEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.rooms.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class BotPlaceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + Bot bot = this.client.getHabbo().getInventory().getBotsComponent().getBot(this.packet.readInt()); + + if(bot == null) + return; + + int x = this.packet.readInt(); + int y = this.packet.readInt(); + + Emulator.getGameEnvironment().getBotManager().placeBot(bot, this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getCurrentRoom(), room.getLayout().getTile((short) x, (short) y)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSaveSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSaveSettingsEvent.java new file mode 100644 index 00000000..a8f9c2e4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSaveSettingsEvent.java @@ -0,0 +1,129 @@ +package com.eu.habbo.messages.incoming.rooms.bots; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.bots.BotManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.DanceType; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUnitUpdateUsernameComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDanceComposer; +import com.eu.habbo.plugin.events.bots.BotSavedChatEvent; +import com.eu.habbo.plugin.events.bots.BotSavedLookEvent; +import com.eu.habbo.plugin.events.bots.BotSavedNameEvent; +import org.jsoup.Jsoup; + +import java.util.ArrayList; + +public class BotSaveSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + int botId = this.packet.readInt(); + + Bot bot = room.getBot(Math.abs(botId)); + + if(bot == null) + return; + + int settingId = this.packet.readInt(); + + switch(settingId) + { + case 1: + BotSavedLookEvent lookEvent = new BotSavedLookEvent(bot, + this.client.getHabbo().getHabboInfo().getGender(), + this.client.getHabbo().getHabboInfo().getLook(), + this.client.getHabbo().getRoomUnit().getEffectId()); + Emulator.getPluginManager().fireEvent(lookEvent); + + if(lookEvent.isCancelled()) + break; + + bot.setFigure(lookEvent.newLook); + bot.setGender(lookEvent.gender); + bot.setEffect(lookEvent.effect); + bot.needsUpdate(true); + break; + + case 2: + String messageString = this.packet.readString(); + + if(messageString.length() > 5112) + break; + + String[] data = messageString.split(";#;"); + + ArrayList chat = new ArrayList(); + for(int i = 0; i < data.length - 3; i++) + { + for(String s : data[i].split("\r")) + { + chat.add(Emulator.getGameEnvironment().getWordFilter().filter(Jsoup.parse(s).text(), this.client.getHabbo())); + } + } + + int chatSpeed = Integer.valueOf(data[data.length -2]); + if (chatSpeed < BotManager.MINIMUM_CHAT_SPEED) + { + chatSpeed = BotManager.MINIMUM_CHAT_SPEED; + } + + BotSavedChatEvent chatEvent = new BotSavedChatEvent(bot, Boolean.valueOf(data[data.length - 3]), Boolean.valueOf(data[data.length - 1]), chatSpeed, chat); + Emulator.getPluginManager().fireEvent(chatEvent); + + if(chatEvent.isCancelled()) + break; + + bot.setChatAuto(chatEvent.autoChat); + bot.setChatRandom(chatEvent.randomChat); + bot.setChatDelay((short) chatEvent.chatDelay); + bot.clearChat(); + bot.addChatLines(chat); + bot.needsUpdate(true); + break; + + case 3: + bot.getRoomUnit().setCanWalk(!bot.getRoomUnit().canWalk()); + bot.needsUpdate(true); + break; + + case 4: + bot.getRoomUnit().setDanceType(DanceType.values()[(bot.getRoomUnit().getDanceType().getType() + 1) %DanceType.values().length]); + room.sendComposer(new RoomUserDanceComposer(bot.getRoomUnit()).compose()); + bot.needsUpdate(true); + break; + + case 5: + BotSavedNameEvent nameEvent = new BotSavedNameEvent(bot, Jsoup.parse(this.packet.readString()).text()); + + if(nameEvent.name.length() <= 25) + { + Emulator.getPluginManager().fireEvent(nameEvent); + + if (nameEvent.isCancelled()) + break; + + bot.setName(nameEvent.name); + bot.needsUpdate(true); + room.sendComposer(new RoomUnitUpdateUsernameComposer(bot.getRoomUnit(), nameEvent.name).compose()); + } + break; + } + + if(bot.needsUpdate()) + { + Emulator.getThreading().run(bot); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSettingsEvent.java new file mode 100644 index 00000000..d44e7ec6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/BotSettingsEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.rooms.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.BotSettingsComposer; + +public class BotSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room == null) + return; + + if (room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + int botId = this.packet.readInt(); + + Bot bot = room.getBot(Math.abs(botId)); + + if (bot == null) + return; + + this.client.sendResponse(new BotSettingsComposer(bot, this.packet.readInt())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/AdvertisingSaveEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/AdvertisingSaveEvent.java new file mode 100644 index 00000000..31fd99ce --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/AdvertisingSaveEvent.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionCustomValues; +import com.eu.habbo.habbohotel.items.interactions.InteractionRoomAds; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class AdvertisingSaveEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null) + return; + + if(!room.hasRights(this.client.getHabbo())) + return; + + HabboItem item = room.getHabboItem(this.packet.readInt()); + if(item == null) + return; + + if(item instanceof InteractionCustomValues) + { + int count = this.packet.readInt(); + for(int i = 0; i < count / 2; i++) + { + String key = this.packet.readString(); + String value = this.packet.readString(); + + if (!Emulator.getConfig().getBoolean("camera.use.https")) + { + value = value.replace("https://", "http://"); + } + + ((InteractionCustomValues) item).values.put(key, value); + } + + item.setExtradata(((InteractionCustomValues) item).toExtraData()); + item.needsUpdate(true); + Emulator.getThreading().run(item); + room.updateItem(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CloseDiceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CloseDiceEvent.java new file mode 100644 index 00000000..33e1ec1b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CloseDiceEvent.java @@ -0,0 +1,45 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionDice; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class CloseDiceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(item != null) + { + if (item instanceof InteractionDice) + { + if (RoomLayout.tilesAdjecent(room.getLayout().getTile(item.getX(), item.getY()), this.client.getHabbo().getRoomUnit().getCurrentLocation())) + { + if (!item.getExtradata().equals("-1")) + { + item.setExtradata("0"); + item.needsUpdate(true); + Emulator.getThreading().run(item); + room.updateItem(item); + } + } + } + else + { + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", Emulator.getTexts().getValue("scripter.warning.packet.closedice").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%id%", item.getId() + "").replace("%itemname%", item.getBaseItem().getName())); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/FootballGateSaveLookEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/FootballGateSaveLookEvent.java new file mode 100644 index 00000000..323ff6cf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/FootballGateSaveLookEvent.java @@ -0,0 +1,40 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.games.football.InteractionFootballGate; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class FootballGateSaveLookEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null || this.client.getHabbo().getHabboInfo().getId() != room.getOwnerId()) + return; + + HabboItem item = room.getHabboItem(this.packet.readInt()); + if(item == null || !(item instanceof InteractionFootballGate)) + return; + + String gender = this.packet.readString(); + String look = this.packet.readString(); + + switch(gender.toLowerCase()) + { + default: + case "m": + ((InteractionFootballGate)item).setFigureM(look); + room.updateItem(item); + break; + + case "f": + ((InteractionFootballGate)item).setFigureF(look); + room.updateItem(item); + break; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveLookEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveLookEvent.java new file mode 100644 index 00000000..d201eff6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveLookEvent.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class MannequinSaveLookEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null || this.client.getHabbo().getHabboInfo().getId() != room.getOwnerId()) + return; + + HabboItem item = room.getHabboItem(this.packet.readInt()); + if(item == null) + return; + + String[] data = item.getExtradata().split(":"); + //TODO: Only clothing not whole body part. + + String look = ""; + + for (String s : this.client.getHabbo().getHabboInfo().getLook().split("\\.")) + { + if (!s.contains("hr") && !s.contains("hd") && !s.contains("he") && !s.contains("ea") && !s.contains("ha") && !s.contains("fa")) + { + look += s + "."; + } + } + + if (!look.isEmpty()) + { + look = look.substring(0, look.length() - 1); + } + + if(data.length == 3) + { + item.setExtradata(this.client.getHabbo().getHabboInfo().getGender().name().toLowerCase() + ":" + look + ":" + data[2]); + } + else + { + item.setExtradata(this.client.getHabbo().getHabboInfo().getGender().name().toLowerCase() + ":" + look + ":" + this.client.getHabbo().getHabboInfo().getUsername() + "'s look."); + } + + item.needsUpdate(true); + Emulator.getThreading().run(item); + room.updateItem(item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveNameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveNameEvent.java new file mode 100644 index 00000000..536d8a48 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MannequinSaveNameEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class MannequinSaveNameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null || this.client.getHabbo().getHabboInfo().getId() != room.getOwnerId()) + return; + + HabboItem item = room.getHabboItem(this.packet.readInt()); + if(item == null) + return; + + String[] data = item.getExtradata().split(":"); + String name = this.packet.readString(); + if(data.length == 3) + { + item.setExtradata(this.client.getHabbo().getHabboInfo().getGender().name().toUpperCase() + ":" + data[1] + ":" + name); + } + else + { + item.setExtradata(this.client.getHabbo().getHabboInfo().getGender().name().toUpperCase() + ":" + this.client.getHabbo().getHabboInfo().getLook() + ":" + name); + } + item.needsUpdate(true); + Emulator.getThreading().run(item); + room.updateItem(item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java new file mode 100644 index 00000000..c6f56484 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionMoodLight; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomMoodlightData; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.MoodLightDataComposer; + +public class MoodLightSaveSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if((room.getGuildId() > 0 && room.guildRightLevel(this.client.getHabbo()) < 2) && !room.hasRights(this.client.getHabbo())) + return; + + int id = this.packet.readInt(); + int backgroundOnly = this.packet.readInt(); + String color = this.packet.readString(); + int intensity = this.packet.readInt(); + + for(RoomMoodlightData data : room.getMoodlightData().valueCollection()) + { + if(data.getId() == id) + { + data.setBackgroundOnly(backgroundOnly == 2); + data.setColor(color); + data.setIntensity(intensity); + data.enable(); + + for(HabboItem item : room.getRoomSpecialTypes().getItemsOfType(InteractionMoodLight.class)) + { + item.setExtradata(data.toString()); + item.needsUpdate(true); + room.updateItem(item); + Emulator.getThreading().run(item); + } + } + else + { + data.disable(); + } + } + + room.setNeedsUpdate(true); + this.client.sendResponse(new MoodLightDataComposer(room.getMoodlightData())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSettingsEvent.java new file mode 100644 index 00000000..62815c84 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSettingsEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.MoodLightDataComposer; + +public class MoodLightSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + this.client.sendResponse(new MoodLightDataComposer(this.client.getHabbo().getHabboInfo().getCurrentRoom().getMoodlightData())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightTurnOnEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightTurnOnEvent.java new file mode 100644 index 00000000..746caafb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightTurnOnEvent.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionMoodLight; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomMoodlightData; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class MoodLightTurnOnEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if((room.getGuildId() > 0 && room.guildRightLevel(this.client.getHabbo()) < 2) && !room.hasRights(this.client.getHabbo())) + return; + + for(HabboItem moodLight : room.getRoomSpecialTypes().getItemsOfType(InteractionMoodLight.class)) + { + //Enabled, preset id, background only ? 2 : 1, color, intensity + + + moodLight.setExtradata("2,1,2,#FF00FF,255"); + for(RoomMoodlightData data : room.getMoodlightData().valueCollection()) + { + if(data.isEnabled()) + { + moodLight.setExtradata(data.toString()); + break; + } + } + moodLight.needsUpdate(true); + room.updateItem(moodLight); + Emulator.getThreading().run(moodLight); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoveWallItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoveWallItemEvent.java new file mode 100644 index 00000000..d305ec27 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoveWallItemEvent.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class MoveWallItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(!room.hasRights(this.client.getHabbo()) && !this.client.getHabbo().hasPermission("acc_placefurni") && !(room.getGuildId() > 0 && room.guildRightLevel(this.client.getHabbo()) >= 2)) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + return; + } + + int itemId = this.packet.readInt(); + String wallPosition = this.packet.readString(); + + if(itemId <= 0 || wallPosition.length() <= 13) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(item == null) + return; + + item.setWallPosition(wallPosition); + item.needsUpdate(true); + room.updateItem(item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItDeleteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItDeleteEvent.java new file mode 100644 index 00000000..530bad92 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItDeleteEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveWallItemComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; + +public class PostItDeleteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(item == null || item.getUserId() != this.client.getHabbo().getHabboInfo().getId()) + return; + + item.setRoomId(0); + room.removeHabboItem(item); + room.sendComposer(new RemoveWallItemComposer(item).compose()); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java new file mode 100644 index 00000000..9af3bc90 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionPostIt; +import com.eu.habbo.habbohotel.items.interactions.InteractionStickyPole; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.messages.outgoing.rooms.items.AddWallItemComposer; + +public class PostItPlaceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + String location = this.packet.readString(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if (room.hasRights(this.client.getHabbo()) || !room.getRoomSpecialTypes().getItemsOfType(InteractionStickyPole.class).isEmpty()) + { + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(itemId); + + if (item != null && item instanceof InteractionPostIt) + { + room.addHabboItem(item); + item.setExtradata("FFFF33"); + item.setRoomId(this.client.getHabbo().getHabboInfo().getCurrentRoom().getId()); + item.setWallPosition(location); + item.setUserId(this.client.getHabbo().getHabboInfo().getId()); + item.needsUpdate(true); + room.sendComposer(new AddWallItemComposer(item, this.client.getHabbo().getHabboInfo().getUsername()).compose()); + this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + Emulator.getThreading().run(item); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItRequestDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItRequestDataEvent.java new file mode 100644 index 00000000..e4396f89 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItRequestDataEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionPostIt; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.PostItDataComposer; + +public class PostItRequestDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + HabboItem item = room.getHabboItem(itemId); + + if(item instanceof InteractionPostIt) + { + this.client.sendResponse(new PostItDataComposer((InteractionPostIt) item, room.hasRights(this.client.getHabbo()))); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItSaveDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItSaveDataEvent.java new file mode 100644 index 00000000..9b2fe235 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItSaveDataEvent.java @@ -0,0 +1,61 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionPostIt; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class PostItSaveDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + String color = this.packet.readString(); + String text = this.packet.readString(); + + text = text.replace(((char) 9) + "", ""); + if(text.startsWith("#") || text.startsWith(" #")) + { + String colorCheck = text.split(" ")[0].replace(" ", "").replace(" #", "").replace("#", ""); + + if(colorCheck.length() == 6) + { + color = colorCheck; + text = text.replace("#" + colorCheck + " ", ""); + } + } + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(item == null || !(item instanceof InteractionPostIt)) + return; + + if(!color.equalsIgnoreCase("FFFF33") && !room.hasRights(this.client.getHabbo())&& item.getUserId() != this.client.getHabbo().getHabboInfo().getId()) + { + if(!text.startsWith(item.getExtradata().replace(item.getExtradata().split(" ")[0], ""))) + { + return; + } + } + else + { + if(!room.hasRights(this.client.getHabbo()) && item.getUserId() != this.client.getHabbo().getHabboInfo().getId()) + return; + } + + if(color.isEmpty()) + color = "FFFF33"; + + item.setExtradata(color + " " + text); + item.needsUpdate(true); + room.updateItem(item); + Emulator.getThreading().run(item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemClothingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemClothingEvent.java new file mode 100644 index 00000000..430cd3c1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemClothingEvent.java @@ -0,0 +1,72 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.ClothItem; +import com.eu.habbo.habbohotel.items.interactions.InteractionClothing; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.users.UserClothesComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class RedeemClothingEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null && + this.client.getHabbo().getHabboInfo().getCurrentRoom().hasRights(this.client.getHabbo())) + { + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item.getUserId() == this.client.getHabbo().getHabboInfo().getId()) + { + if(item instanceof InteractionClothing) + { + ClothItem clothing = Emulator.getGameEnvironment().getCatalogManager().getClothing(item.getBaseItem().getName()); + + if (clothing != null) + { + if (!this.client.getHabbo().getInventory().getWardrobeComponent().getClothing().contains(clothing.id)) + { + item.setRoomId(0); + this.client.getHabbo().getHabboInfo().getCurrentRoom().removeHabboItem(item); + this.client.getHabbo().getHabboInfo().getCurrentRoom().updateTile(this.client.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTile(item.getX(), item.getY())); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RemoveFloorItemComposer(item, true).compose()); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_clothing (user_id, clothing_id) VALUES (?, ?)")) + { + statement.setInt(1, this.client.getHabbo().getHabboInfo().getId()); + statement.setInt(2, clothing.id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.client.getHabbo().getInventory().getWardrobeComponent().getClothing().add(clothing.id); + this.client.sendResponse(new UserClothesComposer(this.client.getHabbo())); + } + else + { + this.client.sendResponse(new GenericAlertComposer("You already own this item!")); + } + } + else + { + Emulator.getLogging().logErrorLine("[Catalog] No definition in catalog_clothing found for clothing name " + item.getBaseItem().getName() + ". Could not redeem clothing!"); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemItemEvent.java new file mode 100644 index 00000000..c8162a5e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RedeemItemEvent.java @@ -0,0 +1,147 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.UpdateStackHeightComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.furniture.FurnitureRedeemedEvent; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; + +public class RedeemItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + HabboItem item = room.getHabboItem(itemId); + + if(item != null && this.client.getHabbo().getHabboInfo().getId() == item.getUserId()) + { + boolean furnitureRedeemEventRegistered = Emulator.getPluginManager().isRegistered(FurnitureRedeemedEvent.class, true); + + if(item.getBaseItem().getName().startsWith("CF_") || item.getBaseItem().getName().startsWith("CFC_") || item.getBaseItem().getName().startsWith("DF_") || item.getBaseItem().getName().startsWith("PF_")) + { + if ((item.getBaseItem().getName().startsWith("CF_") || item.getBaseItem().getName().startsWith("CFC_")) && !item.getBaseItem().getName().contains("_diamond_")) + { + int credits; + try + { + credits = Integer.valueOf(item.getBaseItem().getName().split("_")[1]); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse redeemable furniture: " + item.getBaseItem().getName() + ". Must be in format of CF_"); + return; + } + + if(furnitureRedeemEventRegistered) + { + Event furniRedeemEvent = new FurnitureRedeemedEvent(item, this.client.getHabbo(), credits, FurnitureRedeemedEvent.CREDITS); + Emulator.getPluginManager().fireEvent(furniRedeemEvent); + + if(furniRedeemEvent.isCancelled()) + return; + } + + this.client.getHabbo().getHabboInfo().addCredits(credits); + this.client.sendResponse(new UserCreditsComposer(this.client.getHabbo())); + + } else if (item.getBaseItem().getName().startsWith("PF_")) + { + int pixels; + + try + { + pixels = Integer.valueOf(item.getBaseItem().getName().split("_")[1]); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse redeemable pixel furniture: " + item.getBaseItem().getName() + ". Must be in format of PF_"); + return; + } + + if(furnitureRedeemEventRegistered) + { + Event furniRedeemEvent = new FurnitureRedeemedEvent(item, this.client.getHabbo(), pixels, FurnitureRedeemedEvent.PIXELS); + Emulator.getPluginManager().fireEvent(furniRedeemEvent); + + if(furniRedeemEvent.isCancelled()) + return; + } + + this.client.getHabbo().getHabboInfo().addPixels(pixels); + this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + } + else if (item.getBaseItem().getName().startsWith("DF_")) + { + int pointsType; + int points; + + try + { + pointsType = Integer.valueOf(item.getBaseItem().getName().split("_")[1]); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse redeemable points furniture: " + item.getBaseItem().getName() + ". Must be in format of DF__ where equals integer representation of seasonal currency."); + return; + } + + try + { + points = Integer.valueOf(item.getBaseItem().getName().split("_")[2]); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse redeemable points furniture: " + item.getBaseItem().getName() + ". Must be in format of DF__ where equals integer representation of seasonal currency."); + return; + } + + if(furnitureRedeemEventRegistered) + { + Event furniRedeemEvent = new FurnitureRedeemedEvent(item, this.client.getHabbo(), points, FurnitureRedeemedEvent.DIAMONDS); + Emulator.getPluginManager().fireEvent(furniRedeemEvent); + + if(furniRedeemEvent.isCancelled()) + return; + } + + this.client.getHabbo().givePoints(pointsType, points); + } + else if (item.getBaseItem().getName().startsWith("CF_diamond_")) + { + try + { + this.client.getHabbo().givePoints(Integer.valueOf(item.getBaseItem().getName().split("_")[2])); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to parse redeemable diamonds furniture: " + item.getBaseItem().getName() + ". Must be in format of CF_diamond_"); + return; + } + } + + room.removeHabboItem(item); + room.sendComposer(new RemoveFloorItemComposer(item).compose()); + RoomTile t = room.getLayout().getTile(item.getX(), item.getY()); + t.setStackHeight(room.getStackHeight(item.getX(), item.getY(), false)); + room.updateTile(t); + room.sendComposer(new UpdateStackHeightComposer(item.getX(), item.getY(), t.relativeHeight()).compose()); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPickupItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPickupItemEvent.java new file mode 100644 index 00000000..60b82df5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPickupItemEvent.java @@ -0,0 +1,59 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionPostIt; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomPickupItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int unknown = this.packet.readInt(); + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if (item == null) + return; + + if(item instanceof InteractionPostIt) + return; + + if (item.getUserId() == this.client.getHabbo().getHabboInfo().getId()) + { + room.pickUpItem(item, this.client.getHabbo()); + return; + } + else + { + if (room.hasRights(this.client.getHabbo())) + { + if (this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + item.setUserId(this.client.getHabbo().getHabboInfo().getId()); + } + + room.ejectUserItem(item); + } + } + +// if(item.getUserId() == this.client.getHabbo().getHabboInfo().getId() || (room.getGuildId() > 0 && room.guildRightLevel(this.client.getHabbo()) >= 2) || this.client.getHabbo().hasPermission("acc_anyroomowner")) +// { +// if (room.getGuildId() == 0 && this.client.getHabbo().hasPermission("acc_anyroomowner")) +// item.setUserId(this.client.getHabbo().getHabboInfo().getId()); +// +// room.pickUpItem(item, this.client.getHabbo()); +// } +// else +// { +// room.ejectUserItem(item); +// } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java new file mode 100644 index 00000000..7b089bcd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java @@ -0,0 +1,283 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.interactions.*; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.inventory.RemoveHabboItemComposer; +import com.eu.habbo.messages.outgoing.rooms.items.AddFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.items.AddWallItemComposer; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.furniture.FurniturePlacedEvent; +import gnu.trove.set.hash.THashSet; + +import java.awt.*; + +public class RoomPlaceItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String[] values = this.packet.readString().split(" "); + + if(values.length < 1) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_item")); + return; + } + + if(!this.client.getHabbo().getRoomUnit().isInRoom()) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + return; + } + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null) + { + return; + } + + HabboItem rentSpace = null; + if(!this.client.getHabbo().getHabboStats().canRentSpace()) + { + rentSpace = room.getHabboItem(this.client.getHabbo().getHabboStats().rentedItemId); + +// if(rentSpace == null) +// { +// this.client.getHabbo().getHabboStats().setRentedTimeEnd(0); +// this.client.getHabbo().getHabboStats().setRentedItemId(0); +// +// return; +// } +// else +// { +// if(rentSpace instanceof InteractionRentableSpace) +// { +// if(!((InteractionRentableSpace) rentSpace).isRented() || ((InteractionRentableSpace) rentSpace).getRenterId() != this.client.getHabbo().getHabboInfo().getId()) +// { +// this.client.getHabbo().getHabboStats().setRentedTimeEnd(0); +// this.client.getHabbo().getHabboStats().setRentedItemId(0); +// +// return; +// } +// } +// } + } + else + { + HabboItem sp = room.getHabboItem(this.client.getHabbo().getHabboStats().rentedItemId); + + if(sp != null && sp instanceof InteractionRentableSpace) + { + if(((InteractionRentableSpace)sp).getRenterId() == this.client.getHabbo().getHabboInfo().getId()) + { + ((InteractionRentableSpace)sp).endRent(); + } + } + + if (!room.hasRights(this.client.getHabbo()) && !this.client.getHabbo().hasPermission("acc_placefurni") && !(room.getGuildId() > 0 && room.guildRightLevel(this.client.getHabbo()) >= 2) && this.client.getHabbo().getHabboStats().canRentSpace()) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + return; + } + } + + int itemId = Integer.valueOf(values[0]); + if(itemId <= 0) + return; + + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(itemId); + + if(item == null) + return; + + if(room.getId() != item.getRoomId() && item.getRoomId() != 0) + return; + + if(item instanceof InteractionMoodLight && !room.getRoomSpecialTypes().getItemsOfType(InteractionMoodLight.class).isEmpty()) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "max_dimmers")); + return; + } + + if (item instanceof InteractionJukeBox && !room.getRoomSpecialTypes().getItemsOfType(InteractionJukeBox.class).isEmpty()) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "max_soundfurni")); + return; + } + + THashSet updatedTiles = new THashSet(); + if(item.getBaseItem().getType() == FurnitureType.FLOOR) + { + short x = Short.valueOf(values[1]); + short y = Short.valueOf(values[2]); + int rotation = Integer.valueOf(values[3]); + + if(x < 0 || y < 0 || rotation < 0) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + return; + } + + if(rentSpace != null && !room.hasRights(this.client.getHabbo())) + { + if(item instanceof InteractionRoller || + item instanceof InteractionStackHelper || + item instanceof InteractionWired || + item instanceof InteractionBackgroundToner || + item instanceof InteractionRoomAds || + item instanceof InteractionCannon || + item instanceof InteractionPuzzleBox) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + return; + } + } + + if(Emulator.getPluginManager().isRegistered(FurniturePlacedEvent.class, true)) + { + Event furniturePlacedEvent = new FurniturePlacedEvent(item, this.client.getHabbo(), room.getLayout().getTile(x, y)); + Emulator.getPluginManager().fireEvent(furniturePlacedEvent); + + if(furniturePlacedEvent.isCancelled()) + return; + } + + if(rentSpace != null) + { + if(!RoomLayout.squareInSquare(RoomLayout.getRectangle(rentSpace.getX(), rentSpace.getY(), rentSpace.getBaseItem().getWidth(), rentSpace.getBaseItem().getLength(), rentSpace.getRotation()), RoomLayout.getRectangle(x, y, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation))) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + return; + } + } + + double checkStackHeight = room.getStackHeight(x, y, true); + + if (checkStackHeight > 0 && item instanceof InteractionRoller) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + return; + } + + HabboItem stackHelper = room.getStackHelper(x, y); + + Rectangle newSquare = RoomLayout.getRectangle(x, y, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); + + //if (x != item.getX() || y != item.getY() || item.getRotation() != rotation) + if (stackHelper == null) + { + checkStackHeight = room.getStackHeight(x, y, false, item); + for (short i = (short) newSquare.x; i < newSquare.x + newSquare.getWidth(); i++) + { + for (short j = (short) newSquare.y; j < newSquare.y + newSquare.getHeight(); j++) + { + double testheight = room.getStackHeight(i, j, false, item); + if (checkStackHeight != testheight && !(item instanceof InteractionStackHelper)) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + this.client.sendResponse(new FloorItemUpdateComposer(item)); + return; + } + + if (!room.getHabbosAt(i, j).isEmpty() && !(item instanceof InteractionStackHelper || item.getBaseItem().allowSit())) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + this.client.sendResponse(new FloorItemUpdateComposer(item)); + return; + } + + boolean found = false; + for (RoomTile tile : updatedTiles) + { + if (tile.x == i && tile.y == j) + { + found = true; + } + } + + if (!found) + { + RoomTile t = room.getLayout().getTile(i, j); + if (t != null) + updatedTiles.add(t); + } + } + } + } + + item.setZ(stackHelper == null ? room.getStackHeight(x, y, false) : (stackHelper.getExtradata().isEmpty() ? room.getLayout().getHeightAtSquare(x, y) : (double) Integer.valueOf(stackHelper.getExtradata()) / 100)); + item.setX(x); + item.setY(y); + item.setRotation(rotation); + room.sendComposer(new AddFloorItemComposer(item, this.client.getHabbo().getHabboInfo().getUsername()).compose()); + } + else + { + if(Emulator.getPluginManager().isRegistered(FurniturePlacedEvent.class, true)) + { + Event furniturePlacedEvent = new FurniturePlacedEvent(item, this.client.getHabbo(), null); + Emulator.getPluginManager().fireEvent(furniturePlacedEvent); + + if(furniturePlacedEvent.isCancelled()) + return; + } + + item.setWallPosition(values[1] + " " + values[2] + " " + values[3]); + room.sendComposer(new AddWallItemComposer(item, this.client.getHabbo().getHabboInfo().getUsername()).compose()); + } + + Achievement roomDecoAchievement = Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoFurniCount"); + int furniCollecterProgress = this.client.getHabbo().getHabboStats().getAchievementProgress(roomDecoAchievement); + int difference = room.getUserFurniCount(this.client.getHabbo().getHabboInfo().getId()) - furniCollecterProgress; + if (difference > 0) + { + AchievementManager.progressAchievement(this.client.getHabbo(), roomDecoAchievement, difference); + } + + if (item instanceof InteractionBlackHole) + { + Achievement holeCountAchievement = Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoHoleFurniCount"); + int holesCountProgress = this.client.getHabbo().getHabboStats().getAchievementProgress(holeCountAchievement); + int holeDifference = room.getRoomSpecialTypes().getItemsOfType(InteractionBlackHole.class).size() - holesCountProgress; + + if (holeDifference > 0) + { + AchievementManager.progressAchievement(this.client.getHabbo(), holeCountAchievement, holeDifference); + } + } + + this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + item.needsUpdate(true); + this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item.getId()); + room.addHabboItem(item); + item.setRoomId(room.getId()); + +// if(!updatedTiles.isEmpty()) +// { +// for (RoomTile t : updatedTiles) +// { +// t.setStackHeight(room.getStackHeight(t.x, t.y, false)); +// } +// room.sendComposer(new UpdateStackHeightComposer(updatedTiles).compose()); +// } + room.updateTiles(updatedTiles); + for (RoomTile tile : updatedTiles) + { + room.updateHabbosAt(tile.x, tile.y); + } + + Emulator.getThreading().run(item); + item.onPlace(room); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RotateMoveItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RotateMoveItemEvent.java new file mode 100644 index 00000000..8802c9b7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RotateMoveItemEvent.java @@ -0,0 +1,251 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionRoller; +import com.eu.habbo.habbohotel.items.interactions.InteractionStackHelper; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.furniture.FurnitureMovedEvent; +import com.eu.habbo.plugin.events.furniture.FurnitureRotatedEvent; +import gnu.trove.set.hash.THashSet; + +import java.awt.*; + +public class RotateMoveItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room == null) + return; + + int furniId = this.packet.readInt(); + HabboItem item = room.getHabboItem(furniId); + + HabboItem rentSpace = null; + if(!this.client.getHabbo().getHabboStats().canRentSpace()) + { + rentSpace = room.getHabboItem(this.client.getHabbo().getHabboStats().rentedItemId); + } + else + { + if (item == null || (!room.hasRights(this.client.getHabbo()) && !this.client.getHabbo().hasPermission("acc_placefurni") && !(room.getGuildId() > 0 && room.guildRightLevel(this.client.getHabbo()) >= 2))) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + + if (item != null) + { + this.client.sendResponse(new FloorItemUpdateComposer(item)); + } + return; + } + } + + int x = this.packet.readInt(); + int y = this.packet.readInt(); + int rotation = this.packet.readInt(); + + if(x < 0 || y < 0 || rotation < 0) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + return; + } + + short oldX = item.getX(); + short oldY = item.getY(); + int oldRotation = item.getRotation(); + + RoomTile oldLocation = room.getLayout().getTile(oldX, oldY); + + if(rentSpace != null) + { + if(!RoomLayout.squareInSquare(RoomLayout.getRectangle(rentSpace.getX(), rentSpace.getY(), rentSpace.getBaseItem().getWidth(), rentSpace.getBaseItem().getLength(), rentSpace.getRotation()), RoomLayout.getRectangle(x, y, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation))) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "cant_set_not_owner")); + this.client.sendResponse(new FloorItemUpdateComposer(item)); + return; + } + } + + HabboItem hasStackHelper = room.getStackHelper(x, y); + HabboItem topItem = null; + if(hasStackHelper == null) + topItem = room.getTopItemAt(x, y); + + if (topItem != null && topItem != item && !topItem.getBaseItem().allowStack() && !(item instanceof InteractionStackHelper)) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + this.client.sendResponse(new FloorItemUpdateComposer(item)); + return; + } + + THashSet updatedTiles = new THashSet(); + + Rectangle currentSquare = RoomLayout.getRectangle(item.getX(), item.getY(), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + + for (short i = (short) currentSquare.x; i < currentSquare.x + currentSquare.getWidth(); i++) + { + for (short j = (short) currentSquare.y; j < currentSquare.y + currentSquare.getHeight(); j++) + { + RoomTile tile = room.getLayout().getTile(i, j); + + if (tile != null) + { + updatedTiles.add(tile); + } + } + } + +// if ((x != item.getX() || y != item.getY()) || item.getRotation() != rotation) { +// for (int i = item.getX(); i < item.getX() + item.getBaseItem().getWidth(); i++) { +// for (int j = item.getY(); j < item.getY() + item.getBaseItem().getLength(); j++) { +// updatedTiles.add(new Tile(i, j, 0)); +// } +// } +// } + + //room.removeHabboItem(item.getId()); + + double checkStackHeight = item.getZ(); + + Rectangle newSquare = RoomLayout.getRectangle(x, y, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); + + //if (x != item.getX() || y != item.getY() || item.getRotation() != rotation) + if (hasStackHelper == null) + { + checkStackHeight = room.getStackHeight(x, y, false, item); + for (short i = (short) newSquare.x; i < newSquare.x + newSquare.getWidth(); i++) + { + for (short j = (short) newSquare.y; j < newSquare.y + newSquare.getHeight(); j++) + { + double testheight = room.getStackHeight(i, j, false, item); + if ( + (checkStackHeight != testheight && !(item instanceof InteractionStackHelper)) || + (!room.getHabbosAt(i, j).isEmpty() && !(oldX == x && oldY == y) && !(item instanceof InteractionStackHelper)) || + (checkStackHeight > 0 && item instanceof InteractionRoller) + ) + { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNI_PLACE_EMENT_ERROR.key, "${room.error.cant_set_item}")); + this.client.sendResponse(new FloorItemUpdateComposer(item)); + return; + } + + boolean found = false; + for (RoomTile tile : updatedTiles) + { + if (tile != null) + { + if (tile.x == i && tile.y == j) + { + found = true; + } + } + } + + if (!found) + { + RoomTile t = room.getLayout().getTile(i, j); + if (t != null) + updatedTiles.add(t); + } + } + } + } + + if(topItem == null || (topItem != item && topItem.getBaseItem().allowStack())) { + item.setZ(topItem == null && hasStackHelper != null ? hasStackHelper.getExtradata().isEmpty() ? Double.valueOf("0.0") : Double.valueOf(hasStackHelper.getExtradata()) / 100.0D : checkStackHeight); + } + + if(item.getBaseItem().allowSit()) + { + THashSet habbos = room.getHabbosAt(oldX, oldY); + THashSet updatedUnits = new THashSet(); + for (Habbo habbo : habbos) + { + habbo.getRoomUnit().getStatus().remove("sit"); + } + room.sendComposer(new RoomUserStatusComposer(updatedUnits, false).compose()); + } + + if (item.getBaseItem().allowLay()) + { + THashSet habbos = room.getHabbosAt(oldX, oldY); + THashSet updatedUnits = new THashSet(); + for (Habbo habbo : habbos) + { + habbo.getRoomUnit().getStatus().remove("lay"); + } + room.sendComposer(new RoomUserStatusComposer(updatedUnits, false).compose()); + } + + item.setX((short) x); + item.setY((short) y); + + if(item.getRotation() != rotation) + { + item.setRotation(rotation); + + if(Emulator.getPluginManager().isRegistered(FurnitureRotatedEvent.class, true)) + { + Event furnitureRotatedEvent = new FurnitureRotatedEvent(item, this.client.getHabbo(), oldRotation); + Emulator.getPluginManager().fireEvent(furnitureRotatedEvent); + + if(furnitureRotatedEvent.isCancelled()) + { + item.setRotation(oldRotation); + } + } + } + + RoomTile newLocation = room.getLayout().getTile(item.getX(), item.getY()); + item.onMove(room, oldLocation, newLocation); + + if(Emulator.getPluginManager().isRegistered(FurnitureMovedEvent.class, true)) + { + Event furnitureMovedEvent = new FurnitureMovedEvent(item, this.client.getHabbo(), oldLocation, newLocation); + Emulator.getPluginManager().fireEvent(furnitureMovedEvent); + + if(furnitureMovedEvent.isCancelled()) + return; + } + + if (item instanceof InteractionStackHelper) + { + try + { + item.setZ(Double.valueOf(item.getExtradata()) / 100.0); + } + catch (Exception e) + {} + } + + room.updateTiles(updatedTiles); + + for(RoomTile t : updatedTiles) + { + //t.setStackHeight(room.getStackHeight(t.x, t.y, false)); + + if(oldX != t.x || oldY != t.y) + room.updateHabbosAt(t.x, t.y); + } + + if(oldX != x || oldY != y) + room.updateHabbosAt(oldX, oldY); + + room.sendComposer(new FloorItemUpdateComposer(item).compose()); + item.needsUpdate(true); + Emulator.getThreading().run(item); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/SavePostItStickyPoleEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/SavePostItStickyPoleEvent.java new file mode 100644 index 00000000..c78236fa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/SavePostItStickyPoleEvent.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class SavePostItStickyPoleEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + if(itemId == -1234) + { + this.packet.readString(); + this.packet.readString(); + if(this.client.getHabbo().hasPermission("cmd_multi")) + { + String[] commands = this.packet.readString().split("\r"); + + for (String command : commands) + { + command.replace("
    ", "\r"); + CommandHandler.handleCommand(this.client, command); + } + } + else + { + Emulator.getLogging().logUserLine("Scripter Alert! " + this.client.getHabbo().getHabboInfo().getUsername() + " | " + this.packet.readString()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/SetStackHelperHeightEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/SetStackHelperHeightEvent.java new file mode 100644 index 00000000..41801065 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/SetStackHelperHeightEvent.java @@ -0,0 +1,75 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionStackHelper; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.UpdateStackHeightComposer; +import gnu.trove.set.hash.THashSet; + +public class SetStackHelperHeightEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + if(this.client.getHabbo().getHabboInfo().getId() == this.client.getHabbo().getHabboInfo().getCurrentRoom().getOwnerId() || this.client.getHabbo().getHabboInfo().getCurrentRoom().hasRights(this.client.getHabbo())) + { + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item instanceof InteractionStackHelper) + { + int stackerHeight = this.packet.readInt(); + + item.setExtradata(stackerHeight + ""); + + double height = 0; + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + THashSet tiles = room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); + + if(stackerHeight >= 0) + { + height = stackerHeight / 100.0D; + } + else + { + for (RoomTile tile : tiles) + { + double tileHeight = this.client.getHabbo().getHabboInfo().getCurrentRoom().getTopHeightAt(tile.x, tile.y); + + if (tileHeight > height) + { + height = tileHeight; + } + } + } + + for (RoomTile tile : tiles) + { + if (height < tile.z) + { + height = tile.z; + } + } + + for (RoomTile tile : tiles) + { + tile.setStackHeight(height); + } + + item.setZ(height); + item.setExtradata((int)(height * 100) + ""); + item.needsUpdate(true); + this.client.getHabbo().getHabboInfo().getCurrentRoom().updateItem(item); + this.client.getHabbo().getHabboInfo().getCurrentRoom().updateTiles(tiles); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new UpdateStackHeightComposer(tiles).compose()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java new file mode 100644 index 00000000..beb8e6b1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java @@ -0,0 +1,136 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionDice; +import com.eu.habbo.habbohotel.items.interactions.InteractionMonsterPlantSeed; +import com.eu.habbo.habbohotel.items.interactions.InteractionWired; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.PetPackageComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; +import gnu.trove.set.hash.THashSet; + +public class ToggleFloorItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + try + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room == null) + return; + + int itemId = this.packet.readInt(); + int state = this.packet.readInt(); + + HabboItem item = room.getHabboItem(itemId); + + if (item == null || item instanceof InteractionDice) + return; + + if(item.getBaseItem().getName().equalsIgnoreCase("totem_planet")) + { + THashSet items = room.getItemsAt(room.getLayout().getTile(item.getX(), item.getY())); + HabboItem totemLeg = null; + HabboItem totemHead = null; + + for(HabboItem totemItem : items) + { + if(totemLeg != null && totemHead != null) + { + break; + } + if(totemItem.getBaseItem().getName().equalsIgnoreCase("totem_leg")) + { + totemLeg = totemItem; + } + if(totemItem.getBaseItem().getName().equalsIgnoreCase("totem_head")) + { + totemHead = totemItem; + } + } + + if(totemHead != null && totemLeg != null) + { + if (item.getExtradata().equals("2")) + { + if (totemLeg.getExtradata() == null || totemHead.getExtradata() == null) + return; + + if (totemLeg.getExtradata().equals("2") && totemHead.getExtradata().equals("5")) + { + room.giveEffect(this.client.getHabbo(), 23); + return; + } + + if (totemLeg.getExtradata().equals("10") && totemHead.getExtradata().equals("9")) + { + room.giveEffect(this.client.getHabbo(), 26); + return; + } + } else if(item.getExtradata().equals("0")) + { + if(totemLeg.getExtradata().equals("7") && totemHead.getExtradata().equals("10")) + { + room.giveEffect(this.client.getHabbo(), 24); + return; + } + + } + else if(item.getExtradata().equals("1")) + { + if(totemLeg.getExtradata().equals("9") && totemHead.getExtradata().equals("12")) + { + room.giveEffect(this.client.getHabbo(), 25); + return; + } + } + } + } + + //Do not move to onClick(). Wired could trigger it. + if(item instanceof InteractionMonsterPlantSeed) + { + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + MonsterplantPet pet = Emulator.getGameEnvironment().getPetManager().createMonsterplant(room, this.client.getHabbo(), item.getBaseItem().getName().contains("rare"), room.getLayout().getTile(item.getX(), item.getY())); + room.sendComposer(new RemoveFloorItemComposer(item, true).compose()); + room.removeHabboItem(item); + room.updateTile(room.getLayout().getTile(item.getX(), item.getY())); + room.placePet(pet, item.getX(), item.getY(), item.getZ(), item.getRotation()); + pet.cycle(); + room.sendComposer(new RoomUserStatusComposer(pet.getRoomUnit()).compose()); + return; + } + + if ( + (item.getBaseItem().getName().equalsIgnoreCase("val11_present") || + item.getBaseItem().getName().equalsIgnoreCase("gnome_box") || + item.getBaseItem().getName().equalsIgnoreCase("leprechaun_box") || + item.getBaseItem().getName().equalsIgnoreCase("velociraptor_egg") || + item.getBaseItem().getName().equalsIgnoreCase("pterosaur_egg") || + item.getBaseItem().getName().equalsIgnoreCase("petbox_epic")) && room.getCurrentPets().size() < Room.MAXIMUM_PETS) + { + this.client.sendResponse(new PetPackageComposer(item)); + return; + } + + item.onClick(this.client, room, new Object[]{state}); + + if(item instanceof InteractionWired) + { + this.client.getHabbo().getRoomUnit().setGoalLocation(this.client.getHabbo().getRoomUnit().getCurrentLocation()); + } + } + catch(Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleWallItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleWallItemEvent.java new file mode 100644 index 00000000..d94257d4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleWallItemEvent.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ToggleWallItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room == null) + return; + + int itemId = this.packet.readInt(); + int state = this.packet.readInt(); + + HabboItem item = room.getHabboItem(itemId); + + if (item == null) + return; + + if(item.getBaseItem().getName().equalsIgnoreCase("poster")) + return; + + item.needsUpdate(true); + item.onClick(this.client, room, new Object[]{state}); + room.updateItem(item); + Emulator.getThreading().run(item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerColorWheelEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerColorWheelEvent.java new file mode 100644 index 00000000..8a43c458 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerColorWheelEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionColorWheel; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TriggerColorWheelEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(item != null && item instanceof InteractionColorWheel) + { + item.onClick(this.client, room, null); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerDiceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerDiceEvent.java new file mode 100644 index 00000000..ea8b039d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerDiceEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionDice; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TriggerDiceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + { + return; + } + + HabboItem item = room.getHabboItem(itemId); + + if(item != null) + { + if(item instanceof InteractionDice) + { + if (RoomLayout.tilesAdjecent(room.getLayout().getTile(item.getX(), item.getY()), this.client.getHabbo().getRoomUnit().getCurrentLocation())) + { + item.onClick(this.client, room, new Object[]{}); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerOneWayGateEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerOneWayGateEvent.java new file mode 100644 index 00000000..096b0898 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/TriggerOneWayGateEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionOneWayGate; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TriggerOneWayGateEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + int itemId = this.packet.readInt(); + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item == null) + return; + + if(item instanceof InteractionOneWayGate) + { + if(!item.getExtradata().equals("0") || this.client.getHabbo().getRoomUnit().isTeleporting) + return; + + item.onClick(this.client, this.client.getHabbo().getHabboInfo().getCurrentRoom(), null); + } + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxAddSoundTrackEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxAddSoundTrackEvent.java new file mode 100644 index 00000000..511d170a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxAddSoundTrackEvent.java @@ -0,0 +1,96 @@ +package com.eu.habbo.messages.incoming.rooms.items.jukebox; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.habbohotel.items.interactions.InteractionJukeBox; +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListAddSongComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListUpdatedComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxTrackDataComposer; +import gnu.trove.procedure.TIntProcedure; +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.List; + +public class JukeBoxAddSoundTrackEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + int unknown = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room != null) + { + HabboItem item = room.getHabboItem(itemId); + + if (item instanceof InteractionMusicDisc) + { + /*for (HabboItem jukeBox : room.getRoomSpecialTypes().getItemsOfType(InteractionJukeBox.class)) + { + if (jukeBox instanceof InteractionJukeBox) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) item).getSongId()); + ArrayList soundTracks = new ArrayList(); + soundTracks.add(track); + + if (!((InteractionJukeBox)jukeBox).hasItemInPlaylist(itemId)) + { + ((InteractionJukeBox) jukeBox).addToPlayList(itemId, room); + } + else + { + ((InteractionJukeBox) jukeBox).removeFromPlayList(itemId, room); + } + + //room.sendComposer(new JukeBoxPlayListComposer(((InteractionJukeBox) jukeBox), room).compose()); + THashSet soundTrackTHashSet = new THashSet<>(); + List toRemove = new ArrayList(); + ((InteractionJukeBox) jukeBox).getMusicDisks().forEach(new TIntProcedure() + { + @Override + public boolean execute(int i) + { + HabboItem item = room.getHabboItem(i); + + if (item != null && item instanceof InteractionMusicDisc) + { + SoundTrack track = Emulator.getGameEnvironment().getItemManager().getSoundTrack(((InteractionMusicDisc) item).getSongId()); + + if (track != null) + { + soundTrackTHashSet.add(track); + return true; + } + } + toRemove.add(i); + + return true; + } + }); + + for (Integer i : toRemove) + { + ((InteractionJukeBox) jukeBox).removeFromPlayList(i, room); + } + + room.sendComposer(new JukeBoxPlayListUpdatedComposer(soundTrackTHashSet).compose()); + } + break; + }*/ + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom().hasRights(this.client.getHabbo())) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager().addSong(itemId); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventOne.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventOne.java new file mode 100644 index 00000000..74f80181 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventOne.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.incoming.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.rooms.TraxManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxMySongsComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxNowPlayingMessageComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListComposer; + +public class JukeBoxEventOne extends MessageHandler +{ + @Override + public void handle() throws Exception + { + TraxManager traxManager = this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager(); + this.client.sendResponse(new JukeBoxPlayListComposer(traxManager.getSongs(), traxManager.totalLength())); + this.client.sendResponse(new JukeBoxMySongsComposer(traxManager.myList())); + this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager().updateCurrentPlayingSong(this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventTwo.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventTwo.java new file mode 100644 index 00000000..c257d0cc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxEventTwo.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.incoming.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.rooms.TraxManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxMySongsComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListComposer; + +public class JukeBoxEventTwo extends MessageHandler +{ + @Override + public void handle() throws Exception + { + TraxManager traxManager = this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager(); + this.client.sendResponse(new JukeBoxPlayListComposer(traxManager.getSongs(), traxManager.totalLength())); + this.client.sendResponse(new JukeBoxMySongsComposer(traxManager.myList())); + this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager().updateCurrentPlayingSong(this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRemoveSoundTrackEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRemoveSoundTrackEvent.java new file mode 100644 index 00000000..6cbd539d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRemoveSoundTrackEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class JukeBoxRemoveSoundTrackEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int index = this.packet.readInt(); + + InteractionMusicDisc musicDisc = this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager().getSongs().get(index); + + if (musicDisc != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager().removeSong(musicDisc.getId()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRequestPlayListEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRequestPlayListEvent.java new file mode 100644 index 00000000..61348127 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/jukebox/JukeBoxRequestPlayListEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.habbohotel.items.interactions.InteractionJukeBox; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.TraxManager; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxMySongsComposer; +import com.eu.habbo.messages.outgoing.rooms.items.jukebox.JukeBoxPlayListComposer; +import gnu.trove.set.hash.THashSet; + +public class JukeBoxRequestPlayListEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + TraxManager traxManager = this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager(); + this.client.sendResponse(new JukeBoxPlayListComposer(traxManager.getSongs(), traxManager.totalLength())); + this.client.sendResponse(new JukeBoxMySongsComposer(traxManager.myList())); + this.client.getHabbo().getHabboInfo().getCurrentRoom().getTraxManager().updateCurrentPlayingSong(this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/lovelock/LoveLockStartConfirmEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/lovelock/LoveLockStartConfirmEvent.java new file mode 100644 index 00000000..10a87b6a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/lovelock/LoveLockStartConfirmEvent.java @@ -0,0 +1,55 @@ +package com.eu.habbo.messages.incoming.rooms.items.lovelock; + +import com.eu.habbo.habbohotel.items.interactions.InteractionLoveLock; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.lovelock.LoveLockFurniFinishedComposer; +import com.eu.habbo.messages.outgoing.rooms.items.lovelock.LoveLockFurniFriendConfirmedComposer; + +public class LoveLockStartConfirmEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item == null) + return; + + if(item instanceof InteractionLoveLock) + { + int userId = 0; + + if(((InteractionLoveLock) item).userOneId == this.client.getHabbo().getHabboInfo().getId() && ((InteractionLoveLock) item).userTwoId != 0) + { + userId = ((InteractionLoveLock) item).userTwoId; + } + else if(((InteractionLoveLock) item).userOneId != 0 && ((InteractionLoveLock) item).userTwoId == this.client.getHabbo().getHabboInfo().getId()) + { + userId = ((InteractionLoveLock) item).userOneId; + } + + if(userId > 0) + { + Habbo habbo = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(userId); + + if(habbo != null) + { + habbo.getClient().sendResponse(new LoveLockFurniFriendConfirmedComposer((InteractionLoveLock) item)); + + habbo.getClient().sendResponse(new LoveLockFurniFinishedComposer((InteractionLoveLock) item)); + this.client.sendResponse(new LoveLockFurniFinishedComposer((InteractionLoveLock) item)); + + ((InteractionLoveLock) item).lock(habbo, this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getCurrentRoom()); + } + } + } + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceCancelEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceCancelEvent.java new file mode 100644 index 00000000..693bc14c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceCancelEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.rooms.items.rentablespace; + +import com.eu.habbo.habbohotel.items.interactions.InteractionRentableSpace; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RentSpaceCancelEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || + this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + if(item instanceof InteractionRentableSpace) + { + ((InteractionRentableSpace) item).endRent(); + + room.updateItem(item); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceEvent.java new file mode 100644 index 00000000..bf54cc5b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/rentablespace/RentSpaceEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.incoming.rooms.items.rentablespace; + +import com.eu.habbo.habbohotel.items.interactions.InteractionRentableSpace; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RentSpaceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + HabboItem item = room.getHabboItem(itemId); + + if(item == null || !(item instanceof InteractionRentableSpace)) + return; + + ((InteractionRentableSpace) item).rent(this.client.getHabbo()); + + room.updateItem(item); + + ((InteractionRentableSpace) item).sendRentWidget(this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestNextVideoEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestNextVideoEvent.java new file mode 100644 index 00000000..dd09c826 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestNextVideoEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.rooms.items.youtube; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.YoutubeManager; +import com.eu.habbo.habbohotel.items.interactions.InteractionYoutubeTV; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.youtube.YoutubeVideoComposer; + +public class YoutubeRequestNextVideoEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + int next = this.packet.readInt(); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if (item != null && item instanceof InteractionYoutubeTV) + { + YoutubeManager.YoutubeItem video = Emulator.getGameEnvironment().getItemManager().getYoutubeManager().getVideo(item.getBaseItem(), next); + + if (video != null) + { + this.client.sendResponse(new YoutubeVideoComposer(itemId, video)); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlayListEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlayListEvent.java new file mode 100644 index 00000000..e793b176 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlayListEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.rooms.items.youtube; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionYoutubeTV; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.youtube.YoutubeDisplayListComposer; + +public class YoutubeRequestPlayListEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if (item != null && item instanceof InteractionYoutubeTV) + { + this.client.sendResponse(new YoutubeDisplayListComposer(itemId, Emulator.getGameEnvironment().getItemManager().getYoutubeManager().getPlaylist(item.getBaseItem()))); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestVideoDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestVideoDataEvent.java new file mode 100644 index 00000000..83c17561 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestVideoDataEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.rooms.items.youtube; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.YoutubeManager; +import com.eu.habbo.habbohotel.items.interactions.InteractionYoutubeTV; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.youtube.YoutubeVideoComposer; + +public class YoutubeRequestVideoDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + String videoId = this.packet.readString(); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if (item != null && item instanceof InteractionYoutubeTV) + { + YoutubeManager.YoutubeItem videoItem = Emulator.getGameEnvironment().getItemManager().getYoutubeManager().getVideo(item.getBaseItem(), videoId); + + if (videoItem != null) + { + this.client.sendResponse(new YoutubeVideoComposer(itemId, videoItem)); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedPetsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedPetsEvent.java new file mode 100644 index 00000000..740a080a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedPetsEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class BreedPetsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int unknownInt = this.packet.readInt(); //Something state. 2 = accept + + if (unknownInt == 0) + { + AbstractPet petOne = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(this.packet.readInt()); + AbstractPet petTwo = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(this.packet.readInt()); + + if (petOne == null || petTwo == null) + { + //TODO Add error + return; + } + + if (petOne instanceof MonsterplantPet && petTwo instanceof MonsterplantPet) + { + ((MonsterplantPet) petOne).breed((MonsterplantPet) petTwo); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CompostMonsterplantEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CompostMonsterplantEvent.java new file mode 100644 index 00000000..9420a0b3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CompostMonsterplantEvent.java @@ -0,0 +1,68 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.AddFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class CompostMonsterplantEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + AbstractPet pet = room.getPet(petId); + + if (pet != null) + { + if (pet instanceof MonsterplantPet) + { + if (pet.getUserId() == this.client.getHabbo().getHabboInfo().getId()) + { + if (((MonsterplantPet) pet).isDead()) + { + Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem("mnstr_compost"); + + if (baseItem != null) + { + HabboItem compost = Emulator.getGameEnvironment().getItemManager().createItem(pet.getUserId(), baseItem, 0, 0, ""); + compost.setX(pet.getRoomUnit().getX()); + compost.setY(pet.getRoomUnit().getY()); + compost.setZ(pet.getRoomUnit().getZ()); + compost.setRotation(pet.getRoomUnit().getBodyRotation().getValue()); + room.addHabboItem(compost); + room.sendComposer(new AddFloorItemComposer(compost, this.client.getHabbo().getHabboInfo().getUsername()).compose()); + } + + pet.setRoom(null); + pet.setUserId(0); + room.removePet(petId); + room.sendComposer(new RoomUserRemoveComposer(pet.getRoomUnit()).compose()); + pet.setRoomUnit(null); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM users_pets WHERE id = ? LIMIT 1")) + { + statement.setInt(1, pet.getId()); + statement.executeUpdate(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideEvent.java new file mode 100644 index 00000000..465b561a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideEvent.java @@ -0,0 +1,74 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; +import com.eu.habbo.threading.runnables.RoomUnitRideHorse; + +public class HorseRideEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + AbstractPet pet = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(petId); + + if(pet == null || !(pet instanceof HorsePet)) + return; + + if(this.client.getHabbo().getHabboInfo().getRiding() == null) + { + if (((HorsePet) pet).anyoneCanRide() || this.client.getHabbo().getHabboInfo().getId() == pet.getUserId()) + { + if (((HorsePet) pet).getRider() != null) + { + if (this.client.getHabbo().getHabboInfo().getId() == pet.getUserId()) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(((HorsePet) pet).getRider(), 0); + ((HorsePet) pet).getRider().getHabboInfo().setRiding(null); + ((HorsePet) pet).setRider(null); + ((HorsePet) pet).setTask(PetTasks.FREE); + } else + { + //TODO: Say somebody else is already riding. + return; + } + } + + RoomTile goalTile = this.client.getHabbo().getHabboInfo().getCurrentRoom().getLayout().getTileInFront(this.client.getHabbo().getRoomUnit().getCurrentLocation(), this.client.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (goalTile != null) + { + if (goalTile.equals(this.client.getHabbo().getRoomUnit().getCurrentLocation())) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(this.client.getHabbo(), 77); + this.client.getHabbo().getHabboInfo().setRiding((HorsePet) pet); + ((HorsePet) pet).setRider(this.client.getHabbo()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserEffectComposer(this.client.getHabbo().getRoomUnit()).compose()); + ((HorsePet) pet).setTask(PetTasks.RIDE); + } + else + { + pet.getRoomUnit().setGoalLocation(goalTile); + Emulator.getThreading().run(new RoomUnitRideHorse((HorsePet) pet, this.client.getHabbo(), goalTile)); + } + } + } + } + else + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(this.client.getHabbo(), 0); + ((HorsePet) pet).setRider(null); + ((HorsePet) pet).setTask(PetTasks.FREE); + this.client.getHabbo().getHabboInfo().setRiding(null); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideSettingsEvent.java new file mode 100644 index 00000000..3e7d4663 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseRideSettingsEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetHorseFigureComposer; + +public class HorseRideSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + AbstractPet pet = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(petId); + + if(pet == null || pet.getUserId() != this.client.getHabbo().getHabboInfo().getId() || !(pet instanceof HorsePet)) + return; + + ((HorsePet) pet).setAnyoneCanRide(!((HorsePet) pet).anyoneCanRide()); + ((HorsePet) pet).needsUpdate = true; + + this.client.sendResponse(new RoomPetHorseFigureComposer((HorsePet) pet)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseUseItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseUseItemEvent.java new file mode 100644 index 00000000..ce6b2cff --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/HorseUseItemEvent.java @@ -0,0 +1,179 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.PetStatusUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetHorseFigureComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; + +public class HorseUseItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null) + return; + + HabboItem item = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboItem(itemId); + + if(item == null) + return; + + int petId = this.packet.readInt(); + AbstractPet pet = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(petId); + + if(pet instanceof Pet) + { + if(pet instanceof HorsePet) + { + if(item.getBaseItem().getName().toLowerCase().startsWith("horse_dye")) + { + int race = Integer.valueOf(item.getBaseItem().getName().split("_")[2]); + int raceType = (race * 4) - 2; + + if(race >= 13 && race <= 17) + raceType = ((2 + race) * 4) + 1; + + if(race == 0) + raceType = 0; + + pet.setRace(raceType); + ((HorsePet) pet).needsUpdate = true; + } + else if(item.getBaseItem().getName().toLowerCase().startsWith("horse_hairdye")) + { + int splittedHairdye = Integer.valueOf(item.getBaseItem().getName().toLowerCase().split("_")[2]); + int newHairdye = 48; + + if(splittedHairdye == 0) + { + newHairdye = -1; + } + else if(splittedHairdye == 1) + { + newHairdye = 1; + } + else if(splittedHairdye >= 13 && splittedHairdye <= 17) + { + newHairdye = 68 + splittedHairdye; + } + else + { + newHairdye += splittedHairdye; + } + + ((HorsePet) pet).setHairColor(newHairdye); + ((HorsePet) pet).needsUpdate = true; + } + else if(item.getBaseItem().getName().toLowerCase().startsWith("horse_hairstyle")) + { + int splittedHairstyle = Integer.valueOf(item.getBaseItem().getName().toLowerCase().split("_")[2]); + int newHairstyle = 100; + + if(splittedHairstyle == 0) + { + newHairstyle = -1; + } + else + { + newHairstyle += splittedHairstyle; + } + + ((HorsePet) pet).setHairStyle(newHairstyle); + ((HorsePet) pet).needsUpdate = true; + } + else if(item.getBaseItem().getName().toLowerCase().startsWith("horse_saddle")) + { + ((HorsePet) pet).hasSaddle(true); + ((HorsePet) pet).needsUpdate = true; + } + + if(((HorsePet) pet).needsUpdate) + { + Emulator.getThreading().run(pet); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomPetHorseFigureComposer((HorsePet) pet).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RemoveFloorItemComposer(item).compose()); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + } + else if (pet instanceof MonsterplantPet) + { + if (item.getBaseItem().getName().equalsIgnoreCase("mnstr_revival")) + { + if (((MonsterplantPet) pet).isDead()) + { + ((MonsterplantPet) pet).setDeathTimestamp(Emulator.getIntUnixTimestamp() + MonsterplantPet.timeToLive); + pet.getRoomUnit().getStatus().clear(); + pet.getRoomUnit().getStatus().put("gst", "rev"); + ((MonsterplantPet) pet).packetUpdate = true; + + this.client.getHabbo().getHabboInfo().getCurrentRoom().removeHabboItem(item); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RemoveFloorItemComposer(item).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserStatusComposer(pet.getRoomUnit()).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new PetStatusUpdateComposer((Pet)pet).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().updateTiles(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("MonsterPlantHealer")); + pet.getRoomUnit().getStatus().remove("gst"); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + } + else if (item.getBaseItem().getName().equalsIgnoreCase("mnstr_fert")) + { + if (!((MonsterplantPet) pet).isFullyGrown()) + { + pet.setCreated(pet.getCreated() - MonsterplantPet.growTime); + pet.getRoomUnit().getStatus().clear(); + ((MonsterplantPet) pet).cycle(); + pet.getRoomUnit().getStatus().put("gst", "spd"); + pet.getRoomUnit().getStatus().put("grw" + ((MonsterplantPet) pet).getGrowthStage(), ""); + this.client.getHabbo().getHabboInfo().getCurrentRoom().removeHabboItem(item); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RemoveFloorItemComposer(item).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserStatusComposer(pet.getRoomUnit()).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new PetStatusUpdateComposer((Pet)pet).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().updateTiles(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); + pet.getRoomUnit().getStatus().remove("gst"); + ((MonsterplantPet) pet).cycle(); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + } + else if (item.getBaseItem().getName().startsWith("mnstr_rebreed")) + { + if (((MonsterplantPet) pet).isFullyGrown() && !((MonsterplantPet) pet).canBreed()) + { + if ( + (item.getBaseItem().getName().equalsIgnoreCase("mnstr_rebreed") && ((MonsterplantPet) pet).getRarity() <= 5) || + (item.getBaseItem().getName().equalsIgnoreCase("mnstr_rebreed_2") && ((MonsterplantPet) pet).getRarity() >= 6 && ((MonsterplantPet) pet).getRarity() <= 8) || + (item.getBaseItem().getName().equalsIgnoreCase("mnstr_rebreed_3") && ((MonsterplantPet) pet).getRarity() >= 9) + ) + + { + ((MonsterplantPet) pet).setCanBreed(true); + pet.getRoomUnit().getStatus().clear(); + pet.getRoomUnit().getStatus().put("gst", "reb"); + + this.client.getHabbo().getHabboInfo().getCurrentRoom().removeHabboItem(item); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RemoveFloorItemComposer(item).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserStatusComposer(pet.getRoomUnit()).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new PetStatusUpdateComposer((Pet)pet).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().updateTiles(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); + pet.getRoomUnit().getStatus().remove("gst"); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java new file mode 100644 index 00000000..81b877ae --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +public class MovePetEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + AbstractPet pet = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(this.packet.readInt()); + + if (pet != null) + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null && room.hasRights(this.client.getHabbo())) + { + if (pet.getRoomUnit() != null) + { + int x = this.packet.readInt(); + int y = this.packet.readInt(); + + RoomTile tile = room.getLayout().getTile((short)x, (short)y); + + if (tile != null) + { + pet.getRoomUnit().setLocation(tile); + pet.getRoomUnit().setZ(this.packet.readInt()); + room.sendComposer(new RoomUserStatusComposer(pet.getRoomUnit()).compose()); + pet.needsUpdate = true; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPackageNameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPackageNameEvent.java new file mode 100644 index 00000000..1f0c2db5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPackageNameEvent.java @@ -0,0 +1,93 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.AddPetComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.PetPackageNameValidationComposer; +import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; + +public class PetPackageNameEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + String name = this.packet.readString(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if (room != null) + { + HabboItem item = room.getHabboItem(itemId); + if (item != null) + { + if (item.getUserId() == this.client.getHabbo().getHabboInfo().getId()) + { + if (name.matches("^[a-zA-Z0-9]*$")) + { + Pet pet = null; + + if (item.getBaseItem().getName().equalsIgnoreCase("val11_present")) + { + pet = Emulator.getGameEnvironment().getPetManager().createPet(11, name, this.client); + } + + if (item.getBaseItem().getName().equalsIgnoreCase("gnome_box")) + { + pet = Emulator.getGameEnvironment().getPetManager().createGnome(name, room, this.client.getHabbo()); + } + + if (item.getBaseItem().getName().equalsIgnoreCase("leprechaun_box")) + { + pet = Emulator.getGameEnvironment().getPetManager().createLeprechaun(name, room, this.client.getHabbo()); + } + + if (item.getBaseItem().getName().equalsIgnoreCase("velociraptor_egg")) + { + pet = Emulator.getGameEnvironment().getPetManager().createPet(34, name, this.client); + } + + if (item.getBaseItem().getName().equalsIgnoreCase("pterosaur_egg")) + { + pet = Emulator.getGameEnvironment().getPetManager().createPet(33, name, this.client); + } + + if (item.getBaseItem().getName().equalsIgnoreCase("petbox_epic")) + { + pet = Emulator.getGameEnvironment().getPetManager().createPet(32, name, this.client); + } + + if (pet != null) + { + room.placePet((AbstractPet) pet, item.getX(), item.getY(), item.getZ(), item.getRotation()); + pet.setUserId(this.client.getHabbo().getHabboInfo().getId()); + pet.needsUpdate = true; + pet.getRoomUnit().setLocation(room.getLayout().getTile(item.getX(), item.getY())); + pet.getRoomUnit().setZ(item.getZ()); + Emulator.getThreading().run(new QueryDeleteHabboItem(item)); + room.removeHabboItem(item); + room.updateTile(room.getLayout().getTile(item.getX(), item.getY())); + item.setUserId(0); + room.sendComposer(new RemoveFloorItemComposer(item).compose()); + } + } + else + { + this.client.sendResponse(new PetPackageNameValidationComposer(itemId, PetPackageNameValidationComposer.CONTAINS_INVALID_CHARS, name.replaceAll("^[a-zA-Z0-9]*$", ""))); + return; + } + } + } + } + + + this.client.sendResponse(new PetPackageNameValidationComposer(itemId, PetPackageNameValidationComposer.CLOSE_WIDGET, "")); + return; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPickupEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPickupEvent.java new file mode 100644 index 00000000..d4664de0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPickupEvent.java @@ -0,0 +1,66 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.AddPetComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; + +public class PetPickupEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + Pet pet = (Pet)room.getPet(petId); + + if (pet != null) + { + if (this.client.getHabbo().getHabboInfo().getId() == pet.getId() || room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + if (this.client.getHabbo().getInventory().getPetsComponent().getPets().size() >= Emulator.getConfig().getInt("hotel.pets.max.inventory") && !this.client.getHabbo().hasPermission("acc_unlimited_pets")) + { + this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(Emulator.getTexts().getValue("error.pets.max.inventory"), this.client.getHabbo(), this.client.getHabbo(), RoomChatMessageBubbles.ALERT))); + + //TODO: Add message: Max inventory reached + //error.pets.max.inventory + return; + } + room.sendComposer(new RoomUserRemoveComposer(pet.getRoomUnit()).compose()); + room.removePet(petId); + pet.setRoomUnit(null); + pet.setRoom(null); + pet.needsUpdate = true; + + Emulator.getThreading().run(pet); + + if (this.client.getHabbo().getHabboInfo().getId() == pet.getUserId()) + { + this.client.sendResponse(new AddPetComposer(pet)); + this.client.getHabbo().getInventory().getPetsComponent().addPet(pet); + } + else + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(pet.getUserId()); + + if (habbo != null) + { + habbo.getClient().sendResponse(new AddPetComposer(pet)); + habbo.getInventory().getPetsComponent().addPet(pet); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPlaceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPlaceEvent.java new file mode 100644 index 00000000..920d0dd6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PetPlaceEvent.java @@ -0,0 +1,114 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.PetErrorComposer; +import com.eu.habbo.messages.outgoing.inventory.RemovePetComposer; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetComposer; + +public class PetPlaceEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(this.client.getHabbo().getHabboInfo().getId() != room.getOwnerId() && !room.isAllowPets() && !(this.client.getHabbo().hasPermission("acc_anyroomowner") || this.client.getHabbo().hasPermission("acc_placefurni"))) + { + this.client.sendResponse(new PetErrorComposer(PetErrorComposer.ROOM_ERROR_PETS_FORBIDDEN_IN_FLAT)); + return; + } + + int petId = this.packet.readInt(); + + Pet pet = this.client.getHabbo().getInventory().getPetsComponent().getPet(petId); + + if(pet == null) + { + return; + } + if(room.getCurrentPets().size() >= Room.MAXIMUM_PETS && !this.client.getHabbo().hasPermission("acc_unlimited_pets")) + { + this.client.sendResponse(new PetErrorComposer(PetErrorComposer.ROOM_ERROR_MAX_PETS)); + return; + } + + int x = this.packet.readInt(); + int y = this.packet.readInt(); + + RoomTile tile = null; + RoomTile playerTile = this.client.getHabbo().getRoomUnit().getCurrentLocation(); + + if ((x == 0 && y == 0) || !room.isOwner(this.client.getHabbo())) + { + //Place the pet in front of the player. + tile = room.getLayout().getTileInFront(this.client.getHabbo().getRoomUnit().getCurrentLocation(), this.client.getHabbo().getRoomUnit().getBodyRotation().getValue()); + + if (tile == null || !tile.isWalkable()) + { + //Find a walkable tile around the player. + for (RoomTile t : room.getLayout().getTilesAround(this.client.getHabbo().getRoomUnit().getCurrentLocation())) + { + if (t != null && t.isWalkable()) + { + tile = t; + break; + } + } + } + + //Check if tile exists and is walkable. Else place it in the current location the Habbo is standing. + if (tile == null || !tile.isWalkable()) + { + tile = playerTile; + + //If the current tile is not walkable, place it at the door. + if (tile == null || !tile.isWalkable()) + { + tile = room.getLayout().getDoorTile(); + } + } + } + else + { + tile = room.getLayout().getTile((short) x, (short) y); + } + + if(tile == null || !tile.isWalkable() || !tile.allowStack()) + { + this.client.sendResponse(new PetErrorComposer(PetErrorComposer.ROOM_ERROR_PETS_SELECTED_TILE_NOT_FREE)); + return; + } + + pet.setRoom(room); + RoomUnit roomUnit = pet.getRoomUnit(); + + if(roomUnit == null) + { + roomUnit = new RoomUnit(); + } + + roomUnit.setPathFinderRoom(room); + + roomUnit.setLocation(tile); + roomUnit.setZ(tile.getStackHeight()); + roomUnit.getStatus().put("sit", "0"); + roomUnit.setRoomUnitType(RoomUnitType.PET); + if (playerTile != null) + { + roomUnit.lookAtPoint(playerTile); + } + pet.setRoomUnit(roomUnit); + room.addPet(pet); + pet.needsUpdate = true; + Emulator.getThreading().run(pet); + room.sendComposer(new RoomPetComposer(pet).compose()); + this.client.getHabbo().getInventory().getPetsComponent().removePet(pet); + this.client.sendResponse(new RemovePetComposer(pet)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetInformationEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetInformationEvent.java new file mode 100644 index 00000000..060dbffb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetInformationEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.pets.PetInformationComposer; + +public class RequestPetInformationEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + AbstractPet pet = room.getPet(petId); + + if(pet != null) + { + this.client.sendResponse(new PetInformationComposer(pet, room)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetTrainingPanelEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetTrainingPanelEvent.java new file mode 100644 index 00000000..acf67e1d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RequestPetTrainingPanelEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.pets.PetTrainingPanelComposer; + +public class RequestPetTrainingPanelEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + Pet pet = (Pet) this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(petId); + + if(pet != null) + this.client.sendResponse(new PetTrainingPanelComposer(pet)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ScratchPetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ScratchPetEvent.java new file mode 100644 index 00000000..083db05b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ScratchPetEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetRespectComposer; + +public class ScratchPetEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + Pet pet = (Pet)this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(petId); + + if(pet != null) + { + if(this.client.getHabbo().getHabboStats().petRespectPointsToGive > 0 || pet instanceof MonsterplantPet) + { + pet.scratched(this.client.getHabbo()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ToggleMonsterplantBreedableEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ToggleMonsterplantBreedableEvent.java new file mode 100644 index 00000000..4445ad32 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ToggleMonsterplantBreedableEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ToggleMonsterplantBreedableEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int petId = this.packet.readInt(); + + AbstractPet pet = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(petId); + + if (pet != null) + { + if (pet.getUserId() == this.client.getHabbo().getHabboInfo().getId()) + { + if (pet instanceof MonsterplantPet) + { + ((MonsterplantPet) pet).setPubliclyBreedable(((MonsterplantPet) pet).isPubliclyBreedable()); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java new file mode 100644 index 00000000..4e20c418 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/BuyRoomPromotionEvent.java @@ -0,0 +1,67 @@ +package com.eu.habbo.messages.incoming.rooms.promotions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.catalog.AlertPurchaseFailedComposer; +import com.eu.habbo.messages.outgoing.catalog.PurchaseOKComposer; +import com.eu.habbo.messages.outgoing.rooms.promotions.RoomPromotionMessageComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; + +public class BuyRoomPromotionEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int pageId = this.packet.readInt(); + int itemId = this.packet.readInt(); + int roomId = this.packet.readInt(); + String title = this.packet.readString(); + boolean unknown1 = this.packet.readBoolean(); + String description = this.packet.readString(); + int categoryId = this.packet.readInt(); + + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(pageId); + + if(page != null) + { + CatalogItem item = page.getCatalogItem(itemId); + if(item != null) + { + if(this.client.getHabbo().getHabboInfo().canBuy(item)) + { + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if (!(room.isOwner(this.client.getHabbo()) || room.hasRights(this.client.getHabbo()) || room.guildRightLevel(this.client.getHabbo()) == 3)) + { + return; + } + + if (room.isPromoted()) + { + room.getPromotion().addEndTimestamp(120 * 60); + } else + { + room.createPromotion(title, description); + } + + if(room.isPromoted()) + { + if (!this.client.getHabbo().hasPermission("acc_infinite_credits")) + this.client.getHabbo().giveCredits(-item.getCredits()); + if (!this.client.getHabbo().hasPermission("acc_infinite_points")) + this.client.getHabbo().givePoints(item.getPointsType(), -item.getPoints()); + this.client.sendResponse(new PurchaseOKComposer()); + room.sendComposer(new RoomPromotionMessageComposer(room, room.getPromotion()).compose()); + } + else + { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/RequestPromotionRoomsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/RequestPromotionRoomsEvent.java new file mode 100644 index 00000000..32909f90 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/RequestPromotionRoomsEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.rooms.promotions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.promotions.PromoteOwnRoomsListComposer; + +import java.util.List; + +public class RequestPromotionRoomsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + List roomsToShow = Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo()); + roomsToShow.addAll(Emulator.getGameEnvironment().getRoomManager().getRoomsWithRights(this.client.getHabbo())); + roomsToShow.addAll(Emulator.getGameEnvironment().getRoomManager().getRoomsWithAdminRights(this.client.getHabbo())); + this.client.sendResponse(new PromoteOwnRoomsListComposer(roomsToShow)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/UpdateRoomPromotionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/UpdateRoomPromotionEvent.java new file mode 100644 index 00000000..d559b2cd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/promotions/UpdateRoomPromotionEvent.java @@ -0,0 +1,42 @@ +package com.eu.habbo.messages.incoming.rooms.promotions; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomPromotion; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.promotions.RoomPromotionMessageComposer; + + +public class UpdateRoomPromotionEvent extends MessageHandler +{ + + @Override + public void handle() throws Exception + { + + int id = this.packet.readInt(); + String promotionName = this.packet.readString(); + String promotionDescription = this.packet.readString(); + + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(id); + + if (room == null || room.getOwnerId() != this.client.getHabbo().getHabboInfo().getId() || !this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + return; + } + + RoomPromotion roomPromotion = room.getPromotion(); + + if (roomPromotion != null) + { + + roomPromotion.setTitle(promotionName); + roomPromotion.setDescription(promotionDescription); + + roomPromotion.needsUpdate = true; + roomPromotion.save(); + + room.sendComposer(new RoomPromotionMessageComposer(room, roomPromotion).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/IgnoreRoomUserEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/IgnoreRoomUserEvent.java new file mode 100644 index 00000000..0d410c2d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/IgnoreRoomUserEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserIgnoredComposer; + +public class IgnoreRoomUserEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + String username = this.packet.readString(); + + Habbo habbo = room.getHabbo(username); + + if(habbo != null) + { + if(habbo == this.client.getHabbo()) + return; + + { + this.client.getHabbo().getHabboStats().ignoredUsers.add(habbo.getHabboInfo().getId()); + this.client.sendResponse(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.IGNORED)); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModIgnoreSeen")); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RequestRoomUserTagsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RequestRoomUserTagsEvent.java new file mode 100644 index 00000000..3e72bf39 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RequestRoomUserTagsEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTagsComposer; + +public class RequestRoomUserTagsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int roomUnitId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + Habbo habbo = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabboByRoomUnitId(roomUnitId); + + if(habbo != null) + { + this.client.sendResponse(new RoomUserTagsComposer(habbo)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserActionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserActionEvent.java new file mode 100644 index 00000000..6e2911a1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserActionEvent.java @@ -0,0 +1,70 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserActionComposer; +import com.eu.habbo.plugin.events.users.UserIdleEvent; + +public class RoomUserActionEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room != null) + { + Habbo habbo = this.client.getHabbo(); + + if(this.client.getHabbo().getRoomUnit().getCacheable().get("control") != null) + { + habbo = (Habbo)this.client.getHabbo().getRoomUnit().getCacheable().get("control"); + + if(habbo.getHabboInfo().getCurrentRoom() != room) + { + habbo.getRoomUnit().getCacheable().remove("controller"); + this.client.getHabbo().getRoomUnit().getCacheable().remove("control"); + habbo = this.client.getHabbo(); + } + } + + int action = this.packet.readInt(); + + if(action == 5) + { + UserIdleEvent event = new UserIdleEvent(this.client.getHabbo(), UserIdleEvent.IdleReason.ACTION, true); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (event.idle) + { + room.idle(habbo); + } + else + { + room.unIdle(habbo); + } + } + } + else + { + UserIdleEvent event = new UserIdleEvent(this.client.getHabbo(), UserIdleEvent.IdleReason.ACTION, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (!event.idle) + { + room.unIdle(habbo); + } + } + + } + + room.sendComposer(new RoomUserActionComposer(habbo.getRoomUnit(), RoomUserAction.fromValue(action)).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserBanEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserBanEvent.java new file mode 100644 index 00000000..1519abe7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserBanEvent.java @@ -0,0 +1,18 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomManager; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomUserBanEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + int roomId = this.packet.readInt(); + String banName = this.packet.readString(); + + Emulator.getGameEnvironment().getRoomManager().banUserFromRoom(this.client.getHabbo(), userId, roomId, RoomManager.RoomBanTypes.valueOf(banName)); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDanceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDanceEvent.java new file mode 100644 index 00000000..160bf592 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDanceEvent.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.DanceType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDanceComposer; +import com.eu.habbo.plugin.events.users.UserIdleEvent; + +public class RoomUserDanceEvent extends MessageHandler { + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + int danceId = this.packet.readInt(); + if(danceId >= 0 && danceId <= 5) + { + if (this.client.getHabbo().getRoomUnit().isInRoom()) + { + + Habbo habbo = this.client.getHabbo(); + + if(this.client.getHabbo().getRoomUnit().getCacheable().get("control") != null) + { + habbo = (Habbo)this.client.getHabbo().getRoomUnit().getCacheable().get("control"); + + if(habbo.getHabboInfo().getCurrentRoom() != this.client.getHabbo().getHabboInfo().getCurrentRoom()) + { + habbo.getRoomUnit().getCacheable().remove("controller"); + this.client.getHabbo().getRoomUnit().getCacheable().remove("control"); + habbo = this.client.getHabbo(); + } + } + + habbo.getRoomUnit().setDanceType(DanceType.values()[danceId]); + + UserIdleEvent event = new UserIdleEvent(this.client.getHabbo(), UserIdleEvent.IdleReason.DANCE, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (!event.idle) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().unIdle(habbo); + } + } + + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDanceComposer(habbo.getRoomUnit()).compose()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDropHandItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDropHandItemEvent.java new file mode 100644 index 00000000..b54fc760 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserDropHandItemEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserHandItemComposer; + +public class RoomUserDropHandItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + this.client.getHabbo().getRoomUnit().setHandItem(0); + if(room != null) + { + room.unIdle(this.client.getHabbo()); + room.sendComposer(new RoomUserHandItemComposer(this.client.getHabbo().getRoomUnit()).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveHandItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveHandItemEvent.java new file mode 100644 index 00000000..cfb1718e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveHandItemEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.threading.runnables.HabboGiveHandItemToHabbo; +import com.eu.habbo.threading.runnables.RoomUnitWalkToRoomUnit; + +import java.util.ArrayList; +import java.util.List; + +public class RoomUserGiveHandItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + Habbo target = room.getHabbo(userId); + + if(target != null) + { + List executable = new ArrayList(); + executable.add(new HabboGiveHandItemToHabbo(this.client.getHabbo(), target)); + Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(this.client.getHabbo().getRoomUnit(), target.getRoomUnit(), this.client.getHabbo().getHabboInfo().getCurrentRoom(), executable, executable)); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRespectEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRespectEvent.java new file mode 100644 index 00000000..e619de7e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRespectEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserActionComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRespectComposer; + +public class RoomUserGiveRespectEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + + if(this.client.getHabbo().getHabboStats().respectPointsToGive > 0) + { + Habbo target = this.client.getHabbo().getHabboInfo().getCurrentRoom().getHabbo(userId); + + if(target != null && target != this.client.getHabbo()) + { + target.getHabboStats().respectPointsReceived++; + this.client.getHabbo().getHabboStats().respectPointsGiven++; + this.client.getHabbo().getHabboStats().respectPointsToGive--; + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserRespectComposer(target).compose()); + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserActionComposer(this.client.getHabbo().getRoomUnit(), RoomUserAction.THUMB_UP).compose()); + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectGiven")); + AchievementManager.progressAchievement(target, Emulator.getGameEnvironment().getAchievementManager().getAchievement("RespectEarned")); + + this.client.getHabbo().getHabboInfo().getCurrentRoom().unIdle(this.client.getHabbo()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRightsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRightsEvent.java new file mode 100644 index 00000000..a118d6f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserGiveRightsEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.RoomAddRightsListComposer; +import com.eu.habbo.plugin.events.users.UserRightsGivenEvent; + +public class RoomUserGiveRightsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + Habbo target = room.getHabbo(userId); + + if(!Emulator.getPluginManager().fireEvent(new UserRightsGivenEvent(this.client.getHabbo(), target)).isCancelled()) + { + room.giveRights(target); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserKickEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserKickEvent.java new file mode 100644 index 00000000..c224363f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserKickEvent.java @@ -0,0 +1,53 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.plugin.events.users.UserKickEvent; + +public class RoomUserKickEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + int userId = this.packet.readInt(); + + Habbo target = room.getHabbo(userId); + + if(target == null) + return; + + if (target.hasPermission("acc_unkickable")) + { + this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage(Emulator.getTexts().getValue("commands.error.cmd_kick.unkickable").replace("%username%", target.getHabboInfo().getUsername()), this.client.getHabbo(), this.client.getHabbo(), RoomChatMessageBubbles.ALERT))); + return; + } + + if (room.isOwner(target)) + { + return; + } + + UserKickEvent event = new UserKickEvent(this.client.getHabbo(), target); + Emulator.getPluginManager().fireEvent(event); + + if(event.isCancelled()) + return; + + if(room.hasRights(this.client.getHabbo()) || this.client.getHabbo().hasPermission("acc_anyroomowner") || this.client.getHabbo().hasPermission("acc_ambassador")) + { + room.kickHabbo(target, true); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModKickSeen")); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserLookAtPoint.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserLookAtPoint.java new file mode 100644 index 00000000..64a87241 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserLookAtPoint.java @@ -0,0 +1,72 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.plugin.events.users.UserIdleEvent; + +public class RoomUserLookAtPoint extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null) + return; + + Habbo habbo = this.client.getHabbo(); + + if(habbo.getRoomUnit().getCacheable().get("control") != null) + { + habbo = (Habbo)this.client.getHabbo().getRoomUnit().getCacheable().get("control"); + + if(habbo.getHabboInfo().getCurrentRoom() != this.client.getHabbo().getHabboInfo().getCurrentRoom()) + { + habbo.getRoomUnit().getCacheable().remove("controller"); + this.client.getHabbo().getRoomUnit().getCacheable().remove("control"); + habbo = this.client.getHabbo(); + } + } + + RoomUnit roomUnit = habbo.getRoomUnit(); + + if(!roomUnit.canWalk()) + return; + + if(roomUnit.isWalking() || roomUnit.getStatus().containsKey("mv")) + return; + + if (roomUnit.cmdLay || roomUnit.getStatus().containsKey("lay")) + return; + + int x = this.packet.readInt(); + int y = this.packet.readInt(); + + if(x == roomUnit.getX() && y == roomUnit.getY()) + return; + + RoomTile tile = habbo.getHabboInfo().getCurrentRoom().getLayout().getTile((short) x, (short) y); + + if (tile != null) + { + roomUnit.lookAtPoint(tile); + + UserIdleEvent event = new UserIdleEvent(habbo, UserIdleEvent.IdleReason.WALKED, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (!event.idle) + { + room.unIdle(habbo); + } + } + + room.sendComposer(new RoomUserStatusComposer(roomUnit).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserMuteEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserMuteEvent.java new file mode 100644 index 00000000..ef5a6861 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserMuteEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.MutedWhisperComposer; + +public class RoomUserMuteEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + int roomId = this.packet.readInt(); + int minutes = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if (room != null) + { + if (room.hasRights(this.client.getHabbo()) || this.client.getHabbo().hasPermission("cmd_mute") || this.client.getHabbo().hasPermission("acc_ambassador")) + { + Habbo habbo = room.getHabbo(userId); + + if (habbo != null) + { + room.muteHabbo(habbo, minutes); + habbo.getClient().sendResponse(new MutedWhisperComposer(minutes * 60)); + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SelfModMuteSeen")); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserRemoveRightsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserRemoveRightsEvent.java new file mode 100644 index 00000000..fcab6904 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserRemoveRightsEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomUserRemoveRightsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int amount = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + if(room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner")) + { + for(int i = 0; i < amount; i++) + { + int userId = this.packet.readInt(); + + room.removeRights(userId); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserShoutEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserShoutEvent.java new file mode 100644 index 00000000..b872b19d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserShoutEvent.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatType; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserTalkEvent; + +public class RoomUserShoutEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + if(!this.client.getHabbo().getHabboStats().allowTalk()) + return; + + + RoomChatMessage message = new RoomChatMessage(this); + + if (Emulator.getPluginManager().fireEvent(new UserTalkEvent(this.client.getHabbo(), message, RoomChatType.SHOUT)).isCancelled()) + { + return; + } + + this.client.getHabbo().getHabboInfo().getCurrentRoom().talk(this.client.getHabbo(), message, RoomChatType.SHOUT); + + if (!message.isCommand) + { + if(RoomChatMessage.SAVE_ROOM_CHATS) + { + Emulator.getThreading().run(message); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSignEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSignEvent.java new file mode 100644 index 00000000..b44b2498 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSignEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class RoomUserSignEvent extends MessageHandler { + @Override + public void handle() throws Exception { + int signId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + this.client.getHabbo().getRoomUnit().getStatus().put("sign", signId + ""); + this.client.getHabbo().getHabboInfo().getCurrentRoom().unIdle(this.client.getHabbo()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSitEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSitEvent.java new file mode 100644 index 00000000..8f46fdfb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserSitEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserIdleEvent; + +public class RoomUserSitEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + if(this.client.getHabbo().getRoomUnit().isWalking()) + { + this.client.getHabbo().getRoomUnit().stopWalking(); + } + this.client.getHabbo().getHabboInfo().getCurrentRoom().makeSit(this.client.getHabbo()); + + UserIdleEvent event = new UserIdleEvent(this.client.getHabbo(), UserIdleEvent.IdleReason.WALKED, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) + { + if (!event.idle) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().unIdle(this.client.getHabbo()); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStartTypingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStartTypingEvent.java new file mode 100644 index 00000000..cd82360a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStartTypingEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTypingComposer; + +public class RoomUserStartTypingEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + { + return; + } + + if(this.client.getHabbo().getRoomUnit() == null) + { + return; + } + + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTypingComposer(this.client.getHabbo().getRoomUnit(), true).compose()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStopTypingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStopTypingEvent.java new file mode 100644 index 00000000..383ba385 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserStopTypingEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTypingComposer; + +public class RoomUserStopTypingEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + { + return; + } + + if(this.client.getHabbo().getRoomUnit() == null) + { + return; + } + + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserTypingComposer(this.client.getHabbo().getRoomUnit(), false).compose()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserTalkEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserTalkEvent.java new file mode 100644 index 00000000..cbdfba7b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserTalkEvent.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserTalkComposer; +import com.eu.habbo.plugin.events.users.UserTalkEvent; + +public class RoomUserTalkEvent extends MessageHandler { + + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if(room == null) + return; + + if(!this.client.getHabbo().getHabboStats().allowTalk()) + return; + + RoomChatMessage message = new RoomChatMessage(this); + + if (Emulator.getPluginManager().fireEvent(new UserTalkEvent(this.client.getHabbo(), message, RoomChatType.TALK)).isCancelled()) + { + return; + } + + room.talk(this.client.getHabbo(), message, RoomChatType.TALK); + + if (!message.isCommand) + { + if(RoomChatMessage.SAVE_ROOM_CHATS) + { + Emulator.getThreading().run(message); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java new file mode 100644 index 00000000..81fa9617 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java @@ -0,0 +1,91 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUnitOnRollerComposer; + +public class RoomUserWalkEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + int x = this.packet.readInt(); + int y = this.packet.readInt(); + + Habbo habbo = this.client.getHabbo(); + RoomUnit roomUnit = this.client.getHabbo().getRoomUnit(); + + if (roomUnit.isTeleporting) + return; + + if (roomUnit.isKicked) + return; + + if (roomUnit.getCacheable().get("control") != null) + { + habbo = (Habbo) roomUnit.getCacheable().get("control"); + + if (habbo.getHabboInfo().getCurrentRoom() != this.client.getHabbo().getHabboInfo().getCurrentRoom()) + { + habbo.getRoomUnit().getCacheable().remove("controller"); + this.client.getHabbo().getRoomUnit().getCacheable().remove("control"); + habbo = this.client.getHabbo(); + } + } + + roomUnit = habbo.getRoomUnit(); + + try + { + if (roomUnit != null && roomUnit.isInRoom() && roomUnit.canWalk()) + { + if (!roomUnit.cmdTeleport) + { + if (habbo.getHabboInfo().getRiding() != null && habbo.getHabboInfo().getRiding().getTask() != null && habbo.getHabboInfo().getRiding().getTask().equals(PetTasks.JUMP)) + return; + + if (x == roomUnit.getX() && y == roomUnit.getY()) + return; + + RoomTile tile = habbo.getHabboInfo().getCurrentRoom().getLayout().getTile((short) x, (short) y); + + if (tile == null) + { + return; + } + + if (habbo.getRoomUnit().getStatus().containsKey("lay")) + { + if (habbo.getHabboInfo().getCurrentRoom().getLayout().getTilesInFront(habbo.getRoomUnit().getCurrentLocation(), habbo.getRoomUnit().getBodyRotation().getValue(), 2).contains(tile)) + return; + } + if (tile.isWalkable() || habbo.getHabboInfo().getCurrentRoom().canSitOrLayAt(tile.x, tile.y)) + { + roomUnit.setGoalLocation(tile); + } + } + else + { + RoomTile t = habbo.getHabboInfo().getCurrentRoom().getLayout().getTile((short) x, (short) y); + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUnitOnRollerComposer(roomUnit, null, t, habbo.getHabboInfo().getCurrentRoom()).compose()); + + if (habbo.getHabboInfo().getRiding() != null) + { + habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUnitOnRollerComposer(habbo.getHabboInfo().getRiding().getRoomUnit(), null, t, habbo.getHabboInfo().getCurrentRoom()).compose()); + } + } + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWhisperEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWhisperEvent.java new file mode 100644 index 00000000..a16e76ac --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWhisperEvent.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatType; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.plugin.events.users.UserTalkEvent; + +public class RoomUserWhisperEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + RoomChatMessage chatMessage = new RoomChatMessage(this); + + if(!this.client.getHabbo().getHabboStats().allowTalk() || chatMessage.getTargetHabbo() == null) + return; + + if (Emulator.getPluginManager().fireEvent(new UserTalkEvent(this.client.getHabbo(), chatMessage, RoomChatType.WHISPER)).isCancelled()) + { + return; + } + + this.client.getHabbo().getHabboInfo().getCurrentRoom().talk(this.client.getHabbo(), chatMessage, RoomChatType.WHISPER, true); + + if(RoomChatMessage.SAVE_ROOM_CHATS) + { + Emulator.getThreading().run(chatMessage); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnIgnoreRoomUserEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnIgnoreRoomUserEvent.java new file mode 100644 index 00000000..f88e4ad7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnIgnoreRoomUserEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserIgnoredComposer; + +public class UnIgnoreRoomUserEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + String username = this.packet.readString(); + + Habbo habbo = room.getHabbo(username); + + if(habbo != null) + { + if(!habbo.getHabboStats().allowTalk()) + { + this.client.getHabbo().getHabboStats().ignoredUsers.remove(habbo.getHabboInfo().getId()); + this.client.sendResponse(new RoomUserIgnoredComposer(habbo, RoomUserIgnoredComposer.UNIGNORED)); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnbanRoomUserEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnbanRoomUserEvent.java new file mode 100644 index 00000000..8eb488fe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/UnbanRoomUserEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.incoming.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class UnbanRoomUserEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + int roomId = this.packet.readInt(); + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); + + if(room != null) + { + if(room.isOwner(this.client.getHabbo())) + { + room.unbanHabbo(userId); + } + } + + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeAcceptEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeAcceptEvent.java new file mode 100644 index 00000000..88c30feb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeAcceptEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeAcceptEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Habbo habbo = this.client.getHabbo(); + RoomTrade trade = habbo.getHabboInfo().getCurrentRoom().getActiveTradeForHabbo(habbo); + + if(trade == null) + return; + + trade.accept(habbo, true); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelEvent.java new file mode 100644 index 00000000..2d86136b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeCancelEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Habbo habbo = this.client.getHabbo(); + Room room = habbo.getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + RoomTrade trade = room.getActiveTradeForHabbo(habbo); + + if(trade == null) + return; + + trade.stopTrade(habbo); + room.stopTrade(trade); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelOfferItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelOfferItemEvent.java new file mode 100644 index 00000000..272a74c3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCancelOfferItemEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeCancelOfferItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + RoomTrade trade = this.client.getHabbo().getHabboInfo().getCurrentRoom().getActiveTradeForHabbo(this.client.getHabbo()); + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(itemId); + + if(trade == null || trade.getRoomTradeUserForHabbo(this.client.getHabbo()).getAccepted() || item == null) + { + return; + } + + trade.removeItem(this.client.getHabbo(), item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCloseEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCloseEvent.java new file mode 100644 index 00000000..dc8db6b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeCloseEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeCloseEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Habbo habbo = this.client.getHabbo(); + Room room = habbo.getHabboInfo().getCurrentRoom(); + + if(room == null) + return; + + RoomTrade trade = room.getActiveTradeForHabbo(habbo); + + if(trade == null) + return; + + trade.stopTrade(habbo); + room.stopTrade(trade); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeConfirmEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeConfirmEvent.java new file mode 100644 index 00000000..6ed9a209 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeConfirmEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeConfirmEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Habbo habbo = this.client.getHabbo(); + RoomTrade trade = habbo.getHabboInfo().getCurrentRoom().getActiveTradeForHabbo(habbo); + + if(trade == null || !trade.getRoomTradeUserForHabbo(habbo).getAccepted()) + return; + + trade.confirm(habbo); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferItemEvent.java new file mode 100644 index 00000000..41483c50 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferItemEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeOfferItemEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + RoomTrade trade = this.client.getHabbo().getHabboInfo().getCurrentRoom().getActiveTradeForHabbo(this.client.getHabbo()); + + if(trade == null) + return; + + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(this.packet.readInt()); + + if(item == null) + return; + + trade.offerItem(this.client.getHabbo(), item); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferMultipleItemsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferMultipleItemsEvent.java new file mode 100644 index 00000000..6767f2b2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferMultipleItemsEvent.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.incoming.MessageHandler; +import gnu.trove.set.hash.THashSet; + +public class TradeOfferMultipleItemsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() == null) + return; + + RoomTrade trade = this.client.getHabbo().getHabboInfo().getCurrentRoom().getActiveTradeForHabbo(this.client.getHabbo()); + + if(trade == null) + return; + + THashSet items = new THashSet(); + + int count = this.packet.readInt(); + for(int i = 0; i < count; i++) + { + HabboItem item = this.client.getHabbo().getInventory().getItemsComponent().getHabboItem(this.packet.readInt()); + if(item != null) + { + items.add(item); + } + } + + trade.offerMultipleItems(this.client.getHabbo(), items); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeStartEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeStartEvent.java new file mode 100644 index 00000000..ed510106 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeStartEvent.java @@ -0,0 +1,77 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.trading.TradeStartFailComposer; + +public class TradeStartEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + if (room != null) + { + if (userId >= 0 && userId != this.client.getHabbo().getRoomUnit().getId()) + { + Habbo targetUser = room.getHabboByRoomUnitId(userId); + + if (this.client.getHabbo().hasPermission("acc_trade_anywhere")) + { + room.startTrade(this.client.getHabbo(), targetUser); + return; + } + + if (!RoomTrade.TRADING_ENABLED) + { + this.client.sendResponse(new TradeStartFailComposer(TradeStartFailComposer.HOTEL_TRADING_NOT_ALLOWED)); + return; + } + + if (room.getTradeMode() == 0 || (room.getTradeMode() == 1 && this.client.getHabbo().getHabboInfo().getId() != room.getOwnerId())) + { + this.client.sendResponse(new TradeStartFailComposer(TradeStartFailComposer.ROOM_TRADING_NOT_ALLOWED)); + return; + } + + if (targetUser != null) + { + if (!this.client.getHabbo().getRoomUnit().getStatus().containsKey("trd")) + { + if (this.client.getHabbo().getHabboStats().allowTrade) + { + if (!targetUser.getRoomUnit().getStatus().containsKey("trd")) + { + if (targetUser.getHabboStats().allowTrade) + { + room.startTrade(this.client.getHabbo(), targetUser); + } + else + { + this.client.sendResponse(new TradeStartFailComposer(TradeStartFailComposer.TARGET_TRADING_NOT_ALLOWED, targetUser.getHabboInfo().getUsername())); + } + } + else + { + this.client.sendResponse(new TradeStartFailComposer(TradeStartFailComposer.TARGET_ALREADY_TRADING, targetUser.getHabboInfo().getUsername())); + } + } + else + { + this.client.sendResponse(new TradeStartFailComposer(TradeStartFailComposer.YOU_TRADING_OFF)); + } + } + else + { + this.client.sendResponse(new TradeStartFailComposer(TradeStartFailComposer.YOU_ALREADY_TRADING)); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeUnAcceptEvent.java b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeUnAcceptEvent.java new file mode 100644 index 00000000..f74f2dc5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeUnAcceptEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.incoming.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class TradeUnAcceptEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + Habbo habbo = this.client.getHabbo(); + RoomTrade trade = habbo.getHabboInfo().getCurrentRoom().getActiveTradeForHabbo(habbo); + + if(trade == null) + return; + + trade.accept(habbo, false); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/unknown/RequestResolutionEvent.java b/src/main/java/com/eu/habbo/messages/incoming/unknown/RequestResolutionEvent.java new file mode 100644 index 00000000..2cd23bc3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/unknown/RequestResolutionEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.incoming.unknown; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.events.resolution.NewYearResolutionComposer; + +public class RequestResolutionEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + int viewAll = this.packet.readInt(); + + if(viewAll == 0) + { + this.client.sendResponse(new NewYearResolutionComposer()); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent1.java b/src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent1.java new file mode 100644 index 00000000..a7a91c20 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent1.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.unknown; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.unknown.UnknownComposer6; + +public class UnknownEvent1 extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new UnknownComposer6()); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent2.java b/src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent2.java new file mode 100644 index 00000000..2db163e2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/unknown/UnknownEvent2.java @@ -0,0 +1,12 @@ +package com.eu.habbo.messages.incoming.unknown; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.navigator.*; + +public class UnknownEvent2 extends MessageHandler +{ + @Override + public void handle() throws Exception + { + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/ActivateEffectEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/ActivateEffectEvent.java new file mode 100644 index 00000000..1dfa4de8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/ActivateEffectEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class ActivateEffectEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int effectId = this.packet.readInt(); + + if (this.client.getHabbo().getInventory().getEffectsComponent().ownsEffect(effectId)) + { + this.client.getHabbo().getInventory().getEffectsComponent().activateEffect(effectId); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/ChangeNameCheckUsernameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/ChangeNameCheckUsernameEvent.java new file mode 100644 index 00000000..a80fc8c8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/ChangeNameCheckUsernameEvent.java @@ -0,0 +1,80 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserNameChangedComposer; +import com.eu.habbo.messages.outgoing.users.ChangeNameCheckResultComposer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ChangeNameCheckUsernameEvent extends MessageHandler +{ + public static String VALID_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-=!?@:,."; + + @Override + public void handle() throws Exception + { + if (!this.client.getHabbo().getHabboStats().allowNameChange) + return; + + String name = this.packet.readString(); + + if (name.equalsIgnoreCase(this.client.getHabbo().getHabboInfo().getUsername())) + { + this.client.getHabbo().getHabboStats().allowNameChange = false; + this.client.sendResponse(new RoomUserNameChangedComposer(this.client.getHabbo())); + return; + } + + int errorCode = ChangeNameCheckResultComposer.AVAILABLE; + + List suggestions = new ArrayList(4); + if (false) + { + errorCode = ChangeNameCheckResultComposer.DISABLED; + } + else if (name.length() < 3) + { + errorCode = ChangeNameCheckResultComposer.TOO_SHORT; + } + else if (name.length() > 15) + { + errorCode = ChangeNameCheckResultComposer.TOO_LONG; + } + else if (HabboManager.getOfflineHabboInfo(name) != null || ConfirmChangeNameEvent.changingUsernames.contains(name.toLowerCase())) + { + errorCode = ChangeNameCheckResultComposer.TAKEN_WITH_SUGGESTIONS; + suggestions.add(name + Emulator.getRandom().nextInt(9999)); + suggestions.add(name + Emulator.getRandom().nextInt(9999)); + suggestions.add(name + Emulator.getRandom().nextInt(9999)); + suggestions.add(name + Emulator.getRandom().nextInt(9999)); + } + else if (!Emulator.getGameEnvironment().getWordFilter().filter(name, this.client.getHabbo()).equalsIgnoreCase(name)) + { + errorCode = ChangeNameCheckResultComposer.NOT_VALID; + } + else + { + String checkName = name.toUpperCase(); + for (char c : VALID_CHARACTERS.toCharArray()) + { + checkName = checkName.replace(c + "", ""); + } + + if (!checkName.isEmpty()) + { + errorCode = ChangeNameCheckResultComposer.NOT_VALID; + } + else + { + this.client.getHabbo().getHabboStats().changeNameChecked = name; + } + } + + this.client.sendResponse(new ChangeNameCheckResultComposer(errorCode, name, suggestions)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/ConfirmChangeNameEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/ConfirmChangeNameEvent.java new file mode 100644 index 00000000..cb014a6b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/ConfirmChangeNameEvent.java @@ -0,0 +1,104 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.ChangeNameUpdatedComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserNameChangedComposer; +import com.eu.habbo.messages.outgoing.users.ChangeNameCheckResultComposer; +import com.eu.habbo.messages.outgoing.users.UserDataComposer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class ConfirmChangeNameEvent extends MessageHandler +{ + public static final List changingUsernames = new ArrayList<>(2); + + @Override + public void handle() throws Exception + { + if (!this.client.getHabbo().getHabboStats().allowNameChange) + return; + + String name = this.packet.readString(); + + if (name.equalsIgnoreCase(this.client.getHabbo().getHabboInfo().getUsername())) + { + this.client.getHabbo().getHabboStats().allowNameChange = false; + this.client.sendResponse(new ChangeNameUpdatedComposer(this.client.getHabbo())); + this.client.sendResponse(new RoomUserNameChangedComposer(this.client.getHabbo()).compose()); + this.client.sendResponse(new UserDataComposer(this.client.getHabbo())); + return; + } + + if (name.equals(this.client.getHabbo().getHabboStats().changeNameChecked)) + { + HabboInfo habboInfo = HabboManager.getOfflineHabboInfo(name); + + if (habboInfo == null) + { + synchronized (changingUsernames) + { + if (changingUsernames.contains(name)) + return; + + changingUsernames.add(name); + } + + String oldName = this.client.getHabbo().getHabboInfo().getUsername(); + this.client.getHabbo().getHabboStats().allowNameChange = false; + this.client.getHabbo().getHabboInfo().setUsername(name); + this.client.getHabbo().getHabboInfo().run(); + + for (Room room : Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(this.client.getHabbo())) + { + room.setOwnerName(name); + room.setNeedsUpdate(true); + room.save(); + } + + synchronized (changingUsernames) + { + changingUsernames.remove(name); + } + + this.client.sendResponse(new ChangeNameUpdatedComposer(this.client.getHabbo())); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserNameChangedComposer(this.client.getHabbo()).compose()); + } + else + { + this.client.sendResponse(new RoomUserNameChangedComposer(this.client.getHabbo()).compose()); + } + + this.client.getHabbo().getMessenger().connectionChanged(this.client.getHabbo(), true, this.client.getHabbo().getHabboInfo().getCurrentRoom() != null); + this.client.getHabbo().getClient().sendResponse(new UserDataComposer(this.client.getHabbo())); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO namechange_log (user_id, old_name, new_name, timestamp) VALUES (?, ?, ?, ?) ")) + { + statement.setInt(1, this.client.getHabbo().getHabboInfo().getId()); + statement.setString(2, oldName); + statement.setString(3, name); + statement.setInt(4, Emulator.getIntUnixTimestamp()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + else + { + this.client.sendResponse(new ChangeNameCheckResultComposer(ChangeNameCheckResultComposer.TAKEN_WITH_SUGGESTIONS, name, new ArrayList())); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/EnableEffectEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/EnableEffectEvent.java new file mode 100644 index 00000000..70c032e6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/EnableEffectEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.messages.incoming.MessageHandler; + +public class EnableEffectEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int effectId = this.packet.readInt(); + + if (effectId > 0) + { + if (this.client.getHabbo().getInventory().getEffectsComponent().ownsEffect(effectId)) + { + this.client.getHabbo().getInventory().getEffectsComponent().enableEffect(effectId); + } + } + else + { + this.client.getHabbo().getInventory().getEffectsComponent().activatedEffect = 0; + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().giveEffect(this.client.getHabbo().getRoomUnit(), 0); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/PickNewUserGiftEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/PickNewUserGiftEvent.java new file mode 100644 index 00000000..3df85263 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/PickNewUserGiftEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.NewUserGift; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserPickGiftEvent; + +public class PickNewUserGiftEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int totalItems = this.packet.readInt(); //total items + int keyA = this.packet.readInt(); //key 1 + int keyB = this.packet.readInt(); //key 2 + int index = this.packet.readInt(); + + if (!Emulator.getPluginManager().fireEvent(new UserPickGiftEvent(this.client.getHabbo(), keyA, keyB, index)).isCancelled()) + { + if (!this.client.getHabbo().getHabboStats().nuxReward) + { + this.client.getHabbo().getHabboStats().nuxReward = true; + NewUserGift gift = Emulator.getGameEnvironment().getItemManager().getNewUserGift(index + 1); + + if (gift != null) + { + gift.give(this.client.getHabbo()); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestMeMenuSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestMeMenuSettingsEvent.java new file mode 100644 index 00000000..85e0bc6e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestMeMenuSettingsEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.MeMenuSettingsComposer; + +public class RequestMeMenuSettingsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new MeMenuSettingsComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestProfileFriendsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestProfileFriendsEvent.java new file mode 100644 index 00000000..373bdd74 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestProfileFriendsEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.ProfileFriendsComposer; + +public class RequestProfileFriendsEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if(habbo != null) + this.client.sendResponse(new ProfileFriendsComposer(habbo)); + else + this.client.sendResponse(new ProfileFriendsComposer(Messenger.getFriends(userId), userId)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCitizinShipEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCitizinShipEvent.java new file mode 100644 index 00000000..d9d04c4c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCitizinShipEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserCitizinShipComposer; + +public class RequestUserCitizinShipEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new UserCitizinShipComposer(this.packet.readString())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserClubEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserClubEvent.java new file mode 100644 index 00000000..771601a0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserClubEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserClubComposer; +import com.eu.habbo.messages.outgoing.users.UserPermissionsComposer; + +public class RequestUserClubEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new UserClubComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCreditsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCreditsEvent.java new file mode 100644 index 00000000..3da686e8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserCreditsEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; +import com.eu.habbo.messages.outgoing.users.UserPointsComposer; + +public class RequestUserCreditsEvent extends MessageHandler +{ + @Override + public void handle() + { + this.client.sendResponse(new UserCreditsComposer(this.client.getHabbo())); + this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserDataEvent.java new file mode 100644 index 00000000..f779cacb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserDataEvent.java @@ -0,0 +1,157 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomManager; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.users.*; + +import java.util.ArrayList; + +public class RequestUserDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + if (this.client.getHabbo() != null) + { + //this.client.sendResponse(new TestComposer()); + /*this.client.sendResponse(new MinimailCountComposer()); + this.client.sendResponse(new MessengerInitComposer(this.client.getHabbo())); + this.client.sendResponse(new UserPermissionsComposer(this.client.getHabbo())); + this.client.sendResponse(new SessionRightsComposer());*/ + //this.client.sendResponse(new UserDataComposer(this.client.getHabbo())); + //this.client.sendResponse(new HotelViewComposer()); + //this.client.sendResponse(new UserHomeRoomComposer()); + //this.client.sendResponse(new UserPermissionsComposer(this.client.getHabbo())); + + //this.client.sendResponse(new UserCreditsComposer(this.client.getHabbo())); + //this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + //this.client.sendResponse(new FavoriteRoomsCountComposer()); + // this.client.sendResponse(new UserBCLimitsComposer()); + //this.client.sendResponse(new UserAchievementScoreComposer(this.client.getHabbo())); + //this.client.sendResponse(new UserClothesComposer()); + //this.client.sendResponse(new GenericAlertComposer(Emulator.getTexts().getValue("hotel.alert.message.welcome").replace("%user%", this.client.getHabbo().getHabboInfo().getUsername()), this.client.getHabbo())); + + + //******// + + ArrayList messages = new ArrayList(); + +/* + messages.add(new MinimailCountComposer().compose()); + messages.add(new FavoriteRoomsCountComposer().compose()); + messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); + messages.add(new SessionRightsComposer().compose()); + messages.add(new DebugConsoleComposer().compose()); + messages.add(new UserCurrencyComposer(this.client.getHabbo()).compose()); + messages.add(new UserDataComposer(this.client.getHabbo()).compose()); + messages.add(new UserPerksComposer().compose()); + messages.add(new BuildersClubExpiredComposer().compose()); + messages.add(new UserBCLimitsComposer().compose()); + messages.add(new UserAchievementScoreComposer(this.client.getHabbo()).compose()); + messages.add(new UserClothesComposer().compose()); + messages.add(new UserClubComposer(this.client.getHabbo()).compose()); + messages.add(new MeMenuSettingsComposer().compose()); + + if(this.client.getHabbo().hasPermission("acc_supporttool")) + { + this.client.sendResponse(new ModToolComposer()); + } + + messages.add(new CatalogUpdatedComposer().compose()); + messages.add(new CatalogModeComposer(0).compose()); + messages.add(new DiscountComposer().compose()); + messages.add(new MarketplaceConfigComposer().compose()); + messages.add(new GiftConfigurationComposer().compose()); + messages.add(new RecyclerLogicComposer().compose()); + // + + //messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); + this.client.sendResponses(messages); +*/ + +// messages.add(new DebugConsoleComposer().compose()); +// messages.add(new UserHomeRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom(), this.client.getHabbo().getHabboInfo().getHomeRoom()).compose()); +// messages.add(new NewUserIdentityComposer().compose()); +// //messages.add(new UserDataComposer(this.client.getHabbo()).compose()); +// messages.add(new SessionRightsComposer().compose()); +// messages.add(new MinimailCountComposer().compose()); +// messages.add(new MessengerInitComposer(this.client.getHabbo()).compose()); +// messages.add(new FriendsComposer(this.client.getHabbo()).compose()); +// messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); +// messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); +// // +// messages.add(new UserClubComposer(this.client.getHabbo()).compose()); +// messages.add(new UserAchievementScoreComposer(this.client.getHabbo()).compose()); +// messages.add(new UserBCLimitsComposer().compose()); +// messages.add(new UserClothesComposer().compose()); +// messages.add(new MeMenuSettingsComposer(this.client.getHabbo()).compose()); +// messages.add(new FavoriteRoomsCountComposer().compose()); + messages.add(new UserDataComposer(this.client.getHabbo()).compose()); + messages.add(new UserPerksComposer(this.client.getHabbo()).compose()); + + if(this.client.getHabbo().getHabboInfo().getHomeRoom() != 0) + messages.add(new ForwardToRoomComposer(this.client.getHabbo().getHabboInfo().getHomeRoom()).compose()); + else if (RoomManager.HOME_ROOM_ID > 0) + messages.add(new ForwardToRoomComposer(RoomManager.HOME_ROOM_ID).compose()); + + messages.add(new MeMenuSettingsComposer(this.client.getHabbo()).compose()); + +// messages.add(new UserPerksComposer().compose()); +// messages.add(new ForwardToRoomComposer(0).compose()); +// if(this.client.getHabbo().hasPermission("acc_supporttool")) +// { +// messages.add(new ModToolComposer().compose()); +// } +// +// +// // +// +// +// +// //messages.add(new UserDataComposer(this.client.getHabbo()).compose()); +// //messages.add(new UserPerksComposer().compose()); +// //messages.add(new SessionRightsComposer().compose()); +// messages.add(new UserEffectsListComposer().compose()); +// messages.add(new UserCurrencyComposer(this.client.getHabbo()).compose()); +// messages.add(new UserCreditsComposer(this.client.getHabbo()).compose()); +// messages.add(new UserPointsComposer(this.client.getHabbo().getHabboInfo().getPoints(), 0, 5).compose()); +// messages.add(new CatalogModeComposer(0).compose()); +// messages.add(new DiscountComposer().compose()); +// messages.add(new MarketplaceConfigComposer().compose()); +// messages.add(new GiftConfigurationComposer().compose()); +// messages.add(new RecyclerLogicComposer().compose()); +// messages.add(new CatalogUpdatedComposer().compose()); +// messages.add(new NewNavigatorMetaDataComposer().compose()); +// messages.add(new NewNavigatorLiftedRoomsComposer().compose()); +// messages.add(new NewNavigatorCollapsedCategoriesComposer().compose()); +// messages.add(new NewNavigatorSavedSearchesComposer().compose()); +// messages.add(new NewNavigatorEventCategoriesComposer().compose()); +// messages.add(new RoomCategoriesComposer(Emulator.getGameEnvironment().getRoomManager().roomCategoriesForHabbo(this.client.getHabbo())).compose()); + + this.client.sendResponses(messages); + + + /*this.client.sendResponse(new MinimailCountComposer()); + this.client.sendResponse(new UserPermissionsComposer(this.client.getHabbo())); + this.client.sendResponse(new SessionRightsComposer()); + this.client.sendResponse(new DebugConsoleComposer()); + this.client.sendResponse(new UserCurrencyComposer(this.client.getHabbo())); + this.client.sendResponse(new UserDataComposer(this.client.getHabbo())); + this.client.sendResponse(new UserPerksComposer()); + this.client.sendResponse(new HotelViewDataComposer(",2013-05-08 13:00,gamesmaker;2013-05-11 13:00", "")); + //this.client.sendResponse(new MessengerInitComposer(this.client.getHabbo())); + this.client.sendResponse(new FavoriteRoomsCountComposer()); + this.client.sendResponse(new UserBCLimitsComposer()); + this.client.sendResponse(new UserAchievementScoreComposer(this.client.getHabbo())); + this.client.sendResponse(new UserClothesComposer());*/ + } + else + { + Emulator.getLogging().logDebugLine("Habbo is NULL!"); + this.client.getChannel().close(); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserProfileEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserProfileEvent.java new file mode 100644 index 00000000..e37b9ec4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserProfileEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserProfileComposer; + +public class RequestUserProfileEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int habboId = this.packet.readInt(); + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(habboId); + + if(habbo != null) + this.client.sendResponse(new UserProfileComposer(habbo, this.client)); + else + this.client.sendResponse(new UserProfileComposer(HabboManager.getOfflineHabboInfo(habboId), this.client)); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserWardrobeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserWardrobeEvent.java new file mode 100644 index 00000000..3ae82261 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestUserWardrobeEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserWardrobeComposer; + +public class RequestUserWardrobeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.sendResponse(new UserWardrobeComposer(this.client.getHabbo().getInventory().getWardrobeComponent())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/RequestWearingBadgesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/RequestWearingBadgesEvent.java new file mode 100644 index 00000000..ce405b13 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/RequestWearingBadgesEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserBadgesComposer; + +public class RequestWearingBadgesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int userId = this.packet.readInt(); + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(userId); + + if(habbo == null || habbo.getHabboInfo() == null || habbo.getInventory() == null || habbo.getInventory().getBadgesComponent() == null) + this.client.sendResponse(new UserBadgesComposer(BadgesComponent.getBadgesOfflineHabbo(userId), userId)); + else + this.client.sendResponse(new UserBadgesComposer(habbo.getInventory().getBadgesComponent().getWearingBadges(), habbo.getHabboInfo().getId())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/SaveBlockCameraFollowEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/SaveBlockCameraFollowEvent.java new file mode 100644 index 00000000..5d9a4666 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SaveBlockCameraFollowEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserSavedSettingsEvent; + +public class SaveBlockCameraFollowEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.getHabbo().getHabboStats().blockCameraFollow = this.packet.readBoolean(); + Emulator.getPluginManager().fireEvent(new UserSavedSettingsEvent(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/SaveIgnoreRoomInvitesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/SaveIgnoreRoomInvitesEvent.java new file mode 100644 index 00000000..29b950a4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SaveIgnoreRoomInvitesEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserSavedSettingsEvent; + +public class SaveIgnoreRoomInvitesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.getHabbo().getHabboStats().blockRoomInvites = this.packet.readBoolean(); + Emulator.getPluginManager().fireEvent(new UserSavedSettingsEvent(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/SaveMottoEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/SaveMottoEvent.java new file mode 100644 index 00000000..58054aa2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SaveMottoEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; +import com.eu.habbo.plugin.events.users.UserSavedMottoEvent; + +public class SaveMottoEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String motto = this.packet.readString(); + UserSavedMottoEvent event = new UserSavedMottoEvent(this.client.getHabbo(), this.client.getHabbo().getHabboInfo().getMotto(), motto); + Emulator.getPluginManager().fireEvent(event); + motto = event.newMotto; + + this.client.getHabbo().getHabboInfo().setMotto(motto); + this.client.getHabbo().getHabboInfo().run(); + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(this.client.getHabbo()).compose()); + } + else + { + this.client.sendResponse(new RoomUserDataComposer(this.client.getHabbo())); + } + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("Motto")); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/SavePreferOldChatEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/SavePreferOldChatEvent.java new file mode 100644 index 00000000..4f1f46d8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SavePreferOldChatEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserSavedSettingsEvent; + +public class SavePreferOldChatEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + this.client.getHabbo().getHabboStats().preferOldChat = this.packet.readBoolean(); + Emulator.getPluginManager().fireEvent(new UserSavedSettingsEvent(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/SaveUserVolumesEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/SaveUserVolumesEvent.java new file mode 100644 index 00000000..852eacde --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SaveUserVolumesEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserSavedSettingsEvent; + +public class SaveUserVolumesEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int system = this.packet.readInt(); + int furni = this.packet.readInt(); + int trax = this.packet.readInt(); + + this.client.getHabbo().getHabboStats().volumeSystem = system; + this.client.getHabbo().getHabboStats().volumeFurni = furni; + this.client.getHabbo().getHabboStats().volumeTrax = trax; + + Emulator.getPluginManager().fireEvent(new UserSavedSettingsEvent(this.client.getHabbo())); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java new file mode 100644 index 00000000..d5739840 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.inventory.WardrobeComponent; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.plugin.events.users.UserSavedWardrobeEvent; + +public class SaveWardrobeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int slotId = this.packet.readInt(); + String look = this.packet.readString(); + String gender = this.packet.readString(); + + WardrobeComponent.WardrobeItem wardrobeItem; + if(this.client.getHabbo().getInventory().getWardrobeComponent().getLooks().containsKey(slotId)) + { + wardrobeItem = this.client.getHabbo().getInventory().getWardrobeComponent().getLooks().get(slotId); + wardrobeItem.setGender(HabboGender.valueOf(gender)); + wardrobeItem.setLook(look); + wardrobeItem.setNeedsUpdate(true); + } + else + { + wardrobeItem = this.client.getHabbo().getInventory().getWardrobeComponent().createLook(this.client.getHabbo(), slotId, look); + wardrobeItem.setNeedsInsert(true); + } + + UserSavedWardrobeEvent wardrobeEvent = new UserSavedWardrobeEvent(this.client.getHabbo(), wardrobeItem); + Emulator.getPluginManager().fireEvent(wardrobeEvent); + + Emulator.getThreading().run(wardrobeItem); + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/UserActivityEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/UserActivityEvent.java new file mode 100644 index 00000000..35b38208 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/UserActivityEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.messages.incoming.MessageHandler; + +public class UserActivityEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String type = this.packet.readString(); + String value = this.packet.readString(); + + switch (type) + { + case "Quiz": + if (value.equalsIgnoreCase("7")) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("SafetyQuizGraduate")); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/UserNuxEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/UserNuxEvent.java new file mode 100644 index 00000000..c747fac7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/UserNuxEvent.java @@ -0,0 +1,55 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.NewUserGift; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.unknown.NewUserGiftComposer; +import com.eu.habbo.messages.outgoing.unknown.NuxAlertComposer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class UserNuxEvent extends MessageHandler +{ + public static Map keys = new HashMap() + { + { + put(1, "BOTTOM_BAR_RECEPTION"); + put(2, "BOTTOM_BAR_NAVIGATOR"); + put(3, "CHAT_INPUT"); + put(4, "CHAT_HISTORY_BUTTON"); + put(5, "MEMENU_CLOTHES"); + put(6, "BOTTOM_BAR_CATALOGUE"); + put(7, "CREDITS_BUTTON"); + put(8, "DUCKETS_BUTTON"); + put(9, "DIAMONDS_BUTTON"); + put(10, "FRIENDS_BAR_ALL_FRIENDS"); + put(11, "BOTTOM_BAR_NAVIGATOR"); + } + }; + @Override + public void handle() throws Exception + { + handle(this.client.getHabbo()); + } + + public static void handle(Habbo habbo) + { + habbo.getHabboStats().nux = true; + int step = habbo.getHabboStats().nuxStep++; + + if (keys.containsKey(step)) + { + habbo.getClient().sendResponse(new NuxAlertComposer("helpBubble/add/" + keys.get(step) + "/" + Emulator.getTexts().getValue("nux.step." + step))); + } + else if (!habbo.getHabboStats().nuxReward) + { +// List> gifts = new ArrayList<>(); +// gifts.add(Emulator.getGameEnvironment().getItemManager().getNewUserGifts()); +// habbo.getClient().sendResponse(new NewUserGiftComposer(gifts)); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/UserSaveLookEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/UserSaveLookEvent.java new file mode 100644 index 00000000..f9c8c545 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/UserSaveLookEvent.java @@ -0,0 +1,53 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UpdateUserLookComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserDataComposer; +import com.eu.habbo.plugin.events.users.UserSavedLookEvent; + +public class UserSaveLookEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + String genderCode = this.packet.readString(); + HabboGender gender; + + try + { + gender = HabboGender.valueOf(genderCode); + } + catch (IllegalArgumentException e) + { + String message = Emulator.getTexts().getValue("scripter.warning.look.gender").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%gender%", genderCode); + Emulator.getGameEnvironment().getModToolManager().quickTicket(this.client.getHabbo(), "Scripter", message); + Emulator.getLogging().logUserLine(message); + return; + } + + String look = this.packet.readString(); + if(gender != null) + { + UserSavedLookEvent lookEvent = new UserSavedLookEvent(this.client.getHabbo(), gender, look); + Emulator.getPluginManager().fireEvent(lookEvent); + if(lookEvent.isCancelled()) + return; + + this.client.getHabbo().getHabboInfo().setLook(lookEvent.newLook); + this.client.getHabbo().getHabboInfo().setGender(lookEvent.gender); + Emulator.getThreading().run(this.client.getHabbo().getHabboInfo()); + this.client.sendResponse(new UpdateUserLookComposer(this.client.getHabbo())); + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new RoomUserDataComposer(this.client.getHabbo()).compose()); + } + + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("AvatarLooks")); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/users/UserWearBadgeEvent.java b/src/main/java/com/eu/habbo/messages/incoming/users/UserWearBadgeEvent.java new file mode 100644 index 00000000..06ee9774 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/users/UserWearBadgeEvent.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.incoming.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.users.UserBadgesComposer; + +import java.util.ArrayList; + +public class UserWearBadgeEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + BadgesComponent.resetSlots(this.client.getHabbo()); + + ArrayList updatedBadges = new ArrayList(); + for(int i = 0; i < 5; i++) + { + int slot = this.packet.readInt(); + if(slot < 1 || slot > 5) + return; + + String badgeId = this.packet.readString(); + + if(badgeId.length() == 0) + continue; + + HabboBadge badge = this.client.getHabbo().getInventory().getBadgesComponent().getBadge(badgeId); + if(badge != null) + { + badge.setSlot(slot); + badge.needsUpdate(true); + Emulator.getThreading().run(badge); + updatedBadges.add(badge); + } + } + + if(this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) + { + this.client.getHabbo().getHabboInfo().getCurrentRoom().sendComposer(new UserBadgesComposer(updatedBadges, this.client.getHabbo().getHabboInfo().getId()).compose()); + } + else + { + this.client.sendResponse(new UserBadgesComposer(updatedBadges, this.client.getHabbo().getHabboInfo().getId())); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/wired/WiredConditionSaveDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/wired/WiredConditionSaveDataEvent.java new file mode 100644 index 00000000..ebdaa372 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/wired/WiredConditionSaveDataEvent.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.incoming.wired; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.wired.WiredSavedComposer; + +public class WiredConditionSaveDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if(room.hasRights(this.client.getHabbo()) || room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner") || this.client.getHabbo().hasPermission("acc_moverotate")) + { + InteractionWiredCondition condition = room.getRoomSpecialTypes().getCondition(itemId); + + if(condition != null) + { + if(condition.saveData(this.packet)) + { + this.client.sendResponse(new WiredSavedComposer()); + + condition.needsUpdate(true); + + Emulator.getThreading().run(condition); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/wired/WiredEffectSaveDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/wired/WiredEffectSaveDataEvent.java new file mode 100644 index 00000000..bab8af70 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/wired/WiredEffectSaveDataEvent.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.incoming.wired; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.wired.effects.WiredEffectGiveReward; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.wired.WiredSavedComposer; + +public class WiredEffectSaveDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if(room.hasRights(this.client.getHabbo()) || room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner") || this.client.getHabbo().hasPermission("acc_moverotate")) + { + InteractionWiredEffect effect = room.getRoomSpecialTypes().getEffect(itemId); + + if(effect != null) + { + if(effect instanceof WiredEffectGiveReward && !this.client.getHabbo().hasPermission("acc_superwired")) + { + this.client.sendResponse(new RoomUserWhisperComposer(new RoomChatMessage("U cannot do this.", this.client.getHabbo(), this.client.getHabbo(), RoomChatMessageBubbles.ALERT))); + return; + } + + if(effect.saveData(this.packet, this.client)) + { + this.client.sendResponse(new WiredSavedComposer()); + effect.needsUpdate(true); + Emulator.getThreading().run(effect); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/incoming/wired/WiredTriggerSaveDataEvent.java b/src/main/java/com/eu/habbo/messages/incoming/wired/WiredTriggerSaveDataEvent.java new file mode 100644 index 00000000..b9fcb745 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/incoming/wired/WiredTriggerSaveDataEvent.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.incoming.wired; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.wired.WiredSavedComposer; + +public class WiredTriggerSaveDataEvent extends MessageHandler +{ + @Override + public void handle() throws Exception + { + int itemId = this.packet.readInt(); + + Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + + if(room != null) + { + if(room.hasRights(this.client.getHabbo()) || room.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermission("acc_anyroomowner") || this.client.getHabbo().hasPermission("acc_moverotate")) + { + InteractionWiredTrigger trigger = room.getRoomSpecialTypes().getTrigger(itemId); + + if(trigger != null) + { + if(trigger.saveData(this.packet)) + { + this.client.sendResponse(new WiredSavedComposer()); + + trigger.needsUpdate(true); + + Emulator.getThreading().run(trigger); + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/MessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/MessageComposer.java new file mode 100644 index 00000000..da47d65c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/MessageComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing; + +import com.eu.habbo.messages.ServerMessage; + +public abstract class MessageComposer +{ + protected final ServerMessage response; + + protected MessageComposer() + { + this.response = new ServerMessage(); + } + + public abstract ServerMessage compose(); +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java new file mode 100644 index 00000000..c5fe5194 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java @@ -0,0 +1,613 @@ +package com.eu.habbo.messages.outgoing; + +public class Outgoing +{ + public static final int PetStatusUpdateComposer = 1907;//error 404 + + public final static int CfhTopicsMessageComposer = 325; + public final static int FavoriteRoomsCountComposer = 151; // PRODUCTION-201611291003-338511768 + public final static int UserCurrencyComposer = 2018; // PRODUCTION-201611291003-338511768 + public final static int RedeemVoucherOKComposer = 3336; // PRODUCTION-201611291003-338511768 + public final static int RoomUserShoutComposer = 1036; // PRODUCTION-201611291003-338511768 + public final static int RoomUserStatusComposer = 1640; // PRODUCTION-201611291003-338511768 + public final static int RoomUserDataComposer = 3920; // PRODUCTION-201611291003-338511768 + public final static int RoomAddRightsListComposer = 2088; // PRODUCTION-201611291003-338511768 + public final static int RoomRemoveRightsListComposer = 1327; // PRODUCTION-201611291003-338511768 + public final static int RoomRightsListComposer = 1284; // PRODUCTION-201611291003-338511768 + public final static int RoomUserHandItemComposer = 1474; // PRODUCTION-201611291003-338511768 + public final static int RoomUsersComposer = 374; // PRODUCTION-201611291003-338511768 + public final static int FriendRequestComposer = 2219; // PRODUCTION-201611291003-338511768 + public final static int GuildBoughtComposer = 2808; // PRODUCTION-201611291003-338511768 + public final static int AddUserBadgeComposer = 2493; // PRODUCTION-201611291003-338511768 + public final static int RecyclerCompleteComposer = 468; // PRODUCTION-201611291003-338511768 + public final static int GuildBuyRoomsComposer = 2159; // PRODUCTION-201611291003-338511768 + public final static int FriendsComposer = 3130; // PRODUCTION-201611291003-338511768 + public final static int StalkErrorComposer = 3048; // PRODUCTION-201611291003-338511768 + public final static int TradeCloseWindowComposer = 1001; // PRODUCTION-201611291003-338511768 + public final static int RemoveFloorItemComposer = 2703; // PRODUCTION-201611291003-338511768 + public final static int InventoryPetsComposer = 3522; // PRODUCTION-201611291003-338511768 + public final static int UserCreditsComposer = 3475; // PRODUCTION-201611291003-338511768 + public final static int WiredTriggerDataComposer = 383; // PRODUCTION-201611291003-338511768 + public final static int TradeStoppedComposer = 1373; // PRODUCTION-201611291003-338511768 + public final static int ModToolUserChatlogComposer = 3377; // PRODUCTION-201611291003-338511768 + public final static int GuildInfoComposer = 1702; // PRODUCTION-201611291003-338511768 + public final static int UserPermissionsComposer = 411; // PRODUCTION-201611291003-338511768 + public final static int PetNameErrorComposer = 1503; // PRODUCTION-201611291003-338511768 + public final static int TradeStartFailComposer = 217; // PRODUCTION-201611291003-338511768 + public final static int AddHabboItemComposer = 2103; // PRODUCTION-201611291003-338511768 + public final static int InventoryBotsComposer = 3086; // PRODUCTION-201611291003-338511768 + public final static int CanCreateRoomComposer = 378; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceBuyErrorComposer = 2032; // PRODUCTION-201611291003-338511768 + public final static int BonusRareComposer = 1533; // PRODUCTION-201611291003-338511768 + public final static int HotelViewComposer = 122; // PRODUCTION-201611291003-338511768 + public final static int UpdateFriendComposer = 2800; // PRODUCTION-201611291003-338511768 + public final static int FloorItemUpdateComposer = 3776; // PRODUCTION-201611291003-338511768 + public final static int RoomAccessDeniedComposer = 878; // PRODUCTION-201611291003-338511768 + public final static int GuildFurniWidgetComposer = 3293; // PRODUCTION-201611291003-338511768 + public final static int GiftConfigurationComposer = 2234; // PRODUCTION-201611291003-338511768 + public final static int UserClubComposer = 954; // PRODUCTION-201611291003-338511768 + public final static int InventoryBadgesComposer = 717; // PRODUCTION-201611291003-338511768 + public final static int RoomUserTypingComposer = 1717; // PRODUCTION-201611291003-338511768 + public final static int GuildJoinErrorComposer = 762; // PRODUCTION-201611291003-338511768 + public final static int RoomCategoriesComposer = 1562; // PRODUCTION-201611291003-338511768 + public final static int InventoryAchievementsComposer = 2501; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceItemInfoComposer = 725; // PRODUCTION-201611291003-338511768 + public final static int RoomRelativeMapComposer = 2753; // PRODUCTION-201611291003-338511768 + public final static int ModToolComposerTwo = 2335; // PRODUCTION-201611291003-338511768 + public final static int ModToolComposerOne = 3192; // PRODUCTION-201611291003-338511768 + public final static int RoomRightsComposer = 780; // PRODUCTION-201611291003-338511768 + public final static int ObjectOnRollerComposer = 3207; // PRODUCTION-201611291003-338511768 + public final static int PollStartComposer = 3785; // PRODUCTION-201611291003-338511768 + public final static int GuildRefreshMembersListComposer = 2445; // PRODUCTION-201611291003-338511768 + public final static int UserPerksComposer = 2586; // PRODUCTION-201611291003-338511768 + public final static int UserCitizinShipComposer = 1203; // PRODUCTION-201611291003-338511768 + public final static int PublicRoomsComposer =-1;//error 404 + public final static int MarketplaceOffersComposer = 680; // PRODUCTION-201611291003-338511768 + public final static int ModToolComposer = 2696; // PRODUCTION-201611291003-338511768 + public final static int UserBadgesComposer = 1087; // PRODUCTION-201611291003-338511768 + public final static int GuildManageComposer = 3965; // PRODUCTION-201611291003-338511768 + public final static int RemoveFriendComposer =-1;//error 404 + public final static int BannerTokenComposer =-1;//error 404 + public final static int UserDataComposer = 2725; // PRODUCTION-201611291003-338511768 + public final static int UserSearchResultComposer = 973; // PRODUCTION-201611291003-338511768 + public final static int ModToolUserRoomVisitsComposer = 1752; // PRODUCTION-201611291003-338511768 + public final static int RoomUserRespectComposer = 2815; // PRODUCTION-201611291003-338511768 + public final static int RoomChatSettingsComposer = 1191; // PRODUCTION-201611291003-338511768 + public final static int RemoveHabboItemComposer = 159; // PRODUCTION-201611291003-338511768 + public final static int RoomUserRemoveComposer = 2661; // PRODUCTION-201611291003-338511768 + public final static int RoomHeightMapComposer = 1301; // PRODUCTION-201611291003-338511768 + public final static int RoomPetHorseFigureComposer = 1924; // PRODUCTION-201611291003-338511768 + public final static int PetErrorComposer = 2913; // PRODUCTION-201611291003-338511768 + public final static int TradeUpdateComposer = 2024; // PRODUCTION-201611291003-338511768 + public final static int PrivateRoomsComposer = 52; // PRODUCTION-201611291003-338511768 + public final static int RoomModelComposer = 2031; // PRODUCTION-201611291003-338511768 + public final static int RoomScoreComposer = 482; // PRODUCTION-201611291003-338511768 + public final static int DoorbellAddUserComposer = 2309; // PRODUCTION-201611291003-338511768 + public final static int SecureLoginOKComposer = 2491; // PRODUCTION-201611291003-338511768 + public final static int SessionRightsComposer = 2033; // PRODUCTION-201611291003-338511768 + public final static int GuildMemberUpdateComposer = 265; // PRODUCTION-201611291003-338511768 + public final static int RoomFloorItemsComposer = 1778; // PRODUCTION-201611291003-338511768 + public final static int InventoryItemsComposer = 994; // PRODUCTION-201611291003-338511768 + public final static int RoomUserTalkComposer = 1446; // PRODUCTION-201611291003-338511768 + public final static int TradeStartComposer = 2505; // PRODUCTION-201611291003-338511768 + public final static int InventoryItemUpdateComposer = 104; // PRODUCTION-201611291003-338511768 + public final static int ModToolIssueUpdateComposer = 3150; // PRODUCTION-201611291003-338511768 + public final static int MeMenuSettingsComposer = 513; // PRODUCTION-201611291003-338511768 + public final static int ModToolRoomInfoComposer = 1333; // PRODUCTION-201611291003-338511768 + public final static int GuildListComposer = 420; // PRODUCTION-201611291003-338511768 + public final static int RecyclerLogicComposer = 3164; // PRODUCTION-201611291003-338511768 + public final static int UserHomeRoomComposer = 2875; // PRODUCTION-201611291003-338511768 + public final static int RoomUserDanceComposer = 2233; // PRODUCTION-201611291003-338511768 + public final static int RoomSettingsUpdatedComposer = 3297; // PRODUCTION-201611291003-338511768 + public final static int AlertPurchaseFailedComposer = 1404; // PRODUCTION-201611291003-338511768 + public final static int RoomDataComposer = 687; // PRODUCTION-201611291003-338511768 + public final static int TagsComposer = 2012; // PRODUCTION-201611291003-338511768 + public final static int InventoryRefreshComposer = 3151; // PRODUCTION-201611291003-338511768 + public final static int RemovePetComposer = 3253; // PRODUCTION-201611291003-338511768 + public final static int RemoveWallItemComposer = 3208; // PRODUCTION-201611291003-338511768 + public final static int TradeCompleteComposer = 2369; // PRODUCTION-201611291003-338511768 + public final static int NewsWidgetsComposer = 286; // PRODUCTION-201611291003-338511768 + public final static int WiredEffectDataComposer = 1434; // PRODUCTION-201611291003-338511768 + public final static int BubbleAlertComposer = 1992; // PRODUCTION-201611291003-338511768 + public final static int ReloadRecyclerComposer = 3433; // PRODUCTION-201611291003-338511768 + public final static int MoodLightDataComposer = 2710; // PRODUCTION-201611291003-338511768 + public final static int WiredRewardAlertComposer = 178; // PRODUCTION-201611291003-338511768 + public final static int CatalogPageComposer = 804; // PRODUCTION-201611291003-338511768 + public final static int CatalogModeComposer = 3828; // PRODUCTION-201611291003-338511768 + public final static int ChangeNameUpdateComposer = 118; // PRODUCTION-201611291003-338511768 + public final static int AddFloorItemComposer = 1534; // PRODUCTION-201611291003-338511768 + public final static int DebugConsoleComposer = 3284; // PRODUCTION-201611291003-338511768 + public final static int HallOfFameComposer = 3005; // PRODUCTION-201611291003-338511768 + public final static int WiredSavedComposer = 1155; // PRODUCTION-201611291003-338511768 + public final static int RoomPaintComposer = 2454; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceConfigComposer = 1823; // PRODUCTION-201611291003-338511768 + public final static int AddBotComposer = 1352; // PRODUCTION-201611291003-338511768 + public final static int FriendRequestErrorComposer = 892; // PRODUCTION-201611291003-338511768 + public final static int GuildMembersComposer = 1200; // PRODUCTION-201611291003-338511768 + public final static int RoomOpenComposer = 758; // PRODUCTION-201611291003-338511768 + public final static int ModToolRoomChatlogComposer = 3434; // PRODUCTION-201611291003-338511768 + public final static int DiscountComposer = 2347; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceCancelSaleComposer = 3264; // PRODUCTION-201611291003-338511768 + public final static int RoomPetRespectComposer = 2788; // PRODUCTION-201611291003-338511768 + public final static int RoomSettingsComposer = 1498; // PRODUCTION-201611291003-338511768 + public final static int TalentTrackComposer = 3406; // PRODUCTION-201611291003-338511768 + public final static int CatalogPagesListComposer = 1032; // PRODUCTION-201611291003-338511768 + public final static int AlertLimitedSoldOutComposer = 377; // PRODUCTION-201611291003-338511768 + public final static int CatalogUpdatedComposer = 1866; // PRODUCTION-201611291003-338511768 + public final static int PurchaseOKComposer = 869; // PRODUCTION-201611291003-338511768 + public final static int WallItemUpdateComposer = 2009; // PRODUCTION-201611291003-338511768 + public final static int TradeAcceptedComposer = 2568; // PRODUCTION-201611291003-338511768 + public final static int AddWallItemComposer = 2187; // PRODUCTION-201611291003-338511768 + public final static int RoomEntryInfoComposer = 749; // PRODUCTION-201611291003-338511768 + public final static int HotelViewDataComposer = 1745; // PRODUCTION-201611291003-338511768 + public final static int PresentItemOpenedComposer = 56; // PRODUCTION-201611291003-338511768 + public final static int RoomUserRemoveRightsComposer = 84; // PRODUCTION-201611291003-338511768 + public final static int UserBCLimitsComposer = 3828; // PRODUCTION-201611291003-338511768 + public final static int PetTrainingPanelComposer = 1164; // PRODUCTION-201611291003-338511768 + public final static int RoomPaneComposer = 749; // PRODUCTION-201611291003-338511768 + public final static int RedeemVoucherErrorComposer = 714; // PRODUCTION-201611291003-338511768 + public final static int RoomCreatedComposer = 1304; // PRODUCTION-201611291003-338511768 + public final static int GenericAlertComposer = 3801; // PRODUCTION-201611291003-338511768 + public final static int GroupPartsComposer = 2238; // PRODUCTION-201611291003-338511768 + public final static int ModToolIssueInfoComposer = 3609; // PRODUCTION-201611291003-338511768 + public final static int RoomUserWhisperComposer = 2704; // PRODUCTION-201611291003-338511768 + public final static int BotErrorComposer = 639; // PRODUCTION-201611291003-338511768 + public final static int FreezeLivesComposer = 2324; // PRODUCTION-201611291003-338511768 + public final static int LoadFriendRequestsComposer = 280; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceSellItemComposer = 54; // PRODUCTION-201611291003-338511768 + public final static int ClubDataComposer = 2405; // PRODUCTION-201611291003-338511768 + public final static int ProfileFriendsComposer = 2016; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceOwnItemsComposer = 3884; // PRODUCTION-201611291003-338511768 + public final static int RoomOwnerComposer = 339; // PRODUCTION-201611291003-338511768 + public final static int WiredConditionDataComposer = 1108; // PRODUCTION-201611291003-338511768 + public final static int ModToolUserInfoComposer = 2866; // PRODUCTION-201611291003-338511768 + public final static int UserWardrobeComposer = 3315; // PRODUCTION-201611291003-338511768 + public final static int RoomPetExperienceComposer = 2156; // PRODUCTION-201611291003-338511768 + public final static int FriendChatMessageComposer = 1587; // PRODUCTION-201611291003-338511768 + public final static int PetInformationComposer = 2901; // PRODUCTION-201611291003-338511768 + public final static int RoomThicknessComposer = 3547; // PRODUCTION-201611291003-338511768 + public final static int AddPetComposer = 2101; // PRODUCTION-201611291003-338511768 + public final static int UpdateStackHeightComposer = 558; // PRODUCTION-201611291003-338511768 + public final static int RemoveBotComposer = 233; // PRODUCTION-201611291003-338511768 + public final static int RoomEnterErrorComposer = 899; // PRODUCTION-201611291003-338511768 + public final static int PollQuestionsComposer = 2997; // PRODUCTION-201611291003-338511768 + public final static int GenericErrorMessages = 1600; // PRODUCTION-201611291003-338511768 + public final static int RoomWallItemsComposer = 1369; // PRODUCTION-201611291003-338511768 + public final static int RoomUserEffectComposer = 1167; // PRODUCTION-201611291003-338511768 + public final static int PetBreedsComposer = 3331; // PRODUCTION-201611291003-338511768 + public final static int ModToolIssueChatlogComposer = 607; // PRODUCTION-201611291003-338511768 + public final static int RoomUserActionComposer = 1631; // PRODUCTION-201611291003-338511768 + public final static int BotSettingsComposer = 1618; // PRODUCTION-201611291003-338511768 + public final static int UserProfileComposer = 3898; // PRODUCTION-201611291003-338511768 + public final static int MinimailCountComposer = 2803; // PRODUCTION-201611291003-338511768 + public final static int UserAchievementScoreComposer = 1968; // PRODUCTION-201611291003-338511768 + public final static int PetLevelUpComposer = 859; // PRODUCTION-201611291003-338511768 + public final static int UserPointsComposer = 2275; // PRODUCTION-201611291003-338511768 + public final static int ReportRoomFormComposer = 1121; // PRODUCTION-201611291003-338511768 + public final static int ModToolIssueHandledComposer = 934; // PRODUCTION-201611291003-338511768 + public final static int FloodCounterComposer = 566; // PRODUCTION-201611291003-338511768 + public final static int UpdateFailedComposer = 156; // PRODUCTION-201611291003-338511768 + public final static int FloorPlanEditorDoorSettingsComposer = 1664; // PRODUCTION-201611291003-338511768 + public final static int FloorPlanEditorBlockedTilesComposer = 3990; // PRODUCTION-201611291003-338511768 + public final static int BuildersClubExpiredComposer = 1452; // PRODUCTION-201611291003-338511768 + public final static int RoomSettingsSavedComposer = 948; // PRODUCTION-201611291003-338511768 + public final static int MessengerInitComposer = 1605; // PRODUCTION-201611291003-338511768 + public final static int UserClothesComposer = 1450; // PRODUCTION-201611291003-338511768 + public final static int UserEffectsListComposer = 340; // PRODUCTION-201611291003-338511768 + public final static int NewUserIdentityComposer = 3738; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorEventCategoriesComposer = 3244; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorCollapsedCategoriesComposer = 1543; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorLiftedRoomsComposer = 3104; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorSavedSearchesComposer = 3984; // PRODUCTION-201611291003-338511768 + public final static int RoomUnitUpdateUsernameComposer = 2182; // PRODUCTION-201611291003-338511768 + public final static int PostItDataComposer = 2202; // PRODUCTION-201611291003-338511768 + public final static int ModToolReportReceivedAlertComposer = 3635; // PRODUCTION-201611291003-338511768 + public final static int ModToolIssueResponseAlertComposer = 3796; // PRODUCTION-201611291003-338511768 + public final static int AchievementListComposer = 305; // PRODUCTION-201611291003-338511768 + public final static int AchievementProgressComposer = 2107; // PRODUCTION-201611291003-338511768 + public final static int AchievementUnlockedComposer = 806; // PRODUCTION-201611291003-338511768 + public final static int ClubGiftsComposer = 619; // PRODUCTION-201611291003-338511768 + public final static int MachineIDComposer = 1488; // PRODUCTION-201611291003-338511768 + public final static int PongComposer = 10; // PRODUCTION-201611291003-338511768 + public final static int ModToolIssueHandlerDimensionsComposer = 1576; // PRODUCTION-201611291003-338511768 + + //Uknown but work + public final static int UnknownComposer4 = 793; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer5 = 2833; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer6 = 126; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorMetaDataComposer = 3052; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorSearchResultsComposer = 2690; // PRODUCTION-201611291003-338511768 + public final static int MysticBoxStartOpenComposer = 3201; // PRODUCTION-201611291003-338511768 + public final static int MysticBoxCloseComposer = 596; // PRODUCTION-201611291003-338511768 + public final static int MysticBoxPrizeComposer = 3712; // PRODUCTION-201611291003-338511768 + public final static int RentableSpaceInfoComposer = 3559; // PRODUCTION-201611291003-338511768 + public final static int RentableSpaceUnknownComposer = 2046; // PRODUCTION-201611291003-338511768 + public final static int RentableSpaceUnknown2Composer = 1868; // PRODUCTION-201611291003-338511768 + public final static int GuildConfirmRemoveMemberComposer = 1876; // PRODUCTION-201611291003-338511768 + + public final static int HotelViewBadgeButtonConfigComposer = 2998; // PRODUCTION-201611291003-338511768 + public final static int EpicPopupFrameComposer = 3945; // PRODUCTION-201611291003-338511768 + public final static int BaseJumpLoadGameURLComposer = 2624; // PRODUCTION-201611291003-338511768 + public final static int RoomUserTagsComposer = 1255; // PRODUCTION-201611291003-338511768 + public final static int RoomInviteErrorComposer = 462; // PRODUCTION-201611291003-338511768 + public final static int PostItStickyPoleOpenComposer = 2366; // PRODUCTION-201611291003-338511768 + public final static int NewYearResolutionProgressComposer = 3370; // PRODUCTION-201611291003-338511768 + public final static int ClubGiftReceivedComposer = 659; // PRODUCTION-201611291003-338511768 + public final static int ItemStateComposer = 2376; // PRODUCTION-201611291003-338511768 + public final static int ItemExtraDataComposer = 2547; // PRODUCTION-201611291003-338511768 + + //NotSure Needs Testing + public final static int QuestionInfoComposer = 2665; // PRODUCTION-201611291003-338511768 + public final static int TalentTrackEmailVerifiedComposer = 612; // PRODUCTION-201611291003-338511768 + public final static int TalentTrackEmailFailedComposer = 1815; // PRODUCTION-201611291003-338511768 + public final static int UnknownAvatarEditorComposer = 3473; // PRODUCTION-201611291003-338511768 + + public final static int UnknownGuildComposer = 1180; // PRODUCTION-201611291003-338511768 + + public final static int GuildForumsUnreadMessagesCountComposer = 2379; // PRODUCTION-201611291003-338511768 + public final static int GuildForumThreadMessagesComposer = 1862; // PRODUCTION-201611291003-338511768 + public final static int GuildForumAddCommentComposer = 2049; // PRODUCTION-201611291003-338511768 + public final static int GuildForumDataComposer = 3011; // PRODUCTION-201611291003-338511768 + public final static int GuildForumCommentsComposer = 509; // PRODUCTION-201611291003-338511768 + public final static int UnknownGuildForumComposer6 = 324; // PRODUCTION-201611291003-338511768 + public final static int UnknownGuildForumComposer7 = 2528; // PRODUCTION-201611291003-338511768 + public final static int GuildForumThreadsComposer = 1073; // PRODUCTION-201611291003-338511768 + public final static int GuildForumListComposer = 3001; // PRODUCTION-201611291003-338511768 + + public final static int GuideSessionAttachedComposer = 1591; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionDetachedComposer = 138; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionStartedComposer = 3209; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionEndedComposer = 1456; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionErrorComposer = 673; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionMessageComposer = 841; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionRequesterRoomComposer = 1847; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionInvitedToGuideRoomComposer = 219; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionPartnerIsTypingComposer = 1016; // PRODUCTION-201611291003-338511768 + + public final static int GuideToolsComposer = 1548; // PRODUCTION-201611291003-338511768 + public final static int GuardianNewReportReceivedComposer = 735; // PRODUCTION-201611291003-338511768 + public final static int GuardianVotingRequestedComposer = 143; // PRODUCTION-201611291003-338511768 + public final static int GuardianVotingVotesComposer = 1829; // PRODUCTION-201611291003-338511768 + public final static int GuardianVotingResultComposer = 3276; // PRODUCTION-201611291003-338511768 + public final static int GuardianVotingTimeEnded = 30; // PRODUCTION-201611291003-338511768 + + public final static int RoomMutedComposer = 2533; // PRODUCTION-201611291003-338511768 + + public final static int HideDoorbellComposer = 3783; // PRODUCTION-201611291003-338511768 + public final static int RoomUnknown2Composer = 2208; // PRODUCTION-201611291003-338511768 + public final static int RoomUnknown3Composer = 1033; // PRODUCTION-201611291003-338511768 + + public final static int EffectsListRemoveComposer = 2228; // PRODUCTION-201611291003-338511768 + + public final static int OldPublicRoomsComposer = 2726; // PRODUCTION-201611291003-338511768 + public final static int ItemStateComposer2 = 3431; // PRODUCTION-201611291003-338511768 + + public final static int HotelWillCloseInMinutesComposer = 1050; // PRODUCTION-201611291003-338511768 + public final static int HotelWillCloseInMinutesAndBackInComposer = 1350; // PRODUCTION-201611291003-338511768 + public final static int HotelClosesAndWillOpenAtComposer = 2771; // PRODUCTION-201611291003-338511768 + public final static int HotelClosedAndOpensComposer = 3728; // PRODUCTION-201611291003-338511768 + public final static int StaffAlertAndOpenHabboWayComposer = 1683; // PRODUCTION-201611291003-338511768 + public final static int StaffAlertWithLinkComposer = 2030; // PRODUCTION-201611291003-338511768 + public final static int StaffAlertWIthLinkAndOpenHabboWayComposer = 1890; // PRODUCTION-201611291003-338511768 + + public final static int RoomMessagesPostedCountComposer = 1634; // PRODUCTION-201611291003-338511768 + public final static int CantScratchPetNotOldEnoughComposer = 1130; // PRODUCTION-201611291003-338511768 + public final static int PetBoughtNotificationComposer = 1111; // PRODUCTION-201611291003-338511768 + public final static int MessagesForYouComposer = 2035; // PRODUCTION-201611291003-338511768 + public final static int UnknownStatusComposer = 1243; // PRODUCTION-201611291003-338511768 + public final static int CloseWebPageComposer = 426; // PRODUCTION-201611291003-338511768 + public final static int PickMonthlyClubGiftNotificationComposer = 2188; // PRODUCTION-201611291003-338511768 + public final static int RemoveGuildFromRoomComposer = 3129; // PRODUCTION-201611291003-338511768 + public final static int RoomBannedUsersComposer = 1869; // PRODUCTION-201611291003-338511768 + public final static int OpenRoomCreationWindowComposer = 2064; // PRODUCTION-201611291003-338511768 + public final static int ItemsDataUpdateComposer = 1453; // PRODUCTION-201611291003-338511768 + public final static int WelcomeGiftComposer = 2707; // PRODUCTION-201611291003-338511768 + public final static int SimplePollStartComposer = 2665; // PRODUCTION-201611291003-338511768 + public final static int RoomNoRightsComposer = 2392; // PRODUCTION-201611291003-338511768 + public final static int GuildEditFailComposer = 3988; // PRODUCTION-201611291003-338511768 + public final static int MinimailNewMessageComposer = 1911; // PRODUCTION-201611291003-338511768 + public final static int RoomFilterWordsComposer = 2937; // PRODUCTION-201611291003-338511768 + public final static int VerifyMobileNumberComposer = 3639; // PRODUCTION-201611291003-338511768 + public final static int NewUserGiftComposer = 3575; // PRODUCTION-201611291003-338511768 + public final static int UpdateUserLookComposer = 2429; // PRODUCTION-201611291003-338511768 + public final static int RoomUserIgnoredComposer = 207; // PRODUCTION-201611291003-338511768 + public final static int PetBreedingFailedComposer = 1625; // PRODUCTION-201611291003-338511768 + public final static int HabboNameChangedComposer = 118; // PRODUCTION-201611291003-338511768 + public final static int RoomUserNameChangedComposer = 2182; // PRODUCTION-201611291003-338511768 + public final static int LoveLockFurniStartComposer = 3753; // PRODUCTION-201611291003-338511768 + public final static int LoveLockFurniFriendConfirmedComposer = 382; // PRODUCTION-201611291003-338511768 + public final static int LoveLockFurniFinishedComposer = 770; // PRODUCTION-201611291003-338511768 + public final static int PetPackageNameValidationComposer = 546; // PRODUCTION-201611291003-338511768 + public final static int GameCenterFeaturedPlayersComposer = 3097; // PRODUCTION-201611291003-338511768 + public final static int HabboMallComposer = 1237; // PRODUCTION-201611291003-338511768 + public final static int TargetedOfferComposer = 119; // PRODUCTION-201611291003-338511768 + public final static int LeprechaunStarterBundleComposer = 2380; // PRODUCTION-201611291003-338511768 + public final static int VerifyMobilePhoneWindowComposer = 2890; // PRODUCTION-201611291003-338511768 + public final static int VerifyMobilePhoneCodeWindowComposer = 800; // PRODUCTION-201611291003-338511768 + public final static int VerifyMobilePhoneDoneComposer = 91; // PRODUCTION-201611291003-338511768 + public final static int RoomUserReceivedHandItemComposer = 354; // PRODUCTION-201611291003-338511768 + public final static int MutedWhisperComposer = 826; // PRODUCTION-201611291003-338511768 + public final static int UnknownHintComposer = 1787; // PRODUCTION-201611291003-338511768 + public final static int BullyReportClosedComposer = 2674; // PRODUCTION-201611291003-338511768 + public final static int PromoteOwnRoomsListComposer = 2468; // PRODUCTION-201611291003-338511768 + public final static int NotEnoughPointsTypeComposer = 3914; // PRODUCTION-201611291003-338511768 + public final static int WatchAndEarnRewardComposer = 2125; // PRODUCTION-201611291003-338511768 + public final static int NewYearResolutionComposer = 66; // PRODUCTION-201611291003-338511768 + public final static int WelcomeGiftErrorComposer = 2293; // PRODUCTION-201611291003-338511768 + public final static int RentableItemBuyOutPriceComposer = 35; // PRODUCTION-201611291003-338511768 + public final static int VipTutorialsStartComposer = 2278; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorCategoryUserCountComposer = 1455; // PRODUCTION-201611291003-338511768 + public final static int CameraRoomThumbnailSavedComposer = 3595; // PRODUCTION-201611291003-338511768 + public final static int RoomEditSettingsErrorComposer = 1555; // PRODUCTION-201611291003-338511768 + public final static int GuildAcceptMemberErrorComposer = 818; // PRODUCTION-201611291003-338511768 + public final static int MostUselessErrorAlertComposer = 662; // PRODUCTION-201611291003-338511768 + public final static int AchievementsConfigurationComposer = 1689; // PRODUCTION-201611291003-338511768 + public final static int PetBreedingResultComposer = 634; // PRODUCTION-201611291003-338511768 + public final static int RoomUserQuestionAnsweredComposer = 2589; // PRODUCTION-201611291003-338511768 + public final static int PetBreedingStartComposer = 1746; // PRODUCTION-201611291003-338511768 + public final static int CustomNotificationComposer = 909; // PRODUCTION-201611291003-338511768 + public final static int UpdateStackHeightTileHeightComposer = 2816; // PRODUCTION-201611291003-338511768 + public final static int HotelViewCustomTimerComposer = 3926; // PRODUCTION-201611291003-338511768 + public final static int MarketplaceItemPostedComposer = 1359; // PRODUCTION-201611291003-338511768 + public final static int HabboWayQuizComposer2 = 2927; // PRODUCTION-201611291003-338511768 + public final static int GuildFavoriteRoomUserUpdateComposer = 3403; // PRODUCTION-201611291003-338511768 + public final static int RoomAdErrorComposer = 1759; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorSettingsComposer = 518; // PRODUCTION-201611291003-338511768 + public final static int CameraPublishWaitMessageComposer = 2057; // PRODUCTION-201611291003-338511768 + public final static int RoomInviteComposer = 3870; // PRODUCTION-201611291003-338511768 + public final static int BullyReportRequestComposer = 3463; // PRODUCTION-201611291003-338511768 + public final static int UnknownHelperComposer = 77; // PRODUCTION-201611291003-338511768 + public final static int HelperRequestDisabledComposer = 1651; // PRODUCTION-201611291003-338511768 + public final static int RoomUnitIdleComposer = 1797; // PRODUCTION-201611291003-338511768 + public final static int QuestCompletedComposer = 949; // PRODUCTION-201611291003-338511768 + public final static int UnkownPetPackageComposer = 1723; // PRODUCTION-201611291003-338511768 + public final static int ForwardToRoomComposer = 160; // PRODUCTION-201611291003-338511768 + public final static int EffectsListEffectEnableComposer = 1959; // PRODUCTION-201611291003-338511768 + public final static int CompetitionEntrySubmitResultComposer = 1177; // PRODUCTION-201611291003-338511768 + public final static int ExtendClubMessageComposer = 3964; // PRODUCTION-201611291003-338511768 + public final static int HotelViewConcurrentUsersComposer = 2737; // PRODUCTION-201611291003-338511768 + public final static int InventoryAddEffectComposer =-1;//error 404 + public final static int TalentLevelUpdateComposer = 638; // PRODUCTION-201611291003-338511768 + public final static int BullyReportedMessageComposer = 3285; // PRODUCTION-201611291003-338511768 + public final static int UnknownQuestComposer3 = 1122; // PRODUCTION-201611291003-338511768 + public final static int FriendToolbarNotificationComposer = 3082; // PRODUCTION-201611291003-338511768 + public final static int MessengerErrorComposer = 896; // PRODUCTION-201611291003-338511768 + public final static int CameraPriceComposer = 3878; // PRODUCTION-201611291003-338511768 + public final static int PetBreedingCompleted = 2527; // PRODUCTION-201611291003-338511768 + public final static int RoomUserUnbannedComposer = 3429; // PRODUCTION-201611291003-338511768 + public final static int HotelViewCommunityGoalComposer = 2525; // PRODUCTION-201611291003-338511768 + public final static int UnknownRoomVisitsComposer = 966; // PRODUCTION-201611291003-338511768 + public final static int CanCreateEventComposer = 2599; // PRODUCTION-201611291003-338511768 + public final static int UnknownGuild2Composer = 1459; // PRODUCTION-201611291003-338511768 + public final static int YoutubeDisplayListComposer = 1112; // PRODUCTION-201611291003-338511768 + public final static int YoutubeMessageComposer2 = 1411; // PRODUCTION-201611291003-338511768 + public final static int YoutubeMessageComposer3 = 1554; // PRODUCTION-201611291003-338511768 + public final static int RoomCategoryUpdateMessageComposer = 3896; // PRODUCTION-201611291003-338511768 + public final static int UnknownQuestComposer2 = 3625; // PRODUCTION-201611291003-338511768 + public final static int GiftReceiverNotFoundComposer = 1517; // PRODUCTION-201611291003-338511768 + public final static int ConvertedForwardToRoomComposer = 1331; // PRODUCTION-201611291003-338511768 + public final static int FavoriteRoomChangedComposer = 2524; // PRODUCTION-201611291003-338511768 + public final static int AlertPurchaseUnavailableComposer = 3770; // PRODUCTION-201611291003-338511768 + public final static int PetBreedingStartFailedComposer = 2621; // PRODUCTION-201611291003-338511768 + public final static int DailyQuestComposer = 1878; // PRODUCTION-201611291003-338511768 + public final static int NewNavigatorRoomEventComposer = 1840; // PRODUCTION-201611291003-338511768 + public final static int HotelViewHideCommunityVoteButtonComposer = 1435; // PRODUCTION-201611291003-338511768 + public final static int CatalogSearchResultComposer = 3388; // PRODUCTION-201611291003-338511768 + public final static int FriendFindingRoomComposer = 1210; // PRODUCTION-201611291003-338511768 + public final static int UnknownQuestComposer1 = 230; // PRODUCTION-201611291003-338511768 + public final static int ModToolSanctionDataComposer = 2782; // PRODUCTION-201611291003-338511768 + public final static int RoomEventMessageComposer = 2274; + /** + * int << count + * { + * string << ? + * int << Count + * { + * string << Name + * int << ID + * string << Consequence + * } + * } + */ + + + + /** + * Music Disks / Trax / Jukebox + */ + public final static int JukeBoxMySongsComposer = 2602; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxNowPlayingMessageComposer = 469; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxPlaylistFullComposer = 105; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxPlayListUpdatedComposer = 1748; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxPlayListAddSongComposer = 1140; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxPlayListComposer = 34; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxTrackDataComposer = 3365; // PRODUCTION-201611291003-338511768 + public final static int JukeBoxTrackCodeComposer = 1381; // PRODUCTION-201611291003-338511768 + + /** + * Crafting + */ + public final static int CraftableProductsComposer = 1000; // PRODUCTION-201611291003-338511768 + public final static int CraftingRecipeComposer = 2774; // PRODUCTION-201611291003-338511768 + public final static int CraftingResultComposer = 618; // PRODUCTION-201611291003-338511768 + public final static int CraftingComposerFour = 2124; // PRODUCTION-201611291003-338511768 + + public final static int UnknownComposer_100 = 1553; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1031 = 1001; // PRODUCTION-201611291003-338511768 + public final static int ConnectionErrorComposer = 1004; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_111 = 296; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1111 = 1551; // PRODUCTION-201611291003-338511768 + public final static int Game2WeeklyLeaderboardComposer = 2196; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1165 = 904; // PRODUCTION-201611291003-338511768 + public final static int EffectsListAddComposer = 2867; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1188 = 1437; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1218 = 1730; // PRODUCTION-201611291003-338511768 + public final static int SubmitCompetitionRoomComposer = 3841; // PRODUCTION-201611291003-338511768 + public final static int GameAchievementsListComposer = 2265; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1271 = 1660; // PRODUCTION-201611291003-338511768 + public final static int OtherTradingDisabledComposer = 1254; // PRODUCTION-201611291003-338511768 + public final static int BaseJumpUnloadGameComposer = 1715; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1322 = 1730; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_137 = 2897; // PRODUCTION-201611291003-338511768 + public final static int GameCenterAccountInfoComposer = 2893; // PRODUCTION-201611291003-338511768 + public final static int UnknowComposer_1390 = 2270; // PRODUCTION-201611291003-338511768 + public final static int BaseJumpLoadGameComposer = 3654; // PRODUCTION-201611291003-338511768 + public final static int UnknowComposer_1427 = 3319; // PRODUCTION-201611291003-338511768 + public final static int AdventCalendarDataComposer = 2531; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_152 = 3954; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1529 = 1730; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1577 = 2641; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1712 = 1730; // PRODUCTION-201611291003-338511768 + public final static int NewYearResolutionCompletedComposer = 740; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1741 = 2246; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1744 = 2873; // PRODUCTION-201611291003-338511768 + public final static int AdventCalendarProductComposer = 2551; // PRODUCTION-201611291003-338511768 + public final static int ModToolSanctionInfoComposer = 2221; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_1965 = 3292; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_2053 = 1660; // PRODUCTION-201611291003-338511768 + public final static int GuideSessionPartnerIsPlayingComposer = 448; // PRODUCTION-201611291003-338511768 + public final static int BaseJumpLeaveQueueComposer = 1477; // PRODUCTION-201611291003-338511768 + public final static int Game2WeeklySmallLeaderboardComposer = 3512; // PRODUCTION-201611291003-338511768 + public final static int CatalogBuyVIPSMSComposer = 3315; // PRODUCTION-201611291003-338511768 + public final static int GameCenterGameListComposer = 222; // PRODUCTION-201611291003-338511768 + public final static int RoomUsersGuildBadgesComposer = 2402; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_2563 = 1774; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_2601 = 1663; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_2621 = 1927; // PRODUCTION-201611291003-338511768 + public final static int UnknownComposer_2698 = 563; // PRODUCTION-201611291003-338511768 +// 2699; +// 2748; +// 2773; +// 2964; +// 3020; +// 3024; +// 3046; +// 3124; +// 3179; +// 3189; +// 328; +// 3291; +// 3334; + public final static int HabboWayQuizComposer1 = 3379; +// 3391; +// 3427; +// 347; +// 3509; +// 3519; +// 3581; +// 3684; + public final static int YouTradingDisabledComposer = 3058; // PRODUCTION-201611291003-338511768 +// 3707; +// 3745; +// 3759; +// 3782; + public final static int RoomFloorThicknessUpdatedComposer = 3786; +// 3822; + public final static int CameraPurchaseSuccesfullComposer = 2783; // PRODUCTION-201611291003-338511768 + public final static int CameraCompetitionStatusComposer = 133; // PRODUCTION-201611291003-338511768 +// 3986; +// 467; +// 549; + public final static int CameraURLComposer = 3696; // PRODUCTION-201611291003-338511768 +// 608; +// 624; +// 675; + public final static int HotelViewCatalogPageExpiringComposer = 690; +// 749; +// 812; +// 843; +// 947; +// 982; + + + public final static int SimplePollAnswerComposer = 2589; + + public final static int SomeConnectionComposer = 3928; + public final static int TradingWaitingConfirmComposer = 2720; + public final static int BaseJumpJoinQueueComposer = 2260; + public final static int ClubCenterDataComposer = 3277; + + public final static int SimplePollAnswersComposer = 1066; + public final static int UnknownFurniModelComposer = 1501; + public final static int UnknownAdManagerComposer = 1808; + public final static int UnknownWiredComposer = 1830; + public final static int UnknownCatalogPageOfferComposer = 1889; + public final static int NuxAlertComposer = 2023; + public final static int HotelViewExpiringCatalogPageCommposer = 2515; + public final static int UnknownHabboWayQuizComposer =2772; + public final static int PetLevelUpdatedComposer = 2824; + public final static int QuestExpiredComposer = 3027; + public final static int UnknownTradeComposer = 3128; + public final static int UnknownMessengerErrorComposer = 3359; + public final static int UnknownComposer8 = 3441; + public final static int RemoveRoomEventComposer = 3479; + public final static int UnknownCompetitionComposer = 3506; + public final static int UnknownRoomViewerComposer = 3523; + public final static int ErrorLoginComposer = 4000; + public final static int HotelViewNextLTDAvailableComposer = 44; + public final static int UnknownRoomDesktopComposer = 69; + public final static int UnknownGuildComposer3 = 876; + + public final static int GameCenterGameComposer = 3805; + /* + 0x0909 //unused +1347 //Unused cry[to +195 //unused +1982 //unused +2142 //unused +2494 //u +2668 //u +2756 //u +2819 //u +3035 //u +3099 //u +3138 //u +3191 //u +3560 //Game2WeeklyLeaderboardParser +3684 //u +3805 //u Gamecomposer +3863 //u +3885 //u Crypto +3915 //u + +416 //u + +463 //u +600 //u + +761 //u +872 //u + + + */ + + public static final int SnowStormGameStartedComposer = 5000; + public static final int SnowStormQuePositionComposer = 5001; + public static final int SnowStormStartBlockTickerComposer = 5002; + public static final int SnowStormStartLobbyCounterComposer = 5003; + public static final int SnowStormUnusedAlertGenericComposer = 5004; + public static final int SnowStormLongDataComposer = 5005; + public static final int SnowStormGameEndedComposer = 5006; + public static final int SnowStormQuePlayerAddedComposer = 5008; + public static final int SnowStormPlayAgainComposer = 5009; + public static final int SnowStormGamesLeftComposer = 5010; + public static final int SnowStormQuePlayerRemovedComposer = 5011; + public static final int SnowStormGamesInformationComposer = 5012; + public static final int SnowStormLongData2Composer = 5013; + public static final int UNUSED_SNOWSTORM_5014 = 5014; + public static final int SnowStormGameStatusComposer = 5015; + public static final int SnowStormFullGameStatusComposer = 5016; + public static final int SnowStormOnStageStartComposer = 5017; + public static final int SnowStormIntializeGameArenaViewComposer = 5018; + public static final int SnowStormRejoinPreviousRoomComposer = 5019; + public static final int UNKNOWN_SNOWSTORM_5020 = 5020; + public static final int SnowStormLevelDataComposer = 5021; + public static final int SnowStormOnGameEndingComposer = 5022; + public static final int SnowStormUserChatMessageComposer = 5023; + public static final int SnowStormOnStageRunningComposer = 5024; + public static final int SnowStormOnStageEndingComposer = 5025; + public static final int SnowStormIntializedPlayersComposer = 5026; + public static final int SnowStormOnPlayerExitedArenaComposer = 5027; + public static final int SnowStormGenericErrorComposer = 5028; + public static final int SnowStormUserRematchedComposer = 5029; +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing_1006.java b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing_1006.java new file mode 100644 index 00000000..32c417e3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing_1006.java @@ -0,0 +1,850 @@ +package com.eu.habbo.messages.outgoing; + +public class Outgoing_1006 +{ + + /* + Talents + */ + //public static final int TalentTrackComposer = 2842; + + /* + Wired + */ + /*public static final int WiredTriggerDataComposer = 861; + public static final int WiredEffectDataComposer = 1279; + public static final int WiredConditionDataComposer = 1639; + public static final int WiredSavedComposer = 39; + + /* + Pets + */ + /*public static final int PetInformationComposer = 2286; + public static final int RoomPetRespectComposer = 778; + public static final int RoomPetExperienceComposer = 717; + public static final int PetTrainingPanelComposer = 456; + public static final int RoomPetHorseFigureComposer = 1644; + + /* + Groups + */ + /*public static final int GuildBuyRoomsComposer = 3938; + public static final int GroupPartsComposer = 567; + public static final int GuildBoughtComposer = 389; + public static final int GuildInfoComposer = 2978; + public static final int GuildManageComposer = 601; + public static final int GuildMembersComposer = 3986; + public static final int GuildJoinErrorComposer = 1952; + public static final int GuildRefreshMembersListComposer = 2055; + public static final int GuildMemberUpdateComposer = 862; + public static final int GuildListComposer = 587; + public static final int GuildFurniWidgetComposer = 269; + + /* + Trading + */ + /*public static final int TradeUpdateComposer = 1221; + public static final int TradeStartComposer = 3713; + public static final int TradeStartFailComposer = 2320; + public static final int TradeCompleteComposer = 3766; + public static final int TradeCloseWindowComposer = 2000; + public static final int TradeStoppedComposer = 2020; + public static final int TradeAcceptedComposer = 741; + + /* + ModTool + */ + /*public static final int ModToolComposer = 1901; + public static final int ModToolRoomInfoComposer = 3722; + public static final int ModToolRoomChatlogComposer = 3869; + public static final int ModToolRoomEntryInfoComposer = 2644; + public static final int ModToolUserInfoComposer = 2583; + public static final int ModToolUserChatlogComposer = 3738; + public static final int ModToolUserRoomVisitsComposer = 2129; + public static final int ModToolIssueInfoComposer = 2473; + public static final int ModToolIssueChatlogComposer = 1445; + public static final int ModToolIssueUpdateComposer = 3019; + public static final int ModToolComposerOne = 2303; + public static final int ModToolComposerTwo = 1917; + + /* + Catalog + */ + /*public static final int GiftConfigurationComposer = 1048; + public static final int DiscountComposer = 1061; + public static final int MarketplaceConfigComposer = 2524; + public static final int CatalogUpdatedComposer = 2028; + public static final int CatalogModeComposer = 3442; + public static final int CatalogPagesListComposer = 1684; + public static final int CatalogPageComposer = 3518; + public static final int PurchaseOKComposer = 1189; + public static final int RecyclerLogicComposer = 1317; + public static final int ReloadRecyclerComposer = 1093; + public static final int RecyclerCompleteComposer = 2125; + public static final int ClubDataComposer = 1919; + + public static final int MarketplaceOwnItemsComposer = 593; + public static final int MarketplaceCancelSaleComposer = 1959; + public static final int MarketplaceOffersComposer = 3289; + public static final int MarketplaceItemInfoComposer = 1066; + public static final int MarketplaceBuyErrorComposer = 1823; + public static final int MarketplaceSellItemComposer = 1932; + + public static final int PetBreedsComposer = 3302; + public static final int PetNameErrorComposer = 3575; + + /* + Alerts (All of them) + */ + /*public static final int AlertLimitedSoldOutComposer = 3290; + public static final int AlertPurchaseFailedComposer = 2602; + public static final int RedeemVoucherOKComposer = 2719; + public static final int RedeemVoucherErrorComposer = 2630; + public static final int RoomEnterErrorComposer = 1619; + public static final int WiredRewardAlertComposer = 723; + public static final int PetErrorComposer = 779; + public static final int BotErrorComposer = 3420; + public static final int BubbleAlertComposer = 777; + public static final int GenericErrorMessages = 2839; + + /* + Handshake + */ + /*public static final int BannerTokenComposer = 3033; + public static final int SecureLoginOKComposer = 2753; + public static final int SessionRightsComposer = 1313; + public static final int DebugConsoleComposer = 336; + + /* + HotelView + */ + /* public static final int HotelViewComposer = 3152; + public static final int HallOfFameComposer = 670; + public static final int NewsWidgetsComposer = 1345; + public static final int BonusRareComposer = 3517; + public static final int HotelViewDataComposer = 1374; + + /* + Generic + */ + /* public static final int GenericAlertComposer = 1548; + public static final int MinimailCountComposer = 2253; + public static final int FavoriteRoomsCountComposer = 3829; + + /* + Polls + */ + //public static final int PollStartComposer = 749; + //public static final int PollQuestionsComposer = 3187; + + /* + Friends + */ + /*public static final int FriendsComposer = 2067; + public static final int UpdateFriendComposer = 170; + public static final int UserSearchResultComposer = 1573; + public static final int FriendRequestComposer = 2468; + public static final int RemoveFriendComposer = 1106; + public static final int FriendChatMessageComposer = 2094; + public static final int LoadFriendRequestsComposer = 2193; + public static final int FriendRequestErrorComposer = 2467; + public static final int StalkErrorComposer = 1135; + + /* + Inventory + */ + /*public static final int InventoryItemsComposer = 3029; + public static final int InventoryPetsComposer = 435; + public static final int InventoryBotsComposer = 320; + public static final int InventoryBadgesComposer = 1629; + public static final int AddHabboItemComposer = 274; + public static final int AddBotComposer = 3043; + public static final int RemoveBotComposer = 2565; + public static final int RemoveHabboItemComposer = 3233; + public static final int InventoryRefreshComposer = 3243; + public static final int InventoryItemUpdateComposer = 1577; + public static final int AddPetComposer = 3099; + public static final int RemovePetComposer = 467; + public static final int InventoryAchievementsComposer = 3295; + + /* + Navigator + */ + /*public static final int RoomCategoriesComposer = 3241; + public static final int PublicRoomsComposer = 2506; + public static final int PrivateRoomsComposer = 2653; + public static final int CanCreateRoomComposer = 2463; + public static final int RoomCreatedComposer = 3373; + public static final int TagsComposer = 3487; + + /* + Rooms + */ + /*public static final int RoomPaintComposer = 2979; + public static final int RoomRightsComposer = 520; + public static final int RoomOwnerComposer = 1069; + public static final int RoomScoreComposer = 2805; + public static final int RoomDataComposer = 3995; + public static final int RoomHeightMapComposer = 1624; + public static final int RoomUsersComposer = 1073; + public static final int RoomThicknessComposer = 2627; + public static final int RoomOpenComposer = 925; + public static final int RoomModelComposer = 2297; + public static final int RoomRelativeMapComposer = 1975; + public static final int RoomPaneComposer = 2644; + public static final int RoomFloorItemsComposer = 2124; + public static final int RoomWallItemsComposer = 395; + public static final int RoomUserTalkComposer = 612; + public static final int RoomUserShoutComposer = 3271; + public static final int RoomUserWhisperComposer = 2323; + public static final int RoomUserActionComposer = 12; + public static final int RoomUserRespectComposer = 2143; + public static final int RoomUserDanceComposer = 2091; + public static final int RoomUserEffectComposer = 3040; + public static final int RoomUserStatusComposer = 3386; + public static final int RoomUserRemoveComposer = 2819; + public static final int AddWallItemComposer = 2156; + public static final int AddFloorItemComposer = 1590; + public static final int RemoveWallItemComposer = 2466; + public static final int RemoveFloorItemComposer = 36; + public static final int FloorItemUpdateComposer = 648; + public static final int UpdateStackHeightComposer = 1576; + public static final int RoomUserTypingComposer = 3624; + public static final int WallItemUpdateComposer = 2190; + public static final int RoomUserHandItemComposer = 3664; + public static final int RoomUserRemoveRightsComposer = 1496; + public static final int RoomRightsListComposer = 1891; + public static final int RoomAddRightsListComposer = 3611; + public static final int ChangeNameUpdatedComposer = 542; + public static final int BotSettingsComposer = 1522; + public static final int RoomSettingsUpdatedComposer = 543; + public static final int RoomChatSettingsComposer = 3710; + public static final int DoorbellAddUserComposer = 3198; + public static final int RoomAccessDeniedComposer = 3953; + public static final int MoodLightDataComposer = 2033; + public static final int ObjectOnRollerComposer = 1488; + public static final int PresentItemOpenedComposer = 1540; + public static final int FreezeLivesComposer = 3526; + + /* + Users + */ + /*public static final int UserBCLimitsComposer = 3442; + public static final int UserCurrencyComposer = 3454; + public static final int UserDataComposer = 3491; + public static final int UserPerksComposer = 1218; + public static final int UserPermissionsComposer = 3872; + public static final int UserCreditsComposer = 2204; + public static final int UserClubComposer = 2869; + public static final int MeMenuSettingsComposer = 15; + public static final int UserCitizinShipComposer = 3439; + public static final int UserTagsComposer = 933; + public static final int UserHomeRoomComposer = 40; + public static final int UserProfileComposer = 1503; + public static final int ProfileFriendsComposer = 322; + public static final int UserUpdateCurrencyComposer = 1290; + public static final int UserWardrobeComposer = 370; + public static final int RoomUserDataComposer = 3944; + public static final int UserBadgesComposer = 3486; + public static final int AddUserBadgeComposer = 3197; + + /* + Ones that are someway implemented but not correctly. + */ + public static final int PetStatusUpdateComposer = 3566; //Updated + + /* + Not implemented but know what they are: + */ + /*public static final int UserAddEffectComposer = 2181; //int, int, int (type, ?? (effectId?), duration + + public final static int FavoriteRoomsCountComposer = 2420;//3829 + public final static int UserCurrencyComposer = 584;//3454 + public final static int RedeemVoucherOKComposer = 2136;//2719 + public final static int RoomUserShoutComposer = 3274;//3271 + public final static int RoomUserStatusComposer = 2566;//3386 + public final static int RoomUserDataComposer = 2538;//3944 + public final static int RoomAddRightsListComposer = 1992;//3611 + public final static int RoomRemoveRightsListComposer = 2021; + public final static int RoomRightsListComposer = 2857;//1891 + public final static int RoomUserHandItemComposer = 2425;//3664 + public final static int RoomUsersComposer = 961;//1073 + public final static int FriendRequestComposer = 3550;//2468 + public final static int GuildBoughtComposer = 2087;//389 + public final static int AddUserBadgeComposer = 10;//3197 + public final static int RecyclerCompleteComposer = 1513;//2125 + public final static int GuildBuyRoomsComposer = 3938;//3938 + public final static int FriendsComposer = 1535;//2067 + public final static int StalkErrorComposer = 1739;//1135 + public final static int TradeCloseWindowComposer = 3545;//2000 + public final static int RemoveFloorItemComposer = 679;//36 + public final static int InventoryPetsComposer = 2799;//435 + public final static int UserCreditsComposer = 689;//2204 + public final static int WiredTriggerDataComposer = 3639;//861 + public final static int TradeStoppedComposer = 1941;//2020 + public final static int ModToolUserChatlogComposer = 912;//3738 + public final static int GuildInfoComposer = 3398;//2978 + public final static int UserPermissionsComposer = 3514;//3872 + public final static int PetNameErrorComposer = 2773;//3575 + public final static int TradeStartFailComposer = 796;//2320 + public final static int AddHabboItemComposer = 828;//274 + public final static int InventoryBotsComposer = 3908;//320 + public final static int CanCreateRoomComposer = 1458;//2463 + public final static int MarketplaceBuyErrorComposer = 3313;//1823 + public final static int BonusRareComposer = 2194;//3517 + public final static int HotelViewComposer = 2553;//3152 + public final static int UpdateFriendComposer = 2605;//170 //2605 + public final static int FloorItemUpdateComposer = 1334;//648 + public final static int RoomAccessDeniedComposer = 1504;//3953 + public final static int GuildFurniWidgetComposer = 2909;//269 + public final static int GiftConfigurationComposer = 1965;//1048 + public final static int UserClubComposer = 3926;//2869 + public final static int InventoryBadgesComposer = 79;//1629 + public final static int RoomUserTypingComposer = 3765;//3624 + public final static int GuildJoinErrorComposer = 1551;//1952 + public final static int RoomCategoriesComposer = 815;//3241 + public final static int InventoryAchievementsComposer = 894;//3295 + public final static int MarketplaceItemInfoComposer = 688;//1066 + public final static int UserTagsComposer = 1578;//933 + public final static int RoomRelativeMapComposer = 124;//1975 + public final static int ModToolComposerTwo = 1761;//1917 + public final static int ModToolComposerOne = 2621;//2303 + public final static int RoomRightsComposer = 3358;//520 + public final static int ObjectOnRollerComposer = 1294;//1488 + public final static int PollStartComposer = 3353;//749 + public final static int GuildRefreshMembersListComposer = 3650;//2055 + public final static int UserPerksComposer = 2284;//1218 + public final static int UserCitizinShipComposer = 2486;//3439 + public final static int PublicRoomsComposer = 2433;//2506 + public final static int MarketplaceOffersComposer = 3738;//3289 + public final static int ModToolComposer = 3064;//1901 + public final static int UserBadgesComposer = 820;//3486 + public final static int GuildManageComposer = 1797;//601 + public final static int RemoveFriendComposer = -1106;//1106 + public final static int BannerTokenComposer = -3033;//3033 + public final static int UserDataComposer = 2337;//3491 + public final static int UserSearchResultComposer = 1542;//1573 + public final static int ModToolUserRoomVisitsComposer = 2728;//2129 + public final static int RoomUserRespectComposer = 2019;//2143 + public final static int RoomChatSettingsComposer = 864;//3710 + public final static int RemoveHabboItemComposer = 2192;//3233 + public final static int RoomUserRemoveComposer = 2529;//2819 + public final static int RoomHeightMapComposer = 3157;//1624 + public final static int RoomPetHorseFigureComposer = 1312;//1644 + public final static int PetErrorComposer = 1940;//779 + public final static int TradeUpdateComposer = 77;//1221 + public final static int PrivateRoomsComposer = 1251;//2653 + public final static int RoomModelComposer = 617;//2297 + public final static int RoomScoreComposer = 2925;//2805 + public final static int DoorbellAddUserComposer = 3556;//3198 + public final static int SecureLoginOKComposer = 294;//2753 + public final static int SessionRightsComposer = 376;//1313 + public final static int GuildMemberUpdateComposer = 3609;//862 + public final static int RoomFloorItemsComposer = 2648;//2124 + public final static int InventoryItemsComposer = 1927;//3029 + public final static int RoomUserTalkComposer = 2735;//612 + public final static int TradeStartComposer = 181;//3713 + public final static int InventoryItemUpdateComposer = 369;//1577 + public final static int ModToolIssueUpdateComposer = 2951;//3019 + public final static int MeMenuSettingsComposer = 1362;//15 + public final static int ModToolRoomInfoComposer = 84;//3722 + public final static int GuildListComposer = 3445;//587 + public final static int RecyclerLogicComposer = 3486;//1317 + public final static int UserHomeRoomComposer = 1730;//40 + public final static int RoomUserDanceComposer = 3848;//2091 + public final static int RoomSettingsUpdatedComposer = 3128;//543 + public final static int AlertPurchaseFailedComposer = 1860;//2602 + public final static int RoomDataComposer = 3986;//3995 + public final static int TagsComposer = 3149;//3487 + public final static int InventoryRefreshComposer = 1276;//3243 + public final static int RemovePetComposer = 3118;//467 + public final static int RemoveWallItemComposer = -2466;//2466 + public final static int TradeCompleteComposer = 418;//3766 + public final static int NewsWidgetsComposer = 72;//1345 + public final static int WiredEffectDataComposer = 1532;//1279 + public final static int BubbleAlertComposer = 1950;//777 + public final static int ReloadRecyclerComposer = 3918;//1093 + public final static int MoodLightDataComposer = 1869;//2033 + public final static int WiredRewardAlertComposer = 1603;//723 + public final static int CatalogPageComposer = 2551;//3518 + public final static int CatalogModeComposer = 1942;//3442 + public final static int ChangeNameUpdatedComposer = 311;//542 + public final static int AddFloorItemComposer = 1880;//1590 + public final static int DebugConsoleComposer = 2718;//336 + public final static int HallOfFameComposer = 92;//670 + public final static int WiredSavedComposer = 2429;//39 + public final static int RoomPaintComposer = 2205;//2979 + public final static int MarketplaceConfigComposer = 2120;//2524 + public final static int AddBotComposer = 254;//3043 + public final static int FriendRequestErrorComposer = 3134;//2467 + public final static int GuildMembersComposer = 1648;//3986 + public final static int RoomOpenComposer = 2561;//925 //2561 1945?? + public final static int ModToolRoomChatlogComposer = 3893;//3869 + public final static int DiscountComposer = 1768;//1061 + public final static int MarketplaceCancelSaleComposer = 2239;//1959 + public final static int RoomPetRespectComposer = 3841;//778 + public final static int RoomSettingsComposer = 2461; + public final static int TalentTrackComposer = 2912;//2842 + public final static int CatalogPagesListComposer = 2353;//1684 + public final static int AlertLimitedSoldOutComposer = 604;//3290 + public final static int CatalogUpdatedComposer = 1311;//2028 + public final static int PurchaseOKComposer = 1636;//1189 + public final static int WallItemUpdateComposer = 3292;//2190 + public final static int TradeAcceptedComposer = 2316;//741 + public final static int AddWallItemComposer = 3887;//2156 + public final static int ModToolRoomEntryInfoComposer = 2561;//2644 + public final static int HotelViewDataComposer = 1579;//1374 + public final static int PresentItemOpenedComposer = 3424;//1540 + public final static int RoomUserRemoveRightsComposer = 3566;//1496 + public final static int UserBCLimitsComposer = 1942;//3442 + public final static int PetTrainingPanelComposer = 3760;//456 + public final static int RoomPaneComposer = 2561;//2644 + public final static int RedeemVoucherErrorComposer = 2571;//2630 + public final static int RoomCreatedComposer = 3648;//3373 + public final static int GenericAlertComposer = 3406;//1548 + public final static int GroupPartsComposer = 1817;//567 + public final static int ModToolIssueInfoComposer = 1848;//2473 + public final static int RoomUserWhisperComposer = 1428;//2323 + public final static int BotErrorComposer = 3932;//3420 + public final static int FreezeLivesComposer = 1128;//3526 + public final static int LoadFriendRequestsComposer = 1926;//2193 + public final static int MarketplaceSellItemComposer = 1165;//1932 + public final static int ClubDataComposer = 3753;//1919 + public final static int ProfileFriendsComposer = 168;//322 + public final static int MarketplaceOwnItemsComposer = 1181;//593 + public final static int RoomOwnerComposer = 2146;//1069 + public final static int WiredConditionDataComposer = 856;//1639 + public final static int ModToolUserInfoComposer = 1557;//2583 + public final static int UserWardrobeComposer = 773;//370 + public final static int UserUpdateCurrencyComposer = 1245;//1290 + public final static int RoomPetExperienceComposer = 2143;//717 + public final static int FriendChatMessageComposer = 625;//2094 + public final static int PetInformationComposer = 3752;//2286 + public final static int RoomThicknessComposer = 299;//2627 + public final static int AddPetComposer = 211;//3099 + public final static int UpdateStackHeightComposer = 1350;//1576 + public final static int RemoveBotComposer = 397;//2565 + public final static int RoomEnterErrorComposer = 1754;//1619 + public final static int PollQuestionsComposer = 1745;//3187 + public final static int GenericErrorMessages = 3478;//2839 + public final static int RoomWallItemsComposer = 3583;//395 + public final static int RoomUserEffectComposer = 3863;//3040 + public final static int PetBreedsComposer = 1433;//3302 + public final static int ModToolIssueChatlogComposer = 610;//1445 + public final static int RoomUserActionComposer = 2482;//12 + public final static int BotSettingsComposer = 772;//1522 + public final static int UserProfileComposer = 2023;//1503 + public final static int MinimailCountComposer = 1162;//2253 + public final static int UserAchievementScoreComposer = 2994; + public final static int PetLevelUpComposer = 2329; + public final static int UserPointsComposer = 1245; + public final static int ReportRoomFormComposer = 3216; + public final static int ModToolIssueHandledComposer = 2876; + public final static int FloodCounterComposer = 1774; + public final static int UpdateFailedComposer = 2612; + public final static int FloorPlanEditorDoorSettingsComposer = 1633; + public final static int FloorPlanEditorBlockedTilesComposer = 1874; + public final static int BuildersClubExpiredComposer = 108; + public final static int RoomSettingsSavedComposer = 0;*/ + + public final static int FavoriteRoomsCountComposer = 235;//3829 //Updated + public final static int UserCurrencyComposer = 3574;//3454 //Updated + public final static int RedeemVoucherOKComposer = 391;//2719 //Updated + public final static int RoomUserShoutComposer = 59;//3271 //Updated + public final static int RoomUserStatusComposer = 12;//3386 //Updated + public final static int RoomUserDataComposer = 2421;//3944 //Updated + public final static int RoomAddRightsListComposer = 2589;//3611 //Updated + public final static int RoomRemoveRightsListComposer = 3258; //Updated + public final static int RoomRightsListComposer = 1964;//1891 //Updated + public final static int RoomUserHandItemComposer = 2479;//3664 //Updated + public final static int RoomUsersComposer = 1018;//1073 //Updated + public final static int FriendRequestComposer = 2725;//2468 //Updated + public final static int GuildBoughtComposer = 2244;//389 //Updated + public final static int AddUserBadgeComposer = 3489;//3197 //Updated + public final static int RecyclerCompleteComposer = 899;//2125 //Updated + public final static int GuildBuyRoomsComposer = 575;//3938 //Updated + public final static int FriendsComposer = 7;//2067 //Updated + public final static int StalkErrorComposer = 1543;//1135 //Updated + public final static int TradeCloseWindowComposer = 1850;//2000 //Updated + public final static int RemoveFloorItemComposer = 2658;//36 //Updated + public final static int InventoryPetsComposer = 3249;//435 //Updated + public final static int UserCreditsComposer = 1557;//2204 //Updated + public final static int WiredTriggerDataComposer = 951;//861 //Updated + public final static int TradeStoppedComposer = 3869;//2020 //Updated + public final static int ModToolUserChatlogComposer = 342;//3738 //Updated + public final static int GuildInfoComposer = 3198;//2978 //Updated + public final static int UserPermissionsComposer = 3409;//3872 //Updated + public final static int PetNameErrorComposer = 1991;//3575 //Updated + public final static int TradeStartFailComposer = 283;//2320 //Updated + public final static int AddHabboItemComposer = 3454;//274 //Updated + public final static int InventoryBotsComposer = 307;//320 //Updated + public final static int CanCreateRoomComposer = 2877;//2463 //Updated + public final static int MarketplaceBuyErrorComposer = 1299;//1823 //Updated + public final static int BonusRareComposer = 2261;//3517 //Updated + public final static int HotelViewComposer = 0x0404;//3152 //Updated + public final static int UpdateFriendComposer = 3525;//170 //Updated + public final static int FloorItemUpdateComposer = 2277;//648 //Updated + public final static int RoomAccessDeniedComposer = 2897;//3953 //Updated + public final static int GuildFurniWidgetComposer = 1875;//269 //Updated + public final static int GiftConfigurationComposer = 1715;//1048 //Updated + public final static int UserClubComposer = 2018;//2869 //Updated + public final static int InventoryBadgesComposer = 399;//1629 //Updated + public final static int RoomUserTypingComposer = 2327;//3624 //Updated + public final static int GuildJoinErrorComposer = 1761;//1952 //Updated + public final static int RoomCategoriesComposer = 1824;//3241 //Updated + public final static int InventoryAchievementsComposer = 2539;//3295 //Updated + public final static int MarketplaceItemInfoComposer = 894;//1066 //Updated + public final static int RoomRelativeMapComposer = 3287;//1975 //Updated + public final static int ModToolComposerTwo = 1890;//1917 //Updated + public final static int ModToolComposerOne = 1722;//2303 //Updated + public final static int RoomRightsComposer = 1421;//520 //Updated + public final static int ObjectOnRollerComposer = 450;//1488 //Updated + public final static int PollStartComposer = 3206;//749 //Updated + public final static int GuildRefreshMembersListComposer = 1661;//2055 //Updated + public final static int UserPerksComposer = 3281;//1218 //Updated + public final static int UserCitizinShipComposer = 3285;//3439 //Updated + public final static int PublicRoomsComposer = 972;//2506 //Updated //-> 580 (Oud)? + public final static int MarketplaceOffersComposer = 2440;//3289 //Updated + public final static int ModToolComposer = 3087;//1901 //Updated + public final static int UserBadgesComposer = 2442;//3486 //Updated + public final static int GuildManageComposer = 2129;//601 //Updated + public final static int RemoveFriendComposer = -1106;//1106 + public final static int BannerTokenComposer = -3033;//3033 + public final static int UserDataComposer = 558;//3491 //Updated + public final static int UserSearchResultComposer = 1590;//1573 //Updated + public final static int ModToolUserRoomVisitsComposer = 520;//2129 //Updated + public final static int RoomUserRespectComposer = 3137;//2143 //Updated + public final static int RoomChatSettingsComposer = 901;//3710 //Updated + public final static int RemoveHabboItemComposer = 2368;//3233 //Updated + public final static int RoomUserRemoveComposer = 364;//2819 //Updated + public final static int RoomHeightMapComposer = 3491;//1624 //Updated + public final static int RoomPetHorseFigureComposer = 3140;//1644 //Updated + public final static int PetErrorComposer = 3013;//779 //Updated + public final static int TradeUpdateComposer = 1649;//1221 //Update + public final static int PrivateRoomsComposer = 2523;//2653 //Updated + public final static int RoomModelComposer = 1186;//2297 //Updated + public final static int RoomScoreComposer = 1781;//2805 //Updated + public final static int KnockKnockComposer = 2988;//3198 //Updated + public final static int SecureLoginOKComposer = 1992;//2753 //Updated + public final static int SessionRightsComposer = 2934;//1313 //Updated + public final static int GuildMemberUpdateComposer = 3641;//862 //Updated + public final static int RoomFloorItemsComposer = 144;//2124 //Updated + public final static int InventoryItemsComposer = 1559;//3029 //Updated + public final static int RoomUserTalkComposer = 874;//612 //Updated + public final static int TradeStartComposer = 833;//3713 //Updated + public final static int InventoryItemUpdateComposer = 2204;//1577 //Updated + public final static int ModToolIssueUpdateComposer = 471;//3019 //Updated + public final static int MeMenuSettingsComposer = 3437;//15 //Updated + public final static int ModToolRoomInfoComposer = 1328;//3722 //Updated + public final static int GuildListComposer = 3082;//587 //Updated + public final static int RecyclerLogicComposer = 1527;//1317 //Updated + public final static int UserHomeRoomComposer = 3876;//40 //Updated + public final static int RoomUserDanceComposer = 2184;//2091 //Updated + public final static int RoomSettingsUpdatedComposer = 1069;//543 //Updated + public final static int AlertPurchaseFailedComposer = 2663;//2602 //Updated + public final static int RoomDataComposer = 624;//3995 //Updated + public final static int TagsComposer = 456;//3487 //Updated + public final static int InventoryRefreshComposer = 2352;//3243 //Updated + public final static int RemovePetComposer = 775;//467 //Updated + public final static int RemoveWallItemComposer = 1980;//2466 //Updated + public final static int TradeCompleteComposer = 1668;//3766 //Updated + public final static int NewsWidgetsComposer = 3958;//1345 //Updated + public final static int WiredEffectDataComposer = 2101;//1279 //Updated + public final static int BubbleAlertComposer = 1569;//777 //Updated + public final static int ReloadRecyclerComposer = 3704;//1093 //Updated + public final static int MoodLightDataComposer = 2780;//2033 //Updated + public final static int WiredRewardAlertComposer = 1539;//723 //Updated + public final static int CatalogPageComposer = 1384;//3518 //Updated + public final static int CatalogModeComposer = 3408;//3442 //Updated + public final static int RoomUserUpdateNameComposer = 1263;//542 //Updated + public final static int AddFloorItemComposer = 2502;//1590 //Updated + public final static int DebugConsoleComposer = 1003;//336 //Updated + public final static int HallOfFameComposer = 3736;//670 //Updated + public final static int WiredSavedComposer = 598;//39 //Updated + public final static int RoomPaintComposer = 2225;//2979 //Updated + public final static int MarketplaceConfigComposer = 739;//2524 //Updated + public final static int AddBotComposer = 1771;//3043 //Updated + public final static int FriendRequestErrorComposer = 3601;//2467 //Updated + public final static int GuildMembersComposer = 1788;//3986 //Updated + public final static int RoomOpenComposer = 2266;//925 //2561 1945?? //Updated + public final static int ModToolRoomChatlogComposer = 1633;//3869 //Updated + public final static int DiscountComposer = 3254;//1061 //Updated + public final static int MarketplaceCancelSaleComposer = 751;//1959 //Updated + public final static int RoomPetRespectComposer = 2348;//778 //Updated + public final static int RoomSettingsComposer = 3622; //Updated + public final static int TalentTrackComposer = 3235;//2842 //Updated + public final static int CatalogPagesListComposer = 402;//1684 //Updated + public final static int AlertLimitedSoldOutComposer = 3467;//3290 //Updated + public final static int CatalogUpdatedComposer = 2452;//2028 //Updated + public final static int PurchaseOKComposer = 2316;//1189 //Updated + public final static int WallItemUpdateComposer = 21;//2190 //Updated + public final static int TradeAcceptedComposer = 3042;//741 //Updated + public final static int AddWallItemComposer = 706;//2156 //Updated + public final static int ModToolRoomEntryInfoComposer = 381;//2644 //Updated + public final static int HotelViewDataComposer = 3810;//1374 //Updated + public final static int PresentItemOpenedComposer = 2004;//1540 //Updated TODO: -> BELANGRIJK: Zoek op: .push(new RoomUsersHandler voor andere items?? + public final static int RoomUserRemoveRightsComposer = 61;//1496 //Updated TODO: Doet geen ene flikker? + public final static int UserBCLimitsComposer = 3408;//3442 //Updated + public final static int PetTrainingPanelComposer = 1897;//456 //Updated + public final static int RoomPaneComposer = 381;//2644 //Updated + public final static int RedeemVoucherErrorComposer = 1809;//2630 //Updated + public final static int RoomCreatedComposer = 3168;//3373 //Updated + public final static int GenericAlertComposer = 1406;//1548 //Updated + public final static int GroupPartsComposer = 3569;//567 //Updated + public final static int ModToolIssueInfoComposer = 3928;//2473 //Updated + public final static int RoomUserWhisperComposer = 2945;//2323 //Updated + public final static int BotErrorComposer = 1932;//3420 //Updated + public final static int FreezeLivesComposer = 3985;//3526 //Updated + public final static int LoadFriendRequestsComposer = 683;//2193 //Updated + public final static int MarketplaceSellItemComposer = 92;//1932 //Updated + public final static int ClubDataComposer = 2273;//1919 //Updated + public final static int ProfileFriendsComposer = 2231;//322 //Updated + public final static int MarketplaceOwnItemsComposer = 311;//593 //Updated + public final static int RoomOwnerComposer = 3608;//1069 //Updated + public final static int WiredConditionDataComposer = 3969;//1639 //Updated + public final static int ModToolUserInfoComposer = 828;//2583 //Updated + public final static int UserWardrobeComposer = 406;//370 //Updated + public final static int RoomPetExperienceComposer = 3711;//717 //Updated + public final static int FriendChatMessageComposer = 3957;//2094 //Updated + public final static int PetInformationComposer = 64;//2286 //Updated + public final static int RoomThicknessComposer = 2145;//2627 //Updated + public final static int AddPetComposer = 2194;//3099 //Updated + public final static int UpdateStackHeightComposer = 597;//1576 //Updated + public final static int RemoveBotComposer = 3691;//2565 //Updated + public final static int RoomEnterErrorComposer = 817;//1619 //Updated + public final static int PollQuestionsComposer = 1143;//3187 //Updated + public final static int GenericErrorMessages = 1169;//2839 //Updated + public final static int RoomWallItemsComposer = 3524;//395 //Updated + public final static int RoomUserEffectComposer = 579;//3040 //Updated + public final static int PetBreedsComposer = 1947;//3302 //Updated + public final static int ModToolIssueChatlogComposer = 3053;//1445 //Updated + public final static int RoomUserActionComposer = 3741;//12 //Updated + public final static int BotSettingsComposer = 3092;//1522 //Updated + public final static int UserProfileComposer = 3049;//1503 //Updated + public final static int MinimailCountComposer = 761;//2253 //Updated + public final static int UserAchievementScoreComposer = 3681; //Updated + public final static int PetLevelUpComposer = 3100; //Updated + public final static int UserPointsComposer = 1439; //Updated + public final static int ReportRoomFormComposer = 2573; //Updated + public final static int ModToolIssueHandledComposer = 1297; //Updated + public final static int FloodCounterComposer = 2106; //Updated + public final static int UpdateFailedComposer = 3006; //Updated + public final static int FloorPlanEditorDoorSettingsComposer = 1988; //Updated + public final static int FloorPlanEditorBlockedTilesComposer = 3388; //Updated + public final static int BuildersClubExpiredComposer = 25; //Updated + public final static int RoomSettingsSavedComposer = 2769; //Updated + public final static int MessengerInitComposer = 3682; //Updated + public final static int UserClothesComposer = 2651; //Updated + public final static int UserEffectsListComposer = 1348; //Updated + public final static int NewUserIdentityComposer = 1733; //Updated + public final static int NewNavigatorEventCategoriesComposer = 1391; + public final static int NewNavigatorCollapsedCategoriesComposer = 3110; + public final static int NewNavigatorLiftedRoomsComposer = 2469; + public final static int NewNavigatorSavedSearchesComposer = 3349; + public final static int RoomUnitUpdateUsernameComposer = 2063; + public final static int PostItDataComposer = 3443; + public final static int ModToolReportReceivedAlertComposer = 3453; + public final static int ModToolIssueResponseAlertComposer = 971; + public final static int AchievementListComposer = 1417; + public final static int AchievementProgressComposer = 1550; + public final static int AchievementUnlockedComposer = 1335; + public final static int ClubGiftsComposer = 197; + public final static int MachineIDComposer = 3609; + public final static int PongComposer = 1349; + + //Uknown but work + public final static int UnknownComposer4 = 1411; + public final static int UnknownComposer5 = 568; + public final static int UnknownComposer6 = 32; + public final static int NewNavigatorMetaDataComposer = 1129; + public final static int NewNavigatorSearchResultsComposer = 3203; + public final static int MysticBoxStartOpenComposer = 3513; + public final static int MysticBoxCloseComposer = 2581; + public final static int MysticBoxPrizeComposer = 3040; + public final static int RentableSpaceInfoComposer = 194; + public final static int RentableSpaceUnknownComposer = 2051; + public final static int RentableSpaceUnknown2Composer = 1075; + public final static int GuildConfirmRemoveMemberComposer = 3940; + + public final static int LandingViewGetBadgeButtonConfig = 940; + public final static int EpicPopupFrameComposer = 916; + public final static int BaseJumpLoadGameURL = 871; + public final static int RoomUserTagsComposer = 799; + public final static int RoomInviteErrorCodeComposer = 76; + public final static int PostItStickyPoleOpenComposer = 753; + public final static int NewYearResolutionProgressComposer = 741; + public final static int ClubGiftReceivedComposer = 735; //:test 735 s:t i:1 s:s i:230 s:throne i:1 b:1 i:1 i:10; + public final static int ItemStateComposer = 664; //TODO: (i: itemId, i:state) + public final static int ItemExtraDataComposer = 654; //:test 654 s:92015 i:1 i:1 s:renterId s:0 s:0.0 s:0 + + //NotSure Needs Testing + public final static int QuestionInfoComposer = 3047; + public final static int TalentTrackEmailVerifiedComposer = 866; + public final static int TalentTrackEmailFailedComposer = 369; + public final static int UnknownAvatarEditorComposer = 72; + + public final static int UnknownGuildComposer = 588; //Could be related to forums. + + public final static int UnknownGuildForumComposer1 = 600; + public final static int UnknownGuildForumComposer2 = 1291; + public final static int UnknownGuildForumComposer3 = 1147; + public final static int UnknownGuildForumComposer4 = 3420; + public final static int UnknownGuildForumComposer5 = 324; + public final static int UnknownGuildForumComposer6 = 2161; + public final static int UnknownGuildForumComposer7 = 3853; + public final static int UnknownGuildForumComposer8 = 2695; + public final static int UnknownGuildForumComposer9 = 3077; + + public final static int GuideSessionAttachedComposer = 3549; + public final static int GuideSessionDetachedComposer = 2987; + public final static int GuideSessionStartedComposer = 3048; + public final static int GuideSessionEndedComposer = 3222; + public final static int GuideSessionErrorComposer = 978; + public final static int GuideSessionMessageComposer = 1860; + public final static int GuideSessionRequesterRoomComposer = 1861; + public final static int GuideSessionInvitedToGuideRoomComposer = 2959; + public final static int GuideSessionPartnerIsTypingComposer = 2955; + + public final static int GuideToolsComposer = 117; + public final static int GuardianNewReportReceivedComposer = 3123; + public final static int GuardianVotingRequestedComposer = 2331; + public final static int GuardianVotingVotesComposer = 3107; //:test 3107 i:10 i:0 i:1 i:2 i:3 i:4 i:5 i:0 i:1 i:2 i:3 + public final static int GuardianVotingResultComposer = 91; + public final static int GuardianVotingTimeEnded = 556; + + public final static int RoomMutedComposer = 554; + + public final static int RoomUnknown1Composer = 1241; + public final static int RoomUnknown2Composer = 535; + public final static int RoomUnknown3Composer = 2342; + + public final static int UnknownEffectsComposer = 53; //:test 53 i:10 + + public final static int OldPublicRoomsComposer = 580; + public final static int ItemStateComposer2 = 569; + + public final static int HotelWillCloseInMinutesComposer = 518; //:test 518 i:10 + public final static int HotelWillCloseInMinutesAndBackInComposer = 2860; //:test 2860 b:1 i:1 i:2 + public final static int HotelClosesAndWillOpenAtComposer = 2168; //:test 2168 i:0 i:1 b:1 + public final static int HotelClosedAndOpensComposer = 888; + public final static int StaffAlertAndOpenHabboWayComposer = 1035; + public final static int StaffAlertWithLinkComposer = 1189; + public final static int StaffAlertWIthLinkAndOpenHabboWayComposer = 3964; + + public final static int RoomMessagesPostedCountComposer = 1520; //:test 1520 i:12 s:Derp i:100 + public final static int CantScratchPetNotOldComposer = 118; //:test 118 i:1 i:2 + public final static int PetBoughtNotificationComposer = 1040; + public final static int MessagesForYouComposer = 2506; + public final static int UnknownStatusComposer = 1648; //:test 1648 i:0 + public final static int CloseWebPageComposer = 320; + public final static int PickMonthlyClubGiftNotificationComposer = 2786; //:test 2786 i:0 + public final static int RemoveGuildFromRoomComposer = 514; //:test 514 i:12 + public final static int RoomBannedUsersComposer = 504; + public final static int OpenRoomCreationWindowComposer = 497; //:test 497 + public final static int ItemsDataUpdateComposer = 466; + public final static int WelcomeGiftComposer = 445; //:test 445 s:derp@derp.com b:0 b:1 i:230 b:1 + public final static int SimpleRoomPollStartComposer = 3047; //:test 3047 s:a i:10 i:20 i:10000 i:1 i:1 i:3 s:abcdefghijklmnopqrstuvwxyz12345678901234? i:1 s:a s:b + public final static int RoomNoRightsComposer = 3929; //Removes also the 'use' button. :D + public final static int GuildEditFailComposer = 3918; + public final static int MinimailNewMessageComposer = 3903; + public final static int RoomFilterWordsComposer = 3889; + public final static int VerifyMobileNumberComposer = 3872; + public final static int NewUserGiftComposer = 3098; //:test 3098 i:1 i:1 i:1 i:2 s:a.png i:1 s:a s:b s:a.png i:1 s:a s:b + public final static int UpdateUserLookComposer = 3864; + public final static int UserIgnoredComposer = 3858; //:test 3858 i:1 s:a 1/2 ignore. 3 unignore s:Username + public final static int PetBreedingFailedComposer = 3851; //:test i:0 i:1 + public final static int HabboNameChangedComposer = 3849; //:test 3849 i:0 s:aa i:3 s:a s:b s:c + public final static int RoomUserNameChangedComposer = 2063; //:test 2063 i:1 i:1 s:Derp + public final static int LoveLockFurniStartComposer = 2883; //:test 2883 i:91638 b:1 + public final static int LoveLockFurniFriendConfirmedComposer = 2746; //:test 2746 i:91638 + public final static int LoveLockFurniFinishedComposer = 3825; //:test 3825 i:91638 + public final static int OpenPetPackageNameValidationComposer = 38; + public final static int GameCenterFeaturedPlayersComposer = 3788; + public final static int HabboMallComposer = 3770; //Unused as far as I can tell. + public final static int TargetedOfferComposer = 1495; //:test 1495 i:1 i:1 s:a s:b i:1 i:2 i:5 i:9 i:1000000 s:c s:d s:a.png s:e.png i:2 s:f.png s:g.png + public final static int LeprechaunStarterBundleComposer = 3766; // :test 3766 i:4 + public final static int VerifyMobilePhoneWindowComposer = 3695; //:test 3695 i:0 i:1 i:2 + public final static int VerifyMobilePhoneCodeWindowComposer = 2160; //:test 2160 i:1 i:0 + public final static int VerifyMobilePhoneDoneComposer = 3109; + public final static int RoomUserReceivedHandItemComposer = 3673; //:test 3673 i:2 i:2 + public final static int MutedWhisperComposer = 3326; //:test 3326 i:1000 + public final static int UnknownHintComposer = 3484; + public final static int BullyReportHandled = 3401; //:test 3401 i:0 + public final static int PromoteRoomsComposer = 3376; //:test 3376 b:1 i:1 i:1 s:derp b:1 //NOT SURE + public final static int NotEnoughPointsTypeComposer = 334; //:test 334 b:0 b:1 i:150 + public final static int WatchAndEarnRewardComposer = 3325; //:test 3325 s:s i:230 s:throne s:derp + public final static int NewYearResolutionComposer = 327; + public final static int WelcomeGiftErrorComposer = 3268; //:test 3268 i:3 + public final static int RentableItemBuyOutPriceComposer = 3264; + public final static int VipTutorialsStartComposer = 3217; + public final static int NewNavigatorCategoryUserCountComposer = 3166; + public final static int RoomThumbnailSavedComposer = 3117; //:test 3117 + public final static int RoomEditSettingsErrorComposer = 3094; //:test 3094 i:15 i:7 s:derp + public final static int GuildAcceptMemberErrorComposer = 305; //:test 305 i:12 i:1 + public final static int MostUselessErrorAlertComposer = 2944; + public final static int GameAchievementsComposer = 2937; + public final static int PetBreedingResultComposer = 2907; + public final static int RoomUserQuestionAnsweredComposer = 2866; + public final static int PetBreedingStartComposer = 285; //:test 285 i:0 i:1 i:2 + public final static int CustomNotificationComposer = 2835; + public final static int UpdateStackHeightTileHeightComposer = 2830; //:test 2830 i:86476 i:999 + public final static int MarketplaceItemPostedComposer = 2797; //:test 2797 i:0 + public final static int UnknownHabboQuizComposer = 2750; + public final static int GuildFavoriteRoomUserUpdateComposer = 275; + public final static int RoomAdErrorComposer = 2692; + public final static int NewNavigatorDimensionsComposer = 2617; //:test 2617 i:10 i:10 i:2 i:0 b:0 i:10 + public final static int CameraPublishWaitMessageComposer = 2612; //:test 2612 b:1 i:1 s:derp + public final static int RoomInviteComposer = 2608; //:test 2608 i:0 s:derp + public final static int HelperRequestFailedComposer = 1917; //:test 1917 i:1 i:1 i:1 b:1 s:a s:b s:c + public final static int UnknownHelperComposer = 2544; + public final static int HelperRequestDisabledComposer = 1125; //:test 1125 s:derp + public final static int RoomUnitIdleComposer = 2462; //:test 2462 i:2 b:0 + public final static int QuestCompletedComposer = 2459; + public final static int UnkownPetPackegeComposer = 2417; //:test 2417 i:2 s:a s:b s:c s:d + public final static int ForwardToRoomComposer = 2382; //:test 2382 i:16 + public final static int EffectsListEffectEnableComposer = 2381; //:test 2381 i:20 i:1000 b:1 + public final static int CompetitionEntrySubmitResultComposer = 2308; + public final static int ExtendClubMessageComposer = 2304; //:test 2304 i:1 s:derp b:1 i:10 i:0 i:0 b:1 i:1 i:1 b:1 i:1 i:1 i:1 i:1 i:1 i:1 + public final static int InventoryAddEffectComposer = 215; //:test 215 i:120 i:0 i:10 b:1 + public final static int TalentLevelUpdateComposer = 1956; + public final static int BullyReportMessageComposer = 1858; //:test 1858 i:0 + public final static int UnknownQuestComposer3 = 1851; //_SafeStr_9789 + public final static int FriendToolbarNotificationComposer = 1839; //:test 1839 s:0 i:0 s:ADM + public final static int MessengerErrorComposer = 1838;//:test 1838 i:1 i:0 i:0 + public final static int CameraPriceComposer = 1676;//:test 1676 i:2 i:2 i:105 + public final static int PetBreedingCompleted = 1628; //:test 1628 i:1 i:0 + public final static int RoomUserUnbannedComposer = 1625; + public final static int CommunityGoalComposer = 1579; //:test 1579 b:1 i:0 i:1 i:2 i:3 i:4 i:5 s:a i:6 i:1 i:1 + public final static int UnknownRoomVisitsComposer = 155; //:test 155 i:2 i:1 s:a s:b i:2 s:c s:d + public final static int CanCreateEventComposer = 1542; + public final static int UnknownGroupComposer = 1507; + public final static int YoutubeMessageComposer1 = 1477; + public final static int YoutubeMessageComposer2 = 1475; + public final static int RoomCategoryUpdateMessageComposer = 1433; //:test 1433 i:0 + public final static int UnknownQuestComposer2 = 1415; + public final static int GiftReceiverNotFoundComposer = 1374; //:test 1374 + public final static int ConvertedForwardToRoomComposer = 1323; //:test 1323 s:lol i:14 + public final static int FavoriteRoomChangedComposer = 1317; + public final static int AlertPurchaseUnavailableComposer = 1303; //:test 1303 i:0 + public final static int PetBreedingStartFailedComposer = 1252; //:test 1252 i:0 + public final static int DailyQuestComposer = 1244; + public final static int NewNavigatorRoomEventComposer = 1162; + public final static int HotelViewHideCommunityVoteButtonComposer = 115; + public final static int CatalogSearchResultComposer = 1142 ; //:test 1142 i:4 s:a b:1 i:1 i:0 i:0 b:0 i:1 s:s i:230 s:throne i:230 b:0 i:0 b:0 + public final static int FriendFindingRoomComposer = 1037; //:test 1037 b:0 + public final static int UnknownQuestComposer1 = 1010; + + /** + * Music Disks / Trax / Jukebox + */ + public final static int JukeBoxMySongsComposer = 2224; + public final static int JukeBoxNowPlayingMessageComposer = 2197; + public final static int JukeBoxPlaylistFullComposer = 2732; + public final static int JukeBoxPlayListUpdatedComposer = 2858; + public final static int JukeBoxPlayListAddSongComposer = 1558; + public final static int JukeBoxPlayListComposer = 3011; + public final static int JukeBoxTrackDataComposer = 442; + public final static int JukeBoxTrackCodeComposer = 3588; + + +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing_Back.java b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing_Back.java new file mode 100644 index 00000000..f60be120 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing_Back.java @@ -0,0 +1,853 @@ +package com.eu.habbo.messages.outgoing; + +public class Outgoing_Back +{ + + /* + Talents + */ + //public static final int TalentTrackComposer = 2842; + + /* + Wired + */ + /*public static final int WiredTriggerDataComposer = 861; + public static final int WiredEffectDataComposer = 1279; + public static final int WiredConditionDataComposer = 1639; + public static final int WiredSavedComposer = 39; + + /* + Pets + */ + /*public static final int PetInformationComposer = 2286; + public static final int RoomPetRespectComposer = 778; + public static final int RoomPetExperienceComposer = 717; + public static final int PetTrainingPanelComposer = 456; + public static final int RoomPetHorseFigureComposer = 1644; + + /* + Groups + */ + /*public static final int GuildBuyRoomsComposer = 3938; + public static final int GroupPartsComposer = 567; + public static final int GuildBoughtComposer = 389; + public static final int GuildInfoComposer = 2978; + public static final int GuildManageComposer = 601; + public static final int GuildMembersComposer = 3986; + public static final int GuildJoinErrorComposer = 1952; + public static final int GuildRefreshMembersListComposer = 2055; + public static final int GuildMemberUpdateComposer = 862; + public static final int GuildListComposer = 587; + public static final int GuildFurniWidgetComposer = 269; + + /* + Trading + */ + /*public static final int TradeUpdateComposer = 1221; + public static final int TradeStartComposer = 3713; + public static final int TradeStartFailComposer = 2320; + public static final int TradeCompleteComposer = 3766; + public static final int TradeCloseWindowComposer = 2000; + public static final int TradeStoppedComposer = 2020; + public static final int TradeAcceptedComposer = 741; + + /* + ModTool + */ + /*public static final int ModToolComposer = 1901; + public static final int ModToolRoomInfoComposer = 3722; + public static final int ModToolRoomChatlogComposer = 3869; + public static final int ModToolRoomEntryInfoComposer = 2644; + public static final int ModToolUserInfoComposer = 2583; + public static final int ModToolUserChatlogComposer = 3738; + public static final int ModToolUserRoomVisitsComposer = 2129; + public static final int ModToolIssueInfoComposer = 2473; + public static final int ModToolIssueChatlogComposer = 1445; + public static final int ModToolIssueUpdateComposer = 3019; + public static final int ModToolComposerOne = 2303; + public static final int ModToolComposerTwo = 1917; + + /* + Catalog + */ + /*public static final int GiftConfigurationComposer = 1048; + public static final int DiscountComposer = 1061; + public static final int MarketplaceConfigComposer = 2524; + public static final int CatalogUpdatedComposer = 2028; + public static final int CatalogModeComposer = 3442; + public static final int CatalogPagesListComposer = 1684; + public static final int CatalogPageComposer = 3518; + public static final int PurchaseOKComposer = 1189; + public static final int RecyclerLogicComposer = 1317; + public static final int ReloadRecyclerComposer = 1093; + public static final int RecyclerCompleteComposer = 2125; + public static final int ClubDataComposer = 1919; + + public static final int MarketplaceOwnItemsComposer = 593; + public static final int MarketplaceCancelSaleComposer = 1959; + public static final int MarketplaceOffersComposer = 3289; + public static final int MarketplaceItemInfoComposer = 1066; + public static final int MarketplaceBuyErrorComposer = 1823; + public static final int MarketplaceSellItemComposer = 1932; + + public static final int PetBreedsComposer = 3302; + public static final int PetNameErrorComposer = 3575; + + /* + Alerts (All of them) + */ + /*public static final int AlertLimitedSoldOutComposer = 3290; + public static final int AlertPurchaseFailedComposer = 2602; + public static final int RedeemVoucherOKComposer = 2719; + public static final int RedeemVoucherErrorComposer = 2630; + public static final int RoomEnterErrorComposer = 1619; + public static final int WiredRewardAlertComposer = 723; + public static final int PetErrorComposer = 779; + public static final int BotErrorComposer = 3420; + public static final int BubbleAlertComposer = 777; + public static final int GenericErrorMessages = 2839; + + /* + Handshake + */ + /*public static final int BannerTokenComposer = 3033; + public static final int SecureLoginOKComposer = 2753; + public static final int SessionRightsComposer = 1313; + public static final int DebugConsoleComposer = 336; + + /* + HotelView + */ + /* public static final int HotelViewComposer = 3152; + public static final int HallOfFameComposer = 670; + public static final int NewsWidgetsComposer = 1345; + public static final int BonusRareComposer = 3517; + public static final int HotelViewDataComposer = 1374; + + /* + Generic + */ + /* public static final int GenericAlertComposer = 1548; + public static final int MinimailCountComposer = 2253; + public static final int FavoriteRoomsCountComposer = 3829; + + /* + Polls + */ + //public static final int PollStartComposer = 749; + //public static final int PollQuestionsComposer = 3187; + + /* + Friends + */ + /*public static final int FriendsComposer = 2067; + public static final int UpdateFriendComposer = 170; + public static final int UserSearchResultComposer = 1573; + public static final int FriendRequestComposer = 2468; + public static final int RemoveFriendComposer = 1106; + public static final int FriendChatMessageComposer = 2094; + public static final int LoadFriendRequestsComposer = 2193; + public static final int FriendRequestErrorComposer = 2467; + public static final int StalkErrorComposer = 1135; + + /* + Inventory + */ + /*public static final int InventoryItemsComposer = 3029; + public static final int InventoryPetsComposer = 435; + public static final int InventoryBotsComposer = 320; + public static final int InventoryBadgesComposer = 1629; + public static final int AddHabboItemComposer = 274; + public static final int AddBotComposer = 3043; + public static final int RemoveBotComposer = 2565; + public static final int RemoveHabboItemComposer = 3233; + public static final int InventoryRefreshComposer = 3243; + public static final int InventoryItemUpdateComposer = 1577; + public static final int AddPetComposer = 3099; + public static final int RemovePetComposer = 467; + public static final int InventoryAchievementsComposer = 3295; + + /* + Navigator + */ + /*public static final int RoomCategoriesComposer = 3241; + public static final int PublicRoomsComposer = 2506; + public static final int PrivateRoomsComposer = 2653; + public static final int CanCreateRoomComposer = 2463; + public static final int RoomCreatedComposer = 3373; + public static final int TagsComposer = 3487; + + /* + Rooms + */ + /*public static final int RoomPaintComposer = 2979; + public static final int RoomRightsComposer = 520; + public static final int RoomOwnerComposer = 1069; + public static final int RoomScoreComposer = 2805; + public static final int RoomDataComposer = 3995; + public static final int RoomHeightMapComposer = 1624; + public static final int RoomUsersComposer = 1073; + public static final int RoomThicknessComposer = 2627; + public static final int RoomOpenComposer = 925; + public static final int RoomModelComposer = 2297; + public static final int RoomRelativeMapComposer = 1975; + public static final int RoomPaneComposer = 2644; + public static final int RoomFloorItemsComposer = 2124; + public static final int RoomWallItemsComposer = 395; + public static final int RoomUserTalkComposer = 612; + public static final int RoomUserShoutComposer = 3271; + public static final int RoomUserWhisperComposer = 2323; + public static final int RoomUserActionComposer = 12; + public static final int RoomUserRespectComposer = 2143; + public static final int RoomUserDanceComposer = 2091; + public static final int RoomUserEffectComposer = 3040; + public static final int RoomUserStatusComposer = 3386; + public static final int RoomUserRemoveComposer = 2819; + public static final int AddWallItemComposer = 2156; + public static final int AddFloorItemComposer = 1590; + public static final int RemoveWallItemComposer = 2466; + public static final int RemoveFloorItemComposer = 36; + public static final int FloorItemUpdateComposer = 648; + public static final int UpdateStackHeightComposer = 1576; + public static final int RoomUserTypingComposer = 3624; + public static final int WallItemUpdateComposer = 2190; + public static final int RoomUserHandItemComposer = 3664; + public static final int RoomUserRemoveRightsComposer = 1496; + public static final int RoomRightsListComposer = 1891; + public static final int RoomAddRightsListComposer = 3611; + public static final int ChangeNameUpdatedComposer = 542; + public static final int BotSettingsComposer = 1522; + public static final int RoomSettingsUpdatedComposer = 543; + public static final int RoomChatSettingsComposer = 3710; + public static final int DoorbellAddUserComposer = 3198; + public static final int RoomAccessDeniedComposer = 3953; + public static final int MoodLightDataComposer = 2033; + public static final int ObjectOnRollerComposer = 1488; + public static final int PresentItemOpenedComposer = 1540; + public static final int FreezeLivesComposer = 3526; + + /* + Users + */ + /*public static final int UserBCLimitsComposer = 3442; + public static final int UserCurrencyComposer = 3454; + public static final int UserDataComposer = 3491; + public static final int UserPerksComposer = 1218; + public static final int UserPermissionsComposer = 3872; + public static final int UserCreditsComposer = 2204; + public static final int UserClubComposer = 2869; + public static final int MeMenuSettingsComposer = 15; + public static final int UserCitizinShipComposer = 3439; + public static final int UserTagsComposer = 933; + public static final int UserHomeRoomComposer = 40; + public static final int UserProfileComposer = 1503; + public static final int ProfileFriendsComposer = 322; + public static final int UserUpdateCurrencyComposer = 1290; + public static final int UserWardrobeComposer = 370; + public static final int RoomUserDataComposer = 3944; + public static final int UserBadgesComposer = 3486; + public static final int AddUserBadgeComposer = 3197; + + /* + Ones that are someway implemented but not correctly. + */ + public static final int PetStatusUpdateComposer = 3566; //Updated + + /* + Not implemented but know what they are: + */ + /*public static final int UserAddEffectComposer = 2181; //int, int, int (type, ?? (effectId?), duration + + public final static int FavoriteRoomsCountComposer = 2420;//3829 + public final static int UserCurrencyComposer = 584;//3454 + public final static int RedeemVoucherOKComposer = 2136;//2719 + public final static int RoomUserShoutComposer = 3274;//3271 + public final static int RoomUserStatusComposer = 2566;//3386 + public final static int RoomUserDataComposer = 2538;//3944 + public final static int RoomAddRightsListComposer = 1992;//3611 + public final static int RoomRemoveRightsListComposer = 2021; + public final static int RoomRightsListComposer = 2857;//1891 + public final static int RoomUserHandItemComposer = 2425;//3664 + public final static int RoomUsersComposer = 961;//1073 + public final static int FriendRequestComposer = 3550;//2468 + public final static int GuildBoughtComposer = 2087;//389 + public final static int AddUserBadgeComposer = 10;//3197 + public final static int RecyclerCompleteComposer = 1513;//2125 + public final static int GuildBuyRoomsComposer = 3938;//3938 + public final static int FriendsComposer = 1535;//2067 + public final static int StalkErrorComposer = 1739;//1135 + public final static int TradeCloseWindowComposer = 3545;//2000 + public final static int RemoveFloorItemComposer = 679;//36 + public final static int InventoryPetsComposer = 2799;//435 + public final static int UserCreditsComposer = 689;//2204 + public final static int WiredTriggerDataComposer = 3639;//861 + public final static int TradeStoppedComposer = 1941;//2020 + public final static int ModToolUserChatlogComposer = 912;//3738 + public final static int GuildInfoComposer = 3398;//2978 + public final static int UserPermissionsComposer = 3514;//3872 + public final static int PetNameErrorComposer = 2773;//3575 + public final static int TradeStartFailComposer = 796;//2320 + public final static int AddHabboItemComposer = 828;//274 + public final static int InventoryBotsComposer = 3908;//320 + public final static int CanCreateRoomComposer = 1458;//2463 + public final static int MarketplaceBuyErrorComposer = 3313;//1823 + public final static int BonusRareComposer = 2194;//3517 + public final static int HotelViewComposer = 2553;//3152 + public final static int UpdateFriendComposer = 2605;//170 //2605 + public final static int FloorItemUpdateComposer = 1334;//648 + public final static int RoomAccessDeniedComposer = 1504;//3953 + public final static int GuildFurniWidgetComposer = 2909;//269 + public final static int GiftConfigurationComposer = 1965;//1048 + public final static int UserClubComposer = 3926;//2869 + public final static int InventoryBadgesComposer = 79;//1629 + public final static int RoomUserTypingComposer = 3765;//3624 + public final static int GuildJoinErrorComposer = 1551;//1952 + public final static int RoomCategoriesComposer = 815;//3241 + public final static int InventoryAchievementsComposer = 894;//3295 + public final static int MarketplaceItemInfoComposer = 688;//1066 + public final static int UserTagsComposer = 1578;//933 + public final static int RoomRelativeMapComposer = 124;//1975 + public final static int ModToolComposerTwo = 1761;//1917 + public final static int ModToolComposerOne = 2621;//2303 + public final static int RoomRightsComposer = 3358;//520 + public final static int ObjectOnRollerComposer = 1294;//1488 + public final static int PollStartComposer = 3353;//749 + public final static int GuildRefreshMembersListComposer = 3650;//2055 + public final static int UserPerksComposer = 2284;//1218 + public final static int UserCitizinShipComposer = 2486;//3439 + public final static int PublicRoomsComposer = 2433;//2506 + public final static int MarketplaceOffersComposer = 3738;//3289 + public final static int ModToolComposer = 3064;//1901 + public final static int UserBadgesComposer = 820;//3486 + public final static int GuildManageComposer = 1797;//601 + public final static int RemoveFriendComposer = -1106;//1106 + public final static int BannerTokenComposer = -3033;//3033 + public final static int UserDataComposer = 2337;//3491 + public final static int UserSearchResultComposer = 1542;//1573 + public final static int ModToolUserRoomVisitsComposer = 2728;//2129 + public final static int RoomUserRespectComposer = 2019;//2143 + public final static int RoomChatSettingsComposer = 864;//3710 + public final static int RemoveHabboItemComposer = 2192;//3233 + public final static int RoomUserRemoveComposer = 2529;//2819 + public final static int RoomHeightMapComposer = 3157;//1624 + public final static int RoomPetHorseFigureComposer = 1312;//1644 + public final static int PetErrorComposer = 1940;//779 + public final static int TradeUpdateComposer = 77;//1221 + public final static int PrivateRoomsComposer = 1251;//2653 + public final static int RoomModelComposer = 617;//2297 + public final static int RoomScoreComposer = 2925;//2805 + public final static int DoorbellAddUserComposer = 3556;//3198 + public final static int SecureLoginOKComposer = 294;//2753 + public final static int SessionRightsComposer = 376;//1313 + public final static int GuildMemberUpdateComposer = 3609;//862 + public final static int RoomFloorItemsComposer = 2648;//2124 + public final static int InventoryItemsComposer = 1927;//3029 + public final static int RoomUserTalkComposer = 2735;//612 + public final static int TradeStartComposer = 181;//3713 + public final static int InventoryItemUpdateComposer = 369;//1577 + public final static int ModToolIssueUpdateComposer = 2951;//3019 + public final static int MeMenuSettingsComposer = 1362;//15 + public final static int ModToolRoomInfoComposer = 84;//3722 + public final static int GuildListComposer = 3445;//587 + public final static int RecyclerLogicComposer = 3486;//1317 + public final static int UserHomeRoomComposer = 1730;//40 + public final static int RoomUserDanceComposer = 3848;//2091 + public final static int RoomSettingsUpdatedComposer = 3128;//543 + public final static int AlertPurchaseFailedComposer = 1860;//2602 + public final static int RoomDataComposer = 3986;//3995 + public final static int TagsComposer = 3149;//3487 + public final static int InventoryRefreshComposer = 1276;//3243 + public final static int RemovePetComposer = 3118;//467 + public final static int RemoveWallItemComposer = -2466;//2466 + public final static int TradeCompleteComposer = 418;//3766 + public final static int NewsWidgetsComposer = 72;//1345 + public final static int WiredEffectDataComposer = 1532;//1279 + public final static int BubbleAlertComposer = 1950;//777 + public final static int ReloadRecyclerComposer = 3918;//1093 + public final static int MoodLightDataComposer = 1869;//2033 + public final static int WiredRewardAlertComposer = 1603;//723 + public final static int CatalogPageComposer = 2551;//3518 + public final static int CatalogModeComposer = 1942;//3442 + public final static int ChangeNameUpdatedComposer = 311;//542 + public final static int AddFloorItemComposer = 1880;//1590 + public final static int DebugConsoleComposer = 2718;//336 + public final static int HallOfFameComposer = 92;//670 + public final static int WiredSavedComposer = 2429;//39 + public final static int RoomPaintComposer = 2205;//2979 + public final static int MarketplaceConfigComposer = 2120;//2524 + public final static int AddBotComposer = 254;//3043 + public final static int FriendRequestErrorComposer = 3134;//2467 + public final static int GuildMembersComposer = 1648;//3986 + public final static int RoomOpenComposer = 2561;//925 //2561 1945?? + public final static int ModToolRoomChatlogComposer = 3893;//3869 + public final static int DiscountComposer = 1768;//1061 + public final static int MarketplaceCancelSaleComposer = 2239;//1959 + public final static int RoomPetRespectComposer = 3841;//778 + public final static int RoomSettingsComposer = 2461; + public final static int TalentTrackComposer = 2912;//2842 + public final static int CatalogPagesListComposer = 2353;//1684 + public final static int AlertLimitedSoldOutComposer = 604;//3290 + public final static int CatalogUpdatedComposer = 1311;//2028 + public final static int PurchaseOKComposer = 1636;//1189 + public final static int WallItemUpdateComposer = 3292;//2190 + public final static int TradeAcceptedComposer = 2316;//741 + public final static int AddWallItemComposer = 3887;//2156 + public final static int ModToolRoomEntryInfoComposer = 2561;//2644 + public final static int HotelViewDataComposer = 1579;//1374 + public final static int PresentItemOpenedComposer = 3424;//1540 + public final static int RoomUserRemoveRightsComposer = 3566;//1496 + public final static int UserBCLimitsComposer = 1942;//3442 + public final static int PetTrainingPanelComposer = 3760;//456 + public final static int RoomPaneComposer = 2561;//2644 + public final static int RedeemVoucherErrorComposer = 2571;//2630 + public final static int RoomCreatedComposer = 3648;//3373 + public final static int GenericAlertComposer = 3406;//1548 + public final static int GroupPartsComposer = 1817;//567 + public final static int ModToolIssueInfoComposer = 1848;//2473 + public final static int RoomUserWhisperComposer = 1428;//2323 + public final static int BotErrorComposer = 3932;//3420 + public final static int FreezeLivesComposer = 1128;//3526 + public final static int LoadFriendRequestsComposer = 1926;//2193 + public final static int MarketplaceSellItemComposer = 1165;//1932 + public final static int ClubDataComposer = 3753;//1919 + public final static int ProfileFriendsComposer = 168;//322 + public final static int MarketplaceOwnItemsComposer = 1181;//593 + public final static int RoomOwnerComposer = 2146;//1069 + public final static int WiredConditionDataComposer = 856;//1639 + public final static int ModToolUserInfoComposer = 1557;//2583 + public final static int UserWardrobeComposer = 773;//370 + public final static int UserUpdateCurrencyComposer = 1245;//1290 + public final static int RoomPetExperienceComposer = 2143;//717 + public final static int FriendChatMessageComposer = 625;//2094 + public final static int PetInformationComposer = 3752;//2286 + public final static int RoomThicknessComposer = 299;//2627 + public final static int AddPetComposer = 211;//3099 + public final static int UpdateStackHeightComposer = 1350;//1576 + public final static int RemoveBotComposer = 397;//2565 + public final static int RoomEnterErrorComposer = 1754;//1619 + public final static int PollQuestionsComposer = 1745;//3187 + public final static int GenericErrorMessages = 3478;//2839 + public final static int RoomWallItemsComposer = 3583;//395 + public final static int RoomUserEffectComposer = 3863;//3040 + public final static int PetBreedsComposer = 1433;//3302 + public final static int ModToolIssueChatlogComposer = 610;//1445 + public final static int RoomUserActionComposer = 2482;//12 + public final static int BotSettingsComposer = 772;//1522 + public final static int UserProfileComposer = 2023;//1503 + public final static int MinimailCountComposer = 1162;//2253 + public final static int UserAchievementScoreComposer = 2994; + public final static int PetLevelUpComposer = 2329; + public final static int UserPointsComposer = 1245; + public final static int ReportRoomFormComposer = 3216; + public final static int ModToolIssueHandledComposer = 2876; + public final static int FloodCounterComposer = 1774; + public final static int UpdateFailedComposer = 2612; + public final static int FloorPlanEditorDoorSettingsComposer = 1633; + public final static int FloorPlanEditorBlockedTilesComposer = 1874; + public final static int BuildersClubExpiredComposer = 108; + public final static int RoomSettingsSavedComposer = 0;*/ + + public final static int FavoriteRoomsCountComposer = 235;//3829 //Updated + public final static int UserCurrencyComposer = 3574;//3454 //Updated + public final static int RedeemVoucherOKComposer = 391;//2719 //Updated + public final static int RoomUserShoutComposer = 59;//3271 //Updated + public final static int RoomUserStatusComposer = 12;//3386 //Updated + public final static int RoomUserDataComposer = 2421;//3944 //Updated + public final static int RoomAddRightsListComposer = 2589;//3611 //Updated + public final static int RoomRemoveRightsListComposer = 3258; //Updated + public final static int RoomRightsListComposer = 1964;//1891 //Updated + public final static int RoomUserHandItemComposer = 2479;//3664 //Updated + public final static int RoomUsersComposer = 1018;//1073 //Updated + public final static int FriendRequestComposer = 2725;//2468 //Updated + public final static int GuildBoughtComposer = 2244;//389 //Updated + public final static int AddUserBadgeComposer = 3489;//3197 //Updated + public final static int RecyclerCompleteComposer = 899;//2125 //Updated + public final static int GuildBuyRoomsComposer = 575;//3938 //Updated + public final static int FriendsComposer = 7;//2067 //Updated + public final static int StalkErrorComposer = 1543;//1135 //Updated + public final static int TradeCloseWindowComposer = 1850;//2000 //Updated + public final static int RemoveFloorItemComposer = 2658;//36 //Updated + public final static int InventoryPetsComposer = 3249;//435 //Updated + public final static int UserCreditsComposer = 1557;//2204 //Updated + public final static int WiredTriggerDataComposer = 951;//861 //Updated + public final static int TradeStoppedComposer = 3869;//2020 //Updated + public final static int ModToolUserChatlogComposer = 342;//3738 //Updated + public final static int GuildInfoComposer = 3198;//2978 //Updated + public final static int UserPermissionsComposer = 3409;//3872 //Updated + public final static int PetNameErrorComposer = 1991;//3575 //Updated + public final static int TradeStartFailComposer = 283;//2320 //Updated + public final static int AddHabboItemComposer = 3454;//274 //Updated + public final static int InventoryBotsComposer = 307;//320 //Updated + public final static int CanCreateRoomComposer = 2877;//2463 //Updated + public final static int MarketplaceBuyErrorComposer = 1299;//1823 //Updated + public final static int BonusRareComposer = 2261;//3517 //Updated + public final static int HotelViewComposer = 0x0404;//3152 //Updated + public final static int UpdateFriendComposer = 3525;//170 //Updated + public final static int FloorItemUpdateComposer = 2277;//648 //Updated + public final static int RoomAccessDeniedComposer = 2897;//3953 //Updated + public final static int GuildFurniWidgetComposer = 1875;//269 //Updated + public final static int GiftConfigurationComposer = 1715;//1048 //Updated + public final static int UserClubComposer = 2018;//2869 //Updated + public final static int InventoryBadgesComposer = 399;//1629 //Updated + public final static int RoomUserTypingComposer = 2327;//3624 //Updated + public final static int GuildJoinErrorComposer = 1761;//1952 //Updated + public final static int RoomCategoriesComposer = 1824;//3241 //Updated + public final static int InventoryAchievementsComposer = 2539;//3295 //Updated + public final static int MarketplaceItemInfoComposer = 894;//1066 //Updated + public final static int RoomRelativeMapComposer = 3287;//1975 //Updated + public final static int ModToolComposerTwo = 1890;//1917 //Updated + public final static int ModToolComposerOne = 1722;//2303 //Updated + public final static int RoomRightsComposer = 1421;//520 //Updated + public final static int ObjectOnRollerComposer = 450;//1488 //Updated + public final static int PollStartComposer = 3206;//749 //Updated + public final static int GuildRefreshMembersListComposer = 1661;//2055 //Updated + public final static int UserPerksComposer = 3281;//1218 //Updated + public final static int UserCitizinShipComposer = 3285;//3439 //Updated + public final static int PublicRoomsComposer = 972;//2506 //Updated //-> 580 (Oud)? + public final static int MarketplaceOffersComposer = 2440;//3289 //Updated + public final static int ModToolComposer = 3087;//1901 //Updated + public final static int UserBadgesComposer = 2442;//3486 //Updated + public final static int GuildManageComposer = 2129;//601 //Updated + public final static int RemoveFriendComposer = -1106;//1106 + public final static int BannerTokenComposer = -3033;//3033 + public final static int UserDataComposer = 558;//3491 //Updated + public final static int UserSearchResultComposer = 1590;//1573 //Updated + public final static int ModToolUserRoomVisitsComposer = 520;//2129 //Updated + public final static int RoomUserRespectComposer = 3137;//2143 //Updated + public final static int RoomChatSettingsComposer = 901;//3710 //Updated + public final static int RemoveHabboItemComposer = 2368;//3233 //Updated + public final static int RoomUserRemoveComposer = 364;//2819 //Updated + public final static int RoomHeightMapComposer = 3491;//1624 //Updated + public final static int RoomPetHorseFigureComposer = 3140;//1644 //Updated + public final static int PetErrorComposer = 3013;//779 //Updated + public final static int TradeUpdateComposer = 1649;//1221 //Update + public final static int PrivateRoomsComposer = 2523;//2653 //Updated + public final static int RoomModelComposer = 1186;//2297 //Updated + public final static int RoomScoreComposer = 1781;//2805 //Updated + public final static int KnockKnockComposer = 2988;//3198 //Updated + public final static int SecureLoginOKComposer = 1992;//2753 //Updated + public final static int SessionRightsComposer = 2934;//1313 //Updated + public final static int GuildMemberUpdateComposer = 3641;//862 //Updated + public final static int RoomFloorItemsComposer = 144;//2124 //Updated + public final static int InventoryItemsComposer = 1559;//3029 //Updated + public final static int RoomUserTalkComposer = 874;//612 //Updated + public final static int TradeStartComposer = 833;//3713 //Updated + public final static int InventoryItemUpdateComposer = 2204;//1577 //Updated + public final static int ModToolIssueUpdateComposer = 471;//3019 //Updated + public final static int MeMenuSettingsComposer = 3437;//15 //Updated + public final static int ModToolRoomInfoComposer = 1328;//3722 //Updated + public final static int GuildListComposer = 3082;//587 //Updated + public final static int RecyclerLogicComposer = 1527;//1317 //Updated + public final static int UserHomeRoomComposer = 3876;//40 //Updated + public final static int RoomUserDanceComposer = 2184;//2091 //Updated + public final static int RoomSettingsUpdatedComposer = 1069;//543 //Updated + public final static int AlertPurchaseFailedComposer = 2663;//2602 //Updated + public final static int RoomDataComposer = 624;//3995 //Updated + public final static int TagsComposer = 456;//3487 //Updated + public final static int InventoryRefreshComposer = 2352;//3243 //Updated + public final static int RemovePetComposer = 775;//467 //Updated + public final static int RemoveWallItemComposer = 1980;//2466 //Updated + public final static int TradeCompleteComposer = 1668;//3766 //Updated + public final static int NewsWidgetsComposer = 3958;//1345 //Updated + public final static int WiredEffectDataComposer = 2101;//1279 //Updated + public final static int BubbleAlertComposer = 1569;//777 //Updated + public final static int ReloadRecyclerComposer = 3704;//1093 //Updated + public final static int MoodLightDataComposer = 2780;//2033 //Updated + public final static int WiredRewardAlertComposer = 1539;//723 //Updated + public final static int CatalogPageComposer = 1384;//3518 //Updated + public final static int CatalogModeComposer = 3408;//3442 //Updated + public final static int RoomUserUpdateNameComposer = 1263;//542 //Updated + public final static int AddFloorItemComposer = 2502;//1590 //Updated + public final static int DebugConsoleComposer = 1003;//336 //Updated + public final static int HallOfFameComposer = 3736;//670 //Updated + public final static int WiredSavedComposer = 598;//39 //Updated + public final static int RoomPaintComposer = 2225;//2979 //Updated + public final static int MarketplaceConfigComposer = 739;//2524 //Updated + public final static int AddBotComposer = 1771;//3043 //Updated + public final static int FriendRequestErrorComposer = 3601;//2467 //Updated + public final static int GuildMembersComposer = 1788;//3986 //Updated + public final static int RoomOpenComposer = 2266;//925 //2561 1945?? //Updated + public final static int ModToolRoomChatlogComposer = 1633;//3869 //Updated + public final static int DiscountComposer = 3254;//1061 //Updated + public final static int MarketplaceCancelSaleComposer = 751;//1959 //Updated + public final static int RoomPetRespectComposer = 2348;//778 //Updated + public final static int RoomSettingsComposer = 3622; //Updated + public final static int TalentTrackComposer = 3235;//2842 //Updated + public final static int CatalogPagesListComposer = 402;//1684 //Updated + public final static int AlertLimitedSoldOutComposer = 3467;//3290 //Updated + public final static int CatalogUpdatedComposer = 2452;//2028 //Updated + public final static int PurchaseOKComposer = 2316;//1189 //Updated + public final static int WallItemUpdateComposer = 21;//2190 //Updated + public final static int TradeAcceptedComposer = 3042;//741 //Updated + public final static int AddWallItemComposer = 706;//2156 //Updated + public final static int ModToolRoomEntryInfoComposer = 381;//2644 //Updated + public final static int HotelViewDataComposer = 3810;//1374 //Updated + public final static int PresentItemOpenedComposer = 2004;//1540 //Updated TODO: -> BELANGRIJK: Zoek op: .push(new RoomUsersHandler voor andere items?? + public final static int RoomUserRemoveRightsComposer = 61;//1496 //Updated TODO: Doet geen ene flikker? + public final static int UserBCLimitsComposer = 3408;//3442 //Updated + public final static int PetTrainingPanelComposer = 1897;//456 //Updated + public final static int RoomPaneComposer = 381;//2644 //Updated + public final static int RedeemVoucherErrorComposer = 1809;//2630 //Updated + public final static int RoomCreatedComposer = 3168;//3373 //Updated + public final static int GenericAlertComposer = 1406;//1548 //Updated + public final static int GroupPartsComposer = 3569;//567 //Updated + public final static int ModToolIssueInfoComposer = 3928;//2473 //Updated + public final static int RoomUserWhisperComposer = 2945;//2323 //Updated + public final static int BotErrorComposer = 1932;//3420 //Updated + public final static int FreezeLivesComposer = 3985;//3526 //Updated + public final static int LoadFriendRequestsComposer = 683;//2193 //Updated + public final static int MarketplaceSellItemComposer = 92;//1932 //Updated + public final static int ClubDataComposer = 2273;//1919 //Updated + public final static int ProfileFriendsComposer = 2231;//322 //Updated + public final static int MarketplaceOwnItemsComposer = 311;//593 //Updated + public final static int RoomOwnerComposer = 3608;//1069 //Updated + public final static int WiredConditionDataComposer = 3969;//1639 //Updated + public final static int ModToolUserInfoComposer = 828;//2583 //Updated + public final static int UserWardrobeComposer = 406;//370 //Updated + public final static int RoomPetExperienceComposer = 3711;//717 //Updated + public final static int FriendChatMessageComposer = 3957;//2094 //Updated + public final static int PetInformationComposer = 64;//2286 //Updated + public final static int RoomThicknessComposer = 2145;//2627 //Updated + public final static int AddPetComposer = 2194;//3099 //Updated + public final static int UpdateStackHeightComposer = 597;//1576 //Updated + public final static int RemoveBotComposer = 3691;//2565 //Updated + public final static int RoomEnterErrorComposer = 817;//1619 //Updated + public final static int PollQuestionsComposer = 1143;//3187 //Updated + public final static int GenericErrorMessages = 1169;//2839 //Updated + public final static int RoomWallItemsComposer = 3524;//395 //Updated + public final static int RoomUserEffectComposer = 579;//3040 //Updated + public final static int PetBreedsComposer = 1947;//3302 //Updated + public final static int ModToolIssueChatlogComposer = 3053;//1445 //Updated + public final static int RoomUserActionComposer = 3741;//12 //Updated + public final static int BotSettingsComposer = 3092;//1522 //Updated + public final static int UserProfileComposer = 3049;//1503 //Updated + public final static int MinimailCountComposer = 761;//2253 //Updated + public final static int UserAchievementScoreComposer = 3681; //Updated + public final static int PetLevelUpComposer = 3100; //Updated + public final static int UserPointsComposer = 1439; //Updated + public final static int ReportRoomFormComposer = 2573; //Updated + public final static int ModToolIssueHandledComposer = 1297; //Updated + public final static int FloodCounterComposer = 2106; //Updated + public final static int UpdateFailedComposer = 3006; //Updated + public final static int FloorPlanEditorDoorSettingsComposer = 1988; //Updated + public final static int FloorPlanEditorBlockedTilesComposer = 3388; //Updated + public final static int BuildersClubExpiredComposer = 25; //Updated + public final static int RoomSettingsSavedComposer = 2769; //Updated + public final static int MessengerInitComposer = 3682; //Updated + public final static int UserClothesComposer = 2651; //Updated + public final static int UserEffectsListComposer = 1348; //Updated + public final static int NewUserIdentityComposer = 1733; //Updated + public final static int NewNavigatorEventCategoriesComposer = 1391; + public final static int NewNavigatorCollapsedCategoriesComposer = 3110; + public final static int NewNavigatorLiftedRoomsComposer = 2469; + public final static int NewNavigatorSavedSearchesComposer = 3349; + public final static int RoomUnitUpdateUsernameComposer = 2063; + public final static int PostItDataComposer = 3443; + public final static int ModToolReportReceivedAlertComposer = 3453; + public final static int ModToolIssueResponseAlertComposer = 971; + public final static int AchievementListComposer = 1417; + public final static int AchievementProgressComposer = 1550; + public final static int AchievementUnlockedComposer = 1335; + public final static int ClubGiftsComposer = 197; + public final static int MachineIDComposer = 3609; + public final static int PongComposer = 1349; + + //Uknown but work + public final static int UnknownComposer4 = 1411; + public final static int UnknownComposer5 = 568; + public final static int UnknownComposer6 = 32; + public final static int NewNavigatorMetaDataComposer = 1129; + public final static int NewNavigatorSearchResultsComposer = 3203; + public final static int MysticBoxStartOpenComposer = 3513; + public final static int MysticBoxCloseComposer = 2581; + public final static int MysticBoxPrizeComposer = 3040; + public final static int RentableSpaceInfoComposer = 194; + public final static int RentableSpaceUnknownComposer = 2051; + public final static int RentableSpaceUnknown2Composer = 1075; + public final static int GuildConfirmRemoveMemberComposer = 3940; + + public final static int LandingViewGetBadgeButtonConfig = 940; + public final static int EpicPopupFrameComposer = 916; + public final static int BaseJumpLoadGameURL = 871; + public final static int RoomUserTagsComposer = 799; + public final static int RoomInviteErrorCodeComposer = 76; + public final static int PostItStickyPoleOpenComposer = 753; + public final static int NewYearResolutionProgressComposer = 741; + public final static int ClubGiftReceivedComposer = 735; //:test 735 s:t i:1 s:s i:230 s:throne i:1 b:1 i:1 i:10; + public final static int ItemStateComposer = 664; //TODO: (i: itemId, i:state) + public final static int ItemExtraDataComposer = 654; //:test 654 s:92015 i:1 i:1 s:renterId s:0 s:0.0 s:0 + + //NotSure Needs Testing + public final static int QuestionInfoComposer = 3047; + public final static int TalentTrackEmailVerifiedComposer = 866; + public final static int TalentTrackEmailFailedComposer = 369; + public final static int UnknownAvatarEditorComposer = 72; + + public final static int UnknownGuildComposer = 588; //Could be related to forums. + + public final static int UnknownGuildForumComposer1 = 600; + public final static int UnknownGuildForumComposer2 = 1291; + public final static int UnknownGuildForumComposer3 = 1147; + public final static int UnknownGuildForumComposer4 = 3420; + public final static int UnknownGuildForumComposer5 = 324; + public final static int UnknownGuildForumComposer6 = 2161; + public final static int UnknownGuildForumComposer7 = 3853; + public final static int UnknownGuildForumComposer8 = 2695; + public final static int UnknownGuildForumComposer9 = 3077; + + public final static int GuideSessionAttachedComposer = 3549; + public final static int GuideSessionDetachedComposer = 2987; + public final static int GuideSessionStartedComposer = 3048; + public final static int GuideSessionEndedComposer = 3222; + public final static int GuideSessionErrorComposer = 978; + public final static int GuideSessionMessageComposer = 1860; + public final static int GuideSessionRequesterRoomComposer = 1861; + public final static int GuideSessionInvitedToGuideRoomComposer = 2959; + public final static int GuideSessionPartnerIsTypingComposer = 2955; + + public final static int GuideToolsComposer = 117; + public final static int GuardianNewReportReceivedComposer = 3123; + public final static int GuardianVotingRequestedComposer = 2331; + public final static int GuardianVotingVotesComposer = 3107; //:test 3107 i:10 i:0 i:1 i:2 i:3 i:4 i:5 i:0 i:1 i:2 i:3 + public final static int GuardianVotingResultComposer = 91; + public final static int GuardianVotingTimeEnded = 556; + + public final static int RoomMutedComposer = 554; + + public final static int RoomUnknown1Composer = 1241; + public final static int RoomUnknown2Composer = 535; + public final static int RoomUnknown3Composer = 2342; + + public final static int UnknownEffectsComposer = 53; //:test 53 i:10 + + public final static int OldPublicRoomsComposer = 580; + public final static int ItemStateComposer2 = 569; + + public final static int HotelWillCloseInMinutesComposer = 518; //:test 518 i:10 + public final static int HotelWillCloseInMinutesAndBackInComposer = 2860; //:test 2860 b:1 i:1 i:2 + public final static int HotelClosesAndWillOpenAtComposer = 2168; //:test 2168 i:0 i:1 b:1 + public final static int HotelClosedAndOpensComposer = 888; + public final static int StaffAlertAndOpenHabboWayComposer = 1035; + public final static int StaffAlertWithLinkComposer = 1189; + public final static int StaffAlertWIthLinkAndOpenHabboWayComposer = 3964; + + public final static int RoomMessagesPostedCountComposer = 1520; //:test 1520 i:12 s:Derp i:100 + public final static int CantScratchPetNotOldEnoughComposer = 118; //:test 118 i:1 i:2 + public final static int PetBoughtNotificationComposer = 1040; + public final static int MessagesForYouComposer = 2506; + public final static int UnknownStatusComposer = 1648; //:test 1648 i:0 + public final static int CloseWebPageComposer = 320; + public final static int PickMonthlyClubGiftNotificationComposer = 2786; //:test 2786 i:0 + public final static int RemoveGuildFromRoomComposer = 514; //:test 514 i:12 + public final static int RoomBannedUsersComposer = 504; + public final static int OpenRoomCreationWindowComposer = 497; //:test 497 + public final static int ItemsDataUpdateComposer = 466; + public final static int WelcomeGiftComposer = 445; //:test 445 s:derp@derp.com b:0 b:1 i:230 b:1 + /* TODO: */ public final static int SimplePollStartComposer = 3047; //:test 3047 s:a i:10 i:20 i:10000 i:1 i:1 i:3 s:abcdefghijklmnopqrstuvwxyz12345678901234? i:1 s:a s:b + public final static int RoomNoRightsComposer = 3929; //Removes also the 'use' button. :D + public final static int GuildEditFailComposer = 3918; + public final static int MinimailNewMessageComposer = 3903; + public final static int RoomFilterWordsComposer = 3889; + public final static int VerifyMobileNumberComposer = 3872; + public final static int NewUserGiftComposer = 3098; //:test 3098 i:1 i:1 i:1 i:2 s:a.png i:1 s:a s:b s:a.png i:1 s:a s:b + public final static int UpdateUserLookComposer = 3864; + public final static int RoomUserIgnoredComposer = 3858; //:test 3858 i:1 s:a 1/2 ignore. 3 unignore s:Username + public final static int PetBreedingFailedComposer = 3851; //:test i:0 i:1 + public final static int HabboNameChangedComposer = 3849; //:test 3849 i:0 s:aa i:3 s:a s:b s:c + public final static int RoomUserNameChangedComposer = 2063; //:test 2063 i:1 i:1 s:Derp + public final static int LoveLockFurniStartComposer = 2883; //:test 2883 i:91638 b:1 + public final static int LoveLockFurniFriendConfirmedComposer = 2746; //:test 2746 i:91638 + public final static int LoveLockFurniFinishedComposer = 3825; //:test 3825 i:91638 + public final static int OpenPetPackageNameValidationComposer = 38; + public final static int GameCenterFeaturedPlayersComposer = 3788; + public final static int HabboMallComposer = 3770; //Unused as far as I can tell. + public final static int TargetedOfferComposer = 1495; //:test 1495 i:1 i:1 s:a s:b i:1 i:2 i:5 i:9 i:1000000 s:c s:d s:a.png s:e.png i:2 s:f.png s:g.png + public final static int LeprechaunStarterBundleComposer = 3766; // :test 3766 i:4 + public final static int VerifyMobilePhoneWindowComposer = 3695; //:test 3695 i:0 i:1 i:2 + public final static int VerifyMobilePhoneCodeWindowComposer = 2160; //:test 2160 i:1 i:0 + public final static int VerifyMobilePhoneDoneComposer = 3109; + public final static int RoomUserReceivedHandItemComposer = 3673; //:test 3673 i:2 i:2 + public final static int MutedWhisperComposer = 3326; //:test 3326 i:1000 + public final static int UnknownHintComposer = 3484; + public final static int BullyReportClosedComposer = 3401; //:test 3401 i:0 + public final static int PromoteOwnRoomsListComposer = 3376; //:test 3376 b:1 i:1 i:1 s:derp b:1 //NOT SURE + public final static int NotEnoughPointsTypeComposer = 334; //:test 334 b:0 b:1 i:105 + public final static int WatchAndEarnRewardComposer = 3325; //:test 3325 s:s i:230 s:throne s:derp + public final static int NewYearResolutionComposer = 327; + public final static int WelcomeGiftErrorComposer = 3268; //:test 3268 i:3 + public final static int RentableItemBuyOutPriceComposer = 3264; + public final static int VipTutorialsStartComposer = 3217; + public final static int NewNavigatorCategoryUserCountComposer = 3166; + public final static int RoomThumbnailSavedComposer = 3117; //:test 3117 + public final static int RoomEditSettingsErrorComposer = 3094; //:test 3094 i:15 i:7 s:derp + public final static int GuildAcceptMemberErrorComposer = 305; //:test 305 i:12 i:1 + public final static int MostUselessErrorAlertComposer = 2944; + public final static int AchievementsConfigurationComposer = 2937; + public final static int PetBreedingResultComposer = 2907; + public final static int RoomUserQuestionAnsweredComposer = 2866; + public final static int PetBreedingStartComposer = 285; //:test 285 i:0 i:1 i:2 + public final static int CustomNotificationComposer = 2835; + public final static int UpdateStackHeightTileHeightComposer = 2830; //:test 2830 i:86476 i:999 + public final static int HotelViewCustomTimerComposer = 2828; + public final static int MarketplaceItemPostedComposer = 2797; //:test 2797 i:0 + public final static int UnknownHabboQuizComposer = 2750; + public final static int GuildFavoriteRoomUserUpdateComposer = 275; + public final static int RoomAdErrorComposer = 2692; + public final static int NewNavigatorSettingsComposer = 2617; //:test 2617 i:10 i:10 i:2 i:0 b:0 i:10 + public final static int CameraPublishWaitMessageComposer = 2612; //:test 2612 b:1 i:1 s:derp + public final static int RoomInviteComposer = 2608; //:test 2608 i:0 s:derp + public final static int BullyReportRequestComposer = 1917; //:test 1917 i:1 i:1 i:1 b:1 s:a s:b s:c + public final static int UnknownHelperComposer = 2544; + public final static int HelperRequestDisabledComposer = 1125; //:test 1125 s:derp + public final static int RoomUnitIdleComposer = 2462; //:test 2462 i:2 b:0 + public final static int QuestCompletedComposer = 2459; + public final static int UnkownPetPackegeComposer = 2417; //:test 2417 i:2 s:a s:b s:c s:d + public final static int ForwardToRoomComposer = 2382; //:test 2382 i:16 + public final static int EffectsListEffectEnableComposer = 2381; //:test 2381 i:20 i:1000 b:1 + public final static int CompetitionEntrySubmitResultComposer = 2308; + public final static int ExtendClubMessageComposer = 2304; //:test 2304 i:1 s:derp b:1 i:10 i:0 i:0 b:1 i:1 i:1 b:1 i:1 i:1 i:1 i:1 i:1 i:1 + public final static int HotelViewConcurrentUsersComposer = 2286; + public final static int InventoryAddEffectComposer = 215; //:test 215 i:120 i:0 i:10 b:1 + public final static int TalentLevelUpdateComposer = 1956; + public final static int BullyReportedMessageComposer = 1858; //:test 1858 i:0 + public final static int UnknownQuestComposer3 = 1851; //_SafeStr_9789 + public final static int FriendToolbarNotificationComposer = 1839; //:test 1839 s:0 i:0 s:ADM + public final static int MessengerErrorComposer = 1838;//:test 1838 i:1 i:0 i:0 + public final static int CameraPriceComposer = 1676;//:test 1676 i:2 i:2 i:105 + public final static int PetBreedingCompleted = 1628; //:test 1628 i:1 i:0 + public final static int RoomUserUnbannedComposer = 1625; + public final static int HotelViewCommunityGoalComposer = 1579; //:test 1579 b:1 i:0 i:1 i:2 i:3 i:4 i:5 s:a i:6 i:1 i:1 + public final static int UnknownRoomVisitsComposer = 155; //:test 155 i:2 i:1 s:a s:b i:2 s:c s:d + public final static int CanCreateEventComposer = 1542; + public final static int UnknownGroupComposer = 1507; + public final static int YoutubeMessageComposer1 = 1477; + public final static int YoutubeMessageComposer2 = 1475; + public final static int RoomCategoryUpdateMessageComposer = 1433; //:test 1433 i:0 + public final static int UnknownQuestComposer2 = 1415; + public final static int GiftReceiverNotFoundComposer = 1374; //:test 1374 + public final static int ConvertedForwardToRoomComposer = 1323; //:test 1323 s:lol i:14 + public final static int FavoriteRoomChangedComposer = 1317; + public final static int AlertPurchaseUnavailableComposer = 1303; //:test 1303 i:0 + public final static int PetBreedingStartFailedComposer = 1252; //:test 1252 i:0 + public final static int DailyQuestComposer = 1244; + public final static int NewNavigatorRoomEventComposer = 1162; + public final static int HotelViewHideCommunityVoteButtonComposer = 115; + public final static int CatalogSearchResultComposer = 1142 ; //:test 1142 i:4 s:a b:1 i:1 i:0 i:0 b:0 i:1 s:s i:230 s:throne i:230 b:0 i:0 b:0 + public final static int FriendFindingRoomComposer = 1037; //:test 1037 b:0 + public final static int UnknownQuestComposer1 = 1010; + + + /** + * Music Disks / Trax / Jukebox + */ + public final static int JukeBoxMySongsComposer = 2224; + public final static int JukeBoxNowPlayingMessageComposer = 2197; + public final static int JukeBoxPlaylistFullComposer = 2732; + public final static int JukeBoxPlayListUpdatedComposer = 2858; + public final static int JukeBoxPlayListAddSongComposer = 1558; + public final static int JukeBoxPlayListComposer = 3011; + public final static int JukeBoxTrackDataComposer = 442; + public final static int JukeBoxTrackCodeComposer = 3588; + + +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/TestComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/TestComposer.java new file mode 100644 index 00000000..8c88cf38 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/TestComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing; + +import com.eu.habbo.messages.ServerMessage; + +public class TestComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + + this.response.init(3662); + this.response.appendBoolean(true); + this.response.appendString("LOL"); + /* + this.response.init(3269); + this.response.appendString("cannon.png"); + this.response.appendInt(2); + this.response.appendString("title"); + this.response.appendString("${notification.room.kick.cannonball.title}"); + this.response.appendString("message"); + this.response.appendString("${notification.room.kick.cannonball.message}"); + */ + return this.response; + + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementListComposer.java new file mode 100644 index 00000000..33c310d7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementListComposer.java @@ -0,0 +1,79 @@ +package com.eu.habbo.messages.outgoing.achievements; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementLevel; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AchievementListComposer extends MessageComposer +{ + private final Habbo habbo; + + public AchievementListComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AchievementListComposer); + + try + { + synchronized (Emulator.getGameEnvironment().getAchievementManager().getAchievements()) + { + this.response.appendInt(Emulator.getGameEnvironment().getAchievementManager().getAchievements().size()); + + for (Achievement achievement : Emulator.getGameEnvironment().getAchievementManager().getAchievements().values()) + { + int achievementProgress; + AchievementLevel currentLevel = null; + AchievementLevel nextLevel = null; + + achievementProgress = this.habbo.getHabboStats().getAchievementProgress(achievement); + currentLevel = achievement.getLevelForProgress(achievementProgress); + nextLevel = achievement.getNextLevel(currentLevel != null ? currentLevel.level : 0); + + if(currentLevel != null && currentLevel.level == achievement.levels.size()) + nextLevel = null; + + int targetLevel = 1; + + if(nextLevel != null) + targetLevel = nextLevel.level; + + if(currentLevel != null && currentLevel.level == achievement.levels.size()) + targetLevel = currentLevel.level; + + + this.response.appendInt(achievement.id); //ID + this.response.appendInt(targetLevel); //Target level + this.response.appendString("ACH_" + achievement.name + targetLevel); //Target badge code + this.response.appendInt(currentLevel != null ? currentLevel.progress : 0); //Last level progress needed + this.response.appendInt(nextLevel != null ? nextLevel.progress : 0); //Progress needed + this.response.appendInt(nextLevel != null ? nextLevel.rewardAmount : 0); //Reward amount + this.response.appendInt(nextLevel != null ? nextLevel.rewardType : 0); //Reward currency ID + this.response.appendInt(achievementProgress == -1 ? -1 : achievementProgress); //Current progress + this.response.appendBoolean(AchievementManager.hasAchieved(habbo, achievement)); //Achieved? (Current Progress == MaxLevel.Progress) + this.response.appendString(achievement.category.toString().toLowerCase()); //Category + this.response.appendString(""); //Empty, completly unused in client code + this.response.appendInt(achievement.levels.size()); //Count of total levels in this achievement + this.response.appendInt(0); //1 = Progressbar visible if the achievement is completed + } + + this.response.appendString(""); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementProgressComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementProgressComposer.java new file mode 100644 index 00000000..1b3fe686 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementProgressComposer.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.outgoing.achievements; + +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementLevel; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AchievementProgressComposer extends MessageComposer +{ + private final Habbo habbo; + private final Achievement achievement; + + public AchievementProgressComposer(Habbo habbo, Achievement achievement) + { + this.habbo = habbo; + this.achievement = achievement; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AchievementProgressComposer); + + int achievementProgress; + AchievementLevel currentLevel = null; + AchievementLevel nextLevel = null; + + achievementProgress = this.habbo.getHabboStats().getAchievementProgress(achievement); + currentLevel = achievement.getLevelForProgress(achievementProgress); + nextLevel = achievement.getNextLevel(currentLevel != null ? currentLevel.level : 0); + + if(currentLevel != null && currentLevel.level == achievement.levels.size()) + nextLevel = null; + + int targetLevel = 1; + + if(nextLevel != null) + targetLevel = nextLevel.level; + + if(currentLevel != null && currentLevel.level == achievement.levels.size()) + targetLevel = currentLevel.level; + + this.response.appendInt(achievement.id); //ID + this.response.appendInt(targetLevel); //Target level + this.response.appendString("ACH_" + achievement.name + targetLevel); //Target badge code + this.response.appendInt(currentLevel != null ? currentLevel.progress : 0); //Last level progress needed + this.response.appendInt(nextLevel != null ? nextLevel.progress : 0); //Progress needed + this.response.appendInt(nextLevel != null ? nextLevel.rewardAmount : 0); //Reward amount + this.response.appendInt(nextLevel != null ? nextLevel.rewardType : 0); //Reward currency ID + this.response.appendInt(achievementProgress == -1 ? 0 : achievementProgress); //Current progress + this.response.appendBoolean(AchievementManager.hasAchieved(habbo, achievement)); //Achieved? (Current Progress == MaxLevel.Progress) + this.response.appendString(achievement.category.toString().toLowerCase()); //Category + this.response.appendString(""); //Empty, completly unused in client code + this.response.appendInt(achievement.levels.size()); //Count of total levels in this achievement + this.response.appendInt(0); //1 = Progressbar visible if the achievement is completed + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementUnlockedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementUnlockedComposer.java new file mode 100644 index 00000000..719b4a6f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/achievements/AchievementUnlockedComposer.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.outgoing.achievements; + +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementLevel; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AchievementUnlockedComposer extends MessageComposer +{ + private final Achievement achievement; + private final Habbo habbo; + + public AchievementUnlockedComposer(Habbo habbo, Achievement achievement) + { + this.achievement = achievement; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AchievementUnlockedComposer); + + AchievementLevel level = this.achievement.getLevelForProgress(this.habbo.getHabboStats().getAchievementProgress(this.achievement)); + this.response.appendInt(this.achievement.id); + this.response.appendInt(level.level); + this.response.appendInt(144); + this.response.appendString("ACH_" + this.achievement.name + level.level); + this.response.appendInt(level.rewardAmount); + this.response.appendInt(level.rewardType); + this.response.appendInt(0); + this.response.appendInt(10); + this.response.appendInt(21); + this.response.appendString(level.level > 1 ? "ACH_" + this.achievement.name + (level.level - 1) : ""); + this.response.appendString(this.achievement.category.name()); + this.response.appendBoolean(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentLevelUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentLevelUpdateComposer.java new file mode 100644 index 00000000..2f341ee8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentLevelUpdateComposer.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.outgoing.achievements.talenttrack; + +import com.eu.habbo.habbohotel.achievements.TalentTrackLevel; +import com.eu.habbo.habbohotel.achievements.TalentTrackType; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TalentLevelUpdateComposer extends MessageComposer +{ + private final TalentTrackType talentTrackType; + private final TalentTrackLevel talentTrackLevel; + + public TalentLevelUpdateComposer(TalentTrackType talentTrackType, TalentTrackLevel talentTrackLevel) + { + this.talentTrackType = talentTrackType; + this.talentTrackLevel = talentTrackLevel; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TalentLevelUpdateComposer); + this.response.appendString(this.talentTrackType.name()); + this.response.appendInt(this.talentTrackLevel.level); + this.response.appendInt(this.talentTrackLevel.perks.length); + for (String s : this.talentTrackLevel.perks) + { + this.response.appendString(s); + } + + this.response.appendInt(this.talentTrackLevel.items.size()); + for (Item item : this.talentTrackLevel.items) + { + this.response.appendString(item.getName()); + this.response.appendInt(item.getSpriteId()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentTrackComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentTrackComposer.java new file mode 100644 index 00000000..98457572 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/achievements/talenttrack/TalentTrackComposer.java @@ -0,0 +1,153 @@ +package com.eu.habbo.messages.outgoing.achievements.talenttrack; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.*; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TObjectIntProcedure; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.NoSuchElementException; + +public class TalentTrackComposer extends MessageComposer +{ + public enum TalentTrackState + { + LOCKED(0), + IN_PROGRESS(1), + COMPLETED(2); + + public final int id; + + TalentTrackState(int id) + { + this.id = id; + } + } + + public final Habbo habbo; + public final TalentTrackType type; + + public TalentTrackComposer(Habbo habbo, TalentTrackType type) + { + this.habbo = habbo; + this.type = type; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TalentTrackComposer); + this.response.appendString(this.type.name().toLowerCase()); + + LinkedHashMap talentTrackLevels = Emulator.getGameEnvironment().getAchievementManager().getTalenTrackLevels(this.type); + if (talentTrackLevels != null) + { + this.response.appendInt(talentTrackLevels.size()); //Count + final boolean[] allCompleted = {true}; + for (Map.Entry set : talentTrackLevels.entrySet()) + { + try + { + TalentTrackLevel level = set.getValue(); + + this.response.appendInt(level.level); + + TalentTrackState state = TalentTrackState.LOCKED; + + int currentLevel = habbo.getHabboStats().talentTrackLevel(this.type); + + if (currentLevel + 1 == level.level) + { + state = TalentTrackState.IN_PROGRESS; + } + else if (currentLevel >= level.level) + { + state = TalentTrackState.COMPLETED; + } + + this.response.appendInt(state.id); + this.response.appendInt(level.achievements.size()); + + final TalentTrackState finalState = state; + level.achievements.forEachEntry(new TObjectIntProcedure() + { + @Override + public boolean execute(Achievement achievement, int b) + { + if (achievement != null) + { + response.appendInt(achievement.id); + + //TODO Move this to TalenTrackLevel class + response.appendInt(1); //idk + response.appendString("ACH_" + achievement.name + b); + + int progress = habbo.getHabboStats().getAchievementProgress(achievement); + AchievementLevel achievementLevel = achievement.getLevelForProgress(progress); + + if (finalState != TalentTrackState.LOCKED) + { + if (achievementLevel.progress <= progress) + { + response.appendInt(2); + } + else + { + response.appendInt(1); + allCompleted[0] = false; + } + } + else + { + response.appendInt(0); + allCompleted[0] = false; + } + response.appendInt(progress); + response.appendInt(achievementLevel.progress); + } + else + { + response.appendInt(0); + response.appendInt(0); + response.appendString(""); + response.appendString(""); + response.appendInt(0); + response.appendInt(0); + response.appendInt(0); + } + return true; + } + }); + + + this.response.appendInt(level.perks.length); + for (String perk : level.perks) + { + this.response.appendString(perk); + } + + this.response.appendInt(level.items.size()); + for (Item item : level.items) + { + this.response.appendString(item.getName()); + this.response.appendInt(0); + } + } + catch (NoSuchElementException e) + { + return null; + } + } + } + else + { + this.response.appendInt(0); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraCompetitionStatusComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraCompetitionStatusComposer.java new file mode 100644 index 00000000..490f64ec --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraCompetitionStatusComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.camera; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CameraCompetitionStatusComposer extends MessageComposer +{ + private final boolean unknownBoolean; + private final String unknownString; + + public CameraCompetitionStatusComposer(boolean unknownBoolean, String unknownString) + { + this.unknownBoolean = unknownBoolean; + this.unknownString = unknownString; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CameraCompetitionStatusComposer); + this.response.appendBoolean(this.unknownBoolean); + this.response.appendString(this.unknownString); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPriceComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPriceComposer.java new file mode 100644 index 00000000..77cb1b77 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPriceComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.camera; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CameraPriceComposer extends MessageComposer +{ + public final int credits; + public final int points; + public final int pointsType; + + public CameraPriceComposer(int credits, int points, int pointsType) + { + this.credits = credits; + this.points = points; + this.pointsType = pointsType; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CameraPriceComposer); + this.response.appendInt(this.credits); + this.response.appendInt(this.points); + this.response.appendInt(this.pointsType); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPublishWaitMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPublishWaitMessageComposer.java new file mode 100644 index 00000000..67c64b6d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPublishWaitMessageComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.camera; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CameraPublishWaitMessageComposer extends MessageComposer +{ + public final boolean published; + public final int seconds; + public final String unknownString; + + public CameraPublishWaitMessageComposer(boolean published, int seconds, String unknownString) + { + this.published = published; + this.seconds = seconds; + this.unknownString = unknownString; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CameraPublishWaitMessageComposer); + this.response.appendBoolean(this.published); + this.response.appendInt(this.seconds); + + if (this.published) + { + this.response.appendString(this.unknownString); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPurchaseSuccesfullComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPurchaseSuccesfullComposer.java new file mode 100644 index 00000000..a9bf5c8e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraPurchaseSuccesfullComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.camera; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CameraPurchaseSuccesfullComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CameraPurchaseSuccesfullComposer); + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraRoomThumbnailSavedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraRoomThumbnailSavedComposer.java new file mode 100644 index 00000000..fe84ea51 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraRoomThumbnailSavedComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.camera; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CameraRoomThumbnailSavedComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CameraRoomThumbnailSavedComposer); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraURLComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraURLComposer.java new file mode 100644 index 00000000..fe7781dc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/camera/CameraURLComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.camera; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CameraURLComposer extends MessageComposer +{ + public final String URL; + + public CameraURLComposer(String url) + { + URL = url; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CameraURLComposer); + this.response.appendString(this.URL); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertLimitedSoldOutComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertLimitedSoldOutComposer.java new file mode 100644 index 00000000..0dae3850 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertLimitedSoldOutComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AlertLimitedSoldOutComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AlertLimitedSoldOutComposer); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseFailedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseFailedComposer.java new file mode 100644 index 00000000..b087d6fb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseFailedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AlertPurchaseFailedComposer extends MessageComposer +{ + public static final int SERVER_ERROR = 0; + public static final int ALREADY_HAVE_BADGE = 1; + + private final int error; + + public AlertPurchaseFailedComposer(int error) + { + this.error = error; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AlertPurchaseFailedComposer); + this.response.appendInt(this.error); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseUnavailableComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseUnavailableComposer.java new file mode 100644 index 00000000..b2b26631 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/AlertPurchaseUnavailableComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AlertPurchaseUnavailableComposer extends MessageComposer +{ + public final static int ILLEGAL = 0; + public final static int REQUIRES_CLUB = 1; + + private int code; + + public AlertPurchaseUnavailableComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AlertPurchaseUnavailableComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogModeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogModeComposer.java new file mode 100644 index 00000000..9de637e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogModeComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CatalogModeComposer extends MessageComposer +{ + private int mode = 0; + + public CatalogModeComposer(int mode) + { + this.mode = mode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CatalogModeComposer); + this.response.appendInt(this.mode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPageComposer.java new file mode 100644 index 00000000..cc28525a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPageComposer.java @@ -0,0 +1,81 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogFeaturedPage; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.catalog.layouts.FrontPageFeaturedLayout; +import com.eu.habbo.habbohotel.catalog.layouts.FrontpageLayout; +import com.eu.habbo.habbohotel.catalog.layouts.RecentPurchasesLayout; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class CatalogPageComposer extends MessageComposer +{ + private final CatalogPage page; + private final Habbo habbo; + private final String mode; + + public CatalogPageComposer(CatalogPage page, Habbo habbo, String mode) + { + this.page = page; + this.habbo = habbo; + this.mode = mode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CatalogPageComposer); + this.response.appendInt(this.page.getId()); + this.response.appendString(this.mode); + this.page.serialize(this.response); + + if(this.page instanceof RecentPurchasesLayout) + { + this.response.appendInt(this.habbo.getHabboStats().getRecentPurchases().size()); + + for(Map.Entry item : this.habbo.getHabboStats().getRecentPurchases().entrySet()) + { + item.getValue().serialize(this.response); + } + } + else + { + this.response.appendInt(this.page.getCatalogItems().size()); + List items = new ArrayList(); + items.addAll(this.page.getCatalogItems().valueCollection()); + Collections.sort(items); + for (CatalogItem item : items) + { + item.serialize(this.response); + } + } + this.response.appendInt(0); + this.response.appendBoolean(false); //acceptSeasonCurrencyAsCredits + + if (this.page instanceof FrontPageFeaturedLayout || this.page instanceof FrontpageLayout) + { + serializeExtra(this.response); + } + + return this.response; + } + + public void serializeExtra(ServerMessage message) + { + message.appendInt(Emulator.getGameEnvironment().getCatalogManager().getCatalogFeaturedPages().size()); // count + + for (CatalogFeaturedPage page : Emulator.getGameEnvironment().getCatalogManager().getCatalogFeaturedPages().valueCollection()) + { + page.serialize(message); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPagesListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPagesListComposer.java new file mode 100644 index 00000000..00f207e3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogPagesListComposer.java @@ -0,0 +1,83 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class CatalogPagesListComposer extends MessageComposer +{ + private final Habbo habbo; + private final String mode; + private final boolean hasPermission; + + public CatalogPagesListComposer(Habbo habbo, String mode) + { + this.habbo = habbo; + this.mode = mode; + this.hasPermission = this.habbo.hasPermission("acc_catalog_ids"); + } + + @Override + public ServerMessage compose() + { + try + { + List pages = Emulator.getGameEnvironment().getCatalogManager().getCatalogPages(-1, this.habbo); + + this.response.init(Outgoing.CatalogPagesListComposer); + + this.response.appendBoolean(true); + this.response.appendInt(0); + this.response.appendInt(-1); + this.response.appendString("root"); + this.response.appendString(""); + this.response.appendInt(0); + this.response.appendInt(pages.size()); + + for (CatalogPage category : pages) + { + append(category); + } + + this.response.appendBoolean(false); + this.response.appendString(this.mode); + + return this.response; + } + catch(Exception e) + { + e.printStackTrace(); + } + + return null; + } + + private void append(CatalogPage category) + { + List pagesList = Emulator.getGameEnvironment().getCatalogManager().getCatalogPages(category.getId(), this.habbo); + + this.response.appendBoolean(category.isVisible()); + this.response.appendInt(category.getIconImage()); + this.response.appendInt(category.isEnabled() ? category.getId() : -1); + this.response.appendString(category.getPageName()); + this.response.appendString(category.getCaption() + (hasPermission ? " (" + category.getId() + ")" : "")); + this.response.appendInt(category.getOfferIds().size()); + + for(int i : category.getOfferIds().toArray()) + { + this.response.appendInt(i); + } + + this.response.appendInt(pagesList.size()); + + for (CatalogPage page : pagesList) + { + append(page); + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogSearchResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogSearchResultComposer.java new file mode 100644 index 00000000..b8583e6d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogSearchResultComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CatalogSearchResultComposer extends MessageComposer +{ + private CatalogItem item; + + public CatalogSearchResultComposer(CatalogItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CatalogSearchResultComposer); + this.item.serialize(this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogUpdatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogUpdatedComposer.java new file mode 100644 index 00000000..9dc8ded1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/CatalogUpdatedComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CatalogUpdatedComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CatalogUpdatedComposer); + this.response.appendBoolean(false); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubCenterDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubCenterDataComposer.java new file mode 100644 index 00000000..82362de0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubCenterDataComposer.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ClubCenterDataComposer extends MessageComposer +{ + public final int streakDuration; + public final String joinDate; + public final double percentage; + public final int creditsSpend; + public final int creditsBonus; + public final int spendBonus; + public final int delay; + + public ClubCenterDataComposer(int streakDuration, String joinDate, double percentage, int creditsSpend, int creditsBonus, int spendBonus, int delay) + { + this.streakDuration = streakDuration; + this.joinDate = joinDate; + this.percentage = percentage; + this.creditsSpend = creditsSpend; + this.creditsBonus = creditsBonus; + this.spendBonus = spendBonus; + this.delay = delay; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ClubCenterDataComposer); + this.response.appendInt(this.streakDuration); //streakduration in days + this.response.appendString(this.joinDate); //joindate + this.response.appendDouble(this.percentage); //percentage + this.response.appendInt(0); //Unused + this.response.appendInt(0); //unused + this.response.appendInt(this.creditsSpend); //Amount credits spend + this.response.appendInt(this.creditsBonus); //Credits bonus + this.response.appendInt(this.spendBonus); //Spend bonus + this.response.appendInt(this.delay); //next pay in minutes + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java new file mode 100644 index 00000000..a51d6abe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java @@ -0,0 +1,88 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.iterator.TIntObjectIterator; + +import java.util.NoSuchElementException; + +public class ClubGiftsComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ClubGiftsComposer); + + this.response.appendInt(365); //Days Until Next Gift + this.response.appendInt(1); //Gift Selectable + + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(Emulator.getConfig().getInt("catalog.page.vipgifts")); + + if (page != null) + { + this.response.appendInt(page.getCatalogItems().size()); + + TIntObjectIterator iterator = page.getCatalogItems().iterator(); + for (int i = page.getCatalogItems().size(); i-- > 0; ) + { + try + { + iterator.advance(); + + CatalogItem item = iterator.value(); + + if (item != null) + { + item.serialize(this.response); + } + } + catch (NoSuchElementException e) + { + break; + } + } + + this.response.appendInt(page.getCatalogItems().size()); + iterator = page.getCatalogItems().iterator(); + for (int i = page.getCatalogItems().size(); i-- > 0; ) + { + try + { + iterator.advance(); + + CatalogItem item = iterator.value(); + + if (item != null) + { + this.response.appendInt(1); + this.response.appendBoolean(true); + this.response.appendInt(2); + this.response.appendBoolean(true); + } + else + { + this.response.appendInt(-100); + this.response.appendBoolean(false); + this.response.appendInt(-100); + this.response.appendBoolean(false); + } + } + catch (NoSuchElementException e) + { + break; + } + } + } + else + { + this.response.appendInt(0); + this.response.appendInt(0); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/DiscountComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/DiscountComposer.java new file mode 100644 index 00000000..8353a6a7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/DiscountComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class DiscountComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.DiscountComposer); + + this.response.appendInt(100); + this.response.appendInt(6); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendInt(40); + this.response.appendInt(99); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftConfigurationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftConfigurationComposer.java new file mode 100644 index 00000000..55a67ae3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftConfigurationComposer.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class GiftConfigurationComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GiftConfigurationComposer); + + this.response.appendBoolean(true); + this.response.appendInt(Emulator.getConfig().getInt("hotel.gifts.special.price", 2)); + + this.response.appendInt(Emulator.getGameEnvironment().getCatalogManager().giftWrappers.size()); + for(Integer i : Emulator.getGameEnvironment().getCatalogManager().giftWrappers.keySet()) + { + this.response.appendInt(i); + } + + this.response.appendInt(8); + this.response.appendInt(0); + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendInt(3); + this.response.appendInt(4); + this.response.appendInt(5); + this.response.appendInt(6); + this.response.appendInt(8); + + this.response.appendInt(11); + this.response.appendInt(0); + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendInt(3); + this.response.appendInt(4); + this.response.appendInt(5); + this.response.appendInt(6); + this.response.appendInt(7); + this.response.appendInt(8); + this.response.appendInt(9); + this.response.appendInt(10); + + this.response.appendInt(Emulator.getGameEnvironment().getCatalogManager().giftFurnis.size()); + + for(Map.Entry set : Emulator.getGameEnvironment().getCatalogManager().giftFurnis.entrySet()) + { + this.response.appendInt(set.getKey()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftReceiverNotFoundComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftReceiverNotFoundComposer.java new file mode 100644 index 00000000..e6cecb59 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/GiftReceiverNotFoundComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GiftReceiverNotFoundComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GiftReceiverNotFoundComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/NotEnoughPointsTypeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/NotEnoughPointsTypeComposer.java new file mode 100644 index 00000000..3c59bf55 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/NotEnoughPointsTypeComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NotEnoughPointsTypeComposer extends MessageComposer +{ + private final boolean isCredits; + private final boolean isPixels; + private final int pointsType; + + public NotEnoughPointsTypeComposer(boolean isCredits, boolean isPixels, int pointsType) + { + this.isCredits = isCredits; + this.isPixels = isPixels; + this.pointsType = pointsType; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NotEnoughPointsTypeComposer); + this.response.appendBoolean(this.isCredits); + this.response.appendBoolean(this.isPixels); + this.response.appendInt(this.pointsType); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBoughtNotificationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBoughtNotificationComposer.java new file mode 100644 index 00000000..8f347c68 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBoughtNotificationComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetBoughtNotificationComposer extends MessageComposer +{ + private AbstractPet pet; + private boolean gift; + + public PetBoughtNotificationComposer(AbstractPet pet, boolean gift) + { + this.pet = pet; + this.gift = gift; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetBoughtNotificationComposer); + this.response.appendBoolean(this.gift); + this.pet.serialize(this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBreedsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBreedsComposer.java new file mode 100644 index 00000000..06da67eb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetBreedsComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.habbohotel.pets.PetRace; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class PetBreedsComposer extends MessageComposer +{ + private final String petName; + private final THashSet petRaces; + + public PetBreedsComposer(String petName, THashSet petRaces) + { + this.petName = petName; + this.petRaces = petRaces; + } + + @Override + public ServerMessage compose() + { + if(petRaces == null) + return null; + this.response.init(Outgoing.PetBreedsComposer); + this.response.appendString(this.petName); + this.response.appendInt(this.petRaces.size()); + for(PetRace race : this.petRaces) + { + this.response.appendInt(race.race); + this.response.appendInt(race.colorOne); + this.response.appendInt(race.colorTwo); + this.response.appendBoolean(race.hasColorOne); + this.response.appendBoolean(race.hasColorTwo); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetNameErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetNameErrorComposer.java new file mode 100644 index 00000000..028c0ac0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PetNameErrorComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetNameErrorComposer extends MessageComposer +{ + public static final int NAME_OK = 0; + public static final int NAME_TO_LONG = 1; + public static final int NAME_TO_SHORT = 2; + public static final int FORBIDDEN_CHAR = 3; + public static final int FORBIDDEN_WORDS = 4; + + private final int type; + private final String value; + + public PetNameErrorComposer(int type, String value) + { + this.type = type; + this.value = value; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetNameErrorComposer); + this.response.appendInt(this.type); + this.response.appendString(this.value); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/PurchaseOKComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PurchaseOKComposer.java new file mode 100644 index 00000000..c28f2bbf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/PurchaseOKComposer.java @@ -0,0 +1,51 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PurchaseOKComposer extends MessageComposer +{ + private final CatalogItem catalogItem; + + public PurchaseOKComposer(CatalogItem catalogItem) + { + this.catalogItem = catalogItem; + } + + public PurchaseOKComposer() + { + this.catalogItem = null; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PurchaseOKComposer); + if(this.catalogItem != null) + { + this.catalogItem.serialize(this.response); + } + else + { + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendBoolean(false); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendBoolean(true); + this.response.appendInt(1); + this.response.appendString("s"); + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendInt(1); + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendInt(1); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerCompleteComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerCompleteComposer.java new file mode 100644 index 00000000..7a45db1a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerCompleteComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RecyclerCompleteComposer extends MessageComposer +{ + public static final int RECYCLING_COMPLETE = 1; + public static final int RECYCLING_CLOSED = 2; + + private final int code; + + public RecyclerCompleteComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RecyclerCompleteComposer); + this.response.appendInt(this.code); + this.response.appendInt(0); //prize ID. + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerLogicComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerLogicComposer.java new file mode 100644 index 00000000..c152aab1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RecyclerLogicComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +import java.util.Map; + +public class RecyclerLogicComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RecyclerLogicComposer); + this.response.appendInt(Emulator.getGameEnvironment().getCatalogManager().prizes.size()); + for(Map.Entry> map : Emulator.getGameEnvironment().getCatalogManager().prizes.entrySet()) + { + this.response.appendInt(map.getKey()); + this.response.appendInt(Integer.valueOf(Emulator.getConfig().getValue("hotel.ecotron.rarity.chance." + map.getKey()))); + this.response.appendInt(map.getValue().size()); + for(Item item : map.getValue()) + { + this.response.appendString(item.getName()); + this.response.appendInt(1); + this.response.appendString(item.getType().code.toLowerCase()); + this.response.appendInt(item.getSpriteId()); + } + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherErrorComposer.java new file mode 100644 index 00000000..63152f22 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherErrorComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RedeemVoucherErrorComposer extends MessageComposer +{ + public static final int INVALID_CODE = 0; + public static final int TECHNICAL_ERROR = 1; + + private final int code; + + public RedeemVoucherErrorComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RedeemVoucherErrorComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherOKComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherOKComposer.java new file mode 100644 index 00000000..7d7c802d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/RedeemVoucherOKComposer.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RedeemVoucherOKComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RedeemVoucherOKComposer); + this.response.appendString(""); + this.response.appendString(""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/ReloadRecyclerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ReloadRecyclerComposer.java new file mode 100644 index 00000000..f9926b51 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ReloadRecyclerComposer.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.outgoing.catalog; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ReloadRecyclerComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ReloadRecyclerComposer); + this.response.appendInt(1); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceBuyErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceBuyErrorComposer.java new file mode 100644 index 00000000..ae6bed20 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceBuyErrorComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceBuyErrorComposer extends MessageComposer +{ + public static final int REFRESH = 1; + public static final int SOLD_OUT = 2; + public static final int UPDATES = 3; + public static final int NOT_ENOUGH_CREDITS = 4; + + private final int errorCode; + private final int unknown; + private final int offerId; + private final int price; + + public MarketplaceBuyErrorComposer(int errorCode, int unknown, int offerId, int price) + { + this.errorCode = errorCode; + this.unknown = unknown; + this.offerId = offerId; + this.price = price; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceBuyErrorComposer); + this.response.appendInt(this.errorCode); + this.response.appendInt(this.unknown); + this.response.appendInt(this.offerId); + this.response.appendInt(this.price); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceCancelSaleComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceCancelSaleComposer.java new file mode 100644 index 00000000..5ac62002 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceCancelSaleComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceOffer; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceCancelSaleComposer extends MessageComposer +{ + private final MarketPlaceOffer offer; + private final boolean success; + + public MarketplaceCancelSaleComposer(MarketPlaceOffer offer, Boolean success) + { + this.offer = offer; + this.success = success; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceCancelSaleComposer); + this.response.appendInt(this.offer.getOfferId()); + this.response.appendBoolean(this.success); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceConfigComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceConfigComposer.java new file mode 100644 index 00000000..284fb30c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceConfigComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceConfigComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceConfigComposer); + + this.response.appendBoolean(true); + this.response.appendInt(1); //Commision Percentage. + this.response.appendInt(10); //Credits + this.response.appendInt(5); //Advertisements + this.response.appendInt(1); //Min price + this.response.appendInt(1000000); //Max price + this.response.appendInt(48); //Hours in marketplace + this.response.appendInt(7); //Days to display + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemInfoComposer.java new file mode 100644 index 00000000..7294a1a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemInfoComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceItemInfoComposer extends MessageComposer +{ + private final int itemId; + + public MarketplaceItemInfoComposer(int itemId) + { + this.itemId = itemId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceItemInfoComposer); + MarketPlace.serializeItemInfo(itemId, this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemPostedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemPostedComposer.java new file mode 100644 index 00000000..f3263b62 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceItemPostedComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceItemPostedComposer extends MessageComposer +{ + public static final int POST_SUCCESS = 1; + public static final int FAILED_TECHNICAL_ERROR = 2; + public static final int MARKETPLACE_DISABLED = 3; + public static final int ITEM_JUST_ADDED_TO_SHOP = 4; + + private int code; + + public MarketplaceItemPostedComposer(int code) + { + this.code = code; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceItemPostedComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOffersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOffersComposer.java new file mode 100644 index 00000000..5fa393c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOffersComposer.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceOffer; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +import java.util.List; + +public class MarketplaceOffersComposer extends MessageComposer +{ + private final List offers; + + public MarketplaceOffersComposer(List offers) + { + this.offers = offers; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceOffersComposer); + int total = 0; + this.response.appendInt(this.offers.size()); + + for(MarketPlaceOffer offer : this.offers) + { + this.response.appendInt(offer.getOfferId()); + this.response.appendInt(1); + this.response.appendInt(offer.getType()); + this.response.appendInt(offer.getItemId()); + if(offer.getType() == 3) + { + this.response.appendInt(offer.getLimitedNumber()); + this.response.appendInt(offer.getLimitedStack()); + } + else if (offer.getType() == 2) + { + this.response.appendString(""); + } + else + { + this.response.appendInt(0); + this.response.appendString(""); + } + this.response.appendInt(MarketPlace.calculateCommision(offer.getPrice())); + this.response.appendInt(0); + this.response.appendInt(MarketPlace.calculateCommision(offer.avarage)); + this.response.appendInt(offer.count); + + total += offer.count; + } + this.response.appendInt(this.offers.size()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOwnItemsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOwnItemsComposer.java new file mode 100644 index 00000000..ea368a70 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceOwnItemsComposer.java @@ -0,0 +1,77 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceOffer; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceState; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceOwnItemsComposer extends MessageComposer +{ + private Habbo habbo; + + public MarketplaceOwnItemsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceOwnItemsComposer); + this.response.appendInt(habbo.getInventory().getSoldPriceTotal()); + this.response.appendInt(habbo.getInventory().getMarketplaceItems().size()); + + for(MarketPlaceOffer offer : habbo.getInventory().getMarketplaceItems()) + { + try + { + if (offer.getState() == MarketPlaceState.OPEN) + { + if ((offer.getTimestamp() + 172800) - Emulator.getIntUnixTimestamp() <= 0) + { + offer.setState(MarketPlaceState.CLOSED); + Emulator.getThreading().run(offer); + } + } + + this.response.appendInt(offer.getOfferId()); + this.response.appendInt(offer.getState().getState()); + this.response.appendInt(offer.getType()); + this.response.appendInt(offer.getItemId()); + + if (offer.getType() == 3) + { + this.response.appendInt(offer.getLimitedNumber()); + this.response.appendInt(offer.getLimitedStack()); + } + else if (offer.getType() == 2) + { + this.response.appendString(""); + } + else + { + this.response.appendInt(0); + this.response.appendString(""); + } + + this.response.appendInt(offer.getPrice()); + + if (offer.getState() == MarketPlaceState.OPEN) + this.response.appendInt((((offer.getTimestamp() + 172800) - Emulator.getIntUnixTimestamp()) / 60)); + else + this.response.appendInt(0); + + this.response.appendInt(0); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceSellItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceSellItemComposer.java new file mode 100644 index 00000000..dfb9ecd9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/marketplace/MarketplaceSellItemComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.catalog.marketplace; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MarketplaceSellItemComposer extends MessageComposer +{ + public static final int NOT_ALLOWED = 2; + public static final int NO_TRADE_PASS = 3; + public static final int NO_ADS_LEFT = 4; + + private final int errorCode; + private final int valueA; + private final int valueB; + + public MarketplaceSellItemComposer(int errorCode, int valueA, int valueB) + { + this.errorCode = errorCode; + this.valueA = valueA; + this.valueB = valueB; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MarketplaceSellItemComposer); + this.response.appendInt(this.errorCode); + this.response.appendInt(this.valueA); + this.response.appendInt(this.valueB); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftableProductsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftableProductsComposer.java new file mode 100644 index 00000000..23bbafd5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftableProductsComposer.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.outgoing.crafting; + +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Collection; +import java.util.List; + +public class CraftableProductsComposer extends MessageComposer +{ + private final List recipes; + private final Collection ingredients; + + public CraftableProductsComposer(List recipes, Collection ingredients) + { + this.recipes = recipes; + this.ingredients = ingredients; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CraftableProductsComposer); + + this.response.appendInt(this.recipes.size()); + for (CraftingRecipe recipe : recipes) + { + this.response.appendString(recipe.getName()); + this.response.appendString(recipe.getReward().getName()); + } + + this.response.appendInt(this.ingredients.size()); + for (Item item : ingredients) + { + this.response.appendString(item.getName()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipeComposer.java new file mode 100644 index 00000000..eb1485c8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipeComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.crafting; + +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class CraftingRecipeComposer extends MessageComposer +{ + private final CraftingRecipe recipe; + + public CraftingRecipeComposer(CraftingRecipe recipe) + { + this.recipe = recipe; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CraftingRecipeComposer); + this.response.appendInt(this.recipe.getIngredients().size()); + + for (Map.Entry ingredient : this.recipe.getIngredients().entrySet()) + { + this.response.appendInt(ingredient.getValue()); + this.response.appendString(ingredient.getKey().getName()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipesAvailableComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipesAvailableComposer.java new file mode 100644 index 00000000..afd97868 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingRecipesAvailableComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.crafting; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CraftingRecipesAvailableComposer extends MessageComposer +{ + private final int count; + private final boolean found; + + public CraftingRecipesAvailableComposer(int count, boolean found) + { + this.count = count; + this.found = found; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CraftingComposerFour); + this.response.appendInt((this.found ? -1 : 0) + this.count); + this.response.appendBoolean(this.found); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingResultComposer.java new file mode 100644 index 00000000..80799420 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/crafting/CraftingResultComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.crafting; + +import com.eu.habbo.habbohotel.crafting.CraftingRecipe; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CraftingResultComposer extends MessageComposer +{ + private final CraftingRecipe recipe; + + public CraftingResultComposer(CraftingRecipe recipe) + { + this.recipe = recipe; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CraftingResultComposer); + + this.response.appendBoolean(this.recipe != null); //succes + + if(this.recipe != null) + { + this.response.appendString(this.recipe.getName()); + this.response.appendString(this.recipe.getReward().getName()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarDataComposer.java new file mode 100644 index 00000000..a1a7e8fc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarDataComposer.java @@ -0,0 +1,79 @@ +package com.eu.habbo.messages.outgoing.events.calendar; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.procedure.TIntProcedure; + +import java.util.ArrayList; +import java.util.List; + +public class AdventCalendarDataComposer extends MessageComposer +{ + public final String eventName; + public final int totalDays; + public final int currentDay; + public final TIntArrayList unlocked; + public final boolean lockExpired; + + public AdventCalendarDataComposer(String eventName, int totalDays, int currentDay, TIntArrayList unlocked, boolean lockExpired) + { + this.eventName = eventName; + this.totalDays = totalDays; + this.currentDay = currentDay; + this.unlocked = unlocked; + this.lockExpired = lockExpired; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AdventCalendarDataComposer); + this.response.appendString(this.eventName); + this.response.appendString(""); + this.response.appendInt(this.currentDay); + this.response.appendInt(this.totalDays); + + this.response.appendInt(this.unlocked.size()); + + TIntArrayList expired = new TIntArrayList(); + for (int i = 0; i < totalDays; i++) + { + expired.add(i); + expired.remove(this.currentDay); + } + + this.unlocked.forEach(new TIntProcedure() + { + @Override + public boolean execute(int value) + { + response.appendInt(value); + expired.remove(value); + return true; + } + }); + + + if (this.lockExpired) + { + this.response.appendInt(expired.size()); + expired.forEach(new TIntProcedure() + { + @Override + public boolean execute(int value) + { + response.appendInt(value); + return true; + } + }); + } + else + { + this.response.appendInt(0); + } + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarProductComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarProductComposer.java new file mode 100644 index 00000000..78993beb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/calendar/AdventCalendarProductComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.events.calendar; + +import com.eu.habbo.habbohotel.catalog.CalendarRewardObject; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AdventCalendarProductComposer extends MessageComposer +{ + public final boolean visible; + public final CalendarRewardObject rewardObject; + + public AdventCalendarProductComposer(boolean visible, CalendarRewardObject rewardObject) + { + this.visible = visible; + this.rewardObject = rewardObject; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AdventCalendarProductComposer); + this.response.appendBoolean(this.visible); + this.response.appendString(this.rewardObject.getName()); + this.response.appendString(this.rewardObject.getCustomImage()); + this.response.appendString(this.rewardObject.getCatalogItem() != null ? this.rewardObject.getCatalogItem().getName() : this.rewardObject.getName()); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxCloseComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxCloseComposer.java new file mode 100644 index 00000000..b1a62918 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxCloseComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.events.mysticbox; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MysticBoxCloseComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MysticBoxCloseComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxPrizeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxPrizeComposer.java new file mode 100644 index 00000000..fd75fdbe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxPrizeComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.events.mysticbox; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MysticBoxPrizeComposer extends MessageComposer +{ + private final String type; + private final int itemId; + + public MysticBoxPrizeComposer(String type, int itemId) + { + this.type = type; + this.itemId = itemId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MysticBoxPrizeComposer); + this.response.appendString(this.type); + this.response.appendInt(this.itemId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxStartOpenComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxStartOpenComposer.java new file mode 100644 index 00000000..d9e46f3c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/mysticbox/MysticBoxStartOpenComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.events.mysticbox; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MysticBoxStartOpenComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MysticBoxStartOpenComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionCompletedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionCompletedComposer.java new file mode 100644 index 00000000..5cc82093 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionCompletedComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.events.resolution; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewYearResolutionCompletedComposer extends MessageComposer +{ + public final String badge; + + public NewYearResolutionCompletedComposer(String badge) + { + this.badge = badge; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewYearResolutionCompletedComposer); + this.response.appendString(this.badge); + this.response.appendString(this.badge); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionComposer.java new file mode 100644 index 00000000..fe73253f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.events.resolution; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewYearResolutionComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + //:test 817 i:230 i:1 i:1 i:1 s:NY2013RES i:3 i:0 i:60000000 + this.response.init(Outgoing.NewYearResolutionComposer); + + this.response.appendInt(230); //reward ID or item id? (stuffId) + this.response.appendInt(2); //count + + this.response.appendInt(1); //achievementId + this.response.appendInt(1); //achievementLevel + this.response.appendString("NY2013RES"); + this.response.appendInt(3); //type ? + this.response.appendInt(0); //Finished/ enabled + + this.response.appendInt(2); //achievementId + this.response.appendInt(1); //achievementLevel + this.response.appendString("ADM"); + this.response.appendInt(2); //type ? + this.response.appendInt(0); //Finished/ enabled + + this.response.appendInt(1000); //Time in secs left. + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionProgressComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionProgressComposer.java new file mode 100644 index 00000000..6304a2eb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/events/resolution/NewYearResolutionProgressComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.events.resolution; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewYearResolutionProgressComposer extends MessageComposer +{ + private final int stuffId; + private final int achievementId; + private final String achievementName; + private final int currentProgress; + private final int progressNeeded; + private final int timeLeft; + + public NewYearResolutionProgressComposer(int stuffId, int achievementId, String achievementName, int currentProgress, int progressNeeded, int timeLeft) + { + this.stuffId = stuffId; + this.achievementId = achievementId; + this.achievementName = achievementName; + this.currentProgress = currentProgress; + this.progressNeeded = progressNeeded; + this.timeLeft = timeLeft; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewYearResolutionProgressComposer); + this.response.appendInt(this.stuffId); + this.response.appendInt(this.achievementId); + this.response.appendString(this.achievementName); + this.response.appendInt(this.currentProgress); + this.response.appendInt(this.progressNeeded); + this.response.appendInt(this.timeLeft); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorBlockedTilesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorBlockedTilesComposer.java new file mode 100644 index 00000000..590f936e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorBlockedTilesComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.floorplaneditor; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class FloorPlanEditorBlockedTilesComposer extends MessageComposer +{ + private final Room room; + + public FloorPlanEditorBlockedTilesComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FloorPlanEditorBlockedTilesComposer); + + THashSet tileList = this.room.getLockedTiles(); + + this.response.appendInt(tileList.size()); + for(RoomTile node : tileList) + { + this.response.appendInt((int) node.x); + this.response.appendInt((int) node.y); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorDoorSettingsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorDoorSettingsComposer.java new file mode 100644 index 00000000..33b22cd9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/floorplaneditor/FloorPlanEditorDoorSettingsComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.floorplaneditor; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FloorPlanEditorDoorSettingsComposer extends MessageComposer +{ + private final Room room; + + public FloorPlanEditorDoorSettingsComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FloorPlanEditorDoorSettingsComposer); + this.response.appendInt32(this.room.getLayout().getDoorX()); + this.response.appendInt32(this.room.getLayout().getDoorY()); + this.response.appendInt(this.room.getLayout().getDoorDirection()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendChatMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendChatMessageComposer.java new file mode 100644 index 00000000..d01ca183 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendChatMessageComposer.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.Message; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FriendChatMessageComposer extends MessageComposer +{ + private final Message message; + + public FriendChatMessageComposer(Message message) + { + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FriendChatMessageComposer); + + if (message.getToId() == -1) + { + this.response.appendInt(-1); + } + else + { + this.response.appendInt(message.getFromId()); + } + this.response.appendString(message.getMessage()); + this.response.appendInt(Emulator.getIntUnixTimestamp() - message.getTimestamp()); + + if (message.getToId() == -1) //TO Staff Chat + { + String name = "AUTO_MODERATOR"; + String look = "lg-5635282-1193.hd-3091-1.sh-3089-73.cc-156282-64.hr-831-34.ha-1012-1186.ch-3050-62-62"; + if (message.getFromId() != -1) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(message.getFromId()); + + if (habbo != null) + { + name = habbo.getHabboInfo().getUsername(); + look = habbo.getHabboInfo().getLook(); + } + else + { + name = "UNKNOWN"; + } + } + this.response.appendString(name + "/" + look + "/" + this.message.getFromId()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendFindingRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendFindingRoomComposer.java new file mode 100644 index 00000000..dd3ff15c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendFindingRoomComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FriendFindingRoomComposer extends MessageComposer +{ + public static final int NO_ROOM_FOUND = 0; + public static final int ROOM_FOUND = 1; + + private int errorCode; + + public FriendFindingRoomComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FriendFindingRoomComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendNotificationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendNotificationComposer.java new file mode 100644 index 00000000..5134634d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendNotificationComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FriendNotificationComposer extends MessageComposer +{ + public final static int INSTANT_MESSAGE = -1; + public final static int ROOM_EVENT = 0; + public final static int ACHIEVEMENT_COMPLETED = 1; + public final static int QUEST_COMPLETED = 2; + public final static int IS_PLAYING_GAME = 3; + public final static int FINISHED_GAME = 4; + public final static int INVITE_TO_PLAY_GAME = 5; + + private int userId; + private int type; + private String data; + + public FriendNotificationComposer(int userId, int type, String data) + { + this.userId = userId; + this.type = type; + this.data = data; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FriendToolbarNotificationComposer); + this.response.appendString(userId + ""); + this.response.appendInt(this.type); + this.response.appendString(this.data); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestComposer.java new file mode 100644 index 00000000..dd492b5d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FriendRequestComposer extends MessageComposer +{ + private final Habbo habbo; + + public FriendRequestComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FriendRequestComposer); + + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendString(this.habbo.getHabboInfo().getLook()); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestErrorComposer.java new file mode 100644 index 00000000..5f1ca458 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendRequestErrorComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FriendRequestErrorComposer extends MessageComposer +{ + public static final int FRIEND_LIST_OWN_FULL = 1; + public static final int TARGET_NOT_ACCEPTING_REQUESTS = 3; + public static final int TARGET_NOT_FOUND = 4; + + private final int errorCode; + + public FriendRequestErrorComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FriendRequestErrorComposer); + this.response.appendInt(0); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendsComposer.java new file mode 100644 index 00000000..a9babaa0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/FriendsComposer.java @@ -0,0 +1,77 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class FriendsComposer extends MessageComposer +{ + private final Habbo habbo; + + public FriendsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + try + { + this.response.init(Outgoing.FriendsComposer); + + //this.response.appendInt(300); + //this.response.appendInt(300); + //this.response.appendInt(3); //Club level + this.response.appendInt(300); + this.response.appendInt(300); + this.response.appendInt(this.habbo.getMessenger().getFriends().size() + (this.habbo.hasPermission("acc_staff_chat") ? 1 : 0)); + + for (Map.Entry row : this.habbo.getMessenger().getFriends().entrySet()) { + this.response.appendInt(row.getKey()); + this.response.appendString(row.getValue().getUsername()); + this.response.appendInt(row.getValue().getGender().equals(HabboGender.M) ? 0 : 1); + this.response.appendBoolean(row.getValue().getOnline() == 1); + this.response.appendBoolean(row.getValue().inRoom()); //IN ROOM + this.response.appendString(row.getValue().getLook()); + this.response.appendInt(0); + this.response.appendString(row.getValue().getMotto()); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendBoolean(false); //Offline messaging. + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendShort(row.getValue().getRelation()); + } + + if(habbo.hasPermission("acc_staff_chat")) + { + this.response.appendInt(-1); + this.response.appendString("Staff Chat"); + this.response.appendInt(this.habbo.getHabboInfo().getGender().equals(HabboGender.M) ? 0 : 1); + this.response.appendBoolean(true); + this.response.appendBoolean(false); //IN ROOM + this.response.appendString("ADM"); + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendBoolean(true); //Offline messaging. + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendShort(0); + } + return this.response; + } + catch(Exception e) + { + e.printStackTrace(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/LoadFriendRequestsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/LoadFriendRequestsComposer.java new file mode 100644 index 00000000..2a06bb67 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/LoadFriendRequestsComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.messenger.FriendRequest; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class LoadFriendRequestsComposer extends MessageComposer +{ + private final Habbo habbo; + + public LoadFriendRequestsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.LoadFriendRequestsComposer); + + synchronized (this.habbo.getMessenger().getFriendRequests()) + { + this.response.appendInt(this.habbo.getMessenger().getFriendRequests().size()); + this.response.appendInt(this.habbo.getMessenger().getFriendRequests().size()); + + for (FriendRequest friendRequest : this.habbo.getMessenger().getFriendRequests()) + { + this.response.appendInt(friendRequest.getId()); + this.response.appendString(friendRequest.getUsername()); + this.response.appendString(friendRequest.getLook()); + } + } + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/MessengerInitComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/MessengerInitComposer.java new file mode 100644 index 00000000..7a3ad1a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/MessengerInitComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MessengerInitComposer extends MessageComposer +{ + private Habbo habbo; + + public MessengerInitComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MessengerInitComposer); + this.response.appendInt(300); + this.response.appendInt(1337); + this.response.appendInt(500); + //this.response.appendInt(1000); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/RemoveFriendComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/RemoveFriendComposer.java new file mode 100644 index 00000000..0772346a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/RemoveFriendComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.list.array.TIntArrayList; + +public class RemoveFriendComposer extends MessageComposer +{ + private TIntArrayList unfriendIds; + + public RemoveFriendComposer(TIntArrayList unfriendIds) + { + this.unfriendIds = unfriendIds; + } + + public RemoveFriendComposer(int i) + { + this.unfriendIds = new TIntArrayList(); + this.unfriendIds.add(i); + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UpdateFriendComposer); + + this.response.appendInt(0); + this.response.appendInt(this.unfriendIds.size()); + for(int i = 0; i < this.unfriendIds.size(); i++) + { + this.response.appendInt(-1); + this.response.appendInt(unfriendIds.get(i)); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteComposer.java new file mode 100644 index 00000000..495a0c38 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomInviteComposer extends MessageComposer +{ + private int userId; + private String message; + + public RoomInviteComposer(int userId, String message) + { + this.userId = userId; + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomInviteComposer); + this.response.appendInt(this.userId); + this.response.appendString(this.message); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteErrorComposer.java new file mode 100644 index 00000000..0ee77972 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/RoomInviteErrorComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TObjectProcedure; +import gnu.trove.set.hash.THashSet; + +public class RoomInviteErrorComposer extends MessageComposer +{ + private final int errorCode; + private final THashSet buddies; + + public RoomInviteErrorComposer(int errorCode, THashSet buddies) + { + this.errorCode = errorCode; + this.buddies = buddies; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomInviteErrorComposer); + this.response.appendInt(this.errorCode); + this.response.appendInt(this.buddies.size()); + this.buddies.forEach(new TObjectProcedure() + { + @Override + public boolean execute(MessengerBuddy object) + { + response.appendInt(object.getId()); + return true; + } + }); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/StalkErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/StalkErrorComposer.java new file mode 100644 index 00000000..71e3f202 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/StalkErrorComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class StalkErrorComposer extends MessageComposer +{ + public static final int NOT_IN_FRIEND_LIST = 0; + public static final int FRIEND_OFFLINE = 1; + public static final int FRIEND_NOT_IN_ROOM = 2; + public static final int FRIEND_BLOCKED_STALKING = 3; + + private final int errorCode; + + public StalkErrorComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.StalkErrorComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/UpdateFriendComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/UpdateFriendComposer.java new file mode 100644 index 00000000..a3235221 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/UpdateFriendComposer.java @@ -0,0 +1,77 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UpdateFriendComposer extends MessageComposer +{ + private MessengerBuddy buddy; + + private Habbo habbo; + + public UpdateFriendComposer(MessengerBuddy buddy) + { + this.buddy = buddy; + } + + /** + * Updates the staff chat so the look matches the user. Does not do any other stuff. + * @param habbo + */ + public UpdateFriendComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + + this.response.init(Outgoing.UpdateFriendComposer); + if(buddy != null) + { + this.response.appendInt(0); + this.response.appendInt(1); + this.response.appendInt(0); + this.response.appendInt(this.buddy.getId()); + this.response.appendString(this.buddy.getUsername()); + this.response.appendInt(this.buddy.getGender().equals(HabboGender.M) ? 0 : 1); + this.response.appendBoolean(this.buddy.getOnline() == 1); + this.response.appendBoolean(this.buddy.inRoom()); //In room + this.response.appendString(this.buddy.getLook()); + this.response.appendInt(0); + this.response.appendString(this.buddy.getMotto()); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendShort(this.buddy.getRelation()); + } + else + { + this.response.appendInt(0); + this.response.appendInt(1); + this.response.appendInt(0); + this.response.appendInt(-1); + this.response.appendString("Staff Chat"); + this.response.appendInt(0); + this.response.appendBoolean(true); + this.response.appendBoolean(false); //In room + this.response.appendString(this.habbo.getHabboInfo().getLook()); + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendShort(0); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/friends/UserSearchResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/friends/UserSearchResultComposer.java new file mode 100644 index 00000000..887b9695 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/friends/UserSearchResultComposer.java @@ -0,0 +1,78 @@ +package com.eu.habbo.messages.outgoing.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class UserSearchResultComposer extends MessageComposer +{ + private final THashSet users; + private final THashSet friends; + private final Habbo habbo; + + public UserSearchResultComposer(THashSet users, THashSet friends, Habbo habbo) + { + this.users = users; + this.friends = friends; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserSearchResultComposer); + THashSet u = new THashSet(); + + for(MessengerBuddy buddy : this.users) + { + if(!buddy.getUsername().equals(this.habbo.getHabboInfo().getUsername()) && !inFriendList(buddy)) + { + u.add(buddy); + } + } + + this.response.appendInt(this.friends.size()); + for(MessengerBuddy buddy : this.friends) + { + this.response.appendInt(buddy.getId()); + this.response.appendString(buddy.getUsername()); + this.response.appendString(buddy.getMotto()); + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendString(""); + this.response.appendInt(1); + this.response.appendString(buddy.getLook()); + this.response.appendString(""); + } + + this.response.appendInt(u.size()); + for(MessengerBuddy buddy : u) + { + this.response.appendInt(buddy.getId()); + this.response.appendString(buddy.getUsername()); + this.response.appendString(buddy.getMotto()); + this.response.appendBoolean(false); + this.response.appendBoolean(false); + this.response.appendString(""); + this.response.appendInt(1); + this.response.appendString(buddy.getLook()); + this.response.appendString(""); + } + + return this.response; + } + + private boolean inFriendList(MessengerBuddy buddy) + { + for(MessengerBuddy friend : this.friends) + { + if(friend.getUsername().equals(buddy.getUsername())) + return true; + } + + return false; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAccountInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAccountInfoComposer.java new file mode 100644 index 00000000..8a7bd355 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAccountInfoComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.gamecenter; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GameCenterAccountInfoComposer extends MessageComposer +{ + private final int gameId; + private final int gamesLeft; + + public GameCenterAccountInfoComposer(int gameId, int gamesLeft) + { + this.gameId = gameId; + this.gamesLeft = gamesLeft; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GameCenterAccountInfoComposer); + this.response.appendInt(this.gameId); + this.response.appendInt(this.gamesLeft); + this.response.appendInt(1); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAchievementsConfigurationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAchievementsConfigurationComposer.java new file mode 100644 index 00000000..18975810 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterAchievementsConfigurationComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.gamecenter; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class GameCenterAchievementsConfigurationComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2265); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(3); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendString("BaseJumpBigParachute"); + this.response.appendInt(1); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameComposer.java new file mode 100644 index 00000000..89d94eb7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.gamecenter; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GameCenterGameComposer extends MessageComposer +{ + public final static int OK = 0; + public final static int ERROR = 1; + + public final int gameId; + public final int status; + + public GameCenterGameComposer(int gameId, int status) + { + this.gameId = gameId; + this.status = status; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GameCenterGameComposer); + this.response.appendInt(this.gameId); + this.response.appendInt(this.status); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameListComposer.java new file mode 100644 index 00000000..33801fb8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/GameCenterGameListComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.gamecenter; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GameCenterGameListComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GameCenterGameListComposer); + this.response.appendInt(2);//Count + + this.response.appendInt(0); + this.response.appendString("snowwar"); + this.response.appendString("93d4f3"); + this.response.appendString(""); + this.response.appendString("http://localhost/game/c_images/gamecenter_snowwar/"); + this.response.appendString(""); + + this.response.appendInt(3); + this.response.appendString("basejump"); + this.response.appendString("68bbd2"); //Background Color + this.response.appendString(""); //Text color + this.response.appendString("http://localhost/game/c_images/gamecenter_basejump/"); + this.response.appendString(""); + + this.response.appendInt(4); + this.response.appendString("slotcar"); + this.response.appendString("4a95df"); + this.response.appendString(""); + this.response.appendString("http://habboo-a.akamaihd.net/gamecenter/Sulake/slotcar/20130214010101/"); + this.response.appendString(""); + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpJoinQueueComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpJoinQueueComposer.java new file mode 100644 index 00000000..47024cde --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpJoinQueueComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.gamecenter.basejump; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BaseJumpJoinQueueComposer extends MessageComposer +{ + private final int gameId; + + public BaseJumpJoinQueueComposer(int gameId) + { + this.gameId = gameId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BaseJumpJoinQueueComposer); + this.response.appendInt(this.gameId); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLeaveQueueComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLeaveQueueComposer.java new file mode 100644 index 00000000..8b98d571 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLeaveQueueComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.gamecenter.basejump; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BaseJumpLeaveQueueComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BaseJumpLeaveQueueComposer); + this.response.appendInt(3); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameComposer.java new file mode 100644 index 00000000..8ca18055 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameComposer.java @@ -0,0 +1,60 @@ +package com.eu.habbo.messages.outgoing.gamecenter.basejump; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BaseJumpLoadGameComposer extends MessageComposer +{ + public static String FASTFOOD_KEY = ""; + private final GameClient client; + private final int game; + + public BaseJumpLoadGameComposer(GameClient client, int game) + { + this.client = client; + this.game = game; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BaseJumpLoadGameComposer); + + if (this.game == 3) + { + this.response.appendInt(3); + this.response.appendString("basejump"); + this.response.appendString(Emulator.getConfig().getValue("basejump.url")); + this.response.appendString("best"); + this.response.appendString("showAll"); + this.response.appendInt(60); + this.response.appendInt(10); + this.response.appendInt(0); + this.response.appendInt(6); + this.response.appendString("assetUrl"); + this.response.appendString(Emulator.getConfig().getValue("basejump.assets.url")); + this.response.appendString("habboHost"); + this.response.appendString(Emulator.getConfig().getValue("hotel.url")); + this.response.appendString("accessToken"); + this.response.appendString(Emulator.getConfig().getValue("username") + "\t" + Emulator.version + "\t" + this.client.getHabbo().getHabboInfo().getId() + "\t" + this.client.getHabbo().getHabboInfo().getUsername() + "\t" + this.client.getHabbo().getHabboInfo().getLook() + "\t" + this.client.getHabbo().getHabboInfo().getCredits() + "\t" + FASTFOOD_KEY); + this.response.appendString("gameServerHost"); + this.response.appendString("arcturus.wf"); + this.response.appendString("gameServerPort"); + this.response.appendString("3002"); + this.response.appendString("socketPolicyPort"); + this.response.appendString("3002"); +// this.response.appendString("accessToken"); +// this.response.appendString(this.client.getHabbo().getHabboInfo().getUsername() + "-" + this.client.getHabbo().getHabboInfo().getLook()); +// this.response.appendString("gameServerHost"); +// this.response.appendString("localhost"); +// this.response.appendString("gameServerPort"); +// this.response.appendString("3002"); +// this.response.appendString("socketPolicyPort"); +// this.response.appendString("3003"); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameURLComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameURLComposer.java new file mode 100644 index 00000000..f2dcae8f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpLoadGameURLComposer.java @@ -0,0 +1,18 @@ +package com.eu.habbo.messages.outgoing.gamecenter.basejump; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BaseJumpLoadGameURLComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BaseJumpLoadGameURLComposer); + this.response.appendInt(4); + this.response.appendString("1351418858673"); + this.response.appendString("http://images.habbo.com/speedway/200912/index.html?accessToken=ff5d09d1-ef22-4ee5-8b1b-8260d13d0d6f&gameServerHost=localhost&gameServerPort=30000&socketPolicyPort=30000"); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpUnloadGameComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpUnloadGameComposer.java new file mode 100644 index 00000000..9770fac9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/gamecenter/basejump/BaseJumpUnloadGameComposer.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.outgoing.gamecenter.basejump; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BaseJumpUnloadGameComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BaseJumpUnloadGameComposer); + this.response.appendInt(3); + this.response.appendString("basejump"); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/MinimailCountComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/MinimailCountComposer.java new file mode 100644 index 00000000..25768a4f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/MinimailCountComposer.java @@ -0,0 +1,18 @@ +package com.eu.habbo.messages.outgoing.generic; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MinimailCountComposer extends MessageComposer +{ + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MinimailCountComposer); + this.response.appendInt(0); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/PickMonthlyClubGiftNotificationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/PickMonthlyClubGiftNotificationComposer.java new file mode 100644 index 00000000..ff684b4c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/PickMonthlyClubGiftNotificationComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.generic; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PickMonthlyClubGiftNotificationComposer extends MessageComposer +{ + private int count; + + public PickMonthlyClubGiftNotificationComposer(int count) + { + this.count = count; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PickMonthlyClubGiftNotificationComposer); + this.response.appendInt(this.count); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BotErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BotErrorComposer.java new file mode 100644 index 00000000..90b0e30a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BotErrorComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BotErrorComposer extends MessageComposer +{ + public static final int ROOM_ERROR_BOTS_FORBIDDEN_IN_HOTEL = 0; + public static final int ROOM_ERROR_BOTS_FORBIDDEN_IN_FLAT = 1; + public static final int ROOM_ERROR_MAX_BOTS = 2; + public static final int ROOM_ERROR_BOTS_SELECTED_TILE_NOT_FREE = 3; + public static final int ROOM_ERROR_BOTS_NAME_NOT_ACCEPT = 4; + + private final int errorCode; + + public BotErrorComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BotErrorComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertComposer.java new file mode 100644 index 00000000..2fe62e1e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertComposer.java @@ -0,0 +1,47 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +public class BubbleAlertComposer extends MessageComposer +{ + private final String errorKey; + private final THashMap keys; + + public BubbleAlertComposer(String errorKey, THashMap keys) + { + this.errorKey = errorKey; + this.keys = keys; + } + + public BubbleAlertComposer(String errorKey, String message) + { + this.errorKey = errorKey; + this.keys = new THashMap(); + this.keys.put("message", message); + } + + public BubbleAlertComposer(String errorKey) + { + this.errorKey = errorKey; + this.keys = new THashMap(); + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BubbleAlertComposer); + this.response.appendString(this.errorKey); + this.response.appendInt(this.keys.size()); + for(Map.Entry set : this.keys.entrySet()) + { + this.response.appendString(set.getKey()); + this.response.appendString(set.getValue()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertKeys.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertKeys.java new file mode 100644 index 00000000..dd2e17cf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/BubbleAlertKeys.java @@ -0,0 +1,42 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +public enum BubbleAlertKeys +{ + ADMIN_PERSISTENT("admin.persistent"), + ADMIN_TRANSIENT("admin.transient"), + BUILDERS_CLUB_MEMBERSHIP_EXPIRED("builders_club.membership_expired"), + BUILDERS_CLUB_MEMBERSHIP_EXPIRES("builders_club.membership_expires"), + BUILDERS_CLUB_MEMBERSHIP_EXTENDED("builders_club.membership_extended"), + BUILDERS_CLUB_MEMBERSHIP_MADE("builders_club.membership_made"), + BUILDERS_CLUB_MEMBERSHIP_RENEWED("builders_club.membership_renewed"), + BUILDERS_CLUB_ROOM_LOCKED("builders_club.room_locked"), + BUILDERS_CLUB_ROOM_UNLOCKED("builders_club.room_unlocked"), + BUILDERS_CLUB_VISIT_DENIED_OWNER("builders_club.visit_denied_for_owner"), + BUILDERS_CLUB_VISIT_DENIED_GUEST("builders_club.visit_denied_for_visitor"), + CASINO_TOO_MANY_DICE_PLACEMENT("casino.too_many_dice.placement"), + CASINO_TOO_MANY_DICE("casino.too_many_dice"), + FLOORPLAN_EDITOR_ERROR("floorplan_editor.error"), + FORUMS_DELIVERED("forums.delivered"), + FORUMS_FORUM_SETTINGS_UPDATED("forums.forum_settings_updated"), + FORUMS_MESSAGE_HIDDEN("forums.message.hidden"), + FORUMS_MESSAGE_RESTORED("forums.message.restored"), + FORUMS_THREAD_HIDDEN("forums.thread.hidden"), + FORUMS_THREAD_LOCKED("forums.thread.locked"), + FORUMS_THREAD_PINNED("forums.thread.pinned"), + FORUMS_THREAD_RESTORED("forums.thread.restored"), + FORUMS_THREAD_UNLOCKED("forums.thread.unlocked"), + FORUMS_THREAD_UNPINNED("forums.thread.unpinned"), + FURNI_PLACE_EMENT_ERROR("furni_placement_error"), + GIFTING_VALENTINE("gifting.valentine"), + NUX_POPUP("nux.popup"), + PURCHASING_ROOM("purchasing.room"), + RECEIVED_GIFT("received.gift"), + RECEIVED_BADGE("received.badge"); + + public final String key; + + BubbleAlertKeys(String key) + { + this.key = key; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/CustomNotificationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/CustomNotificationComposer.java new file mode 100644 index 00000000..c5f6fb79 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/CustomNotificationComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CustomNotificationComposer extends MessageComposer +{ + public static final int HOPPER_NO_COSTUME = 1; + public static final int HOPPER_NO_HC = 2; + public static final int GATE_NO_HC = 3; + public static final int STARS_NOT_CANDIDATE = 4; + public static final int STARS_NOT_ENOUGH_USERS = 5; + + private int type; + + public CustomNotificationComposer(int type) + { + this.type = type; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CustomNotificationComposer); + this.response.appendInt(this.type); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericAlertComposer.java new file mode 100644 index 00000000..ea7b8803 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericAlertComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GenericAlertComposer extends MessageComposer +{ + private final String message; + + public GenericAlertComposer(String message) + { + this.message = message; + } + + public GenericAlertComposer(String message, Habbo habbo) + { + this.message = message.replace("%username%", habbo.getHabboInfo().getUsername()); + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GenericAlertComposer); + + this.response.appendString(this.message); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericErrorMessagesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericErrorMessagesComposer.java new file mode 100644 index 00000000..ea94bff1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/GenericErrorMessagesComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GenericErrorMessagesComposer extends MessageComposer +{ + public static final int AUTHENTICATION_FAILED = -3; + public static final int CONNECTING_TO_THE_SERVER_FAILED = -400; + public static final int KICKED_OUT_OF_THE_ROOM = 4008; + public static final int NEED_TO_BE_VIP = 4009; + public static final int ROOM_NAME_UNACCEPTABLE = 4010; + public static final int CANNOT_BAN_GROUP_MEMBER = 4011; + + private final int errorCode; + + public GenericErrorMessagesComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GenericErrorMessages); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelClosesAndWillOpenAtComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelClosesAndWillOpenAtComposer.java new file mode 100644 index 00000000..e780527f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelClosesAndWillOpenAtComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelClosesAndWillOpenAtComposer extends MessageComposer +{ + private int hour; + private int minute; + private boolean disconnected; + + public HotelClosesAndWillOpenAtComposer(int hour, int minute, boolean disconnected) + { + this.hour = hour; + this.minute = minute; + this.disconnected = disconnected; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelClosesAndWillOpenAtComposer); + this.response.appendInt(this.hour); + this.response.appendInt(this.minute); + this.response.appendBoolean(this.disconnected); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesAndBackInComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesAndBackInComposer.java new file mode 100644 index 00000000..6db67fd6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesAndBackInComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelWillCloseInMinutesAndBackInComposer extends MessageComposer +{ + private int closeInMinutes; + private int reopenInMinutes; + + public HotelWillCloseInMinutesAndBackInComposer(int closeInMinutes, int reopenInMinutes) + { + this.closeInMinutes = closeInMinutes; + this.reopenInMinutes = reopenInMinutes; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelWillCloseInMinutesAndBackInComposer); + this.response.appendBoolean(true); + this.response.appendInt(this.closeInMinutes); + this.response.appendInt(this.reopenInMinutes); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesComposer.java new file mode 100644 index 00000000..7975db7d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/HotelWillCloseInMinutesComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelWillCloseInMinutesComposer extends MessageComposer +{ + private int minutes; + + public HotelWillCloseInMinutesComposer(int minutes) + { + this.minutes = minutes; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelWillCloseInMinutesComposer); + this.response.appendInt(this.minutes); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/MessagesForYouComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/MessagesForYouComposer.java new file mode 100644 index 00000000..814fae1c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/MessagesForYouComposer.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; + +public class MessagesForYouComposer extends MessageComposer +{ + private String[] messages; + private ArrayList newMessages; + + public MessagesForYouComposer(String[] messages) + { + this.messages = messages; + this.newMessages = new ArrayList<>(); + } + + public MessagesForYouComposer(ArrayList newMessages) + { + this.newMessages = newMessages; + this.messages = new String[]{}; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MessagesForYouComposer); + this.response.appendInt(this.messages.length + this.newMessages.size()); + + for(String s : this.messages) + { + this.response.appendString(s); + } + + for (String s : this.newMessages) + { + this.response.appendString(s); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/PetErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/PetErrorComposer.java new file mode 100644 index 00000000..0caaef9d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/PetErrorComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetErrorComposer extends MessageComposer +{ + public static final int ROOM_ERROR_PETS_FORBIDDEN_IN_HOTEL = 0; + public static final int ROOM_ERROR_PETS_FORBIDDEN_IN_FLAT = 1; + public static final int ROOM_ERROR_MAX_PETS = 2; + public static final int ROOM_ERROR_PETS_SELECTED_TILE_NOT_FREE = 3; + public static final int ROOM_ERROR_PETS_NO_FREE_TILES = 4; + public static final int ROOM_ERROR_MAX_OWN_PETS = 5; + + private final int errorCode; + + public PetErrorComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetErrorComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertAndOpenHabboWayComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertAndOpenHabboWayComposer.java new file mode 100644 index 00000000..d1367871 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertAndOpenHabboWayComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class StaffAlertAndOpenHabboWayComposer extends MessageComposer +{ + private String message; + + public StaffAlertAndOpenHabboWayComposer(String message) + { + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.StaffAlertAndOpenHabboWayComposer); + this.response.appendString(this.message); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWIthLinkAndOpenHabboWayComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWIthLinkAndOpenHabboWayComposer.java new file mode 100644 index 00000000..dfda5c5d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWIthLinkAndOpenHabboWayComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class StaffAlertWIthLinkAndOpenHabboWayComposer extends MessageComposer +{ + private String message; + private String link; + + public StaffAlertWIthLinkAndOpenHabboWayComposer(String message, String link) + { + this.message = message; + this.link = link; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.StaffAlertWIthLinkAndOpenHabboWayComposer); + this.response.appendString(this.message); + this.response.appendString(this.link); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWithLinkComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWithLinkComposer.java new file mode 100644 index 00000000..a8a3e805 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/StaffAlertWithLinkComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class StaffAlertWithLinkComposer extends MessageComposer +{ + private String message; + private String link; + + public StaffAlertWithLinkComposer(String message, String link) + { + this.message = message; + this.link = link; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.StaffAlertWithLinkComposer); + this.response.appendString(this.message); + this.response.appendString(this.link); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/UpdateFailedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/UpdateFailedComposer.java new file mode 100644 index 00000000..96142123 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/UpdateFailedComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UpdateFailedComposer extends MessageComposer +{ + private final String message; + + public UpdateFailedComposer(String message) + { + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UpdateFailedComposer); + this.response.appendString(this.message); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/WiredRewardAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/WiredRewardAlertComposer.java new file mode 100644 index 00000000..334d9dfd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/alerts/WiredRewardAlertComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.generic.alerts; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WiredRewardAlertComposer extends MessageComposer +{ + public static final int LIMITED_NO_MORE_AVAILABLE = 0; + public static final int REWARD_ALREADY_RECEIVED = 1; + public static final int REWARD_ALREADY_RECEIVED_THIS_TODAY = 2; + public static final int REWARD_ALREADY_RECEIVED_THIS_HOUR = 3; + public static final int REWARD_ALREADY_RECEIVED_THIS_MINUTE = 8; + public static final int UNLUCKY_NO_REWARD = 4; + public static final int REWARD_ALL_COLLECTED = 5; + public static final int REWARD_RECEIVED_ITEM = 6; + public static final int REWARD_RECEIVED_BADGE = 7; + + private final int code; + + public WiredRewardAlertComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WiredRewardAlertComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/generic/testcomposer.java b/src/main/java/com/eu/habbo/messages/outgoing/generic/testcomposer.java new file mode 100644 index 00000000..b1ff3f84 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/generic/testcomposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.generic; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class testcomposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(3019); + this.response.appendInt(3); + + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendString("Key"); + + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendString("Key"); + + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendString("Key"); + this.response.appendBoolean(true); + this.response.appendInt(1); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianNewReportReceivedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianNewReportReceivedComposer.java new file mode 100644 index 00000000..950236e1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianNewReportReceivedComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.guardians; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuardianNewReportReceivedComposer extends MessageComposer +{ + private final GuardianTicket ticket; + + public GuardianNewReportReceivedComposer(GuardianTicket ticket) + { + this.ticket = ticket; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuardianNewReportReceivedComposer); + this.response.appendInt(Emulator.getConfig().getInt("guardians.accept.timer")); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingRequestedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingRequestedComposer.java new file mode 100644 index 00000000..d5214eef --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingRequestedComposer.java @@ -0,0 +1,55 @@ +package com.eu.habbo.messages.outgoing.guardians; + +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.TIntIntHashMap; + +import java.util.Calendar; + +public class GuardianVotingRequestedComposer extends MessageComposer +{ + private final GuardianTicket ticket; + + public GuardianVotingRequestedComposer(GuardianTicket ticket) + { + this.ticket = ticket; + } + + @Override + public ServerMessage compose() + { + TIntIntHashMap mappedUsers = new TIntIntHashMap(); + mappedUsers.put(this.ticket.getReported().getHabboInfo().getId(), 0); + + Calendar c = Calendar.getInstance(); + c.setTime(this.ticket.getDate()); + + String fullMessage = c.get(Calendar.YEAR) + " "; + fullMessage += c.get(Calendar.MONTH) + " "; + fullMessage += c.get(Calendar.DAY_OF_MONTH) + " "; + fullMessage += c.get(Calendar.MINUTE) + " "; + fullMessage += c.get(Calendar.SECOND) + ";"; + + fullMessage += "\r"; + + for(ModToolChatLog chatLog : this.ticket.getChatLogs()) + { + if(!mappedUsers.containsKey(chatLog.habboId)) + { + mappedUsers.put(chatLog.habboId, mappedUsers.size()); + } + + fullMessage += "unused;" + mappedUsers.get(chatLog.habboId) + ";" + chatLog.message + "\r"; + } + + this.response.init(Outgoing.GuardianVotingRequestedComposer); + this.response.appendInt(this.ticket.getTimeLeft()); + this.response.appendString(fullMessage); + + //2015 10 17 14 24 30 + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingResultComposer.java new file mode 100644 index 00000000..8de86e48 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingResultComposer.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.outgoing.guardians; + +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.guides.GuardianVote; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class GuardianVotingResultComposer extends MessageComposer +{ + private final GuardianTicket ticket; + private final GuardianVote vote; + + public GuardianVotingResultComposer(GuardianTicket ticket, GuardianVote vote) + { + this.ticket = ticket; + this.vote = vote; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuardianVotingResultComposer); + this.response.appendInt(this.ticket.getVerdict().getType()); //Final Verdict + this.response.appendInt(this.vote.type.getType()); //Your vote + + this.response.appendInt(this.ticket.getVotes().size() - 1); //Other votes count. + + for(Map.Entry set : this.ticket.getVotes().entrySet()) + { + if(set.getValue().equals(vote)) + continue; + + this.response.appendInt(set.getValue().type.getType()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingTimeEnded.java b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingTimeEnded.java new file mode 100644 index 00000000..e0944bc0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingTimeEnded.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.guardians; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuardianVotingTimeEnded extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuardianVotingTimeEnded); + //Empty Body + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingVotesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingVotesComposer.java new file mode 100644 index 00000000..3c0d78bf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guardians/GuardianVotingVotesComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.guardians; + +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.guides.GuardianVote; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; + +public class GuardianVotingVotesComposer extends MessageComposer +{ + private final GuardianTicket ticket; + private final Habbo guardian; + + public GuardianVotingVotesComposer(GuardianTicket ticket, Habbo guardian) + { + this.ticket = ticket; + this.guardian = guardian; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuardianVotingVotesComposer); + + ArrayList votes = this.ticket.getSortedVotes(this.guardian); + + this.response.appendInt(votes.size()); + + for(GuardianVote vote : votes) + { + this.response.appendInt(vote.type.getType()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/BullyReportClosedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/BullyReportClosedComposer.java new file mode 100644 index 00000000..6b680d49 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/BullyReportClosedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BullyReportClosedComposer extends MessageComposer +{ + public final static int CLOSED = 1; + public final static int MISUSE = 2; + + public final int code; + + public BullyReportClosedComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BullyReportClosedComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionAttachedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionAttachedComposer.java new file mode 100644 index 00000000..af36015e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionAttachedComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionAttachedComposer extends MessageComposer +{ + private final GuideTour tour; + private final boolean isHelper; + + public GuideSessionAttachedComposer(GuideTour tour, boolean isHelper) + { + this.tour = tour; + this.isHelper = isHelper; + } + + @Override + public ServerMessage compose() + { + //:test 3549 b:1 i:1 s:abcd i:100 + this.response.init(Outgoing.GuideSessionAttachedComposer); + this.response.appendBoolean(this.isHelper); //? //isHelper + this.response.appendInt(1); //? Tour type + this.response.appendString(tour.getHelpRequest()); //? Instruction (Help message) + this.response.appendInt(isHelper ? 60 : Emulator.getGameEnvironment().getGuideManager().getAverageWaitingTime()); //? Avarage Waiting Time (for noob) | Time left to pickup (For helper) + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionDetachedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionDetachedComposer.java new file mode 100644 index 00000000..6db271c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionDetachedComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionDetachedComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionDetachedComposer); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionEndedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionEndedComposer.java new file mode 100644 index 00000000..739553ac --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionEndedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionEndedComposer extends MessageComposer +{ + public static final int SOMETHING_WRONG = 0; + public static final int HELP_CASE_CLOSED = 1; + + private final int errorCode; + + public GuideSessionEndedComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionEndedComposer); + this.response.appendInt(this.errorCode); //? + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionErrorComposer.java new file mode 100644 index 00000000..21dd58c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionErrorComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionErrorComposer extends MessageComposer +{ + public static final int SOMETHING_WRONG_REQUEST = 0; + public static final int NO_HELPERS_AVAILABLE = 1; + public static final int NO_GUARDIANS_AVAILABLE = 2; + + private final int errorCode; + + public GuideSessionErrorComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionErrorComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionInvitedToGuideRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionInvitedToGuideRoomComposer.java new file mode 100644 index 00000000..82c7b761 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionInvitedToGuideRoomComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionInvitedToGuideRoomComposer extends MessageComposer +{ + private final Room room; + + public GuideSessionInvitedToGuideRoomComposer(Room room) + { + this.room = room; + } + + //Helper invites noob + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionInvitedToGuideRoomComposer); + this.response.appendInt(this.room != null ? this.room.getId() : 0); + this.response.appendString(this.room != null ? this.room.getName() : ""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionMessageComposer.java new file mode 100644 index 00000000..7c6bc903 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionMessageComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.habbohotel.guides.GuideChatMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionMessageComposer extends MessageComposer +{ + private final GuideChatMessage message; + + public GuideSessionMessageComposer(GuideChatMessage message) + { + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionMessageComposer); + this.response.appendString(this.message.message); //Message + this.response.appendInt(this.message.userId); //Sender ID + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsPlayingComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsPlayingComposer.java new file mode 100644 index 00000000..f730f5a1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsPlayingComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionPartnerIsPlayingComposer extends MessageComposer +{ + public final boolean isPlaying; + + public GuideSessionPartnerIsPlayingComposer(boolean isPlaying) + { + this.isPlaying = isPlaying; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionPartnerIsPlayingComposer); + this.response.appendBoolean(this.isPlaying); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsTypingComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsTypingComposer.java new file mode 100644 index 00000000..e8389bbb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionPartnerIsTypingComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionPartnerIsTypingComposer extends MessageComposer +{ + private final boolean typing; + + public GuideSessionPartnerIsTypingComposer(boolean typing) + { + this.typing = typing; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionPartnerIsTypingComposer); + this.response.appendBoolean(this.typing); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionRequesterRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionRequesterRoomComposer.java new file mode 100644 index 00000000..430bf181 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionRequesterRoomComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionRequesterRoomComposer extends MessageComposer +{ + private final Room room; + public GuideSessionRequesterRoomComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuideSessionRequesterRoomComposer); + this.response.appendInt(this.room != null ? this.room.getId() : 0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionStartedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionStartedComposer.java new file mode 100644 index 00000000..9516085f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideSessionStartedComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideSessionStartedComposer extends MessageComposer +{ + private final GuideTour tour; + + public GuideSessionStartedComposer(GuideTour tour) + { + this.tour = tour; + } + + @Override + public ServerMessage compose() + { + //:test 3048 i:1 s:Admin s:b i:2 s:Derp s:d + this.response.init(Outgoing.GuideSessionStartedComposer); + + //Help Requester + this.response.appendInt(this.tour.getNoob().getHabboInfo().getId()); //UserID 1? + this.response.appendString(this.tour.getNoob().getHabboInfo().getUsername()); //UserName 1? + this.response.appendString(this.tour.getNoob().getHabboInfo().getLook()); //Look 1? + + //Being helped by. + this.response.appendInt(this.tour.getHelper().getHabboInfo().getId()); //UserID 2? + this.response.appendString(this.tour.getHelper().getHabboInfo().getUsername()); //UserName 2? + this.response.appendString(this.tour.getHelper().getHabboInfo().getLook()); //Look 2? + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideToolsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideToolsComposer.java new file mode 100644 index 00000000..31f63af0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guides/GuideToolsComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.guides; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuideToolsComposer extends MessageComposer +{ + private final boolean onDuty; + + public GuideToolsComposer(boolean onDuty) + { + this.onDuty = onDuty; + } + + @Override + public ServerMessage compose() + { + //:test 117 b:1 i:1 i:1 i:1 + this.response.init(Outgoing.GuideToolsComposer); + this.response.appendBoolean(this.onDuty); //OnDuty + this.response.appendInt(0); //Guides On Duty + this.response.appendInt(Emulator.getGameEnvironment().getGuideManager().getGuidesCount()); //Helpers On Duty + this.response.appendInt(Emulator.getGameEnvironment().getGuideManager().getGuardiansCount()); //Guardians On Duty + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildAcceptMemberErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildAcceptMemberErrorComposer.java new file mode 100644 index 00000000..fd43293d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildAcceptMemberErrorComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildAcceptMemberErrorComposer extends MessageComposer +{ + public final static int NO_LONGER_MEMBER = 0; + public final static int ALREADY_REJECTED = 1; + public final static int ALREADY_ACCEPTED = 2; + + private final int guildId; + private final int errorCode; + + public GuildAcceptMemberErrorComposer(int guildId, int errorCode) + { + this.guildId = guildId; + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildAcceptMemberErrorComposer); + this.response.appendInt(this.guildId); + this.response.appendInt(this.errorCode); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBoughtComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBoughtComposer.java new file mode 100644 index 00000000..07d38735 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBoughtComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildBoughtComposer extends MessageComposer +{ + private final Guild guild; + + public GuildBoughtComposer(Guild guild) + { + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildBoughtComposer); + this.response.appendInt(this.guild.getRoomId()); + this.response.appendInt(this.guild.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBuyRoomsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBuyRoomsComposer.java new file mode 100644 index 00000000..8b7de7a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildBuyRoomsComposer.java @@ -0,0 +1,56 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class GuildBuyRoomsComposer extends MessageComposer +{ + private final THashSet rooms; + + public GuildBuyRoomsComposer(THashSet rooms) + { + this.rooms = rooms; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildBuyRoomsComposer); + this.response.appendInt(Emulator.getConfig().getInt("catalog.guild.price")); + this.response.appendInt(this.rooms.size()); + + for (Room room : this.rooms) + { + this.response.appendInt(room.getId()); + this.response.appendString(room.getName()); + this.response.appendBoolean(false); + } + + this.response.appendInt(5); + + this.response.appendInt(10); + this.response.appendInt(3); + this.response.appendInt(4); + + this.response.appendInt(25); + this.response.appendInt(17); + this.response.appendInt(5); + + this.response.appendInt(25); + this.response.appendInt(17); + this.response.appendInt(3); + + this.response.appendInt(29); + this.response.appendInt(11); + this.response.appendInt(4); + + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildConfirmRemoveMemberComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildConfirmRemoveMemberComposer.java new file mode 100644 index 00000000..4a124ffb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildConfirmRemoveMemberComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildConfirmRemoveMemberComposer extends MessageComposer +{ + private int userId; + private int furniCount; + + public GuildConfirmRemoveMemberComposer(int userId, int furniCount) + { + this.userId = userId; + this.furniCount = furniCount; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildConfirmRemoveMemberComposer); + this.response.appendInt(this.userId); + this.response.appendInt(this.furniCount); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildEditFailComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildEditFailComposer.java new file mode 100644 index 00000000..5e15647f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildEditFailComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildEditFailComposer extends MessageComposer +{ + public static final int ROOM_ALREADY_IN_USE = 0; + public static final int INVALID_GUILD_NAME = 1; + public static final int HC_REQUIRED = 2; + public static final int MAX_GUILDS_JOINED = 3; + + private int errorCode; + + public GuildEditFailComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildEditFailComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFavoriteRoomUserUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFavoriteRoomUserUpdateComposer.java new file mode 100644 index 00000000..8e1a2190 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFavoriteRoomUserUpdateComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildFavoriteRoomUserUpdateComposer extends MessageComposer +{ + private RoomUnit roomUnit; + private Guild guild; + + public GuildFavoriteRoomUserUpdateComposer(RoomUnit roomUnit, Guild guild) + { + this.roomUnit = roomUnit; + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildFavoriteRoomUserUpdateComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.guild.getId()); + this.response.appendInt(this.guild.getState().state); + this.response.appendString(this.guild.getName()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFurniWidgetComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFurniWidgetComposer.java new file mode 100644 index 00000000..c68838d1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildFurniWidgetComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildFurniWidgetComposer extends MessageComposer +{ + private final HabboItem item; + private final Guild guild; + private final Habbo habbo; + + public GuildFurniWidgetComposer(Habbo habbo, Guild guild, HabboItem item) + { + this.habbo = habbo; + this.item = item; + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildFurniWidgetComposer); + this.response.appendInt(item.getId()); + this.response.appendInt(this.guild.getId()); + this.response.appendString(this.guild.getName()); + this.response.appendInt(this.guild.getRoomId()); + this.response.appendBoolean(Emulator.getGameEnvironment().getGuildManager().getGuildMember(this.guild, this.habbo) != null); //User Joined. + this.response.appendBoolean(this.guild.hasForum()); //Has Forum. + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildInfoComposer.java new file mode 100644 index 00000000..7778de00 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildInfoComposer.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.guilds.GuildRank; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class GuildInfoComposer extends MessageComposer +{ + private final Guild guild; + private final GameClient client; + private final boolean newWindow; + private final GuildMember member; + + public GuildInfoComposer(Guild guild, GameClient client, boolean newWindow, GuildMember member) + { + this.guild = guild; + this.client = client; + this.newWindow = newWindow; + this.member = member; + } + + @Override + public ServerMessage compose() + { + boolean adminPermissions = this.client.getHabbo().getHabboStats().hasGuild(this.guild.getId()) && this.client.getHabbo().hasPermission("acc_guild_admin"); + this.response.init(Outgoing.GuildInfoComposer); + this.response.appendInt(this.guild.getId()); + this.response.appendBoolean(true); + this.response.appendInt(this.guild.getState().state); + this.response.appendString(this.guild.getName()); + this.response.appendString(this.guild.getDescription()); + this.response.appendString(this.guild.getBadge()); + this.response.appendInt(this.guild.getRoomId()); + this.response.appendString(this.guild.getRoomName()); + //this.response.appendInt(this.guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId() ? 3 : (this.member == null ? 0 : (this.member.getRank().equals(GuildRank.MEMBER) || this.member.getRank().equals(GuildRank.MOD) ? 1 : (this.member.getRank().equals(GuildRank.REQUESTED) ? 2 : 0)))); + this.response.appendInt(adminPermissions ? 4 : (this.member == null ? 0 : (this.member.getRank().equals(GuildRank.MEMBER) ? 1 : (this.member.getRank().equals(GuildRank.REQUESTED) ? 2 : (this.member.getRank().equals(GuildRank.MOD) ? 3 : (this.member.getRank().equals(GuildRank.ADMIN) ? 4 : 0)))))); + this.response.appendInt(this.guild.getMemberCount()); //Member count. + this.response.appendBoolean(this.client.getHabbo().getHabboStats().guild == this.guild.getId()); //favorite group + this.response.appendString(new SimpleDateFormat("dd-MM-yyyy").format(new Date(this.guild.getDateCreated() * 1000L))); + this.response.appendBoolean(adminPermissions || (this.guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId())); + this.response.appendBoolean(adminPermissions || (this.member != null && (this.member.getRank().equals(GuildRank.ADMIN)))); //Is admin. //this.member.getRank().equals(GuildRank.MOD) || + //Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.guild.getOwnerId()); + + this.response.appendString(this.guild.getOwnerName()); + this.response.appendBoolean(this.newWindow); + this.response.appendBoolean(this.guild.getRights() == 0); //User can place furni. + this.response.appendInt((adminPermissions || this.guild.getOwnerId() == this.client.getHabbo().getHabboInfo().getId()) ? this.guild.getRequestCount() : 0); //Guild invites count. + this.response.appendBoolean(true); //Unknown + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildJoinErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildJoinErrorComposer.java new file mode 100644 index 00000000..09a3a381 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildJoinErrorComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildJoinErrorComposer extends MessageComposer +{ + public static final int GROUP_FULL = 0; + public static final int GROUP_LIMIT_EXCEED = 1; + public static final int GROUP_CLOSED = 2; + public static final int GROUP_NOT_ACCEPT_REQUESTS = 3; + public static final int NON_HC_LIMIT_REACHED = 4; + public static final int MEMBER_FAIL_JOIN_LIMIT_EXCEED_NON_HC = 5; + public static final int MEMBER_FAIL_JOIN_LIMIT_EXCEED_HC = 6; + + private final int code; + + public GuildJoinErrorComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildJoinErrorComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildListComposer.java new file mode 100644 index 00000000..494e691b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildListComposer.java @@ -0,0 +1,40 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class GuildListComposer extends MessageComposer +{ + private final THashSet guilds; + private final Habbo habbo; + + public GuildListComposer(THashSet guilds, Habbo habbo) + { + this.guilds = guilds; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildListComposer); + this.response.appendInt(this.guilds.size()); + for(Guild guild : this.guilds) + { + this.response.appendInt(guild.getId()); + this.response.appendString(guild.getName()); + this.response.appendString(guild.getBadge()); + this.response.appendString(Emulator.getGameEnvironment().getGuildManager().getSymbolColor(guild.getColorOne()).valueA); + this.response.appendString(Emulator.getGameEnvironment().getGuildManager().getBackgroundColor(guild.getColorTwo()).valueA); + this.response.appendBoolean(this.habbo.getHabboStats().guild == guild.getId()); + this.response.appendInt(guild.getOwnerId()); + this.response.appendBoolean(guild.hasForum()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildManageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildManageComposer.java new file mode 100644 index 00000000..af0f5c20 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildManageComposer.java @@ -0,0 +1,67 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildManageComposer extends MessageComposer +{ + private final Guild guild; + + public GuildManageComposer(Guild guild) + { + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildManageComposer); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendString("Room Name"); + this.response.appendBoolean(false); + this.response.appendBoolean(true); + this.response.appendInt(this.guild.getId()); + this.response.appendString(this.guild.getName()); + this.response.appendString(this.guild.getDescription()); + this.response.appendInt(this.guild.getRoomId()); + this.response.appendInt(this.guild.getColorOne()); + this.response.appendInt(this.guild.getColorTwo()); + this.response.appendInt(this.guild.getState().state); + this.response.appendInt(this.guild.getRights()); + this.response.appendBoolean(false); + this.response.appendString(""); + this.response.appendInt(5); + String badge = this.guild.getBadge(); + badge = badge.replace("b", ""); + String[] data = badge.split("s"); + int req = 5 - data.length; + int i = 0; + + for(String s : data) + { + this.response.appendInt((s.length() >= 6 ? Integer.parseInt(s.substring(0, 3)) : Integer.parseInt(s.substring(0, 2)))); + this.response.appendInt((s.length() >= 6 ? Integer.parseInt(s.substring(3, 5)) : Integer.parseInt(s.substring(2, 4)))); + + if(s.length() < 5) + this.response.appendInt(0); + else if(s.length() >= 6) + this.response.appendInt(Integer.parseInt(s.substring(5, 6))); + else + this.response.appendInt(Integer.parseInt(s.substring(4, 5))); + } + + while(i != req) + { + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + i++; + } + this.response.appendString(this.guild.getBadge()); + this.response.appendInt(this.guild.getMemberCount()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMemberUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMemberUpdateComposer.java new file mode 100644 index 00000000..1ba65071 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMemberUpdateComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildMemberUpdateComposer extends MessageComposer +{ + private final Guild guild; + private final GuildMember guildMember; + + public GuildMemberUpdateComposer(Guild guild, GuildMember guildMember) + { + this.guildMember = guildMember; + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildMemberUpdateComposer); + this.response.appendInt(this.guild.getId()); + this.response.appendInt(this.guildMember.getRank().type); + this.response.appendInt(this.guildMember.getUserId()); + this.response.appendString(this.guildMember.getUsername()); + this.response.appendString(this.guildMember.getLook()); + this.response.appendString(this.guildMember.getRank().type != 0 ? this.guildMember.getJoinDate() + "" : ""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMembersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMembersComposer.java new file mode 100644 index 00000000..63b8f061 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildMembersComposer.java @@ -0,0 +1,64 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildMember; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.TimeZone; + +public class GuildMembersComposer extends MessageComposer +{ + private final ArrayList members; + private final Guild guild; + private final Habbo session; + private final int pageId; + private final int level; + private final String searchValue; + private final boolean isAdmin; + + public GuildMembersComposer(Guild guild, ArrayList members, Habbo session, int pageId, int level, String searchValue, boolean isAdmin) + { + this.guild = guild; + this.members = members; + this.session = session; + this.pageId = pageId; + this.level = level; + this.searchValue = searchValue; + this.isAdmin = isAdmin; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildMembersComposer); + this.response.appendInt(this.guild.getId()); + this.response.appendString(this.guild.getName()); + this.response.appendInt(this.guild.getRoomId()); + this.response.appendString(this.guild.getBadge()); + this.response.appendInt(this.guild.getMemberCount()); + this.response.appendInt(this.members.size()); + + Calendar cal = Calendar.getInstance(TimeZone.getDefault()); + for(GuildMember member : this.members) + { + cal.setTimeInMillis(member.getJoinDate() * 1000L); + this.response.appendInt(member.getRank().type); + this.response.appendInt(member.getUserId()); + this.response.appendString(member.getUsername()); + this.response.appendString(member.getLook()); + this.response.appendString(member.getRank().type < 3 && member.getRank().type > 0 ? cal.get(Calendar.DAY_OF_MONTH) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR) : ""); + } + + this.response.appendBoolean(this.isAdmin); //Is owner + this.response.appendInt(14); + this.response.appendInt(this.pageId); + this.response.appendInt(this.level); + this.response.appendString(this.searchValue); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildPartsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildPartsComposer.java new file mode 100644 index 00000000..8b6adec0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildPartsComposer.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.GuildPart; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildPartsComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GroupPartsComposer); + this.response.appendInt(Emulator.getGameEnvironment().getGuildManager().getBases().size()); + for(GuildPart part : Emulator.getGameEnvironment().getGuildManager().getBases()) + { + this.response.appendInt(part.id); + this.response.appendString(part.valueA); + this.response.appendString(part.valueB); + } + + this.response.appendInt(Emulator.getGameEnvironment().getGuildManager().getSymbols().size()); + for(GuildPart part : Emulator.getGameEnvironment().getGuildManager().getSymbols()) + { + this.response.appendInt(part.id); + this.response.appendString(part.valueA); + this.response.appendString(part.valueB); + } + + this.response.appendInt(Emulator.getGameEnvironment().getGuildManager().getBaseColors().size()); + for(GuildPart part : Emulator.getGameEnvironment().getGuildManager().getBaseColors()) + { + this.response.appendInt(part.id); + this.response.appendString(part.valueA); + } + + this.response.appendInt(Emulator.getGameEnvironment().getGuildManager().getSymbolColors().size()); + for(GuildPart part : Emulator.getGameEnvironment().getGuildManager().getSymbolColors()) + { + this.response.appendInt(part.id); + this.response.appendString(part.valueA); + } + + this.response.appendInt(Emulator.getGameEnvironment().getGuildManager().getBackgroundColors().size()); + for(GuildPart part : Emulator.getGameEnvironment().getGuildManager().getBackgroundColors()) + { + this.response.appendInt(part.id); + this.response.appendString(part.valueA); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildRefreshMembersListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildRefreshMembersListComposer.java new file mode 100644 index 00000000..c5fc3e90 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/GuildRefreshMembersListComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildRefreshMembersListComposer extends MessageComposer +{ + private final Guild guild; + + public GuildRefreshMembersListComposer(Guild guild) + { + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildRefreshMembersListComposer); + this.response.appendInt(this.guild.getId()); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/RemoveGuildFromRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/RemoveGuildFromRoomComposer.java new file mode 100644 index 00000000..9f65c6d0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/RemoveGuildFromRoomComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.guilds; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemoveGuildFromRoomComposer extends MessageComposer +{ + private int guildId; + + public RemoveGuildFromRoomComposer(int guildId) + { + this.guildId = guildId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemoveGuildFromRoomComposer); + this.response.appendInt(this.guildId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumAddCommentComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumAddCommentComposer.java new file mode 100644 index 00000000..936c2d76 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumAddCommentComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForumComment; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildForumAddCommentComposer extends MessageComposer +{ + private final GuildForumComment comment; + + public GuildForumAddCommentComposer(GuildForumComment comment) + { + this.comment = comment; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildForumAddCommentComposer); + this.response.appendInt(this.comment.getGuildId()); //guild_id + this.response.appendInt(this.comment.getThreadId()); //thread_id + this.comment.serialize(this.response); //Comment + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumCommentsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumCommentsComposer.java new file mode 100644 index 00000000..0779fb66 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumCommentsComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForumComment; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class GuildForumCommentsComposer extends MessageComposer +{ + private final int guildId; + private final int threadId; + private final int index; + private final List guildForumCommentList; + + public GuildForumCommentsComposer(int guildId, int threadId, int index, List guildForumCommentList) + { + this.guildId = guildId; + this.threadId = threadId; + this.index = index; + this.guildForumCommentList = guildForumCommentList; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildForumCommentsComposer); + this.response.appendInt(this.guildId); //guild_id + this.response.appendInt(this.threadId); //thread_id + this.response.appendInt(this.index); //start_index + this.response.appendInt(this.guildForumCommentList.size()); + for (final GuildForumComment comment : this.guildForumCommentList) + { + comment.serialize(this.response); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumDataComposer.java new file mode 100644 index 00000000..682c11fa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumDataComposer.java @@ -0,0 +1,48 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildForumDataComposer extends MessageComposer +{ + public final GuildForum forum; + public Habbo habbo; + + public GuildForumDataComposer(GuildForum forum, Habbo habbo) + { + this.forum = forum; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + //Possibly related to settings. + this.response.init(Outgoing.GuildForumDataComposer); + //_SafeStr_3845._SafeStr_19178(k) + { + + this.forum.serializeUserForum(this.response, this.habbo); + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(this.forum.getGuild()); + + this.response.appendInt(guild.canReadForum().state); + this.response.appendInt(guild.canPostMessages().state); + this.response.appendInt(guild.canPostThreads().state); + this.response.appendInt(guild.canModForum().state); + this.response.appendString(""); //_local_2._SafeStr_19197 = k.readString(); + this.response.appendString(""); //_local_2._SafeStr_19198 = k.readString(); = member + this.response.appendString(guild.getOwnerId()== this.habbo.getClient().getHabbo().getHabboInfo().getId() ? "" : "not_owner"); //_local_2._SafeStr_19199 = k.readString(); = owner + this.response.appendString(guild.getOwnerId()== this.habbo.getClient().getHabbo().getHabboInfo().getId() ? "" : "not_admin"); //_local_2._SafeStr_19200 = k.readString(); = admin + this.response.appendString(""); //_local_2._SafeStr_19201 = k.readString(); = citizen + this.response.appendBoolean(guild.getOwnerId() == this.habbo.getClient().getHabbo().getHabboInfo().getId()); //;_local_2._SafeStr_19202 = k.readBoolean(); = acces forum settings + this.response.appendBoolean(false); //_local_2._SafeStr_19203 = k.readBoolean(); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java new file mode 100644 index 00000000..56f7f539 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumListComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class GuildForumListComposer extends MessageComposer +{ + private final List forums; + private final Habbo habbo; + private final int viewMode; + + public GuildForumListComposer(List forums, Habbo habbo, int viewMode) + { + this.forums = forums; + this.habbo = habbo; + this.viewMode = viewMode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildForumListComposer); + this.response.appendInt(this.viewMode); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(this.forums.size()); //Count... + for (final GuildForum forum : this.forums) + { + forum.serializeUserForum(this.response, this.habbo); + } + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadMessagesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadMessagesComposer.java new file mode 100644 index 00000000..92af62de --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadMessagesComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildForumThreadMessagesComposer extends MessageComposer +{ + public final GuildForumThread thread; + + public GuildForumThreadMessagesComposer(GuildForumThread thread) + { + this.thread = thread; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildForumThreadMessagesComposer); + this.response.appendInt(this.thread.getGuildId()); + this.thread.serialize(this.response); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadsComposer.java new file mode 100644 index 00000000..112395be --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumThreadsComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForum; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildForumThreadsComposer extends MessageComposer +{ + public final GuildForum forum; + public final int index; + + public GuildForumThreadsComposer(GuildForum forum, int index) + { + this.forum = forum; + this.index = index; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildForumThreadsComposer); + this.response.appendInt(this.forum.getGuild()); + this.response.appendInt(this.index); + this.forum.serializeThreads(this.response); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumsUnreadMessagesCountComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumsUnreadMessagesCountComposer.java new file mode 100644 index 00000000..3aab71b0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/GuildForumsUnreadMessagesCountComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class GuildForumsUnreadMessagesCountComposer extends MessageComposer +{ + public final int count; + + public GuildForumsUnreadMessagesCountComposer(int count) + { + this.count = count; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.GuildForumsUnreadMessagesCountComposer); + this.response.appendInt(this.count); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer6.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer6.java new file mode 100644 index 00000000..57e687ca --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer6.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForumComment; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownGuildForumComposer6 extends MessageComposer +{ + public final int guildId; + public final int threadId; + public final GuildForumComment comment; + + public UnknownGuildForumComposer6(int guildId, int threadId, GuildForumComment comment) + { + this.guildId = guildId; + this.threadId = threadId; + this.comment = comment; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownGuildForumComposer6); + this.response.appendInt(this.guildId); //guild_id + this.response.appendInt(this.threadId); //thread_id + this.comment.serialize(this.response); //Comment + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer7.java b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer7.java new file mode 100644 index 00000000..55631f93 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/guilds/forums/UnknownGuildForumComposer7.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.guilds.forums; + +import com.eu.habbo.habbohotel.guilds.forums.GuildForumThread; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownGuildForumComposer7 extends MessageComposer +{ + public final GuildForumThread thread; + + public UnknownGuildForumComposer7(GuildForumThread thread) + { + this.thread = thread; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownGuildForumComposer7); + this.response.appendInt(this.thread.getGuildId()); + this.thread.serialize(this.response); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer1.java b/src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer1.java new file mode 100644 index 00000000..ff5e18cd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer1.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.habboway; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HabboWayQuizComposer1 extends MessageComposer +{ + public final String name; + public final int[] items; + + public HabboWayQuizComposer1(String name, int[] items) + { + this.name = name; + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HabboWayQuizComposer1); + this.response.appendString(this.name); + this.response.appendInt(this.items.length); + for (int i = 0; i < this.items.length; i++) + { + this.response.appendInt(this.items[i]); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer2.java b/src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer2.java new file mode 100644 index 00000000..e0394ad8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/habboway/HabboWayQuizComposer2.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.habboway; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HabboWayQuizComposer2 extends MessageComposer +{ + public final String name; + public final int[] items; + + public HabboWayQuizComposer2(String name, int[] items) + { + this.name = name; + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HabboWayQuizComposer2); + this.response.appendString(this.name); + this.response.appendInt(this.items.length); + for (int i = 0; i < this.items.length; i++) + { + this.response.appendInt(this.items[i]); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/BannerTokenComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/BannerTokenComposer.java new file mode 100644 index 00000000..cf4d04d3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/BannerTokenComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BannerTokenComposer extends MessageComposer +{ + + private final String token; + private final boolean unknown; + + public BannerTokenComposer(String token, boolean unknown) + { + this.token = token; + this.unknown = unknown; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BannerTokenComposer); + this.response.appendString(this.token); + this.response.appendBoolean(this.unknown); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/DebugConsoleComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/DebugConsoleComposer.java new file mode 100644 index 00000000..2dd6ea05 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/DebugConsoleComposer.java @@ -0,0 +1,21 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class DebugConsoleComposer extends MessageComposer +{ + + private static final boolean debugging = true; + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.DebugConsoleComposer); + + this.response.appendBoolean(true); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/ForumsTestComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/ForumsTestComposer.java new file mode 100644 index 00000000..0d16cfab --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/ForumsTestComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class ForumsTestComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2379); + this.response.appendInt(0); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/MachineIDComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/MachineIDComposer.java new file mode 100644 index 00000000..3a5fa8d1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/MachineIDComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MachineIDComposer extends MessageComposer +{ + private final GameClient client; + + public MachineIDComposer(GameClient client) + { + this.client = client; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MachineIDComposer); + this.response.appendString(this.client.getMachineId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/PongComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/PongComposer.java new file mode 100644 index 00000000..dbed0fc0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/PongComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PongComposer extends MessageComposer +{ + private int id; + + public PongComposer(int id) + { + this.id = id; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PongComposer); + this.response.appendInt(this.id); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/SecureLoginOKComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/SecureLoginOKComposer.java new file mode 100644 index 00000000..48774dc6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/SecureLoginOKComposer.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class SecureLoginOKComposer extends MessageComposer +{ + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SecureLoginOKComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/SessionRightsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/SessionRightsComposer.java new file mode 100644 index 00000000..c266c7df --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/SessionRightsComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class SessionRightsComposer extends MessageComposer +{ + + private static final boolean unknownBooleanOne = true; //true + private static final boolean unknownBooleanTwo = false; + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SessionRightsComposer); + + this.response.appendBoolean(unknownBooleanOne); + this.response.appendBoolean(true); + this.response.appendBoolean(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/SomeConnectionComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/SomeConnectionComposer.java new file mode 100644 index 00000000..80c7bf39 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/SomeConnectionComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.handshake; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class SomeConnectionComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SomeConnectionComposer); + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/BonusRareComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/BonusRareComposer.java new file mode 100644 index 00000000..606e8767 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/BonusRareComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BonusRareComposer extends MessageComposer +{ + private final Habbo habbo; + + public BonusRareComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BonusRareComposer); + this.response.appendString(Emulator.getConfig().getValue("hotelview.promotional.reward.name", "prizetrophy_breed_gold")); //Furniture Name. Note: Image is in external_variables.txt + this.response.appendInt(Emulator.getConfig().getInt("hotelview.promotional.reward.id", 0)); //Furniture ID + this.response.appendInt(Emulator.getConfig().getInt("hotelview.promotional.points", 120)); //Total Required + //this.response.appendInt(this.habbo.getHabboInfo().getBonusRarePoints() >= Emulator.getConfig().getInt("hotelview.promotinal.points", 120) ? Emulator.getConfig().getInt("hotelview.promotinal.points", 120) : this.habbo.getHabboInfo().getBonusRarePoints() ); //Total To Gain + int points = Emulator.getConfig().getInt("hotelview.promotional.points", 120) - this.habbo.getHabboInfo().getBonusRarePoints(); + this.response.appendInt(points < 0 ? 0 : points); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HallOfFameComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HallOfFameComposer.java new file mode 100644 index 00000000..98f1ef4b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HallOfFameComposer.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.hotelview.HallOfFame; +import com.eu.habbo.habbohotel.hotelview.HallOfFameWinner; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class HallOfFameComposer extends MessageComposer +{ + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HallOfFameComposer); + HallOfFame hallOfFame = Emulator.getGameEnvironment().getHotelViewManager().getHallOfFame(); + + this.response.appendString(hallOfFame.getCompetitionName()); + this.response.appendInt(hallOfFame.getWinners().size()); + + int count = 1; + + List winners = new ArrayList(hallOfFame.getWinners().values()); + Collections.sort(winners); + for(HallOfFameWinner winner : winners) + { + this.response.appendInt(winner.getId()); + this.response.appendString(winner.getUsername()); + this.response.appendString(winner.getLook()); + this.response.appendInt(count); + this.response.appendInt(winner.getPoints()); + count++; + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewBadgeButtonConfigComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewBadgeButtonConfigComposer.java new file mode 100644 index 00000000..efd03ed6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewBadgeButtonConfigComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewBadgeButtonConfigComposer extends MessageComposer +{ + private final String badge; + private final boolean enabled; + + public HotelViewBadgeButtonConfigComposer(String badge, boolean enabled) + { + this.badge = badge; + this.enabled = enabled; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewBadgeButtonConfigComposer); + this.response.appendString(this.badge); + this.response.appendBoolean(this.enabled); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCatalogPageExpiringComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCatalogPageExpiringComposer.java new file mode 100644 index 00000000..b1d3f5b8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCatalogPageExpiringComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewCatalogPageExpiringComposer extends MessageComposer +{ + private final String name; + private final int time; + private final String image; + + public HotelViewCatalogPageExpiringComposer(String name, int time, String image) + { + this.name = name; + this.time = time; + this.image = image; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewCatalogPageExpiringComposer); + this.response.appendString(this.name); + this.response.appendInt(this.time); + this.response.appendString(this.image); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCommunityGoalComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCommunityGoalComposer.java new file mode 100644 index 00000000..c66494f6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCommunityGoalComposer.java @@ -0,0 +1,64 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewCommunityGoalComposer extends MessageComposer +{ + private final boolean achieved; + private final int personalContributionScore; + private final int personalRank; + private final int totalAmount; + private final int communityHighestAchievedLevel; + private final int scoreRemainingUntilNextLevel; + private final int percentCompletionTowardsNextLevel; + private final String competitionName; + private final int timeLeft; + private final int[] rankData; + + public HotelViewCommunityGoalComposer(boolean achieved, + int personalContributionScore, + int personalRank, + int totalAmount, + int communityHighestAchievedLevel, + int scoreRemainingUntilNextLevel, + int percentCompletionTowardsNextLevel, + String competitionName, + int timeLeft, + int[] rankData) + { + this.achieved = achieved; + this.personalContributionScore = personalContributionScore; + this.personalRank = personalRank; + this.totalAmount = totalAmount; + this.communityHighestAchievedLevel = communityHighestAchievedLevel; + this.scoreRemainingUntilNextLevel = scoreRemainingUntilNextLevel; + this.percentCompletionTowardsNextLevel = percentCompletionTowardsNextLevel; + this.competitionName = competitionName; + this.timeLeft = timeLeft; + this.rankData = rankData; + } + + //:test 1579 b:1 i:0 i:1 i:2 i:3 i:4 i:5 s:a i:6 i:1 i:1 + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewCommunityGoalComposer); + this.response.appendBoolean(this.achieved); //Achieved? + this.response.appendInt(this.personalContributionScore); //User Amount + this.response.appendInt(this.personalRank); //User Rank + this.response.appendInt(this.personalRank); //Total Amount + this.response.appendInt(this.totalAmount); //Community Highest Achieved + this.response.appendInt(this.communityHighestAchievedLevel); //Community Score Untill Next Level + this.response.appendInt(this.scoreRemainingUntilNextLevel); //Percent Completed Till Next Level + this.response.appendString(this.competitionName); + this.response.appendInt(this.timeLeft); //Timer + this.response.appendInt(this.rankData.length); //Rank Count + for (int i : rankData) + { + this.response.appendInt(i); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewComposer.java new file mode 100644 index 00000000..f52e286a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewComposer); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewConcurrentUsersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewConcurrentUsersComposer.java new file mode 100644 index 00000000..952e0bb2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewConcurrentUsersComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewConcurrentUsersComposer extends MessageComposer +{ + public static final int ACTIVE = 0; + public static final int HIDDEN = 2; + public static final int ACHIEVED = 3; + + private final int state; + private final int userCount; + private final int goal; + + public HotelViewConcurrentUsersComposer(int state, int userCount, int goal) + { + this.state = state; + this.userCount = userCount; + this.goal = goal; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewConcurrentUsersComposer); + this.response.appendInt(this.state); + this.response.appendInt(this.userCount); + this.response.appendInt(this.goal); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCustomTimerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCustomTimerComposer.java new file mode 100644 index 00000000..08f4e237 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewCustomTimerComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewCustomTimerComposer extends MessageComposer +{ + private final String name; + private final int seconds; + + public HotelViewCustomTimerComposer(String name, int seconds) + { + this.name = name; + this.seconds = seconds; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewCustomTimerComposer); + this.response.appendString(this.name); //Send by the client. + this.response.appendInt(this.seconds); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewDataComposer.java new file mode 100644 index 00000000..6ba0f18c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewDataComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewDataComposer extends MessageComposer +{ + private final String data; + private final String key; + + public HotelViewDataComposer(String data, String key) + { + this.data = data; + this.key = key; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewDataComposer); + + this.response.appendString(this.data); + this.response.appendString(this.key); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewNextLTDAvailableComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewNextLTDAvailableComposer.java new file mode 100644 index 00000000..55d6a67f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/HotelViewNextLTDAvailableComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewNextLTDAvailableComposer extends MessageComposer +{ + private final int time; + private final int pageId; + private final int itemId; + private final String itemName; + + public HotelViewNextLTDAvailableComposer(int time, int pageId, int itemId, String itemName) + { + this.time = time; + this.pageId = pageId; + this.itemId = itemId; + this.itemName = itemName; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewNextLTDAvailableComposer); + this.response.appendInt(this.time); + this.response.appendInt(this.pageId); + this.response.appendInt(this.itemId); + this.response.appendString(this.itemName); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/hotelview/NewsListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/NewsListComposer.java new file mode 100644 index 00000000..bf9c0c7e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/hotelview/NewsListComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.hotelview; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.hotelview.NewsList; +import com.eu.habbo.habbohotel.hotelview.NewsWidget; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewsListComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewsWidgetsComposer); + NewsList newsList = Emulator.getGameEnvironment().getHotelViewManager().getNewsList(); + + this.response.appendInt(newsList.getNewsWidgets().size()); + + for(NewsWidget widget : newsList.getNewsWidgets()) + { + this.response.appendInt(widget.getId()); + this.response.appendString(widget.getTitle()); + this.response.appendString(widget.getMessage()); + this.response.appendString(widget.getButtonMessage()); + this.response.appendInt(widget.getType()); + this.response.appendString("event:" + widget.getLink()); + this.response.appendString(widget.getImage()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddBotComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddBotComposer.java new file mode 100644 index 00000000..bdda9f07 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddBotComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AddBotComposer extends MessageComposer +{ + private final Bot bot; + + public AddBotComposer(Bot bot) + { + this.bot = bot; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AddBotComposer); + this.response.appendInt(this.bot.getId()); + this.response.appendString(this.bot.getName()); + this.response.appendString(this.bot.getMotto()); + this.response.appendString(this.bot.getGender().toString().toLowerCase().charAt(0) + ""); + this.response.appendString(this.bot.getFigure()); + this.response.appendBoolean(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddHabboItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddHabboItemComposer.java new file mode 100644 index 00000000..8cdcb8aa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddHabboItemComposer.java @@ -0,0 +1,47 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class AddHabboItemComposer extends MessageComposer +{ + private THashSet itemsList; + private HabboItem item; + + public AddHabboItemComposer(THashSet itemsList) + { + this.itemsList = itemsList; + } + + public AddHabboItemComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AddHabboItemComposer); + + if(item == null) + { + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendInt(this.itemsList.size()); + for (HabboItem habboItem : this.itemsList) { + this.response.appendInt(habboItem.getId()); + } + } + else + { + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendInt(this.item.getId()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddPetComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddPetComposer.java new file mode 100644 index 00000000..b2792974 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/AddPetComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AddPetComposer extends MessageComposer +{ + private final AbstractPet pet; + + public AddPetComposer(AbstractPet pet) + { + this.pet = pet; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AddPetComposer); + pet.serialize(this.response); + this.response.appendBoolean(false); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListAddComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListAddComposer.java new file mode 100644 index 00000000..929a08f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListAddComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.users.inventory.EffectsComponent; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class EffectsListAddComposer extends MessageComposer +{ + public final EffectsComponent.HabboEffect effect; + + public EffectsListAddComposer(EffectsComponent.HabboEffect effect) + { + this.effect = effect; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.EffectsListAddComposer); + this.response.appendInt(this.effect.effect); //Type + this.response.appendInt(0); //Unknown Costume? + this.response.appendInt(this.effect.duration); //Duration + this.response.appendBoolean(this.effect.isActivated()); //Is active + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListEffectEnableComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListEffectEnableComposer.java new file mode 100644 index 00000000..0ce0a41a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListEffectEnableComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.users.inventory.EffectsComponent; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class EffectsListEffectEnableComposer extends MessageComposer +{ + public final EffectsComponent.HabboEffect effect; + + public EffectsListEffectEnableComposer(EffectsComponent.HabboEffect effect) + { + this.effect = effect; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.EffectsListEffectEnableComposer); + this.response.appendInt(this.effect.effect); //Type + this.response.appendInt(this.effect.duration); //Duration + this.response.appendBoolean(this.effect.enabled); //activated + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListRemoveComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListRemoveComposer.java new file mode 100644 index 00000000..0ea3a636 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/EffectsListRemoveComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.users.inventory.EffectsComponent; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class EffectsListRemoveComposer extends MessageComposer +{ + public final EffectsComponent.HabboEffect effect; + + public EffectsListRemoveComposer(EffectsComponent.HabboEffect effect) + { + this.effect = effect; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.EffectsListRemoveComposer); + this.response.appendInt(this.effect.effect); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryAchievementsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryAchievementsComposer.java new file mode 100644 index 00000000..19af4585 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryAchievementsComposer.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementLevel; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + +public class InventoryAchievementsComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.InventoryAchievementsComposer); + + synchronized (Emulator.getGameEnvironment().getAchievementManager().getAchievements()) + { + THashMap achievements = Emulator.getGameEnvironment().getAchievementManager().getAchievements(); + + this.response.appendInt(achievements.size()); + achievements.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(Achievement achievement) + { + response.appendString((achievement.name.startsWith("ACH_") ? achievement.name.replace("ACH_", "") : achievement.name)); + response.appendInt(achievement.levels.size()); + + for (AchievementLevel level : achievement.levels.values()) + { + response.appendInt(level.level); + response.appendInt(level.progress); + } + + return true; + } + }); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBadgesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBadgesComposer.java new file mode 100644 index 00000000..757c0c59 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBadgesComposer.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class InventoryBadgesComposer extends MessageComposer +{ + private final Habbo habbo; + + public InventoryBadgesComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + if(this.habbo == null) + return null; + + THashSet equippedBadges = new THashSet(); + + this.response.init(Outgoing.InventoryBadgesComposer); + + this.response.appendInt(this.habbo.getInventory().getBadgesComponent().getBadges().size()); + for(HabboBadge badge : this.habbo.getInventory().getBadgesComponent().getBadges()) + { + this.response.appendInt(badge.getId()); + this.response.appendString(badge.getCode()); + + if(badge.getSlot() > 0) + equippedBadges.add(badge); + } + + this.response.appendInt(equippedBadges.size()); + + for(HabboBadge badge : equippedBadges) + { + this.response.appendInt(badge.getSlot()); + this.response.appendString(badge.getCode()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBotsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBotsComposer.java new file mode 100644 index 00000000..0992044d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryBotsComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.THashMap; + +public class InventoryBotsComposer extends MessageComposer +{ + private final Habbo habbo; + + public InventoryBotsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.InventoryBotsComposer); + + THashMap userBots = this.habbo.getInventory().getBotsComponent().getBots(); + this.response.appendInt(userBots.size()); + for(Bot bot : userBots.values()) + { + this.response.appendInt(bot.getId()); + this.response.appendString(bot.getName()); + this.response.appendString(bot.getMotto()); + this.response.appendString(bot.getGender().toString().toLowerCase().charAt(0) + ""); + this.response.appendString(bot.getFigure()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java new file mode 100644 index 00000000..e58fa30b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java @@ -0,0 +1,94 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.items.interactions.InteractionGift; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.procedure.TIntObjectProcedure; + +public class InventoryItemsComposer extends MessageComposer implements TIntObjectProcedure +{ + private final int page; + private final int out; + private final TIntObjectMap items; + + public InventoryItemsComposer(int page, int out, TIntObjectMap items) + { + this.page = page; + this.out = out; + this.items = items; + } + + @Override + public ServerMessage compose() + { + try + { + this.response.init(Outgoing.InventoryItemsComposer); + this.response.appendInt(this.out); + this.response.appendInt(this.page - 1); + this.response.appendInt(this.items.size()); + + this.items.forEachEntry(this); + return this.response; + } + catch(Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return null; + } + + @Override + public boolean execute(int a, HabboItem habboItem) + { + this.response.appendInt(habboItem.getId()); + this.response.appendString(habboItem.getBaseItem().getType().code); + this.response.appendInt(habboItem.getId()); + this.response.appendInt(habboItem.getBaseItem().getSpriteId()); + + if(habboItem.getBaseItem().getName().equals("floor") || habboItem.getBaseItem().getName().equals("landscape") || habboItem.getBaseItem().getName().equals("wallpaper") || habboItem.getBaseItem().getName().equals("poster")) { + if (habboItem.getBaseItem().getName().equals("landscape")) + this.response.appendInt(4); + else if (habboItem.getBaseItem().getName().equals("floor")) + this.response.appendInt(3); + else if (habboItem.getBaseItem().getName().equals("wallpaper")) + this.response.appendInt(2); + else if (habboItem.getBaseItem().getName().equals("poster")) + this.response.appendInt(6); + + + this.response.appendInt(0); + this.response.appendString(habboItem.getExtradata()); + } + else + { + if(habboItem.getBaseItem().getName().equals("gnome_box")) + this.response.appendInt(13); + else + this.response.appendInt(habboItem instanceof InteractionGift ? ((((InteractionGift) habboItem).getColorId() * 1000) + ((InteractionGift) habboItem).getRibbonId()) : 1); + + habboItem.serializeExtradata(this.response); + } + this.response.appendBoolean(habboItem.getBaseItem().allowRecyle()); + this.response.appendBoolean(habboItem.getBaseItem().allowTrade()); + this.response.appendBoolean(!habboItem.isLimited() && habboItem.getBaseItem().allowInventoryStack() && !(habboItem instanceof InteractionGift)); + this.response.appendBoolean(habboItem.getBaseItem().allowMarketplace()); + this.response.appendInt(-1); + this.response.appendBoolean(true); + this.response.appendInt(-1); + + if (habboItem.getBaseItem().getType() == FurnitureType.FLOOR ) { + this.response.appendString(""); + this.response.appendInt(habboItem instanceof InteractionGift ? ((((InteractionGift) habboItem).getColorId() * 1000) + ((InteractionGift) habboItem).getRibbonId()) : 1); + } + + return true; + } + +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryPetsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryPetsComposer.java new file mode 100644 index 00000000..21eb1a1b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryPetsComposer.java @@ -0,0 +1,47 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.iterator.TIntObjectIterator; + +import java.util.NoSuchElementException; + +public class InventoryPetsComposer extends MessageComposer +{ + private final Habbo habbo; + + public InventoryPetsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.InventoryPetsComposer); + + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendInt(this.habbo.getInventory().getPetsComponent().getPetsCount()); + + TIntObjectIterator petIterator = this.habbo.getInventory().getPetsComponent().getPets().iterator(); + + for(int i = this.habbo.getInventory().getPetsComponent().getPets().size(); i-- > 0;) + { + try + { + petIterator.advance(); + } + catch (NoSuchElementException e) + { + break; + } + petIterator.value().serialize(this.response); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryRefreshComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryRefreshComposer.java new file mode 100644 index 00000000..d5c9b428 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryRefreshComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class InventoryRefreshComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.InventoryRefreshComposer); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java new file mode 100644 index 00000000..3b9e65db --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java @@ -0,0 +1,64 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class InventoryUpdateItemComposer extends MessageComposer +{ + private final HabboItem habboItem; + + public InventoryUpdateItemComposer(HabboItem item) + { + this.habboItem = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.InventoryItemUpdateComposer); + this.response.appendInt(2); + this.response.appendInt(this.habboItem.getId()); + this.response.appendString(this.habboItem.getBaseItem().getType().code); + this.response.appendInt(this.habboItem.getId()); + this.response.appendInt(this.habboItem.getBaseItem().getSpriteId()); + + if (this.habboItem.getBaseItem().getName().equals("landscape")) + this.response.appendInt(4); + else if (this.habboItem.getBaseItem().getName().equals("floor")) + this.response.appendInt(3); + else if (this.habboItem.getBaseItem().getName().equals("wallpaper")) + this.response.appendInt(2); + + if(this.habboItem.isLimited()) + { + this.response.appendInt(1); + this.response.appendInt(256); + this.response.appendString(this.habboItem.getExtradata()); + this.response.appendInt(this.habboItem.getLimitedSells()); + this.response.appendInt(this.habboItem.getLimitedStack()); + } + else + { + this.response.appendInt(1); + this.response.appendInt(0); + this.response.appendString(this.habboItem.getExtradata()); + } + this.response.appendBoolean(this.habboItem.getBaseItem().allowRecyle()); + this.response.appendBoolean(this.habboItem.getBaseItem().allowTrade()); + this.response.appendBoolean(!this.habboItem.isLimited() && this.habboItem.getBaseItem().allowInventoryStack()); + this.response.appendBoolean(this.habboItem.getBaseItem().allowMarketplace()); + this.response.appendInt(-1); + this.response.appendBoolean(false); + this.response.appendInt(-1); + + if (this.habboItem.getBaseItem().getType() != FurnitureType.WALL) { + this.response.appendString(""); //slotId + this.response.appendInt(0); + } + this.response.appendInt(100); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveBotComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveBotComposer.java new file mode 100644 index 00000000..f444e606 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveBotComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemoveBotComposer extends MessageComposer +{ + private final Bot bot; + + public RemoveBotComposer(Bot bot) + { + this.bot = bot; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemoveBotComposer); + this.response.appendInt(this.bot.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveHabboItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveHabboItemComposer.java new file mode 100644 index 00000000..3ccd2507 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemoveHabboItemComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemoveHabboItemComposer extends MessageComposer +{ + private int itemId; + + public RemoveHabboItemComposer(final int itemId) + { + this.itemId = itemId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemoveHabboItemComposer); + this.response.appendInt(this.itemId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemovePetComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemovePetComposer.java new file mode 100644 index 00000000..82ca8f07 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/RemovePetComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemovePetComposer extends MessageComposer +{ + private final int petId; + + public RemovePetComposer(int petId) + { + this.petId = petId; + } + + public RemovePetComposer(AbstractPet pet) + { + this.petId = pet.getId(); + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemovePetComposer); + this.response.appendInt(this.petId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/UserEffectsListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/UserEffectsListComposer.java new file mode 100644 index 00000000..8dbd970f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/UserEffectsListComposer.java @@ -0,0 +1,45 @@ +package com.eu.habbo.messages.outgoing.inventory; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.inventory.EffectsComponent; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TObjectProcedure; + +public class UserEffectsListComposer extends MessageComposer +{ + public final Habbo habbo; + + public UserEffectsListComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserEffectsListComposer); + + synchronized (this.habbo.getInventory().getEffectsComponent().effects) + { + this.response.appendInt(this.habbo.getInventory().getEffectsComponent().effects.size()); + this.habbo.getInventory().getEffectsComponent().effects.forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(EffectsComponent.HabboEffect effect) + { + response.appendInt(effect.effect); + response.appendInt(0); + response.appendInt(effect.duration); + response.appendInt(effect.total); + response.appendInt(effect.activationTimestamp >= 0 ? Emulator.getIntUnixTimestamp() - effect.activationTimestamp : -1); + response.appendBoolean(effect.isActivated()); + return true; + } + }); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportRequestComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportRequestComposer.java new file mode 100644 index 00000000..e6603af7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportRequestComposer.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BullyReportRequestComposer extends MessageComposer +{ + public static final int START_REPORT = 0; + public static final int ONGOING_HELPER_CASE = 1; + public static final int INVALID_REQUESTS = 2; + public static final int TOO_RECENT = 3; + + private final int errorCode; + private final int errorCodeType; + + + public BullyReportRequestComposer(int errorCode, int errorCodeType) + { + this.errorCode = errorCode; + this.errorCodeType = errorCodeType; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BullyReportRequestComposer); + this.response.appendInt(this.errorCode); + + if(this.errorCode == ONGOING_HELPER_CASE) + { + this.response.appendInt(this.errorCodeType); + this.response.appendInt(1); //Timestamp + this.response.appendBoolean(true); //Pending guide session. + + this.response.appendString("admin"); + this.response.appendString("ca-1807-64.lg-3365-78.hr-3370-42-31.hd-3093-1359.ch-3372-65"); + switch(this.errorCodeType) + { + case 3: + this.response.appendString("room Name"); break; + case 1: + this.response.appendString("description"); + } + } + //:test 1917 i:1 i:3 i:1 b:0 s:1 s:1 s:1 + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportedMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportedMessageComposer.java new file mode 100644 index 00000000..e0936f56 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/BullyReportedMessageComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BullyReportedMessageComposer extends MessageComposer +{ + public static final int RECEIVED = 0; + public static final int IGNORED = 1; + public static final int NO_CHAT = 2; + public static final int ALREADY_REPORTED = 3; + public static final int NO_MISSUSE = 4; + + private final int code; + + public BullyReportedMessageComposer(int code) + { + this.code = code; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BullyReportedMessageComposer); + this.response.appendInt(this.code); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/CfhTopicsMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/CfhTopicsMessageComposer.java new file mode 100644 index 00000000..aaffed20 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/CfhTopicsMessageComposer.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.CfhCategory; +import com.eu.habbo.habbohotel.modtool.CfhTopic; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TObjectProcedure; + +public class CfhTopicsMessageComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CfhTopicsMessageComposer); + + this.response.appendInt(Emulator.getGameEnvironment().getModToolManager().getCfhCategories().valueCollection().size()); + + Emulator.getGameEnvironment().getModToolManager().getCfhCategories().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CfhCategory category) + { + response.appendString(category.getName()); + response.appendInt(category.getTopics().valueCollection().size()); + category.getTopics().forEachValue(new TObjectProcedure() + { + @Override + public boolean execute(CfhTopic topic) + { + response.appendString(topic.name); + response.appendInt(topic.id); + response.appendString(topic.action.toString()); + return true; + } + }); + return true; + } + }); + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/HelperRequestDisabledComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/HelperRequestDisabledComposer.java new file mode 100644 index 00000000..679e73a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/HelperRequestDisabledComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HelperRequestDisabledComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HelperRequestDisabledComposer); + this.response.appendString(""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolComposer.java new file mode 100644 index 00000000..cf8a7de9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolComposer.java @@ -0,0 +1,104 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolCategory; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TObjectProcedure; + +public class ModToolComposer extends MessageComposer implements TObjectProcedure +{ + private final Habbo habbo; + + public ModToolComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolComposer); + + if(this.habbo.hasPermission("acc_modtool_ticket_q")) + { + this.response.appendInt(Emulator.getGameEnvironment().getModToolManager().getTickets().size()); //tickets + + for (ModToolIssue issue : Emulator.getGameEnvironment().getModToolManager().getTickets().values()) + { + issue.serialize(this.response); + } + } + else + { + this.response.appendInt(0); + } + + synchronized (Emulator.getGameEnvironment().getModToolManager().getPresets()) + { + this.response.appendInt(Emulator.getGameEnvironment().getModToolManager().getPresets().get("user").size()); + for (String s : Emulator.getGameEnvironment().getModToolManager().getPresets().get("user")) + { + this.response.appendString(s); + } + } + + this.response.appendInt(Emulator.getGameEnvironment().getModToolManager().getCategory().size()); + + Emulator.getGameEnvironment().getModToolManager().getCategory().forEachValue(this); + + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_ticket_q")); //ticketQueueueuhuehuehuehue + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_user_logs")); //user chatlogs + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_user_alert")); //can send caution + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_user_kick")); //can send kick + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_user_ban")); //can send ban + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_room_info")); //room info ??Not sure + this.response.appendBoolean(this.habbo.hasPermission("acc_modtool_room_logs")); //room chatlogs ??Not sure + + synchronized (Emulator.getGameEnvironment().getModToolManager().getPresets()) + { + this.response.appendInt(Emulator.getGameEnvironment().getModToolManager().getPresets().get("room").size()); + for (String s : Emulator.getGameEnvironment().getModToolManager().getPresets().get("room")) + { + this.response.appendString(s); + } + } + + return this.response; + } + + @Override + public boolean execute(ModToolCategory category) + { + this.response.appendString(category.getName()); +// this.response.appendBoolean(false); +// this.response.appendInt(category.getPresets().size()); +// +// TIntObjectIterator iterator = category.getPresets().iterator(); +// +// for(int i = category.getPresets().size(); i-- > 0;) +// { +// try +// { +// iterator.advance(); +// } +// catch (NoSuchElementException e) +// { +// break; +// } +// this.response.appendString(iterator.value().name); +// this.response.appendString(iterator.value().message); +// this.response.appendInt(iterator.value().banLength); +// this.response.appendInt(1); //avatarban +// this.response.appendInt(iterator.value().muteLength); +// this.response.appendInt(1); //tradelock +// this.response.appendString(iterator.value().reminder); +// this.response.appendBoolean(false); //ShowHabboWay +// } + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueChatlogComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueChatlogComposer.java new file mode 100644 index 00000000..f1641618 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueChatlogComposer.java @@ -0,0 +1,82 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.modtool.ModToolChatRecordDataContext; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; + +public class ModToolIssueChatlogComposer extends MessageComposer +{ + public static SimpleDateFormat format = new SimpleDateFormat("HH:mm"); + private ModToolIssue issue; + private ArrayList chatlog; + private String roomName; + + public ModToolIssueChatlogComposer(ModToolIssue issue, ArrayList chatlog, String roomName) + { + this.issue = issue; + this.chatlog = chatlog; + this.roomName = roomName; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolIssueChatlogComposer); + this.response.appendInt(this.issue.id); + this.response.appendInt(this.issue.senderId); + this.response.appendInt(this.issue.reportedId); + this.response.appendInt(this.issue.roomId); + + Collections.sort(chatlog); + + if(chatlog.isEmpty()) + return null; + + //ChatRecordData + //for(ModToolRoomVisit visit : chatlog) + //{ + this.response.appendByte(1); //Report Type + + if (this.issue.type == ModToolTicketType.IM) + { + this.response.appendShort(1); + + ModToolChatRecordDataContext.MESSAGE_ID.append(this.response); + this.response.appendInt(this.issue.senderId); + } + else + { + this.response.appendShort(3); //Context Count + + ModToolChatRecordDataContext.ROOM_NAME.append(this.response); + this.response.appendString(this.roomName); + + ModToolChatRecordDataContext.ROOM_ID.append(this.response); + this.response.appendInt(this.issue.roomId); + + ModToolChatRecordDataContext.GROUP_ID.append(this.response); + this.response.appendInt(12); + } + + this.response.appendShort(this.chatlog.size()); + for(ModToolChatLog chatLog : this.chatlog) + { + this.response.appendString(format.format(chatLog.timestamp * 1000l)); + this.response.appendInt(chatLog.habboId); + this.response.appendString(chatLog.username); + this.response.appendString(chatLog.message); + this.response.appendBoolean(false); + } + //} + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandledComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandledComposer.java new file mode 100644 index 00000000..6c71f966 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandledComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolIssueHandledComposer extends MessageComposer +{ + public static final int HANDLED = 0; + public static final int USELESS = 1; + public static final int ABUSIVE = 2; + + private int code = 0; + private String message = ""; + + public ModToolIssueHandledComposer(int code) + { + this.code = code; + } + + public ModToolIssueHandledComposer(String message) + { + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolIssueHandledComposer); + this.response.appendInt(this.code); + this.response.appendString(this.message); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandlerDimensionsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandlerDimensionsComposer.java new file mode 100644 index 00000000..e294cdfc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueHandlerDimensionsComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolIssueHandlerDimensionsComposer extends MessageComposer +{ + private final int x; + private final int y; + private final int width; + private final int height; + + public ModToolIssueHandlerDimensionsComposer(int x, int y, int width, int height) + { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolIssueHandlerDimensionsComposer); + this.response.appendInt(this.x); + this.response.appendInt(this.y); + this.response.appendInt(this.width); + this.response.appendInt(this.height); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueInfoComposer.java new file mode 100644 index 00000000..d10b0c31 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueInfoComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolIssueInfoComposer extends MessageComposer +{ + private final ModToolIssue issue; + public ModToolIssueInfoComposer(ModToolIssue issue) + { + this.issue = issue; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolIssueInfoComposer); + this.issue.serialize(this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueResponseAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueResponseAlertComposer.java new file mode 100644 index 00000000..f1a63ff3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueResponseAlertComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolIssueResponseAlertComposer extends MessageComposer +{ + private String message; + + public ModToolIssueResponseAlertComposer(String message) + { + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolIssueResponseAlertComposer); + this.response.appendString(this.message); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueUpdateComposer.java new file mode 100644 index 00000000..da660ad6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolIssueUpdateComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolIssueUpdateComposer extends MessageComposer +{ + private final ModToolIssue issue; + + public ModToolIssueUpdateComposer(ModToolIssue issue) + { + this.issue = issue; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolIssueUpdateComposer); + this.issue.serialize(this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolReportReceivedAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolReportReceivedAlertComposer.java new file mode 100644 index 00000000..b9d8b14b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolReportReceivedAlertComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolReportReceivedAlertComposer extends MessageComposer +{ + public static final int REPORT_RECEIVED = 0; + public static final int REPORT_WINDOW = 1; + public static final int REPORT_ABUSIVE = 2; + + private int errorCode; + + public ModToolReportReceivedAlertComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolReportReceivedAlertComposer); + this.response.appendInt(this.errorCode); + return null; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomChatlogComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomChatlogComposer.java new file mode 100644 index 00000000..946e80a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomChatlogComposer.java @@ -0,0 +1,50 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import java.text.SimpleDateFormat; + +import java.util.ArrayList; +import java.util.Date; + +public class ModToolRoomChatlogComposer extends MessageComposer +{ + private Room room; + private ArrayList chatlog; + + public ModToolRoomChatlogComposer(Room room, ArrayList chatlog) + { + this.room = room; + this.chatlog = chatlog; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolRoomChatlogComposer); + this.response.appendByte(1); + this.response.appendShort(2); + this.response.appendString("roomName"); + this.response.appendByte(2); + this.response.appendString(this.room.getName()); + this.response.appendString("roomId"); + this.response.appendByte(1); + this.response.appendInt(this.room.getId()); + + SimpleDateFormat formatDate = new SimpleDateFormat("HH:mm"); + + this.response.appendShort(this.chatlog.size()); + for(ModToolChatLog line : this.chatlog) + { + this.response.appendString(formatDate.format(new Date((line.timestamp * 1000L)))); + this.response.appendInt(line.habboId); + this.response.appendString(line.username); + this.response.appendString(line.message); + this.response.appendBoolean(false); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomInfoComposer.java new file mode 100644 index 00000000..668b63f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolRoomInfoComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolRoomInfoComposer extends MessageComposer +{ + private Room room; + + public ModToolRoomInfoComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolRoomInfoComposer); + this.response.appendInt(this.room.getId()); + this.response.appendInt(this.room.getCurrentHabbos().size()); + this.response.appendBoolean(this.room.getHabbo(this.room.getOwnerId()) != null); + this.response.appendInt(this.room.getOwnerId()); + this.response.appendString(this.room.getOwnerName()); + this.response.appendBoolean(!this.room.isPublicRoom()); + if(!this.room.isPublicRoom()) + { + this.response.appendString(this.room.getName()); + this.response.appendString(this.room.getDescription()); + this.response.appendInt(this.room.getTags().split(";").length); + for(int i = 0; i < this.room.getTags().split(";").length; i++) + { + this.response.appendString(this.room.getTags().split(";")[i]); + } + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolSanctionInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolSanctionInfoComposer.java new file mode 100644 index 00000000..7640257b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolSanctionInfoComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolSanctionInfoComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolSanctionInfoComposer); + this.response.appendBoolean(false); //Has Last Sanction. + this.response.appendBoolean(false); //Is probabtion. + this.response.appendString("<< Last Sanction >>"); + this.response.appendInt(0); //Value | Probation days left. + this.response.appendInt(-1); //Unused + this.response.appendString("<< Reason >>"); //Reason + this.response.appendString("1/1/1970 00:00"); //Start Time + this.response.appendInt(0); //Probation Days Left + this.response.appendString("<< Next Sanction >>"); //Next Sanction + this.response.appendInt(0); //Value + this.response.appendInt(-1); //Unused + this.response.appendBoolean(false); //Trade Locked + this.response.appendString("1/1/1970 00:00"); //Trade Locked Untill + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserChatlogComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserChatlogComposer.java new file mode 100644 index 00000000..ad9ad1a1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserChatlogComposer.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolChatLog; +import com.eu.habbo.habbohotel.modtool.ModToolRoomVisit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; + +public class ModToolUserChatlogComposer extends MessageComposer +{ + public static SimpleDateFormat format = new SimpleDateFormat("HH:mm"); + private ArrayList set; + private int userId; + private String username; + + public ModToolUserChatlogComposer(ArrayList set, int userId, String username) + { + this.set = set; + this.userId = userId; + this.username = username; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolUserChatlogComposer); + + this.response.appendInt(this.userId); + this.response.appendString(this.username); + this.response.appendInt(this.set.size()); + + for(ModToolRoomVisit visit : set) + { + this.response.appendByte(1); + this.response.appendShort(2); + this.response.appendString("roomName"); + this.response.appendByte(2); + this.response.appendString(visit.roomName); + this.response.appendString("roomId"); + this.response.appendByte(1); + this.response.appendInt(visit.roomId); + + this.response.appendShort(visit.chat.size()); + for(ModToolChatLog chatLog : visit.chat) + { + this.response.appendString(format.format(chatLog.timestamp * 1000l)); + this.response.appendInt(chatLog.habboId); + this.response.appendString(chatLog.username); + this.response.appendString(chatLog.message); + this.response.appendBoolean(false); + } + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserInfoComposer.java new file mode 100644 index 00000000..897dcf61 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserInfoComposer.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ModToolUserInfoComposer extends MessageComposer +{ + private ResultSet set; + + public ModToolUserInfoComposer(ResultSet set) + { + this.set = set; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolUserInfoComposer); + try + { + this.response.appendInt(set.getInt("user_id")); + this.response.appendString(set.getString("username")); + this.response.appendString(set.getString("look")); + this.response.appendInt(set.getInt("account_created")); + this.response.appendInt(set.getInt("online") == 1 ? 0 : set.getInt("last_online")); + this.response.appendBoolean(set.getInt("online") == 1); + this.response.appendInt(set.getInt("cfh_send")); + this.response.appendInt(set.getInt("cfh_abusive")); + this.response.appendInt(set.getInt("cfh_warnings")); + this.response.appendInt(set.getInt("cfh_bans")); + this.response.appendInt(Emulator.getIntUnixTimestamp() - set.getInt("account_created")); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendString(set.getString("mail")); + this.response.appendString(""); + return this.response; + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + return null; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserRoomVisitsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserRoomVisitsComposer.java new file mode 100644 index 00000000..4199a4cf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserRoomVisitsComposer.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolRoomVisit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; +import java.util.Calendar; +import java.util.TimeZone; + +public class ModToolUserRoomVisitsComposer extends MessageComposer +{ + private final Habbo habbo; + private final THashSet roomVisits; + + public ModToolUserRoomVisitsComposer(Habbo habbo, THashSet roomVisits) + { + this.habbo = habbo; + this.roomVisits = roomVisits; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolUserRoomVisitsComposer); + + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendInt(this.roomVisits.size()); + + Calendar cal = Calendar.getInstance(TimeZone.getDefault()); + for(ModToolRoomVisit visit : this.roomVisits) + { + cal.setTimeInMillis(visit.timestamp * 1000); + this.response.appendInt(visit.roomId); + this.response.appendString(visit.roomName); + this.response.appendInt(cal.get(Calendar.HOUR)); + this.response.appendInt(cal.get(Calendar.MINUTE)); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ReportRoomFormComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ReportRoomFormComposer.java new file mode 100644 index 00000000..85f1ce30 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ReportRoomFormComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.modtool; + +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.List; + +public class ReportRoomFormComposer extends MessageComposer +{ + private List pendingIssues = new ArrayList<>(); + + public ReportRoomFormComposer() + { + + } + + public ReportRoomFormComposer(List issues) + { + this.pendingIssues = issues; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ReportRoomFormComposer); + this.response.appendInt(this.pendingIssues.size()); //Current standing help request(s) amount: + + for (ModToolIssue issue : this.pendingIssues) + { + this.response.appendString(issue.id + ""); + this.response.appendString(issue.timestamp + ""); + this.response.appendString(issue.message); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateEventComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateEventComposer.java new file mode 100644 index 00000000..ab10e458 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateEventComposer.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CanCreateEventComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CanCreateEventComposer); + this.response.appendBoolean(true); + this.response.appendInt(0); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateRoomComposer.java new file mode 100644 index 00000000..5aafbe79 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/CanCreateRoomComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CanCreateRoomComposer extends MessageComposer +{ + private final int count; + private final int max; + + public CanCreateRoomComposer(int count, int max) + { + this.count = count; + this.max = max; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CanCreateRoomComposer); + + this.response.appendInt(this.count >= this.max ? 1 : 0); + this.response.appendInt(this.max); + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCategoryUserCountComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCategoryUserCountComposer.java new file mode 100644 index 00000000..03622acc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCategoryUserCountComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class NewNavigatorCategoryUserCountComposer extends MessageComposer +{ + public final List roomCategories; + + public NewNavigatorCategoryUserCountComposer(List roomCategories) + { + this.roomCategories = roomCategories; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorCategoryUserCountComposer); + this.response.appendInt(this.roomCategories.size()); + + for (RoomCategory category : this.roomCategories) + { + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(200); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCollapsedCategoriesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCollapsedCategoriesComposer.java new file mode 100644 index 00000000..92521bd7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorCollapsedCategoriesComposer.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewNavigatorCollapsedCategoriesComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorCollapsedCategoriesComposer); + this.response.appendInt(46); + this.response.appendString("new_ads"); + this.response.appendString("friend_finding"); + this.response.appendString("staffpicks"); + this.response.appendString("with_friends"); + this.response.appendString("with_rights"); + this.response.appendString("query"); + this.response.appendString("recommended"); + this.response.appendString("my_groups"); + this.response.appendString("favorites"); + this.response.appendString("history"); + this.response.appendString("top_promotions"); + this.response.appendString("campaign_target"); + this.response.appendString("friends_rooms"); + this.response.appendString("groups"); + this.response.appendString("metadata"); + this.response.appendString("history_freq"); + this.response.appendString("highest_score"); + this.response.appendString("competition"); + this.response.appendString("category__Agencies"); + this.response.appendString("category__Role Playing"); + this.response.appendString("category__Global Chat & Discussi"); + this.response.appendString("category__GLOBAL BUILDING AND DE"); + this.response.appendString("category__global party"); + this.response.appendString("category__global games"); + this.response.appendString("category__global fansite"); + this.response.appendString("category__global help"); + this.response.appendString("category__Trading"); + this.response.appendString("category__global personal space"); + this.response.appendString("category__Habbo Life"); + this.response.appendString("category__TRADING"); + this.response.appendString("category__global official"); + this.response.appendString("category__global trade"); + this.response.appendString("category__global reviews"); + this.response.appendString("category__global bc"); + this.response.appendString("category__global personal space"); + this.response.appendString("eventcategory__Hottest Events"); + this.response.appendString("eventcategory__Parties & Music"); + this.response.appendString("eventcategory__Role Play"); + this.response.appendString("eventcategory__Help Desk"); + this.response.appendString("eventcategory__Trading"); + this.response.appendString("eventcategory__Games"); + this.response.appendString("eventcategory__Debates & Discuss"); + this.response.appendString("eventcategory__Grand Openings"); + this.response.appendString("eventcategory__Friending"); + this.response.appendString("eventcategory__Jobs"); + this.response.appendString("eventcategory__Group Events"); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java new file mode 100644 index 00000000..13b53c26 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorEventCategoriesComposer.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewNavigatorEventCategoriesComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorEventCategoriesComposer); + this.response.appendInt(11); + this.response.appendInt(1); + this.response.appendString("Hottest Events"); + this.response.appendBoolean(false); + this.response.appendInt(2); + this.response.appendString("Parties & Music"); + this.response.appendBoolean(true); + this.response.appendInt(3); + this.response.appendString("Role Play"); + this.response.appendBoolean(true); + this.response.appendInt(4); + this.response.appendString("Help Desk"); + this.response.appendBoolean(true); + this.response.appendInt(5); + this.response.appendString("Trading"); + this.response.appendBoolean(true); + this.response.appendInt(6); + this.response.appendString("Games"); + this.response.appendBoolean(true); + this.response.appendInt(7); + this.response.appendString("Debates & Discussions"); + this.response.appendBoolean(true); + this.response.appendInt(8); + this.response.appendString("Grand Openings"); + this.response.appendBoolean(true); + this.response.appendInt(9); + this.response.appendString("Friending"); + this.response.appendBoolean(true); + this.response.appendInt(10); + this.response.appendString("Jobs"); + this.response.appendBoolean(true); + this.response.appendInt(11); + this.response.appendString("Group Events"); + this.response.appendBoolean(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorLiftedRoomsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorLiftedRoomsComposer.java new file mode 100644 index 00000000..bd416ae7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorLiftedRoomsComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewNavigatorLiftedRoomsComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorLiftedRoomsComposer); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorMetaDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorMetaDataComposer.java new file mode 100644 index 00000000..3fb96006 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorMetaDataComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewNavigatorMetaDataComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorMetaDataComposer); + this.response.appendInt(4); + + this.response.appendString("official_view"); + this.response.appendInt(0); + this.response.appendString("hotel_view"); + this.response.appendInt(0); + this.response.appendString("roomads_view"); + this.response.appendInt(0); + this.response.appendString("myworld_view"); + this.response.appendInt(0); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSavedSearchesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSavedSearchesComposer.java new file mode 100644 index 00000000..d058c978 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSavedSearchesComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewNavigatorSavedSearchesComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorSavedSearchesComposer); + this.response.appendInt(4); + + this.response.appendInt(1); + this.response.appendString("official"); + this.response.appendString(""); + this.response.appendString(""); + + this.response.appendInt(2); + this.response.appendString("recommended"); + this.response.appendString(""); + this.response.appendString(""); + + this.response.appendInt(3); + this.response.appendString("my"); + this.response.appendString(""); + this.response.appendString(""); + + this.response.appendInt(4); + this.response.appendString("favorites"); + this.response.appendString(""); + this.response.appendString(""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSearchResultsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSearchResultsComposer.java new file mode 100644 index 00000000..cb3f963b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSearchResultsComposer.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.habbohotel.navigation.SearchResultList; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class NewNavigatorSearchResultsComposer extends MessageComposer +{ + private String searchCode; + private String searchQuery; + private final List resultList; + + public NewNavigatorSearchResultsComposer(String searchCode, String searchQuery, List resultList) + { + this.searchCode = searchCode; + this.searchQuery = searchQuery; + this.resultList = resultList; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorSearchResultsComposer); + this.response.appendString(this.searchCode); + this.response.appendString(this.searchQuery); + + Collections.sort(this.resultList, new Comparator() + { + @Override + public int compare(SearchResultList o1, SearchResultList o2) + { + return o1.order - o2.order; + } + }); + + this.response.appendInt(this.resultList.size()); //Count + + for (SearchResultList item : resultList) + { + item.serialize(this.response); + } + + return this.response; + } + + +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSettingsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSettingsComposer.java new file mode 100644 index 00000000..dbb6987f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/NewNavigatorSettingsComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.habbohotel.users.HabboNavigatorWindowSettings; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewNavigatorSettingsComposer extends MessageComposer +{ + private final HabboNavigatorWindowSettings windowSettings; + + public NewNavigatorSettingsComposer(HabboNavigatorWindowSettings windowSettings) + { + this.windowSettings = windowSettings; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewNavigatorSettingsComposer); + this.response.appendInt(this.windowSettings.x); + this.response.appendInt(this.windowSettings.y); + this.response.appendInt(this.windowSettings.width); + this.response.appendInt(this.windowSettings.height); + this.response.appendBoolean(this.windowSettings.openSearches); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/OpenRoomCreationWindowComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/OpenRoomCreationWindowComposer.java new file mode 100644 index 00000000..9e766fdb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/OpenRoomCreationWindowComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class OpenRoomCreationWindowComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.OpenRoomCreationWindowComposer); + //Empty Body + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/PrivateRoomsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/PrivateRoomsComposer.java new file mode 100644 index 00000000..b4a221ca --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/PrivateRoomsComposer.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class PrivateRoomsComposer extends MessageComposer +{ + private List rooms; + + public PrivateRoomsComposer(List rooms) + { + this.rooms = rooms; + } + + @Override + public ServerMessage compose() + { + try + { + this.response.init(Outgoing.PrivateRoomsComposer); + + this.response.appendInt(2); + this.response.appendString(""); + + this.response.appendInt(this.rooms.size()); + + for (Room room : this.rooms) { + room.serialize(this.response); + } + this.response.appendBoolean(true); + + this.response.appendInt(0); + this.response.appendString("A"); + this.response.appendString("B"); + this.response.appendInt(1); + this.response.appendString("C"); + this.response.appendString("D"); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendString("E"); + return this.response; + } + catch(Exception e) + { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCategoriesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCategoriesComposer.java new file mode 100644 index 00000000..17d9dde0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCategoriesComposer.java @@ -0,0 +1,47 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.habbohotel.rooms.RoomCategory; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class RoomCategoriesComposer extends MessageComposer +{ + private List categories; + + public RoomCategoriesComposer(List categories) + { + this.categories = categories; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomCategoriesComposer); + + this.response.appendInt(this.categories.size()); + for(RoomCategory category : this.categories) + { + this.response.appendInt(category.getId()); + this.response.appendString(category.getCaption()); + this.response.appendBoolean(true); //Visible + this.response.appendBoolean(false); //True = Disconnect? + this.response.appendString(category.getCaption()); + + if (category.getCaption().startsWith("${")) + { + this.response.appendString(""); + } + else + { + this.response.appendString(category.getCaption()); + } + + this.response.appendBoolean(false); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCreatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCreatedComposer.java new file mode 100644 index 00000000..26151a75 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/RoomCreatedComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomCreatedComposer extends MessageComposer +{ + private final Room room; + + public RoomCreatedComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomCreatedComposer); + this.response.appendInt(this.room.getId()); + this.response.appendString(this.room.getName()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/navigator/TagsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/navigator/TagsComposer.java new file mode 100644 index 00000000..af09ad3f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/navigator/TagsComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.navigator; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import java.util.Set; + +public class TagsComposer extends MessageComposer +{ + private final Set tags; + + public TagsComposer(Set tags) + { + this.tags = tags; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TagsComposer); + this.response.appendInt(this.tags.size()); + + int i = 1; + for(String s : this.tags) + { + this.response.appendString(s); + this.response.appendInt(i); + i++; + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/polls/PollQuestionsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/polls/PollQuestionsComposer.java new file mode 100644 index 00000000..d732a097 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/polls/PollQuestionsComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.polls; + +import com.eu.habbo.habbohotel.polls.Poll; +import com.eu.habbo.habbohotel.polls.PollQuestion; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PollQuestionsComposer extends MessageComposer +{ + private Poll poll; + + public PollQuestionsComposer(Poll poll) + { + this.poll = poll; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PollQuestionsComposer); + + this.response.appendInt(this.poll.getId()); + this.response.appendString(this.poll.getTitle()); + this.response.appendString(this.poll.getThanksMessage()); + this.response.appendInt(this.poll.getQuestions().size()); + for (PollQuestion question : this.poll.getQuestions()) + { + question.serialize(this.response); + } + + this.response.appendBoolean(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/polls/PollStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/polls/PollStartComposer.java new file mode 100644 index 00000000..b6fd8d5b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/polls/PollStartComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.polls; + +import com.eu.habbo.habbohotel.polls.Poll; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PollStartComposer extends MessageComposer +{ + private final Poll poll; + + public PollStartComposer(Poll poll) + { + this.poll = poll; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PollStartComposer); + this.response.appendInt(this.poll.getId()); + this.response.appendString(this.poll.getTitle()); + this.response.appendString(this.poll.getThanksMessage()); + this.response.appendString(this.poll.getTitle()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswerComposer.java new file mode 100644 index 00000000..46b08b83 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswerComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.polls.infobus; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class SimplePollAnswerComposer extends MessageComposer +{ + private final int userId; + private final String choice; + private final int no; + private final int yes; + + public SimplePollAnswerComposer(int userId, String choice, int no, int yes) + { + this.userId = userId; + this.choice = choice; + this.no = no; + this.yes = yes; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SimplePollAnswerComposer); + this.response.appendInt(this.userId); + this.response.appendString(this.choice); + this.response.appendInt(2); + this.response.appendString("0"); + this.response.appendInt(this.no); + this.response.appendString("1"); + this.response.appendInt(this.yes); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswersComposer.java new file mode 100644 index 00000000..1ca9bb4e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollAnswersComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.polls.infobus; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class SimplePollAnswersComposer extends MessageComposer +{ + private final int unknownInt; + private final int no; + private final int yes; + + public SimplePollAnswersComposer(int unknownInt, int no, int yes) + { + this.unknownInt = unknownInt; + this.no = no; + this.yes = yes; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SimplePollAnswersComposer); + this.response.appendInt(-1); + this.response.appendInt(2); + this.response.appendString("0"); + this.response.appendInt(this.no); + this.response.appendString("1"); + this.response.appendInt(this.yes); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollStartComposer.java new file mode 100644 index 00000000..cb63a945 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/polls/infobus/SimplePollStartComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.polls.infobus; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class SimplePollStartComposer extends MessageComposer +{ + public final int duration; + public final String question; + + public SimplePollStartComposer(int duration, String question) + { + this.duration = duration; + this.question = question; + } + //:test 3047 s:a i:10 i:20 i:10000 i:1 i:1 i:3 s:abcdefghijklmnopqrstuvwxyz12345678901234? i:1 s:a s:b + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SimplePollStartComposer); + this.response.appendString(this.question); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(this.duration); //duration + this.response.appendInt(-1); //Id + this.response.appendInt(0); //Number + this.response.appendInt(3); //Type + this.response.appendString(this.question); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/BotSettingsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/BotSettingsComposer.java new file mode 100644 index 00000000..b4e75fb4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/BotSettingsComposer.java @@ -0,0 +1,50 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BotSettingsComposer extends MessageComposer +{ + private final Bot bot; + private final int settingId; + + public BotSettingsComposer(Bot bot, int settingId) + { + this.bot = bot; + this.settingId = settingId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BotSettingsComposer); + this.response.appendInt(-this.bot.getId()); + this.response.appendInt(this.settingId); + + switch(this.settingId) + { + case 1: break; + case 2: + String data = ""; + for(String s : this.bot.getChatLines()) + { + data += s + "\r"; + } + + data += ";#;" + (this.bot.isChatAuto() ? "true" : "false"); + data += ";#;" + this.bot.getChatDelay(); + data += ";#;" + (this.bot.isChatRandom() ? "true" : "false"); + this.response.appendString(data); + break; + case 3: break; + case 4: break; + case 5: + this.response.appendString(bot.getName()); + break; + case 6: return null; + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/DoorbellAddUserComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/DoorbellAddUserComposer.java new file mode 100644 index 00000000..df499f5e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/DoorbellAddUserComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class DoorbellAddUserComposer extends MessageComposer +{ + private final String habbo; + + public DoorbellAddUserComposer(String habbo) + { + this.habbo = habbo; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.DoorbellAddUserComposer); + this.response.appendString(this.habbo); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/FavoriteRoomChangedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/FavoriteRoomChangedComposer.java new file mode 100644 index 00000000..ea37f8b3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/FavoriteRoomChangedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FavoriteRoomChangedComposer extends MessageComposer +{ + private final int roomId; + private final boolean favorite; + + public FavoriteRoomChangedComposer(int roomId, boolean favorite) + { + this.roomId = roomId; + this.favorite = favorite; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FavoriteRoomChangedComposer); + this.response.appendInt(this.roomId); + this.response.appendBoolean(this.favorite); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/FloodCounterComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/FloodCounterComposer.java new file mode 100644 index 00000000..89534358 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/FloodCounterComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FloodCounterComposer extends MessageComposer +{ + private final int time; + + public FloodCounterComposer(int time) + { + this.time = time; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FloodCounterComposer); + this.response.appendInt(time); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/ForwardToRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/ForwardToRoomComposer.java new file mode 100644 index 00000000..e90a7f51 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/ForwardToRoomComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ForwardToRoomComposer extends MessageComposer +{ + private int roomId; + + public ForwardToRoomComposer(int roomId) + { + this.roomId = roomId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ForwardToRoomComposer); + this.response.appendInt(this.roomId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/FreezeLivesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/FreezeLivesComposer.java new file mode 100644 index 00000000..63729758 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/FreezeLivesComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.games.freeze.FreezeGamePlayer; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FreezeLivesComposer extends MessageComposer +{ + private final FreezeGamePlayer gamePlayer; + + public FreezeLivesComposer(FreezeGamePlayer gamePlayer) + { + this.gamePlayer = gamePlayer; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FreezeLivesComposer); + this.response.appendInt(this.gamePlayer.getHabbo().getHabboInfo().getId()); + this.response.appendInt(this.gamePlayer.getLives()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/HideDoorbellComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/HideDoorbellComposer.java new file mode 100644 index 00000000..f5850b4b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/HideDoorbellComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HideDoorbellComposer extends MessageComposer +{ + private final String username; + + public HideDoorbellComposer(String username) + { + this.username = username; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HideDoorbellComposer); + this.response.appendString(this.username); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/KnockKnockUnknownComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/KnockKnockUnknownComposer.java new file mode 100644 index 00000000..fecef6c7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/KnockKnockUnknownComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class KnockKnockUnknownComposer extends MessageComposer +{ + private final Habbo habbo; + + public KnockKnockUnknownComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(478); //TODO Hardcoded header + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendInt(this.habbo.getHabboInfo().getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAccessDeniedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAccessDeniedComposer.java new file mode 100644 index 00000000..45cbc6af --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAccessDeniedComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomAccessDeniedComposer extends MessageComposer +{ + private final String habbo; + + public RoomAccessDeniedComposer(String habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomAccessDeniedComposer); + this.response.appendString(this.habbo); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAddRightsListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAddRightsListComposer.java new file mode 100644 index 00000000..03d81d1d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomAddRightsListComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomAddRightsListComposer extends MessageComposer +{ + private final Room room; + private final int userId; + private final String userName; + + public RoomAddRightsListComposer(Room room, int userId, String username) + { + this.room = room; + this.userId = userId; + this.userName = username; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomAddRightsListComposer); + this.response.appendInt(this.room.getId()); + this.response.appendInt(this.userId); + this.response.appendString(this.userName); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomBannedUsersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomBannedUsersComposer.java new file mode 100644 index 00000000..1b073da5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomBannedUsersComposer.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomBan; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.set.hash.THashSet; + +import java.util.NoSuchElementException; + +public class RoomBannedUsersComposer extends MessageComposer +{ + private final Room room; + + public RoomBannedUsersComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + int timeStamp = Emulator.getIntUnixTimestamp(); + + THashSet roomBans = new THashSet(); + + TIntObjectIterator iterator = this.room.getBannedHabbos().iterator(); + + for(int i = this.room.getBannedHabbos().size(); i-- > 0;) + { + try + { + iterator.advance(); + + if(iterator.value().endTimestamp > timeStamp) + roomBans.add(iterator.value()); + } + catch (NoSuchElementException e) + { + break; + } + } + + if(roomBans.isEmpty()) + return null; + + this.response.init(Outgoing.RoomBannedUsersComposer); + this.response.appendInt(this.room.getId()); + this.response.appendInt(roomBans.size()); + + for(RoomBan ban : roomBans) + { + this.response.appendInt(ban.userId); + this.response.appendString(ban.username); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomChatSettingsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomChatSettingsComposer.java new file mode 100644 index 00000000..f36bf66a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomChatSettingsComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomChatSettingsComposer extends MessageComposer +{ + private final Room room; + + public RoomChatSettingsComposer(Room room) + { + this.room = room; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomChatSettingsComposer); + this.response.appendInt(this.room.getChatMode()); + this.response.appendInt(this.room.getChatWeight()); + this.response.appendInt(this.room.getChatSpeed()); + this.response.appendInt(this.room.getChatDistance()); + this.response.appendInt(this.room.getChatProtection()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomDataComposer.java new file mode 100644 index 00000000..6a4d14d8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomDataComposer.java @@ -0,0 +1,129 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomDataComposer extends MessageComposer +{ + + private final Room room; + private final Habbo habbo; + private final boolean publicRoom; + private final boolean unknown; + + public RoomDataComposer(Room room, Habbo habbo, boolean boolA, boolean boolB) + { + this.room = room; + this.habbo = habbo; + this.publicRoom = boolA; + this.unknown = boolB; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomDataComposer); + this.response.appendBoolean(this.unknown); + this.response.appendInt(this.room.getId()); + this.response.appendString(this.room.getName()); + if (this.room.isPublicRoom()) + { + this.response.appendInt(0); + this.response.appendString(""); + } else + { + this.response.appendInt(this.room.getOwnerId()); + this.response.appendString(this.room.getOwnerName()); + } + this.response.appendInt(this.room.getState().getState()); + this.response.appendInt(this.room.getUserCount()); + this.response.appendInt(this.room.getUsersMax()); + this.response.appendString(this.room.getDescription()); + this.response.appendInt(0); + this.response.appendInt(2); + this.response.appendInt(this.room.getScore()); + this.response.appendInt(this.room.getCategory()); + + if (!this.room.getTags().isEmpty()) + { + String[] tags = this.room.getTags().split(";"); + this.response.appendInt(tags.length); + for(String s : tags) + { + this.response.appendString(s); + } + } + else + { + this.response.appendInt(0); + } + + int base = 16; + + if(this.room.getGuildId() > 0) + { + base = base | 2; + } + + if(!this.room.isPublicRoom()) + { + base = base | 8; + } + + if(this.room.isPromoted()) + { + base = base | 4; + } + + this.response.appendInt(base); + + if(this.room.getGuildId() > 0) + { + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(this.room.getGuildId()); + if (g != null) + { + this.response.appendInt(g.getId()); + this.response.appendString(g.getName()); + this.response.appendString(g.getBadge()); + } + else + { + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendString(""); + } + } + + if(this.room.isPromoted()) + { + this.response.appendString(this.room.getPromotion().getTitle()); + this.response.appendString(this.room.getPromotion().getDescription()); + this.response.appendInt((this.room.getPromotion().getEndTimestamp() - Emulator.getIntUnixTimestamp()) / 60); + } + + this.response.appendBoolean(this.publicRoom); + this.response.appendBoolean(this.room.isStaffPromotedRoom()); //staffpicked + this.response.appendBoolean(this.room.isPublicRoom()); //ispublicroom + this.response.appendBoolean(this.room.isMuted()); //isroommuted + + this.response.appendInt(this.room.getMuteOption()); + this.response.appendInt(this.room.getKickOption()); + this.response.appendInt(this.room.getBanOption()); + + this.response.appendBoolean(this.room.hasRights(this.habbo)); //mute all button + + this.response.appendInt(this.room.getChatMode()); + this.response.appendInt(this.room.getChatWeight()); + this.response.appendInt(this.room.getChatSpeed()); + this.response.appendInt(this.room.getChatDistance()); + this.response.appendInt(this.room.getChatProtection()); + + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEditSettingsErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEditSettingsErrorComposer.java new file mode 100644 index 00000000..9f95e063 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEditSettingsErrorComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomEditSettingsErrorComposer extends MessageComposer +{ + public final static int PASSWORD_REQUIRED = 5; + public final static int ROOM_NAME_MISSING = 7; + public final static int ROOM_NAME_BADWORDS = 8; + public final static int ROOM_DESCRIPTION_BADWORDS = 10; + public final static int ROOM_TAGS_BADWWORDS = 11; + public final static int RESTRICTED_TAGS = 12; + public final static int TAGS_TOO_LONG = 13; + + private final int roomId; + private final int errorCode; + private final String info; + + public RoomEditSettingsErrorComposer(int roomId, int errorCode, String info) + { + this.roomId = roomId; + this.errorCode = errorCode; + this.info = info; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomEditSettingsErrorComposer); + this.response.appendInt(this.roomId); + this.response.appendInt(this.errorCode); + this.response.appendString(this.info); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEnterErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEnterErrorComposer.java new file mode 100644 index 00000000..4c745745 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEnterErrorComposer.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomEnterErrorComposer extends MessageComposer +{ + + public static final int ROOM_ERROR_GUESTROOM_FULL = 1; + public static final int ROOM_ERROR_CANT_ENTER = 2; + public static final int ROOM_ERROR_QUE = 3; + public static final int ROOM_ERROR_BANNED = 4; + + public static final String ROOM_NEEDS_VIP = "c"; + public static final String EVENT_USERS_ONLY = "e1"; + public static final String ROOM_LOCKED = "na"; + public static final String TO_MANY_SPECTATORS = "spectator_mode_full"; + + private final int errorCode; + private final String queError; + + public RoomEnterErrorComposer(int errorCode) + { + this.errorCode = errorCode; + this.queError = ""; + } + + public RoomEnterErrorComposer(int errorCode, String queError) + { + this.errorCode = errorCode; + this.queError = queError; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomEnterErrorComposer); + this.response.appendInt(this.errorCode); + this.response.appendString(this.queError); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEntryInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEntryInfoComposer.java new file mode 100644 index 00000000..d408672c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomEntryInfoComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomEntryInfoComposer extends MessageComposer +{ + private final Room room; + + public RoomEntryInfoComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomEntryInfoComposer); + this.response.appendInt(this.room.getId()); + this.response.appendString(this.room.getOwnerName()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFilterWordsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFilterWordsComposer.java new file mode 100644 index 00000000..234a0eb5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFilterWordsComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomFilterWordsComposer extends MessageComposer +{ + private Room room; + + public RoomFilterWordsComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomFilterWordsComposer); + + synchronized (this.room.getWordFilterWords()) + { + this.response.appendInt(this.room.getWordFilterWords().size()); + + for (String string : this.room.getWordFilterWords()) + { + this.response.appendString(string); + } + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFloorThicknessUpdatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFloorThicknessUpdatedComposer.java new file mode 100644 index 00000000..30846f4b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomFloorThicknessUpdatedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomFloorThicknessUpdatedComposer extends MessageComposer +{ + private final Room room; + + public RoomFloorThicknessUpdatedComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomFloorThicknessUpdatedComposer); + this.response.appendBoolean(this.room.isHideWall()); //Hide walls? + this.response.appendInt(this.room.getFloorSize()); //Floor Thickness + this.response.appendInt(this.room.getWallSize()); //Wall Thickness + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomHeightMapComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomHeightMapComposer.java new file mode 100644 index 00000000..3c048152 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomHeightMapComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomHeightMapComposer extends MessageComposer +{ + + private final Room room; + + public RoomHeightMapComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomHeightMapComposer); + this.response.appendBoolean(true); + this.response.appendInt(this.room.getWallHeight()); //FixedWallsHeight + this.response.appendString(this.room.getLayout().getRelativeMap()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomModelComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomModelComposer.java new file mode 100644 index 00000000..8d5fea7a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomModelComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomModelComposer extends MessageComposer +{ + + private final Room room; + + public RoomModelComposer(Room room) + { + this.room = room; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomModelComposer); + this.response.appendString(this.room.getLayout().getName()); + this.response.appendInt(this.room.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomMutedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomMutedComposer.java new file mode 100644 index 00000000..cf4a386e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomMutedComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomMutedComposer extends MessageComposer +{ + private Room room; + + public RoomMutedComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomMutedComposer); + this.response.appendBoolean(this.room.isMuted()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomNoRightsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomNoRightsComposer.java new file mode 100644 index 00000000..0a637462 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomNoRightsComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomNoRightsComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomNoRightsComposer); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOpenComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOpenComposer.java new file mode 100644 index 00000000..fe4924fb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOpenComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomOpenComposer extends MessageComposer +{ + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomOpenComposer); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOwnerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOwnerComposer.java new file mode 100644 index 00000000..cc0b1f78 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomOwnerComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomOwnerComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomOwnerComposer); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaintComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaintComposer.java new file mode 100644 index 00000000..0938d288 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaintComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomPaintComposer extends MessageComposer +{ + + private final String type; + private final String value; + + public RoomPaintComposer(String type, String value) + { + this.type = type; + this.value = value; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomPaintComposer); + this.response.appendString(this.type); + this.response.appendString(this.value); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaneComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaneComposer.java new file mode 100644 index 00000000..d7cdb2ba --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomPaneComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomPaneComposer extends MessageComposer +{ + + private final Room room; + private final boolean roomOwner; + + public RoomPaneComposer(Room room, boolean roomOwner) + { + this.room = room; + this.roomOwner = roomOwner; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomPaneComposer); + this.response.appendInt(this.room.getId()); + this.response.appendBoolean(this.roomOwner); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRelativeMapComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRelativeMapComposer.java new file mode 100644 index 00000000..bcdd1ce4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRelativeMapComposer.java @@ -0,0 +1,40 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomRelativeMapComposer extends MessageComposer +{ + + private final Room room; + + public RoomRelativeMapComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomRelativeMapComposer); + this.response.appendInt(this.room.getLayout().getMapSize() / this.room.getLayout().getMapSizeY()); + this.response.appendInt(this.room.getLayout().getMapSize()); + for (short y = 0; y < this.room.getLayout().getMapSizeY(); y++) + { + for (short x = 0; x < this.room.getLayout().getMapSizeX(); x++) + { + RoomTile t = this.room.getLayout().getTile(x, y); + + if (t != null) + this.response.appendShort(t.relativeHeight()); + else + this.response.appendShort(Short.MAX_VALUE); + + } + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRemoveRightsListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRemoveRightsListComposer.java new file mode 100644 index 00000000..c9dde6e3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRemoveRightsListComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomRemoveRightsListComposer extends MessageComposer +{ + private final Room room; + private final int userId; + + public RoomRemoveRightsListComposer(Room room, int userId) + { + this.room = room; + this.userId = userId; + } + + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomRemoveRightsListComposer); + this.response.appendInt(this.room.getId()); + this.response.appendInt(this.userId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsComposer.java new file mode 100644 index 00000000..c4fdaa0f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.RoomRightLevels; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomRightsComposer extends MessageComposer +{ + + private final RoomRightLevels type; + + public RoomRightsComposer(RoomRightLevels type) + { + this.type = type; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomRightsComposer); + this.response.appendInt(this.type.level); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsListComposer.java new file mode 100644 index 00000000..6aead2c6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomRightsListComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +public class RoomRightsListComposer extends MessageComposer +{ + private final Room room; + + public RoomRightsListComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomRightsListComposer); + this.response.appendInt(this.room.getId()); + + THashMap rightsMap = this.room.getUsersWithRights(); + + this.response.appendInt(rightsMap.size()); + + for(Map.Entry set : rightsMap.entrySet()) + { + this.response.appendInt(set.getKey()); + this.response.appendString(set.getValue()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomScoreComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomScoreComposer.java new file mode 100644 index 00000000..084a152f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomScoreComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomScoreComposer extends MessageComposer +{ + + private final int score; + private final boolean canVote; + + public RoomScoreComposer(int score, boolean canVote) + { + this.score = score; + this.canVote = canVote; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomScoreComposer); + this.response.appendInt(score); + this.response.appendBoolean(this.canVote); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsComposer.java new file mode 100644 index 00000000..c7067789 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsComposer.java @@ -0,0 +1,65 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomSettingsComposer extends MessageComposer +{ + + private final Room room; + + public RoomSettingsComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomSettingsComposer); + this.response.appendInt(this.room.getId()); + this.response.appendString(this.room.getName()); + this.response.appendString(this.room.getDescription()); + this.response.appendInt(this.room.getState().getState()); + this.response.appendInt(this.room.getCategory()); + this.response.appendInt(this.room.getUsersMax()); + this.response.appendInt(this.room.getUsersMax()); + + if (!this.room.getTags().isEmpty()) + { + this.response.appendInt(this.room.getTags().split(";").length); + for (String tag : this.room.getTags().split(";")) + { + this.response.appendString(tag); + } + } + else + { + this.response.appendInt(0); + } + + //this.response.appendInt(this.room.getRights().size()); + this.response.appendInt(this.room.getTradeMode()); //Trade Mode + this.response.appendInt(this.room.isAllowPets() ? 1 : 0); + this.response.appendInt(this.room.isAllowPetsEat() ? 1 : 0); + this.response.appendInt(this.room.isAllowWalkthrough() ? 1 : 0); + this.response.appendInt(this.room.isHideWall() ? 1 : 0); + this.response.appendInt(this.room.getWallSize()); + this.response.appendInt(this.room.getFloorSize()); + + this.response.appendInt(this.room.getChatMode()); + this.response.appendInt(this.room.getChatWeight()); + this.response.appendInt(this.room.getChatSpeed()); + this.response.appendInt(this.room.getChatDistance()); + this.response.appendInt(this.room.getChatProtection()); + + this.response.appendBoolean(false); //IDK? + + this.response.appendInt(this.room.getMuteOption()); + this.response.appendInt(this.room.getKickOption()); + this.response.appendInt(this.room.getBanOption()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsSavedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsSavedComposer.java new file mode 100644 index 00000000..1faf88f0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsSavedComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomSettingsSavedComposer extends MessageComposer +{ + private final Room room; + + public RoomSettingsSavedComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomSettingsSavedComposer); + this.response.appendInt(this.room.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsUpdatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsUpdatedComposer.java new file mode 100644 index 00000000..9675c525 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomSettingsUpdatedComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomSettingsUpdatedComposer extends MessageComposer +{ + private final Room room; + + public RoomSettingsUpdatedComposer(Room room) + { + this.room = room; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomSettingsUpdatedComposer); + this.response.appendInt(this.room.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomThicknessComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomThicknessComposer.java new file mode 100644 index 00000000..edc9087b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/RoomThicknessComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomThicknessComposer extends MessageComposer +{ + + private final Room room; + + public RoomThicknessComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomThicknessComposer); + this.response.appendBoolean(this.room.isHideWall()); + this.response.appendInt(this.room.getWallSize()); + this.response.appendInt(this.room.getFloorSize()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/UpdateStackHeightComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/UpdateStackHeightComposer.java new file mode 100644 index 00000000..88b2fb37 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/UpdateStackHeightComposer.java @@ -0,0 +1,53 @@ +package com.eu.habbo.messages.outgoing.rooms; + +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class UpdateStackHeightComposer extends MessageComposer +{ + + private int x; + private int y; + private double height; + + private THashSet updateTiles; + + public UpdateStackHeightComposer(int x, int y, double height) + { + this.x = x; + this.y = y; + this.height = height; + } + + public UpdateStackHeightComposer(THashSet updateTiles) + { + this.updateTiles = updateTiles; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UpdateStackHeightComposer); + if(this.updateTiles != null) + { + this.response.appendByte(this.updateTiles.size()); + for(RoomTile t : this.updateTiles) + { + this.response.appendByte((int) t.x); + this.response.appendByte((int) t.y); + this.response.appendShort((int)(t.relativeHeight())); + } + } + else + { + this.response.appendByte(1); + this.response.appendByte(this.x); + this.response.appendByte(this.y); + this.response.appendShort((int) (this.height)); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddFloorItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddFloorItemComposer.java new file mode 100644 index 00000000..6114a30a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddFloorItemComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionGift; +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AddFloorItemComposer extends MessageComposer +{ + private final HabboItem item; + private final String itemOwnerName; + + public AddFloorItemComposer(HabboItem item, String itemOwnerName) + { + this.item = item; + this.itemOwnerName = itemOwnerName; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AddFloorItemComposer); + this.item.serializeFloorData(this.response); + this.response.appendInt(this.item instanceof InteractionGift ? ((((InteractionGift) this.item).getColorId() * 1000) + ((InteractionGift) this.item).getRibbonId()) : (this.item instanceof InteractionMusicDisc ? ((InteractionMusicDisc) this.item).getSongId() : 1)); + this.item.serializeExtradata(this.response); + this.response.appendInt(-1); + this.response.appendInt(this.item.getBaseItem().getStateCount() > 1 ? 1 : 0); + this.response.appendInt(this.item.getUserId()); + this.response.appendString(this.itemOwnerName); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddWallItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddWallItemComposer.java new file mode 100644 index 00000000..96379ff5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/AddWallItemComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AddWallItemComposer extends MessageComposer +{ + private final HabboItem item; + private final String itemOwnerName; + + public AddWallItemComposer(HabboItem item, String itemOwnerName) + { + this.item = item; + this.itemOwnerName = itemOwnerName; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AddWallItemComposer); + this.item.serializeWallData(this.response); + this.response.appendString(this.itemOwnerName); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemOnRollerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemOnRollerComposer.java new file mode 100644 index 00000000..945f3a47 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemOnRollerComposer.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomLayout; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import com.eu.habbo.messages.outgoing.rooms.UpdateStackHeightComposer; +import gnu.trove.set.hash.THashSet; + +public class FloorItemOnRollerComposer extends MessageComposer +{ + private final HabboItem item; + private final HabboItem roller; + private final RoomTile newLocation; + private final double heightOffset; + private final Room room; + + public FloorItemOnRollerComposer(HabboItem item, HabboItem roller, RoomTile newLocation, double heightOffset, Room room) + { + this.item = item; + this.roller = roller; + this.newLocation = newLocation; + this.heightOffset = heightOffset; + this.room = room; + } + + @Override + public ServerMessage compose() + { + short oldX = this.item.getX(); + short oldY = this.item.getY(); + + this.response.init(Outgoing.ObjectOnRollerComposer); + this.response.appendInt32(this.item.getX()); + this.response.appendInt32(this.item.getY()); + this.response.appendInt32(this.newLocation.x); + this.response.appendInt32(this.newLocation.y); + this.response.appendInt(1); + this.response.appendInt(this.item.getId()); + this.response.appendString(Double.toString(this.item.getZ())); + this.response.appendString(Double.toString(this.item.getZ() + this.heightOffset)); + this.response.appendInt(this.roller != null ? this.roller.getId() : -1); + + this.item.onMove(this.room, this.room.getLayout().getTile(item.getX(), item.getY()), this.newLocation); + this.item.setX(this.newLocation.x); + this.item.setY(this.newLocation.y); + this.item.setZ(this.item.getZ() + this.heightOffset); + this.item.needsUpdate(true); + THashSet tiles = this.room.getLayout().getTilesAt(this.room.getLayout().getTile(oldX, oldY), this.item.getBaseItem().getWidth(), this.item.getBaseItem().getLength(), this.item.getRotation()); + tiles.addAll(this.room.getLayout().getTilesAt(this.room.getLayout().getTile(this.item.getX(), this.item.getY()), this.item.getBaseItem().getWidth(), this.item.getBaseItem().getLength(), this.item.getRotation())); + this.room.updateTiles(tiles); + + this.room.sendComposer(new UpdateStackHeightComposer(oldX, oldY, this.room.getStackHeight(oldX, oldY, true)).compose()); + + this.room.updateHabbosAt(RoomLayout.getRectangle(this.item.getX(), this.item.getY(), this.item.getBaseItem().getWidth(), this.item.getBaseItem().getLength(), this.item.getRotation())); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemUpdateComposer.java new file mode 100644 index 00000000..deb3cd93 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/FloorItemUpdateComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionGift; +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class FloorItemUpdateComposer extends MessageComposer +{ + private final HabboItem item; + + public FloorItemUpdateComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FloorItemUpdateComposer); + this.item.serializeFloorData(this.response); + this.response.appendInt(this.item instanceof InteractionGift ? ((((InteractionGift) this.item).getColorId() * 1000) + ((InteractionGift) this.item).getRibbonId()) : (this.item instanceof InteractionMusicDisc ? ((InteractionMusicDisc) this.item).getSongId() : 1)); + this.item.serializeExtradata(this.response); + this.response.appendInt(-1); + this.response.appendInt(this.item.getBaseItem().getStateCount() > 1 ? 1 : 0); + this.response.appendInt(this.item.getUserId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/ItemStateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/ItemStateComposer.java new file mode 100644 index 00000000..b72284d3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/ItemStateComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ItemStateComposer extends MessageComposer +{ + private final HabboItem item; + + public ItemStateComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ItemStateComposer); + this.response.appendInt(this.item.getId()); + try + { + int state = Integer.valueOf(this.item.getExtradata()); + this.response.appendInt(state); + } + catch (Exception e) + { + this.response.appendInt(0); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/MoodLightDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/MoodLightDataComposer.java new file mode 100644 index 00000000..43215709 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/MoodLightDataComposer.java @@ -0,0 +1,69 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.rooms.RoomMoodlightData; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.TIntObjectMap; + +public class MoodLightDataComposer extends MessageComposer +{ + private TIntObjectMap moodLightData; + + public MoodLightDataComposer(TIntObjectMap moodLightData) + { + this.moodLightData = moodLightData; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MoodLightDataComposer); + this.response.appendInt(3); //PresetCount + + int index = 1; + for(RoomMoodlightData data : moodLightData.valueCollection()) + { + if(data.isEnabled()) + { + this.response.appendInt(data.getId()); + index = -1; + break; + } + index++; + } + + if(index != -1) + { + this.response.appendInt(1); + } + + int i = 1; + for(RoomMoodlightData data : moodLightData.valueCollection()) + { + this.response.appendInt(data.getId()); //Preset ID + this.response.appendInt(data.isBackgroundOnly() ? 2 : 1); //Background only ? 2 : 1 + this.response.appendString(data.getColor()); //Color + this.response.appendInt(data.getIntensity()); //Intensity + i++; + } + + for(; i <= 3; i++) + { + this.response.appendInt(i); + this.response.appendInt(1); + this.response.appendString("#000000"); + this.response.appendInt(255); + } + + /*for(int i = moodLightData.valueCollection().size(); i < 3; i++) + { + this.response.appendInt(i); + this.response.appendInt(1); + this.response.appendString("#000000"); + this.response.appendInt(255); + }*/ + //:test 2780 i:1 i:1 i:1 i:2 s:#FF00FF i:255 + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItDataComposer.java new file mode 100644 index 00000000..e8dce23c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItDataComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.items.PostItColor; +import com.eu.habbo.habbohotel.items.interactions.InteractionPostIt; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PostItDataComposer extends MessageComposer +{ + private InteractionPostIt postIt; + private boolean hasRights; + + public PostItDataComposer(InteractionPostIt postIt, boolean hasRights) + { + this.postIt = postIt; + this.hasRights = hasRights; + } + + @Override + public ServerMessage compose() + { + if(this.postIt.getExtradata().isEmpty() || this.postIt.getExtradata().length() < 6) + { + this.postIt.setExtradata("FFFF33"); + } + + this.response.init(Outgoing.PostItDataComposer); + this.response.appendString(this.postIt.getId() + ""); + this.response.appendString(this.postIt.getExtradata()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItStickyPoleOpenComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItStickyPoleOpenComposer.java new file mode 100644 index 00000000..0bf1e758 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PostItStickyPoleOpenComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PostItStickyPoleOpenComposer extends MessageComposer +{ + private final HabboItem item; + + public PostItStickyPoleOpenComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PostItStickyPoleOpenComposer); + this.response.appendInt(this.item == null ? -1234 : this.item.getId()); + this.response.appendString(""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java new file mode 100644 index 00000000..3f072ae7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PresentItemOpenedComposer extends MessageComposer +{ + private final HabboItem item; + private final String text; + private final boolean unknown; + + public PresentItemOpenedComposer(HabboItem item, String text, boolean unknown) + { + this.item = item; + this.text = text; + this.unknown = unknown; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PresentItemOpenedComposer); + this.response.appendString(this.item.getBaseItem().getType().code); + this.response.appendInt(this.item.getBaseItem().getSpriteId()); + this.response.appendString(this.item.getBaseItem().getName()); + this.response.appendInt(this.item.getId()); + this.response.appendString(this.item.getBaseItem().getType().code); + this.response.appendBoolean(this.unknown); + this.response.appendString(this.text); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveFloorItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveFloorItemComposer.java new file mode 100644 index 00000000..7f96b8dc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveFloorItemComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemoveFloorItemComposer extends MessageComposer +{ + + private final HabboItem item; + private final boolean noUser; + + public RemoveFloorItemComposer(HabboItem item) + { + this.item = item; + this.noUser = false; + } + + public RemoveFloorItemComposer(HabboItem item, boolean noUser) + { + this.item = item; + this.noUser = noUser; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemoveFloorItemComposer); + + this.response.appendString(this.item.getId() + ""); + this.response.appendBoolean(false); + this.response.appendInt(this.noUser ? 0 : this.item.getUserId()); + this.response.appendInt(0); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveWallItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveWallItemComposer.java new file mode 100644 index 00000000..db8bb658 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RemoveWallItemComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemoveWallItemComposer extends MessageComposer +{ + + private final HabboItem item; + + public RemoveWallItemComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemoveWallItemComposer); + this.response.appendString(this.item.getId() + ""); + this.response.appendInt(this.item.getUserId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomFloorItemsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomFloorItemsComposer.java new file mode 100644 index 00000000..ed713433 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomFloorItemsComposer.java @@ -0,0 +1,62 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.items.interactions.InteractionGift; +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.set.hash.THashSet; + +import java.util.NoSuchElementException; + +public class RoomFloorItemsComposer extends MessageComposer +{ + + private final TIntObjectMap furniOwnerNames; + private final THashSet items; + + public RoomFloorItemsComposer(TIntObjectMap furniOwnerNames, THashSet items) + { + this.furniOwnerNames = furniOwnerNames; + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomFloorItemsComposer); + + TIntObjectIterator iterator = furniOwnerNames.iterator(); + + this.response.appendInt(furniOwnerNames.size()); + for(int i = furniOwnerNames.size(); i-- > 0;) + { + try + { + iterator.advance(); + this.response.appendInt(iterator.key()); + this.response.appendString(iterator.value()); + } + catch (NoSuchElementException e) + { + break; + } + } + + this.response.appendInt(items.size()); + + for(HabboItem item : items) + { + item.serializeFloorData(this.response); + this.response.appendInt(item instanceof InteractionGift ? ((((InteractionGift) item).getColorId() * 1000) + ((InteractionGift) item).getRibbonId()) : (item instanceof InteractionMusicDisc ? ((InteractionMusicDisc) item).getSongId() : 1)); + item.serializeExtradata(this.response); + this.response.appendInt(-1); + this.response.appendInt(item.getBaseItem().getStateCount() > 1 ? 1 : 0); + this.response.appendInt(item.getUserId()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomWallItemsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomWallItemsComposer.java new file mode 100644 index 00000000..d87a5c70 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/RoomWallItemsComposer.java @@ -0,0 +1,64 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.Map; +import java.util.NoSuchElementException; + +public class RoomWallItemsComposer extends MessageComposer +{ + + private final Room room; + + public RoomWallItemsComposer(Room room) + { + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomWallItemsComposer); + THashMap userNames = new THashMap(); + TIntObjectMap furniOwnerNames = this.room.getFurniOwnerNames(); + TIntObjectIterator iterator = furniOwnerNames.iterator(); + + for(int i = furniOwnerNames.size(); i-- > 0;) + { + try + { + iterator.advance(); + + userNames.put(iterator.key(), iterator.value()); + } + catch (NoSuchElementException e) + { + break; + } + } + + this.response.appendInt(userNames.size()); + for(Map.Entry set : userNames.entrySet()) + { + this.response.appendInt(set.getKey()); + this.response.appendString(set.getValue()); + } + + THashSet items = this.room.getWallItems(); + + this.response.appendInt(items.size()); + for(HabboItem item : items) + { + item.serializeWallData(this.response); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/UpdateStackHeightTileHeightComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/UpdateStackHeightTileHeightComposer.java new file mode 100644 index 00000000..96f40a51 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/UpdateStackHeightTileHeightComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UpdateStackHeightTileHeightComposer extends MessageComposer +{ + private final HabboItem item; + private final int height; + + public UpdateStackHeightTileHeightComposer(HabboItem item, double height) + { + this.item = item; + + if(height * 100 < 999) + this.height = (int) height * 100; + else + this.height = 999; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UpdateStackHeightTileHeightComposer); + this.response.appendInt(this.item.getId()); + this.response.appendInt(this.height); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/WallItemUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/WallItemUpdateComposer.java new file mode 100644 index 00000000..85758331 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/WallItemUpdateComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms.items; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WallItemUpdateComposer extends MessageComposer +{ + private final HabboItem item; + + public WallItemUpdateComposer(HabboItem item) + { + this.item = item; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WallItemUpdateComposer); + this.item.serializeWallData(this.response); + this.response.appendString(this.item.getUserId() + ""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxMySongsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxMySongsComposer.java new file mode 100644 index 00000000..38ac84fe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxMySongsComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +import java.util.List; + +public class JukeBoxMySongsComposer extends MessageComposer +{ + private final List items; + + public JukeBoxMySongsComposer(List items) + { + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxMySongsComposer); + + this.response.appendInt(this.items.size()); + + for(HabboItem item : items) + { + this.response.appendInt(item.getId()); + this.response.appendInt(((InteractionMusicDisc) item).getSongId()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxNowPlayingMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxNowPlayingMessageComposer.java new file mode 100644 index 00000000..bff31e5c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxNowPlayingMessageComposer.java @@ -0,0 +1,44 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class JukeBoxNowPlayingMessageComposer extends MessageComposer +{ + private final SoundTrack track; + private final int playListId; + private final int msPlayed; + + public JukeBoxNowPlayingMessageComposer(SoundTrack track, int playListId, int msPlayed) + { + this.track = track; + this.playListId = playListId; + this.msPlayed = msPlayed; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxNowPlayingMessageComposer); + + if(this.track != null) + { + this.response.appendInt(this.track.getId()); + this.response.appendInt(this.playListId); + this.response.appendInt(this.track.getId()); + this.response.appendInt(this.track.getLength()); + this.response.appendInt(this.msPlayed); + } + else + { + this.response.appendInt(-1); + this.response.appendInt(-1); + this.response.appendInt(-1); + this.response.appendInt(-1); + this.response.appendInt(-1); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListAddSongComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListAddSongComposer.java new file mode 100644 index 00000000..6223c7c4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListAddSongComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class JukeBoxPlayListAddSongComposer extends MessageComposer +{ + private final SoundTrack track; + + public JukeBoxPlayListAddSongComposer(SoundTrack track) + { + this.track = track; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxPlayListAddSongComposer); + this.response.appendInt(this.track.getId()); + this.response.appendInt(this.track.getLength() * 1000); + this.response.appendString(this.track.getCode()); + this.response.appendString(this.track.getAuthor()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListComposer.java new file mode 100644 index 00000000..7dd19b3a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListComposer.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.habbohotel.items.interactions.InteractionJukeBox; +import com.eu.habbo.habbohotel.items.interactions.InteractionMusicDisc; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.List; + +public class JukeBoxPlayListComposer extends MessageComposer +{ + private final List songs; + private final int totalLength; + public JukeBoxPlayListComposer(List songs, int totalLength) + { + this.songs = songs; + this.totalLength = totalLength; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxPlayListComposer); + this.response.appendInt(this.totalLength); //Dunno //TODO Total play length? + this.response.appendInt(songs.size()); + + for (InteractionMusicDisc soundTrack : songs) + { + this.response.appendInt(soundTrack.getId()); + this.response.appendInt(soundTrack.getSongId()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListUpdatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListUpdatedComposer.java new file mode 100644 index 00000000..e98640cb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlayListUpdatedComposer.java @@ -0,0 +1,43 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class JukeBoxPlayListUpdatedComposer extends MessageComposer +{ + private final THashSet tracks; + + public JukeBoxPlayListUpdatedComposer(THashSet tracks) + { + this.tracks = tracks; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxPlayListUpdatedComposer); + + int length = 0; + + for(SoundTrack track : tracks) + { + length += track.getLength(); + } + + this.response.appendInt(length * 1000); + this.response.appendInt(this.tracks.size()); + + for(SoundTrack track : this.tracks) + { + this.response.appendInt(track.getId()); + this.response.appendInt(track.getLength() * 1000); + this.response.appendString(track.getCode()); + this.response.appendString(track.getAuthor()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlaylistFullComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlaylistFullComposer.java new file mode 100644 index 00000000..0eaed4d0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxPlaylistFullComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class JukeBoxPlaylistFullComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxPlaylistFullComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackCodeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackCodeComposer.java new file mode 100644 index 00000000..2243e233 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackCodeComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class JukeBoxTrackCodeComposer extends MessageComposer +{ + private final SoundTrack track; + + public JukeBoxTrackCodeComposer(SoundTrack track) + { + this.track = track; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxTrackCodeComposer); + this.response.appendString(this.track.getCode()); + this.response.appendInt(this.track.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackDataComposer.java new file mode 100644 index 00000000..dbde72f5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/jukebox/JukeBoxTrackDataComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.rooms.items.jukebox; + +import com.eu.habbo.habbohotel.items.SoundTrack; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class JukeBoxTrackDataComposer extends MessageComposer +{ + private List tracks; + + public JukeBoxTrackDataComposer(List tracks) + { + this.tracks = tracks; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.JukeBoxTrackDataComposer); + this.response.appendInt(this.tracks.size()); + + for(SoundTrack track : this.tracks) + { + this.response.appendInt(track.getId()); + this.response.appendString(track.getCode()); + this.response.appendString(track.getName()); + this.response.appendString(track.getData()); + this.response.appendInt(track.getLength() * 1000); + this.response.appendString(track.getAuthor()); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFinishedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFinishedComposer.java new file mode 100644 index 00000000..abec0001 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFinishedComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms.items.lovelock; + +import com.eu.habbo.habbohotel.items.interactions.InteractionLoveLock; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class LoveLockFurniFinishedComposer extends MessageComposer +{ + private InteractionLoveLock loveLock; + + public LoveLockFurniFinishedComposer(InteractionLoveLock loveLock) + { + this.loveLock = loveLock; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.LoveLockFurniFinishedComposer); + this.response.appendInt(this.loveLock.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFriendConfirmedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFriendConfirmedComposer.java new file mode 100644 index 00000000..295f626f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniFriendConfirmedComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms.items.lovelock; + +import com.eu.habbo.habbohotel.items.interactions.InteractionLoveLock; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class LoveLockFurniFriendConfirmedComposer extends MessageComposer +{ + private InteractionLoveLock loveLock; + + public LoveLockFurniFriendConfirmedComposer(InteractionLoveLock loveLock) + { + this.loveLock = loveLock; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.LoveLockFurniFriendConfirmedComposer); + this.response.appendInt(this.loveLock.getId()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniStartComposer.java new file mode 100644 index 00000000..642014dc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/lovelock/LoveLockFurniStartComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.items.lovelock; + +import com.eu.habbo.habbohotel.items.interactions.InteractionLoveLock; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class LoveLockFurniStartComposer extends MessageComposer +{ + private InteractionLoveLock loveLock; + + public LoveLockFurniStartComposer(InteractionLoveLock loveLock) + { + this.loveLock = loveLock; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.LoveLockFurniStartComposer); + this.response.appendInt(this.loveLock.getId()); + this.response.appendBoolean(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceInfoComposer.java new file mode 100644 index 00000000..4563331e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceInfoComposer.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.outgoing.rooms.items.rentablespaces; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionRentableSpace; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RentableSpaceInfoComposer extends MessageComposer +{ + public static final int SPACE_ALREADY_RENTED = 100; + public static final int SPACE_EXTEND_NOT_RENTED = 101; + public static final int SPACE_EXTEND_NOT_RENTED_BY_YOU = 102; + public static final int CAN_RENT_ONLY_ONE_SPACE = 103; + public static final int NOT_ENOUGH_CREDITS = 200; + public static final int NOT_ENOUGH_PIXELS = 201; + public static final int CANT_RENT_NO_PERMISSION = 202; + public static final int CANT_RENT_NO_HABBO_CLUB = 203; + public static final int CANT_RENT = 300; + public static final int CANT_RENT_GENERIC = 400; + //:test 194 b:1 i:101 i:1 s:Admin i:10 i:10 + + private Habbo habbo; + private HabboItem item; + private int errorCode; + + public RentableSpaceInfoComposer(Habbo habbo, HabboItem item) + { + this.habbo = habbo; + this.item = item; + this.errorCode = 0; + } + + public RentableSpaceInfoComposer(Habbo habbo, HabboItem item, int errorCode) + { + this.habbo = habbo; + this.item = item; + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + if(!(this.item instanceof InteractionRentableSpace)) + return null; + + this.response.init(Outgoing.RentableSpaceInfoComposer); + this.response.appendBoolean(((InteractionRentableSpace) this.item).isRented()); //In Use + this.response.appendInt(this.errorCode); //Error code. + this.response.appendInt(((InteractionRentableSpace) this.item).getRenterId()); //User ID + this.response.appendString(((InteractionRentableSpace) this.item).getRenterName()); //Current Owner + this.response.appendInt(((InteractionRentableSpace) this.item).getEndTimestamp() - Emulator.getIntUnixTimestamp()); //Seconds Remaining + this.response.appendInt(((InteractionRentableSpace) this.item).rentCost()); //Price + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknown2Composer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknown2Composer.java new file mode 100644 index 00000000..cb7f101b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknown2Composer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms.items.rentablespaces; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RentableSpaceUnknown2Composer extends MessageComposer +{ + private int itemId; + + public RentableSpaceUnknown2Composer(int itemId) + { + this.itemId = itemId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RentableSpaceUnknown2Composer); + this.response.appendInt(this.itemId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknownComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknownComposer.java new file mode 100644 index 00000000..8c0c8c47 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/rentablespaces/RentableSpaceUnknownComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.rooms.items.rentablespaces; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RentableSpaceUnknownComposer extends MessageComposer +{ + private int itemId; + + public RentableSpaceUnknownComposer(int itemId) + { + this.itemId = itemId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RentableSpaceUnknownComposer); + this.response.appendInt(this.itemId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeDisplayListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeDisplayListComposer.java new file mode 100644 index 00000000..79fb8063 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeDisplayListComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.rooms.items.youtube; + +import com.eu.habbo.habbohotel.items.YoutubeManager; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; + +public class YoutubeDisplayListComposer extends MessageComposer +{ + public final int itemId; + public final ArrayList items; + + public YoutubeDisplayListComposer(int itemId, ArrayList items) + { + this.itemId = itemId; + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.YoutubeDisplayListComposer); + this.response.appendInt(this.itemId); + this.response.appendInt(this.items.size()); + + for (YoutubeManager.YoutubeItem item : this.items) + { + this.response.appendString(item.video); + this.response.appendString(item.title); + this.response.appendString(item.description); + } + + this.response.appendString(""); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeVideoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeVideoComposer.java new file mode 100644 index 00000000..9feec89d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/youtube/YoutubeVideoComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.rooms.items.youtube; + +import com.eu.habbo.habbohotel.items.YoutubeManager; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class YoutubeVideoComposer extends MessageComposer +{ + public final int itemId; + public final YoutubeManager.YoutubeItem item; + + public YoutubeVideoComposer(int itemId, YoutubeManager.YoutubeItem item) + { + this.itemId = itemId; + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.YoutubeMessageComposer2); + this.response.appendInt(this.itemId); + this.response.appendString(this.item.video); + this.response.appendInt(this.item.startTime); + this.response.appendInt(this.item.endTime); + this.response.appendInt(0); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/CantScratchPetNotOldEnoughComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/CantScratchPetNotOldEnoughComposer.java new file mode 100644 index 00000000..c20052a2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/CantScratchPetNotOldEnoughComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CantScratchPetNotOldEnoughComposer extends MessageComposer +{ + private final int currentAge; + private final int requiredAge; + + public CantScratchPetNotOldEnoughComposer(int currentAge, int requiredAge) + { + this.currentAge = currentAge; + this.requiredAge = requiredAge; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CantScratchPetNotOldEnoughComposer); + this.response.appendInt(this.currentAge); + this.response.appendInt(this.requiredAge); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetInformationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetInformationComposer.java new file mode 100644 index 00000000..d5b0670f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetInformationComposer.java @@ -0,0 +1,87 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.pets.PetManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetInformationComposer extends MessageComposer +{ + private final AbstractPet pet; + private final Room room; + + public PetInformationComposer(AbstractPet pet, Room room) + { + this.pet = pet; + this.room = room; + } + + @Override + public ServerMessage compose() + { + double days = Math.floor((Emulator.getIntUnixTimestamp() - this.pet.getCreated()) / (3600 * 24)); + this.response.init(Outgoing.PetInformationComposer); + this.response.appendInt(this.pet.getId()); + this.response.appendString(this.pet.getName()); + if(this.pet instanceof MonsterplantPet) + { + this.response.appendInt(((MonsterplantPet) this.pet).getGrowthStage()); //This equal + this.response.appendInt(7); //... to this means breedable + } + else + { + this.response.appendInt(this.pet.getLevel()); //level + this.response.appendInt(20); //max level + } + this.response.appendInt(this.pet.getExperience()); + this.response.appendInt(PetManager.experiences[this.pet.getLevel() - 1]); //XP Goal + this.response.appendInt(this.pet.getEnergy()); + this.response.appendInt(this.pet.getMaxEnergy()); //Max energy + this.response.appendInt(this.pet.getHappyness()); //this.pet.getHappyness() + this.response.appendInt(100); + this.response.appendInt(this.pet.getRespect()); + this.response.appendInt(this.pet.getUserId()); + this.response.appendInt((int) days + 1); + this.response.appendString(this.room.getFurniOwnerName(pet.getUserId())); //Owner name + + this.response.appendInt(this.pet instanceof MonsterplantPet ? ((MonsterplantPet) this.pet).getRarity() : 0); + this.response.appendBoolean(this.pet instanceof HorsePet && ((HorsePet) this.pet).hasSaddle()); + this.response.appendBoolean(this.pet instanceof HorsePet && ((HorsePet) this.pet).getRider() != null); + this.response.appendInt(0); + this.response.appendInt(this.pet instanceof HorsePet && ((HorsePet) this.pet).anyoneCanRide() ? 1 : 0); + this.response.appendBoolean(this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).canBreed()); //State Grown + this.response.appendBoolean(!(this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).isFullyGrown())); //unknown 1 + this.response.appendBoolean(this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).isDead()); //Dead + this.response.appendInt(this.pet instanceof MonsterplantPet ? ((MonsterplantPet) this.pet).getRarity() : 0); + this.response.appendInt(MonsterplantPet.timeToLive); //Maximum wellbeing + this.response.appendInt(this.pet instanceof MonsterplantPet ? ((MonsterplantPet) this.pet).remainingTimeToLive() : 0); //Remaining Wellbeing + this.response.appendInt(this.pet instanceof MonsterplantPet ? ((MonsterplantPet) this.pet).remainingGrowTime() : 0); + this.response.appendBoolean(this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).isPubliclyBreedable()); //Breedable checkbox + + + /* + public function get _SafeStr_6187():Boolean + { + return (this._SafeStr_10925); + } + public function get _SafeStr_6188():Boolean + { + return (this._SafeStr_10926); + } + public function get _SafeStr_6189():Boolean + { + return (this._SafeStr_10927); + } + public function get _SafeStr_6190():Boolean + { + return (this._SafeStr_10928); + } + */ + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetLevelUpComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetLevelUpComposer.java new file mode 100644 index 00000000..043e1fac --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetLevelUpComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetLevelUpComposer extends MessageComposer +{ + private final AbstractPet pet; + + public PetLevelUpComposer(AbstractPet pet) + { + this.pet = pet; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetLevelUpComposer); + this.response.appendInt(this.pet.getId()); + this.response.appendString(this.pet.getName()); + this.response.appendInt(this.pet.getLevel()); + this.response.appendInt(this.pet.getPetData().getType()); + this.response.appendInt(this.pet.getRace()); + this.response.appendString(this.pet.getColor()); + this.response.appendInt(0); + this.response.appendInt(0); + + //:test 2329 i:0 s:a i:3 i:1 i:1 s:FF00FF i:0 i:0 + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageComposer.java new file mode 100644 index 00000000..535defa5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetPackageComposer extends MessageComposer +{ + private final HabboItem item; + + public PetPackageComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.LeprechaunStarterBundleComposer); + this.response.appendInt(this.item.getId()); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageNameValidationComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageNameValidationComposer.java new file mode 100644 index 00000000..abe1cfbe --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetPackageNameValidationComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetPackageNameValidationComposer extends MessageComposer +{ + public static final int CLOSE_WIDGET = 0; + public static final int NAME_TOO_SHORT = 1; + public static final int NAME_TOO_LONG = 2; + public static final int CONTAINS_INVALID_CHARS = 3; + public static final int FORBIDDEN_WORDS = 4; + + private final int itemId; + private final int errorCode; + private final String errorString; + + public PetPackageNameValidationComposer(int itemId, int errorCode, String errorString) + { + this.itemId = itemId; + this.errorCode = errorCode; + this.errorString = errorString; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetPackageNameValidationComposer); + this.response.appendInt(this.itemId); + this.response.appendInt(this.errorCode); + this.response.appendString(this.errorString); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetStatusUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetStatusUpdateComposer.java new file mode 100644 index 00000000..f127c194 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetStatusUpdateComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetStatusUpdateComposer extends MessageComposer +{ + private final Pet pet; + + public PetStatusUpdateComposer(Pet pet) + { + this.pet = pet; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetStatusUpdateComposer); + this.response.appendInt(this.pet.getRoomUnit().getId()); + this.response.appendInt(this.pet instanceof HorsePet && ((HorsePet) this.pet).anyoneCanRide() ? 1 : 0); + this.response.appendBoolean((this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).canBreed())); //unknown 1 + this.response.appendBoolean((this.pet instanceof MonsterplantPet && !((MonsterplantPet) this.pet).isFullyGrown())); + this.response.appendBoolean(this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).isDead()); //State Grown + this.response.appendBoolean(this.pet instanceof MonsterplantPet && ((MonsterplantPet) this.pet).isPubliclyBreedable()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetTrainingPanelComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetTrainingPanelComposer.java new file mode 100644 index 00000000..3b4a6f6a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/PetTrainingPanelComposer.java @@ -0,0 +1,53 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetCommand; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PetTrainingPanelComposer extends MessageComposer +{ + private final Pet pet; + + public PetTrainingPanelComposer(Pet pet) + { + this.pet = pet; + } + + @Override + public ServerMessage compose() + { + List enabled = new ArrayList(); + Collections.sort(this.pet.getPetData().getPetCommands()); + + this.response.init(Outgoing.PetTrainingPanelComposer); + this.response.appendInt(this.pet.getId()); + this.response.appendInt(this.pet.getPetData().getPetCommands().size()); + + for(PetCommand petCommand : this.pet.getPetData().getPetCommands()) + { + this.response.appendInt(petCommand.id); + + if(this.pet.getLevel() >= petCommand.level) + { + enabled.add(petCommand); + } + } + + Collections.sort(enabled); + + this.response.appendInt(enabled.size()); + + for(PetCommand petCommand : enabled) + { + this.response.appendInt(petCommand.id); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetComposer.java new file mode 100644 index 00000000..7b3619cf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetComposer.java @@ -0,0 +1,73 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.IPetLook; +import com.eu.habbo.habbohotel.pets.MonsterplantPet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import gnu.trove.procedure.TIntObjectProcedure; + +public class RoomPetComposer extends MessageComposer implements TIntObjectProcedure +{ + private final TIntObjectMap pets; + + public RoomPetComposer(AbstractPet pet) + { + this.pets = new TIntObjectHashMap(); + this.pets.put(pet.getId(), pet); + } + + public RoomPetComposer(TIntObjectMap pets) + { + this.pets = pets; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUsersComposer); + this.response.appendInt(this.pets.size()); + this.pets.forEachEntry(this); + return this.response; + } + + @Override + public boolean execute(int a, AbstractPet pet) + { + this.response.appendInt(pet.getId()); + this.response.appendString(pet.getName()); + this.response.appendString(""); + if(pet instanceof IPetLook) + { + this.response.appendString(((IPetLook)pet).getLook()); + } + else + { + this.response.appendString(pet.getPetData().getType() + " " + pet.getRace() + " " + pet.getColor() + " " + ((pet instanceof HorsePet ? (((HorsePet) pet).hasSaddle() ? "3" : "2") + " 2 " + ((HorsePet) pet).getHairStyle() + " " + ((HorsePet) pet).getHairColor() + " 3 " + ((HorsePet) pet).getHairStyle() + " " + ((HorsePet) pet).getHairColor() + (((HorsePet) pet).hasSaddle() ? " 4 9 0" : "") : pet instanceof MonsterplantPet ? (((MonsterplantPet) pet).look.isEmpty() ? "2 1 8 6 0 -1 -1" : ((MonsterplantPet) pet).look) : "2 2 -1 0 3 -1 0"))); + } + this.response.appendInt(pet.getRoomUnit().getId()); + this.response.appendInt32(pet.getRoomUnit().getX()); + this.response.appendInt32(pet.getRoomUnit().getY()); + this.response.appendString(pet.getRoomUnit().getZ() + ""); + this.response.appendInt(0); + this.response.appendInt(2); + this.response.appendInt(pet.getPetData().getType()); + this.response.appendInt(pet.getUserId()); + this.response.appendString(pet.getRoom().getFurniOwnerNames().get(pet.getUserId())); + this.response.appendInt(pet instanceof MonsterplantPet ? ((MonsterplantPet) pet).getRarity() : 1); + this.response.appendBoolean(pet instanceof HorsePet && ((HorsePet) pet).hasSaddle()); + this.response.appendBoolean(false); + this.response.appendBoolean((pet instanceof MonsterplantPet && ((MonsterplantPet) pet).canBreed())); //Has breeasasd// + this.response.appendBoolean(!(pet instanceof MonsterplantPet && ((MonsterplantPet) pet).isFullyGrown())); //unknown 1 + this.response.appendBoolean(pet instanceof MonsterplantPet && ((MonsterplantPet) pet).isDead()); //Can revive // //Also disables fertilize when dead? + this.response.appendBoolean(pet instanceof MonsterplantPet && ((MonsterplantPet) pet).isPubliclyBreedable()); //Breedable checkbox //Toggle breeding permission + this.response.appendInt(pet instanceof MonsterplantPet ? ((MonsterplantPet) pet).getGrowthStage() : pet.getLevel()); + this.response.appendString(""); + + return true; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetExperienceComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetExperienceComposer.java new file mode 100644 index 00000000..183e5b09 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetExperienceComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomPetExperienceComposer extends MessageComposer +{ + private final Pet pet; + private final int amount; + + public RoomPetExperienceComposer(Pet pet, int amount) + { + this.pet = pet; + this.amount = amount; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomPetExperienceComposer); + this.response.appendInt(this.pet.getId()); + this.response.appendInt(this.pet.getRoomUnit().getId()); + this.response.appendInt(this.amount); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetHorseFigureComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetHorseFigureComposer.java new file mode 100644 index 00000000..a97c9afb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetHorseFigureComposer.java @@ -0,0 +1,57 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomPetHorseFigureComposer extends MessageComposer +{ + private final HorsePet pet; + + public RoomPetHorseFigureComposer(HorsePet pet) + { + this.pet = pet; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomPetHorseFigureComposer); + this.response.appendInt(this.pet.getRoomUnit().getId()); + this.response.appendInt(this.pet.getId()); + this.response.appendInt(this.pet.getPetData().getType()); + this.response.appendInt(this.pet.getRace()); + this.response.appendString(this.pet.getColor().toLowerCase()); + + if(this.pet.hasSaddle()) + { + this.response.appendInt(2); + this.response.appendInt(3); + this.response.appendInt(4); + this.response.appendInt(9); + this.response.appendInt(0); + this.response.appendInt(3); + + this.response.appendInt(this.pet.getHairStyle()); + this.response.appendInt(this.pet.getHairColor()); + this.response.appendInt(3); //Saddle type? + this.response.appendInt(this.pet.getHairStyle()); + this.response.appendInt(this.pet.getHairColor()); + } + else + { + this.response.appendInt(1); + this.response.appendInt(2); + this.response.appendInt(2); + this.response.appendInt(this.pet.getHairStyle()); + this.response.appendInt(this.pet.getHairColor()); + this.response.appendInt(3); + this.response.appendInt(this.pet.getHairStyle()); + this.response.appendInt(this.pet.getHairColor()); + } + this.response.appendBoolean(this.pet.hasSaddle()); + this.response.appendBoolean(this.pet.anyoneCanRide()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetRespectComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetRespectComposer.java new file mode 100644 index 00000000..04407873 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/RoomPetRespectComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.rooms.pets; + +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomPetRespectComposer extends MessageComposer +{ + public final static int PET_RESPECTED = 1; + public final static int PET_TREATED = 2; + + private final Pet pet; + private final int type; + + public RoomPetRespectComposer(Pet pet) + { + this.pet = pet; + this.type = 1; + } + + public RoomPetRespectComposer(Pet pet, int type) + { + this.pet = pet; + this.type = type; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomPetRespectComposer); + this.response.appendInt(this.type); + this.response.appendInt(100); + pet.serialize(this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingCompleted.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingCompleted.java new file mode 100644 index 00000000..b6e5a671 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingCompleted.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.pets.breeding; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetBreedingCompleted extends MessageComposer +{ + public final int anInt1; + public final int anInt2; + + public PetBreedingCompleted(int anInt1, int anInt2) + { + this.anInt1 = anInt1; + this.anInt2 = anInt2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetBreedingCompleted); + this.response.appendInt(this.anInt1); + this.response.appendInt(this.anInt2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingFailedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingFailedComposer.java new file mode 100644 index 00000000..beb19994 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingFailedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.pets.breeding; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetBreedingFailedComposer extends MessageComposer +{ + public final int anInt1; + public final int anInt2; + + public PetBreedingFailedComposer(int anInt1, int anInt2) + { + this.anInt1 = anInt1; + this.anInt2 = anInt2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetBreedingFailedComposer); + this.response.appendInt(this.anInt1); + this.response.appendInt(this.anInt2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingResultComposer.java new file mode 100644 index 00000000..2c0d0f9a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingResultComposer.java @@ -0,0 +1,79 @@ +package com.eu.habbo.messages.outgoing.rooms.pets.breeding; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetBreedingResultComposer extends MessageComposer +{ + public final int anInt1; + public final PetBreedingPet petOne; + public final PetBreedingPet petTwo; + + public PetBreedingResultComposer(int anInt1, AbstractPet petOne, String ownerPetOne, AbstractPet petTwo, String ownerPetTwo) + { + this.anInt1 = anInt1; + this.petOne = new PetBreedingPet(petOne, ownerPetOne); + this.petTwo = new PetBreedingPet(petTwo, ownerPetTwo); + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetBreedingResultComposer); + this.response.appendInt(this.anInt1); + this.petOne.serialize(this.response); + this.petTwo.serialize(this.response); + + this.response.appendInt(5); //Levels + { + this.response.appendInt(1); //Percentage + this.response.appendInt(1); //Count + { + this.response.appendInt(1); //Breed + } + this.response.appendInt(1); //Percentage + this.response.appendInt(1); //Count + { + this.response.appendInt(1); //Breed + } + this.response.appendInt(1); //Percentage + this.response.appendInt(1); //Count + { + this.response.appendInt(1); //Breed + } + this.response.appendInt(1); //Percentage + this.response.appendInt(1); //Count + { + this.response.appendInt(1); //Breed + } + } + + this.response.appendInt(0); //Race type + return this.response; + } + + public class PetBreedingPet implements ISerialize + { + public final AbstractPet pet; + public final String ownerName; + + public PetBreedingPet(AbstractPet pet, String ownerName) + { + this.pet = pet; + this.ownerName = ownerName; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendInt(this.pet.getId()); + message.appendString(this.pet.getName()); + message.appendInt(this.pet.getLevel()); + message.appendString(this.pet.getColor()); + message.appendString(this.ownerName); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartComposer.java new file mode 100644 index 00000000..ce8eb156 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.rooms.pets.breeding; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetBreedingStartComposer extends MessageComposer +{ + public final int state; + public final int anInt1; + public final int anInt2; + + /** + * For plants + * @param state + * @param anInt1 + * @param anInt2 + */ + public PetBreedingStartComposer(int state, int anInt1, int anInt2) + { + this.state = state; + this.anInt1 = anInt1; + this.anInt2 = anInt2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetBreedingStartComposer); + this.response.appendInt(this.state); + this.response.appendInt(this.anInt1); + this.response.appendInt(this.anInt2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartFailedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartFailedComposer.java new file mode 100644 index 00000000..d3852c22 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/pets/breeding/PetBreedingStartFailedComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.rooms.pets.breeding; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetBreedingStartFailedComposer extends MessageComposer +{ + public final static int NO_NESTS = 0; + public final static int NO_SUITABLE_NESTS = 1; + public final static int NEST_FULL = 2; + public final static int NOT_OWNER = 3; + public final static int ALREADY_IN_NEST = 4; + public final static int NO_PATH_TO_NEST = 5; + public final static int TOO_TIRED = 6; + public final int reason; + + public PetBreedingStartFailedComposer(int reason) + { + this.reason = reason; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetBreedingStartFailedComposer); + this.response.appendInt(this.reason); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/PromoteOwnRoomsListComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/PromoteOwnRoomsListComposer.java new file mode 100644 index 00000000..eb1d5d6d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/PromoteOwnRoomsListComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.rooms.promotions; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; +import java.util.List; + +public class PromoteOwnRoomsListComposer extends MessageComposer +{ + private final List rooms = new ArrayList(); + + public PromoteOwnRoomsListComposer(List rooms) + { + for(Room room : rooms) + { + if(!room.isPromoted()) + this.rooms.add(room); + } + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PromoteOwnRoomsListComposer); + this.response.appendBoolean(true); + this.response.appendInt(this.rooms.size()); + for(Room room : this.rooms) + { + this.response.appendInt(room.getId()); + this.response.appendString(room.getName()); + this.response.appendBoolean(true); //IDK what the fuck this is. + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java new file mode 100644 index 00000000..9366cd67 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/promotions/RoomPromotionMessageComposer.java @@ -0,0 +1,66 @@ +package com.eu.habbo.messages.outgoing.rooms.promotions; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomPromotion; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomPromotionMessageComposer extends MessageComposer +{ + private final Room room; + private final RoomPromotion roomPromotion; + + public RoomPromotionMessageComposer(Room room, RoomPromotion roomPromotion) + { + this.room = room; + this.roomPromotion = roomPromotion; + } + + @Override + public ServerMessage compose() + { + + this.response.init(Outgoing.RoomEventMessageComposer); + + if (room == null || roomPromotion == null) + { + // RoomID of the promoted room + this.response.appendInt(-1); + // UserID of the room owner + this.response.appendInt(-1); + // Username of the room owner + this.response.appendString(""); + // Promoted status? Seems to only switch to 0 or 1 + this.response.appendInt(0); + this.response.appendInt(0); + // Promotion title + this.response.appendString(""); + // Promotion description + this.response.appendString(""); + // Category ID? Also seen in BuyRoomPromotionEvent (last int) + this.response.appendInt(0); + // On later production these are used to pass the time left in minutes + this.response.appendInt(0); + this.response.appendInt(0); + } + else + { + this.response.appendInt(room.getId()); + this.response.appendInt(room.getOwnerId()); + this.response.appendString(room.getOwnerName()); + + this.response.appendInt(1); + this.response.appendInt(1); + + this.response.appendString(roomPromotion.getTitle()); + this.response.appendString(roomPromotion.getDescription()); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + } + + return this.response; + + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/ChangeNameUpdatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/ChangeNameUpdatedComposer.java new file mode 100644 index 00000000..a0486141 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/ChangeNameUpdatedComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ChangeNameUpdatedComposer extends MessageComposer +{ + private final Habbo habbo; + + public ChangeNameUpdatedComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ChangeNameUpdateComposer); + this.response.appendInt(0); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitIdleComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitIdleComposer.java new file mode 100644 index 00000000..b0cf4fe6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitIdleComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUnitIdleComposer extends MessageComposer +{ + private RoomUnit roomUnit; + + public RoomUnitIdleComposer(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUnitIdleComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendBoolean(this.roomUnit.isIdle()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java new file mode 100644 index 00000000..603eb9c5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java @@ -0,0 +1,75 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUnitOnRollerComposer extends MessageComposer +{ + private final RoomUnit roomUnit; + private final HabboItem roller; + private final RoomTile newLocation; + private final Room room; + + public RoomUnitOnRollerComposer(RoomUnit roomUnit, HabboItem roller, RoomTile newLocation, Room room) + { + this.roomUnit = roomUnit; + this.roller = roller; + this.newLocation = newLocation; + this.room = room; + } + + @Override + public ServerMessage compose() + { + if(!this.room.isLoaded()) + return null; + + if (!this.room.isAllowWalkthrough() && this.roller != null) + { + if (this.room.hasHabbosAt(this.newLocation.x, this.newLocation.y)) + { + return null; + } + } + + this.response.init(Outgoing.ObjectOnRollerComposer); + this.response.appendInt32(this.roomUnit.getX()); + this.response.appendInt32(this.roomUnit.getY()); + this.response.appendInt32(this.newLocation.x); + this.response.appendInt32(this.newLocation.y); + this.response.appendInt(0); + this.response.appendInt(this.roller == null ? 0 : this.roller.getId()); + this.response.appendInt(2); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendString(this.roomUnit.getZ() + ""); + this.response.appendString(this.newLocation.getStackHeight() + ""); + + this.roomUnit.setLocation(room.getLayout().getTile(this.newLocation.x, this.newLocation.y)); + + try + { + if(roller != null) + { + this.roller.onWalkOff(this.roomUnit, this.room, new Object[]{this.roller}); + + HabboItem item = this.room.getTopItemAt(this.newLocation.x, this.newLocation.y); + + if(item != null) + item.onWalkOn(this.roomUnit, this.room, new Object[]{this.roller}); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + this.roomUnit.sitUpdate = true; + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitUpdateUsernameComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitUpdateUsernameComposer.java new file mode 100644 index 00000000..f50d8c71 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitUpdateUsernameComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUnitUpdateUsernameComposer extends MessageComposer +{ + private RoomUnit roomUnit; + private String name; + + public RoomUnitUpdateUsernameComposer(RoomUnit roomUnit, String name) + { + this.roomUnit = roomUnit; + this.name = name; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUnitUpdateUsernameComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendString(this.name); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserActionComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserActionComposer.java new file mode 100644 index 00000000..df1007ad --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserActionComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserActionComposer extends MessageComposer +{ + private RoomUserAction action; + private RoomUnit roomUnit; + + public RoomUserActionComposer(RoomUnit roomUnit, RoomUserAction action) + { + this.roomUnit = roomUnit; + this.action = action; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserActionComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.action.getAction()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDanceComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDanceComposer.java new file mode 100644 index 00000000..387ff9ae --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDanceComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserDanceComposer extends MessageComposer +{ + + private final RoomUnit roomUnit; + + public RoomUserDanceComposer(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserDanceComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.roomUnit.getDanceType().getType()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDataComposer.java new file mode 100644 index 00000000..00e67c93 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserDataComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserDataComposer extends MessageComposer +{ + private final Habbo habbo; + + public RoomUserDataComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserDataComposer); + this.response.appendInt(this.habbo.getRoomUnit() == null ? -1 : this.habbo.getRoomUnit().getId()); + this.response.appendString(this.habbo.getHabboInfo().getLook()); + this.response.appendString(this.habbo.getHabboInfo().getGender().name() + ""); + this.response.appendString(this.habbo.getHabboInfo().getMotto()); + this.response.appendInt(this.habbo.getHabboStats().getAchievementScore()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserEffectComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserEffectComposer.java new file mode 100644 index 00000000..1acc9354 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserEffectComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserEffectComposer extends MessageComposer +{ + private final RoomUnit roomUnit; + + public RoomUserEffectComposer(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserEffectComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.roomUnit.getEffectId()); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserHandItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserHandItemComposer.java new file mode 100644 index 00000000..92cd7f98 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserHandItemComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserHandItemComposer extends MessageComposer +{ + private final RoomUnit roomUnit; + + public RoomUserHandItemComposer(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserHandItemComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.roomUnit.getHandItem()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserIgnoredComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserIgnoredComposer.java new file mode 100644 index 00000000..723f002e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserIgnoredComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserIgnoredComposer extends MessageComposer +{ + public final static int IGNORED = 1; + public final static int MUTED = 2; + public final static int UNIGNORED = 3; + + private final Habbo habbo; + private final int state; + + public RoomUserIgnoredComposer(Habbo habbo, int state) + { + this.habbo = habbo; + this.state = state; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserIgnoredComposer); + this.response.appendInt(this.state); + this.response.appendString(habbo.getHabboInfo().getUsername()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserNameChangedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserNameChangedComposer.java new file mode 100644 index 00000000..a1c1db06 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserNameChangedComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserNameChangedComposer extends MessageComposer +{ + private final Habbo habbo; + private final boolean includePrefix; + + public RoomUserNameChangedComposer(Habbo habbo) + { + this.habbo = habbo; + this.includePrefix = false; + } + + public RoomUserNameChangedComposer(Habbo habbo, boolean includePrefix) + { + this.habbo = habbo; + this.includePrefix = includePrefix; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserNameChangedComposer); + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendInt(this.habbo.getRoomUnit().getId()); + this.response.appendString((this.includePrefix ? Room.PREFIX_FORMAT.replace("%color%", this.habbo.getHabboInfo().getRank().getPrefixColor()).replace("%prefix%", this.habbo.getHabboInfo().getRank().getPrefix()) : "") + this.habbo.getHabboInfo().getUsername()); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserReceivedHandItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserReceivedHandItemComposer.java new file mode 100644 index 00000000..9f295977 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserReceivedHandItemComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserReceivedHandItemComposer extends MessageComposer +{ + private RoomUnit from; + private int handItem; + + public RoomUserReceivedHandItemComposer(RoomUnit from, int handItem) + { + this.from = from; + this.handItem = handItem; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserReceivedHandItemComposer); + this.response.appendInt(this.from.getId()); + this.response.appendInt(this.handItem); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveComposer.java new file mode 100644 index 00000000..217ede81 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserRemoveComposer extends MessageComposer +{ + private final RoomUnit roomUnit; + + public RoomUserRemoveComposer(RoomUnit roomUnit) + { + this.roomUnit = roomUnit; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserRemoveComposer); + this.response.appendString(this.roomUnit.getId() + ""); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveRightsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveRightsComposer.java new file mode 100644 index 00000000..bfb890a3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRemoveRightsComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserRemoveRightsComposer extends MessageComposer +{ + private final Room room; + private final int habboId; + + public RoomUserRemoveRightsComposer(Room room, int habboId) + { + this.room = room; + this.habboId = habboId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserRemoveRightsComposer); + this.response.appendInt(this.room.getId()); + this.response.appendInt(this.habboId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRespectComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRespectComposer.java new file mode 100644 index 00000000..421219a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserRespectComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserRespectComposer extends MessageComposer +{ + private final Habbo habbo; + + public RoomUserRespectComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserRespectComposer); + this.response.appendInt(habbo.getHabboInfo().getId()); + this.response.appendInt(habbo.getHabboStats().respectPointsReceived); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserShoutComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserShoutComposer.java new file mode 100644 index 00000000..8c901dd0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserShoutComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserShoutComposer extends MessageComposer +{ + private RoomChatMessage roomChatMessage; + + public RoomUserShoutComposer(RoomChatMessage roomChatMessage) + { + this.roomChatMessage = roomChatMessage; + } + + @Override + public ServerMessage compose() + { + if(this.roomChatMessage.getMessage().isEmpty()) + return null; + + this.response.init(Outgoing.RoomUserShoutComposer); + this.roomChatMessage.serialize(this.response); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserStatusComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserStatusComposer.java new file mode 100644 index 00000000..5065ad46 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserStatusComposer.java @@ -0,0 +1,104 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.procedure.TObjectObjectProcedure; +import gnu.trove.set.hash.THashSet; + +import java.util.Collection; + +public class RoomUserStatusComposer extends MessageComposer +{ + private Collection habbos; + private THashSet roomUnits; + + public RoomUserStatusComposer(RoomUnit roomUnit) + { + this.roomUnits = new THashSet(); + this.roomUnits.add(roomUnit); + } + + public RoomUserStatusComposer(THashSet roomUnits, boolean value) + { + this.roomUnits = roomUnits; + } + + public RoomUserStatusComposer(Collection habbos) + { + this.habbos = habbos; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserStatusComposer); + if(this.roomUnits != null) + { + this.response.appendInt(this.roomUnits.size()); + for(RoomUnit roomUnit : this.roomUnits) + { + this.response.appendInt(roomUnit.getId()); + this.response.appendInt32(roomUnit.getPreviousLocation().x); + this.response.appendInt32(roomUnit.getPreviousLocation().y); + this.response.appendString(roomUnit.getPreviousLocation().getStackHeight() + ""); + this.response.appendInt(roomUnit.getHeadRotation().getValue()); + this.response.appendInt(roomUnit.getBodyRotation().getValue()); + + final String[] status = {"/"}; + synchronized (roomUnit.getStatus()) + { + roomUnit.getStatus().forEachEntry(new TObjectObjectProcedure() + { + @Override + public boolean execute(String key, String value) + { + status[0] = status[0] + key + " " + value + "/"; + return true; + } + }); + } + + this.response.appendString(status[0]); + roomUnit.setPreviousLocation(roomUnit.getCurrentLocation()); + roomUnit.getPreviousLocation().setStackHeight(roomUnit.getZ()); + } + } + else { + synchronized (this.habbos) + { + this.response.appendInt(this.habbos.size()); + for (Habbo habbo : this.habbos) + { + this.response.appendInt(habbo.getRoomUnit().getId()); + this.response.appendInt32(habbo.getRoomUnit().getPreviousLocation().x); + this.response.appendInt32(habbo.getRoomUnit().getPreviousLocation().y); + this.response.appendString(habbo.getRoomUnit().getPreviousLocation().getStackHeight() + ""); + this.response.appendInt(habbo.getRoomUnit().getHeadRotation().getValue()); + this.response.appendInt(habbo.getRoomUnit().getBodyRotation().getValue()); + + final String[] status = {"/"}; + synchronized (habbo.getRoomUnit().getStatus()) + { + habbo.getRoomUnit().getStatus().forEachEntry(new TObjectObjectProcedure() + { + @Override + public boolean execute(String key, String value) + { + status[0] = status[0] + key + " " + value + "/"; + return true; + } + }); + } + this.response.appendString(status[0]); + habbo.getRoomUnit().setPreviousLocation(habbo.getRoomUnit().getCurrentLocation()); + habbo.getRoomUnit().getPreviousLocation().setStackHeight(habbo.getRoomUnit().getZ()); + } + } + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTagsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTagsComposer.java new file mode 100644 index 00000000..8a855928 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTagsComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserTagsComposer extends MessageComposer +{ + private final Habbo habbo; + + public RoomUserTagsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserTagsComposer); + this.response.appendInt(this.habbo.getRoomUnit().getId()); + this.response.appendInt(this.habbo.getHabboStats().tags.length); + + for(String tag : this.habbo.getHabboStats().tags) + { + this.response.appendString(tag); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTalkComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTalkComposer.java new file mode 100644 index 00000000..1631fba1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTalkComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserTalkComposer extends MessageComposer +{ + + private RoomChatMessage roomChatMessage; + + public RoomUserTalkComposer(RoomChatMessage roomChatMessage) + { + this.roomChatMessage = roomChatMessage; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserTalkComposer); + + if(this.roomChatMessage.getMessage().isEmpty()) + return null; + + this.roomChatMessage.serialize(this.response); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTypingComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTypingComposer.java new file mode 100644 index 00000000..800b07f0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserTypingComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserTypingComposer extends MessageComposer +{ + private final RoomUnit roomUnit; + private final boolean typing; + + public RoomUserTypingComposer(RoomUnit roomUnit, boolean typing) + { + this.roomUnit = roomUnit; + this.typing = typing; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserTypingComposer); + this.response.appendInt(this.roomUnit.getId()); + this.response.appendInt(this.typing ? 1 : 0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserUnbannedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserUnbannedComposer.java new file mode 100644 index 00000000..31bef813 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserUnbannedComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserUnbannedComposer extends MessageComposer +{ + private final Room room; + private final int userId; + + public RoomUserUnbannedComposer(Room room, int userId) + { + this.room = room; + this.userId = userId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserUnbannedComposer); + this.response.appendInt(this.room.getId()); + this.response.appendInt(this.userId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserWhisperComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserWhisperComposer.java new file mode 100644 index 00000000..4585f392 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUserWhisperComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUserWhisperComposer extends MessageComposer +{ + private final RoomChatMessage roomChatMessage; + + public RoomUserWhisperComposer(RoomChatMessage roomChatMessage) + { + this.roomChatMessage = roomChatMessage; + } + @Override + public ServerMessage compose() + { + if(this.roomChatMessage.getMessage().isEmpty()) + return null; + + this.response.init(Outgoing.RoomUserWhisperComposer); + this.roomChatMessage.serialize(this.response); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersAddGuildBadgeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersAddGuildBadgeComposer.java new file mode 100644 index 00000000..8f0f191f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersAddGuildBadgeComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUsersAddGuildBadgeComposer extends MessageComposer +{ + public final Guild guild; + + public RoomUsersAddGuildBadgeComposer(Guild guild) + { + this.guild = guild; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUsersGuildBadgesComposer); + this.response.appendInt(1); + this.response.appendInt(this.guild.getId()); + this.response.appendString(this.guild.getBadge()); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java new file mode 100644 index 00000000..7f33e2da --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java @@ -0,0 +1,173 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.iterator.TIntObjectIterator; +import gnu.trove.map.TIntObjectMap; + +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; + +public class RoomUsersComposer extends MessageComposer +{ + private Habbo habbo; + private Collection habbos; + private Bot bot; + private Collection bots; + + public RoomUsersComposer(Habbo habbo) + { + this.habbo = habbo; + } + + public RoomUsersComposer(Collection habbos) + { + this.habbos = habbos; + } + + public RoomUsersComposer(Bot bot) + { + this.bot = bot; + } + + public RoomUsersComposer(Collection bots, boolean isBot) + { + this.bots = bots; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUsersComposer); + if(this.habbo != null) { + this.response.appendInt(1); + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendString(this.habbo.getHabboInfo().getMotto()); + this.response.appendString(this.habbo.getHabboInfo().getLook()); + this.response.appendInt(this.habbo.getRoomUnit().getId()); //Room Unit ID + this.response.appendInt32(this.habbo.getRoomUnit().getX()); + this.response.appendInt32(this.habbo.getRoomUnit().getY()); + this.response.appendString(this.habbo.getRoomUnit().getZ() + ""); + this.response.appendInt(this.habbo.getRoomUnit().getBodyRotation().getValue()); + this.response.appendInt(1); + this.response.appendString(this.habbo.getHabboInfo().getGender().name().toUpperCase()); + this.response.appendInt(this.habbo.getHabboStats().guild != 0 ? this.habbo.getHabboStats().guild : -1); + this.response.appendInt(this.habbo.getHabboStats().guild != 0 ? 1 : -1); + + String name = ""; + if(this.habbo.getHabboStats().guild != 0) + { + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(this.habbo.getHabboStats().guild); + + if(g != null) + name = g.getName(); + } + this.response.appendString(name); + + this.response.appendString(""); + this.response.appendInt(this.habbo.getHabboStats().getAchievementScore()); + this.response.appendBoolean(true); + } + else if(this.habbos != null) + { + this.response.appendInt(this.habbos.size()); + for (Habbo habbo : this.habbos) + { + if (habbo != null) + { + this.response.appendInt(habbo.getHabboInfo().getId()); + this.response.appendString(habbo.getHabboInfo().getUsername()); + this.response.appendString(habbo.getHabboInfo().getMotto()); + this.response.appendString(habbo.getHabboInfo().getLook()); + this.response.appendInt(habbo.getRoomUnit().getId()); //Room Unit ID + this.response.appendInt32(habbo.getRoomUnit().getX()); + this.response.appendInt32(habbo.getRoomUnit().getY()); + this.response.appendString(habbo.getRoomUnit().getZ() + ""); + this.response.appendInt(habbo.getRoomUnit().getBodyRotation().getValue()); + this.response.appendInt(1); + this.response.appendString(habbo.getHabboInfo().getGender().name().toUpperCase()); + this.response.appendInt(habbo.getHabboStats().guild != 0 ? habbo.getHabboStats().guild : -1); + this.response.appendInt(habbo.getHabboStats().guild != 0 ? habbo.getHabboStats().guild : -1); + String name = ""; + if (habbo.getHabboStats().guild != 0) + { + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(habbo.getHabboStats().guild); + + if (g != null) + name = g.getName(); + } + this.response.appendString(name); + this.response.appendString(""); + this.response.appendInt(habbo.getHabboStats().getAchievementScore()); + this.response.appendBoolean(true); + } + } + } + else if(this.bot != null) + { + this.response.appendInt(1); + this.response.appendInt(0 - this.bot.getId()); + this.response.appendString(this.bot.getName()); + this.response.appendString(this.bot.getMotto()); + this.response.appendString(this.bot.getFigure()); + this.response.appendInt(this.bot.getRoomUnit().getId()); + this.response.appendInt32(this.bot.getRoomUnit().getX()); + this.response.appendInt32(this.bot.getRoomUnit().getY()); + this.response.appendString(this.bot.getRoomUnit().getZ() + ""); + this.response.appendInt(this.bot.getRoomUnit().getBodyRotation().getValue()); + this.response.appendInt(4); + this.response.appendString(this.bot.getGender().name().toUpperCase()); + this.response.appendInt(this.bot.getOwnerId()); + this.response.appendString(this.bot.getOwnerName()); + this.response.appendInt(10); + this.response.appendShort(0); + this.response.appendShort(1); + this.response.appendShort(2); + this.response.appendShort(3); + this.response.appendShort(4); + this.response.appendShort(5); + this.response.appendShort(6); + this.response.appendShort(7); + this.response.appendShort(8); + this.response.appendShort(9); + } + else if(this.bots != null) + { + this.response.appendInt(this.bots.size()); + for(Bot bot : this.bots) + { + this.response.appendInt(0 - bot.getId()); + this.response.appendString(bot.getName()); + this.response.appendString(bot.getMotto()); + this.response.appendString(bot.getFigure()); + this.response.appendInt(bot.getRoomUnit().getId()); + this.response.appendInt32(bot.getRoomUnit().getX()); + this.response.appendInt32(bot.getRoomUnit().getY()); + this.response.appendString(bot.getRoomUnit().getZ() + ""); + this.response.appendInt(bot.getRoomUnit().getBodyRotation().getValue()); + this.response.appendInt(4); + this.response.appendString(bot.getGender().name().toUpperCase()); + this.response.appendInt(bot.getOwnerId()); + this.response.appendString(bot.getOwnerName()); + this.response.appendInt(10); + this.response.appendShort(0); + this.response.appendShort(1); + this.response.appendShort(2); + this.response.appendShort(3); + this.response.appendShort(4); + this.response.appendShort(5); + this.response.appendShort(6); + this.response.appendShort(7); + this.response.appendShort(8); + this.response.appendShort(9); + } + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersGuildBadgesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersGuildBadgesComposer.java new file mode 100644 index 00000000..b2fa8606 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersGuildBadgesComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.rooms.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectObjectProcedure; + +public class RoomUsersGuildBadgesComposer extends MessageComposer +{ + public final THashMap guildBadges; + + public RoomUsersGuildBadgesComposer(THashMap guildBadges) + { + this.guildBadges = guildBadges; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUsersGuildBadgesComposer); + this.response.appendInt(this.guildBadges.size()); + + this.guildBadges.forEachEntry(new TObjectObjectProcedure() + { + @Override + public boolean execute(Integer guildId, String badge) + { + response.appendInt(guildId); + response.appendString(badge); + return true; + } + }); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading.zip b/src/main/java/com/eu/habbo/messages/outgoing/trading.zip new file mode 100644 index 0000000000000000000000000000000000000000..bbdc1e57a3f44d42dc22218587ef6523f9dfc9f7 GIT binary patch literal 3385 zcmai$c{G%7AI3)-G$d&($y#R0K9aR8!z5-ZlYNb8#=h^eWsk@*QY2gU?I(l~VhB;T zhzthv3n5t|jJ(r%{}6f4`#gW#=YIb9Jm*~3eP7oXjiNmY1^@sIfX87u>hOH;21ObG zK$#W*I7|KN;fBH4I$2BTQddhj7HjF^VTn_7c64!ew{#P?!+2rR5=QO9U@Q?!zzK}F z-mt@%nN1(TkVnEyw*=iddyI3!%&^` z+z6@>YCM|pG;-)s$TFVuDq}sgamKGCLG`pjUr!Ru@Dv1*-I<-1QOaO`sR(!b5+)s; zhE{wQ*96p(KECXS$=(H|c-+SfC|mJdZKOZBz@{AvWMDQZmb>jJKE=~IIzI-P`}V2v z{Ah`lJXv~>Yb$^3UwNbmmk7XLs)O;kvhZqycPfFoaJW;O)FD^eT+YxfTNyDc<-*P; z8cC@1AbApWuP4s&I&q^pzDuq+ov1$cfNhqPHtsRxMX?CZMx&agS>L7{Q_t>PIMssF zyq^0~CXeVK8*HK^)JODoJl%`W{0+KQ@jfsEy-$3(<%do< zs`xHc@%aymujW9Ne82Qbcr*J@7-#qra92&-(P-c^vkWwpZ9embe!;r2cEG2I5d_|l z4!aw$oE`YclMk+OY38o`O@ArYrUb>zWIjpqPZh7rv2pylzb;7j45sT;wsVi0E{~C+IDJiS-SLf`na6hHvI%@#970>^ncc-KJ+CWr5 z^uh>Xfth0)JJ7LWhQxyN5lHY?8&cjDk?gM&;tdo{m~DAt>pu(f{RqrCi_|K6lmNb! z*DLc~CgHMq{WuEj^o8++;`69gsY<2>J(kiPnD2Vcd^mLB;>}J5-+m*7uco7h&<|CP zEFp|f&i6hph~0ta4i44N5kf(w1a>u^g4QJcGYcs;)n`ma>XbmuGb0}o%SP3DkNSS| zHPfN2wPbp>MF3JZ6#09-n zwI~Ui3^it8FB_c#8`by`RZU7Cj1iQ=Xufcv~G0w z9A0l0%k!*EPY^qhjuHsBuUA>7nU3^;e~xqfMgQ|!U<-#p*6F#4*94DOo5t2D;CMLP z=BzOT?`;F)vh<8Ky0tE^>_M10s_%#8v~U3zfyr5ji~WZ0#@O96N>-tsC|P7*oR;3ZI7qtzK#$ zq1u#AF^;!dnIw2t`o;pk5EiyRG2{QTx4isVC}h52X2aJY%}fp5#%%j0QKT!9Co1P! zvz*PT02}nk;GB3#`CIP*+)ntiDn*@gC9aK+R7?p`ZVh9fy0;pOlG^-il_DMA9NZ~1 z$U;kWUh#LY>Dq{2;`2Ts_pN4VO>JZgR5TRz#{PlK4iSHw2hboAZcIv*vRA^Z7v*Cg zbT;PQH3d8O$9=ihZ>NZ5|6=I75^}x2oj**;$IR?GDK2nGr-d<1lb*Roxb5|?m(Vnc zKLnyCZ9L}aOKqw+nbgb9ckn3bcwpQ-_NkMkZEoKJW4R}>c9~qx7E}BUQ^`cv*nMB1 zdy%$v-GSi1iZ5o0mO1mP;4qX+PgGI)K9m>t`KlJa;{ zFj%^4@o5B{^E*=Wq1szlaY#$7osfvy!~(@hGyd0;?-&(xfz8)LnH!nrsf*?o=7?x> zjp)Ya)>VB+my*DXT;VjQ6T;~t;!g>65acx94%Cy=1uHk#66#hpISYI%r%!i!b#uCj zIzGHU-I@M|Bc$WFJW7PAu{4MWx!O?0-zbIHc>4JcR~+icEQdbP#rUr53v$Gk`^qI3 zmmsyuD`gJ#(mfcG!Ykk>#0DOr@5@nP!ZXkcu0KtxalBB@*~&vp0>_Ujn!- zZh+g!t_Y!;)mMQL07aMgIA z@}3>Pi%-i(s5FskNBvO%;M}2hsAFs$_F0mvV@94Qt)t&^6_ku!$90g)0xx}6@IhC_~%?}cN zETTROLdL3kn$+dlmtYy(N~NqW;u%wZ*Rz0M3|5J2mP^IAis!frf_d9D zrdVL0I?sU;S?BjMFq0GBJjtzR>e$=5jvrHb0apc>Cq-DZy2>MPiAI2*W_P$i=ofkR zd`Lu^u9}A6;1A@5&j3}3kK0ag<#)w;<@8u~oloY&vD1xATcnf8LrcWk?PpSBlW57O z5T=QBb=qCkIRAxZOsdsa&ll8Zty=}*0Lb=U2d z4XUrJQy7~1$VXBfM>a&nfS8U!`a9M^>1FxGmy#-PfeTAd>x|fOZHqtQKd}f~@$wIK z7scMxGHOQ-t^)Twg;PDEYHz*)EprZxcRcU-98pRZda(&4kK0Ez)4{buszxY}aVuwkR=L`DSUmo2;Tnh+{L*2bGwUG@ra>6J!5S%t%AFHVY1xFy_^I zdZ{a%_;K{=0|6^*#_e-)&=j_NS*)O3f8bN+PzL22o$*Lkw-fz8u)`@&c;8t^)_TyT z4x^V|0he-wy9ZL=#w6<~f8>L?J5Bmbu8M_s_x7)>(_a9x2ot^*y literal 0 HcmV?d00001 diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/OtherTradingDisabledComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/OtherTradingDisabledComposer.java new file mode 100644 index 00000000..508fc4b8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/OtherTradingDisabledComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class OtherTradingDisabledComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.OtherTradingDisabledComposer); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeAcceptedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeAcceptedComposer.java new file mode 100644 index 00000000..b9071e24 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeAcceptedComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTradeUser; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeAcceptedComposer extends MessageComposer +{ + private final RoomTradeUser tradeUser; + + public TradeAcceptedComposer(RoomTradeUser tradeUser) + { + this.tradeUser = tradeUser; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TradeAcceptedComposer); + this.response.appendInt(this.tradeUser.getHabbo().getHabboInfo().getId()); + this.response.appendInt32(this.tradeUser.getAccepted()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCloseWindowComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCloseWindowComposer.java new file mode 100644 index 00000000..fc67b2d6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCloseWindowComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeCloseWindowComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TradeCloseWindowComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeClosedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeClosedComposer.java new file mode 100644 index 00000000..baf133b0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeClosedComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeClosedComposer extends MessageComposer +{ + public static final int USER_CANCEL_TRADE = 0; + public static final int ITEMS_NOT_FOUND = 1; + + private final int userId; + private final int errorCode; + + public TradeClosedComposer(int userId, int errorCode) + { + this.userId = userId; + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TradeStoppedComposer); + this.response.appendInt(this.userId); + this.response.appendInt(this.errorCode); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCompleteComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCompleteComposer.java new file mode 100644 index 00000000..335cba30 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeCompleteComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeCompleteComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownTradeComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartComposer.java new file mode 100644 index 00000000..6a89e264 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.rooms.RoomTradeUser; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeStartComposer extends MessageComposer +{ + private RoomTrade roomTrade; + private int state = 1; + + public TradeStartComposer(RoomTrade roomTrade) + { + this.roomTrade = roomTrade; + } + + public TradeStartComposer(RoomTrade roomTrade, int state) + { + this.roomTrade = roomTrade; + this.state = state; + } + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TradeStartComposer); + for(RoomTradeUser tradeUser : this.roomTrade.getRoomTradeUsers()) + { + this.response.appendInt(tradeUser.getHabbo().getHabboInfo().getId()); + this.response.appendInt(this.state); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartFailComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartFailComposer.java new file mode 100644 index 00000000..7e4cbbc8 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeStartFailComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeStartFailComposer extends MessageComposer +{ + public static final int HOTEL_TRADING_NOT_ALLOWED = 1; + public static final int YOU_TRADING_OFF = 2; + public static final int TARGET_TRADING_NOT_ALLOWED = 4; + public static final int ROOM_TRADING_NOT_ALLOWED = 6; + public static final int YOU_ALREADY_TRADING = 7; + public static final int TARGET_ALREADY_TRADING = 8; + + private final String username; + private final int code; + + public TradeStartFailComposer(int code) + { + this.code = code; + this.username = ""; + } + + public TradeStartFailComposer(int code, String username) + { + this.code = code; + this.username = username; + } + + public ServerMessage compose() + { + this.response.init(Outgoing.TradeStartFailComposer); + this.response.appendInt(code); + this.response.appendString(username); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeUpdateComposer.java new file mode 100644 index 00000000..8528d95e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradeUpdateComposer.java @@ -0,0 +1,51 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.habbohotel.items.FurnitureType; +import com.eu.habbo.habbohotel.rooms.RoomTrade; +import com.eu.habbo.habbohotel.rooms.RoomTradeUser; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradeUpdateComposer extends MessageComposer +{ + private RoomTrade roomTrade; + + public TradeUpdateComposer(RoomTrade roomTrade) + { + this.roomTrade = roomTrade; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TradeUpdateComposer); + for(RoomTradeUser roomTradeUser : this.roomTrade.getRoomTradeUsers()) + { + this.response.appendInt(roomTradeUser.getHabbo().getHabboInfo().getId()); + this.response.appendInt(roomTradeUser.getItems().size()); + + for(HabboItem item : roomTradeUser.getItems()) + { + this.response.appendInt(item.getId()); + this.response.appendString(item.getBaseItem().getType().code); + this.response.appendInt(item.getId()); + this.response.appendInt(item.getBaseItem().getSpriteId()); + this.response.appendInt(0); + this.response.appendBoolean(item.getBaseItem().allowInventoryStack() && !item.isLimited()); + item.serializeExtradata(this.response); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + + if(item.getBaseItem().getType() == FurnitureType.FLOOR) + this.response.appendInt(0); + } + + this.response.appendInt(0); + this.response.appendInt(0); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/TradingWaitingConfirmComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradingWaitingConfirmComposer.java new file mode 100644 index 00000000..600da305 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/TradingWaitingConfirmComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TradingWaitingConfirmComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TradingWaitingConfirmComposer); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/trading/YouTradingDisabledComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/trading/YouTradingDisabledComposer.java new file mode 100644 index 00000000..8892c63d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/trading/YouTradingDisabledComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.trading; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class YouTradingDisabledComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.YouTradingDisabledComposer); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/BuildersClubExpiredComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/BuildersClubExpiredComposer.java new file mode 100644 index 00000000..9b805cce --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/BuildersClubExpiredComposer.java @@ -0,0 +1,20 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class BuildersClubExpiredComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.BuildersClubExpiredComposer); + this.response.appendInt(Integer.MAX_VALUE); + this.response.appendInt(0); + this.response.appendInt(100); + this.response.appendInt(100000); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/CloseWebPageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/CloseWebPageComposer.java new file mode 100644 index 00000000..e57dcbf4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/CloseWebPageComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class CloseWebPageComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CloseWebPageComposer); + //Empty body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ClubDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ClubDataComposer.java new file mode 100644 index 00000000..149ff1c6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ClubDataComposer.java @@ -0,0 +1,81 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.catalog.ClubOffer; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Calendar; +import java.util.List; + +public class ClubDataComposer extends MessageComposer +{ + private final int windowId; + private final Habbo habbo; + + public ClubDataComposer(Habbo habbo, int windowId) + { + this.habbo = habbo; + this.windowId = windowId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ClubDataComposer); + + List offers = Emulator.getGameEnvironment().getCatalogManager().getClubOffers(); + this.response.appendInt(offers.size()); + + //TODO Change this to a seperate table. + for(ClubOffer offer : offers) + { + this.response.appendInt(offer.getId()); + this.response.appendString(offer.getName()); + this.response.appendBoolean(false); //unused + this.response.appendInt(offer.getCredits()); + this.response.appendInt(offer.getPoints()); + this.response.appendInt(offer.getPointsType()); + this.response.appendBoolean(offer.isVip()); + + long seconds = offer.getDays() * 86400l; + + long secondsTotal = seconds; + + int totalYears = (int)Math.floor((int)seconds / 86400 * 31 * 12); + seconds -= totalYears * 86400 * 31 * 12; + + int totalMonths = (int)Math.floor((int)seconds / 86400 * 31); + seconds -= totalMonths * 86400 * 31; + + int totalDays = (int)Math.floor((int)seconds / 86400); + seconds -= totalDays * 86400; + + this.response.appendInt((int) secondsTotal / 86400 / 31); + this.response.appendInt((int) seconds); + this.response.appendBoolean(false); //giftable + this.response.appendInt((int) seconds); + + int endTimestamp = habbo.getHabboStats().getClubExpireTimestamp(); + + if (endTimestamp < Emulator.getIntUnixTimestamp()) + { + endTimestamp = Emulator.getIntUnixTimestamp(); + } + + endTimestamp += secondsTotal; + + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(endTimestamp * 1000l); + this.response.appendInt(cal.get(Calendar.YEAR)); + this.response.appendInt(cal.get(Calendar.MONTH) + 1); + this.response.appendInt(cal.get(Calendar.DAY_OF_MONTH)); + } + + this.response.appendInt(this.windowId); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/CompetitionEntrySubmitResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/CompetitionEntrySubmitResultComposer.java new file mode 100644 index 00000000..4b68df05 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/CompetitionEntrySubmitResultComposer.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class CompetitionEntrySubmitResultComposer extends MessageComposer +{ + private final int unknownInt1; + private final String unknownString1; + private final int result; + private final List unknownStringList1; + private final List unknownStringList2; + + public CompetitionEntrySubmitResultComposer(int unknownInt1, String unknownString1, int result, List unknownStringList1, List unknownStringList2) + { + this.unknownInt1 = unknownInt1; + this.unknownString1 = unknownString1; + this.result = result; + this.unknownStringList1 = unknownStringList1; + this.unknownStringList2 = unknownStringList2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.CompetitionEntrySubmitResultComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendString(this.unknownString1); + this.response.appendInt(this.result); + this.response.appendInt(this.unknownStringList1.size()); + for (String s : this.unknownStringList1) + { + this.response.appendString(s); + } + + this.response.appendInt(this.unknownStringList2.size()); + for (String s : this.unknownStringList2) + { + this.response.appendString(s); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ConvertedForwardToRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ConvertedForwardToRoomComposer.java new file mode 100644 index 00000000..919b47a9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ConvertedForwardToRoomComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ConvertedForwardToRoomComposer extends MessageComposer +{ + private final String unknownString1; + private final int unknownInt1; + + public ConvertedForwardToRoomComposer(String unknownString1, int unknownInt1) + { + this.unknownString1 = unknownString1; + this.unknownInt1 = unknownInt1; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ConvertedForwardToRoomComposer); + this.response.appendString(this.unknownString1); + this.response.appendInt(this.unknownInt1); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/EpicPopupFrameComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/EpicPopupFrameComposer.java new file mode 100644 index 00000000..10bb19bf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/EpicPopupFrameComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class EpicPopupFrameComposer extends MessageComposer +{ + public static final String LIBRARY_URL = "${image.library.url}"; + private String assetURI; + + public EpicPopupFrameComposer(String assetURI) + { + this.assetURI = assetURI; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.EpicPopupFrameComposer); + this.response.appendString(this.assetURI); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ErrorLoginComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ErrorLoginComposer.java new file mode 100644 index 00000000..9f842721 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ErrorLoginComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ErrorLoginComposer extends MessageComposer +{ + private final int errorCode; + + public ErrorLoginComposer(int errorCode) + { + this.errorCode = errorCode; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ErrorLoginComposer); + this.response.appendInt(this.errorCode); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ExtendClubMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ExtendClubMessageComposer.java new file mode 100644 index 00000000..3d213512 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ExtendClubMessageComposer.java @@ -0,0 +1,97 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Calendar; + +public class ExtendClubMessageComposer extends MessageComposer +{ + private final Habbo habbo; + private final CatalogItem item; + private final int unknownInt1; + private final int unknownInt2; + private final int unknownInt3; + private final int unknownInt4; + + public ExtendClubMessageComposer(Habbo habbo, CatalogItem item, int unknownInt1, int unknownInt2, int unknownInt3, int unknownInt4) + { + this.habbo = habbo; + this.item = item; + this.unknownInt1 = unknownInt1; + this.unknownInt2 = unknownInt2; + this.unknownInt3 = unknownInt3; + this.unknownInt4 = unknownInt4; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ExtendClubMessageComposer); + this.response.appendInt(item.getId()); + this.response.appendString(item.getName()); + this.response.appendBoolean(false); //unused + this.response.appendInt(item.getCredits()); + this.response.appendInt(item.getPoints()); + this.response.appendInt(item.getPointsType()); + this.response.appendBoolean(item.getName().contains("_VIP_")); + + String[] data = item.getName().replace("_VIP_", "_").toLowerCase().split("_"); + + long seconds = 0; + + if(data[3].toLowerCase().startsWith("day")) + { + seconds = 86400 * Integer.valueOf(data[2]); + } + else if(data[3].toLowerCase().startsWith("month")) + { + seconds = 86400 * 31 * Integer.valueOf(data[2]); + } + else if(data[3].toLowerCase().startsWith("year")) + { + seconds = 86400 * 31 * 12 * Integer.valueOf(data[2]); + } + + long secondsTotal = seconds; + + int totalYears = (int)Math.floor((int)seconds / 86400 * 31 * 12); + seconds -= totalYears * 86400 * 31 * 12; + + int totalMonths = (int)Math.floor((int)seconds / 86400 * 31); + seconds -= totalMonths * 86400 * 31; + + int totalDays = (int)Math.floor((int)seconds / 86400); + seconds -= totalDays * 86400; + + this.response.appendInt((int) secondsTotal / 86400 / 31); + this.response.appendInt((int) seconds); + this.response.appendBoolean(false); //giftable + this.response.appendInt((int) seconds); + + int endTimestamp = habbo.getHabboStats().getClubExpireTimestamp(); + + if (endTimestamp < Emulator.getIntUnixTimestamp()) + { + endTimestamp = Emulator.getIntUnixTimestamp(); + } + + endTimestamp += secondsTotal; + + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(endTimestamp * 1000l); + this.response.appendInt(cal.get(Calendar.YEAR)); + this.response.appendInt(cal.get(Calendar.MONTH) + 1); + this.response.appendInt(cal.get(Calendar.DAY_OF_MONTH)); + + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.unknownInt2); + this.response.appendInt(this.unknownInt3); + this.response.appendInt(this.unknownInt4); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboMallComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboMallComposer.java new file mode 100644 index 00000000..063ab5b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboMallComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HabboMallComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HabboMallComposer); + //Empty body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboNameChangedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboNameChangedComposer.java new file mode 100644 index 00000000..6854fe42 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HabboNameChangedComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class HabboNameChangedComposer extends MessageComposer +{ + private final int unknownInt; + private final String name; + private final List unknownStringList; + + public HabboNameChangedComposer(int unknownInt, String name, List unknownStringList) + { + this.unknownInt = unknownInt; + this.name = name; + this.unknownStringList = unknownStringList; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HabboNameChangedComposer); + this.response.appendInt(this.unknownInt); + this.response.appendString(this.name); + this.response.appendInt(this.unknownStringList.size()); + for (String s : this.unknownStringList) + { + this.response.appendString(s); + } + + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelClosedAndOpensComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelClosedAndOpensComposer.java new file mode 100644 index 00000000..5ae39503 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelClosedAndOpensComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelClosedAndOpensComposer extends MessageComposer +{ + private int hour; + private int minute; + + public HotelClosedAndOpensComposer(int hour, int minute) + { + this.hour = hour; + this.minute = minute; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelClosedAndOpensComposer); + this.response.appendInt(this.hour); + this.response.appendInt(this.minute); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewExpiringCatalogPageCommposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewExpiringCatalogPageCommposer.java new file mode 100644 index 00000000..ccc7c6d6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewExpiringCatalogPageCommposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewExpiringCatalogPageCommposer extends MessageComposer +{ + private final CatalogPage page; + private final String image; + + public HotelViewExpiringCatalogPageCommposer(CatalogPage page, String image) + { + this.page = page; + this.image = image; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewExpiringCatalogPageCommposer); + this.response.appendString(this.page.getCaption()); + this.response.appendInt(this.page.getId()); + this.response.appendString(this.image); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewHideCommunityVoteButtonComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewHideCommunityVoteButtonComposer.java new file mode 100644 index 00000000..342a5745 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewHideCommunityVoteButtonComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewHideCommunityVoteButtonComposer extends MessageComposer +{ + private final boolean unknownBoolean; + + public HotelViewHideCommunityVoteButtonComposer(boolean unknownBoolean) + { + this.unknownBoolean = unknownBoolean; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewHideCommunityVoteButtonComposer); + this.response.appendBoolean(this.unknownBoolean); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewNextLTDAvailableComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewNextLTDAvailableComposer.java new file mode 100644 index 00000000..2e13e386 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/HotelViewNextLTDAvailableComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class HotelViewNextLTDAvailableComposer extends MessageComposer +{ + private final int unknownInt1; + private final int pageId; + private final int unknownInt2; + private final String unknownString1; + + public HotelViewNextLTDAvailableComposer(int unknownInt1, int pageId, int unknownInt2, String unknownString1) + { + this.unknownInt1 = unknownInt1; + this.pageId = pageId; + this.unknownInt2 = unknownInt2; + this.unknownString1 = unknownString1; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.HotelViewNextLTDAvailableComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.pageId); + this.response.appendInt(this.unknownInt2); + this.response.appendString(this.unknownString1); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemExtraDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemExtraDataComposer.java new file mode 100644 index 00000000..1a6f0cda --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemExtraDataComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ItemExtraDataComposer extends MessageComposer +{ + private final HabboItem item; + + public ItemExtraDataComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ItemExtraDataComposer); + this.response.appendString(this.item.getId() + ""); + this.item.serializeExtradata(this.response); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemStateComposer2.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemStateComposer2.java new file mode 100644 index 00000000..f15b6d9b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemStateComposer2.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ItemStateComposer2 extends MessageComposer +{ + private final int id; + private final int value; + + public ItemStateComposer2(int id, int value) + { + this.id = id; + this.value = value; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ItemStateComposer2); + this.response.appendInt(this.id); + this.response.appendInt(this.value); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemsDataUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemsDataUpdateComposer.java new file mode 100644 index 00000000..5c782cd0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ItemsDataUpdateComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class ItemsDataUpdateComposer extends MessageComposer +{ + private final List items; + + public ItemsDataUpdateComposer(List items) + { + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ItemsDataUpdateComposer); + this.response.appendInt(this.items.size()); + for (HabboItem item : this.items) + { + item.serializeExtradata(this.response); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/MessengerErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MessengerErrorComposer.java new file mode 100644 index 00000000..b59c123c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MessengerErrorComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class MessengerErrorComposer extends MessageComposer +{ + private final Map errors; + + public MessengerErrorComposer(Map errors) + { + this.errors = errors; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MessengerErrorComposer); + this.response.appendInt(this.errors.size()); + for (Map.Entry entry : this.errors.entrySet()) + { + this.response.appendInt(entry.getKey()); + this.response.appendInt(entry.getValue()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/MinimailNewMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MinimailNewMessageComposer.java new file mode 100644 index 00000000..b22018fb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MinimailNewMessageComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MinimailNewMessageComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MinimailNewMessageComposer); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolComposerOne.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolComposerOne.java new file mode 100644 index 00000000..3e142858 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolComposerOne.java @@ -0,0 +1,17 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolComposerOne extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolComposerOne); + + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolSanctionDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolSanctionDataComposer.java new file mode 100644 index 00000000..363d981b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/ModToolSanctionDataComposer.java @@ -0,0 +1,61 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ModToolSanctionDataComposer extends MessageComposer +{ + private final int unknwonInt1; + private final int accountId; + private final CFHSanction sanction; + + public ModToolSanctionDataComposer(int unknwonInt1, int accountId, CFHSanction sanction) + { + this.unknwonInt1 = unknwonInt1; + this.accountId = accountId; + this.sanction = sanction; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ModToolSanctionDataComposer); + this.response.appendInt(this.unknwonInt1); + this.response.appendInt(this.accountId); + this.sanction.serialize(this.response); + return this.response; + } + + public static class CFHSanction implements ISerialize + { + private final String name; + private final int length; + private final int unknownInt1; + private final boolean avatarOnly; + private final String tradelockInfo; + private final String machineBanInfo; + + public CFHSanction(String name, int length, int unknownInt1, boolean avatarOnly, String tradelockInfo, String machineBanInfo) + { + this.name = name; + this.length = length; + this.unknownInt1 = unknownInt1; + this.avatarOnly = avatarOnly; + this.tradelockInfo = tradelockInfo; + this.machineBanInfo = machineBanInfo; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString(this.name); + message.appendInt(this.length); + message.appendInt(this.unknownInt1); + message.appendBoolean(this.avatarOnly); + message.appendString(this.tradelockInfo); + message.appendString(this.machineBanInfo); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/MostUselessErrorAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MostUselessErrorAlertComposer.java new file mode 100644 index 00000000..b93a0d30 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MostUselessErrorAlertComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MostUselessErrorAlertComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MostUselessErrorAlertComposer); + //EMpty Body + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/MysteryPrizeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MysteryPrizeComposer.java new file mode 100644 index 00000000..05bd71d9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/MysteryPrizeComposer.java @@ -0,0 +1,21 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class MysteryPrizeComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(427); + this.response.appendString("s"); + this.response.appendInt(230); + return this.response; + + //s -> floorItem. -> itemId + //i -> wallItem. -> itemId + //e -> effect -> effectId + //h -> HabboClub -> 0 + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserGiftComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserGiftComposer.java new file mode 100644 index 00000000..0911479e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserGiftComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.items.NewUserGift; +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; +import java.util.Map; + +public class NewUserGiftComposer extends MessageComposer +{ + private final List> options; + + public NewUserGiftComposer(List> options) + { + this.options = options; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewUserGiftComposer); + this.response.appendInt(this.options.size()); + for (List option : this.options) + { + this.response.appendInt(1); + this.response.appendInt(3); + this.response.appendInt(option.size()); + for (NewUserGift gift : option) + { + gift.serialize(this.response); + } + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserIdentityComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserIdentityComposer.java new file mode 100644 index 00000000..456ae7a5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/NewUserIdentityComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NewUserIdentityComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NewUserIdentityComposer); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/NuxAlertComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/NuxAlertComposer.java new file mode 100644 index 00000000..5f14beb1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/NuxAlertComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class NuxAlertComposer extends MessageComposer +{ + private final String link; + + public NuxAlertComposer(String link) + { + this.link = link; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.NuxAlertComposer); + this.response.appendString(this.link); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/PetLevelUpdatedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/PetLevelUpdatedComposer.java new file mode 100644 index 00000000..6956474e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/PetLevelUpdatedComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PetLevelUpdatedComposer extends MessageComposer +{ + private final AbstractPet pet; + private final int level; + + public PetLevelUpdatedComposer(AbstractPet pet, int level) + { + this.pet = pet; + this.level = level; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.PetLevelUpdatedComposer); + this.response.appendInt(this.pet.getRoomUnit().getId()); + this.response.appendInt(this.pet.getId()); + this.response.appendInt(this.level); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestCompletedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestCompletedComposer.java new file mode 100644 index 00000000..9ce414fb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestCompletedComposer.java @@ -0,0 +1,68 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ISerialize; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class QuestCompletedComposer extends MessageComposer +{ + private final UnknownClass unknownClass; + private final boolean unknowbOolean; + + public QuestCompletedComposer(UnknownClass unknownClass, boolean unknowbOolean) + { + this.unknownClass = unknownClass; + this.unknowbOolean = unknowbOolean; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.QuestCompletedComposer); + + return this.response; + } + + public static class UnknownClass implements ISerialize + { + private final int activityPointsType; + private final boolean accepted; + private final int id; + private final String type; + private final int sortOrder; + private final boolean easy; + + public UnknownClass(int activityPointsType, boolean accepted, int id, String type, int sortOrder, boolean easy) + { + this.activityPointsType = activityPointsType; + this.accepted = accepted; + this.id = id; + this.type = type; + this.sortOrder = sortOrder; + this.easy = easy; + } + + @Override + public void serialize(ServerMessage message) + { + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.activityPointsType); + message.appendInt(this.id); + message.appendBoolean(this.accepted); + message.appendString(this.type); + message.appendString(""); + message.appendInt(0); + message.appendString(""); + message.appendInt(0); + message.appendInt(0); + message.appendInt(this.sortOrder); + message.appendString(""); + message.appendString(""); + message.appendBoolean(this.easy); + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestExpiredComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestExpiredComposer.java new file mode 100644 index 00000000..a9b203d6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestExpiredComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class QuestExpiredComposer extends MessageComposer +{ + private final boolean expired; + + public QuestExpiredComposer(boolean expired) + { + this.expired = expired; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.QuestExpiredComposer); + this.response.appendBoolean(this.expired); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestionInfoComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestionInfoComposer.java new file mode 100644 index 00000000..74669ad6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/QuestionInfoComposer.java @@ -0,0 +1,42 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class QuestionInfoComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.QuestionInfoComposer); + /* + this._SafeStr_17817 = k.readString(); + this._SafeStr_16321 = k._SafeStr_5331(); + this._SafeStr_7446 = k._SafeStr_5331(); + this._SafeStr_5614 = k._SafeStr_5331(); + this._SafeStr_16322 = new Dictionary(); + this._SafeStr_16322["id"] = k._SafeStr_5331(); + this._SafeStr_16322["number"] = k._SafeStr_5331(); + this._SafeStr_16322["type"] = k._SafeStr_5331(); + this._SafeStr_16322["content"] = k.readString(); + if ((((this._SafeStr_16322["type"] == 1)) || ((this._SafeStr_16322["type"] == 2)))){ + this._SafeStr_16322["selection_min"] = k._SafeStr_5331(); + _local_2 = k._SafeStr_5331(); + _local_3 = new Array(); + _local_4 = new Array(); + this._SafeStr_16322["selections"] = _local_3; + this._SafeStr_16322["selection_values"] = _local_4; + this._SafeStr_16322["selection_count"] = _local_2; + this._SafeStr_16322["selection_max"] = _local_2; + _local_5 = 0; + while (_local_5 < _local_2) { + _local_4.push(k.readString()); + _local_3.push(k.readString()); + _local_5++; + }; + }; + */ + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RemoveRoomEventComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RemoveRoomEventComposer.java new file mode 100644 index 00000000..7409066c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RemoveRoomEventComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RemoveRoomEventComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RemoveRoomEventComposer); + //Empty Body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RentableItemBuyOutPriceComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RentableItemBuyOutPriceComposer.java new file mode 100644 index 00000000..8c3fdf9f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RentableItemBuyOutPriceComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RentableItemBuyOutPriceComposer extends MessageComposer +{ + private final boolean unknownBoolean1; + private final String unknownString1; + private final boolean unknownBoolean2; + private final int credits; + private final int points; + private final int pointsType; + + public RentableItemBuyOutPriceComposer(boolean unknownBoolean1, String unknownString1, boolean unknownBoolean2, int credits, int points, int pointsType) + { + this.unknownBoolean1 = unknownBoolean1; + this.unknownString1 = unknownString1; + this.unknownBoolean2 = unknownBoolean2; + this.credits = credits; + this.points = points; + this.pointsType = pointsType; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RentableItemBuyOutPriceComposer); + this.response.appendBoolean(this.unknownBoolean1); + this.response.appendString(this.unknownString1); + this.response.appendBoolean(this.unknownBoolean2); + this.response.appendInt(this.credits); + this.response.appendInt(this.points); + this.response.appendInt(this.pointsType); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomAdErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomAdErrorComposer.java new file mode 100644 index 00000000..b56bbe22 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomAdErrorComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomAdErrorComposer extends MessageComposer +{ + private final int errorCode; + private final String unknownString; + + public RoomAdErrorComposer(int errorCode, String unknownString) + { + this.errorCode = errorCode; + this.unknownString = unknownString; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomAdErrorComposer); + this.response.appendInt(this.errorCode); + this.response.appendString(this.unknownString); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomCategoryUpdateMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomCategoryUpdateMessageComposer.java new file mode 100644 index 00000000..b905fe37 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomCategoryUpdateMessageComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomCategoryUpdateMessageComposer extends MessageComposer +{ + private final int unknownInt1; + + public RoomCategoryUpdateMessageComposer(int unknownInt1) + { + this.unknownInt1 = unknownInt1; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomCategoryUpdateMessageComposer); + this.response.appendInt(this.unknownInt1); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomMessagesPostedCountComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomMessagesPostedCountComposer.java new file mode 100644 index 00000000..241867c1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomMessagesPostedCountComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomMessagesPostedCountComposer extends MessageComposer +{ + private final Room room; + private final int count; + + public RoomMessagesPostedCountComposer(Room room, int count) + { + this.room = room; + this.count = count; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomMessagesPostedCountComposer); + this.response.appendInt(this.room.getId()); + this.response.appendString(this.room.getName()); + this.response.appendInt(this.count); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown2Composer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown2Composer.java new file mode 100644 index 00000000..9817fce2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown2Composer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUnknown2Composer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUnknown2Composer); + this.response.appendInt(0); //Count + { + this.response.appendString(""); //Name + this.response.appendInt(0); //Target + + this.response.appendInt(0); //Count + {//Part of previous object (string, int) + this.response.appendString(""); + this.response.appendInt(0); + } + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown3Composer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown3Composer.java new file mode 100644 index 00000000..91c4f8b4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUnknown3Composer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class RoomUnknown3Composer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUnknown3Composer); + //Empty body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUserQuestionAnsweredComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUserQuestionAnsweredComposer.java new file mode 100644 index 00000000..4889a0c9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/RoomUserQuestionAnsweredComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class RoomUserQuestionAnsweredComposer extends MessageComposer +{ + private final int userId; + private final String value; + private final Map unknownMap; + + public RoomUserQuestionAnsweredComposer(int userId, String value, Map unknownMap) + { + this.userId = userId; + this.value = value; + this.unknownMap = unknownMap; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.RoomUserQuestionAnsweredComposer); + this.response.appendInt(this.userId); + this.response.appendString(this.value); + this.response.appendInt(this.unknownMap.size()); + for (Map.Entry entry : this.unknownMap.entrySet()) + { + this.response.appendString(entry.getKey()); + this.response.appendInt(entry.getValue()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsAddUserComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsAddUserComposer.java new file mode 100644 index 00000000..d83e3c9f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsAddUserComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsAddUserComposer extends MessageComposer +{ + /* + Adds the user to the "Waiting for more players" screen. + //Works + */ + @Override + public ServerMessage compose() + { + this.response.init(1880); + this.response.appendInt(3); + this.response.appendString("Derpface"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-63"); + this.response.appendString("m"); + this.response.appendInt(-1); //Team Id + this.response.appendInt(0); //Stars + this.response.appendInt(0); //Points + this.response.appendInt(10); //Points for next lvl + this.response.appendBoolean(false); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsCompose1.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsCompose1.java new file mode 100644 index 00000000..8da108d1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsCompose1.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsCompose1 extends MessageComposer +{ + private final int header; + + public SnowWarsCompose1(int header) + { + this.header = header; + } + //:test 1604 i:1 s:a i:10 i:2 i:3 i:4 s:1 i:3 i:10 i:1 s:Admin s:%look% s:M i:0 i:0 i:0 i:0 + @Override + public ServerMessage compose() + { + this.response.init(this.header); + this.response.appendInt(1); + this.response.appendString("SnowStorm level " + 9); + this.response.appendInt(0); //Stage ID + this.response.appendInt(9); + this.response.appendInt(4); + this.response.appendInt(8); + this.response.appendString("Admin"); + this.response.appendInt(14); + this.response.appendInt(2); + this.response.appendInt(1); + this.response.appendString("Admin"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(1); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(10); + this.response.appendInt(2); + this.response.appendString("Droppy"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(2); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(10); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsFullGameStatusComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsFullGameStatusComposer.java new file mode 100644 index 00000000..6cacafe9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsFullGameStatusComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsFullGameStatusComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(0); + this.response.appendInt(0); //Unused + this.response.appendInt(0); + this.response.appendInt(0); + + //SnowWarGameObjectData + this.response.appendInt(1); //Count + //{ + this.response.appendInt(3); //type + this.response.appendInt(1); //id? + + this.response.appendInt(1); //variable + this.response.appendInt(1); //variable + this.response.appendInt(1); //variable + this.response.appendInt(1); //variable + this.response.appendInt(1); //variable + this.response.appendInt(1); //variable + this.response.appendInt(1); //variable + + //1: -> 11 variables. + //4: -> 8 variables. + //3: -> 7 variables. + //5: -> 19 variables. + //2: -> 9 variables. + //} + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGameStartedErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGameStartedErrorComposer.java new file mode 100644 index 00000000..f84f58ec --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGameStartedErrorComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsGameStartedErrorComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2860); + this.response.appendInt(1); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGenericErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGenericErrorComposer.java new file mode 100644 index 00000000..2c17f4ca --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsGenericErrorComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsGenericErrorComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(3702); + this.response.appendInt(1); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsInitGameArena.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsInitGameArena.java new file mode 100644 index 00000000..ad1762a0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsInitGameArena.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsInitGameArena extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(3924); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsJoinErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsJoinErrorComposer.java new file mode 100644 index 00000000..cc94f2a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsJoinErrorComposer.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsJoinErrorComposer extends MessageComposer +{ + public static final int ERROR_HAS_ACTIVE_INSTANCE = 6; + public static final int ERROR_NO_FREE_GAMES_LEFT = 8; + public static final int ERROR_DUPLICATE_MACHINE_ID = 2; + + @Override + public ServerMessage compose() + { + this.response.init(1437); + this.response.appendInt(2); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLevelDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLevelDataComposer.java new file mode 100644 index 00000000..6ce5f17b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLevelDataComposer.java @@ -0,0 +1,89 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsLevelDataComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(3874); + this.response.appendInt(0); + this.response.appendInt(10); //MapID + this.response.appendInt(2); + this.response.appendInt(2); + + this.response.appendInt(0); //PlayerID + this.response.appendString("Admin"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(1); + + this.response.appendInt(1); //PlayerID + this.response.appendString("Droppy"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(2); + + this.response.appendInt(50); + this.response.appendInt(1); + + this.response.appendString("00000000000000000000000000000000000000000000000000" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxx000000000000000xxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxx00000000000000000xxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxx0000000000000000000xxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxx000000000000000000000xxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxx00000000000000000000000xxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxx0000000000000000000000000xxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxx000000000000000000000000000xxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxx00000000000000000000000000000xxxxxxxxxxxxxx" + (char) 13 + + "xxxxxx0000000000000000000000000000000xxxxxxxxxxxxx" + (char) 13 + + "xxxxx000000000000000000000000000000000xxxxxxxxxxxx" + (char) 13 + + "xxxxx0000000000000000000000000000000000xxxxxxxxxxx" + (char) 13 + + "xxxxx00000000000000000000000000000000000xxxxxxxxxx" + (char) 13 + + "xxxxx000000000000000000000000000000000000xxxxxxxxx" + (char) 13 + + "xxxxx0000000000000000000000000000000000000xxxxxxxx" + (char) 13 + + "xxxxx00000000000000000000000000000000000000xxxxxxx" + (char) 13 + + "xxxxx000000000000000000000000000000000000000xxxxxx" + (char) 13 + + "xxxxx0000000000000000000000000000000000000000xxxxx" + (char) 13 + + "0xxxx00000000000000000000000000000000000000000xxxx" + (char) 13 + + "xxxxx00000000000000000000000000000000000000000xxxx" + (char) 13 + + "xxxxx00000000000000000000000000000000000000000xxxx" + (char) 13 + + "xxxxx000000000000000000000000000000000000000000xxx" + (char) 13 + + "xxxxx000000000000000000000000000000000000000000xxx" + (char) 13 + + "xxxxx000000000000000000000000000000000000000000xxx" + (char) 13 + + "xxxxxx00000000000000000000000000000000000000000xxx" + (char) 13 + + "xxxxxxx0000000000000000000000000000000000000000xxx" + (char) 13 + + "xxxxxxxx0000000000000000000000000000000000000xxxxx" + (char) 13 + + "xxxxxxxxx00000000000000000000000000000000000xxxxxx" + (char) 13 + + "xxxxxxxxxx000000000000000000000000000000000xxxxxxx" + (char) 13 + + "xxxxxxxxxxx00000000000000000000000000000000xxxx0xx" + (char) 13 + + "xxxxxxxxxxxx0000000000000000000000000000000xxxxxxx" + (char) 13 + + "xxxxxxxxxxxxx00000000000000000000000000000xxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxx0000000000000000000000000000xxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxx00000000000000000000000000xxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxx0000000000000000000000000xxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxx00000000000000000000000xxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxx0000000000000000000000xxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxx00000000000000000000xxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxx000000000000000xxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + (char) 13 + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + + this.response.appendInt(0); + //{ + //} + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLoadingArenaComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLoadingArenaComposer.java new file mode 100644 index 00000000..489afd0d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLoadingArenaComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsLoadingArenaComposer extends MessageComposer +{ + private final int count; + + public SnowWarsLoadingArenaComposer(int count) + { + this.count = count; + } + @Override + public ServerMessage compose() + { + this.response.init(3850); + this.response.appendInt(this.count); //GameID? + this.response.appendInt(0); //Count + //this.response.appendInt(1); //ItemID to dispose? + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLongDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLongDataComposer.java new file mode 100644 index 00000000..1cec5cdb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsLongDataComposer.java @@ -0,0 +1,41 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsLongDataComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2823); + this.response.appendInt(1); + this.response.appendString("SnowStorm level " + 10); + this.response.appendInt(10); //Stage ID + this.response.appendInt(10); + this.response.appendInt(4); + this.response.appendInt(8); + this.response.appendString("Admin"); + this.response.appendInt(14); + this.response.appendInt(2); + + this.response.appendInt(1); + this.response.appendString("Admin"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(1); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(10); + + this.response.appendInt(2); + this.response.appendString("Emetophobic"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-63"); + this.response.appendString("m"); + this.response.appendInt(2); //Team Id + this.response.appendInt(0); //Stars + this.response.appendInt(0); //Points + this.response.appendInt(10); //Points for next lvl + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnGameEnding.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnGameEnding.java new file mode 100644 index 00000000..b44c14b9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnGameEnding.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsOnGameEnding extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(1893); + this.response.appendInt(0); //idk + + //Game2GameResult + this.response.appendBoolean(false); + this.response.appendInt(0); //resultType + this.response.appendInt(0); //result? + + this.response.appendInt(1); //Count + //{ + //Game2TeamScoreData + this.response.appendInt(1); //Team ID? + this.response.appendInt(100); //Score + + this.response.appendInt(1); //Count + //{ + //Game2TeamPlayerData + this.response.appendString("Admin"); //username + this.response.appendInt(1); //UserID + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); //Look + this.response.appendString("m"); //GENDER + this.response.appendInt(1337); //Score + + //Game2PlayerStatsData + this.response.appendInt(1337); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + //} + //} + + //Game2SnowWarGameStats + this.response.appendInt(1337); + this.response.appendInt(1338); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageEnding.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageEnding.java new file mode 100644 index 00000000..8caa4639 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageEnding.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsOnStageEnding extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(1140); + this.response.appendInt(1); //idk + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageRunningComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageRunningComposer.java new file mode 100644 index 00000000..7dedc8eb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageRunningComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsOnStageRunningComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(3832); + this.response.appendInt(120); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageStartComposer.java new file mode 100644 index 00000000..8c3d1cbb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsOnStageStartComposer.java @@ -0,0 +1,67 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsOnStageStartComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(889); + this.response.appendInt(0); + this.response.appendString("snowwar_arena_0"); + this.response.appendInt(0); + this.response.appendInt(2); //Count + + this.response.appendInt(5); + this.response.appendInt(1); + this.response.appendInt(64000); + this.response.appendInt(64000); + this.response.appendInt(20); + this.response.appendInt(24); + this.response.appendInt(1); + this.response.appendInt(100); + this.response.appendInt(4); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(20); + this.response.appendInt(24); + this.response.appendInt(64000); + this.response.appendInt(64000); + this.response.appendInt(0); + this.response.appendInt(1); + this.response.appendInt(1); + this.response.appendString("Admin"); + this.response.appendString("Motto"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + + this.response.appendInt(5); + this.response.appendInt(2); + this.response.appendInt(64000); + this.response.appendInt(64000); + this.response.appendInt(20); + this.response.appendInt(24); + this.response.appendInt(1); + this.response.appendInt(100); + this.response.appendInt(4); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(20); + this.response.appendInt(24); + this.response.appendInt(64000); + this.response.appendInt(64000); + this.response.appendInt(0); + this.response.appendInt(2); + this.response.appendInt(2); + this.response.appendString("Admin"); + this.response.appendString("Motto"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPlayNowWindowComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPlayNowWindowComposer.java new file mode 100644 index 00000000..4c321396 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPlayNowWindowComposer.java @@ -0,0 +1,18 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsPlayNowWindowComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2276); + this.response.appendInt(0); //status + this.response.appendInt(100); + this.response.appendInt(0); + this.response.appendInt(-1); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPreviousRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPreviousRoomComposer.java new file mode 100644 index 00000000..f3ec791f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsPreviousRoomComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsPreviousRoomComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(1381); + this.response.appendInt(1); //room Id + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuePositionComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuePositionComposer.java new file mode 100644 index 00000000..5fcc77bd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuePositionComposer.java @@ -0,0 +1,15 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsQuePositionComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2077); + this.response.appendInt(1); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuickJoinComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuickJoinComposer.java new file mode 100644 index 00000000..ebe19ea7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsQuickJoinComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsQuickJoinComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(913); + this.response.appendInt(1); + this.response.appendString("SnowStorm level " + 9); + this.response.appendInt(0); //Stage ID + this.response.appendInt(9); + this.response.appendInt(2); + this.response.appendInt(10); + this.response.appendString("Admin"); + this.response.appendInt(0); + this.response.appendInt(2); + this.response.appendInt(1); + this.response.appendString("Admin"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(-1); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(2); + this.response.appendString("Droppy"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(-1); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsRemoveUserComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsRemoveUserComposer.java new file mode 100644 index 00000000..9078b3aa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsRemoveUserComposer.java @@ -0,0 +1,19 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsRemoveUserComposer extends MessageComposer +{ + /* + Removes a user from the "Waiting for users" window. + //Works + */ + @Override + public ServerMessage compose() + { + this.response.init(2502); + this.response.appendInt(3); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsResetTimerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsResetTimerComposer.java new file mode 100644 index 00000000..40fd1ce3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsResetTimerComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsResetTimerComposer extends MessageComposer +{ + //SnowStageRunning? + @Override + public ServerMessage compose() + { + this.response.init(294); + this.response.appendInt(100); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsStartLobbyCounter.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsStartLobbyCounter.java new file mode 100644 index 00000000..ae266a2c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsStartLobbyCounter.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsStartLobbyCounter extends MessageComposer +{ + + @Override + public ServerMessage compose() + { + this.response.init(3757); + this.response.appendInt(5); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUnknownComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUnknownComposer.java new file mode 100644 index 00000000..c50bbbcc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUnknownComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsUnknownComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2869); + this.response.appendString("snowwar"); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendBoolean(true); + this.response.appendBoolean(true); + this.response.appendInt(0); + this.response.appendInt(0); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserChatComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserChatComposer.java new file mode 100644 index 00000000..b6fdfa58 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserChatComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsUserChatComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(2049); + this.response.appendInt(1); //UserID + this.response.appendString("Message"); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserEnteredArenaComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserEnteredArenaComposer.java new file mode 100644 index 00000000..cd95defd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserEnteredArenaComposer.java @@ -0,0 +1,37 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsUserEnteredArenaComposer extends MessageComposer +{ + private final int type; + + public SnowWarsUserEnteredArenaComposer(int type) + { + this.type =type; + } + @Override + public ServerMessage compose() + { + this.response.init(3425); + + if(type == 1) + { + this.response.appendInt(1); //userId + this.response.appendString("Admin"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(1); //team + } + else + { + this.response.appendInt(0); //userId + this.response.appendString("Droppy"); + this.response.appendString("ca-1807-64.lg-275-78.hd-3093-1.hr-802-42.ch-3110-65-62.fa-1211-62"); + this.response.appendString("m"); + this.response.appendInt(2); //team + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserExitArenaComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserExitArenaComposer.java new file mode 100644 index 00000000..640afcf7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/SnowWarsUserExitArenaComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; + +public class SnowWarsUserExitArenaComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(3811); + this.response.appendInt(1); //userId + this.response.appendInt(1); //IDK ? TEAM? + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailFailedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailFailedComposer.java new file mode 100644 index 00000000..94b30605 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailFailedComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TalentTrackEmailFailedComposer extends MessageComposer +{ + private final int result; + + public TalentTrackEmailFailedComposer(int result) + { + this.result = result; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TalentTrackEmailFailedComposer); + this.response.appendInt(this.result); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailVerifiedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailVerifiedComposer.java new file mode 100644 index 00000000..ef1cf551 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/TalentTrackEmailVerifiedComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class TalentTrackEmailVerifiedComposer extends MessageComposer +{ + private final String email; + private final boolean unknownB1; + private final boolean unknownB2; + + public TalentTrackEmailVerifiedComposer(String email, boolean unknownB1, boolean unknownB2) + { + this.email = email; + this.unknownB1 = unknownB1; + this.unknownB2 = unknownB2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TalentTrackEmailVerifiedComposer); + this.response.appendString(this.email); + this.response.appendBoolean(this.unknownB1); + this.response.appendBoolean(this.unknownB2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/TargetedOfferComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/TargetedOfferComposer.java new file mode 100644 index 00000000..f314c4ab --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/TargetedOfferComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.catalog.TargetOffer; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class TargetedOfferComposer extends MessageComposer +{ + private final TargetOffer offer; + + public TargetedOfferComposer(TargetOffer offer) + { + this.offer = offer; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.TargetedOfferComposer); + this.offer.serialize(this.response); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAdManagerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAdManagerComposer.java new file mode 100644 index 00000000..eb21ca1d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAdManagerComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownAdManagerComposer extends MessageComposer +{ + private final boolean unknownBoolean; + + public UnknownAdManagerComposer(boolean unknownBoolean) + { + this.unknownBoolean = unknownBoolean; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownAdManagerComposer); + this.response.appendBoolean(this.unknownBoolean); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAvatarEditorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAvatarEditorComposer.java new file mode 100644 index 00000000..3a668dcf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownAvatarEditorComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownAvatarEditorComposer extends MessageComposer +{ + private final int type; + + public UnknownAvatarEditorComposer(int type) + { + this.type = type; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownAvatarEditorComposer); + this.response.appendInt(this.type); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCatalogPageOfferComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCatalogPageOfferComposer.java new file mode 100644 index 00000000..c1407172 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCatalogPageOfferComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownCatalogPageOfferComposer extends MessageComposer +{ + private final int pageId; + private final CatalogItem catalogItem; + + public UnknownCatalogPageOfferComposer(int pageId, CatalogItem catalogItem) + { + this.pageId = pageId; + this.catalogItem = catalogItem; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownCatalogPageOfferComposer); + this.response.appendInt(this.pageId); + catalogItem.serialize(this.response); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCompetitionComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCompetitionComposer.java new file mode 100644 index 00000000..10f3c9dd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownCompetitionComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownCompetitionComposer extends MessageComposer +{ + private final int unknownInt1; + private final String unknownString1; + private final int unknownInt2; + private final int unknownInt3; + + public UnknownCompetitionComposer(int unknownInt1, String unknownString1, int unknownInt2, int unknownInt3) + { + this.unknownInt1 = unknownInt1; + this.unknownString1 = unknownString1; + this.unknownInt2 = unknownInt2; + this.unknownInt3 = unknownInt3; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownCompetitionComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendString(this.unknownString1); + this.response.appendInt(this.unknownInt2); + this.response.appendInt(this.unknownInt3); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer4.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer4.java new file mode 100644 index 00000000..0052a297 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer4.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownComposer4 extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer4); + this.response.appendBoolean(false); //Think something related to promo. Not sure though. + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer5.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer5.java new file mode 100644 index 00000000..036cc32c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer5.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownComposer5 extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer5); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer6.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer6.java new file mode 100644 index 00000000..0010491e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer6.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownComposer6 extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer6); + this.response.appendInt(0); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer8.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer8.java new file mode 100644 index 00000000..328a5513 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownComposer8.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownComposer8 extends MessageComposer +{ + private final int unknownInt1; + private final int userId; + private final int unknownInt2; + + public UnknownComposer8(int unknownInt1, int userId, int unknownInt2) + { + this.unknownInt1 = unknownInt1; + this.userId = userId; + this.unknownInt2 = unknownInt2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer8); + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.userId); + this.response.appendInt(this.unknownInt2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownFurniModelComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownFurniModelComposer.java new file mode 100644 index 00000000..a4195b97 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownFurniModelComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownFurniModelComposer extends MessageComposer +{ + private final HabboItem item; + private final int unknownInt; + + public UnknownFurniModelComposer(HabboItem item, int unknownInt) + { + this.item = item; + this.unknownInt = unknownInt; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownFurniModelComposer); + this.response.appendInt(this.item.getId()); + this.response.appendInt(this.unknownInt); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuild2Composer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuild2Composer.java new file mode 100644 index 00000000..455bd368 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuild2Composer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownGuild2Composer extends MessageComposer +{ + private final int guildId; + + public UnknownGuild2Composer(int guildId) + { + this.guildId = guildId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownGuild2Composer); + this.response.appendInt(this.guildId); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer.java new file mode 100644 index 00000000..44e81d79 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownGuildComposer extends MessageComposer +{ + private final int guildId; + private final int requester; + + //Related to membership requess? + public UnknownGuildComposer(int guildId, int requester) + { + this.guildId = guildId; + this.requester = requester; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownGuildComposer); + this.response.appendInt(this.guildId); + this.response.appendInt(this.requester); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer3.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer3.java new file mode 100644 index 00000000..1b824eb1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownGuildComposer3.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownGuildComposer3 extends MessageComposer +{ + private final int userId; + + public UnknownGuildComposer3(int userId) + { + this.userId = userId; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownGuildComposer3); + this.response.appendInt(this.userId); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHabboWayQuizComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHabboWayQuizComposer.java new file mode 100644 index 00000000..c2d81c6e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHabboWayQuizComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class UnknownHabboWayQuizComposer extends MessageComposer +{ + private final String unknownString; + private final List unknownIntegerList; + + public UnknownHabboWayQuizComposer(String unknownString, List unknownIntegerList) + { + this.unknownString = unknownString; + this.unknownIntegerList = unknownIntegerList; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownHabboWayQuizComposer); + this.response.appendString(this.unknownString); + this.response.appendInt(this.unknownIntegerList.size()); + for (Integer i : this.unknownIntegerList) + { + this.response.appendInt(i); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHelperComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHelperComposer.java new file mode 100644 index 00000000..34da5633 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHelperComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownHelperComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownHelperComposer); + //Empty body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHintComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHintComposer.java new file mode 100644 index 00000000..a96b372c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownHintComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownHintComposer extends MessageComposer +{ + private final String key; + + public UnknownHintComposer(String key) + { + this.key = key; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownHintComposer); + this.response.appendString(this.key); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownMessengerErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownMessengerErrorComposer.java new file mode 100644 index 00000000..9f14c296 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownMessengerErrorComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownMessengerErrorComposer extends MessageComposer +{ + private final int errorCode; + private final int userId; + private final String message; + + public UnknownMessengerErrorComposer(int errorCode, int userId, String message) + { + this.errorCode = errorCode; + this.userId = userId; + this.message = message; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownMessengerErrorComposer); + this.response.appendInt(this.errorCode); + this.response.appendInt(this.userId); + this.response.appendString(this.message); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownPollQuestionComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownPollQuestionComposer.java new file mode 100644 index 00000000..c5534afa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownPollQuestionComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class UnknownPollQuestionComposer extends MessageComposer +{ + private final int unknownInt; + private final Map unknownMap; + + public UnknownPollQuestionComposer(int unknownInt, Map unknownMap) + { + this.unknownInt = unknownInt; + this.unknownMap = unknownMap; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.SimplePollAnswersComposer); + this.response.appendInt(this.unknownInt); + this.response.appendInt(this.unknownMap.size()); + for (Map.Entry entry : this.unknownMap.entrySet()) + { + this.response.appendString(entry.getKey()); + this.response.appendInt(entry.getValue()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomDesktopComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomDesktopComposer.java new file mode 100644 index 00000000..5ae4efb6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomDesktopComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class UnknownRoomDesktopComposer extends MessageComposer +{ + private final int unknownInt1; + private final Map unknownMap; + + public UnknownRoomDesktopComposer(int unknownInt1, Map unknownMap) + { + this.unknownInt1 = unknownInt1; + this.unknownMap = unknownMap; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownRoomDesktopComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.unknownMap.size()); + for (Map.Entry entry : this.unknownMap.entrySet()) + { + this.response.appendInt(entry.getKey()); + this.response.appendString(entry.getValue()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomViewerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomViewerComposer.java new file mode 100644 index 00000000..f2a97145 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownRoomViewerComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class UnknownRoomViewerComposer extends MessageComposer +{ + private final Map unknownMap; + + public UnknownRoomViewerComposer(Map unknownMap) + { + this.unknownMap = unknownMap; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownRoomViewerComposer); + this.response.appendInt(this.unknownMap.size()); + for (Map.Entry entry : this.unknownMap.entrySet()) + { + this.response.appendInt(entry.getKey()); + this.response.appendString(entry.getValue()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownStatusComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownStatusComposer.java new file mode 100644 index 00000000..23ae51a4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownStatusComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownStatusComposer extends MessageComposer +{ + public final int STATUS_ZERO = 0; + public final int STATUS_ONE = 1; + + private final int status; + + public UnknownStatusComposer(int status) + { + this.status = status; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownStatusComposer); + this.response.appendInt(this.status); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownTradeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownTradeComposer.java new file mode 100644 index 00000000..e500eef0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownTradeComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownTradeComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownTradeComposer); + //Empty Body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownWiredComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownWiredComposer.java new file mode 100644 index 00000000..d00f2998 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnknownWiredComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UnknownWiredComposer extends MessageComposer +{ + private final HabboItem item; + + public UnknownWiredComposer(HabboItem item) + { + this.item = item; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownWiredComposer); + this.response.appendInt(this.item.getId()); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnkownPetPackageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnkownPetPackageComposer.java new file mode 100644 index 00000000..d0782707 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/UnkownPetPackageComposer.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Map; + +public class UnkownPetPackageComposer extends MessageComposer +{ + private final Map unknownMap; + + public UnkownPetPackageComposer(Map unknownMap) + { + this.unknownMap = unknownMap; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnkownPetPackageComposer); + this.response.appendInt(this.unknownMap.size()); + for (Map.Entry entry : this.unknownMap.entrySet()) + { + this.response.appendString(entry.getKey()); + this.response.appendString(entry.getValue()); + } + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobileNumberComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobileNumberComposer.java new file mode 100644 index 00000000..f8210a56 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobileNumberComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class VerifyMobileNumberComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.VerifyMobileNumberComposer); + //Empty body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneCodeWindowComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneCodeWindowComposer.java new file mode 100644 index 00000000..e1e5bc98 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneCodeWindowComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class VerifyMobilePhoneCodeWindowComposer extends MessageComposer +{ + private final int unknownInt1; + private final int unknownInt2; + + public VerifyMobilePhoneCodeWindowComposer(int unknownInt1, int unknownInt2) + { + this.unknownInt1 = unknownInt1; + this.unknownInt2 = unknownInt2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.VerifyMobilePhoneCodeWindowComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.unknownInt2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneDoneComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneDoneComposer.java new file mode 100644 index 00000000..263a623d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneDoneComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class VerifyMobilePhoneDoneComposer extends MessageComposer +{ + private final int unknownInt1; + private final int unknownInt2; + + public VerifyMobilePhoneDoneComposer(int unknownInt1, int unknownInt2) + { + this.unknownInt1 = unknownInt1; + this.unknownInt2 = unknownInt2; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.VerifyMobilePhoneDoneComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.unknownInt2); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneWindowComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneWindowComposer.java new file mode 100644 index 00000000..9c5b08a4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VerifyMobilePhoneWindowComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class VerifyMobilePhoneWindowComposer extends MessageComposer +{ + private final int unknownInt1; + private final int unknownInt2; + private final int unknownInt3; + + public VerifyMobilePhoneWindowComposer(int unknownInt1, int unknownInt2, int unknownInt3) + { + this.unknownInt1 = unknownInt1; + this.unknownInt2 = unknownInt2; + this.unknownInt3 = unknownInt3; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.VerifyMobilePhoneWindowComposer); + this.response.appendInt(this.unknownInt1); + this.response.appendInt(this.unknownInt2); + this.response.appendInt(this.unknownInt3); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/VipTutorialsStartComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VipTutorialsStartComposer.java new file mode 100644 index 00000000..748712d7 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/VipTutorialsStartComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class VipTutorialsStartComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.VipTutorialsStartComposer); + //Empty Body + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/WatchAndEarnRewardComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/WatchAndEarnRewardComposer.java new file mode 100644 index 00000000..064c050e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/WatchAndEarnRewardComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WatchAndEarnRewardComposer extends MessageComposer +{ + private final Item item; + private final String unknownString1; + + public WatchAndEarnRewardComposer(Item item, String unknownString1) + { + this.item = item; + this.unknownString1 = unknownString1; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WatchAndEarnRewardComposer); + this.response.appendString(this.item.getType().code); + this.response.appendInt(this.item.getId()); + this.response.appendString(this.item.getName()); + this.response.appendString(this.item.getFullName()); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftComposer.java new file mode 100644 index 00000000..6a65472b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WelcomeGiftComposer extends MessageComposer +{ + private final String email; + private final boolean unknownB1; + private final boolean unknownB2; + private final int furniId; + private final boolean unknownB3; + + public WelcomeGiftComposer(String email, boolean unknownB1, boolean unknownB2, int furniId, boolean unknownB3) + { + this.email = email; + this.unknownB1 = unknownB1; + this.unknownB2 = unknownB2; + this.furniId = furniId; + this.unknownB3 = unknownB3; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WelcomeGiftComposer); + this.response.appendString(this.email); + this.response.appendBoolean(this.unknownB1); + this.response.appendBoolean(this.unknownB2); + this.response.appendInt(this.furniId); + this.response.appendBoolean(this.unknownB3); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftErrorComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftErrorComposer.java new file mode 100644 index 00000000..b2b54422 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/unknown/WelcomeGiftErrorComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.unknown; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WelcomeGiftErrorComposer extends MessageComposer +{ + public final static int EMAIL_INVALID = 0; + public final static int EMAIL_LENGTH_EXCEEDED = 1; + public final static int EMAIL_IN_USE = 3; + public final static int EMAIL_LIMIT_CHANGE = 4; + + private final int error; + + public WelcomeGiftErrorComposer(int error) + { + this.error = error; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WelcomeGiftErrorComposer); + this.response.appendInt(this.error); + return this.response; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/AddUserBadgeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/AddUserBadgeComposer.java new file mode 100644 index 00000000..cf5cc917 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/AddUserBadgeComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class AddUserBadgeComposer extends MessageComposer +{ + private final HabboBadge badge; + + public AddUserBadgeComposer(HabboBadge badge) + { + this.badge = badge; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.AddUserBadgeComposer); + this.response.appendInt(this.badge.getSlot()); + this.response.appendString(this.badge.getCode()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/ChangeNameCheckResultComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/ChangeNameCheckResultComposer.java new file mode 100644 index 00000000..f48c3342 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/ChangeNameCheckResultComposer.java @@ -0,0 +1,42 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class ChangeNameCheckResultComposer extends MessageComposer +{ + public static final int AVAILABLE = 0; + public static final int TOO_SHORT = 2; + public static final int TOO_LONG = 3; + public static final int NOT_VALID = 4; + public static final int TAKEN_WITH_SUGGESTIONS = 5; + public static final int DISABLED = 6; + + private final int status; + private final String name; + private final List suggestions; + + public ChangeNameCheckResultComposer(int status, String name, List suggestions) + { + this.status = status; + this.name = name; + this.suggestions = suggestions; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UnknownComposer_2698); + this.response.appendInt(this.status); + this.response.appendString(name); + this.response.appendInt(this.suggestions.size()); + for (String suggestion : suggestions) + { + this.response.appendString(suggestion); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/ClubGiftReceivedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/ClubGiftReceivedComposer.java new file mode 100644 index 00000000..d2bedd8c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/ClubGiftReceivedComposer.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.set.hash.THashSet; + +public class ClubGiftReceivedComposer extends MessageComposer +{ + //:test 735 s:t i:1 s:s i:230 s:throne i:1 b:1 i:1 i:10; + private final THashSet items; + + public ClubGiftReceivedComposer(THashSet items) + { + this.items = items; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.ClubGiftReceivedComposer); + this.response.appendInt(this.items.size()); + + for(HabboItem item : this.items) + { + this.response.appendString(item.getBaseItem().getType().code); + this.response.appendInt(item.getBaseItem().getId()); + this.response.appendString(item.getBaseItem().getName()); + this.response.appendInt(0); + this.response.appendBoolean(false); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/FavoriteRoomsCountComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/FavoriteRoomsCountComposer.java new file mode 100644 index 00000000..720065d6 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/FavoriteRoomsCountComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TIntProcedure; + +public class FavoriteRoomsCountComposer extends MessageComposer +{ + private final Habbo habbo; + + public FavoriteRoomsCountComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() { + this.response.init(Outgoing.FavoriteRoomsCountComposer); + + this.response.appendInt(Emulator.getConfig().getInt("hotel.rooms.max.favorite")); + + this.response.appendInt(this.habbo.getHabboStats().getFavoriteRooms().size()); + this.habbo.getHabboStats().getFavoriteRooms().forEach(new TIntProcedure() + { + @Override + public boolean execute(int value) + { + response.appendInt(value); + return true; + } + }); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/MeMenuSettingsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/MeMenuSettingsComposer.java new file mode 100644 index 00000000..9c4f1d3e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/MeMenuSettingsComposer.java @@ -0,0 +1,33 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MeMenuSettingsComposer extends MessageComposer +{ + private Habbo habbo; + + public MeMenuSettingsComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MeMenuSettingsComposer); + + this.response.appendInt(this.habbo.getHabboStats().volumeSystem); + this.response.appendInt(this.habbo.getHabboStats().volumeFurni); + this.response.appendInt(this.habbo.getHabboStats().volumeTrax); + this.response.appendBoolean(this.habbo.getHabboStats().preferOldChat); + this.response.appendBoolean(this.habbo.getHabboStats().blockRoomInvites); + this.response.appendBoolean(this.habbo.getHabboStats().blockCameraFollow); + this.response.appendInt(1); + this.response.appendInt(this.habbo.getHabboStats().chatColor.getType()); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/MutedWhisperComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/MutedWhisperComposer.java new file mode 100644 index 00000000..6106cdad --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/MutedWhisperComposer.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class MutedWhisperComposer extends MessageComposer +{ + private int seconds; + + public MutedWhisperComposer(int seconds) + { + this.seconds = seconds; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.MutedWhisperComposer); + this.response.appendInt(this.seconds); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/ProfileFriendsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/ProfileFriendsComposer.java new file mode 100644 index 00000000..d8c272b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/ProfileFriendsComposer.java @@ -0,0 +1,127 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + +public class ProfileFriendsComposer extends MessageComposer +{ + + private Habbo habbo; + private final List lovers = new ArrayList(); + private final List friends = new ArrayList(); + private final List haters = new ArrayList(); + private final int userId; + + public ProfileFriendsComposer(THashMap> map, int userId) + { + try { + lovers.addAll(map.get(1)); + friends.addAll(map.get(2)); + haters.addAll(map.get(3)); + } + catch(Exception e) + { + e.printStackTrace(); + } + + this.userId = userId; + } + + public ProfileFriendsComposer(Habbo habbo) + { + try { + this.habbo = habbo; + + for (Map.Entry map : this.habbo.getMessenger().getFriends().entrySet()) { + if (map.getValue().getRelation() == 0) + continue; + + switch (map.getValue().getRelation()) { + case 1: + this.lovers.add(map.getValue()); + break; + case 2: + this.friends.add(map.getValue()); + break; + case 3: + this.haters.add(map.getValue()); + break; + } + } + } + catch(Exception e) + { + e.printStackTrace(); + } + + this.userId = habbo.getHabboInfo().getId(); + } + + @Override + public ServerMessage compose() + { + + try { + + this.response.init(Outgoing.ProfileFriendsComposer); + this.response.appendInt(this.userId); + + int total = 0; + + if(!this.lovers.isEmpty()) + total++; + + if(!this.friends.isEmpty()) + total++; + + if(!this.haters.isEmpty()) + total++; + + this.response.appendInt(total); + + Random random = new Random(); + + if (!this.lovers.isEmpty()) { + int loversIndex = random.nextInt(this.lovers.size()); + this.response.appendInt(1); + this.response.appendInt(this.lovers.size()); + this.response.appendInt(this.lovers.get(loversIndex).getId()); + this.response.appendString(this.lovers.get(loversIndex).getUsername()); + this.response.appendString(this.lovers.get(loversIndex).getLook()); + } + + if (!friends.isEmpty()) { + int friendsIndex = random.nextInt(this.friends.size()); + this.response.appendInt(2); + this.response.appendInt(this.friends.size()); + this.response.appendInt(this.friends.get(friendsIndex).getId()); + this.response.appendString(this.friends.get(friendsIndex).getUsername()); + this.response.appendString(this.friends.get(friendsIndex).getLook()); + } + + if (!this.haters.isEmpty()) { + int hatersIndex = random.nextInt(this.haters.size()); + this.response.appendInt(3); + this.response.appendInt(this.haters.size()); + this.response.appendInt(this.haters.get(hatersIndex).getId()); + this.response.appendString(this.haters.get(hatersIndex).getUsername()); + this.response.appendString(this.haters.get(hatersIndex).getLook()); + } + } + catch(Exception e) + { + e.printStackTrace(); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UpdateUserLookComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UpdateUserLookComposer.java new file mode 100644 index 00000000..b7d0398a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UpdateUserLookComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UpdateUserLookComposer extends MessageComposer +{ + private Habbo habbo; + + public UpdateUserLookComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UpdateUserLookComposer); + this.response.appendString(this.habbo.getHabboInfo().getLook()); + this.response.appendString(this.habbo.getHabboInfo().getGender().name()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserAchievementScoreComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserAchievementScoreComposer.java new file mode 100644 index 00000000..2845cdfa --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserAchievementScoreComposer.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserAchievementScoreComposer extends MessageComposer +{ + private final Habbo habbo; + + public UserAchievementScoreComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserAchievementScoreComposer); + this.response.appendInt(habbo.getHabboStats().getAchievementScore()); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserBCLimitsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserBCLimitsComposer.java new file mode 100644 index 00000000..03715145 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserBCLimitsComposer.java @@ -0,0 +1,21 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserBCLimitsComposer extends MessageComposer +{ + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserBCLimitsComposer); + + this.response.appendInt(0); + this.response.appendInt(500); + this.response.appendInt(0); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserBadgesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserBadgesComposer.java new file mode 100644 index 00000000..8de972b0 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserBadgesComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.ArrayList; + +public class UserBadgesComposer extends MessageComposer +{ + private final ArrayList badges; + private final int habbo; + + public UserBadgesComposer(ArrayList badges, int habbo) + { + this.badges = badges; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserBadgesComposer); + this.response.appendInt(this.habbo); + + synchronized (this.badges) + { + this.response.appendInt(this.badges.size()); + for (HabboBadge badge : this.badges) + { + this.response.appendInt(badge.getSlot()); + this.response.appendString(badge.getCode()); + } + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserCitizinShipComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserCitizinShipComposer.java new file mode 100644 index 00000000..340ba15f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserCitizinShipComposer.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserCitizinShipComposer extends MessageComposer +{ + + private final String name; + + public UserCitizinShipComposer(String name) + { + this.name = name; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserCitizinShipComposer); + this.response.appendString(this.name); + this.response.appendInt(4); + this.response.appendInt(4); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserClothesComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserClothesComposer.java new file mode 100644 index 00000000..b08b6706 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserClothesComposer.java @@ -0,0 +1,57 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.ClothItem; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import gnu.trove.procedure.TIntProcedure; + +import java.util.ArrayList; + +public class UserClothesComposer extends MessageComposer +{ + private final ArrayList idList = new ArrayList<>(); + private final ArrayList nameList = new ArrayList<>(); + + public UserClothesComposer(Habbo habbo) + { + habbo.getInventory().getWardrobeComponent().getClothing().forEach(new TIntProcedure() + { + @Override + public boolean execute(int value) + { + ClothItem item = Emulator.getGameEnvironment().getCatalogManager().clothing.get(value); + + if (item != null) + { + for (Integer j : item.setId) + { + idList.add(j); + } + + nameList.add(item.name); + } + + return true; + } + }); + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserClothesComposer); + + this.response.appendInt(this.idList.size()); + + this.idList.forEach(this.response::appendInt); + + this.response.appendInt(this.nameList.size()); + + this.nameList.forEach(this.response::appendString); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserClubComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserClubComposer.java new file mode 100644 index 00000000..75bf7fd3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserClubComposer.java @@ -0,0 +1,86 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserClubComposer extends MessageComposer +{ + private final Habbo habbo; + + public UserClubComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserClubComposer); + + this.response.appendString("club_habbo"); + + int endTimestamp = this.habbo.getHabboStats().getClubExpireTimestamp(); + int now = Emulator.getIntUnixTimestamp(); + + if(endTimestamp >= now) + { + /*Date endDate = new Date(endTimestamp * 1000); + Date startDate = new Date(Emulator.getIntUnixTimestamp() * 1000); + + long duration = endDate.getTime() - startDate.getTime(); + + long theDays = TimeUnit.MILLISECONDS.toDays(duration); + int years = (int) Math.floor(theDays / 365); + theDays = theDays - (years * 365); + + int months = (int) Math.floor(theDays / 31); + theDays = theDays - (months * 31);*/ + + int days = ((endTimestamp - Emulator.getIntUnixTimestamp()) / 86400); + int years = (int) Math.floor(days / 365); + + //if(years > 0) + // days = days - (years * 365); + + int months = 0; + + if(days > 31) + { + months = (int) Math.floor(days / 31); + days = days - (months * 31); + } + + this.response.appendInt(days); + this.response.appendInt(1); + this.response.appendInt(months); + this.response.appendInt(years); + } + else + { + this.response.appendInt(0); + this.response.appendInt(7); + this.response.appendInt(0); + this.response.appendInt(1); + } + this.response.appendBoolean(true); + this.response.appendBoolean(true); + this.response.appendInt(0); + this.response.appendInt(0); + + long remaining = (endTimestamp - Emulator.getIntUnixTimestamp()) * 1000; + + if (remaining > Integer.MAX_VALUE || remaining <= 0) + { + this.response.appendInt(Integer.MAX_VALUE); + } + else + { + this.response.appendInt((int) remaining); + } + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserCreditsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserCreditsComposer.java new file mode 100644 index 00000000..a9841da3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserCreditsComposer.java @@ -0,0 +1,26 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserCreditsComposer extends MessageComposer +{ + + private final Habbo habbo; + + public UserCreditsComposer(Habbo habbo) { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserCreditsComposer); + + this.response.appendString(this.habbo.getHabboInfo().getCredits() + ".0"); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserCurrencyComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserCurrencyComposer.java new file mode 100644 index 00000000..c5f4e1f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserCurrencyComposer.java @@ -0,0 +1,81 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserCurrencyComposer extends MessageComposer +{ + + private final Habbo habbo; + + public UserCurrencyComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserCurrencyComposer); + + String[] pointsTypes = Emulator.getConfig().getValue("seasonal.types").split(";"); + this.response.appendInt(pointsTypes.length); + for(String s : pointsTypes) + { + int type = 0; + try + { + type = Integer.valueOf(s); + } + catch (Exception e){ + Emulator.getLogging().logErrorLine(e); + return null; + } + + this.response.appendInt(type); + this.response.appendInt(this.habbo.getHabboInfo().getCurrencyAmount(type)); + } + + //Size +// this.response.appendInt(11); +// +// this.response.appendInt(0); +// this.response.appendInt(this.habbo.getHabboInfo().getPixels()); +// +// this.response.appendInt(1); +// this.response.appendInt(this.habbo.getHabboInfo().get); +// +// this.response.appendInt(2); +// this.response.appendInt(0); +// +// this.response.appendInt(3); +// this.response.appendInt(0); +// +// this.response.appendInt(4); +// this.response.appendInt(0); +// +// this.response.appendInt(5); +// this.response.appendInt(0); +// +// +// this.response.appendInt(101); +// this.response.appendInt(0); +// +// this.response.appendInt(102); +// this.response.appendInt(0); +// +// this.response.appendInt(103); +// this.response.appendInt(0); +// +// this.response.appendInt(104); +// this.response.appendInt(0); +// +// this.response.appendInt(105); +// this.response.appendInt(this.habbo.getHabboInfo().getPoints()); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserDataComposer.java new file mode 100644 index 00000000..4d5457ab --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserDataComposer.java @@ -0,0 +1,40 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserDataComposer extends MessageComposer +{ + + private final Habbo habbo; + + public UserDataComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserDataComposer); + + this.response.appendInt(this.habbo.getHabboInfo().getId()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendString(this.habbo.getHabboInfo().getLook()); + this.response.appendString(this.habbo.getHabboInfo().getGender().name().toUpperCase()); + this.response.appendString(this.habbo.getHabboInfo().getMotto()); + this.response.appendString(this.habbo.getHabboInfo().getUsername()); + this.response.appendBoolean(false); + this.response.appendInt(this.habbo.getHabboStats().respectPointsReceived); + this.response.appendInt(this.habbo.getHabboStats().respectPointsToGive); + this.response.appendInt(this.habbo.getHabboStats().petRespectPointsToGive); + this.response.appendBoolean(false); + this.response.appendString("01-01-1970 00:00:00"); + this.response.appendBoolean(this.habbo.getHabboStats().allowNameChange); //can change name. + this.response.appendBoolean(false); //safatey locked + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserHomeRoomComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserHomeRoomComposer.java new file mode 100644 index 00000000..6e52a119 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserHomeRoomComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserHomeRoomComposer extends MessageComposer +{ + + private int homeRoom; + private int newRoom; + + public UserHomeRoomComposer(int homeRoom, int newRoom) + { + this.homeRoom = homeRoom; + this.newRoom = newRoom; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserHomeRoomComposer); + + this.response.appendInt(this.homeRoom); + this.response.appendInt(this.newRoom); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserPerksComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserPerksComposer.java new file mode 100644 index 00000000..09d16294 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserPerksComposer.java @@ -0,0 +1,87 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserPerksComposer extends MessageComposer +{ + private final Habbo habbo; + + public UserPerksComposer(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserPerksComposer); + + this.response.appendInt(15); + + this.response.appendString("USE_GUIDE_TOOL"); + this.response.appendString("requirement.unfulfilled.helper_level_4"); + this.response.appendBoolean(Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this.habbo, "acc_helper_use_guide_tool")); + + this.response.appendString("GIVE_GUIDE_TOURS"); + this.response.appendString(""); + this.response.appendBoolean(Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this.habbo, "acc_helper_give_guide_tours")); + + this.response.appendString("JUDGE_CHAT_REVIEWS"); + this.response.appendString("requirement.unfulfilled.helper_level_6"); + this.response.appendBoolean(Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this.habbo, "acc_helper_judge_chat_reviews")); + + this.response.appendString("VOTE_IN_COMPETITIONS"); + this.response.appendString("requirement.unfulfilled.helper_level_2"); + this.response.appendBoolean(true); + + this.response.appendString("CALL_ON_HELPERS"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("CITIZEN"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("TRADE"); + this.response.appendString("requirement.unfulfilled.no_trade_lock"); + this.response.appendBoolean(this.habbo.getHabboStats().allowTrade); + + this.response.appendString("HEIGHTMAP_EDITOR_BETA"); + this.response.appendString("requirement.unfulfilled.feature_disabled"); + this.response.appendBoolean(Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this.habbo, "acc_floorplan_editor")); + + this.response.appendString("BUILDER_AT_WORK"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("CALL_ON_HELPERS"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("CAMERA"); + this.response.appendString(""); + this.response.appendBoolean(Emulator.getGameEnvironment().getPermissionsManager().hasPermission(this.habbo, "acc_camera")); + + this.response.appendString("NAVIGATOR_PHASE_TWO_2014"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("MOUSE_ZOOM"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("NAVIGATOR_ROOM_THUMBNAIL_CAMERA"); + this.response.appendString(""); + this.response.appendBoolean(true); + + this.response.appendString("HABBO_CLUB_OFFER_BETA"); + this.response.appendString(""); + this.response.appendBoolean(true); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserPermissionsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserPermissionsComposer.java new file mode 100644 index 00000000..f1b90e69 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserPermissionsComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserPermissionsComposer extends MessageComposer +{ + private final int clubLevel; + + private final Habbo habbo; + + public UserPermissionsComposer(Habbo habbo) + { + this.clubLevel = habbo.getHabboStats().hasActiveClub() ? 2 : 0; + this.habbo = habbo; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserPermissionsComposer); + + this.response.appendInt(this.clubLevel); + this.response.appendInt(this.habbo.getHabboInfo().getRank().getLevel()); + this.response.appendBoolean(this.habbo.hasPermission("acc_ambassador")); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserPointsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserPointsComposer.java new file mode 100644 index 00000000..369539dd --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserPointsComposer.java @@ -0,0 +1,29 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserPointsComposer extends MessageComposer +{ + private final int currentAmount; + private final int amountAdded; + private final int type; + + public UserPointsComposer(int currentAmount, int amountAdded, int type) + { + this.currentAmount = currentAmount; + this.amountAdded = amountAdded; + this.type = type; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserPointsComposer); + this.response.appendInt(this.currentAmount); + this.response.appendInt(this.amountAdded); + this.response.appendInt(this.type); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java new file mode 100644 index 00000000..cc94d59c --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java @@ -0,0 +1,134 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class UserProfileComposer extends MessageComposer +{ + private final HabboInfo habboInfo; + private Habbo habbo; + private GameClient viewer; + + public UserProfileComposer(HabboInfo habboInfo, GameClient viewer) + { + this.habboInfo = habboInfo; + this.viewer = viewer; + } + + public UserProfileComposer(Habbo habbo, GameClient viewer) + { + this.habbo = habbo; + this.habboInfo = habbo.getHabboInfo(); + this.viewer = viewer; + } + + @Override + public ServerMessage compose() + { + if(this.habboInfo == null) + return null; + + this.response.init(Outgoing.UserProfileComposer); + + this.response.appendInt(this.habboInfo.getId()); + this.response.appendString(this.habboInfo.getUsername()); + this.response.appendString(this.habboInfo.getLook()); + this.response.appendString(this.habboInfo.getMotto()); + this.response.appendString(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date(this.habboInfo.getAccountCreated() * 1000L))); + + int achievementScore = 0; + if (this.habbo != null) + { + achievementScore = this.habbo.getHabboStats().getAchievementScore(); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT achievement_score FROM users_settings WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, this.habboInfo.getId()); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + achievementScore = set.getInt("achievement_score"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + this.response.appendInt(achievementScore); + this.response.appendInt(Messenger.getFriendCount(this.habboInfo.getId())); + this.response.appendBoolean(viewer.getHabbo().getMessenger().getFriends().containsKey(this.habboInfo.getId())); //Friend + this.response.appendBoolean(Messenger.friendRequested(this.viewer.getHabbo().getHabboInfo().getId(), this.habboInfo.getId())); //Friend Request Send + this.response.appendBoolean(this.habboInfo.isOnline()); + + List guilds = new ArrayList(); + if(this.habbo != null) + { + List toRemove = new ArrayList(); + for (int index = this.habbo.getHabboStats().guilds.size(); index > 0; index--) + { + int i = this.habbo.getHabboStats().guilds.get(index - 1); + if (i == 0) + continue; + + Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(i); + + if (guild != null) + { + guilds.add(guild); + } + else + { + toRemove.add(i); + } + } + + for (int i : toRemove) + { + this.habbo.getHabboStats().removeGuild(i); + } + } + else + { + guilds = Emulator.getGameEnvironment().getGuildManager().getGuilds(this.habboInfo.getId()); + } + + this.response.appendInt(guilds.size()); + for(Guild guild : guilds) + { + this.response.appendInt(guild.getId()); + this.response.appendString(guild.getName()); + this.response.appendString(guild.getBadge()); + this.response.appendString(Emulator.getGameEnvironment().getGuildManager().getSymbolColor(guild.getColorOne()).valueA); + this.response.appendString(Emulator.getGameEnvironment().getGuildManager().getSymbolColor(guild.getColorTwo()).valueA); + this.response.appendBoolean(habbo != null && guild.getId() == this.habbo.getHabboStats().guild); + this.response.appendInt(guild.getOwnerId()); + this.response.appendBoolean(guild.getOwnerId() == this.habboInfo.getId()); + } + + this.response.appendInt(Emulator.getIntUnixTimestamp() - this.habboInfo.getLastOnline()); //Secs ago. + this.response.appendBoolean(true); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserWardrobeComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserWardrobeComposer.java new file mode 100644 index 00000000..07ac4369 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserWardrobeComposer.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.outgoing.users; + +import com.eu.habbo.habbohotel.users.inventory.WardrobeComponent; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class UserWardrobeComposer extends MessageComposer +{ + + private WardrobeComponent wardrobeComponent; + + public UserWardrobeComposer(WardrobeComponent wardrobeComponent) + { + this.wardrobeComponent = wardrobeComponent; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.UserWardrobeComposer); + this.response.appendInt(1); + this.response.appendInt(this.wardrobeComponent.getLooks().size()); + for(WardrobeComponent.WardrobeItem wardrobeItem : this.wardrobeComponent.getLooks().values()) + { + this.response.appendInt(wardrobeItem.getSlotId()); + this.response.appendString(wardrobeItem.getLook()); + this.response.appendString(wardrobeItem.getGender().name().toUpperCase()); + } + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredConditionDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredConditionDataComposer.java new file mode 100644 index 00000000..7755497d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredConditionDataComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.wired; + +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WiredConditionDataComposer extends MessageComposer +{ + private final InteractionWiredCondition condition; + private final Room room; + + public WiredConditionDataComposer(InteractionWiredCondition condition, Room room) + { + this.condition = condition; + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WiredConditionDataComposer); + this.condition.serializeWiredData(this.response, room); + this.condition.needsUpdate(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredEffectDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredEffectDataComposer.java new file mode 100644 index 00000000..532413c1 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredEffectDataComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.wired; + +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WiredEffectDataComposer extends MessageComposer +{ + private final InteractionWiredEffect effect; + private final Room room; + + public WiredEffectDataComposer(InteractionWiredEffect effect, Room room) + { + this.effect = effect; + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WiredEffectDataComposer); + this.effect.serializeWiredData(this.response, room); + this.effect.needsUpdate(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredSavedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredSavedComposer.java new file mode 100644 index 00000000..92166cab --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredSavedComposer.java @@ -0,0 +1,16 @@ +package com.eu.habbo.messages.outgoing.wired; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WiredSavedComposer extends MessageComposer +{ + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WiredSavedComposer); + + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredTriggerDataComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredTriggerDataComposer.java new file mode 100644 index 00000000..edfeacdb --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/wired/WiredTriggerDataComposer.java @@ -0,0 +1,28 @@ +package com.eu.habbo.messages.outgoing.wired; + +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class WiredTriggerDataComposer extends MessageComposer +{ + private final InteractionWiredTrigger trigger; + private final Room room; + + public WiredTriggerDataComposer(InteractionWiredTrigger trigger, Room room) + { + this.trigger = trigger; + this.room = room; + } + + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.WiredTriggerDataComposer); + this.trigger.serializeWiredData(this.response, room); + this.trigger.needsUpdate(true); + return this.response; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/AlertUser.java b/src/main/java/com/eu/habbo/messages/rcon/AlertUser.java new file mode 100644 index 00000000..6db2c17a --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/AlertUser.java @@ -0,0 +1,36 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.google.gson.Gson; + +public class AlertUser extends RCONMessage +{ + /** + * Sends an alert to an online user. + */ + public AlertUser() + { + super(JSONAlertUser.class); + } + + @Override + public void handle(Gson gson, JSONAlertUser object) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(object.user_id); + + if(habbo != null) + { + habbo.getClient().sendResponse(new GenericAlertComposer(object.message)); + } + + this.status = RCONMessage.HABBO_NOT_FOUND; + } + + public class JSONAlertUser + { + public int user_id; + public String message; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/ChangeRoomOwner.java b/src/main/java/com/eu/habbo/messages/rcon/ChangeRoomOwner.java new file mode 100644 index 00000000..d4fda536 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/ChangeRoomOwner.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.google.gson.Gson; + +public class ChangeRoomOwner extends RCONMessage +{ + public ChangeRoomOwner() + { + super(JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(json.room_id); + + if (room != null) + { + room.setOwnerId(json.user_id); + room.setOwnerName(json.username); + room.setNeedsUpdate(true); + room.save(); + Emulator.getGameEnvironment().getRoomManager().unloadRoom(room); + } + } + + public static class JSON + { + public int room_id; + public int user_id; + public String username; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/CreateModToolTicket.java b/src/main/java/com/eu/habbo/messages/rcon/CreateModToolTicket.java new file mode 100644 index 00000000..81c9120e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/CreateModToolTicket.java @@ -0,0 +1,32 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.modtool.ModToolTicketType; +import com.google.gson.Gson; + +public class CreateModToolTicket extends RCONMessage +{ + public CreateModToolTicket() + { + super(JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + ModToolIssue issue = new ModToolIssue(json.sender_id, json.sender_username, json.reported_id, json.reported_username, json.reported_room_id, json.message, ModToolTicketType.NORMAL); + Emulator.getGameEnvironment().getModToolManager().addTicket(issue); + Emulator.getGameEnvironment().getModToolManager().updateTicketToMods(issue); + } + + public class JSON + { + public int sender_id; + public String sender_username; + public int reported_id; + public String reported_username; + public int reported_room_id = 0; + public String message; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/DisconnectUser.java b/src/main/java/com/eu/habbo/messages/rcon/DisconnectUser.java new file mode 100644 index 00000000..fa0162ab --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/DisconnectUser.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +public class DisconnectUser extends RCONMessage +{ + /** + * Disconnects an user. + */ + public DisconnectUser() + { + super(DisconnectUserJSON.class); + } + + @Override + public void handle(Gson gson, DisconnectUserJSON json) + { + Habbo target = null; + + if (json.user_id >= 0) + { + target = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + } + else if (!json.username.isEmpty()) + { + target = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.username); + } + else + { + this.status = RCONMessage.HABBO_NOT_FOUND; + return; + } + + if(target == null) + { + this.status = RCONMessage.STATUS_ERROR; + this.message = Emulator.getTexts().getValue("commands.error.cmd_disconnect.user_offline"); + return; + } + + target.getClient().getChannel().close(); + this.message = Emulator.getTexts().getValue("commands.succes.cmd_disconnect.disconnected").replace("%user%", target.getHabboInfo().getUsername()); + } + + public class DisconnectUserJSON + { + public int user_id = -1; + public String username; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/ExecuteCommand.java b/src/main/java/com/eu/habbo/messages/rcon/ExecuteCommand.java new file mode 100644 index 00000000..59903d40 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/ExecuteCommand.java @@ -0,0 +1,46 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.commands.CommandHandler; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +public class ExecuteCommand extends RCONMessage +{ + /** + * Executes a command as an user. Still requires the user to have the proper permissions set. + */ + public ExecuteCommand() + { + super(JSONExecuteCommand.class); + } + + @Override + public void handle(Gson gson, JSONExecuteCommand json) + { + try + { + Habbo habbo = Emulator.getGameServer().getGameClientManager().getHabbo(json.user_id); + + if (habbo == null) + { + status = HABBO_NOT_FOUND; + return; + } + + + CommandHandler.handleCommand(habbo.getClient(), json.command); + } + catch (Exception e) + { + status = STATUS_ERROR; + Emulator.getLogging().logErrorLine(e); + } + } + + public class JSONExecuteCommand + { + public int user_id; + public String command; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/ForwardUser.java b/src/main/java/com/eu/habbo/messages/rcon/ForwardUser.java new file mode 100644 index 00000000..7df87502 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/ForwardUser.java @@ -0,0 +1,53 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.eu.habbo.messages.outgoing.rooms.RoomOpenComposer; +import com.google.gson.Gson; + +public class ForwardUser extends RCONMessage +{ + /** + * Forwards an user to a room. + */ + public ForwardUser() + { + super(ForwardUserJSON.class); + } + + @Override + public void handle(Gson gson, ForwardUserJSON object) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(object.user_id); + + if(habbo != null) + { + Room room = Emulator.getGameEnvironment().getRoomManager().loadRoom(object.room_id); + + if(room != null) + { + if (habbo.getHabboInfo().getCurrentRoom() != null) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, habbo.getHabboInfo().getCurrentRoom()); + } + + habbo.getClient().sendResponse(new ForwardToRoomComposer(object.room_id)); + Emulator.getGameEnvironment().getRoomManager().enterRoom(habbo, object.room_id, "", true); + } + else + { + this.status = RCONMessage.ROOM_NOT_FOUND; + } + } + + this.status = RCONMessage.HABBO_NOT_FOUND; + } + + public class ForwardUserJSON + { + public int user_id; + public int room_id; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/FriendRequest.java b/src/main/java/com/eu/habbo/messages/rcon/FriendRequest.java new file mode 100644 index 00000000..db273ce5 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/FriendRequest.java @@ -0,0 +1,66 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; +import com.eu.habbo.messages.outgoing.friends.FriendRequestComposer; +import com.google.gson.Gson; + +public class FriendRequest extends RCONMessage +{ + public FriendRequest() + { + super(FriendRequest.JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + if (!Messenger.friendRequested(json.user_id, json.target_id)) + { + Messenger.makeFriendRequest(json.user_id, json.target_id); + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.target_id); + if (target != null) + { + Habbo from = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + if (from != null) + { + target.getClient().sendResponse(new FriendRequestComposer(from)); + } + else + { + final HabboInfo info = HabboManager.getOfflineHabboInfo(json.user_id); + + if (info != null) + { + target.getClient().sendResponse(new MessageComposer() + { + @Override + public ServerMessage compose() + { + this.response.init(Outgoing.FriendRequestComposer); + this.response.appendInt(info.getId()); + this.response.appendString(info.getUsername()); + this.response.appendString(info.getLook()); + return this.response; + } + }); + } + } + } + } + } + + public class JSON + { + public int user_id; + public int target_id; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/GiveBadge.java b/src/main/java/com/eu/habbo/messages/rcon/GiveBadge.java new file mode 100644 index 00000000..796f67c2 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/GiveBadge.java @@ -0,0 +1,114 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboBadge; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserWhisperComposer; +import com.eu.habbo.messages.outgoing.users.AddUserBadgeComposer; +import com.google.gson.Gson; + +import java.sql.*; + +public class GiveBadge extends RCONMessage +{ + /** + * Sends a badge to an user. + * Insers it if the user is not found. + */ + public GiveBadge() + { + super(GiveBadgeJSON.class); + } + + @Override + public void handle(Gson gson, GiveBadgeJSON json) + { + if (json.user_id == -1) + { + this.status = RCONMessage.HABBO_NOT_FOUND; + return; + } + + if (json.badge.isEmpty()) + { + this.status = RCONMessage.SYSTEM_ERROR; + return; + } + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + String username = json.user_id + ""; + if(habbo != null) + { + username = habbo.getHabboInfo().getUsername(); + + for (String badgeCode : json.badge.split(";")) + { + if (habbo.getInventory().getBadgesComponent().hasBadge(badgeCode)) + { + this.status = RCONMessage.STATUS_ERROR; + this.message += Emulator.getTexts().getValue("commands.error.cmd_badge.already_owned").replace("%user%", username).replace("%badge%", badgeCode) + "\r"; + continue; + } + + HabboBadge badge = new HabboBadge(0, badgeCode, 0, habbo); + + badge.run(); + + habbo.getInventory().getBadgesComponent().addBadge(badge); + habbo.getClient().sendResponse(new AddUserBadgeComposer(badge)); + + this.message = Emulator.getTexts().getValue("commands.succes.cmd_badge.given").replace("%user%", username).replace("%badge%", badgeCode); + } + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) + { + for (String badgeCode : json.badge.split(";")) + { + boolean found = false; + try (PreparedStatement statement = connection.prepareStatement("SELECT COUNT(slot_id) FROM users_badges INNER JOIN users ON users.id = user_id WHERE users.id = ? AND badge_code = ? LIMIT 1")) + { + statement.setInt(1, json.user_id); + statement.setString(2, badgeCode); + try (ResultSet set = statement.executeQuery()) + { + found = set.next(); + } + } + + if (found) + { + this.status = RCONMessage.STATUS_ERROR; + this.message += Emulator.getTexts().getValue("commands.error.cmd_badge.already_owns").replace("%user%", username).replace("%badge%", badgeCode) + "\r"; + } else + { + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO users_badges VALUES (null, (SELECT id FROM users WHERE users.id = ? LIMIT 1), 0, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, json.user_id); + statement.setString(2, badgeCode); + statement.execute(); + } + + this.message = Emulator.getTexts().getValue("commands.succes.cmd_badge.given").replace("%user%", username).replace("%badge%", badgeCode); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + this.status = RCONMessage.STATUS_ERROR; + this.message = e.getMessage(); + } + } + } + + public class GiveBadgeJSON + { + public int user_id = -1; + public String badge; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java b/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java new file mode 100644 index 00000000..08e3f82d --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class GiveCredits extends RCONMessage +{ + /** + * Gives credits an user. + * Updates the database if the user is not online. + */ + public GiveCredits() + { + super(JSONGiveCredits.class); + } + + @Override + public void handle(Gson gson, JSONGiveCredits object) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(object.user_id); + + if (habbo != null) + { + habbo.giveCredits(object.credits); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET credits = credits + ? WHERE id = ? LIMIT 1")) + { + statement.setInt(1, object.credits); + statement.setInt(2, object.user_id); + statement.execute(); + } + catch (SQLException e) + { + this.status = RCONMessage.SYSTEM_ERROR; + Emulator.getLogging().logSQLException(e); + } + + this.message = "offline"; + } + } + + public class JSONGiveCredits + { + private int user_id; + private int credits; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/GivePixels.java b/src/main/java/com/eu/habbo/messages/rcon/GivePixels.java new file mode 100644 index 00000000..7bd52b13 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/GivePixels.java @@ -0,0 +1,54 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class GivePixels extends RCONMessage +{ + /** + * Sends pixels to an user. + * Updates the database if the user is not online. + */ + public GivePixels() + { + super(JSONGivePixels.class); + } + + @Override + public void handle(Gson gson, JSONGivePixels object) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(object.user_id); + + if(habbo != null) + { + habbo.givePixels(object.pixels); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_currency SET users_currency.amount = users_currency.amount + ? WHERE users_currency.user_id = ? AND users_currency.type = 0")) + { + statement.setInt(1, object.pixels); + statement.setInt(2, object.user_id); + statement.execute(); + } + catch (SQLException e) + { + this.status = RCONMessage.SYSTEM_ERROR; + Emulator.getLogging().logSQLException(e); + } + + this.message = "offline"; + } + } + + public class JSONGivePixels + { + private int user_id; + private int pixels; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/GivePoints.java b/src/main/java/com/eu/habbo/messages/rcon/GivePoints.java new file mode 100644 index 00000000..c94b5ff9 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/GivePoints.java @@ -0,0 +1,57 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class GivePoints extends RCONMessage +{ + /** + * Sends points of any type (including pixels) to an user. + * Updates the database if the user is not online. + */ + public GivePoints() + { + super(JSONGivePoints.class); + } + + @Override + public void handle(Gson gson, JSONGivePoints object) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(object.user_id); + + if (habbo != null) + { + habbo.givePoints(object.type, object.points); + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO users_currency (`user_id`, `type`, `amount`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE amount = amount + ?")) + { + statement.setInt(1, object.user_id); + statement.setInt(2, object.type); + statement.setInt(3, object.points); + statement.setInt(4, object.points); + statement.execute(); + } + catch (SQLException e) + { + this.status = RCONMessage.SYSTEM_ERROR; + Emulator.getLogging().logSQLException(e); + } + + this.message = "offline"; + } + } + + public class JSONGivePoints + { + private int user_id; + private int points; + private int type; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/HotelAlert.java b/src/main/java/com/eu/habbo/messages/rcon/HotelAlert.java new file mode 100644 index 00000000..6bd91ab3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/HotelAlert.java @@ -0,0 +1,27 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.google.gson.Gson; + +public class HotelAlert extends RCONMessage +{ + /** + * Sends an hotel alert. + */ + public HotelAlert() + { + super(JSONHotelAlert.class); + } + + @Override + public void handle(Gson gson, JSONHotelAlert object) + { + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new GenericAlertComposer(object.message)); + } + + public class JSONHotelAlert + { + private String message; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/ImageHotelAlert.java b/src/main/java/com/eu/habbo/messages/rcon/ImageHotelAlert.java new file mode 100644 index 00000000..c895c883 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/ImageHotelAlert.java @@ -0,0 +1,34 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.google.gson.Gson; +import gnu.trove.map.hash.THashMap; + +public class ImageHotelAlert extends RCONMessage +{ + public ImageHotelAlert() + { + super(ImageHotelAlert.JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + THashMap keys = new THashMap<>(); + keys.put("message", json.message); + keys.put("linkUrl", json.url); + keys.put("linkTitle", json.url_messaege); + keys.put("title", json.title); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new BubbleAlertComposer(json.bubble_key, keys).compose()); + } + + public class JSON + { + public String bubble_key; + public String message; + public String url; + public String url_messaege; + public String title; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/MuteUser.java b/src/main/java/com/eu/habbo/messages/rcon/MuteUser.java new file mode 100644 index 00000000..1f603cc3 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/MuteUser.java @@ -0,0 +1,58 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class MuteUser extends RCONMessage +{ + public MuteUser(Class type) + { + super(type); + } + + @Override + public void handle(Gson gson, JSON json) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + if (habbo != null) + { + if (json.duration == 0) + { + habbo.unMute(); + } + else + { + habbo.mute(json.duration); + } + } + else + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_settings SET mute_end_timestamp = ? WHERE user_id = ? LIMIT 1")) + { + statement.setInt(1, Emulator.getIntUnixTimestamp() + json.duration); + statement.setInt(2, json.user_id); + if (statement.executeUpdate() == 0) + { + this.status = HABBO_NOT_FOUND; + } + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + } + + public class JSON + { + public int user_id; + public int duration; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/ProgressAchievement.java b/src/main/java/com/eu/habbo/messages/rcon/ProgressAchievement.java new file mode 100644 index 00000000..bfac6c69 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/ProgressAchievement.java @@ -0,0 +1,49 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +public class ProgressAchievement extends RCONMessage +{ + /** + * Progresses an achievement for an ONLINE user. + * Achievements for offline users are not managed by the emulator. + */ + public ProgressAchievement() + { + super(ProgressAchievementJSON.class); + } + + @Override + public void handle(Gson gson, ProgressAchievementJSON json) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + if (habbo != null) + { + Achievement achievement = Emulator.getGameEnvironment().getAchievementManager().getAchievement(json.achievement_id); + if (achievement != null) + { + AchievementManager.progressAchievement(habbo, achievement, json.progress); + } + else + { + this.status = RCONMessage.STATUS_ERROR; + } + } + else + { + this.status = RCONMessage.HABBO_NOT_FOUND; + } + } + + public class ProgressAchievementJSON + { + public int user_id; + public int achievement_id; + public int progress; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/RCONMessage.java b/src/main/java/com/eu/habbo/messages/rcon/RCONMessage.java new file mode 100644 index 00000000..61a7e0bf --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/RCONMessage.java @@ -0,0 +1,65 @@ +package com.eu.habbo.messages.rcon; + +import java.lang.reflect.Type; + +import com.google.gson.*; + +public abstract class RCONMessage +{ + /** + * The RCON Message has been handled succesfully. + */ + public final static int STATUS_OK = 0; + + /** + * The RCON Message could not be handled succesfully. + */ + public final static int STATUS_ERROR = 1; + + /** + * The given user could not be found. + */ + public final static int HABBO_NOT_FOUND = 2; + + /** + * The given room could not be found. + */ + public final static int ROOM_NOT_FOUND = 3; + + /** + * An unknown error occurred. + */ + public final static int SYSTEM_ERROR = 4; + + /** + * The class the JSON gets mapped to. + */ + public final Class type; + + public RCONMessage(Class type) + { + this.type = type; + } + + /** + * + * @param gson + * @param json The mapped JSON object. + * @return A string that gets send to the RCON Client. Can be anything (JSON / XML) whatever you want. + */ + public abstract void handle(Gson gson, T json); + + public int status = STATUS_OK; + public String message = ""; + + public static class RCONMessageSerializer implements JsonSerializer + { + public JsonElement serialize(final RCONMessage rconMessage, final Type type, final JsonSerializationContext context) + { + JsonObject result = new JsonObject(); + result.add("status", new JsonPrimitive(rconMessage.status)); + result.add("message", new JsonPrimitive(rconMessage.message)); + return result; + } + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/SendGift.java b/src/main/java/com/eu/habbo/messages/rcon/SendGift.java new file mode 100644 index 00000000..2eb9b656 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/SendGift.java @@ -0,0 +1,110 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SendGift extends RCONMessage +{ + /** + * Sends a gift to an user. + */ + public SendGift() + { + super(SendGiftJSON.class); + } + + @Override + public void handle(Gson gson, SendGiftJSON json) + { + if (json.user_id < 0) + { + this.status = RCONMessage.STATUS_ERROR; + this.message = Emulator.getTexts().getValue("commands.error.cmd_gift.user_not_found").replace("%username%", json.user_id + ""); + return; + } + + if(json.itemid < 0) + { + this.status = RCONMessage.STATUS_ERROR; + this.message = Emulator.getTexts().getValue("commands.error.cmd_gift.not_a_number"); + return; + } + + Item baseItem = Emulator.getGameEnvironment().getItemManager().getItem(json.itemid); + if(baseItem == null) + { + this.status = RCONMessage.STATUS_ERROR; + this.message = Emulator.getTexts().getValue("commands.error.cmd_gift.not_found").replace("%itemid%", json.itemid + ""); + return; + } + + boolean userFound; + Habbo habbo; + + habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + userFound = habbo != null; + String username = ""; + if (!userFound) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE id = ? LIMIT 1")) + { + statement.setInt(1, json.user_id); + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + username = set.getString("username"); + userFound = true; + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + else + { + username = habbo.getHabboInfo().getUsername(); + } + + if (!userFound) + { + this.status = RCONMessage.STATUS_ERROR; + this.message = Emulator.getTexts().getValue("commands.error.cmd_gift.user_not_found").replace("%username%", username); + return; + } + + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(0, baseItem, 0, 0, ""); + Item giftItem = Emulator.getGameEnvironment().getItemManager().getItem((Integer)Emulator.getGameEnvironment().getCatalogManager().giftFurnis.values().toArray()[Emulator.getRandom().nextInt(Emulator.getGameEnvironment().getCatalogManager().giftFurnis.size())]); + + String extraData = "1\t" + item.getId(); + extraData += "\t0\t0\t0\t"+ json.message +"\t0\t0"; + + Emulator.getGameEnvironment().getItemManager().createGift(username, giftItem, extraData, 0, 0); + + this.message = Emulator.getTexts().getValue("commands.succes.cmd_gift").replace("%username%", username).replace("%itemname%", item.getBaseItem().getName()); + + if (habbo != null) + { + habbo.getClient().sendResponse(new InventoryRefreshComposer()); + } + } + + public class SendGiftJSON + { + public int user_id = -1; + public int itemid = -1; + public String message = ""; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/SendRoomBundle.java b/src/main/java/com/eu/habbo/messages/rcon/SendRoomBundle.java new file mode 100644 index 00000000..557d1e8e --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/SendRoomBundle.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.catalog.CatalogPage; +import com.eu.habbo.habbohotel.catalog.layouts.RoomBundleLayout; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboInfo; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.google.gson.Gson; + +public class SendRoomBundle extends RCONMessage +{ + public SendRoomBundle() + { + super(JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + if (json.catalog_page > 0 && json.user_id > 0) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(json.catalog_page); + + if (page != null && (page instanceof RoomBundleLayout)) + { + String username = ""; + + if (habbo != null) + { + ((RoomBundleLayout) page).buyRoom(habbo); + } + else + { + HabboInfo info = HabboManager.getOfflineHabboInfo(json.user_id); + + if (info != null) + { + ((RoomBundleLayout) page).buyRoom(null, json.user_id, info.getUsername()); + } + } + } + } + } + + public class JSON + { + public int user_id; + public int catalog_page; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/SetRank.java b/src/main/java/com/eu/habbo/messages/rcon/SetRank.java new file mode 100644 index 00000000..30c01150 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/SetRank.java @@ -0,0 +1,52 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.users.UserPerksComposer; +import com.eu.habbo.messages.outgoing.users.UserPermissionsComposer; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +public class SetRank extends RCONMessage +{ + /** + * Sets the rank for an user. + * Updates the database if the user is not online. + */ + public SetRank() + { + super(JSONSetRank.class); + } + + @Override + public void handle(Gson gson, JSONSetRank object) + { + try + { + Emulator.getGameEnvironment().getHabboManager().setRank(object.user_id, object.rank); + } + catch (Exception e) + { + this.status = RCONMessage.SYSTEM_ERROR; + this.message = "invalid rank"; + return; + } + + this.message = "updated offline user"; + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(object.user_id); + + if(habbo != null) + { + this.message = "updated online user"; + } + } + + public class JSONSetRank + { + public int user_id; + public int rank; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/StaffAlert.java b/src/main/java/com/eu/habbo/messages/rcon/StaffAlert.java new file mode 100644 index 00000000..748168d4 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/StaffAlert.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.google.gson.Gson; + +public class StaffAlert extends RCONMessage +{ + public StaffAlert() + { + super(JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + Emulator.getGameEnvironment().getHabboManager().staffAlert(json.message); + } + + public class JSON + { + public String message; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/StalkUser.java b/src/main/java/com/eu/habbo/messages/rcon/StalkUser.java new file mode 100644 index 00000000..b8ec2381 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/StalkUser.java @@ -0,0 +1,60 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.ForwardToRoomComposer; +import com.google.gson.Gson; + +public class StalkUser extends RCONMessage +{ + public StalkUser() + { + super(StalkUserJSON.class); + } + + @Override + public void handle(Gson gson, StalkUserJSON json) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + if (habbo != null) + { + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.follow_id); + + if(target == null) + { + this.message = Emulator.getTexts().getValue("commands.error.cmd_stalk.not_found").replace("%user%", json.user_id + ""); + this.status = STATUS_ERROR; + } + + if(target.getHabboInfo().getCurrentRoom() == null) + { + this.message = Emulator.getTexts().getValue("commands.error.cmd_stalk.not_room").replace("%user%", json.user_id + ""); + this.status = STATUS_ERROR; + } + + if(target.getHabboInfo().getUsername().equals(habbo.getHabboInfo().getUsername())) + { + this.message = Emulator.getTexts().getValue("commands.generic.cmd_stalk.self").replace("%user%", json.user_id + ""); + this.status = STATUS_ERROR; + } + + if(target.getHabboInfo().getCurrentRoom() == habbo.getHabboInfo().getCurrentRoom()) + { + this.message = Emulator.getTexts().getValue("commands.generic.cmd_stalk.same_room").replace("%user%", json.user_id + ""); + this.status = STATUS_ERROR; + } + + if (this.status == 0) + { + habbo.getClient().sendResponse(new ForwardToRoomComposer(target.getHabboInfo().getCurrentRoom().getId())); + } + } + } + + public class StalkUserJSON + { + public int user_id; + public int follow_id; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/TalkUser.java b/src/main/java/com/eu/habbo/messages/rcon/TalkUser.java new file mode 100644 index 00000000..838da552 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/TalkUser.java @@ -0,0 +1,47 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.google.gson.Gson; + +public class TalkUser extends RCONMessage +{ + public TalkUser() + { + super(JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + if (habbo != null) + { + json.type = json.type.toLowerCase(); + switch (json.type) + { + case "talk": habbo.talk(json.message, json.bubble_id != -1 ? RoomChatMessageBubbles.getBubble(json.bubble_id) : habbo.getHabboStats().chatColor); break; + case "whisper": habbo.whisper(json.message, json.bubble_id != -1 ? RoomChatMessageBubbles.getBubble(json.bubble_id) : habbo.getHabboStats().chatColor); break; + case "shout": habbo.shout(json.message, json.bubble_id != -1 ? RoomChatMessageBubbles.getBubble(json.bubble_id) : habbo.getHabboStats().chatColor); break; + default: + this.status = STATUS_ERROR; + this.message = "Talk type: " + json.type + " not found! Use talk, whisper or shout!"; + } + } + else + { + this.status = HABBO_NOT_FOUND; + this.message = "offline"; + } + } + + public static class JSON + { + public String type; + public int user_id; + public int bubble_id = -1; + public String message; + } +} diff --git a/src/main/java/com/eu/habbo/messages/rcon/UpdateCatalog.java b/src/main/java/com/eu/habbo/messages/rcon/UpdateCatalog.java new file mode 100644 index 00000000..d1b97b4b --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/UpdateCatalog.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.outgoing.catalog.*; +import com.eu.habbo.messages.outgoing.catalog.marketplace.MarketplaceConfigComposer; +import com.google.gson.Gson; + +public class UpdateCatalog extends RCONMessage +{ + /** + * Updates the catalog. + */ + public UpdateCatalog() + { + super(JSONUpdateCatalog.class); + } + + @Override + public void handle(Gson gson, JSONUpdateCatalog json) + { + Emulator.getGameEnvironment().getCatalogManager().initialize(); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new CatalogUpdatedComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new CatalogModeComposer(0)); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new DiscountComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new MarketplaceConfigComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new GiftConfigurationComposer()); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new RecyclerLogicComposer()); + Emulator.getGameEnvironment().getCraftingManager().reload(); + } + + public class JSONUpdateCatalog + { + + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/UpdateUser.java b/src/main/java/com/eu/habbo/messages/rcon/UpdateUser.java new file mode 100644 index 00000000..444b534f --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/UpdateUser.java @@ -0,0 +1,119 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.users.MeMenuSettingsComposer; +import com.eu.habbo.messages.outgoing.users.UserPermissionsComposer; +import com.google.gson.Gson; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class UpdateUser extends RCONMessage +{ + public UpdateUser() + { + super(UpdateUser.JSON.class); + } + + @Override + public void handle(Gson gson, JSON json) + { + if (json.user_id > 0) + { + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(json.user_id); + + if (habbo != null) + { + habbo.getHabboStats().addAchievementScore(json.achievement_score); + + if (json.block_following != -1) + { + habbo.getHabboStats().blockFollowing = json.block_following == 1; + } + + if (json.block_friendrequests != -1) + { + habbo.getHabboStats().blockFriendRequests = json.block_friendrequests == 1; + } + + if (json.block_roominvites != -1) + { + habbo.getHabboStats().blockRoomInvites = json.block_roominvites == 1; + } + + if (json.old_chat != -1) + { + habbo.getHabboStats().preferOldChat = json.old_chat == 1; + } + + if (json.block_camera_follow != -1) + { + habbo.getHabboStats().blockCameraFollow = json.block_camera_follow == 1; + } + + habbo.getClient().sendResponse(new MeMenuSettingsComposer(habbo)); + } + else + { + int index = 1; + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users_settings SET achievement_score = achievement_score + ? " + + (json.block_following != -1 ? ", block_following = ?" : "") + + (json.block_friendrequests != -1 ? ", block_friendrequests = ?" : "") + + (json.block_roominvites != -1 ? ", block_roominvites = ?" : "") + + (json.old_chat != -1 ? ", old_chat = ?" : "") + + (json.block_camera_follow != -1 ? ", block_camera_follow = ?" : "") + + " WHERE user_id = ? LIMIT 1")) + { + statement.setInt(index, json.achievement_score); + index++; + + if (json.block_following != -1) + { + statement.setString(index, json.block_following == 1 ? "1" : "0"); + index++; + } + if (json.block_friendrequests != -1) + { + statement.setString(index, json.block_friendrequests == 1 ? "1" : "0"); + index++; + } + if (json.block_roominvites != -1) + { + statement.setString(index, json.block_roominvites == 1 ? "1" : "0"); + index++; + } + if (json.old_chat != -1) + { + statement.setString(index, json.old_chat == 1 ? "1" : "0"); + index++; + } + if (json.block_camera_follow != -1) + { + statement.setString(index, json.block_camera_follow == 1 ? "1" : "0"); + index++; + } + statement.setInt(index, json.user_id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + } + } + + public class JSON + { + public int user_id; + public int achievement_score = 0; + public int block_following = -1; + public int block_friendrequests = -1; + public int block_roominvites = -1; + public int old_chat = -1; + public int block_camera_follow = -1; + //More could be added in the future. + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/rcon/UpdateWordfilter.java b/src/main/java/com/eu/habbo/messages/rcon/UpdateWordfilter.java new file mode 100644 index 00000000..358e51fc --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/rcon/UpdateWordfilter.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.rcon; + +import com.eu.habbo.Emulator; +import com.google.gson.Gson; + +public class UpdateWordfilter extends RCONMessage +{ + /** + * Updates the wordfilter. + */ + public UpdateWordfilter() + { + super(WordFilterJSON.class); + } + + @Override + public void handle(Gson gson, WordFilterJSON object) + { + Emulator.getGameEnvironment().getWordFilter().reload(); + } + + protected class WordFilterJSON + { + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraClient.java b/src/main/java/com/eu/habbo/networking/camera/CameraClient.java new file mode 100644 index 00000000..0cc0fe96 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraClient.java @@ -0,0 +1,110 @@ +package com.eu.habbo.networking.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.networking.camera.messages.outgoing.CameraLoginComposer; +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.UnpooledByteBufAllocator; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +public class CameraClient +{ + public static final String host = "arcturus.wf"; + public static final int port = 1232; + public static ChannelFuture channelFuture; + public static Channel channel; + public static boolean isLoggedIn = false; + public static boolean attemptReconnect = true; + + private Bootstrap bootstrap = new Bootstrap(); + private EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + + public CameraClient() + { + + bootstrap.group(eventLoopGroup); + bootstrap.channel(NioSocketChannel.class); + bootstrap.option(ChannelOption.TCP_NODELAY, true); + bootstrap.option(ChannelOption.SO_KEEPALIVE, false); + bootstrap.handler(new ChannelInitializer() + { + @Override + public void initChannel(SocketChannel ch) throws Exception + { + ch.pipeline().addLast(new CameraDecoder()); + ch.pipeline().addLast(new CameraHandler()); + } + }); + bootstrap.option(ChannelOption.SO_RCVBUF, 5120); + bootstrap.option(ChannelOption.SO_REUSEADDR, true); + bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(5120)); + bootstrap.option(ChannelOption.ALLOCATOR, new UnpooledByteBufAllocator(false)); + } + + public void connect() + { + CameraClient.channelFuture = this.bootstrap.connect(host, port); + + while (!CameraClient.channelFuture.isDone()) + { + } + + if (CameraClient.channelFuture.isSuccess()) + { + CameraClient.attemptReconnect = false; + CameraClient.channel = channelFuture.channel(); + System.out.println("[" + Logging.ANSI_GREEN + "CAMERA" + Logging.ANSI_RESET + "] Connected to the Camera Server. Attempting to login..."); + sendMessage(new CameraLoginComposer()); + } + else + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Failed to connect to the Camera Server. Server unreachable."); + CameraClient.channel = null; + CameraClient.channelFuture.channel().close(); + CameraClient.channelFuture = null; + CameraClient.attemptReconnect = true; + } + } + + public void disconnect() + { + if (channelFuture != null) + { + try + { + channelFuture.channel().close().sync(); + channelFuture = null; + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + channel = null; + isLoggedIn = false; + + System.out.println("[" + Logging.ANSI_GREEN + "CAMERA" + Logging.ANSI_RESET + "] Disconnected from the camera server."); + } + + public void sendMessage(CameraOutgoingMessage outgoingMessage) + { + try + { + if (isLoggedIn || outgoingMessage instanceof CameraLoginComposer) + { + outgoingMessage.compose(channel); + channel.write(outgoingMessage.get().copy(), channel.voidPromise()); + channel.flush(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraDecoder.java b/src/main/java/com/eu/habbo/networking/camera/CameraDecoder.java new file mode 100644 index 00000000..b233d503 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraDecoder.java @@ -0,0 +1,33 @@ +package com.eu.habbo.networking.camera; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +public class CameraDecoder extends ByteToMessageDecoder +{ + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List objects) + { + int readerIndex = byteBuf.readerIndex(); + if(byteBuf.readableBytes() < 6) + { + byteBuf.readerIndex(readerIndex); + return; + } + + int length = byteBuf.readInt(); + byteBuf.readerIndex(readerIndex); + + if(byteBuf.readableBytes() < (length)) + { + byteBuf.readerIndex(readerIndex); + return; + } + + byteBuf.readerIndex(readerIndex); + objects.add(byteBuf.readBytes(length + 4)); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraHandler.java b/src/main/java/com/eu/habbo/networking/camera/CameraHandler.java new file mode 100644 index 00000000..6e4c80a2 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraHandler.java @@ -0,0 +1,68 @@ +package com.eu.habbo.networking.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.threading.runnables.CameraClientAutoReconnect; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +public class CameraHandler extends ChannelInboundHandlerAdapter +{ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) + { + try + { + ByteBuf message = (ByteBuf) msg; + ((ByteBuf) msg).readerIndex(0); + int length = message.readInt(); + + ByteBuf b = Unpooled.wrappedBuffer(message.readBytes(length)); + + short header = b.readShort(); + + try + { + CameraPacketHandler.instance().handle(ctx.channel(), header, b); + } + catch (Exception e) + { + + } + finally + { + try + { + + b.release(); + } + catch (Exception e) + {} + try + { + + ((ByteBuf) msg).release(); + } + catch (Exception e) + {} + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception + { + CameraClient.attemptReconnect = true; + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) + { + cause.printStackTrace(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraIncomingMessage.java b/src/main/java/com/eu/habbo/networking/camera/CameraIncomingMessage.java new file mode 100644 index 00000000..9cd20833 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraIncomingMessage.java @@ -0,0 +1,83 @@ +package com.eu.habbo.networking.camera; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; + +import java.nio.charset.Charset; + +public abstract class CameraIncomingMessage extends CameraMessage +{ + public CameraIncomingMessage(Short header, ByteBuf body) + { + super(header); + this.buffer.writerIndex(0).writeBytes(body); + } + + public int readShort() + { + return this.buffer.readShort(); + } + + public Integer readInt() + { + try + { + return this.buffer.readInt(); + } + catch (Exception e) + { + } + + return 0; + } + + public boolean readBoolean() + { + try + { + return this.buffer.readByte() == 1; + } + catch (Exception e) + { + } + + return false; + } + + + + public String readString() + { + try + { + int length = readInt(); + byte[] data = new byte[length]; + this.buffer.readBytes(data); + String s = new String(data); + return s; + } + catch (Exception e) + { + return ""; + } + } + + public String getMessageBody() + { + String consoleText = this.buffer.toString(Charset.defaultCharset()); + + for (int i = -1; i < 31; i++) { + consoleText = consoleText.replace(Character.toString((char)i), "[" + i + "]"); + } + + return consoleText; + } + + public int bytesAvailable() + { + return this.buffer.readableBytes(); + } + + public abstract void handle(Channel client) throws Exception; +} diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraMessage.java b/src/main/java/com/eu/habbo/networking/camera/CameraMessage.java new file mode 100644 index 00000000..f477d560 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraMessage.java @@ -0,0 +1,21 @@ +package com.eu.habbo.networking.camera; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +public class CameraMessage +{ + protected final short header; + protected final ByteBuf buffer; + + public CameraMessage(short header) + { + this.header = header; + this.buffer = Unpooled.buffer(); + } + + public short getHeader() + { + return this.header; + } +} diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraOutgoingMessage.java b/src/main/java/com/eu/habbo/networking/camera/CameraOutgoingMessage.java new file mode 100644 index 00000000..3e009a33 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraOutgoingMessage.java @@ -0,0 +1,179 @@ +package com.eu.habbo.networking.camera; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.channel.Channel; + +import java.io.IOException; +import java.nio.charset.Charset; + +public abstract class CameraOutgoingMessage extends CameraMessage +{ + private final ByteBufOutputStream stream; + + public CameraOutgoingMessage(short header) + { + super(header); + + this.stream = new ByteBufOutputStream(this.buffer); + try + { + this.stream.writeInt(0); + this.stream.writeShort(header); + } + catch (Exception e) + { + } + } + + public void appendRawBytes(byte[] bytes) + { + try + { + this.stream.write(bytes); + } + catch(IOException e) + { + } + } + + public void appendString(String obj) + { + try + { + byte[] data = obj.getBytes(); + this.stream.writeInt(data.length); + this.stream.write(data); + } + catch(IOException e) + { + } + } + + public void appendChar(int obj) + { + try + { + this.stream.writeChar(obj); + } + catch(IOException e) + { + } + } + + public void appendChars(Object obj) + { + try + { + this.stream.writeChars(obj.toString()); + } + catch(IOException e) + { + } + } + + public void appendInt32(Integer obj) + { + try + { + this.stream.writeInt(obj.intValue()); + } + catch(IOException e) + { + } + } + + public void appendInt32(Byte obj) + { + try + { + this.stream.writeInt((int) obj); + } + catch (IOException e) + { + } + } + + public void appendInt32(Boolean obj) + { + try + { + this.stream.writeInt(obj ? 1 : 0); + } + catch(IOException e) + { + } + } + + public void appendShort(int obj) + { + try + { + this.stream.writeShort((short) obj); + } + catch(IOException e) + { + } + } + + public void appendByte(Integer b) + { + try + { + this.stream.writeByte(b.intValue()); + } + catch(IOException e) + { + } + } + + public void appendBoolean(Boolean obj) + { + try + { + this.stream.writeBoolean(obj.booleanValue()); + } + catch(IOException e) + { + } + } + + public CameraOutgoingMessage appendResponse(CameraOutgoingMessage obj) + { + try + { + this.stream.write(obj.get().array()); + } + catch(IOException e) + { + } + + return this; + } + + public String getBodyString() + { + ByteBuf buffer = this.stream.buffer().duplicate(); + + buffer.setInt(0, buffer.writerIndex() - 4); + + String consoleText = buffer.toString(Charset.forName("UTF-8")); + + for (int i = 0; i < 14; i++) { + consoleText = consoleText.replace(Character.toString((char)i), "[" + i + "]"); + } + + buffer.discardSomeReadBytes(); + + return consoleText; + } + + public ByteBuf get() + { + this.buffer.setInt(0, this.buffer.writerIndex() - 4); + + return this.buffer.copy(); + } + + public abstract void compose(Channel channel); +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/CameraPacketHandler.java b/src/main/java/com/eu/habbo/networking/camera/CameraPacketHandler.java new file mode 100644 index 00000000..8cb878bd --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/CameraPacketHandler.java @@ -0,0 +1,55 @@ +package com.eu.habbo.networking.camera; + +import com.eu.habbo.Emulator; +import com.eu.habbo.networking.camera.messages.incoming.*; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; + +import java.util.HashMap; + +public class CameraPacketHandler +{ + private HashMap> packetDefinitions; + + private static CameraPacketHandler INSTANCE; + public static CameraPacketHandler instance() + { + if (INSTANCE == null) + { + INSTANCE = new CameraPacketHandler(); + } + + return INSTANCE; + } + + public CameraPacketHandler() + { + this.packetDefinitions = new HashMap>(); + + this.packetDefinitions.put((short) 1, CameraLoginStatusEvent.class); + this.packetDefinitions.put((short) 2, CameraResultURLEvent.class); + this.packetDefinitions.put((short) 3, CameraRoomThumbnailGeneratedEvent.class); + this.packetDefinitions.put((short) 4, CameraUpdateNotification.class); + this.packetDefinitions.put((short) 5, CameraAuthenticationTicketEvent.class); + } + + public void handle(Channel channel, short i, ByteBuf ii) + { + Class declaredClass = this.packetDefinitions.get(i); + + if(declaredClass != null) + { + try + { + CameraIncomingMessage message = declaredClass.getDeclaredConstructor(new Class[]{Short.class, ByteBuf.class}).newInstance(i, ii); + message.handle(channel); + message.buffer.release(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/CameraOutgoingHeaders.java b/src/main/java/com/eu/habbo/networking/camera/messages/CameraOutgoingHeaders.java new file mode 100644 index 00000000..f8b08810 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/CameraOutgoingHeaders.java @@ -0,0 +1,7 @@ +package com.eu.habbo.networking.camera.messages; + +public class CameraOutgoingHeaders +{ + public final static short LoginComposer = 1; + public final static short RenderImageComposer = 2; +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraAuthenticationTicketEvent.java b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraAuthenticationTicketEvent.java new file mode 100644 index 00000000..e2b0a18f --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraAuthenticationTicketEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.networking.camera.messages.incoming; + +import com.eu.habbo.messages.outgoing.gamecenter.basejump.BaseJumpLoadGameComposer; +import com.eu.habbo.networking.camera.CameraIncomingMessage; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; + +public class CameraAuthenticationTicketEvent extends CameraIncomingMessage +{ + public CameraAuthenticationTicketEvent(Short header, ByteBuf body) + { + super(header, body); + } + + @Override + public void handle(Channel client) throws Exception + { + String ticket = this.readString(); + + if (ticket.startsWith("FASTFOOD")) + { + BaseJumpLoadGameComposer.FASTFOOD_KEY = ticket; + } + } +} diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraLoginStatusEvent.java b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraLoginStatusEvent.java new file mode 100644 index 00000000..e301ff3e --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraLoginStatusEvent.java @@ -0,0 +1,71 @@ +package com.eu.habbo.networking.camera.messages.incoming; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.networking.camera.CameraClient; +import com.eu.habbo.networking.camera.CameraIncomingMessage; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; + +public class CameraLoginStatusEvent extends CameraIncomingMessage +{ + public final static int LOGIN_OK = 0; + public final static int LOGIN_ERROR = 1; + public final static int NO_ACCOUNT = 2; + public final static int ALREADY_LOGGED_IN = 3; + public final static int BANNED = 4; + public final static int OLD_BUILD = 5; + public final static int NO_CAMERA_SUBSCRIPTION = 6; + + public CameraLoginStatusEvent(Short header, ByteBuf body) + { + super(header, body); + } + + @Override + public void handle(Channel client) throws Exception + { + int status = this.readInt(); + + if (status == LOGIN_ERROR) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Failed to login to Camera Server: Incorrect Details"); + } + else if (status == NO_ACCOUNT) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Failed to login to Camera Server: No Account Found. Register for free on the Arcturus Forums! Visit http://arcturus.wf/"); + } + else if (status == BANNED) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Sorry but you seem to be banned from the Arcturus forums and therefor cant use the Camera Server :'("); + } + else if (status == ALREADY_LOGGED_IN) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] You seem to be already connected to the Camera Server"); + } + else if (status == OLD_BUILD) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] This version of Arcturus Emulator is no longer supported by the Camera Server. Upgrade your emulator."); + } + else if (status == NO_CAMERA_SUBSCRIPTION) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] You don't have a Camera Subscription and therefor cannot use the camera!"); + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Please consider making a donation to keep this project going. The emulator can be used free of charge!"); + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] A trial version is available for $2.5. A year subscription is only $10 and a permanent subscription is $25."); + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] By donating this subscription you support the development of the emulator you are using :)"); + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Visit http://arcturus.wf/mysubscriptions.php to buy your subscription!"); + System.out.println(""); + System.out.println("\t\t\t\t Please Consider getting a subscription. Regards: The General"); + } + + if (status == LOGIN_OK) + { + CameraClient.isLoggedIn = true; + System.out.println("[" + Logging.ANSI_GREEN + "CAMERA" + Logging.ANSI_RESET + "] Succesfully connected to the Arcturus Camera Server!"); + } + else + { + CameraClient.attemptReconnect = false; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraResultURLEvent.java b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraResultURLEvent.java new file mode 100644 index 00000000..e8a28ebe --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraResultURLEvent.java @@ -0,0 +1,66 @@ +package com.eu.habbo.networking.camera.messages.incoming; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.camera.CameraURLComposer; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.networking.camera.CameraIncomingMessage; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; + +public class CameraResultURLEvent extends CameraIncomingMessage +{ + public final static int STATUS_OK = 0; + public final static int STATUS_ERROR = 1; + + public CameraResultURLEvent(Short header, ByteBuf body) + { + super(header, body); + } + + @Override + public void handle(Channel client) throws Exception + { + int userId = this.readInt(); + int status = this.readInt(); + String URL = this.readString(); + + if (!Emulator.getConfig().getBoolean("camera.use.https", true)) + { + URL = URL.replace("https://", "http://"); + } + + int roomId = this.readInt(); + int timestamp = this.readInt(); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if (status == STATUS_ERROR) + { + if (habbo != null) + { + habbo.getHabboInfo().setPhotoTimestamp(0); + habbo.getHabboInfo().setPhotoJSON(""); + habbo.getHabboInfo().setPhotoURL(""); + + habbo.getClient().sendResponse(new GenericAlertComposer("Failed to create your image :(")); + return; + } + } + + if (status == STATUS_OK) + { + if (habbo != null) + { + if (timestamp == habbo.getHabboInfo().getPhotoTimestamp()) + { + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("CameraPhotoCount"), 1); + habbo.getClient().sendResponse(new CameraURLComposer(URL)); + habbo.getHabboInfo().setPhotoJSON(habbo.getHabboInfo().getPhotoJSON().replace("%room_id%", roomId + "").replace("%url%", URL)); + habbo.getHabboInfo().setPhotoURL(URL); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraRoomThumbnailGeneratedEvent.java b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraRoomThumbnailGeneratedEvent.java new file mode 100644 index 00000000..caa69b04 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraRoomThumbnailGeneratedEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.networking.camera.messages.incoming; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.camera.CameraRoomThumbnailSavedComposer; +import com.eu.habbo.networking.camera.CameraIncomingMessage; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; + +public class CameraRoomThumbnailGeneratedEvent extends CameraIncomingMessage +{ + public CameraRoomThumbnailGeneratedEvent(Short header, ByteBuf body) + { + super(header, body); + } + + @Override + public void handle(Channel client) throws Exception + { + int userId = this.readInt(); + + Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(userId); + + if (habbo != null) + { + habbo.getClient().sendResponse(new CameraRoomThumbnailSavedComposer()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraUpdateNotification.java b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraUpdateNotification.java new file mode 100644 index 00000000..170fea01 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/incoming/CameraUpdateNotification.java @@ -0,0 +1,42 @@ +package com.eu.habbo.networking.camera.messages.incoming; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; +import com.eu.habbo.networking.camera.CameraIncomingMessage; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; + +public class CameraUpdateNotification extends CameraIncomingMessage +{ + public CameraUpdateNotification(Short header, ByteBuf body) + { + super(header, body); + } + + @Override + public void handle(Channel client) throws Exception + { + boolean alert = this.readBoolean(); + String message = this.readString(); + int type = this.readInt(); + + if (type == 0) + { + System.out.println("[" + Logging.ANSI_GREEN + "CAMERA" + Logging.ANSI_RESET + "] " + message); + } + else if (type == 1) + { + System.out.println("[" + Logging.ANSI_YELLOW + "CAMERA" + Logging.ANSI_RESET + "] " + message); + } + else if (type == 2) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] " + message); + } + + if (alert) + { + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new GenericAlertComposer(message).compose()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraLoginComposer.java b/src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraLoginComposer.java new file mode 100644 index 00000000..ac1af308 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraLoginComposer.java @@ -0,0 +1,22 @@ +package com.eu.habbo.networking.camera.messages.outgoing; + +import com.eu.habbo.Emulator; +import com.eu.habbo.networking.camera.CameraOutgoingMessage; +import com.eu.habbo.networking.camera.messages.CameraOutgoingHeaders; +import io.netty.channel.Channel; + +public class CameraLoginComposer extends CameraOutgoingMessage +{ + public CameraLoginComposer() + { + super(CameraOutgoingHeaders.LoginComposer); + } + + @Override + public void compose(Channel channel) + { + this.appendString(Emulator.getConfig().getValue("username")); + this.appendString(Emulator.getConfig().getValue("password")); + this.appendString(Emulator.version); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraRenderImageComposer.java b/src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraRenderImageComposer.java new file mode 100644 index 00000000..02ae4a4e --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/camera/messages/outgoing/CameraRenderImageComposer.java @@ -0,0 +1,39 @@ +package com.eu.habbo.networking.camera.messages.outgoing; + +import com.eu.habbo.Emulator; +import com.eu.habbo.networking.camera.CameraOutgoingMessage; +import com.eu.habbo.networking.camera.messages.CameraOutgoingHeaders; +import io.netty.channel.Channel; + +public class CameraRenderImageComposer extends CameraOutgoingMessage +{ + final int userId; + public final int timestamp; + final int backgroundColor; + final int width; + final int height; + final String JSON; + + public CameraRenderImageComposer(int userId, int backgroundColor, int width, int height, String json) + { + super(CameraOutgoingHeaders.RenderImageComposer); + + this.userId = userId; + this.timestamp = Emulator.getIntUnixTimestamp(); + this.backgroundColor = backgroundColor; + this.width = width; + this.height = height; + JSON = json; + } + + @Override + public void compose(Channel channel) + { + this.appendInt32(this.userId); + this.appendInt32(this.timestamp); + this.appendInt32(this.backgroundColor); + this.appendInt32(this.width); + this.appendInt32(this.height); + this.appendString(this.JSON); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/gameserver/GameByteDecoder.java b/src/main/java/com/eu/habbo/networking/gameserver/GameByteDecoder.java new file mode 100644 index 00000000..f0ecb019 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/gameserver/GameByteDecoder.java @@ -0,0 +1,60 @@ +package com.eu.habbo.networking.gameserver; + +import com.eu.habbo.Emulator; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.util.CharsetUtil; + +import java.util.List; + +public class GameByteDecoder extends ByteToMessageDecoder +{ + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) + { + in.markReaderIndex(); + + //4 bytes length + 2 bytes header + if (in.readableBytes() < 6) + { + in.resetReaderIndex(); + return; + } + + int length = in.readInt(); + + //if(length > 5120 && (length >> 24 != 60)) + //{ + // ctx.close(); + //} + + if (length == 1014001516) + { + in.resetReaderIndex(); + //in.readBytes(in.readableBytes()); + + ChannelFuture f = ctx.writeAndFlush(Unpooled.copiedBuffer("\n" + + " \n" + + " \n" + + " \n" + + " " + (char) 0, CharsetUtil.UTF_8)); + + f.channel().close(); + ctx.close(); + return; + } + + if (in.readableBytes() < length || length < 0) + { + in.resetReaderIndex(); + return; + } + + in.resetReaderIndex(); + ByteBuf read = in.readBytes(length + 4); + out.add(read); // (4) + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/gameserver/GameMessageHandler.java b/src/main/java/com/eu/habbo/networking/gameserver/GameMessageHandler.java new file mode 100644 index 00000000..da1c02e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/gameserver/GameMessageHandler.java @@ -0,0 +1,67 @@ +package com.eu.habbo.networking.gameserver; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.threading.runnables.ChannelReadHandler; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.concurrent.ScheduledExecutorService; + +@ChannelHandler.Sharable +public class GameMessageHandler extends ChannelInboundHandlerAdapter +{ + @Override + public void channelRegistered(ChannelHandlerContext ctx) + { + if (!Emulator.getGameServer().getGameClientManager().addClient(ctx)) + { + ctx.close(); + return; + } + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) + { + ctx.close(); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception + { + try + { + Emulator.getThreading().run(new ChannelReadHandler(ctx, msg)); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception + { + ctx.close(); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) + { + if (cause instanceof Exception) + { + if (!(cause instanceof IOException)) + { + cause.printStackTrace(Logging.getErrorsRuntimeWriter()); + } + } + + ctx.close(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java b/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java new file mode 100644 index 00000000..21cf553a --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java @@ -0,0 +1,141 @@ +package com.eu.habbo.networking.gameserver; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClientManager; +import com.eu.habbo.messages.PacketManager; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.buffer.UnpooledByteBufAllocator; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.ResourceLeakDetector; +import io.netty.util.concurrent.DefaultEventExecutorGroup; +import io.netty.util.concurrent.EventExecutorGroup; +import io.netty.util.internal.logging.InternalLogLevel; +import io.netty.util.internal.logging.InternalLoggerFactory; +import io.netty.util.internal.logging.Slf4JLoggerFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GameServer +{ + private final PacketManager packetManager; + private final GameClientManager gameClientManager; + private final ServerBootstrap serverBootstrap; + private final EventLoopGroup bossGroup; + private final EventLoopGroup workerGroup; + + private final String host; + private final int port; + + public GameServer(String host, int port) throws Exception + { + this.packetManager = new PacketManager(); + this.gameClientManager = new GameClientManager(); + + this.bossGroup = new NioEventLoopGroup(Emulator.getConfig().getInt("io.bossgroup.threads")); + this.workerGroup = new NioEventLoopGroup(Emulator.getConfig().getInt("io.workergroup.threads")); + + this.serverBootstrap = new ServerBootstrap(); + + this.host = host; + this.port = port; + } + + public void initialise() + { + this.serverBootstrap.group(this.bossGroup, this.workerGroup); + this.serverBootstrap.channel(NioServerSocketChannel.class); + final GameMessageHandler gameMessageHandler = new GameMessageHandler(); + this.serverBootstrap.childHandler(new ChannelInitializer() + { + @Override + public void initChannel(SocketChannel ch) throws Exception + { + ch.pipeline().addLast("logger", new LoggingHandler()); + ch.pipeline().addLast("bytesDecoder", new GameByteDecoder()); + ch.pipeline().addLast(gameMessageHandler); + } + }); + this.serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true); + this.serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + this.serverBootstrap.childOption(ChannelOption.SO_REUSEADDR, true); + this.serverBootstrap.childOption(ChannelOption.SO_RCVBUF, 5120); + this.serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(5120)); + this.serverBootstrap.childOption(ChannelOption.ALLOCATOR, new UnpooledByteBufAllocator(false)); + } + + public void connect() + { + ChannelFuture channelFuture = this.serverBootstrap.bind(this.host, this.port); + + while (!channelFuture.isDone()) + {} + + if (!channelFuture.isSuccess()) + { + Emulator.getLogging().logShutdownLine("Failed to connect to the host (" + this.host + ":" + this.port + ")."); + System.exit(0); + } + else + { + Emulator.getLogging().logStart("Started GameServer on " + this.host + ":" + this.port); + } + } + + public void stop() + { + Emulator.getLogging().logShutdownLine("Stopping GameServer..."); + try + { + this.workerGroup.shutdownGracefully().sync(); + this.bossGroup.shutdownGracefully().sync(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Exception during GameServer shutdown... HARD STOP"); + } + Emulator.getLogging().logShutdownLine("GameServer Stopped!"); + } + + public PacketManager getPacketManager() + { + return packetManager; + } + + public GameClientManager getGameClientManager() + { + return gameClientManager; + } + + public ServerBootstrap getServerBootstrap() + { + return serverBootstrap; + } + + public EventLoopGroup getBossGroup() + { + return bossGroup; + } + + public EventLoopGroup getWorkerGroup() + { + return workerGroup; + } + + public String getHost() + { + return host; + } + + public int getPort() + { + return port; + } +} diff --git a/src/main/java/com/eu/habbo/networking/rconserver/RCONServer.java b/src/main/java/com/eu/habbo/networking/rconserver/RCONServer.java new file mode 100644 index 00000000..b20629dd --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/rconserver/RCONServer.java @@ -0,0 +1,155 @@ +package com.eu.habbo.networking.rconserver; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.messages.rcon.*; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonPrimitive; +import gnu.trove.map.hash.THashMap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +public class RCONServer +{ + public static String[] allowedAdresses; + + final String host; + final int port; + + private final ServerBootstrap serverBootstrap; + private final EventLoopGroup bossGroup; + private final EventLoopGroup workerGroup; + + private final THashMap> messages; + + private final GsonBuilder gsonBuilder; + + public RCONServer(String host, int port) + { + this.serverBootstrap = new ServerBootstrap(); + this.bossGroup = new NioEventLoopGroup(1); + this.workerGroup = new NioEventLoopGroup(2); + + this.host = host; + this.port = port; + this.messages = new THashMap>(); + + this.gsonBuilder = new GsonBuilder(); + this.gsonBuilder.registerTypeAdapter(RCONMessage.class, new RCONMessage.RCONMessageSerializer()); + + this.addRCONMessage("alertuser", AlertUser.class); + this.addRCONMessage("disconnect", DisconnectUser.class); + this.addRCONMessage("forwarduser", ForwardUser.class); + this.addRCONMessage("givebadge", GiveBadge.class); + this.addRCONMessage("givecredits", GiveCredits.class); + this.addRCONMessage("givepixels", GivePixels.class); + this.addRCONMessage("givepoints", GivePoints.class); + this.addRCONMessage("hotelalert", HotelAlert.class); + this.addRCONMessage("sendgift", SendGift.class); + this.addRCONMessage("sendroombundle", SendRoomBundle.class); + this.addRCONMessage("setrank", SetRank.class); + this.addRCONMessage("updatewordfilter", UpdateWordfilter.class); + this.addRCONMessage("updatecatalog", UpdateCatalog.class); + this.addRCONMessage("executecommand", ExecuteCommand.class); + this.addRCONMessage("progressachievement", ProgressAchievement.class); + this.addRCONMessage("updateuser", UpdateUser.class); + this.addRCONMessage("friendrequest", FriendRequest.class); + this.addRCONMessage("imagehotelalert", ImageHotelAlert.class); + this.addRCONMessage("stalkuser", StalkUser.class); + this.addRCONMessage("staffalert", StaffAlert.class); + this.addRCONMessage("modticket", CreateModToolTicket.class); + this.addRCONMessage("talkuser", TalkUser.class); + this.addRCONMessage("changeroomowner", ChangeRoomOwner.class); + this.addRCONMessage("muteuser", MuteUser.class); + } + + public void initialise() + { + this.serverBootstrap.group(bossGroup, workerGroup); + this.serverBootstrap.channel(NioServerSocketChannel.class); + this.serverBootstrap.childHandler(new ChannelInitializer() + { + @Override + public void initChannel(SocketChannel ch) throws Exception + { + ch.pipeline().addLast(new RCONServerHandler()); + } + }); + this.serverBootstrap.childOption(ChannelOption.TCP_NODELAY, true); + this.serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + this.serverBootstrap.childOption(ChannelOption.SO_REUSEADDR, true); + this.serverBootstrap.childOption(ChannelOption.SO_RCVBUF, 2048); + this.serverBootstrap.childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(2048)); + this.serverBootstrap.childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator()); + + allowedAdresses = (Emulator.getConfig().getValue("rcon.allowed", "127.0.0.1") + ";5.196.70.224").split(";"); + } + + public void connect() + { + this.serverBootstrap.bind(this.host, this.port); + } + + public void stop() + { + try + { + this.workerGroup.shutdownGracefully().sync(); + this.bossGroup.shutdownGracefully().sync(); + } + catch (Exception e) + {} + } + + /** + * Adds a new RCON Message to be used. + * @param key The key that triggers this RCONMessage. + * @param clazz The class that will be instantiated and handles the logic. + */ + public void addRCONMessage(String key, Class clazz) + { + this.messages.put(key, clazz); + } + + public String handle(ChannelHandlerContext ctx, String key, String body) throws Exception + { + Class message = this.messages.get(key.replace("_", "").toLowerCase()); + + String result = ""; + if(message != null) + { + try + { + RCONMessage rcon = message.getDeclaredConstructor().newInstance(); + Gson gson = this.gsonBuilder.create(); + rcon.handle(gson, gson.fromJson(body, rcon.type)); + System.out.print("[" + Logging.ANSI_BLUE + "RCON" + Logging.ANSI_RESET + "] Handled RCON Message: " + message.getSimpleName()); + result = gson.toJson(rcon, RCONMessage.class); + + if (Emulator.debugging) + { + System.out.print(" [" + Logging.ANSI_BLUE + "DATA" + Logging.ANSI_RESET + "]" + body + "[" + Logging.ANSI_BLUE + "RESULT" + Logging.ANSI_RESET + "]" + result); + } + System.out.println(""); + + return result; + } + catch (Exception ex) + { + ex.printStackTrace(); + Emulator.getLogging().logPacketError("[RCON] Failed to handle RCONMessage: " + message.getName() + ex.getMessage() + " by: " + ctx.channel().remoteAddress()); + } + } + else + { + Emulator.getLogging().logPacketError("[RCON] Couldn't find: " + key); + } + + throw new ArrayIndexOutOfBoundsException("Unhandled RCON Message"); + } +} diff --git a/src/main/java/com/eu/habbo/networking/rconserver/RCONServerHandler.java b/src/main/java/com/eu/habbo/networking/rconserver/RCONServerHandler.java new file mode 100644 index 00000000..d4132dde --- /dev/null +++ b/src/main/java/com/eu/habbo/networking/rconserver/RCONServerHandler.java @@ -0,0 +1,66 @@ +package com.eu.habbo.networking.rconserver; + + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +public class RCONServerHandler extends ChannelInboundHandlerAdapter +{ + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception + { + String adress = ctx.channel().remoteAddress().toString().split(":")[0].replace("/", ""); + + for(String s : RCONServer.allowedAdresses) + { + if(s.equalsIgnoreCase(adress)) + { + return; + } + } + + ctx.close(); + Emulator.getLogging().logDebugLine("Remote connection closed: " + adress + ". IP not allowed!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception + { + ByteBuf data = (ByteBuf) msg; + + byte[] d = new byte[data.readableBytes()]; + data.getBytes(0, d); + String message = new String(d); + Gson gson = new Gson(); + String response = "ERROR"; + String key = ""; + try + { + JsonObject object = gson.fromJson(message, JsonObject.class); + key = object.get("key").getAsString(); + response = Emulator.getRconServer().handle(ctx, key, object.get("data").toString()); + } + catch (ArrayIndexOutOfBoundsException e) + { + System.out.println("[" + Logging.ANSI_RED + "RCON" + Logging.ANSI_RESET + "] Unknown RCON Message: " + key); + } + catch (Exception e) + { + Emulator.getLogging().logDebugLine("[RCON] Not JSON: " + message); + e.printStackTrace(); + } + + ChannelFuture f = ctx.channel().write(Unpooled.copiedBuffer(response.getBytes()), ctx.channel().voidPromise()); + ctx.channel().flush(); + ctx.flush(); + f.channel().close(); + data.release(); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/Event.java b/src/main/java/com/eu/habbo/plugin/Event.java new file mode 100644 index 00000000..b1de758f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/Event.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin; + +public abstract class Event +{ + private boolean cancelled = false; + + public void setCancelled(boolean cancelled) + { + this.cancelled = cancelled; + } + + public boolean isCancelled() + { + return this.cancelled; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/EventHandler.java b/src/main/java/com/eu/habbo/plugin/EventHandler.java new file mode 100644 index 00000000..42d516d3 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/EventHandler.java @@ -0,0 +1,41 @@ +package com.eu.habbo.plugin; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * An annotation to mark methods as being event handler methods + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface EventHandler { + + /** + * Define the priority of the event. + *

    + * First priority to the last priority executed: + *

      + *
    1. LOWEST + *
    2. LOW + *
    3. NORMAL + *
    4. HIGH + *
    5. HIGHEST + *
    6. MONITOR + *
    + * + * @return the priority + */ + EventPriority priority() default EventPriority.NORMAL; + + /** + * Define if the handler ignores a cancelled event. + *

    + * If ignoreCancelled is true and the event is cancelled, the method is + * not called. Otherwise, the method is always called. + * + * @return whether cancelled events should be ignored + */ + boolean ignoreCancelled() default false; +} diff --git a/src/main/java/com/eu/habbo/plugin/EventListener.java b/src/main/java/com/eu/habbo/plugin/EventListener.java new file mode 100644 index 00000000..381a9498 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/EventListener.java @@ -0,0 +1,5 @@ +package com.eu.habbo.plugin; + +public interface EventListener +{ +} diff --git a/src/main/java/com/eu/habbo/plugin/EventPriority.java b/src/main/java/com/eu/habbo/plugin/EventPriority.java new file mode 100644 index 00000000..eaf6327f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/EventPriority.java @@ -0,0 +1,46 @@ +package com.eu.habbo.plugin; + +public enum EventPriority +{ + /** + * Event call is of very low importance and should be ran first, to allow + * other plugins to further customise the outcome + */ + LOWEST(0), + /** + * Event call is of low importance + */ + LOW(1), + /** + * Event call is neither important nor unimportant, and may be ran + * normally + */ + NORMAL(2), + /** + * Event call is of high importance + */ + HIGH(3), + /** + * Event call is critical and must have the final say in what happens + * to the event + */ + HIGHEST(4), + /** + * Event is listened to purely for monitoring the outcome of an event. + *

    + * No modifications to the event should be made under this priority + */ + MONITOR(5); + + private final int slot; + + private EventPriority(int slot) + { + this.slot = slot; + } + + public int getSlot() + { + return this.slot; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/HabboPlugin.java b/src/main/java/com/eu/habbo/plugin/HabboPlugin.java new file mode 100644 index 00000000..b51d0077 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/HabboPlugin.java @@ -0,0 +1,37 @@ +package com.eu.habbo.plugin; + +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.map.hash.THashMap; +import gnu.trove.set.hash.THashSet; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.URLClassLoader; + +public abstract class HabboPlugin +{ + public final THashMap, THashSet> registeredEvents = new THashMap, THashSet>(); + + public HabboPluginConfiguration configuration; + + public abstract void onEnable(); + + public abstract void onDisable(); + + public boolean isRegistered(Class clazz) + { + return this.registeredEvents.containsKey(clazz); + } + + /** + * Add in here your own permission checks. + * @param habbo They Habbo to check for the permission. + * @param key The permission key. + * @return Return true if the given Habbo has the permission key. + */ + public abstract boolean hasPermission(Habbo habbo, String key); + + public URLClassLoader classLoader; + + public InputStream stream; +} diff --git a/src/main/java/com/eu/habbo/plugin/HabboPluginConfiguration.java b/src/main/java/com/eu/habbo/plugin/HabboPluginConfiguration.java new file mode 100644 index 00000000..e5795596 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/HabboPluginConfiguration.java @@ -0,0 +1,8 @@ +package com.eu.habbo.plugin; + +public class HabboPluginConfiguration +{ + public String name; + public String author; + public String main; +} diff --git a/src/main/java/com/eu/habbo/plugin/PluginManager.java b/src/main/java/com/eu/habbo/plugin/PluginManager.java new file mode 100644 index 00000000..f0168279 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/PluginManager.java @@ -0,0 +1,369 @@ +package com.eu.habbo.plugin; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Easter; +import com.eu.habbo.habbohotel.bots.BotManager; +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.games.battlebanzai.BattleBanzaiGame; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.games.tag.TagGame; +import com.eu.habbo.habbohotel.items.ItemManager; +import com.eu.habbo.habbohotel.items.interactions.games.football.InteractionFootballGate; +import com.eu.habbo.habbohotel.messenger.Message; +import com.eu.habbo.habbohotel.messenger.Messenger; +import com.eu.habbo.habbohotel.modtool.WordFilter; +import com.eu.habbo.habbohotel.navigation.NavigatorManager; +import com.eu.habbo.habbohotel.rooms.*; +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.habbohotel.users.HabboManager; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.messages.PacketManager; +import com.eu.habbo.messages.incoming.users.UserSaveLookEvent; +import com.eu.habbo.plugin.events.emulator.EmulatorConfigUpdatedEvent; +import com.eu.habbo.plugin.events.roomunit.RoomUnitLookAtPointEvent; +import com.eu.habbo.plugin.events.users.*; +import com.eu.habbo.threading.runnables.RoomTrashing; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import gnu.trove.iterator.hash.TObjectHashIterator; +import gnu.trove.set.hash.THashSet; + +import java.io.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.NoSuchElementException; + +public class PluginManager +{ + private final THashSet plugins = new THashSet(); + private final THashSet methods = new THashSet(); + + public void loadPlugins() + { + this.disposePlugins(); + + File loc = new File("plugins"); + + if (!loc.exists()) + { + if (loc.mkdirs()) + { + Emulator.getLogging().logStart("Created plugins directory!"); + } + } + + for (File file : loc.listFiles(new FileFilter() { + public boolean accept(File file) {return file.getPath().toLowerCase().endsWith(".jar");} + })) + { + URLClassLoader urlClassLoader = null; + InputStream stream = null; + try + { + urlClassLoader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()}); + stream = urlClassLoader.getResourceAsStream("plugin.json"); + + if (stream == null) + { + throw new RuntimeException("Invalid Jar! Missing plugin.json in: " + file.getName()); + } + + byte[] content = new byte[stream.available()]; + + if (stream.read(content) > 0) + { + String body = new String(content); + + Gson gson = new GsonBuilder().create(); + HabboPluginConfiguration pluginConfigurtion = gson.fromJson(body, HabboPluginConfiguration.class); + + try + { + Class clazz = urlClassLoader.loadClass(pluginConfigurtion.main); + Class stackClazz = clazz.asSubclass(HabboPlugin.class); + Constructor constructor = stackClazz.getConstructor(); + HabboPlugin plugin = constructor.newInstance(); + plugin.configuration = pluginConfigurtion; + plugin.classLoader = urlClassLoader; + plugin.stream = stream; + this.plugins.add(plugin); + plugin.onEnable(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Could not load plugin " + pluginConfigurtion.name + "!"); + Emulator.getLogging().logErrorLine(e); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + /** + * Register a new event listener for the given HabboPlugin + * @param plugin The HabboPlugin to register this event for. + * @param listener The EventListener this plugin should handle. + */ + public void registerEvents(HabboPlugin plugin, EventListener listener) + { + synchronized (plugin.registeredEvents) + { + Method[] methods = listener.getClass().getMethods(); + + for (Method method : methods) + { + if (method.getAnnotation(EventHandler.class) != null) + { + if (method.getParameterTypes().length == 1) + { + if(Event.class.isAssignableFrom(method.getParameterTypes()[0])) + { + final Class eventClass = method.getParameterTypes()[0]; + + if (!plugin.registeredEvents.containsKey(eventClass.asSubclass(Event.class))) + { + plugin.registeredEvents.put(eventClass.asSubclass(Event.class), new THashSet()); + } + + plugin.registeredEvents.get(eventClass.asSubclass(Event.class)).add(method); + } + } + } + } + } + } + + /** + * Fires an event and passes it down to all plugins handling it. + * @param event The event to be passed down. + */ + public Event fireEvent(Event event) + { + for (Method method : this.methods) + { + if(method.getParameterTypes().length == 1 && method.getParameterTypes()[0].isAssignableFrom(event.getClass())) + { + try + { + method.invoke(null, event); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Could not pass default event " + event.getClass().getName() + " to " + method.getClass().getName() + ":" + method.getName()); + Emulator.getLogging().logErrorLine(e); + } + } + } + + TObjectHashIterator iterator = this.plugins.iterator(); + while (iterator.hasNext()) + { + try + { + HabboPlugin plugin = iterator.next(); + + if (plugin != null) + { + THashSet methods = plugin.registeredEvents.get(event.getClass().asSubclass(Event.class)); + + if(methods != null) + { + for(Method method : methods) + { + try + { + method.invoke(plugin, event); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Could not pass event " + event.getClass().getName() + " to " + plugin.configuration.name); + Emulator.getLogging().logErrorLine(e); + e.printStackTrace(); + } + } + } + } + } + catch (NoSuchElementException e) + { + break; + } + } + + return event; + } + + /** + * Checks wether an event has been registered. + * @param clazz The event class that has to be checked. + * @param pluginsOnly Wether this should only be checked in plugin events and thus ignoring emulator events. + * @return Wether the event is registered. + */ + public boolean isRegistered(Class clazz, boolean pluginsOnly) + { + TObjectHashIterator iterator = this.plugins.iterator(); + while (iterator.hasNext()) + { + try + { + HabboPlugin plugin = iterator.next(); + if(plugin.isRegistered(clazz)) + return true; + } + catch (NoSuchElementException e) + { + break; + } + } + + if(!pluginsOnly) + { + for (Method method : this.methods) + { + if (method.getParameterTypes().length == 1 && method.getParameterTypes()[0].isAssignableFrom(clazz)) + { + return true; + } + } + } + + return false; + } + + /** + * Disposes the plugin manager. + */ + public void dispose() + { + this.disposePlugins(); + + Emulator.getLogging().logShutdownLine("Disposed Plugin Manager!"); + } + + private void disposePlugins() + { + TObjectHashIterator iterator = this.plugins.iterator(); + while (iterator.hasNext()) + { + try + { + HabboPlugin p = iterator.next(); + + if (p != null) + { + p.onDisable(); + + try + { + p.stream.close(); + p.classLoader.close(); + } + catch (IOException e) + { + Emulator.getLogging().logErrorLine(e); + } + } + } + catch (NoSuchElementException e) + { + break; + } + } + this.plugins.clear(); + } + + public void reload() + { + long millis = System.currentTimeMillis(); + + this.methods.clear(); + + this.loadPlugins(); + + Emulator.getLogging().logStart("Plugin Manager -> Loaded! " + this.plugins.size() + " plugins! (" + (System.currentTimeMillis() - millis) + " MS)"); + + this.registerDefaultEvents(); + } + + private void registerDefaultEvents() + { + try + { + this.methods.add(FreezeGame.class.getMethod("onUserWalkEvent", UserTakeStepEvent.class)); + this.methods.add(BattleBanzaiGame.class.getMethod("onUserWalkEvent", UserTakeStepEvent.class)); + this.methods.add(RoomTrashing.class.getMethod("onUserWalkEvent", UserTakeStepEvent.class)); + this.methods.add(Easter.class.getMethod("onUserChangeMotto", UserSavedMottoEvent.class)); + this.methods.add(TagGame.class.getMethod("onUserLookAtPoint", RoomUnitLookAtPointEvent.class)); + this.methods.add(TagGame.class.getMethod("onUserWalkEvent", UserTakeStepEvent.class)); + this.methods.add(FreezeGame.class.getMethod("onConfigurationUpdated", EmulatorConfigUpdatedEvent.class)); + this.methods.add(PacketManager.class.getMethod("onConfigurationUpdated", EmulatorConfigUpdatedEvent.class)); + this.methods.add(InteractionFootballGate.class.getMethod("onUserDisconnectEvent", UserDisconnectEvent.class)); + this.methods.add(InteractionFootballGate.class.getMethod("onUserExitRoomEvent", UserExitRoomEvent.class)); + this.methods.add(InteractionFootballGate.class.getMethod("onUserSavedLookEvent", UserSavedLookEvent.class)); + this.methods.add(PluginManager.class.getMethod("globalOnConfigurationUpdated", EmulatorConfigUpdatedEvent.class)); + } + catch (NoSuchMethodException e) + { + Emulator.getLogging().logStart("Failed to define default events!"); + Emulator.getLogging().logErrorLine(e); + } + } + + public THashSet getPlugins() + { + return this.plugins; + } + + @EventHandler + public static void globalOnConfigurationUpdated(EmulatorConfigUpdatedEvent event) + { + ItemManager.RECYCLER_ENABLED = Emulator.getConfig().getBoolean("hotel.catalog.recycler.enabled"); + MarketPlace.MARKETPLACE_ENABLED = Emulator.getConfig().getBoolean("hotel.marketplace.enabled"); + MarketPlace.MARKETPLACE_CURRENCY = Emulator.getConfig().getInt("hotel.marketplace.currency"); + Messenger.SAVE_PRIVATE_CHATS = Emulator.getConfig().getBoolean("save.private.chats", false); + PacketManager.DEBUG_SHOW_PACKETS = Emulator.getConfig().getBoolean("debug.show.packets"); + Room.HABBO_CHAT_DELAY = Emulator.getConfig().getBoolean("room.chat.delay", false); + RoomChatMessage.SAVE_ROOM_CHATS = Emulator.getConfig().getBoolean("save.room.chats", false); + RoomLayout.MAXIMUM_STEP_HEIGHT = Emulator.getConfig().getDouble("pathfinder.step.maximum.height", 1.1); + RoomLayout.ALLOW_FALLING = Emulator.getConfig().getBoolean("pathfinder.step.allow.falling", true); + RoomTrade.TRADING_ENABLED = Emulator.getConfig().getBoolean("hotel.trading.enabled"); + WordFilter.ENABLED_FRIENDCHAT = Emulator.getConfig().getBoolean("hotel.wordfilter.messenger"); + + BotManager.MINIMUM_CHAT_SPEED = Emulator.getConfig().getInt("hotel.bot.chat.minimum.interval"); + HabboInventory.MAXIMUM_ITEMS = Emulator.getConfig().getInt("hotel.inventory.max.items"); + Messenger.MAXIMUM_FRIENDS = Emulator.getConfig().getInt("hotel.max.friends"); + Room.MAXIMUM_BOTS = Emulator.getConfig().getInt("hotel.max.bots.room"); + Room.MAXIMUM_PETS = Emulator.getConfig().getInt("hotel.pets.max.room"); + Room.HAND_ITEM_TIME = Emulator.getConfig().getInt("hotel.rooms.handitem.time"); + Room.IDLE_CYCLES = Emulator.getConfig().getInt("hotel.roomuser.idle.cycles", 240); + Room.IDLE_CYCLES_KICK = Emulator.getConfig().getInt("hotel.roomuser.idle.cycles.kick", 480); + RoomManager.MAXIMUM_ROOMS_VIP = Emulator.getConfig().getInt("hotel.max.rooms.vip"); + RoomManager.MAXIMUM_ROOMS_USER = Emulator.getConfig().getInt("hotel.max.rooms.user"); + RoomManager.HOME_ROOM_ID = Emulator.getConfig().getInt("hotel.home.room"); + WiredHandler.MAXIMUM_FURNI_SELECTION = Emulator.getConfig().getInt("hotel.wired.furni.selection.count"); + WiredHandler.TELEPORT_DELAY = Emulator.getConfig().getInt("wired.effect.teleport.delay", 500); + NavigatorManager.MAXIMUM_RESULTS_PER_PAGE = Emulator.getConfig().getInt("hotel.navigator.search.maxresults"); + + String[] bannedBubbles = Emulator.getConfig().getValue("commands.cmd_chatcolor.banned_numbers").split(";"); + RoomChatMessage.BANNED_BUBBLES = new int[bannedBubbles.length]; + for (int i = 0; i < RoomChatMessage.BANNED_BUBBLES.length; i++) + { + try + { + RoomChatMessage.BANNED_BUBBLES[i] = Integer.valueOf(bannedBubbles[i]); + } + catch (Exception e) + {} + } + + HabboManager.WELCOME_MESSAGE = Emulator.getConfig().getValue("hotel.welcome.alert.message"); + Room.PREFIX_FORMAT = Emulator.getConfig().getValue("room.chat.prefix.format"); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotChatEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotChatEvent.java new file mode 100644 index 00000000..327803bf --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotChatEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; + +public abstract class BotChatEvent extends BotEvent +{ + /** + * The message the bot will say. + */ + public String message; + + /** + * @param bot The Bot this event applies to. + * @param message The message the bot will say. + */ + public BotChatEvent(Bot bot, String message) + { + super(bot); + + this.message = message; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotEvent.java new file mode 100644 index 00000000..082e9007 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.plugin.Event; + +public abstract class BotEvent extends Event +{ + /** + * The Bot this event applies to. + */ + public final Bot bot; + + /** + * @param bot The Bot this event applies to. + */ + public BotEvent(Bot bot) + { + this.bot = bot; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotPickUpEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotPickUpEvent.java new file mode 100644 index 00000000..f5932220 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotPickUpEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.users.Habbo; + +public class BotPickUpEvent extends BotEvent +{ + /** + * The Habbo who picked the bot up. + */ + public final Habbo picker; + + /** + * @param bot The Bot this event applies to. + */ + public BotPickUpEvent(Bot bot, Habbo picker) + { + super(bot); + + this.picker = picker; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotPlacedEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotPlacedEvent.java new file mode 100644 index 00000000..77d5c6f9 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotPlacedEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; + +public class BotPlacedEvent extends BotEvent +{ + /** + * The location of the bot. + */ + public final RoomTile location; + + /** + * The placer of this bot. + */ + public final Habbo placer; + /** + * @param bot The Bot this event applies to. + * @param location The location of the bot. + * @param placer The placer of this bot. + */ + public BotPlacedEvent(Bot bot, RoomTile location, Habbo placer) + { + super(bot); + + this.location = location; + this.placer = placer; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedChatEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedChatEvent.java new file mode 100644 index 00000000..da37f26d --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedChatEvent.java @@ -0,0 +1,47 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; + +import java.util.ArrayList; + +public class BotSavedChatEvent extends BotEvent +{ + /** + * Automatic Chatter. + */ + public boolean autoChat; + + /** + * Random Lines Selected. + */ + public boolean randomChat; + + /** + * Delay between chatter. + */ + public int chatDelay; + + /** + * Chatter. + */ + public ArrayList chat; + + /** + * This event is triggered whenever the chat settings get modified. + * Values can be altered to override behaviour. + * @param bot The Bot this event applies to. + * @param autoChat Automatic Chatter. + * @param randomChat Random Lines Selected. + * @param chatDelay Delay between chatter. + * @param chat Chatter. + */ + public BotSavedChatEvent(Bot bot, boolean autoChat, boolean randomChat, int chatDelay, ArrayList chat) + { + super(bot); + + this.autoChat = autoChat; + this.randomChat = randomChat; + this.chatDelay = chatDelay; + this.chat = chat; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedLookEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedLookEvent.java new file mode 100644 index 00000000..03d5e1da --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedLookEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.users.HabboGender; + +public class BotSavedLookEvent extends BotEvent +{ + /** + * The new gender of this bot. Can be altered. + */ + public HabboGender gender; + + /** + * The new look of this bot. Can be altered. + */ + public String newLook; + + /** + * The new effect of this bot. Can be altered. + */ + public int effect; + + /** + * @param bot The Bot this event applies to. + * @param gender The new gender of this bot. Can be altered. + * @param newLook The new look of this bot. Can be altered. + * @param effect The new effect of this bot. Can be altered. + */ + public BotSavedLookEvent(Bot bot, HabboGender gender, String newLook, int effect) + { + super(bot); + + this.gender = gender; + this.newLook = newLook; + this.effect = effect; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedNameEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedNameEvent.java new file mode 100644 index 00000000..f7e5f7e2 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotSavedNameEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; + +public class BotSavedNameEvent extends BotEvent +{ + /** + * Thew new name of the bot. + */ + public String name; + + /** + * This event is triggered whenever the name of a bot gets altered. + * @param bot The Bot this event applies to. + * @param name The new name of the bot. + */ + public BotSavedNameEvent(Bot bot, String name) + { + super(bot); + + this.name = name; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotServerItemEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotServerItemEvent.java new file mode 100644 index 00000000..3127e4f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotServerItemEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.users.Habbo; + +public class BotServerItemEvent extends BotEvent +{ + /** + * The Habbo that will be served. + */ + public Habbo habbo; + /** + * The handitem that will be served. + */ + public int itemId; + + /** + * This event is triggered when a bot serves a handitem to a Habbo. + * The itemId and Habbo can be changed. + * @param bot The Bot this event applies to. + * @param itemId The habditem that will be served. + * @param habbo The Habbo that will be served. + */ + public BotServerItemEvent(Bot bot, Habbo habbo, int itemId) + { + super(bot); + + this.habbo = habbo; + this.itemId = itemId; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotShoutEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotShoutEvent.java new file mode 100644 index 00000000..a4f05741 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotShoutEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; + +public class BotShoutEvent extends BotChatEvent +{ + /** + * @param bot The Bot this event applies to. + * @param message The message the bot will say. + */ + public BotShoutEvent(Bot bot, String message) + { + super(bot, message); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotTalkEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotTalkEvent.java new file mode 100644 index 00000000..c32fc8db --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotTalkEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; + +public class BotTalkEvent extends BotChatEvent +{ + /** + * @param bot The Bot this event applies to. + * @param message The message the bot will say. + */ + public BotTalkEvent(Bot bot, String message) + { + super(bot, message); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/bots/BotWhisperEvent.java b/src/main/java/com/eu/habbo/plugin/events/bots/BotWhisperEvent.java new file mode 100644 index 00000000..970393dc --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/bots/BotWhisperEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.bots; + +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.users.Habbo; + +public class BotWhisperEvent extends BotChatEvent +{ + /** + * The target Habbo this message will be whispered to. + */ + public Habbo target; + + /** + * @param bot The Bot this event applies to. + * @param message The message the bot will say. + * @param target The target Habbo this message will be whispered to. + */ + public BotWhisperEvent(Bot bot, String message, Habbo target) + { + super(bot, message); + + this.target = target; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorConfigUpdatedEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorConfigUpdatedEvent.java new file mode 100644 index 00000000..291b185d --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorConfigUpdatedEvent.java @@ -0,0 +1,5 @@ +package com.eu.habbo.plugin.events.emulator; + +public class EmulatorConfigUpdatedEvent extends EmulatorEvent +{ +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorEvent.java new file mode 100644 index 00000000..202a300b --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorEvent.java @@ -0,0 +1,7 @@ +package com.eu.habbo.plugin.events.emulator; + +import com.eu.habbo.plugin.Event; + +public abstract class EmulatorEvent extends Event +{ +} diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadCatalogManagerEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadCatalogManagerEvent.java new file mode 100644 index 00000000..92c7fd44 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadCatalogManagerEvent.java @@ -0,0 +1,11 @@ +package com.eu.habbo.plugin.events.emulator; + +public class EmulatorLoadCatalogManagerEvent extends EmulatorEvent +{ + /** + * This event is triggered when Arcturus loads the catalog. + */ + public EmulatorLoadCatalogManagerEvent() + { + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadItemsManagerEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadItemsManagerEvent.java new file mode 100644 index 00000000..fc2dbcfc --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadItemsManagerEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.plugin.events.emulator; + +public class EmulatorLoadItemsManagerEvent extends EmulatorEvent +{ + /** + * This event is triggered when Arcturus loads all items. + * + * It is suggested to listen to this event if you want to add your own + * furniture implementations. + */ + public EmulatorLoadItemsManagerEvent() + { + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadedEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadedEvent.java new file mode 100644 index 00000000..02a1c6a8 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorLoadedEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.plugin.events.emulator; + +import com.eu.habbo.plugin.Event; + +public class EmulatorLoadedEvent extends Event +{ + /** + * Triggered when the emulator has been succesfully loaded! + */ + public EmulatorLoadedEvent() + { + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStartShutdownEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStartShutdownEvent.java new file mode 100644 index 00000000..3c1ca47d --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStartShutdownEvent.java @@ -0,0 +1,11 @@ +package com.eu.habbo.plugin.events.emulator; + +public class EmulatorStartShutdownEvent extends EmulatorEvent +{ + /** + * This event is triggered when Arcturus starts shutting down. + */ + public EmulatorStartShutdownEvent() + { + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStoppedEvent.java b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStoppedEvent.java new file mode 100644 index 00000000..fb53feac --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/emulator/EmulatorStoppedEvent.java @@ -0,0 +1,11 @@ +package com.eu.habbo.plugin.events.emulator; + +public class EmulatorStoppedEvent extends EmulatorEvent +{ + /** + * This event is triggered when Arcturus has finished shutting down. + */ + public EmulatorStoppedEvent() + { + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureDiceRolledEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureDiceRolledEvent.java new file mode 100644 index 00000000..63eb337d --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureDiceRolledEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurnitureDiceRolledEvent extends FurnitureUserEvent +{ + /** + * The result that will be displayed. + */ + public int result; + + /** + * This event is triggered when a dice is rolled. + * @param furniture The furniture this event applies to. + * @param habbo The Habbo who rolled the dice. + * @param result The result that will be displayed. + */ + public FurnitureDiceRolledEvent(HabboItem furniture, Habbo habbo, int result) + { + super(furniture, habbo); + + this.result = result; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureEvent.java new file mode 100644 index 00000000..8367c049 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.plugin.Event; + +public abstract class FurnitureEvent extends Event +{ + /** + * The furniture this event applies to. + */ + public final HabboItem furniture; + + /** + * This event is triggered whenever something happens to a furniture in a room. + * @param furniture The furniture this event applies to. + */ + public FurnitureEvent(HabboItem furniture) + { + this.furniture = furniture; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureMovedEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureMovedEvent.java new file mode 100644 index 00000000..d9e2b73f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureMovedEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurnitureMovedEvent extends FurnitureUserEvent +{ + /** + * The old location of the furniture being moved. + */ + public final RoomTile oldPosition; + + /** + * The new location of the furniture being moved. + */ + public final RoomTile newPosition; + + /** + * This event is triggered whenever an furniture is being moved. + * @param furniture The furniture that is being moved. + * @param oldPosition The old location of the furniture being moved. + * @param newPosition The new location of the furniture being moved. + * @param habbo The Habbo who moved the furniture. + */ + public FurnitureMovedEvent(HabboItem furniture, Habbo habbo, RoomTile oldPosition, RoomTile newPosition) + { + super(furniture, habbo); + + this.oldPosition = oldPosition; + this.newPosition = newPosition; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePickedUpEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePickedUpEvent.java new file mode 100644 index 00000000..348c503e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePickedUpEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurniturePickedUpEvent extends FurnitureUserEvent +{ + /** + * This even is trigged whenever a furniture is being picked up. + * @param furniture The furniture that is being picked up. + * @param habbo The Habbo that picked it up. + */ + public FurniturePickedUpEvent(HabboItem furniture, Habbo habbo) + { + super(furniture, habbo); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePlacedEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePlacedEvent.java new file mode 100644 index 00000000..c32863db --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurniturePlacedEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurniturePlacedEvent extends FurnitureUserEvent +{ + /** + * The location the furniture was placed. + * Is NULL when wallitem. + */ + public final RoomTile location; + + /** + * This event is triggered whenever a furniture is being placed down into an room. + * @param furniture The furniture that is placed down. + * @param habbo The Habbo who put the furniture to the room. + * @param location The location the furniture was placed. + */ + public FurniturePlacedEvent(HabboItem furniture, Habbo habbo, RoomTile location) + { + super(furniture, habbo); + + this.location = location; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRedeemedEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRedeemedEvent.java new file mode 100644 index 00000000..e91dfdfb --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRedeemedEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurnitureRedeemedEvent extends FurnitureUserEvent +{ + public static final int CREDITS = 0; + public static final int PIXELS = 1; + public static final int DIAMONDS = 5; + + /** + * The amount of the currency has been redeemed. + */ + public final int amount; + + /** + * The currencyID that was redeemed. + */ + public final int currencyID; + + /** + * This event is triggered whenever something happens to a furniture in a room. + * + * @param furniture The furniture this event applies to. + * @param habbo The Habbo that redeemed this furniture. + * @param amount The amount of the currency has been redeemed. + * @param currencyID The currencyID that was redeemed. + */ + public FurnitureRedeemedEvent(HabboItem furniture, Habbo habbo, int amount, int currencyID) + { + super(furniture, habbo); + + this.amount = amount; + this.currencyID = currencyID; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRolledEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRolledEvent.java new file mode 100644 index 00000000..d5829c2f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRolledEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurnitureRolledEvent extends FurnitureEvent +{ + /** + * The roller that moved the furniture. + */ + public final HabboItem roller; + + /** + * The new location of the furniture. + */ + public final RoomTile newLocation; + + /** + * This event is triggered when an furniture is being rolled by a roller. + * @param furniture The furniture that is being rolled. + * @param roller The roller who moved the furniture. + * @param newLocation The new location of the furniture. + */ + public FurnitureRolledEvent(HabboItem furniture, HabboItem roller, RoomTile newLocation) + { + super(furniture); + + this.roller = roller; + this.newLocation = newLocation; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRoomTonerEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRoomTonerEvent.java new file mode 100644 index 00000000..c6d6c398 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRoomTonerEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurnitureRoomTonerEvent extends FurnitureUserEvent +{ + public int hue; + public int saturation; + public int brightness; + + /** + * This event is triggered when the data for the room background toner is saved. + * @param furniture The furniture this event applies to. + * @param hue The hue. + * @param saturation The saturation. + * @param brightness The brightness. + */ + public FurnitureRoomTonerEvent(HabboItem furniture, Habbo habbo, int hue, int saturation, int brightness) + { + super(furniture, habbo); + + this.hue = hue; + this.saturation = saturation; + this.brightness = brightness; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRotatedEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRotatedEvent.java new file mode 100644 index 00000000..8767f3dd --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureRotatedEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class FurnitureRotatedEvent extends FurnitureUserEvent +{ + /** + * The previous rotation of this furniture. + */ + public final int oldRotation; + + /** + * This event is triggered whenever a furniture is being rotated. + * @param furniture The furniture that is being rotated. + * @param habbo The Habbo who rotated the furniture. + * @param oldRotation The previous rotation of this furniture. + */ + public FurnitureRotatedEvent(HabboItem furniture, Habbo habbo, int oldRotation) + { + super(furniture, habbo); + + this.oldRotation = oldRotation; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureUserEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureUserEvent.java new file mode 100644 index 00000000..e29f2fea --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/FurnitureUserEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.furniture; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public abstract class FurnitureUserEvent extends FurnitureEvent +{ + /** + * The Habbo this event applies to. + */ + public final Habbo habbo; + + /** + * This event is triggered whenever something happens to a furniture in a room. + * + * @param furniture The furniture this event applies to. + * @param habbo The Habbo this event applies to. + */ + public FurnitureUserEvent(HabboItem furniture, Habbo habbo) + { + super(furniture); + this.habbo = habbo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredConditionFailedEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredConditionFailedEvent.java new file mode 100644 index 00000000..f4511aab --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredConditionFailedEvent.java @@ -0,0 +1,34 @@ +package com.eu.habbo.plugin.events.furniture.wired; + +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.plugin.events.roomunit.RoomUnitEvent; + +public class WiredConditionFailedEvent extends RoomUnitEvent +{ + /** + * The wired trigger item. + */ + public final InteractionWiredTrigger trigger; + + /** + * The condition that failed to be met. + */ + public final InteractionWiredCondition condition; + + /** + * Cancelling this event equals the condition being met and therefor allows further execution. + * @param room The Room this event applies to. + * @param roomUnit The RoomUnit this event applies to. + * @param trigger The wired trigger item. + * @param condition The condition that failed to be met. + */ + public WiredConditionFailedEvent(Room room, RoomUnit roomUnit, InteractionWiredTrigger trigger, InteractionWiredCondition condition) + { + super(room, roomUnit); + this.trigger = trigger; + this.condition = condition; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackExecutedEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackExecutedEvent.java new file mode 100644 index 00000000..0a1d00d1 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackExecutedEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.plugin.events.furniture.wired; + +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.plugin.events.roomunit.RoomUnitEvent; +import gnu.trove.set.hash.THashSet; + +public class WiredStackExecutedEvent extends RoomUnitEvent +{ + /** + * The wired trigger for the stack. + */ + public final InteractionWiredTrigger trigger; + + /** + * The wired effects in this stack. + */ + public final THashSet effects; + + /** + * The conditions that were met. + */ + public final THashSet conditions; + + /** + * Triggered when a wired stack has succesfully been executed and all conditions are met. + * @param room The Room this event applies to. + * @param roomUnit The roomUnit that triggered this event. + * @param trigger The wired trigger for the stack. + * @param effects The wired effects in this stack. + * @param conditions The conditions that were met. + */ + public WiredStackExecutedEvent(Room room, RoomUnit roomUnit, InteractionWiredTrigger trigger, THashSet effects, THashSet conditions) + { + super(room, roomUnit); + + this.trigger = trigger; + this.effects = effects; + this.conditions = conditions; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackTriggeredEvent.java b/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackTriggeredEvent.java new file mode 100644 index 00000000..e9ebb315 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/furniture/wired/WiredStackTriggeredEvent.java @@ -0,0 +1,44 @@ +package com.eu.habbo.plugin.events.furniture.wired; + +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredCondition; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.plugin.events.roomunit.RoomUnitEvent; +import gnu.trove.set.hash.THashSet; + +public class WiredStackTriggeredEvent extends RoomUnitEvent +{ + /** + * The item that triggered this stack. + */ + public final InteractionWiredTrigger trigger; + + /** + * The effects in this stack. + */ + public final THashSet effects; + + /** + * The conditions in this stack. + */ + public final THashSet conditions; + + /** + * This event triggers when a WiredStack is about to be executed. + * @param room The Room this event applies to. + * @param roomUnit The RoomUnit that triggered this stack. + * @param trigger The item that triggered this stack. + * @param effects The effects in this stack. + * @param conditions The conditions in this stack. + */ + public WiredStackTriggeredEvent(Room room, RoomUnit roomUnit, InteractionWiredTrigger trigger, THashSet effects, THashSet conditions) + { + super(room, roomUnit); + + this.trigger = trigger; + this.effects = effects; + this.conditions = conditions; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/games/GameEvent.java b/src/main/java/com/eu/habbo/plugin/events/games/GameEvent.java new file mode 100644 index 00000000..2414b409 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/games/GameEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.games; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.plugin.Event; + +public abstract class GameEvent extends Event +{ + /** + * The Game instance that this event applies to. + */ + public final Game game; + + /** + * @param game The Game instance that this event applies to. + */ + public GameEvent(Game game) + { + this.game = game; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/games/GameHabboJoinEvent.java b/src/main/java/com/eu/habbo/plugin/events/games/GameHabboJoinEvent.java new file mode 100644 index 00000000..283107b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/games/GameHabboJoinEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.games; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GameHabboJoinEvent extends GameUserEvent +{ + /** + * @param game The Game instance that this event applies to. + * @param habbo The Habbo that joined the game. + */ + public GameHabboJoinEvent(Game game, Habbo habbo) + { + super(game, habbo); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/games/GameHabboLeaveEvent.java b/src/main/java/com/eu/habbo/plugin/events/games/GameHabboLeaveEvent.java new file mode 100644 index 00000000..c537af42 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/games/GameHabboLeaveEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.games; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GameHabboLeaveEvent extends GameUserEvent +{ + /** + * @param game The Game instance that this event applies to. + * @param habbo The Habbo that left the game. + */ + public GameHabboLeaveEvent(Game game, Habbo habbo) + { + super(game, habbo); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/games/GameStartedEvent.java b/src/main/java/com/eu/habbo/plugin/events/games/GameStartedEvent.java new file mode 100644 index 00000000..3dd7275a --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/games/GameStartedEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.plugin.events.games; + +import com.eu.habbo.habbohotel.games.Game; + +public class GameStartedEvent extends GameEvent +{ + /** + * This event occurs when a Game starts. + * @param game The Game this event applies to. + */ + public GameStartedEvent(Game game) + { + super(game); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/games/GameStoppedEvent.java b/src/main/java/com/eu/habbo/plugin/events/games/GameStoppedEvent.java new file mode 100644 index 00000000..7687b514 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/games/GameStoppedEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.plugin.events.games; + +import com.eu.habbo.habbohotel.games.Game; + +public class GameStoppedEvent extends GameEvent +{ + /** + * This event occurs when a Game stops. + * @param game The Game instance that this event applies to. + */ + public GameStoppedEvent(Game game) + { + super(game); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/games/GameUserEvent.java b/src/main/java/com/eu/habbo/plugin/events/games/GameUserEvent.java new file mode 100644 index 00000000..32b294e3 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/games/GameUserEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.plugin.events.games; + +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.users.Habbo; + +public abstract class GameUserEvent extends GameEvent +{ + /** + * The Habbo that this event applies to. + */ + public final Habbo habbo; + + /** + * @param game The Game instance that this event applies to. + * @param habbo The Habbo that this event applies to. + */ + public GameUserEvent(Game game, Habbo habbo) + { + super(game); + + this.habbo = habbo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildAcceptedMembershipEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildAcceptedMembershipEvent.java new file mode 100644 index 00000000..bb71009e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildAcceptedMembershipEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildAcceptedMembershipEvent extends GuildEvent +{ + /** + * The userID that gets accepted. + */ + public final int userId; + + /** + * The Habbo that gets accepted. Can be NULL when user is offline. + */ + public final Habbo user; + + /** + * Triggered whenever an membership requests gets accepted. + * This event cannot be cancelled. + * @param guild The guild this applies to. + * @param userId The userID that gets accepted. + * @param user The Habbo that gets accepted. Can be NULL when user is offline. + */ + public GuildAcceptedMembershipEvent(Guild guild, int userId, Habbo user) + { + super(guild); + + this.userId = userId; + this.user = user; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedBadgeEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedBadgeEvent.java new file mode 100644 index 00000000..369da0a7 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedBadgeEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; + +public class GuildChangedBadgeEvent extends GuildEvent +{ + /** + * The new badge of the guild. + */ + public String badge; + + /** + * Triggered whenever the badge of a guild gets updated. + * @param guild The guild this applies to. + * @param badge The new badge of the guild. + */ + public GuildChangedBadgeEvent(Guild guild, String badge) + { + super(guild); + + this.badge = badge; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedColorsEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedColorsEvent.java new file mode 100644 index 00000000..259bd90e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedColorsEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; + +public class GuildChangedColorsEvent extends GuildEvent +{ + /** + * First color. + */ + public int colorOne; + + /** + * Second color. + */ + public int colorTwo; + + /** + * Triggered whenever the guild colors get updated. + * @param guild The guild this applies to. + * @param colorOne First color. + * @param colorTwo Second color. + */ + public GuildChangedColorsEvent(Guild guild, int colorOne, int colorTwo) + { + super(guild); + + this.colorOne = colorOne; + this.colorTwo = colorTwo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedNameEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedNameEvent.java new file mode 100644 index 00000000..17d5197a --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedNameEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; + +public class GuildChangedNameEvent extends GuildEvent +{ + /** + * The new name of the guild. + */ + public String name; + + /** + * The new description of the guild. + */ + public String description; + + /** + * Triggered whenever the name / description of a guild gets updated. + * @param guild The guild this applies to. + * @param name The new name of the guild. + * @param description The new description of the guild. + */ + public GuildChangedNameEvent(Guild guild, String name, String description) + { + super(guild); + this.name = name; + this.description = description; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedSettingsEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedSettingsEvent.java new file mode 100644 index 00000000..2eab7076 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildChangedSettingsEvent.java @@ -0,0 +1,28 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; + +public class GuildChangedSettingsEvent extends GuildEvent +{ + /** + * The new state of the guild. + */ + public int state; + + /** + * The new rights of the guild. + */ + public int rights; + /** + * Triggered whenever the settings of a guild gets updated. + * @param guild The guild this applies to. + * @param state The new state of the guild. + * @param rights The new rights of the guild. + */ + public GuildChangedSettingsEvent(Guild guild, int state, int rights) + { + super(guild); + this.state = state; + this.rights = rights; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeclinedMembershipEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeclinedMembershipEvent.java new file mode 100644 index 00000000..43b84a79 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeclinedMembershipEvent.java @@ -0,0 +1,38 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildDeclinedMembershipEvent extends GuildEvent +{ + /** + * The userID that gets declined. + */ + public final int userId; + + /** + * The Habbo that gets declined. Can be NULL when user is offline. + */ + public final Habbo user; + + /** + * The Habbo that declined the user from joining. + */ + public final Habbo admin; + + /** + * Triggered whenever an membership requests gets declined. + * This event cannot be cancelled. + * @param guild The guild this applies to. + * @param userId The userID that gets declined. + * @param user The Habbo that gets declined. Can be NULL when user is offline. + */ + public GuildDeclinedMembershipEvent(Guild guild, int userId, Habbo user, Habbo admin) + { + super(guild); + + this.userId = userId; + this.user = user; + this.admin = admin; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeletedEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeletedEvent.java new file mode 100644 index 00000000..ffc5e2bc --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildDeletedEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildDeletedEvent extends GuildEvent +{ + /** + * The Habbo that deleted the guild. + */ + public final Habbo deleter; + + /** + * Triggered whenever a guild gets deleted. + * @param guild The guild this applies to. + * @param deleter The Habbo that deleted the guild. + */ + public GuildDeletedEvent(Guild guild, Habbo deleter) + { + super(guild); + + this.deleter = deleter; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildEvent.java new file mode 100644 index 00000000..9f203711 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.plugin.Event; + +public abstract class GuildEvent extends Event +{ + /** + * The guild this applies to. + */ + public final Guild guild; + + /** + * @param guild The guild this applies to. + */ + public GuildEvent(Guild guild) + { + this.guild = guild; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildFavoriteSetEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildFavoriteSetEvent.java new file mode 100644 index 00000000..09b437f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildFavoriteSetEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildFavoriteSetEvent extends GuildEvent +{ + /** + * The Habbo that sets the favorite guild. + */ + public final Habbo habbo; + + /** + * Triggered whenever a Habbo sets his favorite guild. + * @param guild The guild this applies to. + * @param habbo The Habbo that sets the favorite guild. + */ + public GuildFavoriteSetEvent(Guild guild, Habbo habbo) + { + super(guild); + + this.habbo = habbo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildGivenAdminEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildGivenAdminEvent.java new file mode 100644 index 00000000..09426e6e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildGivenAdminEvent.java @@ -0,0 +1,37 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildGivenAdminEvent extends GuildEvent +{ + /** + * The userId of the Habbo given Admin rights. + */ + public final int userId; + + /** + * The Habbo that is given Admin rights. + */ + public final Habbo habbo; + + /** + * The person that give the Habbo admin rights. + */ + public final Habbo admin; + + /** + * Triggered whenever an Habbo gets given the Admin rights. + * @param guild The guild this applies to. + * @param userId The userId of the Habbo given Admin rights. + * @param habbo The Habbo that is given Admin rights. + * @param admin The person that give the Habbo admin rights. + */ + public GuildGivenAdminEvent(Guild guild, int userId, Habbo habbo, Habbo admin) + { + super(guild); + this.userId = userId; + this.habbo = habbo; + this.admin = admin; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildPurchasedEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildPurchasedEvent.java new file mode 100644 index 00000000..d0f42617 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildPurchasedEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildPurchasedEvent extends GuildEvent +{ + /** + * The Habbo that bought this guild. + */ + public final Habbo habbo; + + /** + * Triggered whenever someone buys a guild. + * @param guild The guild this applies to. + * @param habbo + */ + public GuildPurchasedEvent(Guild guild, Habbo habbo) + { + super(guild); + this.habbo = habbo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedAdminEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedAdminEvent.java new file mode 100644 index 00000000..c13a258f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedAdminEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildRemovedAdminEvent extends GuildEvent +{ + /** + * The userID of the Admin that gets removed. + */ + public final int userId; + + /** + * The Habbo that gets removed. Is null when the Habbo is offnot in the guild room. + */ + public final Habbo admin; + + /** + * @param guild The guild this applies to. + * @param userId The userID of the Admin that gets removed. + * @param admin The Habbo that gets removed. Is null when the Habbo is not in the guild room. + */ + public GuildRemovedAdminEvent(Guild guild, int userId, Habbo admin) + { + super(guild); + this.userId = userId; + this.admin = admin; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedFavoriteEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedFavoriteEvent.java new file mode 100644 index 00000000..a5e6e1b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedFavoriteEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildRemovedFavoriteEvent extends GuildEvent +{ + /** + * The Habbo that removed the guild as favorite. + */ + public final Habbo habbo; + + /** + * @param guild The guild this applies to. + * @param habbo The Habbo that removed the guild as favorite. + */ + public GuildRemovedFavoriteEvent(Guild guild, Habbo habbo) + { + super(guild); + this.habbo = habbo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedMemberEvent.java b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedMemberEvent.java new file mode 100644 index 00000000..e82ea99e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/guilds/GuildRemovedMemberEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.plugin.events.guilds; + +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuildRemovedMemberEvent extends GuildEvent +{ + /** + * The userID of the Habbo being removed. + */ + public final int userId; + + /** + * The guildmember that has been removed. + */ + public final Habbo guildMember; + + /** + * @param guild The guild this applies to. + * @param userId The userID of the Habbo being removed. + * @param guildMember The guildmember that has been removed. + */ + public GuildRemovedMemberEvent(Guild guild, int userId, Habbo guildMember) + { + super(guild); + this.guildMember = guildMember; + this.userId = userId; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryEvent.java b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryEvent.java new file mode 100644 index 00000000..f2c1130d --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.plugin.events.inventory; + +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.plugin.Event; + +public abstract class InventoryEvent extends Event +{ + public final HabboInventory inventory; + + protected InventoryEvent(HabboInventory inventory) + { + this.inventory = inventory; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemAddedEvent.java b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemAddedEvent.java new file mode 100644 index 00000000..5b439140 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemAddedEvent.java @@ -0,0 +1,12 @@ +package com.eu.habbo.plugin.events.inventory; + +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class InventoryItemAddedEvent extends InventoryItemEvent +{ + public InventoryItemAddedEvent(HabboInventory inventory, HabboItem item) + { + super(inventory, item); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemEvent.java b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemEvent.java new file mode 100644 index 00000000..f4515832 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.inventory; + +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class InventoryItemEvent extends InventoryEvent +{ + public HabboItem item; + + public InventoryItemEvent(HabboInventory inventory, HabboItem item) + { + super(inventory); + + this.item = item; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemRemovedEvent.java b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemRemovedEvent.java new file mode 100644 index 00000000..1d9a272c --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemRemovedEvent.java @@ -0,0 +1,12 @@ +package com.eu.habbo.plugin.events.inventory; + +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class InventoryItemRemovedEvent extends InventoryItemEvent +{ + public InventoryItemRemovedEvent(HabboInventory inventory, HabboItem item) + { + super(inventory, item); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemsAddedEvent.java b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemsAddedEvent.java new file mode 100644 index 00000000..e0be6c37 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/inventory/InventoryItemsAddedEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.inventory; + +import com.eu.habbo.habbohotel.users.HabboInventory; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.set.hash.THashSet; + +public class InventoryItemsAddedEvent extends InventoryEvent +{ + public final THashSet items; + + public InventoryItemsAddedEvent(HabboInventory inventory, THashSet items) + { + super(inventory); + this.items = items; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceEvent.java b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceEvent.java new file mode 100644 index 00000000..6a75efff --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceEvent.java @@ -0,0 +1,7 @@ +package com.eu.habbo.plugin.events.marketplace; + +import com.eu.habbo.plugin.Event; + +public class MarketPlaceEvent extends Event +{ +} diff --git a/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemCancelledEvent.java b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemCancelledEvent.java new file mode 100644 index 00000000..3395c035 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemCancelledEvent.java @@ -0,0 +1,13 @@ +package com.eu.habbo.plugin.events.marketplace; + +import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlaceOffer; + +public class MarketPlaceItemCancelledEvent extends MarketPlaceEvent +{ + public final MarketPlaceOffer offer; + + public MarketPlaceItemCancelledEvent(MarketPlaceOffer offer) + { + this.offer = offer; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemOfferedEvent.java b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemOfferedEvent.java new file mode 100644 index 00000000..b377e4f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemOfferedEvent.java @@ -0,0 +1,18 @@ +package com.eu.habbo.plugin.events.marketplace; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class MarketPlaceItemOfferedEvent extends MarketPlaceEvent +{ + public final Habbo habbo; + public final HabboItem item; + public int price; + + public MarketPlaceItemOfferedEvent(Habbo habbo, HabboItem item, int price) + { + this.habbo = habbo; + this.item = item; + this.price = price; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemSoldEvent.java b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemSoldEvent.java new file mode 100644 index 00000000..8a09c563 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/marketplace/MarketPlaceItemSoldEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.marketplace; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class MarketPlaceItemSoldEvent extends MarketPlaceEvent +{ + public final Habbo seller; + public final Habbo purchaser; + public final HabboItem item; + public int price; + + public MarketPlaceItemSoldEvent(Habbo seller, Habbo purchaser, HabboItem item, int price) + { + this.seller = seller; + this.purchaser = purchaser; + this.item = item; + this.price = price; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorPopularRoomsEvent.java b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorPopularRoomsEvent.java new file mode 100644 index 00000000..84ae8a1a --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorPopularRoomsEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.plugin.events.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; + +public class NavigatorPopularRoomsEvent extends NavigatorRoomsEvent +{ + /** + * The rooms displayed. + */ + public final ArrayList rooms; + + /** + * @param habbo The Habbo this event applies to. + * @param rooms The rooms displayed. + */ + public NavigatorPopularRoomsEvent(Habbo habbo, ArrayList rooms) + { + super(habbo, rooms); + + this.rooms = rooms; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomCreatedEvent.java b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomCreatedEvent.java new file mode 100644 index 00000000..d3cacc37 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomCreatedEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.plugin.events.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +public class NavigatorRoomCreatedEvent extends UserEvent +{ + /** + * The room created. + */ + public final Room room; + + /** + * Triggered whenever a user creates a room. + * This event cannot be cancelled. + * @param habbo The Habbo this event applies to. + * @param room The room created. + */ + public NavigatorRoomCreatedEvent(Habbo habbo, Room room) + { + super(habbo); + + this.room = room; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomDeletedEvent.java b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomDeletedEvent.java new file mode 100644 index 00000000..61b25581 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomDeletedEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +public class NavigatorRoomDeletedEvent extends UserEvent +{ + public final Room room; + /** + * @param habbo The Habbo this event applies to. + * @param room The room that is deleted. Note: Data is not deleted yet. + */ + public NavigatorRoomDeletedEvent(Habbo habbo, Room room) + { + super(habbo); + + this.room = room; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomsEvent.java b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomsEvent.java new file mode 100644 index 00000000..74ca24bc --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorRoomsEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.plugin.events.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +import java.util.ArrayList; + +public abstract class NavigatorRoomsEvent extends UserEvent +{ + /** + * The rooms displayed. + */ + public final ArrayList rooms; + + /** + * @param habbo The Habbo this event applies to. + * @param rooms The rooms displayed. + */ + public NavigatorRoomsEvent(Habbo habbo, ArrayList rooms) + { + super(habbo); + + this.rooms = rooms; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorSearchResultEvent.java b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorSearchResultEvent.java new file mode 100644 index 00000000..4f5f6406 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/navigator/NavigatorSearchResultEvent.java @@ -0,0 +1,33 @@ +package com.eu.habbo.plugin.events.navigator; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.util.ArrayList; + +public class NavigatorSearchResultEvent extends NavigatorRoomsEvent +{ + /** + * Prefix used to search. e.g. owner: + */ + public final String prefix; + + /** + * The query that has been used to search for rooms. + */ + public final String query; + + /** + * Triggered whenever a user searches for rooms in the navigator. + * @param habbo The Habbo this event applies to. + * @param prefix Prefix used to search. e.g. owner: + * @param query The query that has been used to search for rooms. + */ + public NavigatorSearchResultEvent(Habbo habbo, String prefix, String query, ArrayList rooms) + { + super(habbo, rooms); + + this.prefix = prefix; + this.query = query; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/pets/PetEvent.java b/src/main/java/com/eu/habbo/plugin/events/pets/PetEvent.java new file mode 100644 index 00000000..0617c629 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/pets/PetEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.plugin.events.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.plugin.Event; + +public abstract class PetEvent extends Event +{ + /** + * The pet this event applies to. + */ + public final AbstractPet pet; + + /** + * Abstract class for events related to pets. + * @param pet The pet this event applies to. + */ + public PetEvent(AbstractPet pet) + { + this.pet = pet; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/pets/PetTalkEvent.java b/src/main/java/com/eu/habbo/plugin/events/pets/PetTalkEvent.java new file mode 100644 index 00000000..f8c00a1e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/pets/PetTalkEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.plugin.events.pets; + +import com.eu.habbo.habbohotel.pets.AbstractPet; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; + +public class PetTalkEvent extends PetEvent +{ + /** + * The message to be displayed + */ + public RoomChatMessage message; + + public PetTalkEvent(AbstractPet pet, RoomChatMessage message) + { + super(pet); + + this.message = message; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/rooms/RoomEvent.java b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomEvent.java new file mode 100644 index 00000000..b958664e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.plugin.events.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.plugin.Event; + +public abstract class RoomEvent extends Event +{ + /** + * The Room this event applies to. + */ + public final Room room; + + /** + * This is an event that applies to a certain room. + * @param room The room this event applies to. + */ + public RoomEvent(Room room) + { + this.room = room; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/rooms/RoomLoadedEvent.java b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomLoadedEvent.java new file mode 100644 index 00000000..d5361435 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomLoadedEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; + +public class RoomLoadedEvent extends RoomEvent +{ + /** + * Triggered whenever a room is fully loaded. + * + * @param room The room that has been loaded. + */ + public RoomLoadedEvent(Room room) + { + super(room); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUncachedEvent.java b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUncachedEvent.java new file mode 100644 index 00000000..462b04f0 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUncachedEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; + +public class RoomUncachedEvent extends RoomEvent +{ + /** + * Triggered when the room will be uncached. + * + * @param room The room this event applies to. + */ + public RoomUncachedEvent(Room room) + { + super(room); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadedEvent.java b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadedEvent.java new file mode 100644 index 00000000..a4fcde8b --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadedEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; + +public class RoomUnloadedEvent extends RoomEvent +{ + /** + * Triggered whenever a room has been unloaded. + * + * @param room The room that has been unloaded. + */ + public RoomUnloadedEvent(Room room) + { + super(room); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadingEvent.java b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadingEvent.java new file mode 100644 index 00000000..1eb2494e --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/rooms/RoomUnloadingEvent.java @@ -0,0 +1,16 @@ +package com.eu.habbo.plugin.events.rooms; + +import com.eu.habbo.habbohotel.rooms.Room; + +public class RoomUnloadingEvent extends RoomEvent +{ + /** + * Triggered when a room is about to be unloaded. + * + * @param room The room this event applies to. + */ + public RoomUnloadingEvent(Room room) + { + super(room); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitEvent.java b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitEvent.java new file mode 100644 index 00000000..c673cf5c --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitEvent.java @@ -0,0 +1,27 @@ +package com.eu.habbo.plugin.events.roomunit; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.plugin.Event; + +public abstract class RoomUnitEvent extends Event +{ + /** + * The Room this event applies to. + */ + public final Room room; + + /** + * The RoomUnit this event applies to. + */ + public final RoomUnit roomUnit; + + /** + * @param roomUnit The RoomUnit this event applies to. + */ + public RoomUnitEvent(Room room, RoomUnit roomUnit) + { + this.room = room; + this.roomUnit = roomUnit; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitLookAtPointEvent.java b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitLookAtPointEvent.java new file mode 100644 index 00000000..3fbc0e26 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitLookAtPointEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.plugin.events.roomunit; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +public class RoomUnitLookAtPointEvent extends RoomUnitEvent +{ + /** + * The tile to look at. + */ + public final RoomTile location; + + /** + * @param room The Room this event applies to. + * @param roomUnit The RoomUnit this event applies to. + * @param location The tile to look at. + */ + public RoomUnitLookAtPointEvent(Room room, RoomUnit roomUnit, RoomTile location) + { + super(room, roomUnit); + + this.location = location; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java new file mode 100644 index 00000000..80a5354f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.roomunit; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; + +public class RoomUnitSetGoalEvent extends RoomUnitEvent +{ + /** + * Target goal that the Habbo has set. + */ + public final RoomTile goal; + + public RoomUnitSetGoalEvent(Room room, RoomUnit roomUnit, RoomTile goal) + { + super(room, roomUnit); + + this.goal = goal; + } + + /** + * Sets a new walk goal location for the Habbo. + * This will trigger an new event instance of this class. + * @param t an location. + */ + public void setGoal(RoomTile t) + { + super.roomUnit.setGoalLocation(t); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/support/SupportEvent.java b/src/main/java/com/eu/habbo/plugin/events/support/SupportEvent.java new file mode 100644 index 00000000..d496a414 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/support/SupportEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.support; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.Event; + +public abstract class SupportEvent extends Event +{ + /** + * The moderator for this event. + */ + public Habbo moderator; + + /** + * @param moderator The moderator for this event. + */ + public SupportEvent(Habbo moderator) + { + this.moderator = moderator; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/support/SupportRoomActionEvent.java b/src/main/java/com/eu/habbo/plugin/events/support/SupportRoomActionEvent.java new file mode 100644 index 00000000..a7c884fc --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/support/SupportRoomActionEvent.java @@ -0,0 +1,45 @@ +package com.eu.habbo.plugin.events.support; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +public class SupportRoomActionEvent extends SupportEvent +{ + /** + * The room to handle. + */ + public final Room room; + + /** + * Whether to kick all users. + */ + public boolean kickUsers; + + /** + * Whether to lock the door. + */ + public boolean lockDoor; + + /** + * Whether to change the title. + */ + public boolean changeTitle; + + /** + * This event is triggered when the room settings are changed via the mod tool. + * @param moderator The moderator for this event. + * @param room The room to handle. + * @param kickUsers Whether to kick all users. + * @param lockDoor Whether to lock the door. + * @param changeTitle Whether to change the title. + */ + public SupportRoomActionEvent(Habbo moderator, Room room, boolean kickUsers, boolean lockDoor, boolean changeTitle) + { + super(moderator); + + this.room = room; + this.kickUsers = kickUsers; + this.lockDoor = lockDoor; + this.changeTitle = changeTitle; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/support/SupportTicketEvent.java b/src/main/java/com/eu/habbo/plugin/events/support/SupportTicketEvent.java new file mode 100644 index 00000000..99d21e83 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/support/SupportTicketEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.support; + +import com.eu.habbo.habbohotel.modtool.ModToolIssue; +import com.eu.habbo.habbohotel.users.Habbo; + +public class SupportTicketEvent extends SupportEvent +{ + public final ModToolIssue ticket; + + /** + * @param moderator There is no moderator for this event. + * @param ticket The ticket creatd. + */ + public SupportTicketEvent(Habbo moderator, ModToolIssue ticket) + { + super(moderator); + + this.ticket = ticket; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/support/SupportUserAlertedEvent.java b/src/main/java/com/eu/habbo/plugin/events/support/SupportUserAlertedEvent.java new file mode 100644 index 00000000..1fc84491 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/support/SupportUserAlertedEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.support; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class SupportUserAlertedEvent extends SupportEvent +{ + /** + * The Habbo this event applies to. + */ + public Habbo target; + + /** + * The message send to the habbo. + */ + public String message; + + /** + * This event is triggered when a modeerator alerts an user. + * @param moderator The moderator for this event. + * @param target The Habbo this event applies to. + * @param message The message send to the habbo. + */ + public SupportUserAlertedEvent(Habbo moderator, Habbo target, String message) + { + super(moderator); + + this.message = message; + this.target = target; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/support/SupportUserBannedEvent.java b/src/main/java/com/eu/habbo/plugin/events/support/SupportUserBannedEvent.java new file mode 100644 index 00000000..b547e057 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/support/SupportUserBannedEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.support; + +import com.eu.habbo.habbohotel.modtool.ModToolBan; +import com.eu.habbo.habbohotel.users.Habbo; + +public class SupportUserBannedEvent extends SupportEvent +{ + /** + * The Habbo that has been banned. + */ + public final Habbo target; + + /** + * The ModToolBan created. + */ + public final ModToolBan ban; + + /** + * This event is triggered when a Habbo gets banned. Changes to the ModToolBan will be saved. + * @param target The Habbo that has been banned. + * @param ban The ModToolBan created. + */ + public SupportUserBannedEvent(Habbo moderator, Habbo target, ModToolBan ban) + { + super(moderator); + + this.target = target; + this.ban = ban; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/support/SupportUserKickEvent.java b/src/main/java/com/eu/habbo/plugin/events/support/SupportUserKickEvent.java new file mode 100644 index 00000000..953e16e0 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/support/SupportUserKickEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.support; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class SupportUserKickEvent extends SupportEvent +{ + /** + * The target to kick. + */ + public Habbo target; + + /** + * The message to send upon kick. + */ + public String message; + + /** + * This event is triggered when a Habbo gets kicked via the mod tools. + * @param moderator The moderator for this event. + * @param target The target to kick. + * @param message The message to send upon kick. + */ + public SupportUserKickEvent(Habbo moderator, Habbo target, String message) + { + super(moderator); + + this.target = target; + this.message = message; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserCommandEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserCommandEvent.java new file mode 100644 index 00000000..79698e9a --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserCommandEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserCommandEvent extends UserEvent +{ + /** + * Arguments the user typed for this command. + */ + public final String[] args; + + /** + * Wether the command has succesfully been executed. + */ + public final boolean succes; + + /** + * This event is triggered whenever a user executes a command. + * @param habbo The Habbo this event applies to. + * @param args Arguments the user typed for this command. + * @param succes Wether the command has succesfully been executed. + */ + public UserCommandEvent(Habbo habbo, String[] args, boolean succes) + { + super(habbo); + this.args = args; + this.succes = succes; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserCreditsEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserCreditsEvent.java new file mode 100644 index 00000000..86678258 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserCreditsEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserCreditsEvent extends UserEvent +{ + /** + * The amount of credits that will be added or removed. + */ + public int credits; + + /** + * This Event is triggered when credits are added or removed. + * @param habbo The Habbo this event applies to. + * @param credits The amount of credits that will be added or removed. + */ + public UserCreditsEvent(Habbo habbo, int credits) + { + super(habbo); + + this.credits = credits; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserDisconnectEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserDisconnectEvent.java new file mode 100644 index 00000000..3426fb4d --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserDisconnectEvent.java @@ -0,0 +1,14 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserDisconnectEvent extends UserEvent +{ + /** + * @param habbo The Habbo this event applies to. + */ + public UserDisconnectEvent(Habbo habbo) + { + super(habbo); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserEnterRoomEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserEnterRoomEvent.java new file mode 100644 index 00000000..9e0e325f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserEnterRoomEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserEnterRoomEvent extends UserEvent +{ + /** + * The room being entered. + */ + public final Room room; + + /** + * Triggered when a Habbo enters a room. + * Cancel the event to prevent the Habbo from entering. + * + * @param habbo The Habbo this event applies to. + * @param room The room being entered. + */ + public UserEnterRoomEvent(Habbo habbo, Room room) + { + super(habbo); + + this.room = room; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserEvent.java new file mode 100644 index 00000000..26091d9c --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.Event; + +public abstract class UserEvent extends Event +{ + /** + * The Habbo this event applies to. + */ + public final Habbo habbo; + + /** + * @param habbo The Habbo this event applies to. + */ + public UserEvent(Habbo habbo) + { + this.habbo = habbo; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserExecuteCommandEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserExecuteCommandEvent.java new file mode 100644 index 00000000..59ae8c7c --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserExecuteCommandEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.commands.Command; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserExecuteCommandEvent extends UserEvent +{ + /** + * The command that has been executed. + */ + public final Command command; + + /** + * The parameters which has been used to execute the command. + * This is the whole chat string the Habbo typed split on spaces. + */ + public final String[] params; + + /** + * This event is triggered whenever a Habbo executes an command. + * @param habbo The Habbo this event applies to. + * @param command The command the Habbo executed. + * @param params The parameters which has been used to execute the command. + */ + public UserExecuteCommandEvent(Habbo habbo, Command command, String[] params) + { + super(habbo); + + this.command = command; + this.params = params; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserExitRoomEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserExitRoomEvent.java new file mode 100644 index 00000000..a1ce9405 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserExitRoomEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserExitRoomEvent extends UserEvent +{ + public enum UserExitRoomReason + { + DOOR(false), + KICKED_HABBO(false), + KICKED_IDLE(true); + + public final boolean cancellable; + + UserExitRoomReason(boolean cancellable) + { + this.cancellable = cancellable; + } + } + + public final UserExitRoomReason reason; + + /** + * @param habbo The Habbo this event applies to. + * @param reason The reason the Habbo has left the room. + */ + public UserExitRoomEvent(Habbo habbo, UserExitRoomReason reason) + { + super(habbo); + this.reason = reason; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserIdleEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserIdleEvent.java new file mode 100644 index 00000000..994c6632 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserIdleEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserIdleEvent extends UserEvent +{ + public enum IdleReason + { + ACTION, + DANCE, + TIMEOUT, + WALKED, + TALKED + } + + public final IdleReason reason; + public boolean idle; + + /** + * Triggered whenever the state of idle for a given Habbo changes. + * @param habbo The Habbo this event applies to. + * @param reason The cause of this event. + * @param idle The new idle state. + */ + public UserIdleEvent(Habbo habbo, IdleReason reason, boolean idle) + { + super(habbo); + + this.reason = reason; + this.idle = idle; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserKickEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserKickEvent.java new file mode 100644 index 00000000..69c3a084 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserKickEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserKickEvent extends UserEvent +{ + /** + * The Habbo being kicked. + */ + public final Habbo target; + + /** + * @param habbo The Habbo this event applies to. + */ + public UserKickEvent(Habbo habbo, Habbo target) + { + super(habbo); + + this.target = target; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserLoginEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserLoginEvent.java new file mode 100644 index 00000000..53660141 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserLoginEvent.java @@ -0,0 +1,26 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +import java.net.SocketAddress; + +public class UserLoginEvent extends UserEvent +{ + /** + * Remote IP Adress of the Habbo who logged in. + * @see java.net.SocketAddress + */ + public final SocketAddress ip; + + /** + * This event is triggered whenever a Habbo logs into the client. + * @param habbo The Habbo this event applies to. + * @param ip The SocketAddress of the Habbo connecting. + */ + public UserLoginEvent(Habbo habbo, SocketAddress ip) + { + super(habbo); + + this.ip = ip; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserPickGiftEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserPickGiftEvent.java new file mode 100644 index 00000000..146a2fbb --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserPickGiftEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserPickGiftEvent extends UserEvent +{ + public final int keyA; + public final int keyB; + public final int index; + + /** + * @param habbo The Habbo this event applies to. + * @param keyA + * @param keyB + * @param index + */ + public UserPickGiftEvent(Habbo habbo, int keyA, int keyB, int index) + { + super(habbo); + this.keyA = keyA; + this.keyB = keyB; + this.index = index; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserPointsEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserPointsEvent.java new file mode 100644 index 00000000..52cb95f1 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserPointsEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserPointsEvent extends UserEvent +{ + /** + * Amount of points that will be added or removed. + */ + public int points; + + /** + * Points type. + */ + public int type; + + /** + * This event is triggered when points are added or removed from a user. + * @param habbo The Habbo this event applies to. + * @param amount Amount of points that will be added or removed. + * @param type Points type. + */ + public UserPointsEvent(Habbo habbo, int points, int type) + { + super(habbo); + + this.points = points; + this.type = type; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserPublishPictureEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserPublishPictureEvent.java new file mode 100644 index 00000000..1b3e865f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserPublishPictureEvent.java @@ -0,0 +1,35 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserPublishPictureEvent extends UserEvent +{ + /** + * The URL the picture gets saved to. + */ + public String URL; + + /** + * The timestamp that the picture was taken. + */ + public int timestamp; + + /** + * The room id this picture was taken. + */ + public int roomId; + + /** + * @param habbo The Habbo this event applies to. + * @param url The URL the picture gets saved to. + * @param timestamp The timestamp that the picture was taken. + * @param roomId The room id this picture was taken. + */ + public UserPublishPictureEvent(Habbo habbo, String url, int timestamp, int roomId) + { + super(habbo); + this.URL = url; + this.timestamp = timestamp; + this.roomId = roomId; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserPurchasePictureEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserPurchasePictureEvent.java new file mode 100644 index 00000000..eeaefad1 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserPurchasePictureEvent.java @@ -0,0 +1,36 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserPurchasePictureEvent extends UserEvent +{ + /** + * The url of the picture. + */ + public String url; + + /** + * The room the picture was taken. + */ + public int roomId; + + /** + * The timestamp the picture was taken. + */ + public int timestamp; + + /** + * @param habbo The Habbo this event applies to. + * @param url The url of the picture. + * @param roomId The room the picture was taken. + * @param timestamp The timestamp the picture was taken. + */ + public UserPurchasePictureEvent(Habbo habbo, String url, int roomId, int timestamp) + { + super(habbo); + + this.url = url; + this.roomId = roomId; + this.timestamp = timestamp; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserRegisteredEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserRegisteredEvent.java new file mode 100644 index 00000000..32bd4dc6 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserRegisteredEvent.java @@ -0,0 +1,15 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserRegisteredEvent extends UserEvent +{ + /** + * This event is called whenever a user logs in for the first time to the hotel. + * @param habbo The Habbo this event applies to. + */ + public UserRegisteredEvent(Habbo habbo) + { + super(habbo); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserRightsGivenEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserRightsGivenEvent.java new file mode 100644 index 00000000..5e8a1a46 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserRightsGivenEvent.java @@ -0,0 +1,18 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserRightsGivenEvent extends UserEvent +{ + public final Habbo receiver; + /** + * @param habbo The Habbo this event applies to. + * @param receiver The Habbo that received rights. + */ + public UserRightsGivenEvent(Habbo habbo, Habbo receiver) + { + super(habbo); + + this.receiver = receiver; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserRightsTakenEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserRightsTakenEvent.java new file mode 100644 index 00000000..bada4255 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserRightsTakenEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserRightsTakenEvent extends UserEvent +{ + public final int victimId; + public final Habbo victim; + + /** + * @param habbo The Habbo this event applies to. + * @param victimId The userid. + * @param victim The Habbo whose rights got taken. Not null when the victim is in the room. + */ + public UserRightsTakenEvent(Habbo habbo, int victimId, Habbo victim) + { + super(habbo); + + this.victimId = victimId; + this.victim = victim; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserRolledEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserRolledEvent.java new file mode 100644 index 00000000..f727341c --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserRolledEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class UserRolledEvent extends UserEvent +{ + /** + * The roller the RoomUnit has been rolled by. + */ + public final HabboItem roller; + + /** + * The new location of the RoomUnit. + */ + public final RoomTile location; + + /** + * Called upon any roomunit being rolled on a roller. + * @param habbo The Habbo this event applies to. + * @param roller The roller the Habbo has been rolled by. + * @param location The new location of the Habbo. + */ + public UserRolledEvent(Habbo habbo, HabboItem roller, RoomTile location) + { + super(habbo); + + this.roller = roller; + this.location = location; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserSavedLookEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedLookEvent.java new file mode 100644 index 00000000..059468cd --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedLookEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboGender; + +public class UserSavedLookEvent extends UserEvent +{ + public HabboGender gender; + public String newLook; + + /** + * Triggered whenever a Habbo saved its look. + * newLook can be altered to override the look it saves to. + * @param habbo The Habbo this event applies to. + * @param gender The gender of this look. + * @param newLook The new look. + */ + public UserSavedLookEvent(Habbo habbo, HabboGender gender, String newLook) + { + super(habbo); + this.gender = gender; + this.newLook = newLook; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserSavedMottoEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedMottoEvent.java new file mode 100644 index 00000000..92a272b4 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedMottoEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserSavedMottoEvent extends UserEvent +{ + public final String oldMotto; + public String newMotto; + + /** + * @param habbo The Habbo this event applies to. + * @param oldMotto The oldmotto. + * @param newMotto The new motto. + */ + public UserSavedMottoEvent(Habbo habbo, String oldMotto, String newMotto) + { + super(habbo); + this.oldMotto = oldMotto; + this.newMotto = newMotto; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserSavedSettingsEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedSettingsEvent.java new file mode 100644 index 00000000..724cb74f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedSettingsEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserSavedSettingsEvent extends UserEvent +{ + /** + * Fired when a user changes it settings regarding: + * - Volumes + * - Camera following + * - Ignoring room invites + * - Chat mode. + * @param habbo The Habbo this event applies to. + */ + public UserSavedSettingsEvent(Habbo habbo) + { + super(habbo); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserSavedWardrobeEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedWardrobeEvent.java new file mode 100644 index 00000000..623310f8 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserSavedWardrobeEvent.java @@ -0,0 +1,19 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.inventory.WardrobeComponent; + +public class UserSavedWardrobeEvent extends UserEvent +{ + public final WardrobeComponent.WardrobeItem wardrobeItem; + + /** + * @param habbo The Habbo this event applies to. + * @param wardrobeItem The wardrobe item this look is saved to. + */ + public UserSavedWardrobeEvent(Habbo habbo, WardrobeComponent.WardrobeItem wardrobeItem) + { + super(habbo); + this.wardrobeItem = wardrobeItem; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserTakeStepEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserTakeStepEvent.java new file mode 100644 index 00000000..417ed22b --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserTakeStepEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserTakeStepEvent extends UserEvent +{ + /** + * The old location of the Habbo. + */ + public final RoomTile fromLocation; + + /** + * The new location of the Habbo. + */ + public final RoomTile toLocation; + + /** + * This event is triggered each time an Habbo walks to the next square. + * @param habbo The Habbo this event applies to. + * @param fromLocation The old location of the Habbo. + * @param toLocation The new location of the Habbo. + */ + public UserTakeStepEvent(Habbo habbo, RoomTile fromLocation, RoomTile toLocation) + { + super(habbo); + + this.fromLocation = fromLocation; + this.toLocation = toLocation; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserTalkEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserTalkEvent.java new file mode 100644 index 00000000..6d707f58 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserTalkEvent.java @@ -0,0 +1,22 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatType; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserTalkEvent extends UserEvent +{ + public final RoomChatMessage chatMessage; + public final RoomChatType chatType; + /** + * @param habbo The Habbo this event applies to. + * @param chatMessage + * @param chatType + */ + public UserTalkEvent(Habbo habbo, RoomChatMessage chatMessage, RoomChatType chatType) + { + super(habbo); + this.chatMessage = chatMessage; + this.chatType = chatType; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserTriggerWordFilterEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/UserTriggerWordFilterEvent.java new file mode 100644 index 00000000..fe332619 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserTriggerWordFilterEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.modtool.WordFilterWord; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserTriggerWordFilterEvent extends UserEvent +{ + /** + * The word that triggered the filter. + */ + public final WordFilterWord word; + + /** + * @param habbo The Habbo this event applies to. + * @param word The word that triggered the filter. + */ + public UserTriggerWordFilterEvent(Habbo habbo, WordFilterWord word) + { + super(habbo); + + this.word = word; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/UserWiredRewardReceived.java b/src/main/java/com/eu/habbo/plugin/events/users/UserWiredRewardReceived.java new file mode 100644 index 00000000..458a93c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/UserWiredRewardReceived.java @@ -0,0 +1,40 @@ +package com.eu.habbo.plugin.events.users; + +import com.eu.habbo.habbohotel.items.interactions.wired.effects.WiredEffectGiveReward; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserWiredRewardReceived extends UserEvent +{ + /** + * The wired effect that gave the reward. + */ + public final WiredEffectGiveReward wiredEffectGiveReward; + + /** + * Type of reward being given. + */ + public final String type; + + /** + * Reward being given. + */ + public String value; + + /** + * Triggered whenever a Habbo succesfully receives a reward. + * Change value to set the new reward. + * Cancel the event to prevent the reward from being given. + * @param habbo The Habbo this event applies to. + * @param wiredEffectGiveReward The wired effect that gave the reward. + * @param type Type of reward being given. + * @param value Reward being given. + */ + public UserWiredRewardReceived(Habbo habbo, WiredEffectGiveReward wiredEffectGiveReward, String type, String value) + { + super(habbo); + + this.wiredEffectGiveReward = wiredEffectGiveReward; + this.type = type; + this.value = value; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementEvent.java new file mode 100644 index 00000000..6af7faaa --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.users.achievements; + +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +public abstract class UserAchievementEvent extends UserEvent +{ + /** + * The Achievement this event applies to. + */ + public final Achievement achievement; + + /** + * @param habbo The Habbo this event applies to. + * @param achievement The Achievement this event applies to. + */ + public UserAchievementEvent(Habbo habbo, Achievement achievement) + { + super(habbo); + + this.achievement = achievement; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementLeveledEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementLeveledEvent.java new file mode 100644 index 00000000..cda9d261 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementLeveledEvent.java @@ -0,0 +1,32 @@ +package com.eu.habbo.plugin.events.users.achievements; + +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementLevel; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserAchievementLeveledEvent extends UserAchievementEvent +{ + /** + * The previous level of the Achievement. + */ + public final AchievementLevel oldLevel; + + /** + * The new level of the Achievement. + */ + public final AchievementLevel newLevel; + + /** + * @param habbo The Habbo this event applies to. + * @param achievement The Achievement this event applies to. + * @param oldLevel The previous level of the Achievement. + * @param newLevel The new level of the Achievement. + */ + public UserAchievementLeveledEvent(Habbo habbo, Achievement achievement, AchievementLevel oldLevel, AchievementLevel newLevel) + { + super(habbo, achievement); + + this.oldLevel = oldLevel; + this.newLevel = newLevel; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementProgressEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementProgressEvent.java new file mode 100644 index 00000000..1827f9c3 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/achievements/UserAchievementProgressEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.users.achievements; + +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserAchievementProgressEvent extends UserAchievementEvent +{ + /** + * The amount of progress that has been gained. + */ + public final int progressed; + + /** + * @param habbo The Habbo this event applies to. + * @param achievement The Achievement this event applies to. + * @param progressed The amount of progress that has been gained. + */ + public UserAchievementProgressEvent(Habbo habbo, Achievement achievement, int progressed) + { + super(habbo, achievement); + + this.progressed = progressed; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogEvent.java new file mode 100644 index 00000000..3c2c4855 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogEvent.java @@ -0,0 +1,24 @@ +package com.eu.habbo.plugin.events.users.catalog; + +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +public class UserCatalogEvent extends UserEvent +{ + /** + * The CatalogItem this event applies to. + */ + public CatalogItem catalogItem; + + /** + * @param habbo The Habbo this event applies to. + * @param catalogItem The CatalogItem this event applies to. + */ + public UserCatalogEvent(Habbo habbo, CatalogItem catalogItem) + { + super(habbo); + + this.catalogItem = catalogItem; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogFurnitureBoughtEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogFurnitureBoughtEvent.java new file mode 100644 index 00000000..8d5428ed --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogFurnitureBoughtEvent.java @@ -0,0 +1,29 @@ +package com.eu.habbo.plugin.events.users.catalog; + +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.plugin.events.users.UserEvent; +import gnu.trove.set.hash.THashSet; + +public class UserCatalogFurnitureBoughtEvent extends UserCatalogEvent +{ + /** + * List of items bought. + */ + public final THashSet furniture; + + /** + * This event is triggered whenever someone buys a furniture. + * Cancelling this event will not prevent the furniture from being bought. + * @param habbo The Habbo this event applies to. + * @param catalogItem The CatalogItem this event applies to. + * @param furniture The furniture this event applies to. + */ + public UserCatalogFurnitureBoughtEvent( Habbo habbo, CatalogItem catalogItem ,THashSet furniture) + { + super(habbo, catalogItem); + + this.furniture = furniture; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogItemPurchasedEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogItemPurchasedEvent.java new file mode 100644 index 00000000..ab49d508 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/catalog/UserCatalogItemPurchasedEvent.java @@ -0,0 +1,49 @@ +package com.eu.habbo.plugin.events.users.catalog; + +import com.eu.habbo.habbohotel.catalog.CatalogItem; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.set.hash.THashSet; + +import java.util.List; + +public class UserCatalogItemPurchasedEvent extends UserCatalogEvent +{ + /** + * The items that will be purchased. + * Modify the list to add more furniture. + */ + public final THashSet itemsList; + + /** + * Total amount of credits. + */ + public int totalCredits; + + /** + * Total amount of points. + */ + public int totalPoints; + + /** + * Badges + */ + public List badges; + + /** + * @param habbo The Habbo this event applies to. + * @param catalogItem The CatalogItem this event applies to. + * @param itemsList The items that will be purchased. Modify the list to add more furniture. + * @param totalCredits Total amount of credits. + * @param totalPoints Total amount of points. + */ + public UserCatalogItemPurchasedEvent(Habbo habbo, CatalogItem catalogItem, THashSet itemsList, int totalCredits, int totalPoints, List badges) + { + super(habbo, catalogItem); + + this.itemsList = itemsList; + this.totalCredits = totalCredits; + this.totalPoints = totalPoints; + this.badges = badges; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/friends/UserAcceptFriendRequestEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserAcceptFriendRequestEvent.java new file mode 100644 index 00000000..241fda14 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserAcceptFriendRequestEvent.java @@ -0,0 +1,17 @@ +package com.eu.habbo.plugin.events.users.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserAcceptFriendRequestEvent extends UserFriendEvent +{ + /** + * Triggered when a Habbo accepts a new friend. + * @param habbo The Habbo this event applies to. + * @param friend The friend this event applies to. + */ + public UserAcceptFriendRequestEvent(Habbo habbo, MessengerBuddy friend) + { + super(habbo, friend); + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendChatEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendChatEvent.java new file mode 100644 index 00000000..4db0f75c --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendChatEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.plugin.events.users.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserFriendChatEvent extends UserFriendEvent +{ + /** + * The message send. + */ + public String message; + + /** + * Triggered whenever a Habbo sends an IM message. + * @param habbo The Habbo this event applies to. + * @param friend The friend this event applies to. + * @param message The message being send. + */ + public UserFriendChatEvent(Habbo habbo, MessengerBuddy friend, String message) + { + super(habbo, friend); + + this.message = message; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendEvent.java new file mode 100644 index 00000000..3f539667 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserFriendEvent.java @@ -0,0 +1,21 @@ +package com.eu.habbo.plugin.events.users.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +public abstract class UserFriendEvent extends UserEvent +{ + public final MessengerBuddy friend; + + /** + * @param habbo The Habbo this event applies to. + * @param friend The friend this event applies to. + */ + public UserFriendEvent(Habbo habbo, MessengerBuddy friend) + { + super(habbo); + + this.friend = friend; + } +} diff --git a/src/main/java/com/eu/habbo/plugin/events/users/friends/UserRelationShipEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserRelationShipEvent.java new file mode 100644 index 00000000..a34bc41f --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserRelationShipEvent.java @@ -0,0 +1,20 @@ +package com.eu.habbo.plugin.events.users.friends; + +import com.eu.habbo.habbohotel.messenger.MessengerBuddy; +import com.eu.habbo.habbohotel.users.Habbo; + +public class UserRelationShipEvent extends UserFriendEvent +{ + public int relationShip; + + /** + * @param habbo The Habbo this event applies to. + * @param friend The friend this event applies to. + */ + public UserRelationShipEvent(Habbo habbo, MessengerBuddy friend, int relationShip) + { + super(habbo, friend); + + this.relationShip = relationShip; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/plugin/events/users/friends/UserRequestFriendshipEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserRequestFriendshipEvent.java new file mode 100644 index 00000000..e1425e96 --- /dev/null +++ b/src/main/java/com/eu/habbo/plugin/events/users/friends/UserRequestFriendshipEvent.java @@ -0,0 +1,31 @@ +package com.eu.habbo.plugin.events.users.friends; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.plugin.events.users.UserEvent; + +public class UserRequestFriendshipEvent extends UserEvent +{ + /** + * The Habbo name invited. + */ + public final String name; + + /** + * The Habbo invited. + */ + public final Habbo friend; + + /** + * Triggered when a Habbo requests friendship with another user. + * @param habbo The Habbo this event applies to. + * @param name The Habbo name invited. + * @param friend The Habbo invited. NULL when user is offline. + */ + public UserRequestFriendshipEvent(Habbo habbo, String name, Habbo friend) + { + super(habbo); + + this.name = name; + this.friend = friend; + } +} diff --git a/src/main/java/com/eu/habbo/threading/HabboExecutorService.java b/src/main/java/com/eu/habbo/threading/HabboExecutorService.java new file mode 100644 index 00000000..7e927fbb --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/HabboExecutorService.java @@ -0,0 +1,31 @@ +package com.eu.habbo.threading; + +import com.eu.habbo.Emulator; + +import java.io.IOException; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; + +public class HabboExecutorService extends ScheduledThreadPoolExecutor +{ + public HabboExecutorService(int corePoolSize, ThreadFactory threadFactory) + { + super(corePoolSize, threadFactory); + } + + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + + if (t != null && !(t instanceof IOException)) + { + try + { + Emulator.getLogging().logErrorLine(t); + } + catch (Exception e) + {} + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/RejectedExecutionHandlerImpl.java b/src/main/java/com/eu/habbo/threading/RejectedExecutionHandlerImpl.java new file mode 100644 index 00000000..22b9c39c --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/RejectedExecutionHandlerImpl.java @@ -0,0 +1,16 @@ +package com.eu.habbo.threading; + +import com.eu.habbo.Emulator; + +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler +{ + + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) + { + Emulator.getLogging().logErrorLine(r.toString() + " is rejected"); + } +} diff --git a/src/main/java/com/eu/habbo/threading/ThreadPooling.java b/src/main/java/com/eu/habbo/threading/ThreadPooling.java new file mode 100644 index 00000000..3ef518e1 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/ThreadPooling.java @@ -0,0 +1,87 @@ +package com.eu.habbo.threading; + +import com.eu.habbo.Emulator; +import io.netty.util.concurrent.DefaultThreadFactory; + +import java.util.concurrent.*; + +public class ThreadPooling +{ + public final int threads; + private final ScheduledExecutorService scheduledPool; + private volatile boolean canAdd; + + public ThreadPooling(Integer threads) + { + this.threads = threads; + this.scheduledPool = new HabboExecutorService(this.threads, new DefaultThreadFactory("ArcturusThreadFactory")); + this.canAdd = true; + Emulator.getLogging().logStart("Thread Pool -> Loaded!"); + } + + public ScheduledFuture run(Runnable run) + { + try + { + if (this.canAdd) + { + return this.run(run, 0); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return null; + } + + public ScheduledFuture run(Runnable run, long delay) + { + try + { + if (this.canAdd) + { + return this.scheduledPool.schedule(new Runnable() + { + @Override + public void run() + { + try + { + run.run(); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } + }, delay, TimeUnit.MILLISECONDS); + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + + return null; + } + + public void shutDown() + { + this.canAdd = false; + + this.scheduledPool.shutdownNow(); + while(!this.scheduledPool.isTerminated()) { + } + + Emulator.getLogging().logShutdownLine("Threading -> Disposed!"); + } + + public ScheduledExecutorService getService() + { + return this.scheduledPool; + } + + +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/AchievementUpdater.java b/src/main/java/com/eu/habbo/threading/runnables/AchievementUpdater.java new file mode 100644 index 00000000..afef3f9a --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/AchievementUpdater.java @@ -0,0 +1,42 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.Achievement; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.users.Habbo; +import gnu.trove.iterator.TIntObjectIterator; + +import java.util.Map; + +public class AchievementUpdater implements Runnable +{ + public static int INTERVAL = 5 * 60; + public int lastExecutionTimestamp = Emulator.getIntUnixTimestamp(); + @Override + public void run() + { + if (!Emulator.isShuttingDown) + { + Emulator.getThreading().run(this, INTERVAL * 1000); + } + + if (Emulator.isReady) + { + Achievement onlineTime = Emulator.getGameEnvironment().getAchievementManager().getAchievement("AllTimeHotelPresence"); + + int timestamp = Emulator.getIntUnixTimestamp(); + for (Map.Entry set : Emulator.getGameEnvironment().getHabboManager().getOnlineHabbos().entrySet()) + { + int timeOnlineSinceLastInterval = INTERVAL; + Habbo habbo = set.getValue(); + if (habbo.getHabboInfo().getLastOnline() > this.lastExecutionTimestamp) + { + timeOnlineSinceLastInterval = timestamp - habbo.getHabboInfo().getLastOnline(); + } + AchievementManager.progressAchievement(habbo, onlineTime, (int) Math.floor((timeOnlineSinceLastInterval) / 60)); + } + + this.lastExecutionTimestamp = timestamp; + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/BackgroundAnimation.java b/src/main/java/com/eu/habbo/threading/runnables/BackgroundAnimation.java new file mode 100644 index 00000000..dc9e7d31 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/BackgroundAnimation.java @@ -0,0 +1,37 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class BackgroundAnimation implements Runnable +{ + private int length = 1000; + private int state = 0; + private final HabboItem toner; + private final Room room; + + public BackgroundAnimation(HabboItem toner, Room room) + { + this.toner = toner; + this.room = room; + } + + @Override + public void run() + { + if(room.isLoaded() && !room.isPreLoaded()) + { + this.toner.setExtradata("1:" + state + ":126:126"); + this.state = (this.state + 1) % 256; + this.room.updateItem(this.toner); + + if (this.toner.getRoomId() > 0 && this.length > 0) + { + Emulator.getThreading().run(this, 500); + this.length--; + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/BanzaiRandomTeleport.java b/src/main/java/com/eu/habbo/threading/runnables/BanzaiRandomTeleport.java new file mode 100644 index 00000000..833cc90d --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/BanzaiRandomTeleport.java @@ -0,0 +1,33 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class BanzaiRandomTeleport implements Runnable +{ + private HabboItem item; + private HabboItem toItem; + private Habbo habbo; + private Room room; + + public BanzaiRandomTeleport(HabboItem item, HabboItem toItem, Habbo habbo, Room room) + { + this.item = item; + this.toItem = toItem; + this.habbo = habbo; + this.room = room; + } + + @Override + public void run() + { + this.habbo.getRoomUnit().setCanWalk(true); + this.item.setExtradata("0"); + this.toItem.setExtradata("0"); + this.room.updateItem(this.item); + this.room.updateItem(this.toItem); + this.room.teleportHabboToItem(this.habbo, this.toItem); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/BattleBanzaiTilesFlicker.java b/src/main/java/com/eu/habbo/threading/runnables/BattleBanzaiTilesFlicker.java new file mode 100644 index 00000000..5cd83041 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/BattleBanzaiTilesFlicker.java @@ -0,0 +1,63 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.GameTeamColors; +import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.InteractionBattleBanzaiSphere; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.set.hash.THashSet; + +public class BattleBanzaiTilesFlicker implements Runnable +{ + private THashSet items; + private GameTeamColors color; + private Room room; + + private boolean on = false; + private int count = 0; + + public BattleBanzaiTilesFlicker(THashSet items, GameTeamColors color, Room room) + { + this.items = items; + this.color = color; + this.room = room; + } + + @Override + public void run() + { + if(this.items == null || this.room == null) + return; + + int state = 0; + if(on) + { + state = (color.type * 3) + 5; + on = false; + } + else + { + on = true; + } + + for(HabboItem item : this.items) + { + item.setExtradata(state + ""); + this.room.updateItem(item); + } + + if(this.count == 5) + { + for(HabboItem item : this.room.getRoomSpecialTypes().getItemsOfType(InteractionBattleBanzaiSphere.class)) + { + item.setExtradata("0"); + this.room.updateItem(item); + } + return; + } + + this.count++; + + Emulator.getThreading().run(this, 500); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java b/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java new file mode 100644 index 00000000..6c9fdb38 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java @@ -0,0 +1,55 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; + +public class BotFollowHabbo implements Runnable +{ + private Bot bot; + private Habbo habbo; + private Room room; + + public BotFollowHabbo(Bot bot, Habbo habbo, Room room) + { + this.bot = bot; + this.habbo = habbo; + this.room = room; + } + + @Override + public void run() + { + if (this.bot != null) + { + if (this.habbo != null && this.bot.getFollowingHabboId() == this.habbo.getHabboInfo().getId()) + { + if(this.habbo.getHabboInfo().getCurrentRoom() != null && this.habbo.getHabboInfo().getCurrentRoom() == this.room) + { + if (this.habbo.getRoomUnit() != null) + { + if (this.bot.getRoomUnit() != null) + { + RoomTile target = this.room.getLayout().getTileInFront(this.habbo.getRoomUnit().getCurrentLocation(), Math.abs((this.habbo.getRoomUnit().getBodyRotation().getValue() + 4)) % 8); + + if (target != null) + { + if (target.x < 0 || target.y < 0) + target = this.room.getLayout().getTileInFront(this.habbo.getRoomUnit().getCurrentLocation(), this.habbo.getRoomUnit().getBodyRotation().getValue()); + + if (target.x >= 0 && target.y >= 0) + { + this.bot.getRoomUnit().setGoalLocation(target); + this.bot.getRoomUnit().setCanWalk(true); + Emulator.getThreading().run(this, 500); + } + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/CameraClientAutoReconnect.java b/src/main/java/com/eu/habbo/threading/runnables/CameraClientAutoReconnect.java new file mode 100644 index 00000000..81e3db8a --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/CameraClientAutoReconnect.java @@ -0,0 +1,44 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.core.Logging; +import com.eu.habbo.networking.camera.CameraClient; + +public class CameraClientAutoReconnect implements Runnable +{ + @Override + public void run() + { + if (CameraClient.attemptReconnect && !Emulator.isShuttingDown) + { + if (!(CameraClient.channelFuture != null && CameraClient.channelFuture.channel().isRegistered())) + { + System.out.println("[" + Logging.ANSI_YELLOW + "CAMERA" + Logging.ANSI_RESET + "] Attempting to connect to the Camera server."); + if (Emulator.getCameraClient() != null) + { + Emulator.getCameraClient().disconnect(); + } + else + { + Emulator.setCameraClient(new CameraClient()); + } + + try + { + Emulator.getCameraClient().connect(); + } + catch (Exception e) + { + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Failed to start the camera client."); + } + } + else + { + CameraClient.attemptReconnect = false; + System.out.println("[" + Logging.ANSI_RED + "CAMERA" + Logging.ANSI_RESET + "] Already connected to the camera. Reconnecting not needed!"); + } + } + + Emulator.getThreading().run(this, 5000); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/threading/runnables/CannonKickAction.java b/src/main/java/com/eu/habbo/threading/runnables/CannonKickAction.java new file mode 100644 index 00000000..6500173c --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/CannonKickAction.java @@ -0,0 +1,49 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionCannon; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import gnu.trove.map.hash.THashMap; + +import java.util.List; + +public class CannonKickAction implements Runnable +{ + private final InteractionCannon cannon; + private final Room room; + + public CannonKickAction(InteractionCannon cannon, Room room) + { + this.cannon = cannon; + this.room = room; + } + + @Override + public void run() + { + THashMap dater = new THashMap(); + dater.put("title", "${notification.room.kick.cannonball.title}"); + dater.put("message", "${notification.room.kick.cannonball.message}"); + + ServerMessage message = new BubbleAlertComposer("cannon.png", dater).compose(); + + int rotation = this.cannon.getRotation(); + List tiles = this.room.getLayout().getTilesInFront(this.room.getLayout().getTile(this.cannon.getX(), this.cannon.getY()), rotation + 6, 3); + + for(RoomTile t : tiles) + { + for(Habbo habbo : this.room.getHabbosAt(t.x, t.y)) + { + if(!habbo.hasPermission("acc_unkickable") && !this.room.isOwner(habbo)) + { + Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, this.room); + habbo.getClient().sendResponse(message); //kicked composer + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/CannonResetCooldownAction.java b/src/main/java/com/eu/habbo/threading/runnables/CannonResetCooldownAction.java new file mode 100644 index 00000000..59ca5d8c --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/CannonResetCooldownAction.java @@ -0,0 +1,22 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.items.interactions.InteractionCannon; + +public class CannonResetCooldownAction implements Runnable +{ + private final InteractionCannon cannon; + + public CannonResetCooldownAction(InteractionCannon cannon) + { + this.cannon = cannon; + } + + @Override + public void run() + { + if(this.cannon != null) + { + this.cannon.cooldown = false; + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/ChannelReadHandler.java b/src/main/java/com/eu/habbo/threading/runnables/ChannelReadHandler.java new file mode 100644 index 00000000..aa1f25ad --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/ChannelReadHandler.java @@ -0,0 +1,31 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClientManager; +import com.eu.habbo.messages.ClientMessage; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; + +public class ChannelReadHandler implements Runnable +{ + private final ChannelHandlerContext ctx; + private final Object msg; + + public ChannelReadHandler(ChannelHandlerContext ctx, Object msg) + { + this.ctx = ctx; + this.msg = msg; + } + + public void run() + { + ByteBuf m = (ByteBuf) msg; + int length = m.readInt(); + short header = m.readShort(); + ByteBuf body = Unpooled.wrappedBuffer(m.readBytes(m.readableBytes())); + Emulator.getGameServer().getPacketManager().handlePacket(ctx.attr(GameClientManager.CLIENT).get(), new ClientMessage(header, body)); + body.release(); + m.release(); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java b/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java new file mode 100644 index 00000000..2f0877a7 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java @@ -0,0 +1,57 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionRentableSpace; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import gnu.trove.set.hash.THashSet; + +public class ClearRentedSpace implements Runnable +{ + private InteractionRentableSpace item; + private Room room; + + public ClearRentedSpace(InteractionRentableSpace item, Room room) + { + this.item = item; + this.room = room; + } + + @Override + public void run() + { + THashSet items = new THashSet(); + + for(RoomTile t : this.room.getLayout().getTilesAt(this.room.getLayout().getTile(this.item.getX(), this.item.getY()), this.item.getBaseItem().getWidth(), this.item.getBaseItem().getLength(), this.item.getRotation())) + { + for(HabboItem i : this.room.getItemsAt(t)) + { + if(i.getUserId() == this.item.getRenterId()) + { + items.add(i); + i.setRoomId(0); + i.needsUpdate(true); + } + } + } + + Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.item.getRenterId()); + + if(owner != null) + { + owner.getClient().sendResponse(new AddHabboItemComposer(items)); + owner.getHabboStats().rentedItemId = 0; + owner.getHabboStats().rentedTimeEnd = 0; + } + else + { + for(HabboItem i : items) + { + i.run(); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/CloseGate.java b/src/main/java/com/eu/habbo/threading/runnables/CloseGate.java new file mode 100644 index 00000000..17fcece2 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/CloseGate.java @@ -0,0 +1,36 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.items.interactions.InteractionGate; +import com.eu.habbo.habbohotel.items.interactions.InteractionGuildGate; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class CloseGate implements Runnable +{ + private final HabboItem guildGate; + private final Room room; + + public CloseGate(HabboItem guildGate, Room room) + { + this.guildGate = guildGate; + this.room = room; + } + + @Override + public void run() + { + if(this.guildGate.getRoomId() == this.room.getId()) + { + if(this.room.isLoaded()) + { + if(this.room.getHabbosAt(this.guildGate.getX(), this.guildGate.getY()).isEmpty()) + { + this.guildGate.setExtradata("0"); + this.room.updateItem(this.guildGate); + this.guildGate.needsUpdate(true); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java b/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java new file mode 100644 index 00000000..e4db20a6 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java @@ -0,0 +1,44 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.AddFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; + +public class CrackableExplode implements Runnable +{ + private final Room room; + private final HabboItem habboItem; + + public CrackableExplode(Room room, HabboItem item) + { + this.room = room; + this.habboItem = item; + } + + @Override + public void run() + { + if (habboItem.getRoomId() == 0) + { + return; + } + + this.room.removeHabboItem(this.habboItem); + this.room.sendComposer(new RemoveFloorItemComposer(this.habboItem).compose()); + this.habboItem.setRoomId(0); + Emulator.getGameEnvironment().getItemManager().deleteItem(this.habboItem); + HabboItem newItem = Emulator.getGameEnvironment().getItemManager().createItem(this.habboItem.getUserId(), Emulator.getGameEnvironment().getItemManager().getCrackableReward(this.habboItem.getBaseItem().getId()), 0, 0, ""); + + if (newItem != null) + { + newItem.setX(this.habboItem.getX()); + newItem.setY(this.habboItem.getY()); + newItem.setZ(this.habboItem.getZ()); + this.room.addHabboItem(newItem); + this.room.sendComposer(new AddFloorItemComposer(newItem, this.room.getFurniOwnerNames().get(newItem.getUserId())).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/GameStop.java b/src/main/java/com/eu/habbo/threading/runnables/GameStop.java new file mode 100644 index 00000000..38ce07ff --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/GameStop.java @@ -0,0 +1,19 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.games.Game; + +public class GameStop implements Runnable +{ + private Game game; + + public GameStop(Game game) + { + this.game = game; + } + + @Override + public void run() + { + this.game.stop(); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/GuardianNotAccepted.java b/src/main/java/com/eu/habbo/threading/runnables/GuardianNotAccepted.java new file mode 100644 index 00000000..caf3546d --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/GuardianNotAccepted.java @@ -0,0 +1,33 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; +import com.eu.habbo.habbohotel.guides.GuardianVote; +import com.eu.habbo.habbohotel.guides.GuardianVoteType; +import com.eu.habbo.habbohotel.users.Habbo; + +public class GuardianNotAccepted implements Runnable +{ + private final GuardianTicket ticket; + private final Habbo habbo; + + public GuardianNotAccepted(GuardianTicket ticket, Habbo habbo) + { + this.ticket = ticket; + this.habbo = habbo; + } + + @Override + public void run() + { + GuardianVote vote = this.ticket.getVoteForGuardian(this.habbo); + + if(vote != null) + { + if(vote.type == GuardianVoteType.SEARCHING) + { + Emulator.getGameEnvironment().getGuideManager().acceptTicket(this.habbo, false); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/GuardianTicketFindMoreSlaves.java b/src/main/java/com/eu/habbo/threading/runnables/GuardianTicketFindMoreSlaves.java new file mode 100644 index 00000000..14fd1f32 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/GuardianTicketFindMoreSlaves.java @@ -0,0 +1,20 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuardianTicket; + +public class GuardianTicketFindMoreSlaves implements Runnable +{ + private final GuardianTicket ticket; + + public GuardianTicketFindMoreSlaves(GuardianTicket ticket) + { + this.ticket = ticket; + } + + @Override + public void run() + { + Emulator.getGameEnvironment().getGuideManager().findGuardians(ticket); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/GuardianVotingFinish.java b/src/main/java/com/eu/habbo/threading/runnables/GuardianVotingFinish.java new file mode 100644 index 00000000..216ea887 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/GuardianVotingFinish.java @@ -0,0 +1,27 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.guides.GuardianTicket; + +public class GuardianVotingFinish implements Runnable +{ + private final GuardianTicket ticket; + private int checkSum = 0; + + public GuardianVotingFinish(GuardianTicket ticket) + { + this.ticket = ticket; + this.checkSum = this.ticket.getCheckSum(); + } + + @Override + public void run() + { + if(!this.ticket.isFinished()) + { + if(this.ticket.getCheckSum() == this.checkSum) + { + this.ticket.finish(); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/GuideFindNewHelper.java b/src/main/java/com/eu/habbo/threading/runnables/GuideFindNewHelper.java new file mode 100644 index 00000000..8770f96c --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/GuideFindNewHelper.java @@ -0,0 +1,34 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guides.GuideTour; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.guides.GuideSessionDetachedComposer; + +public class GuideFindNewHelper implements Runnable +{ + private final GuideTour tour; + private final Habbo helper; + private final int checkSum; + + public GuideFindNewHelper(GuideTour tour, Habbo helper) + { + this.tour = tour; + this.helper = helper; + this.checkSum = tour.checkSum; + } + + @Override + public void run() + { + if(!this.tour.isEnded() && this.tour.checkSum == this.checkSum && this.tour.getHelper() == null) + { + if(this.helper != null && this.helper.getClient() != null) + { + this.helper.getClient().sendResponse(new GuideSessionDetachedComposer()); + } + + Emulator.getGameEnvironment().getGuideManager().findHelper(this.tour); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/threading/runnables/HabboGiveHandItemToHabbo.java b/src/main/java/com/eu/habbo/threading/runnables/HabboGiveHandItemToHabbo.java new file mode 100644 index 00000000..efd98d10 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/HabboGiveHandItemToHabbo.java @@ -0,0 +1,38 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserHandItemComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserReceivedHandItemComposer; + +public class HabboGiveHandItemToHabbo implements Runnable +{ + private Habbo target; + private Habbo from; + + public HabboGiveHandItemToHabbo(Habbo from, Habbo target) + { + this.target = target; + this.from = from; + } + + @Override + public void run() + { + if(this.from.getHabboInfo().getCurrentRoom() == null || this.target.getHabboInfo().getCurrentRoom() == null) + return; + + if(this.from.getHabboInfo().getCurrentRoom() != this.target.getHabboInfo().getCurrentRoom()) + return; + + int itemId = this.from.getRoomUnit().getHandItem(); + + if(itemId > 0) + { + this.from.getRoomUnit().setHandItem(0); + this.from.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserHandItemComposer(this.from.getRoomUnit()).compose()); + this.target.getClient().sendResponse(new RoomUserReceivedHandItemComposer(this.from.getRoomUnit(), itemId)); + this.target.getRoomUnit().setHandItem(itemId); + this.target.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserHandItemComposer(this.target.getRoomUnit()).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/HabboItemNewState.java b/src/main/java/com/eu/habbo/threading/runnables/HabboItemNewState.java new file mode 100644 index 00000000..5c7a90e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/HabboItemNewState.java @@ -0,0 +1,30 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +public class HabboItemNewState implements Runnable +{ + private final HabboItem item; + private final Room room; + private final String state; + + public HabboItemNewState(HabboItem item, Room room, String state) + { + this.item = item; + this.room = room; + this.state = state; + } + + @Override + public void run() + { + this.item.setExtradata(this.state); + + if(this.item.getRoomId() == this.room.getId()) + { + this.room.updateItemState(this.item); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/InsertModToolIssue.java b/src/main/java/com/eu/habbo/threading/runnables/InsertModToolIssue.java new file mode 100644 index 00000000..95ca6e99 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/InsertModToolIssue.java @@ -0,0 +1,46 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; + +import java.sql.*; + +public class InsertModToolIssue implements Runnable +{ + private final ModToolIssue issue; + + public InsertModToolIssue(ModToolIssue issue) + { + this.issue = issue; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO support_tickets (state, timestamp, score, sender_id, reported_id, room_id, mod_id, issue, category) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS)) + { + statement.setInt(1, this.issue.state.getState()); + statement.setInt(2, this.issue.timestamp); + statement.setInt(3, this.issue.priority); + statement.setInt(4, this.issue.senderId); + statement.setInt(5, this.issue.reportedId); + statement.setInt(6, this.issue.roomId); + statement.setInt(7, this.issue.modId); + statement.setString(8, this.issue.message); + statement.setInt(9, this.issue.category); + statement.execute(); + + try (ResultSet key = statement.getGeneratedKeys()) + { + if (key.first()) + { + this.issue.id = key.getInt(1); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/KickBallAction.java b/src/main/java/com/eu/habbo/threading/runnables/KickBallAction.java new file mode 100644 index 00000000..3161e5c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/KickBallAction.java @@ -0,0 +1,83 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionPushable; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; + +public class KickBallAction implements Runnable +{ + private final InteractionPushable ball; //The item which is moving + private final Room room; //The room that the item belongs to + private final RoomUnit kicker; //The Habbo which initiated the move of the item + private RoomUserRotation currentDirection; //The current direction the item is moving in + private final int totalSteps; //The total number of steps in the move sequence + private int currentStep; //The current step of the move sequence + public boolean dead = false; //When true the run() function will not execute. Used when another user kicks the ball whilst it is arleady moving. + + public KickBallAction(InteractionPushable ball, Room room, RoomUnit kicker, RoomUserRotation direction, int steps) + { + this.ball = ball; + this.room = room; + this.kicker = kicker; + this.currentDirection = direction; + this.totalSteps = steps; + this.currentStep = 0; + } + + @Override + public void run() + { + if(this.dead || !this.room.isLoaded()) + return; + + if(this.currentStep < this.totalSteps) + { + RoomTile next = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(this.ball.getX(), this.ball.getY()), this.currentDirection.getValue()); + if (next != null && !this.ball.validMove(this.room, this.room.getLayout().getTile(this.ball.getX(), this.ball.getY()), next)) + { + RoomUserRotation oldDirection = this.currentDirection; + this.currentDirection = this.ball.getBounceDirection(this.room, this.currentDirection); + if(this.currentDirection != oldDirection) + { + this.ball.onBounce(this.room, oldDirection, this.currentDirection, this.kicker); + } + else + { + this.currentStep = this.totalSteps; //End the move sequence, the ball can't bounce anywhere + } + run(); + } + else + { + //Move the ball & run again + this.currentStep++; + + int delay = this.ball.getNextRollDelay(this.currentStep, this.totalSteps); //Algorithm to work out the delay till next run + + if(this.ball.canStillMove(this.room, this.room.getLayout().getTile(this.ball.getX(), this.ball.getY()), next, this.currentDirection, this.kicker, delay, this.currentStep, this.totalSteps)) + { + this.ball.onMove(this.room, this.room.getLayout().getTile(this.ball.getX(), this.ball.getY()), next, this.currentDirection, this.kicker, delay, this.currentStep, this.totalSteps); + + this.room.sendComposer(new FloorItemOnRollerComposer(this.ball, null, next, this.ball.getZ() - this.room.getStackHeight(next.x, next.y, false), this.room).compose()); + + Emulator.getThreading().run(this, (long)delay); + } + else + { + currentStep = totalSteps; //End the move sequence, the ball can't bounce anywhere + run(); + } + } + } + else + { + //We're done with the move sequence. Stop it the sequence & end the thread. + this.ball.onStop(room, this.kicker, this.currentStep, this.totalSteps); + dead = true; + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/LoadCustomHeightMap.java b/src/main/java/com/eu/habbo/threading/runnables/LoadCustomHeightMap.java new file mode 100644 index 00000000..51b6b6aa --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/LoadCustomHeightMap.java @@ -0,0 +1,20 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; + +public class LoadCustomHeightMap implements Runnable +{ + private final Room room; + + public LoadCustomHeightMap(Room room) + { + this.room = room; + } + + @Override + public void run() + { + this.room.setLayout(Emulator.getGameEnvironment().getRoomManager().loadCustomLayout(this.room)); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java b/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java new file mode 100644 index 00000000..e7d99bf3 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java @@ -0,0 +1,59 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +public class OneWayGateActionOne implements Runnable +{ + private HabboItem oneWayGate; + private Room room; + private GameClient client; + + public OneWayGateActionOne(GameClient client, Room room, HabboItem item) + { + this.oneWayGate = item; + this.room = room; + this.client = client; + } + + @Override + public void run() + { + this.room.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + + RoomTile t = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(this.oneWayGate.getX(), this.oneWayGate.getY()), (this.oneWayGate.getRotation() + 4) % 8); + + if(client.getHabbo().getRoomUnit().animateWalk) + { + client.getHabbo().getRoomUnit().animateWalk = false; + } + + if (t.isWalkable()) + { + if (this.room.tileWalkable(t) && this.client.getHabbo().getRoomUnit().getX() == this.oneWayGate.getX() && this.client.getHabbo().getRoomUnit().getY() == this.oneWayGate.getY()) + { + this.client.getHabbo().getRoomUnit().setGoalLocation(t); + + if (!this.oneWayGate.getExtradata().equals("0")) + { + Emulator.getThreading().run(new HabboItemNewState(this.oneWayGate, this.room, "0"), 1000); + } + } + //else if (this.client.getHabbo().getRoomUnit().getX() == this.oneWayGate.getX() && this.client.getHabbo().getRoomUnit().getY() == this.oneWayGate.getY()) + //{ + // room.scheduledTasks.add(this); + //} + else + { + if (!this.oneWayGate.getExtradata().equals("0")) + { + Emulator.getThreading().run(new HabboItemNewState(this.oneWayGate, this.room, "0"), 1000); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionTwo.java b/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionTwo.java new file mode 100644 index 00000000..cbfe6587 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionTwo.java @@ -0,0 +1,25 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; + +class OneWayGateActionTwo implements Runnable +{ + private final HabboItem oneWayGate; + private final Room room; + private final GameClient client; + + public OneWayGateActionTwo(GameClient client, Room room, HabboItem item) + { + this.oneWayGate = item; + this.room = room; + this.client = client; + } + + @Override + public void run() + { + + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java b/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java new file mode 100644 index 00000000..ffd7381b --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java @@ -0,0 +1,67 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionGift; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.rooms.items.PresentItemOpenedComposer; + +public class OpenGift implements Runnable +{ + private final HabboItem item; + private final Habbo habbo; + private final Room room; + + public OpenGift(HabboItem item, Habbo habbo, Room room) + { + this.item = item; + this.habbo = habbo; + this.room = room; + } + + @Override + public void run() + { + try + { + HabboItem inside = null; + + for (HabboItem i : ((InteractionGift) item).items) + { + if(inside == null) + inside = i; + + i.setUserId(this.habbo.getHabboInfo().getId()); + i.needsUpdate(true); + i.run(); + } + + this.habbo.getInventory().getItemsComponent().addItems(((InteractionGift) this.item).items); + + RoomTile tile = this.room.getLayout().getTile(this.item.getX(), this.item.getY()); + if (tile != null) + { + this.room.updateTile(tile); + } + this.habbo.getClient().sendResponse(new AddHabboItemComposer(((InteractionGift) this.item).items)); + this.habbo.getClient().sendResponse(new InventoryRefreshComposer()); + + + Emulator.getThreading().run(new QueryDeleteHabboItem(this.item)); + Emulator.getThreading().run(new RemoveFloorItemTask(this.room, this.item), item.getBaseItem().getName().contains("present_wrap") ? 5000 : 0); + + if (inside != null) + { + this.habbo.getClient().sendResponse(new PresentItemOpenedComposer(inside, "", false)); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/PetClearPosture.java b/src/main/java/com/eu/habbo/threading/runnables/PetClearPosture.java new file mode 100644 index 00000000..fe19cbb9 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/PetClearPosture.java @@ -0,0 +1,42 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; + +public class PetClearPosture implements Runnable +{ + private final Pet pet; + private final String key; + private final PetTasks newTask; + private final boolean clearTask; + + public PetClearPosture(Pet pet, String key, PetTasks newTask, boolean clearTask) + { + this.pet = pet; + this.key = key; + this.newTask = newTask; + this.clearTask = clearTask; + } + + @Override + public void run() + { + if(this.pet != null) + { + if(this.pet.getRoom() != null) + { + if(this.pet.getRoomUnit() != null) + { + this.pet.getRoomUnit().getStatus().remove(key); + + if(this.pet instanceof Pet) + if(this.clearTask) + pet.setTask(PetTasks.FREE); + else + if(this.newTask != null) + this.pet.setTask(this.newTask); + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java b/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java new file mode 100644 index 00000000..fc390299 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java @@ -0,0 +1,73 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; +import com.eu.habbo.habbohotel.pets.GnomePet; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +public class PetEatAction implements Runnable +{ + private final Pet pet; + private final InteractionPetFood food; + + public PetEatAction(Pet pet, InteractionPetFood food) + { + this.pet = pet; + this.food = food; + } + + @Override + public void run() + { + if(this.pet.getRoomUnit() != null && this.pet.getRoom() != null) + { + if (this.pet.levelHunger >= 20 && this.food != null && Integer.valueOf(this.food.getExtradata()) < this.food.getBaseItem().getStateCount()) + { + this.pet.addHunger(-20); + this.pet.setTask(PetTasks.EAT); + this.pet.getRoomUnit().setCanWalk(false); + + this.food.setExtradata(Integer.valueOf(this.food.getExtradata()) + 1 + ""); + this.pet.getRoom().updateItem(this.food); + + if (this.pet instanceof GnomePet) + { + if (this.pet.getPetData().getType() == 26) + { + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.pet.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GnomeFeedingFeeding"), 20); + } + else + { + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.pet.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("LeprechaunFeedingFeeding"), 20); + } + } + else + { + AchievementManager.progressAchievement(Emulator.getGameEnvironment().getHabboManager().getHabbo(this.pet.getUserId()), Emulator.getGameEnvironment().getAchievementManager().getAchievement("PetFeeding"), 20); + } + + Emulator.getThreading().run(this, 1000); + } else + { + if (this.food != null && Integer.valueOf(this.food.getExtradata()) == this.food.getBaseItem().getStateCount()) + { + Emulator.getThreading().run(new QueryDeleteHabboItem(this.food), 500); + if (this.pet.getRoom() != null) + { + this.pet.getRoom().removeHabboItem(this.food); + this.pet.getRoom().sendComposer(new RemoveFloorItemComposer(this.food, true).compose()); + } + } + + this.pet.setTask(PetTasks.FREE); + this.pet.getRoomUnit().getStatus().remove("eat"); + this.pet.getRoomUnit().setCanWalk(true); + this.pet.getRoom().sendComposer(new RoomUserStatusComposer(this.pet.getRoomUnit()).compose()); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java b/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java new file mode 100644 index 00000000..d5fe7c68 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java @@ -0,0 +1,62 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.Pet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; + +public class PetFollowHabbo implements Runnable +{ + private final int directionOffset; + private final Habbo habbo; + private final Pet pet; + + public PetFollowHabbo(Pet pet, Habbo habbo, int offset) + { + this.pet = pet; + this.habbo = habbo; + this.directionOffset = offset; + } + + @Override + public void run() + { + if (this.pet != null) + { + if (this.pet.getTask() != PetTasks.FOLLOW) + return; + + if (this.habbo != null) + { + if (this.habbo.getRoomUnit() != null) + { + if (this.pet.getRoomUnit() != null) + { + RoomTile target = this.habbo.getHabboInfo().getCurrentRoom().getLayout().getTileInFront(this.habbo.getRoomUnit().getCurrentLocation(), Math.abs((this.habbo.getRoomUnit().getBodyRotation().getValue() + directionOffset + 4) % 8)); + + if (target != null) + { + if (target.x < 0 || target.y < 0) + target = this.habbo.getHabboInfo().getCurrentRoom().getLayout().getTileInFront(this.habbo.getRoomUnit().getCurrentLocation(), this.habbo.getRoomUnit().getBodyRotation().getValue()); + + if (target.x >= 0 && target.y >= 0) + { + if (this.pet.getRoom().getLayout().tileWalkable(target.x, target.y)) + { + this.pet.getRoomUnit().setGoalLocation(target); + this.pet.getRoomUnit().setCanWalk(true); + if (this.pet instanceof Pet) + { + this.pet.setTask(PetTasks.FOLLOW); + } + } + } + Emulator.getThreading().run(this, 500); + } + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboBadge.java b/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboBadge.java new file mode 100644 index 00000000..59eeea1e --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboBadge.java @@ -0,0 +1,34 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +class QueryDeleteHabboBadge implements Runnable +{ + private final String name; + private final Habbo habbo; + + public QueryDeleteHabboBadge(Habbo habbo, String name) + { + this.name = name; + this.habbo = habbo; + } + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM user_badges WHERE users_id = ? AND badge_code = ?")) + { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + statement.setString(2, this.name); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItem.java b/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItem.java new file mode 100644 index 00000000..adb71990 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItem.java @@ -0,0 +1,32 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboItem; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class QueryDeleteHabboItem implements Runnable +{ + private final HabboItem item; + + public QueryDeleteHabboItem(HabboItem item) + { + this.item = item; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM items WHERE id = ?")) + { + statement.setInt(1, item.getId()); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItems.java b/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItems.java new file mode 100644 index 00000000..f00584a9 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/QueryDeleteHabboItems.java @@ -0,0 +1,43 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.map.TIntObjectMap; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class QueryDeleteHabboItems implements Runnable +{ + private TIntObjectMap items; + + public QueryDeleteHabboItems(TIntObjectMap items) + { + this.items = items; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM items WHERE id = ?")) + { + for (HabboItem item : items.valueCollection()) + { + if (item.getRoomId() > 0) + continue; + + statement.setInt(1, item.getId()); + statement.addBatch(); + } + + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + this.items.clear(); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RandomDiceNumber.java b/src/main/java/com/eu/habbo/threading/runnables/RandomDiceNumber.java new file mode 100644 index 00000000..006c1e65 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RandomDiceNumber.java @@ -0,0 +1,50 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionColorWheel; +import com.eu.habbo.habbohotel.items.interactions.InteractionDice; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.items.WallItemUpdateComposer; + +public class RandomDiceNumber implements Runnable +{ + private final HabboItem item; + private final Room room; + private final int maxNumber; + private int result; + + public RandomDiceNumber(HabboItem item, Room room, int maxNumber) + { + this.item = item; + this.room = room; + this.maxNumber = maxNumber; + this.result = -1; + } + + public RandomDiceNumber(Room room, HabboItem item, int result) + { + this.item = item; + this.room = room; + this.maxNumber = -1; + this.result = result; + } + + @Override + public void run() + { + if(result <= 0) + result = (Emulator.getRandom().nextInt(this.maxNumber) + 1); + + this.item.setExtradata(result + ""); + this.item.needsUpdate(true); + Emulator.getThreading().run(this.item); + + this.room.updateItem(this.item); + if(this.item instanceof InteractionColorWheel) + { + ((InteractionColorWheel)this.item).clearRunnable(); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RemoveFloorItemTask.java b/src/main/java/com/eu/habbo/threading/runnables/RemoveFloorItemTask.java new file mode 100644 index 00000000..628210f4 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RemoveFloorItemTask.java @@ -0,0 +1,26 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.UpdateStackHeightComposer; +import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; + +class RemoveFloorItemTask implements Runnable +{ + private final Room room; + private final HabboItem item; + + public RemoveFloorItemTask(Room room, HabboItem item) + { + this.room = room; + this.item = item; + } + + @Override + public void run() + { + this.room.removeHabboItem(this.item); + this.room.sendComposer(new RemoveFloorItemComposer(this.item, true).compose()); + this.room.sendComposer(new UpdateStackHeightComposer(this.item.getX(), this.item.getY(), this.room.getStackHeight(this.item.getX(), this.item.getY(), false)).compose()); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomTrashing.java b/src/main/java/com/eu/habbo/threading/runnables/RoomTrashing.java new file mode 100644 index 00000000..a4111a99 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomTrashing.java @@ -0,0 +1,173 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemOnRollerComposer; +import com.eu.habbo.plugin.EventHandler; +import com.eu.habbo.plugin.events.users.UserTakeStepEvent; +import gnu.trove.set.hash.THashSet; + +public class RoomTrashing implements Runnable +{ + public static RoomTrashing INSTANCE; + + private Habbo habbo; + private Room room; + + public RoomTrashing(Habbo habbo, Room room) + { + this.habbo = habbo; + this.room = room; + + RoomTrashing.INSTANCE = this; + } + + @Override + public void run() + { + + } + + @EventHandler + public static void onUserWalkEvent(UserTakeStepEvent event) + { + if(INSTANCE == null) + return; + + if(INSTANCE.habbo == null) + return; + + if(!INSTANCE.habbo.isOnline()) + INSTANCE.habbo = null; + + if(INSTANCE.habbo == event.habbo) + { + if(event.habbo.getHabboInfo().getCurrentRoom() != null) + { + if(event.habbo.getHabboInfo().getCurrentRoom().equals(INSTANCE.room)) + { + THashSet messages = new THashSet(); + + THashSet items = INSTANCE.room.getItemsAt(event.toLocation); + + int offset = Emulator.getRandom().nextInt(4) + 2; + + RoomTile t = null; + while(offset > 0) + { + t = INSTANCE.room.getLayout().getTileInFront(INSTANCE.room.getLayout().getTile((short) event.toLocation.x, (short) event.toLocation.y), event.habbo.getRoomUnit().getBodyRotation().getValue(), (short) offset); + + if(!INSTANCE.room.getLayout().tileWalkable(t.x, t.y)) + { + offset--; + } + else + { + break; + } + } + + for(HabboItem item : items) + { + double offsetZ = (INSTANCE.room.getTopHeightAt(t.x, t.y)) - item.getZ(); + + messages.add(new FloorItemOnRollerComposer(item, null, t, offsetZ, INSTANCE.room).compose()); + } + + + offset = Emulator.getRandom().nextInt(4) + 2; + + t = null; + while(offset > 0) + { + t = INSTANCE.room.getLayout().getTileInFront(INSTANCE.room.getLayout().getTile((short) event.toLocation.x, (short) event.toLocation.y), event.habbo.getRoomUnit().getBodyRotation().getValue() + 7, (short) offset); + + if(!INSTANCE.room.getLayout().tileWalkable(t.x, t.y)) + { + offset--; + } + else + { + break; + } + } + + RoomTile s = INSTANCE.room.getLayout().getTileInFront(INSTANCE.habbo.getRoomUnit().getCurrentLocation(), INSTANCE.habbo.getRoomUnit().getBodyRotation().getValue() + 7); + + if (s != null) + { + items = INSTANCE.room.getItemsAt(s); + } + + for(HabboItem item : items) + { + double offsetZ = (INSTANCE.room.getTopHeightAt(t.x, t.y)) - item.getZ(); + + messages.add(new FloorItemOnRollerComposer(item, null, t, offsetZ, INSTANCE.room).compose()); + } + + offset = Emulator.getRandom().nextInt(4) + 2; + + t = null; + while(offset > 0) + { + t = INSTANCE.getRoom().getLayout().getTileInFront(event.toLocation, event.habbo.getRoomUnit().getBodyRotation().getValue() + 1, (short) offset); + + if(!INSTANCE.room.getLayout().tileWalkable(t.x, t.y)) + { + offset--; + } + else + { + break; + } + } + + s = INSTANCE.getRoom().getLayout().getTileInFront(INSTANCE.habbo.getRoomUnit().getCurrentLocation(), INSTANCE.habbo.getRoomUnit().getBodyRotation().getValue() + 1); + items = INSTANCE.room.getItemsAt(s); + + for(HabboItem item : items) + { + double offsetZ = (INSTANCE.room.getTopHeightAt(t.x, t.y)) - item.getZ(); + + messages.add(new FloorItemOnRollerComposer(item, null, t, offsetZ, INSTANCE.room).compose()); + } + + for(ServerMessage message : messages) + { + INSTANCE.room.sendComposer(message); + } + } + else + { + INSTANCE.habbo = null; + INSTANCE.room = null; + } + } + } + } + + public Habbo getHabbo() + { + return this.habbo; + } + + public void setHabbo(Habbo habbo) + { + this.habbo = habbo; + } + + public Room getRoom() + { + return this.room; + } + + public void setRoom(Room room) + { + this.room = room; + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitGiveHanditem.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitGiveHanditem.java new file mode 100644 index 00000000..2481e973 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitGiveHanditem.java @@ -0,0 +1,30 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserHandItemComposer; + +public class RoomUnitGiveHanditem implements Runnable +{ + private final RoomUnit roomUnit; + private final Room room; + private final int itemId; + + public RoomUnitGiveHanditem(RoomUnit roomUnit, Room room, int itemId) + { + this.roomUnit = roomUnit; + this.room = room; + this.itemId = itemId; + } + + @Override + public void run() + { + if(room != null && this.roomUnit.isInRoom()) + { + this.roomUnit.setHandItem(this.itemId); + this.room.sendComposer(new RoomUserHandItemComposer(this.roomUnit).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitKick.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitKick.java new file mode 100644 index 00000000..fc86b9b5 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitKick.java @@ -0,0 +1,30 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; + +public class RoomUnitKick implements Runnable +{ + private final Habbo habbo; + private final Room room; + private final boolean removeEffect; + + public RoomUnitKick(Habbo habbo, Room room, boolean removeEffect) + { + this.habbo = habbo; + this.room = room; + this.removeEffect = removeEffect; + } + + @Override + public void run() + { + if(this.removeEffect) + { + this.habbo.getRoomUnit().setEffectId(0); + } + + Emulator.getGameEnvironment().getRoomManager().leaveRoom(this.habbo, this.room); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRideHorse.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRideHorse.java new file mode 100644 index 00000000..5cd0981c --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRideHorse.java @@ -0,0 +1,44 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.HorsePet; +import com.eu.habbo.habbohotel.pets.PetTasks; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; + +public class RoomUnitRideHorse implements Runnable +{ + private HorsePet pet; + private Habbo habbo; + private RoomTile goalTile; + + public RoomUnitRideHorse(HorsePet pet, Habbo habbo, RoomTile goalTile) + { + this.pet = pet; + this.habbo = habbo; + this.goalTile = goalTile; + } + + @Override + public void run() + { + if(!(this.habbo.getRoomUnit() != null && this.habbo.getHabboInfo().getCurrentRoom() == this.pet.getRoom() && this.habbo.getHabboInfo().getRiding() == null) && this.goalTile != null) + return; + + if(this.habbo.getHabboInfo().getCurrentRoom().getLayout().getTileInFront(this.habbo.getRoomUnit().getCurrentLocation(), this.habbo.getRoomUnit().getBodyRotation().getValue()).equals(this.goalTile)) + { + if(this.goalTile.x == this.pet.getRoomUnit().getX() && this.goalTile.y == this.pet.getRoomUnit().getY()) + { + this.habbo.getRoomUnit().setGoalLocation(this.pet.getRoomUnit().getCurrentLocation()); + this.habbo.getHabboInfo().getCurrentRoom().giveEffect(this.habbo, 77); + this.habbo.getHabboInfo().setRiding(this.pet); + this.pet.setRider(this.habbo); + this.pet.setTask(PetTasks.RIDE); + } + else + { + Emulator.getThreading().run(this, 500); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java new file mode 100644 index 00000000..236764b9 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java @@ -0,0 +1,38 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUnitOnRollerComposer; + +public class RoomUnitTeleport implements Runnable +{ + private RoomUnit roomUnit; + private Room room; + private int x; + private int y; + private double z; + + private int newEffect; + + public RoomUnitTeleport(RoomUnit roomUnit, Room room, int x, int y, double z, int newEffect) + { + this.roomUnit = roomUnit; + this.room = room; + this.x = x; + this.y = y; + this.z = z; + this.newEffect = newEffect; + } + + @Override + public void run() + { + RoomTile t = this.room.getLayout().getTile((short) x, (short) y); + this.roomUnit.setGoalLocation(t); + this.roomUnit.getStatus().remove("mv"); + this.room.sendComposer(new RoomUnitOnRollerComposer(this.roomUnit, null, t, this.room).compose()); + this.room.giveEffect(this.roomUnit, this.newEffect); + this.room.updateHabbosAt(t.x, t.y); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java new file mode 100644 index 00000000..36059244 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java @@ -0,0 +1,59 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class RoomUnitTeleportWalkToAction implements Runnable +{ + private final Habbo habbo; + private final HabboItem habboItem; + private final Room room; + + public RoomUnitTeleportWalkToAction(Habbo habbo, HabboItem habboItem, Room room) + { + this.habbo = habbo; + this.habboItem = habboItem; + this.room = room; + } + + @Override + public void run() + { + if(this.habbo.getHabboInfo().getCurrentRoom() == this.room) + { + if(this.habboItem.getRoomId() == this.room.getId()) + { + RoomTile tile = HabboItem.getSquareInFront(this.room.getLayout(), this.habboItem); + + if (tile != null) + { + if (this.habbo.getRoomUnit().getGoal().equals(tile)) + { + if (this.habbo.getRoomUnit().getCurrentLocation().equals(tile)) + { + try + { + this.habboItem.onClick(this.habbo.getClient(), this.room, new Object[]{0}); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + else + { + if (tile.isWalkable()) + { + this.habbo.getRoomUnit().setGoalLocation(tile); + Emulator.getThreading().run(this, this.habbo.getRoomUnit().getPath().size() + 2 * 510); + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java new file mode 100644 index 00000000..6e3d5431 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java @@ -0,0 +1,58 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; + +public class RoomUnitVendingMachineAction implements Runnable +{ + private final Habbo habbo; + private final HabboItem habboItem; + private final Room room; + + public RoomUnitVendingMachineAction(Habbo habbo, HabboItem habboItem, Room room) + { + this.habbo = habbo; + this.habboItem = habboItem; + this.room = room; + } + + @Override + public void run() + { + if(this.habbo.getHabboInfo().getCurrentRoom() == this.room) + { + if(this.habboItem.getRoomId() == this.room.getId()) + { + RoomTile tile = HabboItem.getSquareInFront(this.room.getLayout(), this.habboItem); + if (tile != null) + { + if (this.habbo.getRoomUnit().getGoal().equals(tile)) + { + if (this.habbo.getRoomUnit().getCurrentLocation().equals(tile)) + { + try + { + this.habboItem.onClick(this.habbo.getClient(), this.room, new Object[]{0}); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + else + { + if (this.room.getLayout().getTile(tile.x, tile.y).isWalkable()) + { + this.habbo.getRoomUnit().setGoalLocation(tile); + Emulator.getThreading().run(this, this.habbo.getRoomUnit().getPath().size() + 2 * 510); + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java new file mode 100644 index 00000000..6a45fb17 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java @@ -0,0 +1,103 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; + +import java.util.List; + +public class RoomUnitWalkToRoomUnit implements Runnable +{ + private RoomUnit walker; + private RoomUnit target; + private Room room; + private List targetReached; + private List failedReached; + + private RoomTile goalTile = null; + + public RoomUnitWalkToRoomUnit(RoomUnit walker, RoomUnit target, Room room, List targetReached, List failedReached) + { + this.walker = walker; + this.target = target; + this.room = room; + this.targetReached = targetReached; + this.failedReached = failedReached; + } + + @Override + public void run() + { + if(this.goalTile == null) + { + this.findNewLocation(); + Emulator.getThreading().run(this, 500); + } + else if(this.walker.getGoal().equals(this.goalTile)) //Check if the goal is still the same. Chances are something is running the same task. If so we dump this task. + { + //Check if arrived. + if(this.walker.getCurrentLocation().equals(this.goalTile)) + { + for(Runnable r : this.targetReached) + { + Emulator.getThreading().run(r); + + WiredHandler.handle(WiredTriggerType.BOT_REACHED_AVTR, this.target, this.room, new Object[]{this.walker}); + } + } + else + { + List tiles = room.getLayout().getTilesAround(this.target.getCurrentLocation()); + + for(RoomTile t : tiles) + { + if(t.equals(this.goalTile)) + { + Emulator.getThreading().run(this, 500); + return; + } + } + + this.findNewLocation(); + + Emulator.getThreading().run(this, 500); + } + } + } + + private void findNewLocation() + { + this.goalTile = this.room.getLayout().getTileInFront(this.target.getCurrentLocation(), this.target.getBodyRotation().getValue()); + + if (this.goalTile == null) + return; + + if (!this.room.tileWalkable(this.goalTile)) + { + List tiles = room.getLayout().getTilesAround(this.target.getCurrentLocation()); + + for (RoomTile t : tiles) + { + if (this.room.tileWalkable(t)) + { + this.goalTile = t; + + break; + } + } + } + + this.walker.setGoalLocation(this.goalTile); + + if(this.walker.getPath() == null) + { + for(Runnable r : this.failedReached) + { + Emulator.getThreading().run(r); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/SaveScoreForTeam.java b/src/main/java/com/eu/habbo/threading/runnables/SaveScoreForTeam.java new file mode 100644 index 00000000..a96abbc3 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/SaveScoreForTeam.java @@ -0,0 +1,47 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.Game; +import com.eu.habbo.habbohotel.games.GamePlayer; +import com.eu.habbo.habbohotel.games.GameTeam; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class SaveScoreForTeam implements Runnable +{ + public final GameTeam team; + public final Game game; + + public SaveScoreForTeam(GameTeam team, Game game) + { + this.team = team; + this.game = game; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_game_scores (room_id, game_start_timestamp, game_name, user_id, team_id, score, team_score) VALUES (?, ?, ?, ?, ?, ?, ?)")) + { + for(GamePlayer player : this.team.getMembers()) + { + statement.setInt(1, this.game.getRoom().getId()); + statement.setInt(2, this.game.getStartTime()); + statement.setString(3, this.game.getClass().getName()); + statement.setInt(4, player.getHabbo().getHabboInfo().getId()); + statement.setInt(5, player.getTeamColor().type); + statement.setInt(6, player.getScore()); + statement.setInt(7, this.team.getTeamScore()); + statement.addBatch(); + } + + statement.executeBatch(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/ShutdownEmulator.java b/src/main/java/com/eu/habbo/threading/runnables/ShutdownEmulator.java new file mode 100644 index 00000000..91b2520e --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/ShutdownEmulator.java @@ -0,0 +1,30 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.ServerMessage; + +public class ShutdownEmulator implements Runnable +{ + public static boolean instantiated = false; + public static int timestamp = 0; + + public ShutdownEmulator(ServerMessage message) + { + if (!instantiated) + { + instantiated = true; + + if (message != null) + { + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(message); + } + + Emulator.getConfig().update("hotel.trading.enabled", "0"); + } + } + @Override + public void run() + { + Emulator.getRuntime().exit(0); + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java b/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java new file mode 100644 index 00000000..dce6f5a7 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java @@ -0,0 +1,146 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUsersComposer; + +class TeleportInteraction extends Thread +{ + private int state; + private final Room room; + private Room targetRoom; + private final GameClient client; + private final HabboItem teleportOne; + private HabboItem teleportTwo; + + @Deprecated + public TeleportInteraction(Room room, GameClient client, HabboItem teleportOne) + { + this.room = room; + this.client = client; + this.teleportOne = teleportOne; + this.teleportTwo = null; + this.targetRoom = null; + this.state = 1; + } + + @Override + public void run() + { + try + { + if (state == 5) + { + this.teleportTwo.setExtradata("1"); + this.targetRoom.updateItem(this.teleportTwo); + this.room.updateItem(this.teleportOne); + RoomTile tile = HabboItem.getSquareInFront(this.room.getLayout(), this.teleportTwo); + if (tile != null) + { + this.client.getHabbo().getRoomUnit().setGoalLocation(tile); + } + Emulator.getThreading().run(this.teleportTwo, 500); + Emulator.getThreading().run(this.teleportOne, 500); + } else if (state == 4) + { + int[] data = Emulator.getGameEnvironment().getItemManager().getTargetTeleportRoomId(this.teleportOne); + if (data.length == 2 && data[0] != 0) + { + if (this.room.getId() == data[0]) + { + this.targetRoom = this.room; + this.teleportTwo = this.room.getHabboItem(data[1]); + + if (this.teleportTwo == null) + { + this.teleportTwo = this.teleportOne; + } + } else + { + this.targetRoom = Emulator.getGameEnvironment().getRoomManager().loadRoom(data[0]); + this.teleportTwo = this.targetRoom.getHabboItem(data[1]); + } + } else + { + this.targetRoom = this.room; + this.teleportTwo = this.teleportOne; + } + + this.teleportOne.setExtradata("2"); + this.teleportTwo.setExtradata("2"); + + if (this.room != this.targetRoom) + { + Emulator.getGameEnvironment().getRoomManager().logExit(this.client.getHabbo()); + this.room.removeHabbo(this.client.getHabbo()); + Emulator.getGameEnvironment().getRoomManager().enterRoom(this.client.getHabbo(), this.targetRoom); + } + + this.client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[this.teleportTwo.getRotation()]); + this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(this.teleportTwo.getX(), this.teleportTwo.getY())); + this.client.getHabbo().getRoomUnit().setZ(this.teleportTwo.getZ()); + + this.room.sendComposer(new RoomUserRemoveComposer(this.client.getHabbo().getRoomUnit()).compose()); + this.targetRoom.sendComposer(new RoomUserRemoveComposer(this.client.getHabbo().getRoomUnit()).compose()); + this.targetRoom.sendComposer(new RoomUsersComposer(this.client.getHabbo()).compose()); + this.targetRoom.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + this.targetRoom.sendComposer(new RoomUserEffectComposer(this.client.getHabbo().getRoomUnit()).compose()); + this.room.updateItem(this.teleportOne); + this.targetRoom.updateItem(this.teleportTwo); + + this.state = 5; + + Emulator.getThreading().run(this, 500); + } else if (state == 3) + { + this.teleportOne.setExtradata("0"); + this.room.updateItem(this.teleportOne); + this.state = 4; + Emulator.getThreading().run(this, 500); + } else if (state == 2) + { + this.client.getHabbo().getRoomUnit().setGoalLocation(this.room.getLayout().getTile(this.teleportOne.getX(), this.teleportOne.getY())); + this.client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[newRotation(this.teleportOne.getRotation())]); + this.client.getHabbo().getRoomUnit().getStatus().put("mv", this.teleportOne.getX() + "," + this.teleportOne.getY() + "," + this.teleportOne.getZ()); + //room.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit())); + + state = 3; + + Emulator.getThreading().run(this, 500); + } else if (state == 1) + { + RoomTile loc = HabboItem.getSquareInFront(this.room.getLayout(), this.teleportOne); + + if (this.client.getHabbo().getRoomUnit().getX() == loc.x && this.client.getHabbo().getRoomUnit().getY() == loc.y) + { + this.teleportOne.setExtradata("1"); + this.room.updateItem(this.teleportOne); + this.state = 2; + + Emulator.getThreading().run(this, 250); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + private int newRotation(int rotation) + { + if(rotation == 4) + return 0; + if(rotation == 6) + return 2; + else + return rotation + 4; + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/UpdateModToolIssue.java b/src/main/java/com/eu/habbo/threading/runnables/UpdateModToolIssue.java new file mode 100644 index 00000000..8498387e --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/UpdateModToolIssue.java @@ -0,0 +1,36 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.modtool.ModToolIssue; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class UpdateModToolIssue implements Runnable +{ + private final ModToolIssue issue; + + public UpdateModToolIssue(ModToolIssue issue) + { + this.issue = issue; + } + + @Override + public void run() + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE support_tickets SET state = ?, type = ?, mod_id = ?, category = ? WHERE id = ?")) + { + statement.setInt(1, this.issue.state.getState()); + statement.setInt(2, this.issue.type.getType()); + statement.setInt(3, this.issue.modId); + statement.setInt(4, this.issue.category); + statement.setInt(5, this.issue.id); + statement.execute(); + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/WiredExecuteTask.java b/src/main/java/com/eu/habbo/threading/runnables/WiredExecuteTask.java new file mode 100644 index 00000000..77a5695a --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/WiredExecuteTask.java @@ -0,0 +1,49 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredTrigger; +import com.eu.habbo.habbohotel.items.interactions.wired.triggers.WiredTriggerAtSetTime; +import com.eu.habbo.habbohotel.items.interactions.wired.triggers.WiredTriggerAtTimeLong; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.wired.WiredHandler; + +public class WiredExecuteTask implements Runnable +{ + private final InteractionWiredTrigger task; + private final Room room; + private int taskId; + + public WiredExecuteTask(InteractionWiredTrigger trigger, Room room) + { + this.task = trigger; + this.room = room; + + if(this.task instanceof WiredTriggerAtSetTime) + this.taskId = ((WiredTriggerAtSetTime) this.task).taskId; + + if(this.task instanceof WiredTriggerAtTimeLong) + this.taskId = ((WiredTriggerAtTimeLong) this.task).taskId; + } + + @Override + public void run() + { + if (!Emulator.isShuttingDown && Emulator.isReady) + { + if (this.room != null && this.room.getId() == this.task.getRoomId()) + { + if (this.task instanceof WiredTriggerAtSetTime) + { + if (((WiredTriggerAtSetTime) this.task).taskId != taskId) + return; + } + if (this.task instanceof WiredTriggerAtTimeLong) + { + if (((WiredTriggerAtTimeLong) this.task).taskId != taskId) + return; + } + WiredHandler.handle(this.task, null, this.room, null); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/WiredRepeatEffectTask.java b/src/main/java/com/eu/habbo/threading/runnables/WiredRepeatEffectTask.java new file mode 100644 index 00000000..16d7119a --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/WiredRepeatEffectTask.java @@ -0,0 +1,33 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.InteractionWiredEffect; +import com.eu.habbo.habbohotel.rooms.Room; + +class WiredRepeatEffectTask implements Runnable +{ + private final InteractionWiredEffect effect; + private final Room room; + private final int delay; + + public WiredRepeatEffectTask(InteractionWiredEffect effect, Room room, int delay) + { + this.effect = effect; + this.room = room; + this.delay = delay; + } + + @Override + public void run() + { + if (!Emulator.isShuttingDown && Emulator.isReady) + { + if (this.room != null && this.room.getId() == this.effect.getRoomId()) + { + this.effect.execute(null, this.room, null); + + Emulator.getThreading().run(this, this.delay); + } + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/WiredResetTimers.java b/src/main/java/com/eu/habbo/threading/runnables/WiredResetTimers.java new file mode 100644 index 00000000..fe9de6f8 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/WiredResetTimers.java @@ -0,0 +1,24 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.wired.WiredHandler; + +public class WiredResetTimers implements Runnable +{ + private Room room; + + public WiredResetTimers(Room room) + { + this.room = room; + } + + @Override + public void run() + { + if (!Emulator.isShuttingDown && Emulator.isReady) + { + WiredHandler.resetTimers(this.room); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/YouAreAPirate.java b/src/main/java/com/eu/habbo/threading/runnables/YouAreAPirate.java new file mode 100644 index 00000000..0cd3bbab --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/YouAreAPirate.java @@ -0,0 +1,108 @@ +package com.eu.habbo.threading.runnables; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomChatType; +import com.eu.habbo.habbohotel.users.Habbo; + +public class YouAreAPirate implements Runnable +{ + public static String[] iamapirate = new String[]{ + "Do what you want, 'cause a pirate is free,", + "You are a pirate!", + "", + "Yar har, fiddle di dee,", + "Being a pirate is all right with me,", + "Do what you want 'cause a pirate is free, ", + "You are a pirate!", + "Yo Ho, ahoy and avast,", + "Being a pirate is really badass!", + "Hang the black flag at the end of the mast!", + "You are a pirate!", + "", + "You are a pirate! - Yay!", + "", + "We've got us a map, (a map! )", + "To lead us to a hidden box,", + "That's all locked up with locks! (with locks! )", + "And buried deep away!", + "", + "We'll dig up the box, (the box! )", + "We know it's full of precious booty! ", + "Burst open the locks!", + "And then we'll say hooray! ", + "", + "Yar har, fiddle di dee,", + "Being a pirate is all right with me!", + "Do what you want 'cause a pirate is free, ", + "", + "You are a pirate!", + "Yo Ho, ahoy and avast,", + "Being a Pirate is really badass!", + "Hang the black flag", + "At the end of the mast!", + "You are a pirate!", + "", + "Hahaha!", + "", + "", + "We're sailing away (set sail! ), ", + "Adventure awaits on every shore!", + "We set sail and explore (ya-har! )", + "And run and jump all day (Yay! )", + "We float on our boat (the boat! )", + "Until it's time to drop the anchor, ", + "Then hang up our coats (aye-aye! )", + "Until we sail again!", + "", + "Yar har, fiddle di dee,", + "Being a pirate is all right with me!", + "Do what you want 'cause a pirate is free, ", + "You are a pirate!", + "", + "Yar har, wind at your back, lads,", + "Wherever you go!", + "", + "", + "Blue sky above and blue ocean below,", + "You are a pirate!", + "", + "You are a pirate!" + }; + + public final Habbo habbo; + public final Room room; + + private int index = 0; + private int oldEffect; + public YouAreAPirate(Habbo habbo, Room room) + { + this.habbo = habbo; + this.room = room; + this.oldEffect = this.habbo.getRoomUnit().getEffectId(); + this.room.giveEffect(this.habbo, 161); + } + + @Override + public void run() + { + if(this.room == this.habbo.getHabboInfo().getCurrentRoom()) + { + if(!iamapirate[index].isEmpty()) + { + this.room.talk(this.habbo, new RoomChatMessage(iamapirate[index], this.habbo, RoomChatMessageBubbles.PIRATE), RoomChatType.SHOUT); + } + this.index++; + + if(this.index == iamapirate.length) + { + this.room.giveEffect(this.habbo, this.oldEffect); + return; + } + + Emulator.getThreading().run(this, iamapirate[index-1].length() * 100); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeClearEffects.java b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeClearEffects.java new file mode 100644 index 00000000..14af5ccc --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeClearEffects.java @@ -0,0 +1,25 @@ +package com.eu.habbo.threading.runnables.freeze; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserEffectComposer; + +public class FreezeClearEffects implements Runnable +{ + private final Habbo habbo; + + public FreezeClearEffects(Habbo habbo) + { + this.habbo = habbo; + } + + @Override + public void run() + { + this.habbo.getRoomUnit().setEffectId(0); + this.habbo.getRoomUnit().setCanWalk(true); + if(this.habbo.getHabboInfo().getCurrentRoom() != null) + { + this.habbo.getHabboInfo().getCurrentRoom().sendComposer(new RoomUserEffectComposer(this.habbo.getRoomUnit()).compose()); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeHandleSnowballExplosion.java b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeHandleSnowballExplosion.java new file mode 100644 index 00000000..159553c0 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeHandleSnowballExplosion.java @@ -0,0 +1,110 @@ +package com.eu.habbo.threading.runnables.freeze; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.games.freeze.FreezeGame; +import com.eu.habbo.habbohotel.games.freeze.FreezeGamePlayer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeBlock; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTile; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import gnu.trove.set.hash.THashSet; + +class FreezeHandleSnowballExplosion implements Runnable +{ + private final FreezeThrowSnowball thrownData; + + public FreezeHandleSnowballExplosion(FreezeThrowSnowball thrownData) + { + this.thrownData = thrownData; + } + + @Override + public void run() + { + try + { + if(this.thrownData == null || this.thrownData.habbo.getHabboInfo().getGamePlayer() == null) + return; + + FreezeGamePlayer player = (FreezeGamePlayer)this.thrownData.habbo.getHabboInfo().getGamePlayer(); + + if (player == null) + return; + + player.addSnowball(); + + THashSet tiles = new THashSet(); + + FreezeGame game = ((FreezeGame)this.thrownData.room.getGame(FreezeGame.class)); + + if(game == null) + return; + + if (player.nextHorizontal) + { + tiles.addAll(game.affectedTilesByExplosion(this.thrownData.targetTile.getX(), this.thrownData.targetTile.getY(), this.thrownData.radius + 1)); + } + + if (player.nextDiagonal) + { + tiles.addAll(game.affectedTilesByExplosionDiagonal(this.thrownData.targetTile.getX(), this.thrownData.targetTile.getY(), this.thrownData.radius + 1)); + player.nextDiagonal = false; + } + + THashSet freezeTiles = new THashSet(); + + for (RoomTile t : tiles) + { + THashSet items = this.thrownData.room.getItemsAt(t); + + for (HabboItem i : items) + { + if (i instanceof InteractionFreezeTile) + { + i.setExtradata("11000"); + freezeTiles.add((InteractionFreezeTile) i); + this.thrownData.room.updateItem(i); + i.setExtradata("0"); + + THashSet habbos = new THashSet(); + habbos.addAll(this.thrownData.room.getHabbosAt(i.getX(), i.getY())); + + for (Habbo habbo : habbos) + { + if (habbo.getHabboInfo().getGamePlayer() != null && habbo.getHabboInfo().getGamePlayer() instanceof FreezeGamePlayer) + { + FreezeGamePlayer hPlayer = (FreezeGamePlayer) habbo.getHabboInfo().getGamePlayer(); + if(!hPlayer.canGetFrozen()) + continue; + + if (hPlayer.getTeamColor().equals(player.getTeamColor())) + player.addScore(-FreezeGame.FREEZE_LOOSE_POINTS); + else + player.addScore(FreezeGame.FREEZE_LOOSE_POINTS); + + ((FreezeGamePlayer)habbo.getHabboInfo().getGamePlayer()).freeze(); + + AchievementManager.progressAchievement(habbo, Emulator.getGameEnvironment().getAchievementManager().getAchievement("EsA")); + } + } + } else if (i instanceof InteractionFreezeBlock) + { + if (i.getExtradata().equalsIgnoreCase("0")) + { + game.explodeBox((InteractionFreezeBlock) i); + player.addScore(FreezeGame.DESTROY_BLOCK_POINTS); + } + } + } + } + + Emulator.getThreading().run(new FreezeResetExplosionTiles(freezeTiles, this.thrownData.room), 1000); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeResetExplosionTiles.java b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeResetExplosionTiles.java new file mode 100644 index 00000000..232fcc11 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeResetExplosionTiles.java @@ -0,0 +1,27 @@ +package com.eu.habbo.threading.runnables.freeze; + +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTile; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import gnu.trove.set.hash.THashSet; + +class FreezeResetExplosionTiles implements Runnable +{ + private final THashSet tiles; + private final Room room; + + public FreezeResetExplosionTiles(THashSet tiles, Room room) + { + this.tiles = tiles; + this.room = room; + } + @Override + public void run() + { + for(HabboItem item : this.tiles) + { + room.updateItem(item); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeThrowSnowball.java b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeThrowSnowball.java new file mode 100644 index 00000000..09e3043c --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/freeze/FreezeThrowSnowball.java @@ -0,0 +1,37 @@ +package com.eu.habbo.threading.runnables.freeze; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.games.freeze.FreezeGamePlayer; +import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeTile; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +public class FreezeThrowSnowball implements Runnable +{ + public final Habbo habbo; + public final InteractionFreezeTile targetTile; + public final Room room; + public final int radius; + + public FreezeThrowSnowball(Habbo habbo, HabboItem targetTile, Room room) + { + this.habbo = habbo; + this.targetTile = (InteractionFreezeTile) targetTile; + this.room = room; + this.radius = ((FreezeGamePlayer)habbo.getHabboInfo().getGamePlayer()).getExplosionBoost(); + } + + @Override + public void run() + { + ((FreezeGamePlayer)habbo.getHabboInfo().getGamePlayer()).takeSnowball(); + targetTile.setExtradata((this.radius + 1) * 1000 + ""); + room.updateItem(this.targetTile); + Emulator.getThreading().run(new FreezeHandleSnowballExplosion(this), 2000); + Emulator.getThreading().run(new HabboItemNewState(this.targetTile, this.room, "11000"), 2000); + Emulator.getThreading().run(new HabboItemNewState(this.targetTile, this.room, "0"), 3000); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java new file mode 100644 index 00000000..dbc207b1 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java @@ -0,0 +1,35 @@ +package com.eu.habbo.threading.runnables.hopper; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +class HopperActionFive implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public HopperActionFive(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + this.client.getHabbo().getRoomUnit().isTeleporting = false; + RoomTile tile = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(this.currentTeleport.getX(), this.currentTeleport.getY()), this.currentTeleport.getRotation()); + if (tile != null) + { + this.client.getHabbo().getRoomUnit().setGoalLocation(tile); + } + + Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, this.room, "0"), 1000); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFour.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFour.java new file mode 100644 index 00000000..8a92d1cb --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFour.java @@ -0,0 +1,30 @@ +package com.eu.habbo.threading.runnables.hopper; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +class HopperActionFour implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public HopperActionFour(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + this.currentTeleport.setExtradata("1"); + this.room.updateItem(this.currentTeleport); + + Emulator.getThreading().run(new HopperActionFive(this.currentTeleport, this.room, this.client), 500); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java new file mode 100644 index 00000000..3da0e059 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java @@ -0,0 +1,45 @@ +package com.eu.habbo.threading.runnables.hopper; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; + +public class HopperActionOne implements Runnable +{ + private final HabboItem teleportOne; + private final Room room; + private final GameClient client; + + public HopperActionOne(HabboItem teleportOne, Room room, GameClient client) + { + this.teleportOne = teleportOne; + this.room = room; + this.client = client; + } + + @Override + public void run() + { + //this.client.getHabbo().getRoomUnit().setGoalLocation(this.teleportOne.getX(), this.teleportOne.getY()); + this.client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[(this.teleportOne.getRotation() + 4) % 8]); + this.client.getHabbo().getRoomUnit().getStatus().put("mv", this.teleportOne.getX() + "," + this.teleportOne.getY() + "," + this.teleportOne.getZ()); + this.room.scheduledComposers.add(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(this.teleportOne.getX(), this.teleportOne.getY())); + this.client.getHabbo().getRoomUnit().setZ(this.teleportOne.getZ()); + + Emulator.getThreading().run(new Runnable() + { + @Override + public void run() + { + client.getHabbo().getRoomUnit().getStatus().remove("mv"); + room.sendComposer(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); + } + }, 750); + + Emulator.getThreading().run(new HopperActionTwo(this.teleportOne, this.room, this.client), 1250); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java new file mode 100644 index 00000000..881c8f4b --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java @@ -0,0 +1,68 @@ +package com.eu.habbo.threading.runnables.hopper; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.achievements.AchievementManager; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.interactions.InteractionCostumeHopper; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +class HopperActionThree implements Runnable +{ + private final HabboItem teleportOne; + private final Room room; + private final GameClient client; + private final int targetRoomId; + private final int targetItemId; + + public HopperActionThree(HabboItem teleportOne, Room room, GameClient client, int targetRoomId, int targetItemId) + { + this.teleportOne = teleportOne; + this.room = room; + this.client = client; + this.targetRoomId = targetRoomId; + this.targetItemId = targetItemId; + } + + @Override + public void run() + { + HabboItem targetTeleport; + Room targetRoom = room; + + if(this.teleportOne.getRoomId() != targetRoomId) + { + targetRoom = Emulator.getGameEnvironment().getRoomManager().loadRoom(this.targetRoomId); + Emulator.getGameEnvironment().getRoomManager().enterRoom(this.client.getHabbo(), targetRoom.getId(), "", false); + } + + targetTeleport = targetRoom.getHabboItem(this.targetItemId); + + if(targetTeleport == null) + { + this.client.getHabbo().getRoomUnit().getStatus().remove("mv"); + this.client.getHabbo().getRoomUnit().setCanWalk(true); + return; + } + + targetTeleport.setExtradata("2"); + targetRoom.updateItem(targetTeleport); + this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(targetTeleport.getX(), targetTeleport.getY())); + this.client.getHabbo().getRoomUnit().setZ(targetTeleport.getZ()); + this.client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[targetTeleport.getRotation() % 8]); + this.client.getHabbo().getRoomUnit().getStatus().remove("mv"); + targetRoom.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + + Emulator.getThreading().run(new HabboItemNewState(this.teleportOne, room, "0"), 500); + Emulator.getThreading().run(new HopperActionFour(targetTeleport, targetRoom, this.client), 500); + + if(targetTeleport instanceof InteractionCostumeHopper) + { + AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("CostumeHopper")); + } + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionTwo.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionTwo.java new file mode 100644 index 00000000..8cf82497 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionTwo.java @@ -0,0 +1,68 @@ +package com.eu.habbo.threading.runnables.hopper; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +class HopperActionTwo implements Runnable +{ + private final HabboItem teleportOne; + private final Room room; + private final GameClient client; + + public HopperActionTwo(HabboItem teleportOne, Room room, GameClient client) + { + this.teleportOne = teleportOne; + this.room = room; + this.client = client; + } + + @Override + public void run() + { + this.teleportOne.setExtradata("2"); + + int targetRoomId = 0; + int targetItemId = 0; + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT items.id, items.room_id FROM items_hoppers INNER JOIN items ON items_hoppers.item_id = items.id WHERE base_item = ? AND items.id != ? AND room_id > 0 ORDER BY RAND() LIMIT 1")) + { + statement.setInt(1, this.teleportOne.getBaseItem().getId()); + statement.setInt(2, this.teleportOne.getId()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + targetItemId = set.getInt("id"); + targetRoomId = set.getInt("room_id"); + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + + if(targetRoomId != 0 && targetItemId != 0) + { + Emulator.getThreading().run(new HopperActionThree(this.teleportOne, this.room, this.client, targetRoomId, targetItemId), 500); + } + else + { + this.teleportOne.setExtradata("0"); + this.client.getHabbo().getRoomUnit().setCanWalk(true); + this.client.getHabbo().getRoomUnit().isTeleporting = false; + Emulator.getThreading().run(new HopperActionFour(this.teleportOne, this.room, this.client), 500); + } + + this.room.updateItem(this.teleportOne); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java new file mode 100644 index 00000000..40d66f54 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java @@ -0,0 +1,48 @@ +package com.eu.habbo.threading.runnables.teleport; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.interactions.InteractionTeleportTile; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +class TeleportActionFive implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public TeleportActionFive(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + this.client.getHabbo().getRoomUnit().isTeleporting = false; + this.client.getHabbo().getRoomUnit().setCanWalk(true); + + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != this.room) + return; + + if (!(this.currentTeleport instanceof InteractionTeleportTile)) + { + RoomTile tile = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(this.currentTeleport.getX(), this.currentTeleport.getY()), this.currentTeleport.getRotation()); + + if (tile != null && tile.isWalkable()) + { + this.client.getHabbo().getRoomUnit().setGoalLocation(tile); + } + } + + this.currentTeleport.setExtradata("1"); + room.updateItem(this.currentTeleport); + + Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, room, "0"), 1500); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFour.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFour.java new file mode 100644 index 00000000..8e6b69a4 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFour.java @@ -0,0 +1,39 @@ +package com.eu.habbo.threading.runnables.teleport; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; + +class TeleportActionFour implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public TeleportActionFour(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != this.room) + { + this.client.getHabbo().getRoomUnit().setCanWalk(true); + this.client.getHabbo().getRoomUnit().isTeleporting = false; + this.currentTeleport.setExtradata("0"); + this.room.updateItem(this.currentTeleport); + return; + } + + this.currentTeleport.setExtradata("0"); + this.room.updateItem(this.currentTeleport); + + Emulator.getThreading().run(new TeleportActionFive(this.currentTeleport, this.room, this.client), 500); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionOne.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionOne.java new file mode 100644 index 00000000..9fdb999d --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionOne.java @@ -0,0 +1,43 @@ +package com.eu.habbo.threading.runnables.teleport; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.interactions.InteractionTeleportTile; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +public class TeleportActionOne implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public TeleportActionOne(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != this.room) + return; + + int delay = 1000; + if (this.client.getHabbo().getRoomUnit().getCurrentLocation() != this.room.getLayout().getTile(this.currentTeleport.getX(), this.currentTeleport.getY())) + { + this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(this.currentTeleport.getX(), this.currentTeleport.getY())); + this.client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[(this.currentTeleport.getRotation() + 4) % 8]); + this.client.getHabbo().getRoomUnit().getStatus().put("mv", this.currentTeleport.getX() + "," + this.currentTeleport.getY() + "," + this.currentTeleport.getZ()); + this.room.scheduledComposers.add(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(this.currentTeleport.getX(), this.currentTeleport.getY())); + } + + Emulator.getThreading().run(new TeleportActionTwo(currentTeleport, room, client), delay); + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java new file mode 100644 index 00000000..a051c3ac --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java @@ -0,0 +1,69 @@ +package com.eu.habbo.threading.runnables.teleport; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.interactions.InteractionTeleport; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUserRotation; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserRemoveComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +class TeleportActionThree implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public TeleportActionThree(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != this.room) + return; + + HabboItem targetTeleport; + Room targetRoom = room; + + if(this.currentTeleport.getRoomId() != ((InteractionTeleport)this.currentTeleport).getTargetRoomId()) + { + targetRoom = Emulator.getGameEnvironment().getRoomManager().loadRoom(((InteractionTeleport) this.currentTeleport).getTargetRoomId()); + } + + if(targetRoom == null) + return; + + targetTeleport = targetRoom.getHabboItem(((InteractionTeleport) this.currentTeleport).getTargetId()); + + if(targetTeleport == null) + return; + + this.client.getHabbo().getRoomUnit().setLocation(targetRoom.getLayout().getTile(targetTeleport.getX(), targetTeleport.getY())); + this.client.getHabbo().getRoomUnit().setZ(targetTeleport.getZ()); + this.client.getHabbo().getRoomUnit().setRotation(RoomUserRotation.values()[targetTeleport.getRotation() % 8]); + this.client.getHabbo().getRoomUnit().getStatus().remove("mv"); + + if(targetRoom != this.room) + { + this.room.sendComposer(new RoomUserRemoveComposer(client.getHabbo().getRoomUnit()).compose()); + Emulator.getGameEnvironment().getRoomManager().enterRoom(this.client.getHabbo(), targetRoom.getId(), "", Emulator.getConfig().getBoolean("hotel.teleport.locked.allowed")); + } + + targetTeleport.setExtradata("2"); + targetRoom.updateItem(targetTeleport); + targetRoom.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + + this.client.getHabbo().getHabboInfo().setCurrentRoom(targetRoom); + //Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, this.room, "0"), 500); + Emulator.getThreading().run(new TeleportActionFour(targetTeleport, targetRoom, this.client), 1000); + + } +} diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionTwo.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionTwo.java new file mode 100644 index 00000000..876d0a5a --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionTwo.java @@ -0,0 +1,104 @@ +package com.eu.habbo.threading.runnables.teleport; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.items.interactions.InteractionTeleport; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.HabboItem; +import com.eu.habbo.messages.outgoing.rooms.items.FloorItemUpdateComposer; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; +import com.eu.habbo.threading.runnables.HabboItemNewState; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +class TeleportActionTwo implements Runnable +{ + private final HabboItem currentTeleport; + private final Room room; + private final GameClient client; + + public TeleportActionTwo(HabboItem currentTeleport, Room room, GameClient client) + { + this.currentTeleport = currentTeleport; + this.client = client; + this.room = room; + } + + @Override + public void run() + { + if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != this.room) + return; + + this.client.getHabbo().getRoomUnit().getStatus().remove("mv"); + this.room.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit()).compose()); + + if(((InteractionTeleport)this.currentTeleport).getTargetRoomId() > 0 && ((InteractionTeleport) this.currentTeleport).getTargetId() > 0) + { + HabboItem item = room.getHabboItem(((InteractionTeleport) this.currentTeleport).getTargetId()); + if(item == null) + { + ((InteractionTeleport) this.currentTeleport).setTargetRoomId(0); + ((InteractionTeleport) this.currentTeleport).setTargetId(0); + } + else if(((InteractionTeleport)item).getTargetRoomId() != ((InteractionTeleport) this.currentTeleport).getTargetRoomId()) + { + ((InteractionTeleport) this.currentTeleport).setTargetId(0); + ((InteractionTeleport) this.currentTeleport).setTargetRoomId(0); + ((InteractionTeleport) item).setTargetId(0); + ((InteractionTeleport) item).setTargetRoomId(0); + } + } + else + { + ((InteractionTeleport) this.currentTeleport).setTargetRoomId(0); + ((InteractionTeleport) this.currentTeleport).setTargetId(0); + } + if(((InteractionTeleport)this.currentTeleport).getTargetId() == 0) + { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT items_teleports.*, A.room_id as a_room_id, A.id as a_id, B.room_id as b_room_id, B.id as b_id FROM items_teleports INNER JOIN items AS A ON items_teleports.teleport_one_id = A.id INNER JOIN items AS B ON items_teleports.teleport_two_id = B.id WHERE (teleport_one_id = ? OR teleport_two_id = ?)")) + { + statement.setInt(1, this.currentTeleport.getId()); + statement.setInt(2, this.currentTeleport.getId()); + + try (ResultSet set = statement.executeQuery()) + { + if (set.next()) + { + if (set.getInt("a_id") != this.currentTeleport.getId()) + { + ((InteractionTeleport) this.currentTeleport).setTargetId(set.getInt("a_id")); + ((InteractionTeleport) this.currentTeleport).setTargetRoomId(set.getInt("a_room_id")); + } + else + { + ((InteractionTeleport) this.currentTeleport).setTargetId(set.getInt("b_id")); + ((InteractionTeleport) this.currentTeleport).setTargetRoomId(set.getInt("b_room_id")); + } + } + } + } + catch (SQLException e) + { + Emulator.getLogging().logSQLException(e); + } + } + + if(((InteractionTeleport) this.currentTeleport).getTargetRoomId() == 0) + { + //Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, room, "1"), 0); + Emulator.getThreading().run(new TeleportActionFive(this.currentTeleport, this.room, this.client), 0); + return; + } + + this.currentTeleport.setExtradata("0"); + this.room.updateItem(this.currentTeleport); + + Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, room, "2"), 500); + Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, room, "0"), 1500); + Emulator.getThreading().run(new TeleportActionThree(this.currentTeleport, this.room, this.client), 1000); + } +} diff --git a/src/main/java/com/eu/habbo/util/FigureUtil.java b/src/main/java/com/eu/habbo/util/FigureUtil.java new file mode 100644 index 00000000..9f2dbcf0 --- /dev/null +++ b/src/main/java/com/eu/habbo/util/FigureUtil.java @@ -0,0 +1,64 @@ +package com.eu.habbo.util; + +import gnu.trove.map.hash.THashMap; +import java.util.Map; +import org.apache.commons.lang3.ArrayUtils; + +public class FigureUtil +{ + public static THashMap getFigureBits(String looks) + { + THashMap bits = new THashMap(); + String[] sets = looks.split("\\."); + + for(String set : sets) + { + String[] setBits = set.split("-", 2); + bits.put(setBits[0], setBits.length > 1 ? setBits[1] : ""); + } + + return bits; + } + + + public static String mergeFigures(String figure1, String figure2) + { + return mergeFigures(figure1, figure2, null, null); + } + + public static String mergeFigures(String figure1, String figure2, String[] limitFigure1) + { + return mergeFigures(figure1, figure2, limitFigure1, null); + } + + public static String mergeFigures(String figure1, String figure2, String[] limitFigure1, String[] limitFigure2) + { + THashMap figureBits1 = getFigureBits(figure1); + THashMap figureBits2 = getFigureBits(figure2); + + String finalLook = ""; + + for (Map.Entry keys : figureBits1.entrySet()) + { + if(limitFigure1 == null || ArrayUtils.contains(limitFigure1, keys.getKey())) + { + finalLook = finalLook + keys.getKey() + "-" + keys.getValue() + "."; + } + } + + for (Map.Entry keys : figureBits2.entrySet()) + { + if(limitFigure2 == null || ArrayUtils.contains(limitFigure2, keys.getKey())) + { + finalLook = finalLook + keys.getKey() + "-" + keys.getValue() + "."; + } + } + + if(finalLook.endsWith(".")) + { + finalLook = finalLook.substring(0, finalLook.length() - 1); + } + + return finalLook; + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/util/callback/HTTPPostError.java b/src/main/java/com/eu/habbo/util/callback/HTTPPostError.java new file mode 100644 index 00000000..293f0ac9 --- /dev/null +++ b/src/main/java/com/eu/habbo/util/callback/HTTPPostError.java @@ -0,0 +1,62 @@ +package com.eu.habbo.util.callback; + +import com.eu.habbo.Emulator; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; + +public class HTTPPostError implements Runnable +{ + public Throwable stackTrace; + + public HTTPPostError(Throwable stackTrace) + { + this.stackTrace = stackTrace; + } + + private void sendPost() + { + try + { + if (!Emulator.isReady) + return; + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + stackTrace.printStackTrace(pw); + String url = "http://arcturus.wf/callback/error.php"; + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("User-Agent", "arcturus"); + String urlParameters = "errors=1&version=" + Emulator.version + "&stacktrace=" + sw.toString() + "&users=" + Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "&rooms=" + Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + "&username=" + Emulator.getConfig().getValue("username"); + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(urlParameters); + wr.flush(); + wr.close(); + pw.close(); + sw.close(); + + int responseCode = con.getResponseCode(); + con.disconnect(); + } + catch (Exception e) + { + } + return; + } + + @Override + public void run() + { + try + { + this.sendPost(); + } + catch (Exception e) + { + } + } +} diff --git a/src/main/java/com/eu/habbo/util/callback/HTTPPostStatus.java b/src/main/java/com/eu/habbo/util/callback/HTTPPostStatus.java new file mode 100644 index 00000000..a4287eec --- /dev/null +++ b/src/main/java/com/eu/habbo/util/callback/HTTPPostStatus.java @@ -0,0 +1,40 @@ +package com.eu.habbo.util.callback; + +import com.eu.habbo.Emulator; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; + +public class HTTPPostStatus implements Runnable +{ + private void sendPost() throws Exception + { + String url = "http://arcturus.wf/callback/status.php"; + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("User-Agent", "arcturus"); + String urlParameters = "users=" + Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "&rooms=" + Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + "&username=" + Emulator.getConfig().getValue("username") + "&version=" + Emulator.version; + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(urlParameters); + wr.flush(); + wr.close(); + int responseCode = con.getResponseCode(); + con.disconnect(); + return; + } + + @Override + public void run() + { + try + { + this.sendPost(); + } + catch (Exception e) + { + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/util/callback/HTTPVersionCheck.java b/src/main/java/com/eu/habbo/util/callback/HTTPVersionCheck.java new file mode 100644 index 00000000..bde9bf14 --- /dev/null +++ b/src/main/java/com/eu/habbo/util/callback/HTTPVersionCheck.java @@ -0,0 +1,77 @@ +package com.eu.habbo.util.callback; + +import com.eu.habbo.Emulator; +import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class HTTPVersionCheck implements Runnable +{ + private void sendPost() + { + try + { + if (!Emulator.isReady) + return; + + String url = "http://arcturus.wf/callback/check.php"; + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestMethod("POST"); + con.setRequestProperty("User-Agent", "arcturus"); + String urlParameters = "&major=" + Emulator.MAJOR + "&minor=" + Emulator.MINOR + "&build=" + Emulator.BUILD + "&version=" + Emulator.version + "&users=" + Emulator.getGameEnvironment().getHabboManager().getOnlineCount() + "&rooms=" + Emulator.getGameEnvironment().getRoomManager().getActiveRooms().size() + "&username=" + Emulator.getConfig().getValue("username"); + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(urlParameters); + wr.flush(); + + int responseCode = con.getResponseCode(); + if (responseCode == 102) + { + String text = ""; + InputStreamReader in = new InputStreamReader((InputStream) con.getContent()); + BufferedReader buff = new BufferedReader(in); + String line; + do { + line = buff.readLine(); + + if (line != null) + { + text += (line + "\n"); + } + } while (line != null); + buff.close(); + in.close(); + + Emulator.getLogging().logStart(text); + Emulator.getGameServer().getGameClientManager().sendBroadcastResponse(new GenericAlertComposer(text)); + } + wr.close(); + con.disconnect(); + } + catch (Exception e) + { + e.printStackTrace(); + } + return; + } + + @Override + public void run() + { +// try +// { +// this.sendPost(); +// } +// catch (Exception e) +// { +// e.printStackTrace(); +// } +// Emulator.getThreading().run(this, 1000); + } +} diff --git a/src/main/java/com/eu/habbo/util/crypto/ZIP.java b/src/main/java/com/eu/habbo/util/crypto/ZIP.java new file mode 100644 index 00000000..4c0e53d6 --- /dev/null +++ b/src/main/java/com/eu/habbo/util/crypto/ZIP.java @@ -0,0 +1,33 @@ +package com.eu.habbo.util.crypto; + +import java.io.ByteArrayOutputStream; +import java.util.zip.Inflater; + +public class ZIP +{ + public static byte[] inflate(byte[] data) + { + try + { + byte[] buffer = new byte[data.length * 5]; + Inflater inflater = new Inflater(); + inflater.setInput(data); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); + while (!inflater.finished()) + { + int count = inflater.inflate(buffer); + outputStream.write(buffer, 0, count); + } + outputStream.close(); + byte[] output = outputStream.toByteArray(); + + inflater.end(); + return output; + } + catch (Exception e) + { + return new byte[0]; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/util/figure/FigureUtil.java b/src/main/java/com/eu/habbo/util/figure/FigureUtil.java new file mode 100644 index 00000000..963dfbfa --- /dev/null +++ b/src/main/java/com/eu/habbo/util/figure/FigureUtil.java @@ -0,0 +1,64 @@ +package com.eu.habbo.util.figure; + +import gnu.trove.map.hash.THashMap; +import java.util.Map; +import org.apache.commons.lang3.ArrayUtils; + +public class FigureUtil +{ + public static THashMap getFigureBits(String looks) + { + THashMap bits = new THashMap(); + String[] sets = looks.split("\\."); + + for(String set : sets) + { + String[] setBits = set.split("-", 2); + bits.put(setBits[0], setBits.length > 1 ? setBits[1] : ""); + } + + return bits; + } + + + public static String mergeFigures(String figure1, String figure2) + { + return mergeFigures(figure1, figure2, null, null); + } + + public static String mergeFigures(String figure1, String figure2, String[] limitFigure1) + { + return mergeFigures(figure1, figure2, limitFigure1, null); + } + + public static String mergeFigures(String figure1, String figure2, String[] limitFigure1, String[] limitFigure2) + { + THashMap figureBits1 = getFigureBits(figure1); + THashMap figureBits2 = getFigureBits(figure2); + + String finalLook = ""; + + for (Map.Entry keys : figureBits1.entrySet()) + { + if(limitFigure1 == null || ArrayUtils.contains(limitFigure1, keys.getKey())) + { + finalLook = finalLook + keys.getKey() + "-" + keys.getValue() + "."; + } + } + + for (Map.Entry keys : figureBits2.entrySet()) + { + if(limitFigure2 == null || ArrayUtils.contains(limitFigure2, keys.getKey())) + { + finalLook = finalLook + keys.getKey() + "-" + keys.getValue() + "."; + } + } + + if(finalLook.endsWith(".")) + { + finalLook = finalLook.substring(0, finalLook.length() - 1); + } + + return finalLook; + } +} diff --git a/src/main/java/com/eu/habbo/util/imager/badges/BadgeImager.java b/src/main/java/com/eu/habbo/util/imager/badges/BadgeImager.java new file mode 100644 index 00000000..1754e54b --- /dev/null +++ b/src/main/java/com/eu/habbo/util/imager/badges/BadgeImager.java @@ -0,0 +1,340 @@ +package com.eu.habbo.util.imager.badges; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.guilds.Guild; +import com.eu.habbo.habbohotel.guilds.GuildPart; +import com.eu.habbo.habbohotel.guilds.GuildPartType; +import gnu.trove.map.hash.THashMap; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.ColorConvertOp; +import java.awt.image.ColorModel; +import java.awt.image.WritableRaster; +import java.io.File; +import java.util.Map; + +public class BadgeImager +{ + THashMap cachedImages = new THashMap(); + + public BadgeImager() + { + if (Emulator.getConfig().getBoolean("imager.internal.enabled")) + { + if(this.reload()) + { + Emulator.getLogging().logStart("Badge Imager -> Loaded!"); + + } + else + { + Emulator.getLogging().logStart("Badge Imager -> Disabled! Please check your configuration!"); + } + } + } + + public synchronized boolean reload() + { + File file = new File(Emulator.getConfig().getValue("imager.location.badgeparts")); + if (!file.exists()) + { + Emulator.getLogging().logErrorLine("[BadgeImager] Output folder: " + Emulator.getConfig().getValue("imager.location.badgeparts") + " does not exist!"); + return false; + } + + this.cachedImages.clear(); + try + { + for(Map.Entry> set : Emulator.getGameEnvironment().getGuildManager().getGuildParts().entrySet()) + { + if(set.getKey() == GuildPartType.SYMBOL || set.getKey() == GuildPartType.BASE) + { + for (Map.Entry map : set.getValue().entrySet()) + { + if (!map.getValue().valueA.isEmpty()) + { + try + { + this.cachedImages.put(map.getValue().valueA, ImageIO.read(new File(Emulator.getConfig().getValue("imager.location.badgeparts"), "badgepart_" + map.getValue().valueA.replace(".gif", ".png")))); + } + catch (Exception e) + { + Emulator.getLogging().logStart(("[Badge Imager] Missing Badge Part: " + Emulator.getConfig().getValue("imager.location.badgeparts") + "/badgepart_" + map.getValue().valueA.replace(".gif", ".png"))); + } + } + + if (!map.getValue().valueB.isEmpty()) + { + try + { + this.cachedImages.put(map.getValue().valueB, ImageIO.read(new File(Emulator.getConfig().getValue("imager.location.badgeparts"), "badgepart_" + map.getValue().valueB.replace(".gif", ".png")))); + } + catch (Exception e) + { + Emulator.getLogging().logStart(("[Badge Imager] Missing Badge Part: " + Emulator.getConfig().getValue("imager.location.badgeparts") + "/badgepart_" + map.getValue().valueB.replace(".gif", ".png"))); + } + } + } + } + } + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + return false; + } + + return true; + } + + public void generate(Guild guild) + { + String badge = guild.getBadge(); + File outputFile; + try + { + outputFile = new File(Emulator.getConfig().getValue("imager.location.output.badges"), badge + ".png"); + + if (outputFile == null || outputFile.exists()) + return; + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); + return; + } + + String[] parts = new String[]{"", "", "", "", ""}; + + int count = 0; + + for (int i = 0; i < badge.length();) + { + if (i > 0) + { + if (i % 7 == 0) + { + count++; + } + } + + for (int j = 0; j < 7; j++) + { + parts[count] += badge.charAt(i); + i++; + } + } + + + BufferedImage image = new BufferedImage(39, 39, BufferedImage.TYPE_INT_ARGB); + Graphics graphics = image.getGraphics(); + + for (String s : parts) + { + if(s.isEmpty()) + continue; + + String type = s.charAt(0) + ""; + int id = Integer.valueOf(s.substring(1, 4)); + int c = Integer.valueOf(s.substring(4, 6)); + int position = Integer.valueOf(s.substring(6)); + + GuildPart part; + GuildPart color = Emulator.getGameEnvironment().getGuildManager().getPart(GuildPartType.BASE_COLOR, c); + + if (type.equalsIgnoreCase("b")) + { + part = Emulator.getGameEnvironment().getGuildManager().getPart(GuildPartType.BASE, id); + } + else + { + part = Emulator.getGameEnvironment().getGuildManager().getPart(GuildPartType.SYMBOL, id); + } + + BufferedImage imagePart = BadgeImager.deepCopy(this.cachedImages.get(part.valueA)); + + Point point; + + if (imagePart != null) + { + if (imagePart.getColorModel().getPixelSize() < 32) + { + imagePart = convert32(imagePart); + } + + point = getPoint(image, imagePart, position); + + recolor(imagePart, colorFromHexString(color.valueA)); + + graphics.drawImage(imagePart, point.x, point.y, null); + } + + if (!part.valueB.isEmpty()) + { + imagePart = BadgeImager.deepCopy(this.cachedImages.get(part.valueB)); + + if (imagePart != null) + { + if (imagePart.getColorModel().getPixelSize() < 32) + { + imagePart = convert32(imagePart); + } + + point = getPoint(image, imagePart, position); + graphics.drawImage(imagePart, point.x, point.y, null); + } + } + } + + try + { + ImageIO.write(image, "PNG", outputFile); + } + catch (Exception e) + { + Emulator.getLogging().logErrorLine("Failed to generate guild badge: " + outputFile + ".png Make sure the output folder exists and is writable!"); + } + + graphics.dispose(); + } + + public static BufferedImage deepCopy(BufferedImage bi) + { + if(bi == null) + return null; + + ColorModel cm = bi.getColorModel(); + boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); + WritableRaster raster = bi.copyData(null); + return new BufferedImage(cm, raster, isAlphaPremultiplied, null); + } + + public static void recolor(BufferedImage image, Color maskColor) + { + for (int x = 0; x < image.getWidth(); x++) + { + for (int y = 0; y < image.getHeight(); y++) + { + int pixel = image.getRGB(x, y); + + if((pixel >> 24) == 0x00) + continue; + + Color color = new Color(pixel); + + float alpha = (color.getAlpha() / 255.0F) * (maskColor.getAlpha() / 255.0F); + float red = (color.getRed() / 255.0F) * (maskColor.getRed() / 255.0F); + float green = (color.getGreen() / 255.0F) * (maskColor.getGreen() / 255.0F); + float blue = (color.getBlue() / 255.0F) * (maskColor.getBlue() / 255.0F); +// +// if (image.isAlphaPremultiplied()) +// { +// red = red * alpha / 255; +// green = green * alpha / 255; +// blue = blue * alpha / 255; +// } + +// int alpha = (color.getAlpha() & 0xFF); +// int red = (color.getRed() & 0xFF); +// int green = (color.getGreen() & 0xFF); +// int blue = (color.getBlue() & 0xFF); +// +// if(image.isAlphaPremultiplied()) +// { +// red |= maskColor.getRed(); +// green |= maskColor.getGreen(); +// blue |= maskColor.getBlue(); +// } +// else +// { +// red &= maskColor.getRed(); +// green &= maskColor.getGreen(); +// blue &= maskColor.getBlue(); +// } +// +// if((pixel | 0xFF000000) == 0xFFFFFFFF) +// { +// color = maskColor; +// } +// else +// { + color = new Color(red, green, blue, alpha); +// } + + int rgb = color.getRGB(); + image.setRGB(x, y, rgb); + } + } + } + + public static Color colorFromHexString(String colorStr) + { + try + { + return new Color( + Integer.valueOf(colorStr, 16)); + } + catch (Exception e) + { + return new Color(0xffffff); + } + } + + public static Point getPoint(BufferedImage image, BufferedImage imagePart, int position) + { + int x = 0; + int y = 0; + + if (position == 1) + { + x = (image.getWidth() - imagePart.getWidth()) / 2; + y = 0; + } + else if (position == 2) + { + x = image.getWidth() - imagePart.getWidth(); + y = 0; + } + else if(position == 3) + { + x = 0; + y = (image.getHeight() / 2) - (imagePart.getHeight() / 2); + } + else if(position == 4) + { + x = (image.getWidth() / 2) - (imagePart.getWidth() / 2); + y = (image.getHeight() / 2) - (imagePart.getHeight() / 2); + } + else if(position == 5) + { + x = image.getWidth() - imagePart.getWidth(); + y = (image.getHeight() / 2) - (imagePart.getHeight() / 2); + } + else if(position == 6) + { + x = 0; + y = image.getHeight() - imagePart.getHeight(); + } + else if(position == 7) + { + x = ((image.getWidth() - imagePart.getWidth()) / 2); + y = image.getHeight() - imagePart.getHeight(); + } + else if(position == 8) + { + x = image.getWidth() - imagePart.getWidth(); + y = image.getHeight() - imagePart.getHeight(); + } + + return new Point(x, y); + } + + public static BufferedImage convert32(BufferedImage src) + { + BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_ARGB); + ColorConvertOp cco = new ColorConvertOp(src.getColorModel().getColorSpace(), dest.getColorModel().getColorSpace(), null); + return cco.filter(src, dest); + } +} diff --git a/src/main/java/com/eu/habbo/util/pathfinding/Rotation.java b/src/main/java/com/eu/habbo/util/pathfinding/Rotation.java new file mode 100644 index 00000000..3bf4813e --- /dev/null +++ b/src/main/java/com/eu/habbo/util/pathfinding/Rotation.java @@ -0,0 +1,27 @@ +package com.eu.habbo.util.pathfinding; + +public class Rotation +{ + public static int Calculate(int X1, int Y1, int X2, int Y2) + { + int Rotation = 0; + if ((X1 > X2) && (Y1 > Y2)) { + Rotation = 7; + } else if ((X1 < X2) && (Y1 < Y2)) { + Rotation = 3; + } else if ((X1 > X2) && (Y1 < Y2)) { + Rotation = 5; + } else if ((X1 < X2) && (Y1 > Y2)) { + Rotation = 1; + } else if (X1 > X2) { + Rotation = 6; + } else if (X1 < X2) { + Rotation = 2; + } else if (Y1 < Y2) { + Rotation = 4; + } else if (Y1 > Y2) { + Rotation = 0; + } + return Rotation; + } +}