From 77fea6b9fd4b6bb54682a0eba3994c93c5e284ef Mon Sep 17 00:00:00 2001 From: duckietm Date: Thu, 19 Mar 2026 08:12:05 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=86=99=20Added=20more=20rate=20limiti?= =?UTF-8?q?ng=20to=20the=20emu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catalog/PurchaseTargetOfferEvent.java | 5 +++++ .../catalog/marketplace/BuyItemEvent.java | 5 +++++ .../marketplace/RequestCreditsEvent.java | 5 +++++ .../marketplace/TakeBackItemEvent.java | 5 +++++ .../ModToolIssueDefaultSanctionEvent.java | 5 +++++ .../incoming/modtool/ModToolKickEvent.java | 5 +++++ .../modtool/ModToolSanctionAlertEvent.java | 5 +++++ .../modtool/ModToolSanctionBanEvent.java | 5 +++++ .../modtool/ModToolSanctionMuteEvent.java | 5 +++++ .../ModToolSanctionTradeLockEvent.java | 5 +++++ .../incoming/modtool/ModToolWarnEvent.java | 5 +++++ .../navigator/RequestCreateRoomEvent.java | 4 ++++ .../Habbo-4.0.5-jar-with-dependencies.jar | Bin 20878583 -> 20878974 bytes 13 files changed, 59 insertions(+) diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/PurchaseTargetOfferEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/PurchaseTargetOfferEvent.java index 89fbfb3c..13fc307f 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/PurchaseTargetOfferEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/PurchaseTargetOfferEvent.java @@ -9,6 +9,11 @@ import com.eu.habbo.messages.incoming.MessageHandler; public class PurchaseTargetOfferEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 1000; + } + @Override public void handle() throws Exception { final int offerId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java index b9af0be8..5d604fb4 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/BuyItemEvent.java @@ -4,6 +4,11 @@ import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; import com.eu.habbo.messages.incoming.MessageHandler; public class BuyItemEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 1000; + } + @Override public void handle() throws Exception { int offerId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java index b03fda10..af98004a 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/RequestCreditsEvent.java @@ -4,6 +4,11 @@ import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; import com.eu.habbo.messages.incoming.MessageHandler; public class RequestCreditsEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @Override public void handle() throws Exception { MarketPlace.getCredits(this.client); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java index 7586afc4..12e7b1ef 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/marketplace/TakeBackItemEvent.java @@ -4,6 +4,11 @@ import com.eu.habbo.habbohotel.catalog.marketplace.MarketPlace; import com.eu.habbo.messages.incoming.MessageHandler; public class TakeBackItemEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 500; + } + @Override public void handle() throws Exception { int offerId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java index eb533cf9..48beb3c7 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolIssueDefaultSanctionEvent.java @@ -7,6 +7,11 @@ import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.messages.incoming.MessageHandler; public class ModToolIssueDefaultSanctionEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @Override public void handle() throws Exception { if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) { diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java index 3e1e234e..77370b36 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolKickEvent.java @@ -4,6 +4,11 @@ import com.eu.habbo.Emulator; import com.eu.habbo.messages.incoming.MessageHandler; public class ModToolKickEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @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/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java index 808a25de..4c901c46 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionAlertEvent.java @@ -12,6 +12,11 @@ import gnu.trove.map.hash.THashMap; import java.util.ArrayList; public class ModToolSanctionAlertEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @Override public void handle() throws Exception { int userId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java index a451a2ad..1814041b 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionBanEvent.java @@ -12,6 +12,11 @@ import gnu.trove.map.hash.THashMap; import java.util.ArrayList; public class ModToolSanctionBanEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + public static final int BAN_18_HOURS = 3; public static final int BAN_7_DAYS = 4; public static final int BAN_30_DAYS_STEP_1 = 5; diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java index 62cf7929..e9356fdf 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionMuteEvent.java @@ -14,6 +14,11 @@ import java.util.ArrayList; import java.util.Date; public class ModToolSanctionMuteEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @Override public void handle() throws Exception { int userId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java index 2666f6e6..0cece3ce 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolSanctionTradeLockEvent.java @@ -12,6 +12,11 @@ import gnu.trove.map.hash.THashMap; import java.util.ArrayList; public class ModToolSanctionTradeLockEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @Override public void handle() throws Exception { int userId = this.packet.readInt(); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolWarnEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolWarnEvent.java index e5f0b102..a8dae64f 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolWarnEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/modtool/ModToolWarnEvent.java @@ -8,6 +8,11 @@ import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.plugin.events.support.SupportUserAlertedReason; public class ModToolWarnEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 2000; + } + @Override public void handle() throws Exception { if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) { diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java index 79eebb68..66d0480b 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/navigator/RequestCreateRoomEvent.java @@ -13,6 +13,10 @@ import org.slf4j.LoggerFactory; public class RequestCreateRoomEvent extends MessageHandler { private static final Logger LOGGER = LoggerFactory.getLogger(RequestCreateRoomEvent.class); + @Override + public int getRatelimit() { + return 3000; + } @Override public void handle() throws Exception { diff --git a/Latest_Compiled_Version/Habbo-4.0.5-jar-with-dependencies.jar b/Latest_Compiled_Version/Habbo-4.0.5-jar-with-dependencies.jar index 7c845e2b810251f2907429e1adc278c8c51c7792..336d428e3ad989b193e03721b24a1db52d174a29 100644 GIT binary patch delta 107588 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

Fp8>QVmGg}>|2}cSD#ppY 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 delta 106882 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%0A`(K~MNQ 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 From 6b4e6a8759e2a87762694564fbf822c4a208e982 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Fri, 20 Mar 2026 17:14:15 +0100 Subject: [PATCH 2/2] feat: custom prefix system with effects and admin commands Backend implementation: - UserPrefix model with effect field, DB CRUD operations - PrefixesComponent inventory management - PurchasePrefixEvent with settings, blacklist and currency validation - Composers: UserPrefixes, PrefixReceived, ActivePrefixUpdated - RoomChatMessage serializes active prefix (text, color, icon, effect) - Admin commands: giveprefix, listprefixes, removeprefix, prefixblacklist - CustomPrefixLayout catalog page - SQL setup: user_prefixes, custom_prefix_settings, custom_prefix_blacklist tables --- Emulator/sqlupdates/custom_prefixes_setup.sql | 115 ++++++++++++++ .../habbohotel/catalog/CatalogManager.java | 3 + .../catalog/CatalogPageLayouts.java | 3 +- .../catalog/layouts/CustomPrefixLayout.java | 27 ++++ .../habbohotel/commands/CommandHandler.java | 4 + .../commands/GivePrefixCommand.java | 66 ++++++++ .../commands/ListPrefixesCommand.java | 59 +++++++ .../commands/PrefixBlacklistCommand.java | 98 ++++++++++++ .../commands/RemovePrefixCommand.java | 81 ++++++++++ .../habbohotel/rooms/RoomChatMessage.java | 19 +++ .../habbohotel/users/HabboInventory.java | 17 ++ .../eu/habbo/habbohotel/users/UserPrefix.java | 122 +++++++++++++++ .../users/inventory/PrefixesComponent.java | 105 +++++++++++++ .../com/eu/habbo/messages/PacketManager.java | 7 + .../eu/habbo/messages/incoming/Incoming.java | 6 + .../inventory/prefixes/DeletePrefixEvent.java | 23 +++ .../prefixes/PurchasePrefixEvent.java | 145 ++++++++++++++++++ .../prefixes/RequestUserPrefixesEvent.java | 11 ++ .../prefixes/SetActivePrefixEvent.java | 25 +++ .../eu/habbo/messages/outgoing/Outgoing.java | 5 + .../prefixes/ActivePrefixUpdatedComposer.java | 35 +++++ .../prefixes/PrefixReceivedComposer.java | 25 +++ .../prefixes/UserPrefixesComposer.java | 38 +++++ 23 files changed, 1038 insertions(+), 1 deletion(-) create mode 100644 Emulator/sqlupdates/custom_prefixes_setup.sql create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CustomPrefixLayout.java create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/commands/GivePrefixCommand.java create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/commands/ListPrefixesCommand.java create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/commands/PrefixBlacklistCommand.java create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/commands/RemovePrefixCommand.java create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/users/UserPrefix.java create mode 100644 Emulator/src/main/java/com/eu/habbo/habbohotel/users/inventory/PrefixesComponent.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/DeletePrefixEvent.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/PurchasePrefixEvent.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/RequestUserPrefixesEvent.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/SetActivePrefixEvent.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/ActivePrefixUpdatedComposer.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/PrefixReceivedComposer.java create mode 100644 Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/UserPrefixesComposer.java diff --git a/Emulator/sqlupdates/custom_prefixes_setup.sql b/Emulator/sqlupdates/custom_prefixes_setup.sql new file mode 100644 index 00000000..7d5b22c5 --- /dev/null +++ b/Emulator/sqlupdates/custom_prefixes_setup.sql @@ -0,0 +1,115 @@ +-- ============================================================ +-- Custom Prefix System - Complete Setup +-- ============================================================ + +-- 1. Main user prefixes table +CREATE TABLE IF NOT EXISTS `user_prefixes` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `user_id` INT(11) NOT NULL, + `text` VARCHAR(50) NOT NULL, + `color` VARCHAR(255) NOT NULL DEFAULT '#FFFFFF', + `icon` VARCHAR(50) NOT NULL DEFAULT '', + `effect` VARCHAR(50) NOT NULL DEFAULT '', + `active` TINYINT(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + INDEX `idx_user_id` (`user_id`), + INDEX `idx_user_active` (`user_id`, `active`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 2. Prefix settings table +CREATE TABLE IF NOT EXISTS `custom_prefix_settings` ( + `key_name` VARCHAR(100) NOT NULL, + `value` VARCHAR(255) NOT NULL, + PRIMARY KEY (`key_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Default settings +INSERT IGNORE INTO `custom_prefix_settings` (`key_name`, `value`) VALUES + ('max_length', '15'), + ('min_rank_to_buy', '1'), + ('price_credits', '5'), + ('price_points', '0'), + ('points_type', '0'); + +-- 3. Blacklisted words table +CREATE TABLE IF NOT EXISTS `custom_prefix_blacklist` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `word` VARCHAR(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_word` (`word`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Example blacklist entries (customize as needed) +INSERT IGNORE INTO `custom_prefix_blacklist` (`word`) VALUES + ('admin'), + ('staff'), + ('mod'), + ('owner'); + +-- 4. Add effect column (if table already exists without it) +-- ALTER TABLE `user_prefixes` ADD COLUMN IF NOT EXISTS `effect` VARCHAR(50) NOT NULL DEFAULT '' AFTER `icon`; + +-- ============================================================ +-- Catalog page for custom prefixes +-- ============================================================ +-- NOTE: Adjust parent_id to match your catalog parent category ID. +-- Example: parent_id = -1 for root, or the ID of your "Extra" / "Specials" category + +INSERT INTO `catalog_pages` ( + `parent_id`, `caption`, `caption_save`, `icon_image`, `visible`, `enabled`, + `min_rank`, `page_layout`, `page_strings_1`, `page_strings_2` +) VALUES ( + -1, + 'Custom Prefix', + 'custom_prefix', + 1, + 1, + 1, + 1, + 'custom_prefix', + 'Create your own custom prefix!\rChoose text, colors, icon and effects to stand out in chat.', + '' +); + +-- ============================================================ +-- Command texts (insert into emulator_texts if not present) +-- ============================================================ +INSERT IGNORE INTO `emulator_texts` (`key`, `value`) VALUES + -- GivePrefix command + ('commands.keys.cmd_give_prefix', 'giveprefix'), + ('commands.error.cmd_give_prefix.usage', 'Usage: :giveprefix [icon] [effect]'), + ('commands.error.cmd_give_prefix.invalid_color', 'Invalid color format. Use hex format (#FF0000).'), + ('commands.error.cmd_give_prefix.too_long', 'Prefix text is too long (max 15 characters).'), + ('commands.error.cmd_give_prefix.user_not_found', 'User not found or not online.'), + ('commands.succes.cmd_give_prefix', 'Prefix {%prefix%} successfully given to %user%!'), + -- ListPrefixes command + ('commands.keys.cmd_list_prefixes', 'listprefixes'), + ('commands.error.cmd_list_prefixes.usage', 'Usage: :listprefixes '), + ('commands.error.cmd_list_prefixes.user_not_found', 'User not found or not online.'), + ('commands.succes.cmd_list_prefixes.header', 'Prefixes of %user%:'), + ('commands.succes.cmd_list_prefixes.empty', '%user% has no prefixes.'), + -- RemovePrefix command + ('commands.keys.cmd_remove_prefix', 'removeprefix'), + ('commands.error.cmd_remove_prefix.usage', 'Usage: :removeprefix '), + ('commands.error.cmd_remove_prefix.user_not_found', 'User not found or not online.'), + ('commands.error.cmd_remove_prefix.invalid_id', 'Invalid prefix ID. Must be a number or "all".'), + ('commands.error.cmd_remove_prefix.not_found', 'Prefix not found for this user.'), + ('commands.succes.cmd_remove_prefix', 'Prefix #%id% removed from %user%.'), + ('commands.succes.cmd_remove_prefix.all', 'All prefixes removed from %user%.'), + -- PrefixBlacklist command + ('commands.keys.cmd_prefix_blacklist', 'prefixblacklist'), + ('commands.error.cmd_prefix_blacklist.usage', 'Usage: :prefixblacklist [word]'), + ('commands.error.cmd_prefix_blacklist.empty_word', 'Word cannot be empty.'), + ('commands.succes.cmd_prefix_blacklist.header', 'Blacklisted prefix words:'), + ('commands.succes.cmd_prefix_blacklist.empty', 'No blacklisted words.'), + ('commands.succes.cmd_prefix_blacklist.added', 'Word "%word%" added to prefix blacklist.'), + ('commands.succes.cmd_prefix_blacklist.removed', 'Word "%word%" removed from prefix blacklist.'); + +-- ============================================================ +-- Permissions for prefix commands (add to permissions table) +-- ============================================================ +INSERT IGNORE INTO `permissions` (`id`, `rank_id`, `permission_name`, `setting_type`) VALUES + (NULL, 7, 'cmd_give_prefix', '1'), + (NULL, 7, 'cmd_list_prefixes', '1'), + (NULL, 7, 'cmd_remove_prefix', '1'), + (NULL, 7, 'cmd_prefix_blacklist', '1'); diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java index d68cec11..643b3f44 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java @@ -173,6 +173,9 @@ public class CatalogManager { case mad_money: this.put(layout.name().toLowerCase(), MadMoneyLayout.class); break; + case custom_prefix: + this.put(layout.name().toLowerCase(), CustomPrefixLayout.class); + break; case default_3x3: default: this.put("default_3x3", Default_3x3Layout.class); diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java index ff6d01aa..f0456c1c 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogPageLayouts.java @@ -43,5 +43,6 @@ public enum CatalogPageLayouts { builders_club_loyalty, monkey, niko, - mad_money + mad_money, + custom_prefix } diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CustomPrefixLayout.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CustomPrefixLayout.java new file mode 100644 index 00000000..8152b89c --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/layouts/CustomPrefixLayout.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 CustomPrefixLayout extends CatalogPage { + + public CustomPrefixLayout(ResultSet set) throws SQLException { + super(set); + } + + @Override + public void serialize(ServerMessage message) { + message.appendString("custom_prefix"); + 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/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java index 956b0430..bd2a1f2d 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/CommandHandler.java @@ -297,6 +297,10 @@ public class CommandHandler { addCommand(new SoftKickCommand()); addCommand(new SubscriptionCommand()); addCommand(new UpdateChatBubblesCommand()); + addCommand(new GivePrefixCommand()); + addCommand(new ListPrefixesCommand()); + addCommand(new RemovePrefixCommand()); + addCommand(new PrefixBlacklistCommand()); addCommand(new TestCommand()); } diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/GivePrefixCommand.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/GivePrefixCommand.java new file mode 100644 index 00000000..eba65376 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/GivePrefixCommand.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.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.outgoing.inventory.prefixes.PrefixReceivedComposer; +import com.eu.habbo.messages.outgoing.inventory.prefixes.UserPrefixesComposer; + +public class GivePrefixCommand extends Command { + public GivePrefixCommand() { + super("cmd_give_prefix", Emulator.getTexts().getValue("commands.keys.cmd_give_prefix").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception { + if (params.length < 4) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_prefix.usage"), RoomChatMessageBubbles.ALERT); + return true; + } + + String targetName = params[1]; + String text = params[2]; + String color = params[3]; + String icon = params.length > 4 ? params[4] : ""; + String effect = params.length > 5 ? params[5] : ""; + + // Validate color + String[] colorParts = color.split(","); + for (String part : colorParts) { + if (!part.matches("^#[0-9A-Fa-f]{6}$")) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_prefix.invalid_color"), RoomChatMessageBubbles.ALERT); + return true; + } + } + + if (text.length() > 15) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_prefix.too_long"), RoomChatMessageBubbles.ALERT); + return true; + } + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(targetName); + + if (target == null) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_give_prefix.user_not_found"), RoomChatMessageBubbles.ALERT); + return true; + } + + UserPrefix prefix = new UserPrefix(target.getHabboInfo().getId(), text, color, icon, effect); + prefix.run(); + target.getInventory().getPrefixesComponent().addPrefix(prefix); + + target.getClient().sendResponse(new PrefixReceivedComposer(prefix)); + target.getClient().sendResponse(new UserPrefixesComposer(target)); + + gameClient.getHabbo().whisper( + Emulator.getTexts().getValue("commands.succes.cmd_give_prefix") + .replace("%user%", targetName) + .replace("%prefix%", text), + RoomChatMessageBubbles.ALERT + ); + + return true; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/ListPrefixesCommand.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/ListPrefixesCommand.java new file mode 100644 index 00000000..caa78b6e --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/ListPrefixesCommand.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.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.UserPrefix; + +import java.util.List; + +public class ListPrefixesCommand extends Command { + public ListPrefixesCommand() { + super("cmd_list_prefixes", Emulator.getTexts().getValue("commands.keys.cmd_list_prefixes").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception { + if (params.length < 2) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_list_prefixes.usage"), RoomChatMessageBubbles.ALERT); + return true; + } + + String targetName = params[1]; + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(targetName); + + if (target == null) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_list_prefixes.user_not_found"), RoomChatMessageBubbles.ALERT); + return true; + } + + List prefixes = target.getInventory().getPrefixesComponent().getPrefixes(); + + if (prefixes.isEmpty()) { + gameClient.getHabbo().whisper( + Emulator.getTexts().getValue("commands.succes.cmd_list_prefixes.empty").replace("%user%", targetName), + RoomChatMessageBubbles.ALERT + ); + return true; + } + + StringBuilder sb = new StringBuilder(); + sb.append(Emulator.getTexts().getValue("commands.succes.cmd_list_prefixes.header").replace("%user%", targetName)).append("\r"); + + for (UserPrefix prefix : prefixes) { + sb.append("ID: ").append(prefix.getId()) + .append(" | {").append(prefix.getText()).append("}") + .append(" | Color: ").append(prefix.getColor()) + .append(prefix.getIcon().isEmpty() ? "" : " | Icon: " + prefix.getIcon()) + .append(prefix.getEffect().isEmpty() ? "" : " | Effect: " + prefix.getEffect()) + .append(prefix.isActive() ? " [ACTIVE]" : "") + .append("\r"); + } + + gameClient.getHabbo().whisper(sb.toString(), RoomChatMessageBubbles.ALERT); + + return true; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/PrefixBlacklistCommand.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/PrefixBlacklistCommand.java new file mode 100644 index 00000000..dc8bbd69 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/PrefixBlacklistCommand.java @@ -0,0 +1,98 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PrefixBlacklistCommand extends Command { + private static final Logger LOGGER = LoggerFactory.getLogger(PrefixBlacklistCommand.class); + + public PrefixBlacklistCommand() { + super("cmd_prefix_blacklist", Emulator.getTexts().getValue("commands.keys.cmd_prefix_blacklist").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception { + if (params.length < 2) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_prefix_blacklist.usage"), RoomChatMessageBubbles.ALERT); + return true; + } + + String action = params[1].toLowerCase(); + + if (action.equals("list")) { + StringBuilder sb = new StringBuilder(); + sb.append(Emulator.getTexts().getValue("commands.succes.cmd_prefix_blacklist.header")).append("\r"); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT word FROM custom_prefix_blacklist ORDER BY word")) { + try (ResultSet set = statement.executeQuery()) { + int count = 0; + while (set.next()) { + sb.append("- ").append(set.getString("word")).append("\r"); + count++; + } + if (count == 0) { + sb.append(Emulator.getTexts().getValue("commands.succes.cmd_prefix_blacklist.empty")); + } + } + } catch (SQLException e) { + LOGGER.error("Error listing prefix blacklist", e); + } + + gameClient.getHabbo().whisper(sb.toString(), RoomChatMessageBubbles.ALERT); + return true; + } + + if (params.length < 3) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_prefix_blacklist.usage"), RoomChatMessageBubbles.ALERT); + return true; + } + + String word = params[2].toLowerCase().trim(); + + if (word.isEmpty()) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_prefix_blacklist.empty_word"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (action.equals("add")) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("INSERT INTO custom_prefix_blacklist (word) VALUES (?)")) { + statement.setString(1, word); + statement.execute(); + } catch (SQLException e) { + LOGGER.error("Error adding prefix blacklist word", e); + } + + gameClient.getHabbo().whisper( + Emulator.getTexts().getValue("commands.succes.cmd_prefix_blacklist.added").replace("%word%", word), + RoomChatMessageBubbles.ALERT + ); + } else if (action.equals("remove")) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("DELETE FROM custom_prefix_blacklist WHERE word = ?")) { + statement.setString(1, word); + statement.execute(); + } catch (SQLException e) { + LOGGER.error("Error removing prefix blacklist word", e); + } + + gameClient.getHabbo().whisper( + Emulator.getTexts().getValue("commands.succes.cmd_prefix_blacklist.removed").replace("%word%", word), + RoomChatMessageBubbles.ALERT + ); + } else { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_prefix_blacklist.usage"), RoomChatMessageBubbles.ALERT); + } + + return true; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/RemovePrefixCommand.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/RemovePrefixCommand.java new file mode 100644 index 00000000..9396d18d --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/commands/RemovePrefixCommand.java @@ -0,0 +1,81 @@ +package com.eu.habbo.habbohotel.commands; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.outgoing.inventory.prefixes.UserPrefixesComposer; + +import java.util.List; + +public class RemovePrefixCommand extends Command { + public RemovePrefixCommand() { + super("cmd_remove_prefix", Emulator.getTexts().getValue("commands.keys.cmd_remove_prefix").split(";")); + } + + @Override + public boolean handle(GameClient gameClient, String[] params) throws Exception { + if (params.length < 3) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_remove_prefix.usage"), RoomChatMessageBubbles.ALERT); + return true; + } + + String targetName = params[1]; + String prefixIdStr = params[2]; + + Habbo target = Emulator.getGameEnvironment().getHabboManager().getHabbo(targetName); + + if (target == null) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_remove_prefix.user_not_found"), RoomChatMessageBubbles.ALERT); + return true; + } + + if (prefixIdStr.equalsIgnoreCase("all")) { + List prefixes = target.getInventory().getPrefixesComponent().getPrefixes(); + for (UserPrefix prefix : prefixes) { + prefix.needsDelete(true); + Emulator.getThreading().run(prefix); + } + // Clear in-memory + for (UserPrefix prefix : prefixes) { + target.getInventory().getPrefixesComponent().removePrefix(prefix); + } + + target.getClient().sendResponse(new UserPrefixesComposer(target)); + + gameClient.getHabbo().whisper( + Emulator.getTexts().getValue("commands.succes.cmd_remove_prefix.all").replace("%user%", targetName), + RoomChatMessageBubbles.ALERT + ); + } else { + int prefixId; + try { + prefixId = Integer.parseInt(prefixIdStr); + } catch (NumberFormatException e) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_remove_prefix.invalid_id"), RoomChatMessageBubbles.ALERT); + return true; + } + + UserPrefix prefix = target.getInventory().getPrefixesComponent().getPrefix(prefixId); + + if (prefix == null) { + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.error.cmd_remove_prefix.not_found"), RoomChatMessageBubbles.ALERT); + return true; + } + + target.getInventory().getPrefixesComponent().removePrefix(prefix); + prefix.needsDelete(true); + Emulator.getThreading().run(prefix); + + target.getClient().sendResponse(new UserPrefixesComposer(target)); + + gameClient.getHabbo().whisper( + Emulator.getTexts().getValue("commands.succes.cmd_remove_prefix").replace("%user%", targetName).replace("%id%", String.valueOf(prefixId)), + RoomChatMessageBubbles.ALERT + ); + } + + return true; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java index ebd915b7..b6f83d43 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomChatMessage.java @@ -202,6 +202,25 @@ public class RoomChatMessage implements Runnable, ISerialize, DatabaseLoggable { message.appendInt(0); message.appendString(this.RoomChatColour); //Added packet for room chat message.appendInt(this.getMessage().length()); + + // Custom prefix data + String prefixText = ""; + String prefixColor = ""; + String prefixIcon = ""; + String prefixEffect = ""; + if (this.habbo != null && this.habbo.getInventory() != null && this.habbo.getInventory().getPrefixesComponent() != null) { + com.eu.habbo.habbohotel.users.UserPrefix activePrefix = this.habbo.getInventory().getPrefixesComponent().getActivePrefix(); + if (activePrefix != null) { + prefixText = activePrefix.getText(); + prefixColor = activePrefix.getColor(); + prefixIcon = activePrefix.getIcon(); + prefixEffect = activePrefix.getEffect(); + } + } + message.appendString(prefixText); + message.appendString(prefixColor); + message.appendString(prefixIcon); + message.appendString(prefixEffect); } catch (Exception e) { LOGGER.error("Caught exception", e); } diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java index 7eaf048d..6fdba07d 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboInventory.java @@ -22,6 +22,7 @@ public class HabboInventory { private EffectsComponent effectsComponent; private ItemsComponent itemsComponent; private PetsComponent petsComponent; + private PrefixesComponent prefixesComponent; public HabboInventory(Habbo habbo) { this.habbo = habbo; @@ -61,6 +62,12 @@ public class HabboInventory { LOGGER.error("Caught exception", e); } + try { + this.prefixesComponent = new PrefixesComponent(this.habbo); + } catch (Exception e) { + LOGGER.error("Caught exception", e); + } + this.items = MarketPlace.getOwnOffers(this.habbo); } @@ -112,6 +119,14 @@ public class HabboInventory { this.petsComponent = petsComponent; } + public PrefixesComponent getPrefixesComponent() { + return this.prefixesComponent; + } + + public void setPrefixesComponent(PrefixesComponent prefixesComponent) { + this.prefixesComponent = prefixesComponent; + } + public void dispose() { this.badgesComponent.dispose(); this.botsComponent.dispose(); @@ -119,6 +134,7 @@ public class HabboInventory { this.itemsComponent.dispose(); this.petsComponent.dispose(); this.wardrobeComponent.dispose(); + this.prefixesComponent.dispose(); this.badgesComponent = null; this.botsComponent = null; @@ -126,6 +142,7 @@ public class HabboInventory { this.itemsComponent = null; this.petsComponent = null; this.wardrobeComponent = null; + this.prefixesComponent = null; } public void addMarketplaceOffer(MarketPlaceOffer marketPlaceOffer) { diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/UserPrefix.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/UserPrefix.java new file mode 100644 index 00000000..6879d1be --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/UserPrefix.java @@ -0,0 +1,122 @@ +package com.eu.habbo.habbohotel.users; + +import com.eu.habbo.Emulator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.*; + +public class UserPrefix implements Runnable { + private static final Logger LOGGER = LoggerFactory.getLogger(UserPrefix.class); + + private int id; + private final int userId; + private String text; + private String color; + private String icon; + private String effect; + private boolean active; + private boolean needsInsert; + private boolean needsUpdate; + private boolean needsDelete; + + public UserPrefix(ResultSet set) throws SQLException { + this.id = set.getInt("id"); + this.userId = set.getInt("user_id"); + this.text = set.getString("text"); + this.color = set.getString("color"); + this.icon = set.getString("icon"); + if (this.icon == null) this.icon = ""; + this.effect = set.getString("effect"); + if (this.effect == null) this.effect = ""; + this.active = set.getBoolean("active"); + this.needsInsert = false; + this.needsUpdate = false; + this.needsDelete = false; + } + + public UserPrefix(int userId, String text, String color, String icon, String effect) { + this.id = 0; + this.userId = userId; + this.text = text; + this.color = color; + this.icon = icon != null ? icon : ""; + this.effect = effect != null ? effect : ""; + this.active = false; + this.needsInsert = true; + this.needsUpdate = false; + this.needsDelete = false; + } + + @Override + public void run() { + try { + if (this.needsInsert) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement( + "INSERT INTO user_prefixes (user_id, text, color, icon, effect, active) VALUES (?, ?, ?, ?, ?, ?)", + Statement.RETURN_GENERATED_KEYS)) { + statement.setInt(1, this.userId); + statement.setString(2, this.text); + statement.setString(3, this.color); + statement.setString(4, this.icon); + statement.setString(5, this.effect); + statement.setBoolean(6, this.active); + statement.execute(); + try (ResultSet set = statement.getGeneratedKeys()) { + if (set.next()) { + this.id = set.getInt(1); + } + } + } + this.needsInsert = false; + } else if (this.needsDelete) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement( + "DELETE FROM user_prefixes WHERE id = ? AND user_id = ?")) { + statement.setInt(1, this.id); + statement.setInt(2, this.userId); + statement.execute(); + } + this.needsDelete = false; + } else if (this.needsUpdate) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement( + "UPDATE user_prefixes SET text = ?, color = ?, icon = ?, effect = ?, active = ? WHERE id = ? AND user_id = ?")) { + statement.setString(1, this.text); + statement.setString(2, this.color); + statement.setString(3, this.icon); + statement.setString(4, this.effect); + statement.setBoolean(5, this.active); + statement.setInt(6, this.id); + statement.setInt(7, this.userId); + statement.execute(); + } + this.needsUpdate = false; + } + } catch (SQLException e) { + LOGGER.error("Caught SQL exception", e); + } + } + + public int getId() { return this.id; } + public int getUserId() { return this.userId; } + public String getText() { return this.text; } + public void setText(String text) { this.text = text; } + public String getColor() { return this.color; } + public void setColor(String color) { this.color = color; } + public String getIcon() { return this.icon; } + public void setIcon(String icon) { this.icon = icon != null ? icon : ""; } + public String getEffect() { return this.effect; } + public void setEffect(String effect) { this.effect = effect != null ? effect : ""; } + public boolean isActive() { return this.active; } + + public void setActive(boolean active) { + this.active = active; + this.needsUpdate = true; + } + + public void needsUpdate(boolean needsUpdate) { this.needsUpdate = needsUpdate; } + public void needsInsert(boolean needsInsert) { this.needsInsert = needsInsert; } + public void needsDelete(boolean needsDelete) { this.needsDelete = needsDelete; } +} diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/inventory/PrefixesComponent.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/inventory/PrefixesComponent.java new file mode 100644 index 00000000..28889ede --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/inventory/PrefixesComponent.java @@ -0,0 +1,105 @@ +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.UserPrefix; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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 PrefixesComponent { + private static final Logger LOGGER = LoggerFactory.getLogger(PrefixesComponent.class); + + private final List prefixes = new ArrayList<>(); + private final Habbo habbo; + + public PrefixesComponent(Habbo habbo) { + this.habbo = habbo; + this.loadPrefixes(); + } + + private void loadPrefixes() { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM user_prefixes WHERE user_id = ?")) { + statement.setInt(1, this.habbo.getHabboInfo().getId()); + try (ResultSet set = statement.executeQuery()) { + while (set.next()) { + this.prefixes.add(new UserPrefix(set)); + } + } + } catch (SQLException e) { + LOGGER.error("Caught SQL exception", e); + } + } + + public List getPrefixes() { + synchronized (this.prefixes) { + return new ArrayList<>(this.prefixes); + } + } + + public UserPrefix getActivePrefix() { + synchronized (this.prefixes) { + for (UserPrefix prefix : this.prefixes) { + if (prefix.isActive()) return prefix; + } + } + return null; + } + + public UserPrefix getPrefix(int id) { + synchronized (this.prefixes) { + for (UserPrefix prefix : this.prefixes) { + if (prefix.getId() == id) return prefix; + } + } + return null; + } + + public void addPrefix(UserPrefix prefix) { + synchronized (this.prefixes) { + this.prefixes.add(prefix); + } + } + + public void removePrefix(UserPrefix prefix) { + synchronized (this.prefixes) { + this.prefixes.remove(prefix); + } + } + + public void setActive(int prefixId) { + synchronized (this.prefixes) { + for (UserPrefix prefix : this.prefixes) { + boolean shouldBeActive = prefix.getId() == prefixId; + if (prefix.isActive() != shouldBeActive) { + prefix.setActive(shouldBeActive); + Emulator.getThreading().run(prefix); + } + } + } + } + + public void deactivateAll() { + synchronized (this.prefixes) { + for (UserPrefix prefix : this.prefixes) { + if (prefix.isActive()) { + prefix.setActive(false); + Emulator.getThreading().run(prefix); + } + } + } + } + + public void dispose() { + synchronized (this.prefixes) { + this.prefixes.clear(); + } + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java index 6bd33db3..02f11baa 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -34,6 +34,7 @@ import com.eu.habbo.messages.incoming.helper.MySanctionStatusEvent; import com.eu.habbo.messages.incoming.helper.RequestTalentTrackEvent; import com.eu.habbo.messages.incoming.hotelview.*; import com.eu.habbo.messages.incoming.inventory.*; +import com.eu.habbo.messages.incoming.inventory.prefixes.*; import com.eu.habbo.messages.incoming.modtool.*; import com.eu.habbo.messages.incoming.navigator.*; import com.eu.habbo.messages.incoming.polls.AnswerPollEvent; @@ -370,6 +371,12 @@ public class PacketManager { this.registerHandler(Incoming.RequestInventoryPetsEvent, RequestInventoryPetsEvent.class); this.registerHandler(Incoming.RequestInventoryPetDelete, RequestInventoryPetDelete.class); this.registerHandler(Incoming.RequestInventoryBadgeDelete, RequestInventoryBadgeDelete.class); + + // Custom Prefixes + this.registerHandler(Incoming.RequestUserPrefixesEvent, RequestUserPrefixesEvent.class); + this.registerHandler(Incoming.SetActivePrefixEvent, SetActivePrefixEvent.class); + this.registerHandler(Incoming.DeletePrefixEvent, DeletePrefixEvent.class); + this.registerHandler(Incoming.PurchasePrefixEvent, PurchasePrefixEvent.class); } void registerRooms() throws Exception { diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java index 8c9625e7..f0d2c76c 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java @@ -409,4 +409,10 @@ public class Incoming { public static final int UpdateFurniturePositionEvent = 10019; public static final int RequestInventoryPetDelete = 10030; public static final int RequestInventoryBadgeDelete = 10031; + + // Custom Prefixes + public static final int RequestUserPrefixesEvent = 7011; + public static final int SetActivePrefixEvent = 7012; + public static final int DeletePrefixEvent = 7013; + public static final int PurchasePrefixEvent = 7014; } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/DeletePrefixEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/DeletePrefixEvent.java new file mode 100644 index 00000000..7cac1bf1 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/DeletePrefixEvent.java @@ -0,0 +1,23 @@ +package com.eu.habbo.messages.incoming.inventory.prefixes; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.prefixes.UserPrefixesComposer; + +public class DeletePrefixEvent extends MessageHandler { + @Override + public void handle() throws Exception { + int prefixId = this.packet.readInt(); + + UserPrefix prefix = this.client.getHabbo().getInventory().getPrefixesComponent().getPrefix(prefixId); + + if (prefix == null) return; + + this.client.getHabbo().getInventory().getPrefixesComponent().removePrefix(prefix); + prefix.needsDelete(true); + Emulator.getThreading().run(prefix); + + this.client.sendResponse(new UserPrefixesComposer(this.client.getHabbo())); + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/PurchasePrefixEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/PurchasePrefixEvent.java new file mode 100644 index 00000000..8e04000f --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/PurchasePrefixEvent.java @@ -0,0 +1,145 @@ +package com.eu.habbo.messages.incoming.inventory.prefixes; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; +import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertComposer; +import com.eu.habbo.messages.outgoing.inventory.prefixes.PrefixReceivedComposer; +import com.eu.habbo.messages.outgoing.users.UserCreditsComposer; +import com.eu.habbo.messages.outgoing.users.UserCurrencyComposer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PurchasePrefixEvent extends MessageHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(PurchasePrefixEvent.class); + + @Override + public int getRatelimit() { + return 500; + } + + @Override + public void handle() throws Exception { + String text = this.packet.readString(); + String color = this.packet.readString(); + String icon = this.packet.readString(); + String effect = this.packet.readString(); + + Habbo habbo = this.client.getHabbo(); + + if (habbo == null) return; + + // Load settings + int maxLength = getSettingInt("max_length", 15); + int minRank = getSettingInt("min_rank_to_buy", 1); + int priceCredits = getSettingInt("price_credits", 5); + int pricePoints = getSettingInt("price_points", 0); + int pointsType = getSettingInt("points_type", 0); + + // Validate text + text = text.trim(); + + if (text.isEmpty() || text.length() > maxLength) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, "Prefix text is invalid or too long (max " + maxLength + " characters).")); + return; + } + + // Validate color (single hex or comma-separated multi hex for per-letter colors) + String[] colorParts = color.split(","); + for (String part : colorParts) { + if (!part.matches("^#[0-9A-Fa-f]{6}$")) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, "Invalid color format.")); + return; + } + } + + // Check rank + if (habbo.getHabboInfo().getRank().getId() < minRank) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, "Your rank is too low to purchase prefixes.")); + return; + } + + // Check blacklist + if (isBlacklisted(text)) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, "This prefix contains a blocked word.")); + return; + } + + // Check credits + if (priceCredits > 0 && habbo.getHabboInfo().getCredits() < priceCredits) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, "Not enough credits.")); + return; + } + + // Check points + if (pricePoints > 0 && habbo.getHabboInfo().getCurrencyAmount(pointsType) < pricePoints) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, "Not enough points.")); + return; + } + + // Deduct currency + if (priceCredits > 0) { + habbo.getHabboInfo().addCredits(-priceCredits); + this.client.sendResponse(new UserCreditsComposer(habbo)); + } + + if (pricePoints > 0) { + habbo.getHabboInfo().addCurrencyAmount(pointsType, -pricePoints); + this.client.sendResponse(new UserCurrencyComposer(habbo)); + } + + // Validate icon (allow empty or known icon names) + if (icon == null) icon = ""; + icon = icon.trim(); + + // Validate effect + if (effect == null) effect = ""; + effect = effect.trim(); + + // Create prefix + UserPrefix prefix = new UserPrefix(habbo.getHabboInfo().getId(), text, color, icon, effect); + prefix.run(); // Insert into DB synchronously to get the ID + habbo.getInventory().getPrefixesComponent().addPrefix(prefix); + + this.client.sendResponse(new PrefixReceivedComposer(prefix)); + } + + private int getSettingInt(String key, int defaultValue) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT `value` FROM custom_prefix_settings WHERE key_name = ?")) { + statement.setString(1, key); + try (ResultSet set = statement.executeQuery()) { + if (set.next()) { + return Integer.parseInt(set.getString("value")); + } + } + } catch (SQLException | NumberFormatException e) { + LOGGER.error("Error reading prefix setting: " + key, e); + } + return defaultValue; + } + + private boolean isBlacklisted(String text) { + String lowerText = text.toLowerCase(); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); + PreparedStatement statement = connection.prepareStatement("SELECT word FROM custom_prefix_blacklist")) { + try (ResultSet set = statement.executeQuery()) { + while (set.next()) { + if (lowerText.contains(set.getString("word").toLowerCase())) { + return true; + } + } + } + } catch (SQLException e) { + LOGGER.error("Error checking prefix blacklist", e); + } + return false; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/RequestUserPrefixesEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/RequestUserPrefixesEvent.java new file mode 100644 index 00000000..b3169f70 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/RequestUserPrefixesEvent.java @@ -0,0 +1,11 @@ +package com.eu.habbo.messages.incoming.inventory.prefixes; + +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.prefixes.UserPrefixesComposer; + +public class RequestUserPrefixesEvent extends MessageHandler { + @Override + public void handle() throws Exception { + this.client.sendResponse(new UserPrefixesComposer(this.client.getHabbo())); + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/SetActivePrefixEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/SetActivePrefixEvent.java new file mode 100644 index 00000000..9ec5710a --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/inventory/prefixes/SetActivePrefixEvent.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.incoming.inventory.prefixes; + +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.inventory.prefixes.ActivePrefixUpdatedComposer; + +public class SetActivePrefixEvent extends MessageHandler { + @Override + public void handle() throws Exception { + int prefixId = this.packet.readInt(); + + if (prefixId == 0) { + this.client.getHabbo().getInventory().getPrefixesComponent().deactivateAll(); + this.client.sendResponse(new ActivePrefixUpdatedComposer(null)); + return; + } + + UserPrefix prefix = this.client.getHabbo().getInventory().getPrefixesComponent().getPrefix(prefixId); + + if (prefix == null) return; + + this.client.getHabbo().getInventory().getPrefixesComponent().setActive(prefixId); + this.client.sendResponse(new ActivePrefixUpdatedComposer(prefix)); + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java index 173ec13f..b3cf8729 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java @@ -554,4 +554,9 @@ public class Outgoing { public static final int SnowStormUserRematchedComposer = 5029; + // Custom Prefixes + public static final int UserPrefixesComposer = 7001; + public static final int PrefixReceivedComposer = 7002; + public static final int ActivePrefixUpdatedComposer = 7003; + } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/ActivePrefixUpdatedComposer.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/ActivePrefixUpdatedComposer.java new file mode 100644 index 00000000..13017e93 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/ActivePrefixUpdatedComposer.java @@ -0,0 +1,35 @@ +package com.eu.habbo.messages.outgoing.inventory.prefixes; + +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class ActivePrefixUpdatedComposer extends MessageComposer { + private final UserPrefix prefix; + + public ActivePrefixUpdatedComposer(UserPrefix prefix) { + this.prefix = prefix; + } + + @Override + protected ServerMessage composeInternal() { + this.response.init(Outgoing.ActivePrefixUpdatedComposer); + + if (this.prefix != null) { + this.response.appendInt(this.prefix.getId()); + this.response.appendString(this.prefix.getText()); + this.response.appendString(this.prefix.getColor()); + this.response.appendString(this.prefix.getIcon()); + this.response.appendString(this.prefix.getEffect()); + } else { + this.response.appendInt(0); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendString(""); + this.response.appendString(""); + } + + return this.response; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/PrefixReceivedComposer.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/PrefixReceivedComposer.java new file mode 100644 index 00000000..98bdf055 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/PrefixReceivedComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.inventory.prefixes; + +import com.eu.habbo.habbohotel.users.UserPrefix; +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +public class PrefixReceivedComposer extends MessageComposer { + private final UserPrefix prefix; + + public PrefixReceivedComposer(UserPrefix prefix) { + this.prefix = prefix; + } + + @Override + protected ServerMessage composeInternal() { + this.response.init(Outgoing.PrefixReceivedComposer); + this.response.appendInt(this.prefix.getId()); + this.response.appendString(this.prefix.getText()); + this.response.appendString(this.prefix.getColor()); + this.response.appendString(this.prefix.getIcon()); + this.response.appendString(this.prefix.getEffect()); + return this.response; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/UserPrefixesComposer.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/UserPrefixesComposer.java new file mode 100644 index 00000000..747e63b6 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/inventory/prefixes/UserPrefixesComposer.java @@ -0,0 +1,38 @@ +package com.eu.habbo.messages.outgoing.inventory.prefixes; + +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.users.UserPrefix; +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 UserPrefixesComposer extends MessageComposer { + private final Habbo habbo; + + public UserPrefixesComposer(Habbo habbo) { + this.habbo = habbo; + } + + @Override + protected ServerMessage composeInternal() { + if (this.habbo == null) return null; + + List prefixes = this.habbo.getInventory().getPrefixesComponent().getPrefixes(); + + this.response.init(Outgoing.UserPrefixesComposer); + this.response.appendInt(prefixes.size()); + + for (UserPrefix prefix : prefixes) { + this.response.appendInt(prefix.getId()); + this.response.appendString(prefix.getText()); + this.response.appendString(prefix.getColor()); + this.response.appendString(prefix.getIcon()); + this.response.appendString(prefix.getEffect()); + this.response.appendInt(prefix.isActive() ? 1 : 0); + } + + return this.response; + } +}