diff --git a/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java index 376f910c..6b7ff3f5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java +++ b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java @@ -5,6 +5,7 @@ import com.eu.habbo.core.Logging; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.messages.PacketManager; import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.MessageComposer; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -17,12 +18,12 @@ import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; public class GameClient { - public final ConcurrentHashMap incomingPacketCounter = new ConcurrentHashMap<>(25); private final Channel channel; public long lastPacketCounterCleared = Emulator.getIntUnixTimestamp(); private Habbo habbo; private String machineId = ""; + public final ConcurrentHashMap, Long> messageTimestamps = new ConcurrentHashMap<>(); public GameClient(Channel channel) { this.channel = channel; diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java index 7b01af64..7eb7278b 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java @@ -291,7 +291,7 @@ public class RoomUnit { if (item != null) { if (item != habboItem || !RoomLayout.pointInSquare(item.getX(), item.getY(), item.getX() + item.getBaseItem().getWidth() - 1, item.getY() + item.getBaseItem().getLength() - 1, this.getX(), this.getY())) { if (item.canWalkOn(this, room, null)) { - item.onWalkOn(this, room, null); + item.onWalkOn(this, room, new Object[]{this.getCurrentLocation(), next}); } else if (item instanceof InteractionGuildGate || item instanceof InteractionHabboClubGate) { this.setRotation(oldRotation); this.tilesWalked--; @@ -306,7 +306,7 @@ public class RoomUnit { return false; } } else { - item.onWalk(this, room, null); + item.onWalk(this, room, new Object[]{this.getCurrentLocation(), next}); } zHeight += item.getZ(); diff --git a/src/main/java/com/eu/habbo/messages/PacketManager.java b/src/main/java/com/eu/habbo/messages/PacketManager.java index 7ebfe092..8acc8689 100644 --- a/src/main/java/com/eu/habbo/messages/PacketManager.java +++ b/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -171,6 +171,20 @@ public class PacketManager { return; } + final MessageHandler handler = handlerClass.newInstance(); + + if (handler.getRatelimit() > 0) { + if (client.messageTimestamps.containsKey(handlerClass) && System.currentTimeMillis() - client.messageTimestamps.get(handlerClass) < handler.getRatelimit()) { + if (PacketManager.DEBUG_SHOW_PACKETS) { + Emulator.getLogging().logPacketLine("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + packet.getMessageId() + "][" + Logging.ANSI_RED + "RATELIMITED" + Logging.ANSI_RESET + "] => " + packet.getMessageBody()); + } + + return; + } else { + client.messageTimestamps.put(handlerClass, System.currentTimeMillis()); + } + } + if (PacketManager.DEBUG_SHOW_PACKETS) Emulator.getLogging().logPacketLine("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + packet.getMessageId() + "] => " + packet.getMessageBody()); @@ -178,8 +192,6 @@ public class PacketManager { System.out.println(("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + client.getHabbo().getHabboInfo().getUsername() + "][" + packet.getMessageId() + "] => " + packet.getMessageBody())); } - final MessageHandler handler = handlerClass.newInstance(); - handler.client = client; handler.packet = packet; diff --git a/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java b/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java index 98baf3b6..38920afe 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java +++ b/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java @@ -9,4 +9,8 @@ public abstract class MessageHandler { public boolean isCancelled = false; public abstract void handle() throws Exception; + + public int getRatelimit() { + return 0; + } } \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java index c14d6f66..22c0d5cc 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java @@ -11,8 +11,14 @@ import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.rooms.users.RoomUnitOnRollerComposer; import com.eu.habbo.plugin.events.users.UserIdleEvent; +import gnu.trove.set.hash.THashSet; public class RoomUserWalkEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 500; + } + @Override public void handle() throws Exception { if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) { @@ -115,6 +121,23 @@ public class RoomUserWalkEvent extends MessageHandler { } } + THashSet items = room.getItemsAt(tile); + + if (items.size() > 0) { + for (HabboItem item : items) { + RoomTile overriddenTile = item.getOverrideGoalTile(roomUnit, room, tile); + + if (overriddenTile == null) { + return; // null cancels the entire event + } + + if (!overriddenTile.equals(tile) && overriddenTile.isWalkable()) { + tile = overriddenTile; + break; + } + } + } + // This is where we set the end location and begin finding a path if (tile.isWalkable() || room.canSitOrLayAt(tile.x, tile.y)) { if (roomUnit.getMoveBlockingTask() != null) roomUnit.getMoveBlockingTask().get();