From dc8c0e0bcb768a4b95f448488ee9192c36c1a2da Mon Sep 17 00:00:00 2001 From: Snaiker Date: Sun, 3 Jan 2021 21:58:43 +0000 Subject: [PATCH 01/23] Fix issue #934 --- src/main/java/com/eu/habbo/habbohotel/rooms/Room.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index d0704c82..b5e171dc 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -1506,6 +1506,11 @@ public class Room implements Comparable, ISerialize, Runnable { if (unit.hasStatus(RoomUnitStatus.SIT)) { unit.sitUpdate = true; } + + unit.setPreviousLocation(unit.getPreviousLocation()); + unit.setPreviousLocationZ(unit.getPreviousLocation().getStackHeight()); + unit.setCurrentLocation(this.getLayout().getTile(tile.x, tile.y)); + unit.setZ(unit.getCurrentLocation().getStackHeight()); } } From 5ef04f76dfaa073c6bbe65a575cd2a16ffa0c38b Mon Sep 17 00:00:00 2001 From: Harmonic Date: Sun, 10 Jan 2021 15:41:40 -0800 Subject: [PATCH 02/23] Missing sql update key. --- sqlupdates/2_4_0 to 3_0_BETA_1.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sqlupdates/2_4_0 to 3_0_BETA_1.sql b/sqlupdates/2_4_0 to 3_0_BETA_1.sql index 62e6d755..4dd304f6 100644 --- a/sqlupdates/2_4_0 to 3_0_BETA_1.sql +++ b/sqlupdates/2_4_0 to 3_0_BETA_1.sql @@ -126,3 +126,7 @@ INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('commands.description.cmd_ -- Making items.wired_data column bigger since wired data is saved as JSON now ALTER TABLE `items` MODIFY COLUMN `wired_data` varchar(10000) +-- Mute area sqls +INSERT INTO `emulator_settings`(`key`, `value`) VALUES ('room.chat.mutearea.allow_whisper', 'false'); + + From d7e96d94753dfc7f1f16bdcfc5e8b7ffcb5bff9b Mon Sep 17 00:00:00 2001 From: Remco Date: Tue, 2 Feb 2021 18:18:08 +0100 Subject: [PATCH 03/23] Mannequin save look event now checks for acc_anyroomowner --- .../incoming/rooms/items/MannequinSaveLookEvent.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 index 5def4dee..4e46eb30 100644 --- 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 @@ -1,16 +1,19 @@ package com.eu.habbo.messages.incoming.rooms.items; import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.permissions.Permission; 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; public class MannequinSaveLookEvent extends MessageHandler { @Override public void handle() throws Exception { - Room room = this.client.getHabbo().getHabboInfo().getCurrentRoom(); + Habbo habbo = this.client.getHabbo(); + Room room = habbo.getHabboInfo().getCurrentRoom(); - if (room == null || this.client.getHabbo().getHabboInfo().getId() != room.getOwnerId()) + if (room == null || !room.isOwner(habbo)) return; HabboItem item = room.getHabboItem(this.packet.readInt()); From 4c096ae8d14c5a951ac707bf78242b17c113a19b Mon Sep 17 00:00:00 2001 From: Remco Date: Tue, 2 Feb 2021 18:21:02 +0100 Subject: [PATCH 04/23] Mannequin save look event now checks for acc_anyroomowner --- .../incoming/rooms/items/MannequinSaveLookEvent.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 index 4e46eb30..6713af89 100644 --- 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 @@ -1,7 +1,6 @@ package com.eu.habbo.messages.incoming.rooms.items; import com.eu.habbo.Emulator; -import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboItem; @@ -25,7 +24,7 @@ public class MannequinSaveLookEvent extends MessageHandler { StringBuilder look = new StringBuilder(); - for (String s : this.client.getHabbo().getHabboInfo().getLook().split("\\.")) { + for (String s : habbo.getHabboInfo().getLook().split("\\.")) { if (!s.contains("hr") && !s.contains("hd") && !s.contains("he") && !s.contains("ea") && !s.contains("ha") && !s.contains("fa")) { look.append(s).append("."); } @@ -36,9 +35,9 @@ public class MannequinSaveLookEvent extends MessageHandler { } if (data.length == 3) { - item.setExtradata(this.client.getHabbo().getHabboInfo().getGender().name().toLowerCase() + ":" + look + ":" + data[2]); + item.setExtradata(habbo.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.setExtradata(habbo.getHabboInfo().getGender().name().toLowerCase() + ":" + look + ":" + habbo.getHabboInfo().getUsername() + "'s look."); } item.needsUpdate(true); From 2bb55a8e3897cba3a65121ea86c1aa0460410a02 Mon Sep 17 00:00:00 2001 From: Remco Date: Wed, 3 Feb 2021 17:53:00 +0100 Subject: [PATCH 05/23] MannequinSaveNameEvent now checks for acc_anyroomowner --- .../messages/incoming/rooms/items/MannequinSaveNameEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 7715ffd2..ad09fc3c 100644 --- 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 @@ -9,7 +9,7 @@ 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()) + if (room == null || !room.isOwner(this.client.getHabbo())) return; HabboItem item = room.getHabboItem(this.packet.readInt()); From 35f81f96c4eb5f7b373198fc6e81d21dd96b0b1d Mon Sep 17 00:00:00 2001 From: Dank074 Date: Wed, 3 Feb 2021 19:16:50 -0600 Subject: [PATCH 06/23] fix ban behavior for empty machine id/ip address --- .../eu/habbo/habbohotel/modtool/ModToolManager.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java index 9dbd405a..9bb9f5da 100644 --- a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java @@ -428,6 +428,16 @@ public class ModToolManager { return bans; } + //if machine id is empty, downgrade ban type to IP ban + if( (type == ModToolBanType.MACHINE || type == ModToolBanType.SUPER) && (offlineInfo == null || offlineInfo.getMachineID().isEmpty())) { + type = ModToolBanType.IP; + } + + //if ip address is empty, downgrade ban type to account ban + if( (type == ModToolBanType.IP || type == ModToolBanType.SUPER) && (offlineInfo == null || offlineInfo.getIpLogin().isEmpty())) { + type = ModToolBanType.ACCOUNT; + } + 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); From 8ad3aeb6b20fe3f143750ae06c308b6cdd9ed898 Mon Sep 17 00:00:00 2001 From: Remco Date: Thu, 4 Feb 2021 19:59:16 +0100 Subject: [PATCH 07/23] Fixed game timer threading issue --- .../games/InteractionGameTimer.java | 60 +++++++++---------- .../threading/runnables/games/GameTimer.java | 46 ++++++++++++++ 2 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/eu/habbo/threading/runnables/games/GameTimer.java 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 index 1f7396e9..bb868c6d 100644 --- 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 @@ -14,6 +14,7 @@ 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 com.eu.habbo.threading.runnables.games.GameTimer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,7 +64,7 @@ public class InteractionGameTimer extends HabboItem implements Runnable { String[] data = set.getString("extra_data").split("\t"); if (data.length >= 2) { - this.baseTime = Integer.valueOf(data[1]); + this.baseTime = Integer.parseInt(data[1]); this.timeNow = this.baseTime; } @@ -149,33 +150,6 @@ public class InteractionGameTimer extends HabboItem implements Runnable { if (this.needsUpdate() || this.needsDelete()) { super.run(); } - - if (this.getRoomId() == 0) { - this.threadActive = false; - return; - } - - Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.getRoomId()); - - if (room == null || !this.isRunning || this.isPaused) { - this.threadActive = false; - return; - } - - this.timeNow--; - if (this.timeNow < 0) this.timeNow = 0; - - if (this.timeNow > 0) { - this.threadActive = true; - Emulator.getThreading().run(this, 1000); - } else { - this.threadActive = false; - this.timeNow = 0; - this.endGame(room); - WiredHandler.handle(WiredTriggerType.GAME_ENDS, null, room, new Object[]{}); - } - - room.updateItem(this); } @Override @@ -248,7 +222,7 @@ public class InteractionGameTimer extends HabboItem implements Runnable { if (!this.threadActive) { this.threadActive = true; - Emulator.getThreading().run(this, 1000); + Emulator.getThreading().run(new GameTimer(this), 1000); } } else if (client != null) { if (!(room.hasRights(client.getHabbo()) || client.getHabbo().hasPermission(Permission.ACC_ANYROOMOWNER))) @@ -271,7 +245,7 @@ public class InteractionGameTimer extends HabboItem implements Runnable { if (!this.threadActive) { this.threadActive = true; - Emulator.getThreading().run(this); + Emulator.getThreading().run(new GameTimer(this)); } } } else { @@ -285,7 +259,7 @@ public class InteractionGameTimer extends HabboItem implements Runnable { if (!this.threadActive) { this.threadActive = true; - Emulator.getThreading().run(this, 1000); + Emulator.getThreading().run(new GameTimer(this), 1000); } } @@ -350,10 +324,30 @@ public class InteractionGameTimer extends HabboItem implements Runnable { } public boolean isRunning() { - return isRunning; + return this.isRunning; } public void setRunning(boolean running) { - isRunning = running; + this.isRunning = running; + } + + public void setThreadActive(boolean threadActive) { + this.threadActive = threadActive; + } + + public boolean isPaused() { + return this.isPaused; + } + + public void reduceTime() { + this.timeNow--; + } + + public int getTimeNow() { + return this.timeNow; + } + + public void setTimeNow(int timeNow) { + this.timeNow = timeNow; } } diff --git a/src/main/java/com/eu/habbo/threading/runnables/games/GameTimer.java b/src/main/java/com/eu/habbo/threading/runnables/games/GameTimer.java new file mode 100644 index 00000000..f1e903e7 --- /dev/null +++ b/src/main/java/com/eu/habbo/threading/runnables/games/GameTimer.java @@ -0,0 +1,46 @@ +package com.eu.habbo.threading.runnables.games; + +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; + +public class GameTimer implements Runnable { + + private final InteractionGameTimer timer; + + public GameTimer(InteractionGameTimer timer) { + this.timer = timer; + } + + @Override + public void run() { + if (timer.getRoomId() == 0) { + timer.setRunning(false); + return; + } + + Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(timer.getRoomId()); + + if (room == null || !timer.isRunning() || timer.isPaused()) { + timer.setThreadActive(false); + return; + } + + timer.reduceTime(); + if (timer.getTimeNow() < 0) timer.setTimeNow(0); + + if (timer.getTimeNow() > 0) { + timer.setThreadActive(true); + Emulator.getThreading().run(this, 1000); + } else { + timer.setThreadActive(false); + timer.setTimeNow(0); + timer.endGame(room); + WiredHandler.handle(WiredTriggerType.GAME_ENDS, null, room, new Object[]{}); + } + + room.updateItem(timer); + } +} From f527527787feec0751cf90ec1eaf90d2e8da4b10 Mon Sep 17 00:00:00 2001 From: Remco Date: Thu, 4 Feb 2021 21:05:38 +0100 Subject: [PATCH 08/23] Gifting yourself won't progress achievements anymore --- .../incoming/catalog/CatalogBuyItemAsGiftEvent.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 index 7504c50a..13ffb72a 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemAsGiftEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/CatalogBuyItemAsGiftEvent.java @@ -336,7 +336,10 @@ public class CatalogBuyItemAsGiftEvent extends MessageHandler { return; } - AchievementManager.progressAchievement(this.client.getHabbo(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("GiftGiver")); + if (this.client.getHabbo().getHabboInfo().getId() != userId) { + 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); @@ -351,7 +354,9 @@ public class CatalogBuyItemAsGiftEvent extends MessageHandler { habbo.getClient().sendResponse(new BubbleAlertComposer(BubbleAlertKeys.RECEIVED_BADGE.key, keys)); } - AchievementManager.progressAchievement(userId, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GiftReceiver")); + if (this.client.getHabbo().getHabboInfo().getId() != userId) { + AchievementManager.progressAchievement(userId, Emulator.getGameEnvironment().getAchievementManager().getAchievement("GiftReceiver")); + } if (!this.client.getHabbo().hasPermission(Permission.ACC_INFINITE_CREDITS)) { if (totalCredits > 0) { From 0bbe249cee778eac72f5825a02d7085b3139a8ab Mon Sep 17 00:00:00 2001 From: Dank074 Date: Tue, 9 Feb 2021 01:35:43 -0600 Subject: [PATCH 09/23] fixed pinging to send every 30 seconds, regardless of idle state --- .../networking/gameserver/GameServer.java | 5 +- .../handlers/IdleTimeoutHandler.java | 139 ++++++++++++++++-- 2 files changed, 124 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java b/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java index 3aa20998..98647cc7 100644 --- a/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java +++ b/src/main/java/com/eu/habbo/networking/gameserver/GameServer.java @@ -32,9 +32,6 @@ public class GameServer extends Server { public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast("logger", new LoggingHandler()); - ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(60, 30, 0)); - ch.pipeline().addAfter("idleStateHandler", "idleEventHandler", new IdleTimeoutHandler()); - // Decoders. ch.pipeline().addLast(new GamePolicyDecoder()); ch.pipeline().addLast(new GameByteFrameDecoder()); @@ -43,7 +40,7 @@ public class GameServer extends Server { if (PacketManager.DEBUG_SHOW_PACKETS) { ch.pipeline().addLast(new GameClientMessageLogger()); } - + ch.pipeline().addLast("idleEventHandler", new IdleTimeoutHandler(30, 60)); ch.pipeline().addLast(new GameMessageRateLimit()); ch.pipeline().addLast(new GameMessageHandler()); diff --git a/src/main/java/com/eu/habbo/networking/gameserver/handlers/IdleTimeoutHandler.java b/src/main/java/com/eu/habbo/networking/gameserver/handlers/IdleTimeoutHandler.java index 46bb4c14..26c55666 100644 --- a/src/main/java/com/eu/habbo/networking/gameserver/handlers/IdleTimeoutHandler.java +++ b/src/main/java/com/eu/habbo/networking/gameserver/handlers/IdleTimeoutHandler.java @@ -1,29 +1,136 @@ package com.eu.habbo.networking.gameserver.handlers; import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.messages.ClientMessage; +import com.eu.habbo.messages.incoming.Incoming; import com.eu.habbo.messages.outgoing.handshake.PingComposer; import com.eu.habbo.networking.gameserver.GameServerAttributes; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; + +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; public class IdleTimeoutHandler extends ChannelDuplexHandler { - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (evt instanceof IdleStateEvent) { - IdleStateEvent e = (IdleStateEvent) evt; - if (e.state() == IdleState.READER_IDLE) { - ctx.close(); - } else if (e.state() == IdleState.WRITER_IDLE) { - GameClient client = ctx.channel().attr(GameServerAttributes.CLIENT).get(); - if (client != null) { - client.sendResponse(new PingComposer()); - } - } - } else { - super.userEventTriggered(ctx, evt); + private static final long MIN_TIMEOUT_NANOS = TimeUnit.MILLISECONDS.toNanos(1); + + private final long pingScheduleNanos; + private final long pongTimeoutNanos; + + volatile ScheduledFuture pingScheduleFuture; + volatile long lastPongTime;// in nanoseconds + + private volatile int state; // 0 - none, 1 - initialized, 2 - destroyed + + public IdleTimeoutHandler(int pingScheduleSeconds, int pongTimeoutSeconds) { + this.pingScheduleNanos = Math.max(MIN_TIMEOUT_NANOS, TimeUnit.SECONDS.toNanos(pingScheduleSeconds)); + this.pongTimeoutNanos = Math.max(MIN_TIMEOUT_NANOS, TimeUnit.SECONDS.toNanos(pongTimeoutSeconds)); + } + + private void initialize(ChannelHandlerContext ctx) { + // Avoid the case where destroy() is called before scheduling timeouts. + // See: https://github.com/netty/netty/issues/143 + switch (state) { + case 1: + case 2: + return; + } + + state = 1; + + lastPongTime = System.nanoTime(); + if (pingScheduleNanos > 0) { + pingScheduleFuture = ctx.executor().schedule(new PingScheduledTask(ctx), pingScheduleNanos, TimeUnit.NANOSECONDS); } } + private void destroy() { + state = 2; + + if (pingScheduleFuture != null) { + pingScheduleFuture.cancel(false); + pingScheduleFuture = null; + } + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + if (ctx.channel().isActive() && ctx.channel().isRegistered()) { + // channelActvie() event has been fired already, which means this.channelActive() will + // not be invoked. We have to initialize here instead. + initialize(ctx); + } else { + // channelActive() event has not been fired yet. this.channelActive() will be invoked + // and initialization will occur there. + } + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + destroy(); + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + // Initialize early if channel is active already. + if (ctx.channel().isActive()) { + initialize(ctx); + } + super.channelRegistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + // This method will be invoked only if this handler was added + // before channelActive() event is fired. If a user adds this handler + // after the channelActive() event, initialize() will be called by beforeAdd(). + initialize(ctx); + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + destroy(); + super.channelInactive(ctx); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + // check if its a pong message + if(msg instanceof ClientMessage) { + ClientMessage packet = (ClientMessage) msg; + if(packet.getMessageId() == Incoming.PongEvent) { + this.lastPongTime = System.nanoTime(); + } + } + super.channelRead(ctx, msg); + } + + private final class PingScheduledTask implements Runnable { + private final ChannelHandlerContext ctx; + + public PingScheduledTask(ChannelHandlerContext ctx) { + this.ctx = ctx; + } + + @Override + public void run() { + if (!ctx.channel().isOpen()) { + return; + } + + long currentTime = System.nanoTime(); + if(currentTime - lastPongTime > pongTimeoutNanos) { + ctx.close();// add a promise here ? + return; + } + + GameClient client = ctx.channel().attr(GameServerAttributes.CLIENT).get(); + if (client != null) { + client.sendResponse(new PingComposer()); + } + + pingScheduleFuture = ctx.executor().schedule(this, pingScheduleNanos, TimeUnit.NANOSECONDS); + } + } } From 926e817e4f58c26790eb6d16f1c289f422876488 Mon Sep 17 00:00:00 2001 From: Remco Date: Tue, 9 Feb 2021 10:42:09 -0500 Subject: [PATCH 10/23] Revert "Merge branch 'Snaiker/Arcturus-Community-patch-fix-issue-934' into dev" This reverts merge request !362 --- src/main/java/com/eu/habbo/habbohotel/rooms/Room.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index 79236ec3..58321d7d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -1514,11 +1514,6 @@ public class Room implements Comparable, ISerialize, Runnable { if (unit.hasStatus(RoomUnitStatus.SIT)) { unit.sitUpdate = true; } - - unit.setPreviousLocation(unit.getPreviousLocation()); - unit.setPreviousLocationZ(unit.getPreviousLocation().getStackHeight()); - unit.setCurrentLocation(this.getLayout().getTile(tile.x, tile.y)); - unit.setZ(unit.getCurrentLocation().getStackHeight()); } } From e9e96a0c116be3a6adb4a0ee3b2b87517ddca328 Mon Sep 17 00:00:00 2001 From: Thijmen Date: Tue, 9 Feb 2021 17:03:25 -0500 Subject: [PATCH 11/23] Don't do calculation server side - client relies on the amount of days the offer needs to have. --- .../eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 13e4bfc6..e45b4822 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/catalog/ClubGiftsComposer.java @@ -55,7 +55,7 @@ public class ClubGiftsComposer extends MessageComposer { this.response.appendInt(item.getId()); this.response.appendBoolean(item.isClubOnly()); - this.response.appendInt(Math.max(daysRequired - daysAsHc, 0)); + this.response.appendInt(daysRequired); this.response.appendBoolean(daysRequired <= daysAsHc); } } else { From 3c18b060cc754c98297c29b33bfb4877c9698996 Mon Sep 17 00:00:00 2001 From: Harmonic Date: Wed, 10 Feb 2021 19:03:52 +0000 Subject: [PATCH 12/23] Updated HC Badge Achievement so it no longer requires payday to be enabled. --- .../subscriptions/SubscriptionHabboClub.java | 100 ++++++++++-------- .../incoming/handshake/SecureLoginEvent.java | 2 + 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/users/subscriptions/SubscriptionHabboClub.java b/src/main/java/com/eu/habbo/habbohotel/users/subscriptions/SubscriptionHabboClub.java index f0b1692b..66c3d041 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/subscriptions/SubscriptionHabboClub.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/subscriptions/SubscriptionHabboClub.java @@ -78,16 +78,18 @@ public class SubscriptionHabboClub extends Subscription { progressAchievement(habboInfo); Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()); - if(habbo != null && habbo.getClient() != null) { + if (habbo != null && habbo.getClient() != null) { - if(habbo.getHabboStats().getRemainingClubGifts() > 0) { + if (habbo.getHabboStats().getRemainingClubGifts() > 0) { habbo.getClient().sendResponse(new PickMonthlyClubGiftNotificationComposer(habbo.getHabboStats().getRemainingClubGifts())); } - if((Emulator.getIntUnixTimestamp() - habbo.getHabboStats().hcMessageLastModified) < 60) { - Emulator.getThreading().run(() -> { habbo.getClient().sendResponse(new UserClubComposer(habbo)); habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); }, (Emulator.getIntUnixTimestamp() - habbo.getHabboStats().hcMessageLastModified)); - } - else { + if ((Emulator.getIntUnixTimestamp() - habbo.getHabboStats().hcMessageLastModified) < 60) { + Emulator.getThreading().run(() -> { + habbo.getClient().sendResponse(new UserClubComposer(habbo)); + habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); + }, (Emulator.getIntUnixTimestamp() - habbo.getHabboStats().hcMessageLastModified)); + } else { habbo.getClient().sendResponse(new UserClubComposer(habbo, SubscriptionHabboClub.HABBO_CLUB, UserClubComposer.RESPONSE_TYPE_NORMAL)); habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); } @@ -104,9 +106,9 @@ public class SubscriptionHabboClub extends Subscription { public void addDuration(int amount) { super.addDuration(amount); - if(amount < 0) { + if (amount < 0) { Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()); - if(habbo != null && habbo.getClient() != null) { + if (habbo != null && habbo.getClient() != null) { habbo.getClient().sendResponse(new UserClubComposer(habbo, SubscriptionHabboClub.HABBO_CLUB, UserClubComposer.RESPONSE_TYPE_NORMAL)); habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); } @@ -125,7 +127,7 @@ public class SubscriptionHabboClub extends Subscription { Habbo habbo = Emulator.getGameEnvironment().getHabboManager().getHabbo(this.getUserId()); - if(habbo != null && habbo.getClient() != null) { + if (habbo != null && habbo.getClient() != null) { habbo.getClient().sendResponse(new UserClubComposer(habbo, SubscriptionHabboClub.HABBO_CLUB, UserClubComposer.RESPONSE_TYPE_NORMAL)); habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); } @@ -151,11 +153,11 @@ public class SubscriptionHabboClub extends Subscription { stats.maxRooms = RoomManager.MAXIMUM_ROOMS_USER; Emulator.getThreading().run(stats); - if(habbo != null && ClothingValidationManager.VALIDATE_ON_HC_EXPIRE) { + if (habbo != null && ClothingValidationManager.VALIDATE_ON_HC_EXPIRE) { habboInfo.setLook(ClothingValidationManager.validateLook(habbo, habboInfo.getLook(), habboInfo.getGender().name())); Emulator.getThreading().run(habbo.getHabboInfo()); - if(habbo.getClient() != null) { + if (habbo.getClient() != null) { habbo.getClient().sendResponse(new UpdateUserLookComposer(habbo)); } @@ -164,7 +166,7 @@ public class SubscriptionHabboClub extends Subscription { } } - if(habbo != null && habbo.getClient() != null) { + if (habbo != null && habbo.getClient() != null) { habbo.getClient().sendResponse(new UserClubComposer(habbo, SubscriptionHabboClub.HABBO_CLUB, UserClubComposer.RESPONSE_TYPE_NORMAL)); habbo.getClient().sendResponse(new UserPermissionsComposer(habbo)); } @@ -172,6 +174,7 @@ public class SubscriptionHabboClub extends Subscription { /** * Calculate's a users upcoming HC Pay day rewards + * * @param habbo User to calculate for * @return ClubCenterDataComposer */ @@ -184,27 +187,27 @@ public class SubscriptionHabboClub extends Subscription { int creditRewardForMonthlySpent = 0; int timeUntilPayday = 0; - for(Subscription sub : habbo.getHabboStats().subscriptions) { - if(sub.getSubscriptionType().equalsIgnoreCase(Subscription.HABBO_CLUB)) { + for (Subscription sub : habbo.getHabboStats().subscriptions) { + if (sub.getSubscriptionType().equalsIgnoreCase(Subscription.HABBO_CLUB)) { - if(firstEverSub == null || sub.getTimestampStart() < firstEverSub.getTimestampStart()) { + if (firstEverSub == null || sub.getTimestampStart() < firstEverSub.getTimestampStart()) { firstEverSub = sub; } - if(sub.isActive()) { + if (sub.isActive()) { activeSub = sub; } } } - if(HC_PAYDAY_ENABLED && activeSub != null) { - currentHcStreak = (int)Math.floor((Emulator.getIntUnixTimestamp() - activeSub.getTimestampStart()) / (60 * 60 * 24.0)); - if(currentHcStreak < 1) { + if (HC_PAYDAY_ENABLED && activeSub != null) { + currentHcStreak = (int) Math.floor((Emulator.getIntUnixTimestamp() - activeSub.getTimestampStart()) / (60 * 60 * 24.0)); + if (currentHcStreak < 1) { currentHcStreak = 0; } - for(Map.Entry set : HC_PAYDAY_STREAK.entrySet()) { - if(currentHcStreak >= set.getKey() && set.getValue() > creditRewardForStreakBonus) { + for (Map.Entry set : HC_PAYDAY_STREAK.entrySet()) { + if (currentHcStreak >= set.getKey() && set.getValue() > creditRewardForStreakBonus) { creditRewardForStreakBonus = set.getValue(); } } @@ -227,21 +230,21 @@ public class SubscriptionHabboClub extends Subscription { SubscriptionManager.LOGGER.error("Caught SQL exception", e); } - creditRewardForMonthlySpent = (int)Math.floor(totalCreditsSpent * HC_PAYDAY_KICKBACK_PERCENTAGE); + creditRewardForMonthlySpent = (int) Math.floor(totalCreditsSpent * HC_PAYDAY_KICKBACK_PERCENTAGE); timeUntilPayday = (HC_PAYDAY_NEXT_DATE - Emulator.getIntUnixTimestamp()) / 60; } return new ClubCenterDataComposer( - currentHcStreak, - (firstEverSub != null ? new SimpleDateFormat("dd-MM-yyyy").format(new Date(firstEverSub.getTimestampStart() * 1000L)) : ""), - HC_PAYDAY_KICKBACK_PERCENTAGE, - 0, - 0, - totalCreditsSpent, - creditRewardForStreakBonus, - creditRewardForMonthlySpent, - timeUntilPayday + currentHcStreak, + (firstEverSub != null ? new SimpleDateFormat("dd-MM-yyyy").format(new Date(firstEverSub.getTimestampStart() * 1000L)) : ""), + HC_PAYDAY_KICKBACK_PERCENTAGE, + 0, + 0, + totalCreditsSpent, + creditRewardForStreakBonus, + creditRewardForMonthlySpent, + timeUntilPayday ); } @@ -265,15 +268,14 @@ public class SubscriptionHabboClub extends Subscription { HabboStats stats = habboInfo.getHabboStats(); ClubCenterDataComposer calculated = calculatePayday(habboInfo); int totalReward = (calculated.creditRewardForMonthlySpent + calculated.creditRewardForStreakBonus); - if(totalReward > 0) { + if (totalReward > 0) { boolean claimed = claimPayDay(Emulator.getGameEnvironment().getHabboManager().getHabbo(userId), totalReward, HC_PAYDAY_CURRENCY); HcPayDayLogEntry le = new HcPayDayLogEntry(timestampNow, userId, calculated.currentHcStreak, calculated.totalCreditsSpent, calculated.creditRewardForMonthlySpent, calculated.creditRewardForStreakBonus, totalReward, HC_PAYDAY_CURRENCY, claimed); Emulator.getThreading().run(le); } stats.lastHCPayday = timestampNow; Emulator.getThreading().run(stats); - } - catch (Exception e) { + } catch (Exception e) { SubscriptionManager.LOGGER.error("Exception processing HC payday for user #" + set.getInt("user_id"), e); } } @@ -281,24 +283,23 @@ public class SubscriptionHabboClub extends Subscription { Date date = new java.util.Date(HC_PAYDAY_NEXT_DATE * 1000L); date = Emulator.modifyDate(date, HC_PAYDAY_INTERVAL); - HC_PAYDAY_NEXT_DATE = (int)(date.getTime() / 1000L); + HC_PAYDAY_NEXT_DATE = (int) (date.getTime() / 1000L); - try(PreparedStatement stm2 = connection.prepareStatement("UPDATE `emulator_settings` SET `value` = ? WHERE `key` = ?")) { + try (PreparedStatement stm2 = connection.prepareStatement("UPDATE `emulator_settings` SET `value` = ? WHERE `key` = ?")) { SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); stm2.setString(1, sdf.format(date)); stm2.setString(2, "subscriptions.hc.payday.next_date"); stm2.execute(); } - try(PreparedStatement stm2 = connection.prepareStatement("UPDATE users_settings SET last_hc_payday = ? WHERE user_id IN (SELECT user_id FROM `users_subscriptions` WHERE subscription_type = '" + Subscription.HABBO_CLUB + "' AND `active` = 1 AND `timestamp_start` < ? AND (`timestamp_start` + `duration`) > ? GROUP BY user_id)")) { + try (PreparedStatement stm2 = connection.prepareStatement("UPDATE users_settings SET last_hc_payday = ? WHERE user_id IN (SELECT user_id FROM `users_subscriptions` WHERE subscription_type = '" + Subscription.HABBO_CLUB + "' AND `active` = 1 AND `timestamp_start` < ? AND (`timestamp_start` + `duration`) > ? GROUP BY user_id)")) { stm2.setInt(1, timestampNow); stm2.setInt(2, timestampNow); stm2.setInt(3, timestampNow); stm2.execute(); } - } - catch (SQLException e) { + } catch (SQLException e) { SubscriptionManager.LOGGER.error("Caught SQL exception", e); } isExecuting = false; @@ -306,13 +307,14 @@ public class SubscriptionHabboClub extends Subscription { /** * Called when a user logs in. Checks for any unclaimed HC Pay day rewards and issues rewards. + * * @param habbo User to process */ public static void processUnclaimed(Habbo habbo) { progressAchievement(habbo.getHabboInfo()); - if(habbo.getHabboStats().getRemainingClubGifts() > 0) { + if (habbo.getHabboStats().getRemainingClubGifts() > 0) { habbo.getClient().sendResponse(new PickMonthlyClubGiftNotificationComposer(habbo.getHabboStats().getRemainingClubGifts())); } @@ -328,25 +330,31 @@ public class SubscriptionHabboClub extends Subscription { int totalPayout = set.getInt("total_payout"); String currency = set.getString("currency"); - if(claimPayDay(habbo, totalPayout, currency)) { - try(PreparedStatement stm2 = connection.prepareStatement("UPDATE logs_hc_payday SET claimed = 1 WHERE id = ?")) { + if (claimPayDay(habbo, totalPayout, currency)) { + try (PreparedStatement stm2 = connection.prepareStatement("UPDATE logs_hc_payday SET claimed = 1 WHERE id = ?")) { stm2.setInt(1, logId); stm2.execute(); } } - } - catch (Exception e) { + } catch (Exception e) { SubscriptionManager.LOGGER.error("Exception processing HC payday for user #" + set.getInt("user_id"), e); } } } - } - catch (SQLException e) { + } catch (SQLException e) { SubscriptionManager.LOGGER.error("Caught SQL exception", e); } } + /** + * + * Seperated these because Beny shouldn't have tied them to Payday. + */ + public static void processClubBadge(Habbo habbo) { + progressAchievement(habbo.getHabboInfo()); + } + /** * Issues rewards to user. * @param habbo User to reward to 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 index 3e13a26a..add5b6c2 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java @@ -205,6 +205,8 @@ public class SecureLoginEvent extends MessageHandler { SubscriptionHabboClub.processUnclaimed(habbo); } + SubscriptionHabboClub.processClubBadge(habbo); + Messenger.checkFriendSizeProgress(habbo); if (!habbo.getHabboStats().hasGottenDefaultSavedSearches) { From ecd1bf30c1ac13482b73ded928ff00438e7c76f9 Mon Sep 17 00:00:00 2001 From: Harmonic Date: Thu, 11 Feb 2021 23:35:57 +0000 Subject: [PATCH 13/23] Add club only check functionality to CatalogManager --- .../java/com/eu/habbo/habbohotel/catalog/CatalogManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java index cac81c5b..f0c8e3f9 100644 --- a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java @@ -650,9 +650,11 @@ public class CatalogManager { @Override public boolean execute(CatalogPage object) { if (object.getRank() <= habbo.getHabboInfo().getRank().getId() && object.visible) { + if (object.isClubOnly() && !habbo.getHabboStats().hasActiveClub()) { + return false; + } pages.add(object); } - return true; } }); From 517ac9a0b6e42e135a533d2c72a2efcacee30d5c Mon Sep 17 00:00:00 2001 From: skeletor Date: Sat, 13 Feb 2021 21:32:28 -0500 Subject: [PATCH 14/23] Revert "Update UpdateNavigatorCommand.java" This reverts commit b7f586475849337f273bf561e1e0603375ac7913 --- .../eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java index c01c2e94..ee3b5f9a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/UpdateNavigatorCommand.java @@ -13,7 +13,7 @@ public class UpdateNavigatorCommand extends Command { public boolean handle(GameClient gameClient, String[] params) throws Exception { Emulator.getGameEnvironment().getNavigatorManager().loadNavigator(); Emulator.getGameEnvironment().getRoomManager().loadRoomModels(); - Emulator.getGameEnvironment().getRoomManager().loadPublicRooms(); + gameClient.getHabbo().whisper(Emulator.getTexts().getValue("commands.succes.cmd_update_navigator"), RoomChatMessageBubbles.ALERT); return true; From 5d6e239c70afa77685cc9a9b3cd783d969d2f13a Mon Sep 17 00:00:00 2001 From: Remco Date: Mon, 15 Feb 2021 23:20:22 +0100 Subject: [PATCH 15/23] Renamed packet --- sqlupdates/3_0_BETA_1 to 3_0_0-RC-1.sql | 3 +++ .../incoming/handshake/SecureLoginEvent.java | 4 ++-- .../eu/habbo/messages/outgoing/Outgoing.java | 2 +- .../handshake/DebugConsoleComposer.java | 20 ------------------- .../EnableNotificationsComposer.java | 20 +++++++++++++++++++ 5 files changed, 26 insertions(+), 23 deletions(-) delete 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/EnableNotificationsComposer.java diff --git a/sqlupdates/3_0_BETA_1 to 3_0_0-RC-1.sql b/sqlupdates/3_0_BETA_1 to 3_0_0-RC-1.sql index dfb1f885..31e6474c 100644 --- a/sqlupdates/3_0_BETA_1 to 3_0_0-RC-1.sql +++ b/sqlupdates/3_0_BETA_1 to 3_0_0-RC-1.sql @@ -4,3 +4,6 @@ INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('wired.variable.roomname', INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('wired.variable.user_count', '%user_count%'); INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('wired.variable.owner', '%owner%'); INSERT INTO `emulator_texts` (`key`, `value`) VALUES ('wired.variable.item_count', '%item_count%'); + +-- Enable bubble alerts +INSERT INTO `emulator_settings` (`key`, `value`) VALUES ('bubblealerts.enabled', '1'); 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 index 3e13a26a..d59b455d 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/handshake/SecureLoginEvent.java @@ -19,7 +19,7 @@ import com.eu.habbo.messages.outgoing.gamecenter.GameCenterGameListComposer; import com.eu.habbo.messages.outgoing.generic.alerts.GenericAlertComposer; import com.eu.habbo.messages.outgoing.generic.alerts.MessagesForYouComposer; import com.eu.habbo.messages.outgoing.habboway.nux.NewUserIdentityComposer; -import com.eu.habbo.messages.outgoing.handshake.DebugConsoleComposer; +import com.eu.habbo.messages.outgoing.handshake.EnableNotificationsComposer; import com.eu.habbo.messages.outgoing.handshake.SecureLoginOKComposer; import com.eu.habbo.messages.outgoing.handshake.AvailabilityStatusMessageComposer; import com.eu.habbo.messages.outgoing.handshake.PingComposer; @@ -122,7 +122,7 @@ public class SecureLoginEvent extends MessageHandler { messages.add(new UserPermissionsComposer(this.client.getHabbo()).compose()); messages.add(new AvailabilityStatusMessageComposer(true, false, true).compose()); messages.add(new PingComposer().compose()); - messages.add(new DebugConsoleComposer(Emulator.debugging).compose()); + messages.add(new EnableNotificationsComposer(Emulator.getConfig().getBoolean("bubblealerts.enabled", true)).compose()); messages.add(new UserAchievementScoreComposer(this.client.getHabbo()).compose()); messages.add(new IsFirstLoginOfDayComposer(true).compose()); messages.add(new UnknownComposer5().compose()); diff --git a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java index fb84490b..e38663e7 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java @@ -116,7 +116,7 @@ public class Outgoing { 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 EnableNotificationsComposer = 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 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 deleted file mode 100644 index 4ea035af..00000000 --- a/src/main/java/com/eu/habbo/messages/outgoing/handshake/DebugConsoleComposer.java +++ /dev/null @@ -1,20 +0,0 @@ -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 final boolean debugging; - - public DebugConsoleComposer(boolean debugging) { - this.debugging = debugging; - } - - @Override - protected ServerMessage composeInternal() { - this.response.init(Outgoing.DebugConsoleComposer); - this.response.appendBoolean(this.debugging); - return this.response; - } -} diff --git a/src/main/java/com/eu/habbo/messages/outgoing/handshake/EnableNotificationsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/handshake/EnableNotificationsComposer.java new file mode 100644 index 00000000..575cd174 --- /dev/null +++ b/src/main/java/com/eu/habbo/messages/outgoing/handshake/EnableNotificationsComposer.java @@ -0,0 +1,20 @@ +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 EnableNotificationsComposer extends MessageComposer { + private final boolean enabled; + + public EnableNotificationsComposer(boolean enabled) { + this.enabled = enabled; + } + + @Override + protected ServerMessage composeInternal() { + this.response.init(Outgoing.EnableNotificationsComposer); + this.response.appendBoolean(this.enabled); + return this.response; + } +} From 234392a269920a9eb579f1f458e991a6e805dc6c Mon Sep 17 00:00:00 2001 From: Thijmen Date: Sun, 28 Feb 2021 10:58:11 +0100 Subject: [PATCH 16/23] When creating a new item for the wardrobe, save it in the Set so it can be retreived later --- .../com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java | 2 ++ 1 file changed, 2 insertions(+) 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 index 1e58686b..94625424 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/users/SaveWardrobeEvent.java @@ -21,7 +21,9 @@ public class SaveWardrobeEvent extends MessageHandler { wardrobeItem.setNeedsUpdate(true); } else { wardrobeItem = this.client.getHabbo().getInventory().getWardrobeComponent().createLook(this.client.getHabbo(), slotId, look); + wardrobeItem.setGender(HabboGender.valueOf(gender)); wardrobeItem.setNeedsInsert(true); + this.client.getHabbo().getInventory().getWardrobeComponent().getLooks().put(slotId, wardrobeItem); } UserSavedWardrobeEvent wardrobeEvent = new UserSavedWardrobeEvent(this.client.getHabbo(), wardrobeItem); From b971ce1f836c8052f1bb700f0c3d7a7be99f6fdb Mon Sep 17 00:00:00 2001 From: Remco Date: Tue, 2 Mar 2021 12:21:15 +0100 Subject: [PATCH 17/23] Fixed exploit that made it possible to trade untradable items --- .../messages/incoming/trading/TradeOfferMultipleItemsEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 098345e4..231a70c1 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferMultipleItemsEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/trading/TradeOfferMultipleItemsEvent.java @@ -21,7 +21,7 @@ public class TradeOfferMultipleItemsEvent extends MessageHandler { 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) { + if (item != null && item.getBaseItem().allowTrade()) { items.add(item); } } From 1685065b32341d03841f705cb13817b5f00a26bb Mon Sep 17 00:00:00 2001 From: Remco Date: Tue, 2 Mar 2021 12:46:17 +0100 Subject: [PATCH 18/23] Fixed BuyRoomPromotion exploit --- .../promotions/BuyRoomPromotionEvent.java | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) 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 index fdf37650..6f1f0a58 100644 --- 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 @@ -30,40 +30,41 @@ public class BuyRoomPromotionEvent extends MessageHandler { 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 (page == null || !page.getLayout().equals("roomads")) + return; - if (!(room.isOwner(this.client.getHabbo()) || room.hasRights(this.client.getHabbo()) || room.getGuildRightLevel(this.client.getHabbo()).equals(RoomRightLevels.GUILD_ADMIN))) { - return; + 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.getGuildRightLevel(this.client.getHabbo()).equals(RoomRightLevels.GUILD_ADMIN))) { + return; + } + + if (room.isPromoted()) { + room.getPromotion().addEndTimestamp(120 * 60); + } else { + room.createPromotion(title, description, categoryId); + } + + if (room.isPromoted()) { + if (!this.client.getHabbo().hasPermission(Permission.ACC_INFINITE_CREDITS)) { + this.client.getHabbo().giveCredits(-item.getCredits()); } - if (room.isPromoted()) { - room.getPromotion().addEndTimestamp(120 * 60); - } else { - room.createPromotion(title, description, categoryId); + if (!this.client.getHabbo().hasPermission(Permission.ACC_INFINITE_POINTS)) { + this.client.getHabbo().givePoints(item.getPointsType(), -item.getPoints()); } - if (room.isPromoted()) { - if (!this.client.getHabbo().hasPermission(Permission.ACC_INFINITE_CREDITS)) { - this.client.getHabbo().giveCredits(-item.getCredits()); - } + this.client.sendResponse(new PurchaseOKComposer()); + room.sendComposer(new RoomPromotionMessageComposer(room, room.getPromotion()).compose()); - if (!this.client.getHabbo().hasPermission(Permission.ACC_INFINITE_POINTS)) { - this.client.getHabbo().givePoints(item.getPointsType(), -item.getPoints()); - } - - this.client.sendResponse(new PurchaseOKComposer()); - room.sendComposer(new RoomPromotionMessageComposer(room, room.getPromotion()).compose()); - - if (!this.client.getHabbo().getInventory().getBadgesComponent().hasBadge(BuyRoomPromotionEvent.ROOM_PROMOTION_BADGE)) { - this.client.getHabbo().addBadge(BuyRoomPromotionEvent.ROOM_PROMOTION_BADGE); - } - } else { - this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); + if (!this.client.getHabbo().getInventory().getBadgesComponent().hasBadge(BuyRoomPromotionEvent.ROOM_PROMOTION_BADGE)) { + this.client.getHabbo().addBadge(BuyRoomPromotionEvent.ROOM_PROMOTION_BADGE); } + } else { + this.client.sendResponse(new AlertPurchaseFailedComposer(AlertPurchaseFailedComposer.SERVER_ERROR)); } } } From 9f2449ec360cf1673b2b6bd73f5405e6822e66d3 Mon Sep 17 00:00:00 2001 From: Remco Date: Tue, 2 Mar 2021 20:48:13 +0100 Subject: [PATCH 19/23] Renamed incoming packet variable --- .../incoming/rooms/promotions/BuyRoomPromotionEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 6f1f0a58..a157cf15 100644 --- 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 @@ -21,7 +21,7 @@ public class BuyRoomPromotionEvent extends MessageHandler { int itemId = this.packet.readInt(); int roomId = this.packet.readInt(); String title = this.packet.readString(); - boolean unknown1 = this.packet.readBoolean(); + boolean extendedPromotion = this.packet.readBoolean(); String description = this.packet.readString(); int categoryId = this.packet.readInt(); From 7106026b732f7bca26d7fa458dceff92e49a0629 Mon Sep 17 00:00:00 2001 From: Snaiker Date: Fri, 5 Mar 2021 22:33:12 +0000 Subject: [PATCH 20/23] Hide mail --- .../java/com/eu/habbo/habbohotel/modtool/ModToolManager.java | 2 +- .../messages/outgoing/modtool/ModToolUserInfoComposer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java index 9bb9f5da..2a65ba4a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/modtool/ModToolManager.java @@ -54,7 +54,7 @@ public class ModToolManager { if (userId <= 0) return; - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.*, users_settings.*, permissions.rank_name, permissions.id as rank_id FROM users INNER JOIN users_settings ON users.id = users_settings.user_id INNER JOIN permissions ON permissions.id = users.rank WHERE users.id = ? LIMIT 1")) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.*, users_settings.*, permissions.rank_name, permissions.acc_hide_mail AS hide_mail, permissions.id AS rank_id FROM users INNER JOIN users_settings ON users.id = users_settings.user_id INNER JOIN permissions ON permissions.id = users.rank WHERE users.id = ? LIMIT 1")) { statement.setInt(1, userId); try (ResultSet set = statement.executeQuery()) { while (set.next()) { 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 index 74fde87e..41bce32f 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserInfoComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/modtool/ModToolUserInfoComposer.java @@ -58,7 +58,7 @@ public class ModToolUserInfoComposer extends MessageComposer { this.response.appendString(""); //Last Purchase Timestamp this.response.appendInt(this.set.getInt("user_id")); //Personal Identification # this.response.appendInt(0); // Number of account bans - this.response.appendString(this.set.getString("mail")); + this.response.appendString(this.set.getBoolean("hide_mail") ? "" : this.set.getString("mail")); this.response.appendString("Rank (" + this.set.getInt("rank_id") + "): " + this.set.getString("rank_name")); //user_class_txt ModToolSanctions modToolSanctions = Emulator.getGameEnvironment().getModToolSanctions(); From db25a6d8ee94921e984e77f1366363b0847a4762 Mon Sep 17 00:00:00 2001 From: Snaiker Date: Fri, 5 Mar 2021 23:05:09 +0000 Subject: [PATCH 21/23] Fix --- .../com/eu/habbo/habbohotel/rooms/RoomManager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java index 113736f1..8f6f30c2 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -1176,11 +1176,14 @@ public class RoomManager { continue; Habbo friend = Emulator.getGameEnvironment().getHabboManager().getHabbo(buddy.getId()); - - if (friend == null || friend.getHabboInfo().getCurrentRoom() == null) + if (friend == null) continue; - rooms.add(friend.getHabboInfo().getCurrentRoom()); + Room friendRoom = friend.getHabboInfo().getCurrentRoom(); + if (friendRoom == null || rooms.contains(friendRoom)) + continue; + + rooms.add(friendRoom); } Collections.sort(rooms); @@ -1313,7 +1316,7 @@ public class RoomManager { if (friend == null || friend.getHabboInfo() == null) continue; Room room = friend.getHabboInfo().getCurrentRoom(); - if (room != null) rooms.add(room); + if (room != null && !rooms.contains(room)) rooms.add(room); if (rooms.size() >= limit) break; } From 968e98012951a2f8b39746bc23f30c7631ebf9e0 Mon Sep 17 00:00:00 2001 From: Snaiker Date: Fri, 5 Mar 2021 23:06:40 +0000 Subject: [PATCH 22/23] Fix --- .../java/com/eu/habbo/habbohotel/rooms/RoomManager.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java index 8f6f30c2..05ddc66a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -1176,14 +1176,10 @@ public class RoomManager { continue; Habbo friend = Emulator.getGameEnvironment().getHabboManager().getHabbo(buddy.getId()); - if (friend == null) + if (friend == null || friend.getHabboInfo().getCurrentRoom() == null) continue; - Room friendRoom = friend.getHabboInfo().getCurrentRoom(); - if (friendRoom == null || rooms.contains(friendRoom)) - continue; - - rooms.add(friendRoom); + rooms.add(friend.getHabboInfo().getCurrentRoom()); } Collections.sort(rooms); From b02beb8ce39e8891c9558b4214b7486de0f23a7c Mon Sep 17 00:00:00 2001 From: Beny <4-beny@users.noreply.git.krews.org> Date: Sun, 7 Mar 2021 18:05:39 +0000 Subject: [PATCH 23/23] Fix monster plant duplication glitch --- .../messages/incoming/rooms/pets/BreedMonsterplantsEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedMonsterplantsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedMonsterplantsEvent.java index a297244c..9ce44416 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedMonsterplantsEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/BreedMonsterplantsEvent.java @@ -13,7 +13,7 @@ public class BreedMonsterplantsEvent extends MessageHandler { Pet petOne = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(this.packet.readInt()); Pet petTwo = this.client.getHabbo().getHabboInfo().getCurrentRoom().getPet(this.packet.readInt()); - if (petOne == null || petTwo == null) { + if (petOne == null || petTwo == null || petOne == petTwo) { //TODO Add error return; } @@ -23,4 +23,4 @@ public class BreedMonsterplantsEvent extends MessageHandler { } } } -} \ No newline at end of file +}