diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java b/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java index 1bdaf554..1fd17654 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java @@ -121,6 +121,7 @@ public class Bot extends Unit implements Runnable { this.bubbleId = set.getInt("bubble_id"); this.roomUnit = new RoomBot(); + this.roomUnit.setUnit(this); } public Bot(Bot bot) { @@ -189,48 +190,6 @@ public class Bot extends Unit implements Runnable { } } - public void cycle(boolean allowBotsWalk) { - if (this.getRoomUnit() != null) { - if (allowBotsWalk && this.canWalk) { - if (!this.getRoomUnit().isWalking()) { - if (this.getRoomUnit().getWalkTimeOut() < Emulator.getIntUnixTimestamp() && this.followingHabboId == 0) { - this.getRoomUnit().setGoalLocation(Emulator.getConfig().getBoolean("hotel.bot.limit.walking.distance", true) ? this.room.getLayout().getRandomWalkableTilesAround(this.getRoomUnit(), this.room.getLayout().getTile(this.getRoomUnit().getBotStartLocation().getX(), this.getRoomUnit().getBotStartLocation().getY()), this.room, Emulator.getConfig().getInt("hotel.bot.limit.walking.distance.radius", 5)) : this.room.getRandomWalkableTile()); - - int timeOut = Emulator.getRandom().nextInt(20) * 2; - this.getRoomUnit().setWalkTimeOut((timeOut < 10 ? 5 : timeOut) + Emulator.getIntUnixTimestamp()); - } - }/* else { - for (RoomTile t : this.room.getLayout().getTilesAround(this.room.getLayout().getTile(this.getRoomUnit().getX(), this.getRoomUnit().getY()))) { - WiredHandler.handle(WiredTriggerType.BOT_REACHED_STF, this.getRoomUnit(), this.room, this.room.getItemsAt(t).toArray()); - } - }*/ - } - - if (!this.chatLines.isEmpty() && this.chatTimeOut <= Emulator.getIntUnixTimestamp() && this.chatAuto) { - if (this.room != null) { - this.lastChatIndex = (this.chatRandom ? (short) Emulator.getRandom().nextInt(this.chatLines.size()) : (this.lastChatIndex == (this.chatLines.size() - 1) ? 0 : this.lastChatIndex++)); - - if (this.lastChatIndex >= this.chatLines.size()) { - this.lastChatIndex = 0; - } - - String message = this.chatLines.get(this.lastChatIndex) - .replace(Emulator.getTexts().getValue("wired.variable.owner", "%owner%"), this.room.getRoomInfo().getOwnerInfo().getUsername()) - .replace(Emulator.getTexts().getValue("wired.variable.item_count", "%item_count%"), this.room.getRoomItemManager().getCurrentItems().size() + "") - .replace(Emulator.getTexts().getValue("wired.variable.name", "%name%"), this.name) - .replace(Emulator.getTexts().getValue("wired.variable.roomname", "%roomname%"), this.room.getRoomInfo().getName()) - .replace(Emulator.getTexts().getValue("wired.variable.user_count", "%user_count%"), this.room.getRoomUnitManager().getRoomHabbosCount() + ""); - - if(!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.getRoomUnit(), room, new Object[]{ message })) { - this.talk(message); - } - - this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; - } - } - } - } - public void talk(String message) { if (this.room != null) { BotChatEvent event = new BotTalkEvent(this, message); diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java b/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java index a8f6931c..c0914662 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java @@ -126,13 +126,10 @@ public class BotManager { return; } - bot.setRoomUnit(new RoomBot()); - RoomBot roomBot = bot.getRoomUnit(); roomBot.setRotation(RoomRotation.SOUTH); roomBot.setLocation(location); double stackHeight = room.getRoomItemManager().getTopHeightAt(location.getX(), location.getY()); - roomBot.setPreviousLocationZ(stackHeight); roomBot.setCurrentZ(stackHeight); roomBot.setRoom(room); roomBot.setRoomUnitType(RoomUnitType.BOT); diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/EnableCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/EnableCommand.java index bfe37b2a..e1860133 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/EnableCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/EnableCommand.java @@ -33,7 +33,7 @@ public class EnableCommand extends Command { } if (target == gameClient.getHabbo() || gameClient.getHabbo().hasPermissionRight(Permission.ACC_ENABLE_OTHERS)) { try { - if (target.getRoomUnit().getRoom() != null && target.getHabboInfo().getRiding() == null) { + if (target.getRoomUnit().getRoom() != null && !target.getRoomUnit().isRiding()) { if (Emulator.getGameEnvironment().getPermissionsManager().isEffectBlocked(effectId, target.getHabboInfo().getPermissionGroup().getId())) { gameClient.getHabbo().whisper(getTextsValue("commands.error.cmd_enable.not_allowed"), RoomChatMessageBubbles.ALERT); return true; diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/FastwalkCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/FastwalkCommand.java index 65c9e5f5..cc5dfd75 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/FastwalkCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/FastwalkCommand.java @@ -12,9 +12,11 @@ public class FastwalkCommand extends Command { @Override public boolean handle(GameClient gameClient, String[] params) { if (gameClient.getHabbo().getRoomUnit().getRoom() != null) { + //TODO Make this an event plugin which fires that can be cancelled - if (gameClient.getHabbo().getRoomUnit().getRoom() != null && gameClient.getHabbo().getHabboInfo().getRiding() != null) + if (gameClient.getHabbo().getRoomUnit().isRiding()) { return true; + } Habbo habbo = gameClient.getHabbo(); @@ -26,7 +28,8 @@ public class FastwalkCommand extends Command { if (habbo == null) return false; } - habbo.getRoomUnit().setFastWalkEnabled(!habbo.getRoomUnit().isFastWalkEnabled()); + + habbo.getRoomUnit().setCmdFastWalkEnabled(!habbo.getRoomUnit().isCmdFastWalkEnabled()); return true; } diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/PullCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/PullCommand.java index 8fee7982..da1c4285 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/PullCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/PullCommand.java @@ -41,7 +41,7 @@ public class PullCommand extends Command { gameClient.getHabbo().whisper(replaceUsername(getTextsValue("commands.error.cmd_pull.invalid"), params[1])); return true; } - habbo.getRoomUnit().setGoalLocation(tile); + habbo.getRoomUnit().walkTo(tile); gameClient.getHabbo().getRoomUnit().getRoom().sendComposer(new ChatMessageComposer(new RoomChatMessage(replaceUser(getTextsValue("commands.succes.cmd_pull.pull"), params[1]).replace("%gender_name%", (gameClient.getHabbo().getHabboInfo().getGender().equals(HabboGender.M) ? getTextsValue("gender.him") : getTextsValue("gender.her"))), gameClient.getHabbo(), gameClient.getHabbo(), RoomChatMessageBubbles.NORMAL)).compose()); } diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/PushCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/PushCommand.java index dea7b678..a14768b6 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/PushCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/PushCommand.java @@ -40,7 +40,7 @@ public class PushCommand extends Command { gameClient.getHabbo().whisper(replaceUsername(getTextsValue("commands.error.cmd_push.invalid"), params[1])); return true; } - habbo.getRoomUnit().setGoalLocation(tFrontTarget); + habbo.getRoomUnit().walkTo(tFrontTarget); gameClient.getHabbo().getRoomUnit().getRoom().sendComposer( new ChatMessageComposer( new RoomChatMessage( diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/SitCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/SitCommand.java index 7ef27f24..66667785 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/SitCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/SitCommand.java @@ -10,7 +10,7 @@ public class SitCommand extends Command { @Override public boolean handle(GameClient gameClient, String[] params) { - if (gameClient.getHabbo().getHabboInfo().getRiding() == null) //TODO Make this an event plugin which fires that can be cancelled + if (!gameClient.getHabbo().getRoomUnit().isRiding()) //TODO Make this an event plugin which fires that can be cancelled gameClient.getHabbo().getRoomUnit().makeSit(); return true; } diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/StandCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/StandCommand.java index 8d2cf0d6..9f65e5a0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/StandCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/StandCommand.java @@ -10,7 +10,7 @@ public class StandCommand extends Command { @Override public boolean handle(GameClient gameClient, String[] params) { - if (gameClient.getHabbo().getHabboInfo().getRiding() == null) { + if (!gameClient.getHabbo().getRoomUnit().isRiding()) { gameClient.getHabbo().getRoomUnit().makeStand(); } diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/SummonCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/SummonCommand.java index 83c9c42c..1c679c37 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/SummonCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/SummonCommand.java @@ -41,6 +41,8 @@ public class SummonCommand extends Command { } Room room = habbo.getRoomUnit().getRoom(); + + //WHY? Why not just roomManager -> leaveRoom() if (room != null) { Emulator.getGameEnvironment().getRoomManager().logExit(habbo); diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/SuperPullCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/SuperPullCommand.java index d1e3b2cd..852230a9 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/SuperPullCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/SuperPullCommand.java @@ -36,7 +36,7 @@ public class SuperPullCommand extends Command { gameClient.getHabbo().whisper(replaceUsername(getTextsValue("commands.error.cmd_pull.invalid"), params[1]), RoomChatMessageBubbles.ALERT); return true; } - habbo.getRoomUnit().setGoalLocation(tile); + habbo.getRoomUnit().walkTo(tile); gameClient.getHabbo().getRoomUnit().getRoom().sendComposer(new ChatMessageComposer(new RoomChatMessage(replaceUser(getTextsValue("commands.succes.cmd_pull.pull"), params[1]).replace("%gender_name%", (gameClient.getHabbo().getHabboInfo().getGender().equals(HabboGender.M) ? getTextsValue("gender.him") : getTextsValue("gender.her"))), gameClient.getHabbo(), gameClient.getHabbo(), RoomChatMessageBubbles.NORMAL)).compose()); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/TeleportCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/TeleportCommand.java index d1f67b33..518b44fa 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/TeleportCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/TeleportCommand.java @@ -12,7 +12,7 @@ public class TeleportCommand extends Command { @Override public boolean handle(GameClient gameClient, String[] params) { - if (gameClient.getHabbo().getHabboInfo().getRiding() != null){ //TODO Make this an event plugin which fires that can be cancelled + if (gameClient.getHabbo().getRoomUnit().isRiding()){ //TODO Make this an event plugin which fires that can be cancelled return true; } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java index 0532ab67..125a12d3 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java @@ -687,7 +687,7 @@ public class ItemManager { Constructor c = itemClass.getConstructor(ResultSet.class, Item.class); c.setAccessible(true); - RoomItem item = (RoomItem) c.newInstance(set, baseItem); + RoomItem item = c.newInstance(set, baseItem); if (item instanceof InteractionWired interactionWired) { interactionWired.loadWiredSettings(set); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBuildArea.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBuildArea.java index cde00f3b..dff6cbd5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBuildArea.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionBuildArea.java @@ -139,7 +139,7 @@ public class InteractionBuildArea extends InteractionCustomValues { } public boolean inSquare(RoomTile location) { - Room room = Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(this.getRoomId()); + Room room = this.getRoom(); if (room != null && this.tiles.size() == 0) { regenAffectedTiles(room); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java index ebf28fc5..114871a0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCannon.java @@ -65,7 +65,7 @@ public class InteractionCannon extends RoomItem { if ((client == null || (tiles.contains(client.getHabbo().getRoomUnit().getCurrentPosition())) && client.getHabbo().getRoomUnit().isCanWalk()) && !this.cooldown) { if (client != null) { client.getHabbo().getRoomUnit().setCanWalk(false); - client.getHabbo().getRoomUnit().setGoalLocation(client.getHabbo().getRoomUnit().getCurrentPosition()); + client.getHabbo().getRoomUnit().walkTo(client.getHabbo().getRoomUnit().getCurrentPosition()); client.getHabbo().getRoomUnit().lookAtPoint(fuseTile); client.getHabbo().getRoomUnit().setStatusUpdateNeeded(true); } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java index 2cf7524a..fcfc9515 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionCrackable.java @@ -64,14 +64,14 @@ public class InteractionCrackable extends RoomItem { super.onClick(client, room, objects); synchronized (this.lock) { - if (this.getRoomId() == 0) + if (this.getRoom() == null) return; if (this.cracked) return; if (this.userRequiredToBeAdjacent() && client.getHabbo().getRoomUnit().getCurrentPosition().distance(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())) > 1.5) { - client.getHabbo().getRoomUnit().setGoalLocation(room.getLayout().getTileInFront(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()), Rotation.Calculate(client.getHabbo().getRoomUnit().getCurrentPosition().getX(), client.getHabbo().getRoomUnit().getCurrentPosition().getY(), this.getCurrentPosition().getX(), this.getCurrentPosition().getY()))); + client.getHabbo().getRoomUnit().walkTo(room.getLayout().getTileInFront(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()), Rotation.Calculate(client.getHabbo().getRoomUnit().getCurrentPosition().getX(), client.getHabbo().getRoomUnit().getCurrentPosition().getY(), this.getCurrentPosition().getX(), this.getCurrentPosition().getY()))); return; } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java index 482005ae..50a3bff1 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionFireworks.java @@ -87,7 +87,7 @@ public class InteractionFireworks extends InteractionDefault { } }); - client.getHabbo().getRoomUnit().setGoalLocation(closestTile); + client.getHabbo().getRoomUnit().walkTo(closestTile); Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), closestTile, room, onSuccess, new ArrayList<>())); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGymEquipment.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGymEquipment.java index 417cf5a0..d6a51125 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGymEquipment.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionGymEquipment.java @@ -131,7 +131,7 @@ public class InteractionGymEquipment extends InteractionEffectTile implements IC super.setRotation(rotation); if (this.forceRotation() && this.roomUnitId != -1) { - Room room = Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(this.getRoomId()); + Room room = this.getRoom(); if (room != null) { RoomUnit roomUnit = this.getCurrentRoomUnit(room); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java index b4a939e0..717cbc3c 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionHopper.java @@ -62,7 +62,7 @@ public class InteractionHopper extends RoomItem { Emulator.getThreading().run(new HopperActionOne(this, room, client), 500); } else { - client.getHabbo().getRoomUnit().setGoalLocation(loc); + client.getHabbo().getRoomUnit().walkTo(loc); } } } @@ -78,7 +78,7 @@ public class InteractionHopper extends RoomItem { if (!this.getExtraData().equals("0")) { this.setExtraData("0"); - Room room = Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(this.getRoomId()); + Room room = this.getRoom(); if (room != null) { room.updateItemState(this); } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java index 2c6e09f2..5b19d9bd 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMultiHeight.java @@ -91,7 +91,6 @@ public class InteractionMultiHeight extends RoomItem { } if (this.getBaseItem().allowSit() || unit.hasStatus(RoomUnitStatus.SIT)) { - unit.setSitUpdate(true); unit.setStatusUpdateNeeded(true); } else { unit.setCurrentZ(unit.getCurrentPosition().getStackHeight()); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java index f0824698..9ff89f85 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMuteArea.java @@ -74,7 +74,7 @@ public class InteractionMuteArea extends InteractionCustomValues { } public boolean inSquare(RoomTile location) { - Room room = Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(this.getRoomId()); + Room room = this.getRoom(); if(!this.values.get("state").equals("1")) return false; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java index 16752dbd..d3546bc1 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionObstacle.java @@ -103,15 +103,15 @@ public class InteractionObstacle extends RoomItem implements ICycleable { if (roomUnit.getBodyRotation().getValue() % 2 == 0) { if (this.getRotation() == 2) { if (roomUnit.getBodyRotation().equals(RoomRotation.WEST)) { - ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile((short) (roomUnit.getCurrentPosition().getX() - 3), roomUnit.getCurrentPosition().getY())); + ((HorsePet) pet).getRider().getRoomUnit().walkTo(room.getLayout().getTile((short) (roomUnit.getCurrentPosition().getX() - 3), roomUnit.getCurrentPosition().getY())); } else if (roomUnit.getBodyRotation().equals(RoomRotation.EAST)) { - ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile((short) (roomUnit.getCurrentPosition().getX() + 3), roomUnit.getCurrentPosition().getY())); + ((HorsePet) pet).getRider().getRoomUnit().walkTo(room.getLayout().getTile((short) (roomUnit.getCurrentPosition().getX() + 3), roomUnit.getCurrentPosition().getY())); } } else if (this.getRotation() == 4) { if (roomUnit.getBodyRotation().equals(RoomRotation.NORTH)) { - ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile(roomUnit.getCurrentPosition().getX(), (short) (roomUnit.getCurrentPosition().getY() - 3))); + ((HorsePet) pet).getRider().getRoomUnit().walkTo(room.getLayout().getTile(roomUnit.getCurrentPosition().getX(), (short) (roomUnit.getCurrentPosition().getY() - 3))); } else if (roomUnit.getBodyRotation().equals(RoomRotation.SOUTH)) { - ((HorsePet) pet).getRider().getRoomUnit().setGoalLocation(room.getLayout().getTile(roomUnit.getCurrentPosition().getX(), (short) (roomUnit.getCurrentPosition().getY() + 3))); + ((HorsePet) pet).getRider().getRoomUnit().walkTo(room.getLayout().getTile(roomUnit.getCurrentPosition().getX(), (short) (roomUnit.getCurrentPosition().getY() + 3))); } } } @@ -191,12 +191,12 @@ public class InteractionObstacle extends RoomItem implements ICycleable { RoomTile tileInfront = room.getLayout().getTileInFront(roomUnit.getCurrentPosition(), roomUnit.getBodyRotation().getValue()); if(tileInfront.getState() != RoomTileState.INVALID && tileInfront.getState() != RoomTileState.BLOCKED && room.getRoomUnitManager().getRoomUnitsAt(tileInfront).size() == 0) { - roomUnit.setGoalLocation(tileInfront); + roomUnit.walkTo(tileInfront); } else { RoomTile tileBehind = room.getLayout().getTileInFront(roomUnit.getCurrentPosition(), Objects.requireNonNull(roomUnit.getBodyRotation().getOpposite()).getValue()); if(tileBehind.getState() != RoomTileState.INVALID && tileBehind.getState() != RoomTileState.BLOCKED && room.getRoomUnitManager().getRoomUnitsAt(tileBehind).size() == 0) { - roomUnit.setGoalLocation(tileBehind); + roomUnit.walkTo(tileBehind); } } } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java index f66f4939..9d8185a5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionOneWayGate.java @@ -85,7 +85,7 @@ public class InteractionOneWayGate extends RoomItem { unit.setCanLeaveRoomByDoor(false); walkable = this.getBaseItem().allowWalk(); RoomTile tile = room.getLayout().getTileInFront(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()), this.getRotation() + 4); - unit.setGoalLocation(tile); + unit.walkTo(tile); Emulator.getThreading().run(new RoomUnitWalkToLocation(unit, tile, room, onFail, onFail)); Emulator.getThreading().run(() -> WiredHandler.handle(WiredTriggerType.WALKS_ON_FURNI, unit, room, new Object[]{this}), 500); @@ -102,7 +102,7 @@ public class InteractionOneWayGate extends RoomItem { walkable = true; room.updateTile(currentLocation); unit.addOverrideTile(currentLocation); - unit.setGoalLocation(currentLocation); + unit.walkTo(currentLocation); Emulator.getThreading().run(new RoomUnitWalkToLocation(unit, currentLocation, room, onSuccess, onFail)); room.sendComposer(new DiceValueMessageComposer(this.getId(), 1).compose()); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java index 04679175..aafe8fa3 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPuzzleBox.java @@ -50,7 +50,7 @@ public class InteractionPuzzleBox extends RoomItem { if (rotation == null) { RoomTile nearestTile = client.getHabbo().getRoomUnit().getClosestAdjacentTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY(), false); - if (nearestTile != null) client.getHabbo().getRoomUnit().setGoalLocation(nearestTile); + if (nearestTile != null) client.getHabbo().getRoomUnit().walkTo(nearestTile); return; } @@ -77,9 +77,9 @@ public class InteractionPuzzleBox extends RoomItem { room.scheduledComposers.add(new FloorItemOnRollerComposer(this, null, tile, 0, room).compose()); room.scheduledTasks.add(() -> { - client.getHabbo().getRoomUnit().setGoalLocation(boxLocation); + client.getHabbo().getRoomUnit().walkTo(boxLocation); - room.scheduledTasks.add(() -> client.getHabbo().getRoomUnit().setGoalLocation(boxLocation)); + room.scheduledTasks.add(() -> client.getHabbo().getRoomUnit().walkTo(boxLocation)); }); this.needsUpdate(true); } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java index a12142b9..ca66792d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionRentableSpace.java @@ -58,7 +58,7 @@ public class InteractionRentableSpace extends RoomItem { } } } else { - if (this.getRoomId() > 0) { + if (this.getRoom() != null) { Emulator.getThreading().run(new ClearRentedSpace(this, Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(this.getRoomId()))); this.renterId = 0; } @@ -152,7 +152,7 @@ public class InteractionRentableSpace extends RoomItem { public void endRent() { this.setEndTimestamp(0); - Room room = Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(this.getRoomId()); + Room room = this.getRoom(); if (room == null) return; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java index d23b1791..8fb08d3d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionSwitch.java @@ -62,7 +62,7 @@ public class InteractionSwitch extends InteractionDefault { } }); - client.getHabbo().getRoomUnit().setGoalLocation(closestTile); + client.getHabbo().getRoomUnit().walkTo(closestTile); Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), closestTile, room, onSuccess, new ArrayList<>())); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java index 9c209f90..78671ede 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleport.java @@ -100,7 +100,7 @@ public class InteractionTeleport extends RoomItem { this.roomUnitID = roomHabbo.getVirtualId(); this.setExtraData("1"); room.updateItemState(this); - roomHabbo.setGoalLocation(inFrontTile); + roomHabbo.walkTo(inFrontTile); List onSuccess = new ArrayList<>(); List onFail = new ArrayList<>(); @@ -127,7 +127,7 @@ public class InteractionTeleport extends RoomItem { room.updateTile(currentItemLocation); roomHabbo.addOverrideTile(currentItemLocation); - roomHabbo.setGoalLocation(currentItemLocation); + roomHabbo.walkTo(currentItemLocation); roomHabbo.setCanLeaveRoomByDoor(false); Emulator.getThreading().run(new RoomUnitWalkToLocation(roomHabbo, currentItemLocation, room, onSuccess, onFail)); @@ -138,7 +138,7 @@ public class InteractionTeleport extends RoomItem { onSuccess.add(() -> tryTeleport(client, room)); - roomHabbo.setGoalLocation(inFrontTile); + roomHabbo.walkTo(inFrontTile); Emulator.getThreading().run(new RoomUnitWalkToLocation(roomHabbo, inFrontTile, room, onSuccess, onFail)); } } @@ -204,13 +204,13 @@ public class InteractionTeleport extends RoomItem { return false; } - RoomUnit unit = habbo.getRoomUnit(); + RoomHabbo roomHabbo = habbo.getRoomUnit(); - if (unit == null) { + if (roomHabbo == null) { return false; } - return habbo.getHabboInfo().getRiding() == null; + return !roomHabbo.isRiding(); } public void startTeleport(Room room, Habbo habbo) { diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java index 53aac853..74aaed4f 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTeleportTile.java @@ -38,7 +38,7 @@ public class InteractionTeleportTile extends InteractionTeleport { return; if (!habbo.getRoomUnit().isTeleporting()) { - habbo.getRoomUnit().setGoalLocation(habbo.getRoomUnit().getCurrentPosition()); + habbo.getRoomUnit().walkTo(habbo.getRoomUnit().getCurrentPosition()); this.startTeleport(room, habbo, 1000); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java index c002bbcf..72c7d8f9 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionVendingMachine.java @@ -143,7 +143,7 @@ public class InteractionVendingMachine extends RoomItem { onSuccess.add(() -> tryInteract(client, room, unit)); - unit.setGoalLocation(tileToWalkTo); + unit.walkTo(tileToWalkTo); Emulator.getThreading().run(new RoomUnitWalkToLocation(unit, tileToWalkTo, room, onSuccess, onFail)); } } 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 3f1b02b9..c9bd0cad 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 @@ -321,11 +321,6 @@ public class InteractionGameTimer extends RoomItem implements Runnable { this.needsUpdate(true); } - @Override - public String getDatabaseExtraData() { - return this.getExtraData(); - } - @Override public boolean allowWiredResetState() { return true; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java index 3e8744a2..859593de 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/battlebanzai/InteractionBattleBanzaiTeleporter.java @@ -64,7 +64,7 @@ public class InteractionBattleBanzaiTeleporter extends RoomItem { this.setExtraData("1"); room.updateItemState(this); roomUnit.removeStatus(RoomUnitStatus.MOVE); - roomUnit.setGoalLocation(roomUnit.getCurrentPosition()); + roomUnit.walkTo(roomUnit.getCurrentPosition()); roomUnit.setCanWalk(false); Emulator.getThreading().run(new BanzaiRandomTeleport(this, target, roomUnit, room), 500); } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java index 253535ee..d4fea6d8 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java @@ -72,7 +72,7 @@ public class InteractionNest extends RoomItem { return; pet.setTask(PetTasks.NEST); - pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); pet.getRoomUnit().clearStatuses(); pet.getRoomUnit().removeStatus(RoomUnitStatus.MOVE); pet.getRoomUnit().addStatus(RoomUnitStatus.LAY, room.getStackHeight(this.getCurrentPosition().getX(), this.getCurrentPosition().getY(), false) + ""); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java index 1b6a04a2..ae9951db 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java @@ -58,7 +58,7 @@ public class InteractionPetDrink extends InteractionDefault { List onSuccess = new ArrayList<>(); onSuccess.add(() -> this.change(room, this.getBaseItem().getStateCount() - 1)); - client.getHabbo().getRoomUnit().setGoalLocation(closestTile); + client.getHabbo().getRoomUnit().walkTo(closestTile); Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), closestTile, room, onSuccess, new ArrayList<>())); } } @@ -76,7 +76,7 @@ public class InteractionPetDrink extends InteractionDefault { if (pet != null && pet.getPetData().haveDrinkItem(this) && pet.levelThirst >= 35) { pet.clearPosture(); - pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); pet.getRoomUnit().setRotation(RoomRotation.values()[this.getRotation()]); pet.getRoomUnit().clearStatuses(); pet.getRoomUnit().addStatus(RoomUnitStatus.EAT, pet.getRoomUnit().getCurrentPosition().getStackHeight() + ""); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java index 8bdf3757..5e606bcf 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java @@ -38,7 +38,7 @@ public class InteractionPetFood extends InteractionDefault { if (pet.getPetData().haveFoodItem(this)) { if (pet.levelHunger >= 35) { pet.setTask(PetTasks.EAT); - pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); pet.getRoomUnit().setRotation(RoomRotation.values()[this.getRotation()]); pet.getRoomUnit().clearStatuses(); pet.getRoomUnit().removeStatus(RoomUnitStatus.MOVE); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java index b53a95ce..4a13ee51 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java @@ -65,7 +65,7 @@ public class InteractionPetToy extends InteractionDefault { } pet.setTask(PetTasks.PLAY); - pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY())); pet.getRoomUnit().setRotation(RoomRotation.values()[this.getRotation()]); pet.getRoomUnit().clearStatuses(); pet.getRoomUnit().addStatus(RoomUnitStatus.PLAY, pet.getRoomUnit().getCurrentPosition().getStackHeight() + ""); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetTrampoline.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetTrampoline.java index 4361f4d6..acc70222 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetTrampoline.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetTrampoline.java @@ -69,7 +69,7 @@ public class InteractionPetTrampoline extends InteractionDefault { pet.getRoomUnit().addStatus(RoomUnitStatus.JUMP, ""); Emulator.getThreading().run(() -> { new PetClearPosture(pet, RoomUnitStatus.JUMP, null, false); - pet.getRoomUnit().setGoalLocation(room.getRandomWalkableTile()); + pet.getRoomUnit().walkTo(room.getRandomWalkableTile()); this.setExtraData("0"); room.updateItemState(this); }, 4000); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java index 1bd29b60..9fd302a5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotGiveHandItem.java @@ -58,7 +58,7 @@ public class WiredEffectBotGiveHandItem extends InteractionWiredEffect { RoomTile tile = bot.getRoomUnit().getClosestAdjacentTile(roomAvatar.getCurrentPosition().getX(), roomAvatar.getCurrentPosition().getY(), true); if(tile != null) { - bot.getRoomUnit().setGoalLocation(tile); + bot.getRoomUnit().walkTo(tile); } Emulator.getThreading().run(new RoomUnitGiveHanditem(bot.getRoomUnit(), room, itemId)); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java index cafd087c..4a845ae0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotWalkToFurni.java @@ -56,7 +56,7 @@ public class WiredEffectBotWalkToFurni extends InteractionWiredEffect { if (item.getRoomId() != 0) { Room room1 = bot.getRoom(); if (item.getRoomId() == room1.getRoomInfo().getId()) { - bot.getRoomUnit().setGoalLocation(room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); + bot.getRoomUnit().walkTo(room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); } } } diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java b/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java index 2425d5e0..1132de60 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/Pet.java @@ -5,6 +5,7 @@ import com.eu.habbo.database.DatabaseConstants; import com.eu.habbo.habbohotel.achievements.AchievementManager; import com.eu.habbo.habbohotel.rooms.*; import com.eu.habbo.habbohotel.rooms.entities.items.RoomItem; +import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomPet; import com.eu.habbo.habbohotel.units.Unit; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.messages.ISerialize; @@ -127,6 +128,10 @@ public class Pet extends Unit implements ISerialize, Runnable { @Getter private boolean muted = false; + @Getter + @Setter + private RoomPet roomUnit; + /** * Creates a new pet using the given result set, which should contain data retrieved from a * database. @@ -359,7 +364,7 @@ public class Pet extends Unit implements ISerialize, Runnable { RoomTile tile = this.room.getRandomWalkableTile(); if (tile != null) { - this.getRoomUnit().setGoalLocation(tile); + this.getRoomUnit().walkTo(tile); } } @@ -376,7 +381,7 @@ public class Pet extends Unit implements ISerialize, Runnable { if (this.energy == PetManager.maxEnergy(this.level)) { this.getRoomUnit().removeStatus(RoomUnitStatus.LAY); this.getRoomUnit().setCanWalk(true); - this.getRoomUnit().setGoalLocation(this.room.getRandomWalkableTile()); + this.getRoomUnit().walkTo(this.room.getRandomWalkableTile()); this.task = null; this.getRoomUnit().addStatus(RoomUnitStatus.GESTURE, PetGestures.ENERGY.getKey()); this.gestureTickTimeout = currentTime; @@ -578,7 +583,7 @@ public class Pet extends Unit implements ISerialize, Runnable { RoomItem item = this.petData.randomNest(this.room.getRoomSpecialTypes().getNests()); this.getRoomUnit().setCanWalk(true); if (item != null) { - this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); + this.getRoomUnit().walkTo(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); } else { if(this instanceof HorsePet horsePet && horsePet.hasSaddle()) { return; @@ -603,7 +608,7 @@ public class Pet extends Unit implements ISerialize, Runnable { } catch (Exception ignored) { } } else { - this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); + this.getRoomUnit().walkTo(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); } } return item != null; @@ -616,7 +621,7 @@ public class Pet extends Unit implements ISerialize, Runnable { RoomItem item = this.petData.randomFoodItem(this.room.getRoomSpecialTypes().getPetFoods()); if (item != null) { this.getRoomUnit().setCanWalk(true); - this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); + this.getRoomUnit().walkTo(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); } } @@ -636,7 +641,7 @@ public class Pet extends Unit implements ISerialize, Runnable { } return true; } - this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); + this.getRoomUnit().walkTo(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); return true; } @@ -663,7 +668,7 @@ public class Pet extends Unit implements ISerialize, Runnable { } return true; } - this.getRoomUnit().setGoalLocation(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); + this.getRoomUnit().walkTo(this.room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); return true; } return false; @@ -768,7 +773,7 @@ public class Pet extends Unit implements ISerialize, Runnable { */ public void freeCommand() { this.task = null; - this.getRoomUnit().setGoalLocation(this.getRoomUnit().getCurrentPosition()); + this.getRoomUnit().walkTo(this.getRoomUnit().getCurrentPosition()); this.getRoomUnit().clearStatuses(); this.getRoomUnit().setCanWalk(true); this.say(this.petData.randomVocal(PetVocalsType.GENERIC_NEUTRAL)); diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java index 0639ab46..b9d03275 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetCommand.java @@ -59,7 +59,7 @@ public class PetCommand implements Comparable { if (this.action != null && pet.energy > this.energyCost && pet.happiness > this.happinessCost && Emulator.getRandom().nextInt((pet.level - this.level <= 0 ? 2 : pet.level - this.level) + 2) == 0) { if (this.action.petTask != pet.getTask()) { if (this.action.stopsPetWalking) { - pet.getRoomUnit().setGoalLocation(pet.getRoomUnit().getCurrentPosition()); + pet.getRoomUnit().walkTo(pet.getRoomUnit().getCurrentPosition()); } if (this.action.apply(pet, habbo, data)) { for (RoomUnitStatus status : this.action.statusToRemove) { diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java index dbaf0664..354d4f5a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java @@ -444,6 +444,7 @@ public class PetManager { pet.setUserId(habbo.getHabboInfo().getId()); pet.setRoom(room); pet.setRoomUnit(new RoomPet()); + pet.getRoomUnit().setUnit(pet); pet.getRoomUnit().setRoom(room); pet.setNeedsUpdate(true); pet.run(); @@ -463,6 +464,7 @@ public class PetManager { pet.setUserId(habbo.getHabboInfo().getId()); pet.setRoom(room); pet.setRoomUnit(new RoomPet()); + pet.getRoomUnit().setUnit(pet); pet.getRoomUnit().setRoom(room); pet.setNeedsUpdate(true); pet.run(); @@ -483,6 +485,7 @@ public class PetManager { pet.setUserId(habbo.getHabboInfo().getId()); pet.setRoom(room); pet.setRoomUnit(new RoomPet()); + pet.getRoomUnit().setUnit(pet); pet.getRoomUnit().setRoom(room); pet.setNeedsUpdate(true); pet.run(); diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionBreed.java b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionBreed.java index 38527995..3dfa32e3 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionBreed.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionBreed.java @@ -25,7 +25,7 @@ public class ActionBreed extends PetAction { } if (nest != null) { - pet.getRoomUnit().setGoalLocation(pet.getRoom().getLayout().getTile(nest.getCurrentPosition().getX(), nest.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(pet.getRoom().getLayout().getTile(nest.getCurrentPosition().getX(), nest.getCurrentPosition().getY())); return true; } else { diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionDip.java b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionDip.java index eec7e92d..3b1a11ee 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionDip.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionDip.java @@ -24,7 +24,7 @@ public class ActionDip extends PetAction { RoomItem waterPatch = (RoomItem) waterItems.toArray()[Emulator.getRandom().nextInt(waterItems.size())]; - pet.getRoomUnit().setGoalLocation(pet.getRoom().getLayout().getTile(waterPatch.getCurrentPosition().getX(), waterPatch.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(pet.getRoom().getLayout().getTile(waterPatch.getCurrentPosition().getX(), waterPatch.getCurrentPosition().getY())); if (pet.getHappiness() > 70) { pet.say(pet.getPetData().randomVocal(PetVocalsType.PLAYFUL)); diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionHere.java b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionHere.java index df982829..9c97ab2d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionHere.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionHere.java @@ -16,7 +16,7 @@ public class ActionHere extends PetAction { @Override public boolean apply(Pet pet, Habbo habbo, String[] data) { - pet.getRoomUnit().setGoalLocation(pet.getRoom().getLayout().getTileInFront(habbo.getRoomUnit().getCurrentPosition(), habbo.getRoomUnit().getBodyRotation().getValue())); + pet.getRoomUnit().walkTo(pet.getRoom().getLayout().getTileInFront(habbo.getRoomUnit().getCurrentPosition(), habbo.getRoomUnit().getBodyRotation().getValue())); pet.getRoomUnit().setCanWalk(true); if (pet.getHappiness() > 50) { diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionMoveForward.java b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionMoveForward.java index 98083d2b..e00b3914 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionMoveForward.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionMoveForward.java @@ -13,7 +13,7 @@ public class ActionMoveForward extends PetAction { @Override public boolean apply(Pet pet, Habbo habbo, String[] data) { - pet.getRoomUnit().setGoalLocation(pet.getRoom().getLayout().getTileInFront(pet.getRoomUnit().getCurrentPosition(), pet.getRoomUnit().getBodyRotation().getValue())); + pet.getRoomUnit().walkTo(pet.getRoom().getLayout().getTileInFront(pet.getRoomUnit().getCurrentPosition(), pet.getRoomUnit().getBodyRotation().getValue())); pet.getRoomUnit().setCanWalk(true); pet.say(pet.getPetData().randomVocal(PetVocalsType.GENERIC_NEUTRAL)); diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionPlayFootball.java b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionPlayFootball.java index 2503865a..c34c7eab 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionPlayFootball.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/actions/ActionPlayFootball.java @@ -32,7 +32,7 @@ public class ActionPlayFootball extends PetAction { if(foundBall == null) return false; - pet.getRoomUnit().setGoalLocation(room.getLayout().getTile(foundBall.getCurrentPosition().getX(), foundBall.getCurrentPosition().getY())); + pet.getRoomUnit().walkTo(room.getLayout().getTile(foundBall.getCurrentPosition().getX(), foundBall.getCurrentPosition().getY())); if (pet.getHappiness() > 75) pet.say(pet.getPetData().randomVocal(PetVocalsType.PLAYFUL)); 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 d227cbf9..24946e74 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -401,6 +401,7 @@ public class Room implements Comparable, ISerialize, Runnable { return; } + //Improve this for (Habbo habbo : habbos) { double z = habbo.getRoomUnit().getCurrentPosition().getStackHeight(); @@ -413,12 +414,16 @@ public class Room implements Comparable, ISerialize, Runnable { } if (item != null && (item.getBaseItem().allowSit() || item.getBaseItem().allowLay())) { + if(item.getBaseItem().allowSit()) { + habbo.getRoomUnit().addStatus(RoomUnitStatus.SIT, String.valueOf(Item.getCurrentHeight(item))); + } else if(item.getBaseItem().allowLay()) { + habbo.getRoomUnit().addStatus(RoomUnitStatus.LAY, String.valueOf(Item.getCurrentHeight(item))); + } + habbo.getRoomUnit().setCurrentZ(item.getCurrentZ()); - habbo.getRoomUnit().setPreviousLocationZ(item.getCurrentZ()); habbo.getRoomUnit().setRotation(RoomRotation.fromValue(item.getRotation())); } else { habbo.getRoomUnit().setCurrentZ(z); - habbo.getRoomUnit().setPreviousLocationZ(z); } } } @@ -437,7 +442,6 @@ public class Room implements Comparable, ISerialize, Runnable { if (topItem != null) { if (topItem.getBaseItem().allowSit()) { bot.getRoomUnit().setCurrentZ(topItem.getCurrentZ()); - bot.getRoomUnit().setPreviousLocationZ(topItem.getCurrentZ()); bot.getRoomUnit().setRotation(RoomRotation.fromValue(topItem.getRotation())); } else { bot.getRoomUnit().setCurrentZ(topItem.getCurrentZ() + Item.getCurrentHeight(topItem)); @@ -448,7 +452,6 @@ public class Room implements Comparable, ISerialize, Runnable { } } else { bot.getRoomUnit().setCurrentZ(bot.getRoomUnit().getCurrentPosition().getStackHeight()); - bot.getRoomUnit().setPreviousLocationZ(bot.getRoomUnit().getCurrentPosition().getStackHeight()); } roomUnits.add(bot.getRoomUnit()); }); @@ -590,7 +593,7 @@ public class Room implements Comparable, ISerialize, Runnable { habbo.getHabboStats().getChatCounter().decrementAndGet(); } - habbo.getRoomUnit().cycle(this); + habbo.getRoomUnit().cycle(); if(habbo.getRoomUnit().isStatusUpdateNeeded()) { habbo.getRoomUnit().setStatusUpdateNeeded(false); @@ -622,7 +625,7 @@ public class Room implements Comparable, ISerialize, Runnable { continue; } - bot.getRoomUnit().cycle(this); + bot.getRoomUnit().cycle(); if(bot.getRoomUnit().isStatusUpdateNeeded()) { bot.getRoomUnit().setStatusUpdateNeeded(false); @@ -647,7 +650,7 @@ public class Room implements Comparable, ISerialize, Runnable { break; } - pet.getRoomUnit().cycle(this); + pet.getRoomUnit().cycle(); pet.cycle(); if(pet.getRoomUnit().isStatusUpdateNeeded()) { @@ -804,9 +807,9 @@ public class Room implements Comparable, ISerialize, Runnable { if (roomUnit.getRoomUnitType() == RoomUnitType.HABBO) { Habbo rollingHabbo = this.getRoomUnitManager().getHabboByRoomUnit(roomUnit); if (rollingHabbo != null && rollingHabbo.getHabboInfo() != null) { - RideablePet riding = rollingHabbo.getHabboInfo().getRiding(); - if (riding != null) { - RoomUnit ridingUnit = riding.getRoomUnit(); + RideablePet ridingPet = rollingHabbo.getRoomUnit().getRidingPet(); + if (ridingPet != null) { + RoomUnit ridingUnit = ridingPet.getRoomUnit(); newZ = ridingUnit.getCurrentZ() + zOffset; rolledUnitIds.add(ridingUnit.getVirtualId()); updatedUnit.remove(ridingUnit); @@ -836,10 +839,6 @@ public class Room implements Comparable, ISerialize, Runnable { }, this.roomInfo.getRollerSpeed() == 0 ? 250 : InteractionRoller.DELAY); } } - - if (roomUnit.hasStatus(RoomUnitStatus.SIT)) { - roomUnit.setSitUpdate(true); - } } } @@ -1261,7 +1260,7 @@ public class Room implements Comparable, ISerialize, Runnable { } habbo.getRoomUnit().setKicked(true); - habbo.getRoomUnit().setGoalLocation(this.layout.getDoorTile()); + habbo.getRoomUnit().walkTo(this.layout.getDoorTile()); if (habbo.getRoomUnit().getPath() == null || habbo.getRoomUnit().getPath().size() <= 1 || this.roomInfo.isPublicRoom()) { habbo.getRoomUnit().setCanWalk(true); @@ -1318,9 +1317,8 @@ public class Room implements Comparable, ISerialize, Runnable { } roomUnit.setLocation(tile); - roomUnit.setGoalLocation(tile); + roomUnit.walkTo(tile); roomUnit.setCurrentZ(z); - roomUnit.setPreviousLocationZ(z); this.updateRoomUnit(roomUnit); @@ -1351,8 +1349,6 @@ public class Room implements Comparable, ISerialize, Runnable { } public void habboEntered(Habbo habbo) { - habbo.getRoomUnit().setAnimateWalk(false); - synchronized (this.roomUnitManager.getCurrentBots()) { if (habbo.getHabboInfo().getId() != this.roomInfo.getOwnerInfo().getId()) return; @@ -1744,6 +1740,10 @@ public class Room implements Comparable, ISerialize, Runnable { return this.getStackHeight(x, y, calculateHeightmap, null); } + public boolean canSitOrLayAt(RoomTile tile) { + return this.canSitOrLayAt(tile.getX(), tile.getY()); + } + public boolean canSitOrLayAt(int x, int y) { RoomTile tile = this.layout.getTile((short) x, (short) y); diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java index 7c9a530f..f3efbb36 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java @@ -128,7 +128,9 @@ public class RoomItemManager { try { this.currentItems.put(item.getId(), item); this.sortItem(item); + //Deprecated item.setRoomId(this.room.getRoomInfo().getId()); + item.setRoom(room); } catch (Exception ignored) { } @@ -344,7 +346,9 @@ public class RoomItemManager { this.room.sendComposer(new ItemAddMessageComposer(item, this.room.getFurniOwnerName(item.getOwnerInfo().getId())).compose()); item.needsUpdate(true); this.addRoomItem(item); + //Deprecated item.setRoomId(this.room.getRoomInfo().getId()); + item.setRoom(this.room); item.onPlace(this.room); Emulator.getThreading().run(item); return FurnitureMovementError.NONE; @@ -543,7 +547,9 @@ public class RoomItemManager { this.removeRoomItem(item); item.onPickUp(this.room); + //Deprecated item.setRoomId(0); + item.setRoom(null); item.needsUpdate(true); if (item.getBaseItem().getType() == FurnitureType.FLOOR) { diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java index 8969b489..1f6ce701 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java @@ -210,7 +210,7 @@ public class RoomLayout { if(this.tileExists(x, y)) { RoomTile tile = this.getTile(x, y); - walkable = tile.getState().equals(RoomTileState.OPEN) && tile.isWalkable() && (this.room.getRoomUnitManager().areRoomUnitsAt(tile) && !this.room.getRoomInfo().isAllowWalkthrough()); + walkable = tile.isWalkable() && (this.room.getRoomUnitManager().areRoomUnitsAt(tile) && !this.room.getRoomInfo().isAllowWalkthrough()); } return walkable; 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 fc8156ca..11c890d5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -574,7 +574,6 @@ public class RoomManager { RoomHabbo roomHabbo = habbo.getRoomUnit(); roomHabbo.clear(); - roomHabbo.clearWalking(); if (roomHabbo.getCurrentPosition() == null) { RoomTile spawnTile = spawnLocation == null ? room.getLayout().getDoorTile() : spawnLocation; @@ -622,7 +621,7 @@ public class RoomManager { habbo.getClient().sendResponse(new RoomRatingComposer(room.getRoomInfo().getScore(), !this.hasVotedForRoom(habbo, room))); - roomHabbo.setFastWalkEnabled(roomHabbo.isFastWalkEnabled() && habbo.canExecuteCommand("cmd_fastwalk", room.getRoomRightsManager().hasRights(habbo))); + roomHabbo.setCmdFastWalkEnabled(roomHabbo.isCmdFastWalkEnabled() && habbo.canExecuteCommand("cmd_fastwalk", room.getRoomRightsManager().hasRights(habbo))); if (room.isPromoted()) { habbo.getClient().sendResponse(new RoomEventComposer(room, room.getPromotion())); @@ -875,9 +874,8 @@ public class RoomManager { } public void leaveRoom(Habbo habbo, Room room, boolean redirectToHotelView) { - if (habbo.getRoomUnit().getRoom() != null && habbo.getRoomUnit().getRoom() == room) { + if (habbo.getRoomUnit().getRoom() != null && habbo.getRoomUnit().getRoom().equals(room)) { this.logExit(habbo); - room.getRoomUnitManager().removeHabbo(habbo, true); if (redirectToHotelView) { @@ -885,9 +883,8 @@ public class RoomManager { } habbo.getRoomUnit().setPreviousRoom(room); - habbo.getRoomUnit().setRoom(null); - if (room.getRoomInfo().getOwnerInfo().getId() != habbo.getHabboInfo().getId()) { + if (!room.getRoomInfo().isRoomOwner(habbo)) { AchievementManager.progressAchievement(room.getRoomInfo().getOwnerInfo().getId(), Emulator.getGameEnvironment().getAchievementManager().getAchievement("RoomDecoHosting"), (int) Math.floor((Emulator.getIntUnixTimestamp() - habbo.getHabboStats().roomEnterTimestamp) / 60000.0)); } @@ -902,13 +899,13 @@ public class RoomManager { control.getRoomUnit().getCacheable().remove("controller"); } - if (habbo.getHabboInfo().getRiding() != null) { - if (habbo.getHabboInfo().getRiding().getRoomUnit() != null) { - habbo.getHabboInfo().getRiding().getRoomUnit().setGoalLocation(habbo.getHabboInfo().getRiding().getRoomUnit().getCurrentPosition()); + if (habbo.getRoomUnit().isRiding()) { + if (habbo.getRoomUnit().getRidingPet().getRoomUnit() != null) { + habbo.getRoomUnit().getRidingPet().getRoomUnit().walkTo(habbo.getRoomUnit().getRidingPet().getRoomUnit().getCurrentPosition()); } - habbo.getHabboInfo().getRiding().setTask(PetTasks.FREE); - habbo.getHabboInfo().getRiding().setRider(null); - habbo.getHabboInfo().setRiding(null); + habbo.getRoomUnit().getRidingPet().setTask(PetTasks.FREE); + habbo.getRoomUnit().getRidingPet().setRider(null); + habbo.getRoomUnit().setRidingPet(null); } Room room = habbo.getRoomUnit().getRoom(); diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java index 26182f8b..22ae3dd3 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java @@ -57,6 +57,7 @@ public class RoomTile { if (this.state == RoomTileState.INVALID) { this.allowStack = false; } + this.roomUnits = tile.roomUnits; this.roomItems = tile.roomItems; } @@ -106,6 +107,10 @@ public class RoomTile { ((RoomTile) o).y == this.y; } + public boolean equals(int x, int y) { + return this.x == x && this.y == y; + } + public RoomTile copy() { return new RoomTile(this); } @@ -162,9 +167,7 @@ public class RoomTile { public void addRoomUnit(RoomUnit roomUnit) { synchronized (this.roomUnits) { - if (!this.roomUnits.contains(roomUnit)) { - this.roomUnits.add(roomUnit); - } + this.roomUnits.add(roomUnit); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTraxManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTraxManager.java index b7f373fe..c7754a3f 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTraxManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTraxManager.java @@ -266,7 +266,9 @@ public class RoomTraxManager implements Disposable { this.room.sendComposer(new JukeboxSongDisksMessageComposer(this.songs, this.totalLength).compose()); + //Deprecated musicDisc.setRoomId(-1); + musicDisc.setRoom(null); musicDisc.needsUpdate(true); Emulator.getThreading().run(musicDisc); @@ -293,8 +295,9 @@ public class RoomTraxManager implements Disposable { } this.room.sendComposer(new JukeboxSongDisksMessageComposer(this.songs, this.totalLength).compose()); - + //Deprecated musicDisc.setRoomId(0); + musicDisc.setRoom(null); musicDisc.needsUpdate(true); Emulator.getThreading().run(musicDisc); @@ -324,7 +327,9 @@ public class RoomTraxManager implements Disposable { if (musicDisc != null) { if (musicDisc instanceof InteractionMusicDisc && musicDisc.getRoomId() == -1) { + //Deprecated musicDisc.setRoomId(0); + musicDisc.setRoom(null); musicDisc.needsUpdate(true); Emulator.getThreading().run(musicDisc); diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitManager.java index 23ff5231..9ddb2747 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitManager.java @@ -14,7 +14,6 @@ import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomPet; import com.eu.habbo.habbohotel.units.Unit; import com.eu.habbo.habbohotel.users.DanceType; import com.eu.habbo.habbohotel.users.Habbo; -import com.eu.habbo.messages.outgoing.hotelview.CloseConnectionMessageComposer; import com.eu.habbo.messages.outgoing.inventory.PetAddedToInventoryComposer; import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetComposer; import com.eu.habbo.messages.outgoing.rooms.users.UserRemoveMessageComposer; @@ -67,10 +66,11 @@ public class RoomUnitManager { try (ResultSet set = statement.executeQuery()) { while (set.next()) { Bot bot = Emulator.getGameEnvironment().getBotManager().loadBot(set); - + //TODO IMPROVE THIS if (bot != null) { bot.setRoom(this.room); bot.setRoomUnit(new RoomBot()); + bot.getRoomUnit().setUnit(bot); bot.getRoomUnit().setRoom(this.room); bot.getRoomUnit().setLocation(this.room.getLayout().getTile((short) set.getInt("x"), (short) set.getInt("y"))); if (bot.getRoomUnit().getCurrentPosition() == null || bot.getRoomUnit().getCurrentPosition().getState() == RoomTileState.INVALID) { @@ -79,7 +79,6 @@ public class RoomUnitManager { bot.getRoomUnit().setRotation(RoomRotation.fromValue(this.room.getLayout().getDoorDirection())); } else { bot.getRoomUnit().setCurrentZ(set.getDouble("z")); - bot.getRoomUnit().setPreviousLocationZ(set.getDouble("z")); bot.getRoomUnit().setRotation(RoomRotation.values()[set.getInt("rot")]); } bot.getRoomUnit().setRoomUnitType(RoomUnitType.BOT); @@ -110,6 +109,7 @@ public class RoomUnitManager { pet.setRoom(this.room); pet.setRoomUnit(new RoomPet()); + pet.getRoomUnit().setUnit(pet); pet.getRoomUnit().setRoom(this.room); pet.getRoomUnit().setLocation(this.room.getLayout().getTile((short) set.getInt("x"), (short) set.getInt("y"))); if (pet.getRoomUnit().getCurrentPosition() == null || pet.getRoomUnit().getCurrentPosition().getState() == RoomTileState.INVALID) { @@ -227,15 +227,13 @@ public class RoomUnitManager { } pet.setRoomUnit(new RoomPet()); + pet.getRoomUnit().setUnit(pet); pet.setRoom(room); - pet.getRoomUnit() - .setGoalLocation(tile) - .setLocation(tile) + pet.getRoomUnit().walkTo(tile); + pet.getRoomUnit().setLocation(tile) .setRoomUnitType(RoomUnitType.PET) .setCanWalk(true) - .setPreviousLocationZ(z) - .setCurrentZ(z) - .setRoom(room); + .setCurrentZ(z); if (pet.getRoomUnit().getCurrentPosition() == null) { pet.getRoomUnit() @@ -291,11 +289,7 @@ public class RoomUnitManager { return; } - RoomUnit roomUnit = habbo.getRoomUnit(); - - if(roomUnit == null || !(roomUnit instanceof RoomHabbo roomHabbo)) { - return; - } + RoomHabbo roomHabbo = habbo.getRoomUnit(); if(roomHabbo.getCurrentPosition() != null) { roomHabbo.getCurrentPosition().removeUnit(habbo.getRoomUnit()); @@ -308,6 +302,7 @@ public class RoomUnitManager { roomHabbo.getRoom().sendComposer(new UserRemoveMessageComposer(roomHabbo).compose()); + //MOVE THIS TO RoomTile.java -> removeUnit() RoomItem item = roomHabbo.getRoom().getRoomItemManager().getTopItemAt(roomHabbo.getCurrentPosition()); if (item != null) { @@ -333,7 +328,6 @@ public class RoomUnitManager { } roomHabbo.getRoom().updateDatabaseUserCount(); - roomHabbo.clear(); } @@ -414,11 +408,9 @@ public class RoomUnitManager { public void dispose() { for(Habbo habbo : this.currentHabbos.values()) { - Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, this.room); + Emulator.getGameEnvironment().getRoomManager().leaveRoom(habbo, this.room, true); } - this.room.sendComposer(new CloseConnectionMessageComposer().compose()); - this.currentHabbos.clear(); Iterator botIterator = this.currentBots.values().iterator(); @@ -450,7 +442,6 @@ public class RoomUnitManager { } this.currentPets.clear(); - this.currentRoomUnits.clear(); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/IRoomEntity.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/IRoomEntity.java index 1846f7f4..00b27ebc 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/IRoomEntity.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/IRoomEntity.java @@ -19,6 +19,12 @@ public interface IRoomEntity { double getCurrentZ(); RoomEntity setCurrentZ(double currentZ); + RoomTile getNextPosition(); + RoomEntity setNextPosition(RoomTile nextPosition); + + double getNextZ(); + RoomEntity setNextZ(double nextZ); + RoomTile getTargetPosition(); RoomEntity setTargetPosition(RoomTile targetPosition); diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/RoomEntity.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/RoomEntity.java index bfa82b32..dd664a3a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/RoomEntity.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/RoomEntity.java @@ -7,33 +7,35 @@ import lombok.Setter; import lombok.experimental.Accessors; import java.util.Deque; -import java.util.LinkedList; @Getter @Setter @Accessors(chain = true) public abstract class RoomEntity implements IRoomEntity { - private Room room; - private RoomTile previousPosition; - private double previousZ; - private RoomTile currentPosition; - private double currentZ; - private RoomTile targetPosition; - private double targetZ; - private Deque path = new LinkedList<>(); - private int tilesMoved; + protected Room room; + protected RoomTile previousPosition; + protected double previousZ; + protected RoomTile currentPosition; + protected double currentZ; + protected RoomTile nextPosition; + protected double nextZ; + protected RoomTile targetPosition; + protected double targetZ; + protected Deque path; + protected int tilesMoved; public boolean isAtGoal() { - if(this.currentPosition == null) { - return false; + if(this.targetPosition == null) { + return true; } return this.currentPosition.equals(this.targetPosition); } - public void setPreviousLocation(RoomTile previousLocation) { - this.previousPosition = previousLocation; - this.previousZ = this.getCurrentZ(); + public RoomEntity setCurrentPosition(RoomTile tile) { + this.previousPosition = this.currentPosition; + this.currentPosition = tile; + return this; } public RoomEntity setCurrentZ(double currentZ) { @@ -42,6 +44,11 @@ public abstract class RoomEntity implements IRoomEntity { return this; } + protected void clearNextLocation() { + this.nextPosition = null; + this.nextZ = 0; + } + public synchronized void incrementTilesMoved() { this.tilesMoved++; } @@ -49,4 +56,22 @@ public abstract class RoomEntity implements IRoomEntity { public synchronized void decrementTilesMoved() { this.tilesMoved--; } + + public void clear() { + this.room = null; + + this.previousPosition = null; + this.previousZ = 0; + + this.currentPosition = null; + this.currentZ = 0; + + this.nextPosition = null; + this.nextZ = 0; + + this.targetPosition = null; + this.targetZ = 0; + + this.path = null; + } } \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/items/RoomItem.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/items/RoomItem.java index 66ced663..d8b22003 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/items/RoomItem.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/items/RoomItem.java @@ -53,15 +53,20 @@ import java.util.List; public abstract class RoomItem extends RoomEntity implements Runnable, IEventTriggers { private final int id; private HabboInfo ownerInfo; + /** + * TODO FINISH GET RID OF THIS + */ + @Deprecated private int roomId; + private final Item baseItem; private String wallPosition; private int rotation; private String extraData; private int limitedStack; private int limitedSells; - private boolean needsUpdate = false; - private boolean needsDelete = false; + private boolean sqlUpdateNeeded = false; + private boolean sqlDeleteNeeded = false; private boolean isFromGift = false; @SuppressWarnings("rawtypes") @@ -75,6 +80,7 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri public RoomItem(ResultSet set, Item baseItem) throws SQLException { this.id = set.getInt("id"); this.ownerInfo = Emulator.getGameEnvironment().getHabboManager().getOfflineHabboInfo(set.getInt(DatabaseConstants.USER_ID)); + this.roomId = set.getInt("room_id"); Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(set.getInt("room_id")); @@ -84,8 +90,14 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri this.wallPosition = set.getString("wall_pos"); if(room != null) { - this.setCurrentPosition(room.getLayout().getTile(set.getShort("x"), set.getShort("y"))); - this.setCurrentZ(set.getDouble("z")); + RoomTile itemTile = room.getLayout().getTile(set.getShort("x"), set.getShort("y")); + + if(itemTile == null) { + this.setRoom(null); + } else { + this.setCurrentPosition(itemTile); + this.setCurrentZ(set.getDouble("z")); + } } this.rotation = set.getInt("rot"); @@ -96,8 +108,6 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri this.limitedStack = Integer.parseInt(set.getString("limited_data").split(":")[0]); this.limitedSells = Integer.parseInt(set.getString("limited_data").split(":")[1]); } - - this.setRoom(Emulator.getGameEnvironment().getRoomManager().getRoom(set.getInt("room_id"))); } public RoomItem(int id, HabboInfo ownerInfo, Item item, String extraData, int limitedStack, int limitedSells) { @@ -171,19 +181,19 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri } public boolean needsUpdate() { - return this.needsUpdate; + return this.sqlUpdateNeeded; } public boolean needsDelete() { - return needsDelete; + return sqlDeleteNeeded; } public void needsUpdate(boolean value) { - this.needsUpdate = value; + this.sqlUpdateNeeded = value; } public void needsDelete(boolean value) { - this.needsDelete = value; + this.sqlDeleteNeeded = value; } public boolean isLimited() { @@ -195,24 +205,24 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri @Override public void run() { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) { - if (this.needsDelete) { - this.needsUpdate = false; - this.needsDelete = false; + if (this.sqlDeleteNeeded) { + this.sqlUpdateNeeded = false; + this.sqlDeleteNeeded = false; try (PreparedStatement statement = connection.prepareStatement("DELETE FROM items WHERE id = ?")) { statement.setInt(1, this.getId()); statement.execute(); } - } else if (this.needsUpdate) { + } else if (this.sqlUpdateNeeded) { try (PreparedStatement statement = connection.prepareStatement("UPDATE items SET user_id = ?, room_id = ?, wall_pos = ?, x = ?, y = ?, z = ?, rot = ?, extra_data = ?, limited_data = ? WHERE id = ?")) { statement.setInt(1, this.ownerInfo.getId()); - statement.setInt(2, this.roomId); + statement.setInt(2, (this.getRoom() == null) ? 0 : this.getRoom().getRoomInfo().getId()); statement.setString(3, this.wallPosition); statement.setInt(4, this.getCurrentPosition().getX()); statement.setInt(5, this.getCurrentPosition().getY()); statement.setDouble(6, Math.max(-9999, Math.min(9999, Math.round(this.getCurrentZ() * Math.pow(10, 6)) / Math.pow(10, 6)))); statement.setInt(7, this.rotation); - statement.setString(8, this instanceof InteractionGuildGate ? "" : this.getDatabaseExtraData()); + statement.setString(8, this instanceof InteractionGuildGate ? "" : this.extraData); statement.setString(9, this.limitedStack + ":" + this.limitedSells); statement.setInt(10, this.id); statement.execute(); @@ -221,7 +231,7 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri log.error("SQLException trying to save HabboItem: " + this); } - this.needsUpdate = false; + this.sqlUpdateNeeded = false; } } catch (SQLException e) { @@ -259,7 +269,7 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri if (this.getBaseItem().getEffectF() > 0 || this.getBaseItem().getEffectM() > 0) { Habbo habbo = room.getRoomUnitManager().getHabboByRoomUnit(roomAvatar); - if (habbo != null && habbo.getHabboInfo().getRiding() == null) { + if (habbo != null && !habbo.getRoomUnit().isRiding()) { if (habbo.getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() > 0) { roomAvatar.giveEffect(this.getBaseItem().getEffectM(), -1); return; @@ -299,7 +309,7 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri Habbo habbo = room.getRoomUnitManager().getHabboByRoomUnit(roomAvatar); - if (habbo != null && habbo.getHabboInfo().getRiding() == null) { + if (habbo != null && !habbo.getRoomUnit().isRiding()) { if (habbo.getHabboInfo().getGender().equals(HabboGender.M) && this.getBaseItem().getEffectM() > 0) { roomAvatar.giveEffect(0, -1); } @@ -459,10 +469,6 @@ public abstract class RoomItem extends RoomEntity implements Runnable, IEventTri } } - public String getDatabaseExtraData() { - return this.getExtraData(); - } - @Override public String toString() { return "ID: " + this.id + ", BaseID: " + this.getBaseItem().getId() + ", X: " + this.getCurrentPosition().getX() + ", Y: " + this.getCurrentPosition().getY() + ", Z: " + this.getCurrentZ() + ", Extradata: " + this.extraData; diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/RoomUnit.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/RoomUnit.java index 2ff43d7e..c46eff23 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/RoomUnit.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/RoomUnit.java @@ -10,13 +10,13 @@ import com.eu.habbo.habbohotel.rooms.entities.RoomEntity; import com.eu.habbo.habbohotel.rooms.entities.RoomRotation; import com.eu.habbo.habbohotel.rooms.entities.items.RoomItem; import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomAvatar; +import com.eu.habbo.habbohotel.units.Unit; import com.eu.habbo.habbohotel.users.DanceType; import com.eu.habbo.messages.outgoing.rooms.users.UserUpdateComposer; import com.eu.habbo.plugin.Event; import com.eu.habbo.plugin.events.roomunit.RoomUnitLookAtPointEvent; import com.eu.habbo.plugin.events.roomunit.RoomUnitSetGoalEvent; import com.eu.habbo.util.pathfinding.Rotation; -import gnu.trove.map.TMap; import gnu.trove.map.hash.THashMap; import gnu.trove.set.hash.THashSet; import lombok.Getter; @@ -24,10 +24,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Deque; -import java.util.List; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Slf4j @@ -37,6 +34,8 @@ public abstract class RoomUnit extends RoomEntity { @Setter private int virtualId; @Setter + private Unit unit; + @Setter private RoomUnitType roomUnitType; @Setter private RoomRotation bodyRotation; @@ -49,8 +48,6 @@ public abstract class RoomUnit extends RoomEntity { @Setter private boolean isTeleporting; @Setter - private boolean cmdTeleportEnabled = false; - @Setter private boolean cmdSitEnabled = false; @Setter private boolean cmdStandEnabled = false; @@ -59,50 +56,31 @@ public abstract class RoomUnit extends RoomEntity { @Setter private boolean isSwimming = false; @Setter - private boolean fastWalkEnabled; + private boolean cmdFastWalkEnabled; private final ConcurrentHashMap statuses; @Setter private boolean statusUpdateNeeded; - @Getter @Setter private boolean isWiredTeleporting = false; - @Getter @Setter private boolean isLeavingTeleporter = false; private final THashMap cacheable; - @Getter - @Setter - private boolean animateWalk = false; - @Setter - @Getter - private boolean sitUpdate = false; @Setter private boolean isKicked; @Setter private int kickCount = 0; - @Getter - private RoomTile startLocation; - @Getter - @Setter - private RoomTile botStartLocation; - @Getter - @Setter - @Accessors(chain = true) - private double previousLocationZ; - @Getter @Setter private boolean inRoom; - @Getter @Setter @Accessors(chain = true) private boolean invisible = false; @Setter private boolean canLeaveRoomByDoor = true; + @Setter private int walkTimeOut; private int previousEffectId; private int previousEffectEndTimestamp; private int timeInRoom; - @Getter private RoomRightLevels rightsLevel = RoomRightLevels.NONE; private final THashSet overridableTiles; @@ -113,7 +91,7 @@ public abstract class RoomUnit extends RoomEntity { this.canWalk = true; this.canRotate = true; this.isTeleporting = false; - this.fastWalkEnabled = false; + this.cmdFastWalkEnabled = false; this.statuses = new ConcurrentHashMap<>(); this.statusUpdateNeeded = false; @@ -132,17 +110,21 @@ public abstract class RoomUnit extends RoomEntity { this.overridableTiles = new THashSet<>(); } - public abstract boolean cycle(Room room); + public RoomItem getCurrentItem() { + return this.room.getRoomItemManager().getTopItemAt(this.currentPosition); + } + + public abstract void cycle(); @Override public RoomUnit setCurrentPosition(RoomTile tile) { - if (this.getCurrentPosition() != null) { - this.getCurrentPosition().removeUnit(this); - } - super.setCurrentPosition(tile); - if(this.getCurrentPosition() != null) { + if (this.previousPosition != null) { + this.previousPosition.removeUnit(this); + } + + if(this.currentPosition != null) { tile.addRoomUnit(this); } @@ -155,18 +137,14 @@ public abstract class RoomUnit extends RoomEntity { this.statusUpdateNeeded = true; } - public void clearWalking() { - this.setTargetPosition(null); - this.startLocation = this.getCurrentPosition(); - this.statuses.clear(); - this.cacheable.clear(); - } - public void stopWalking() { synchronized (this.statuses) { - this.statuses.remove(RoomUnitStatus.MOVE); - this.statusUpdateNeeded = true; - this.setGoalLocation(this.getCurrentPosition()); + this.path.clear(); + this.nextPosition = null; + this.targetPosition = null; + this.removeStatus(RoomUnitStatus.MOVE); + this.handleSitStatus(); + this.handleLayStatus(); } } @@ -174,8 +152,8 @@ public abstract class RoomUnit extends RoomEntity { public RoomUnit setCurrentZ(double currentZ) { super.setCurrentZ(currentZ); - if (this.getRoom() != null) { - Bot bot = this.getRoom().getRoomUnitManager().getRoomBotById(getVirtualId()); + if (this.room != null) { + Bot bot = this.room.getRoomUnitManager().getRoomBotById(getVirtualId()); if (bot != null) { bot.needsUpdate(true); } @@ -185,54 +163,79 @@ public abstract class RoomUnit extends RoomEntity { return this; } - public RoomUnit setGoalLocation(RoomTile goalLocation) { - if (goalLocation != null) { - this.setGoalLocation(goalLocation, false); + /** + * Sets the target position for the character's movement and calculates the path to reach the destination. + * + * @param goalLocation The target location (represented by a {@link RoomTile}) to which the character should move. + * @return {@code true} if the path calculation to the goal location is successful, {@code false} otherwise. + * Returns {@code false} if the goal location is not walkable or the character's current room does not allow sitting or laying at that location. + * Additionally, the path calculation may be canceled by registered plugins listening to {@link RoomUnitSetGoalEvent}. + * In such cases, the method also returns {@code false}. + */ + public boolean walkTo(RoomTile goalLocation) { + if(!goalLocation.isWalkable() && !this.room.canSitOrLayAt(goalLocation)) { + return false; } - return this; - } - public void setGoalLocation(RoomTile goalLocation, boolean noReset) { if (Emulator.getPluginManager().isRegistered(RoomUnitSetGoalEvent.class, false)) { - Event event = new RoomUnitSetGoalEvent(this.getRoom(), this, goalLocation); + Event event = new RoomUnitSetGoalEvent(this.room, this, goalLocation); Emulator.getPluginManager().fireEvent(event); if (event.isCancelled()) - return; + return false; } - /// Set start location - this.startLocation = this.getCurrentPosition(); - - if (goalLocation != null && !noReset) { - boolean isWalking = this.hasStatus(RoomUnitStatus.MOVE); - this.setTargetPosition(goalLocation); - - this.findPath(); ///< Quadral: this is where we start formulating a path - if (!this.getPath().isEmpty()) { - this.setTilesMoved(isWalking ? this.getTilesMoved() : 0); - this.setCmdSitEnabled(false); - } else { - this.setTargetPosition(this.getCurrentPosition()); - } + if(this.nextPosition != null) { + this.currentPosition = this.nextPosition; + this.currentZ = this.nextZ; } + + this.targetPosition = goalLocation; + this.findPath(); + return true; } public RoomUnit setLocation(RoomTile location) { if (location != null) { - this.startLocation = location; - this.setPreviousLocation(location); - this.setCurrentPosition(location); - this.setTargetPosition(location); - this.botStartLocation = location; + this.currentPosition = location; + this.targetPosition = location; } return this; } + /** + * Finds a path from the current position to the target position within a room's layout, if valid. + * The method checks if the room, layout, and target position are valid, and if the target position is walkable + * or can be occupied by sitting or laying, or if it can be overridden. + * If all conditions are met, the method attempts to find a path from the current position to the target position + * using the room's layout and sets the path accordingly. + * + * Pre-conditions: + * - The current object must have a valid room set (using the `setRoom(Room room)` method). + * - The target position must be set (using the `setTargetPosition(RoomTile targetPosition)` method). + * + * Post-conditions: + * - If a valid path is found from the current position to the target position, the path is set using the `setPath(Deque path)` method. + * + * Note: + * - The method relies on the validity of the room and layout, and whether the target position is walkable, or can be occupied by sitting or laying, + * or can be overridden. If any of these conditions are not met, the method will not attempt to find a path. + * - The `findPath()` method assumes that the room and layout are well-defined and consistent, and that the target position is within the boundaries of the room's layout. + * - The method may return `null` if no valid path is found from the current position to the target position. + */ public void findPath() { - if (this.getRoom() != null && this.getRoom().getLayout() != null && this.getTargetPosition() != null && (this.getTargetPosition().isWalkable() || this.getRoom().canSitOrLayAt(this.getTargetPosition().getX(), this.getTargetPosition().getY()) || this.canOverrideTile(this.getTargetPosition()))) { - Deque newPath = this.getRoom().getLayout().findPath(this.getCurrentPosition(), this.getTargetPosition(), this.getTargetPosition(), this); - if (newPath != null) this.setPath(newPath); + boolean hasValidRoom = this.room != null; + boolean hasValidLayout = hasValidRoom && this.room.getLayout() != null; + boolean hasValidTargetPosition = this.targetPosition != null; + boolean isTargetPositionWalkable = hasValidTargetPosition && this.targetPosition.isWalkable(); + boolean canSitOrLayAtTarget = hasValidTargetPosition && hasValidRoom && this.room.canSitOrLayAt(this.targetPosition.getX(), this.targetPosition.getY()); + boolean canOverrideTile = hasValidTargetPosition && this.canOverrideTile(this.targetPosition); + + if (hasValidLayout && (isTargetPositionWalkable || canSitOrLayAtTarget || canOverrideTile)) { + Deque newPath = this.room.getLayout().findPath(this.currentPosition, this.targetPosition, this.targetPosition, this); + if (newPath != null) { + this.setPath(newPath); + } } } @@ -248,6 +251,16 @@ public abstract class RoomUnit extends RoomEntity { return this.statuses.get(key); } + public String getCurrentStatuses() { + StringBuilder status = new StringBuilder("/"); + + for (Map.Entry entry : this.statuses.entrySet()) { + status.append(entry.getKey()).append(" ").append(entry.getValue()).append("/"); + } + + return status.toString(); + } + public void addStatus(RoomUnitStatus key, String value) { if (key != null && value != null) { this.statuses.put(key, value); @@ -275,9 +288,9 @@ public abstract class RoomUnit extends RoomEntity { } public void makeStand() { - RoomItem item = this.getRoom().getRoomItemManager().getTopItemAt(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()); + RoomItem item = this.room.getRoomItemManager().getTopItemAt(this.currentPosition.getX(), this.currentPosition.getY()); if (item == null || !item.getBaseItem().allowSit() || !item.getBaseItem().allowLay()) { - this.setCmdStandEnabled(true); + this.cmdStandEnabled = true; this.setBodyRotation(RoomRotation.values()[this.getBodyRotation().getValue() - this.getBodyRotation().getValue() % 2]); this.removeStatus(RoomUnitStatus.SIT); this.instantUpdate(); @@ -289,9 +302,9 @@ public abstract class RoomUnit extends RoomEntity { return; } - this.setCmdSitEnabled(true); + this.cmdSitEnabled = true; this.setBodyRotation(RoomRotation.values()[this.getBodyRotation().getValue() - this.getBodyRotation().getValue() % 2]); - this.addStatus(RoomUnitStatus.SIT, 0.5 + ""); + this.addStatus(RoomUnitStatus.SIT, "0.5"); if(this instanceof RoomAvatar roomAvatar) { roomAvatar.setDance(DanceType.NONE); @@ -300,26 +313,10 @@ public abstract class RoomUnit extends RoomEntity { this.instantUpdate(); } - public TMap getCacheable() { - return this.cacheable; - } - - public int getWalkTimeOut() { - return this.walkTimeOut; - } - - public void setWalkTimeOut(int walkTimeOut) { - this.walkTimeOut = walkTimeOut; - } - public void increaseTimeInRoom() { this.timeInRoom++; } - public int getTimeInRoom() { - return this.timeInRoom; - } - public void resetTimeInRoom() { this.timeInRoom = 0; } @@ -330,7 +327,7 @@ public abstract class RoomUnit extends RoomEntity { } if (Emulator.getPluginManager().isRegistered(RoomUnitLookAtPointEvent.class, false)) { - Event lookAtPointEvent = new RoomUnitLookAtPointEvent(this.getRoom(), this, location); + Event lookAtPointEvent = new RoomUnitLookAtPointEvent(this.room, this, location); Emulator.getPluginManager().fireEvent(lookAtPointEvent); if (lookAtPointEvent.isCancelled()) @@ -341,7 +338,7 @@ public abstract class RoomUnit extends RoomEntity { return; } - RoomRotation rotation = (RoomRotation.values()[Rotation.Calculate(this.getCurrentPosition().getX(), this.getCurrentPosition().getY(), location.getX(), location.getY())]); + RoomRotation rotation = (RoomRotation.values()[Rotation.Calculate(this.currentPosition.getX(), this.currentPosition.getY(), location.getX(), location.getY())]); if (!this.statuses.containsKey(RoomUnitStatus.SIT)) { this.bodyRotation = rotation; @@ -355,9 +352,9 @@ public abstract class RoomUnit extends RoomEntity { } public boolean canOverrideTile(RoomTile tile) { - if (tile == null || this.getRoom() == null || this.getRoom().getLayout() == null) return false; + if (tile == null || this.room == null || this.room.getLayout() == null) return false; - if (this.getRoom().getRoomItemManager().getItemsAt(tile).stream().anyMatch(i -> i.canOverrideTile(this, this.getRoom(), tile))) + if (this.room.getRoomItemManager().getItemsAt(tile).stream().anyMatch(i -> i.canOverrideTile(this, this.room, tile))) return true; int tileIndex = (tile.getX() & 0xFF) | (tile.getY() << 12); @@ -372,28 +369,28 @@ public abstract class RoomUnit extends RoomEntity { } public void removeOverrideTile(RoomTile tile) { - if (this.getRoom() == null || this.getRoom().getLayout() == null) return; + if (this.room == null || this.room.getLayout() == null) return; int tileIndex = (tile.getX() & 0xFF) | (tile.getY() << 12); this.overridableTiles.remove(tileIndex); } public boolean canForcePosture() { - if (this.getRoom() == null) return false; + if (this.room == null) return false; - RoomItem topItem = this.getRoom().getRoomItemManager().getTopItemAt(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()); + RoomItem topItem = this.room.getRoomItemManager().getTopItemAt(this.currentPosition.getX(), this.currentPosition.getY()); return (!(topItem instanceof InteractionWater) && !(topItem instanceof InteractionWaterItem)); } public RoomTile getClosestTile(List tiles) { - return tiles.stream().min(Comparator.comparingDouble(a -> a.distance(this.getCurrentPosition()))).orElse(null); + return tiles.stream().min(Comparator.comparingDouble(a -> a.distance(this.currentPosition))).orElse(null); } public RoomTile getClosestAdjacentTile(short x, short y, boolean diagonal) { - if (this.getRoom() == null) return null; + if (this.room == null) return null; - RoomTile baseTile = this.getRoom().getLayout().getTile(x, y); + RoomTile baseTile = this.room.getLayout().getTile(x, y); if (baseTile == null) return null; @@ -412,75 +409,191 @@ public abstract class RoomUnit extends RoomEntity { return this.getClosestTile( rotations.stream() - .map(rotation -> this.getRoom().getLayout().getTileInFront(baseTile, rotation)) - .filter(t -> t != null && t.isWalkable() && (this.getCurrentPosition().equals(t) || !this.getRoom().getRoomUnitManager().hasHabbosAt(t))) + .map(rotation -> this.room.getLayout().getTileInFront(baseTile, rotation)) + .filter(t -> t != null && t.isWalkable() && (this.currentPosition.equals(t) || !this.room.getRoomUnitManager().hasHabbosAt(t))) .toList() ); } - public boolean handleSitStatus(RoomItem topItem) { - if(topItem == null || !topItem.getBaseItem().allowSit()) { - return false; + public void handleSitStatus() { + if(this.getCurrentItem() == null || !this.getCurrentItem().getBaseItem().allowSit()) { + return; } if(!this.isCmdSitEnabled()) { - if(this.getCurrentPosition().getState().equals(RoomTileState.SIT) && !this.hasStatus(RoomUnitStatus.SIT)) { - this.addStatus(RoomUnitStatus.SIT, String.valueOf(Item.getCurrentHeight(topItem))); - this.setCurrentZ(topItem.getCurrentZ()); - this.setRotation(RoomRotation.values()[topItem.getRotation()]); - return true; - } else if(!topItem.getBaseItem().allowSit() && this.hasStatus(RoomUnitStatus.SIT)) { + if(this.currentPosition.getState().equals(RoomTileState.SIT) && !this.hasStatus(RoomUnitStatus.SIT)) { + this.addStatus(RoomUnitStatus.SIT, String.valueOf(Item.getCurrentHeight(this.getCurrentItem()))); + this.setCurrentZ(this.getCurrentItem().getCurrentZ()); + this.setRotation(RoomRotation.values()[this.getCurrentItem().getRotation()]); + } else if(!this.getCurrentItem().getBaseItem().allowSit() && this.hasStatus(RoomUnitStatus.SIT)) { this.removeStatus(RoomUnitStatus.SIT); this.instantUpdate(); - return true; } } - - return false; } - public boolean handleLayStatus(RoomItem topItem) { - if(topItem == null || !topItem.getBaseItem().allowLay()) { - return false; + public void handleLayStatus() { + if(this.getCurrentItem() == null || !this.getCurrentItem().getBaseItem().allowLay()) { + return; } if(!this.isCmdLayEnabled()) { - if(this.getCurrentPosition().getState().equals(RoomTileState.LAY) && !this.hasStatus(RoomUnitStatus.LAY)) { - this.addStatus(RoomUnitStatus.LAY, String.valueOf(Item.getCurrentHeight(topItem))); - this.setRotation(RoomRotation.values()[topItem.getRotation() % 4]); - - if (topItem.getRotation() == 0 || topItem.getRotation() == 4) { - this.setLocation(this.getRoom().getLayout().getTile(this.getCurrentPosition().getX(), topItem.getCurrentPosition().getY())); - } else { - this.setLocation(this.getRoom().getLayout().getTile(topItem.getCurrentPosition().getX(), this.getCurrentPosition().getY())); - } - return true; - } else if (!topItem.getBaseItem().allowLay() && this.hasStatus(RoomUnitStatus.LAY)) { + if(this.currentPosition.getState().equals(RoomTileState.LAY) && !this.hasStatus(RoomUnitStatus.LAY)) { + this.addStatus(RoomUnitStatus.LAY, String.valueOf(Item.getCurrentHeight(this.getCurrentItem()))); + this.setRotation(RoomRotation.values()[this.getCurrentItem().getRotation() % 4]); + } else if (!this.getCurrentItem().getBaseItem().allowLay() && this.hasStatus(RoomUnitStatus.LAY)) { this.removeStatus(RoomUnitStatus.LAY); this.instantUpdate(); - return true; } } - - return false; } + /** + * Performs an instant update of the character's status to the connected room, if needed. + * The method checks if a status update is required based on the internal flag `statusUpdateNeeded`. + * If an update is needed, the method sends the character's updated status information to the room + * using the {@link UserUpdateComposer}, effectively synchronizing the character's status with other room participants. + * After the update is sent, the `statusUpdateNeeded` flag is reset to false until the next change in the character's status. + * Note: This method is typically called when an immediate status update is necessary, such as when a status change occurs + * and should be communicated to other room users without delay. + */ public void instantUpdate() { if(this.statusUpdateNeeded) { this.statusUpdateNeeded = false; - this.getRoom().sendComposer(new UserUpdateComposer(this).compose()); + this.room.sendComposer(new UserUpdateComposer(this).compose()); } } + /** + * Processes the character's walking behavior based on its current walking state. + * If the character is currently walking, the method executes the necessary steps to continue the movement. + * The process involves updating the character's status, position, rotation, and height while moving along the computed path. + * If the character reaches the destination tile, walking is stopped. + * If the character encounters an invalid tile during its path, it recalculates the path to find an alternative route. + * The method also handles fast walking when enabled, allowing the character to move more quickly through the path. + * Note: This method is typically called in a loop to facilitate continuous character movement. + */ + public void processWalking() { + if(this.isWalking()) { + this.statuses.entrySet().removeIf(entry -> entry.getKey().isRemoveWhenWalking()); + + if(this.getNextPosition() != null) { + this.currentPosition = this.getNextPosition(); + this.currentZ = this.getNextZ(); + } + + if(!this.path.isEmpty()) { + RoomTile next = this.path.poll(); + + if(this.path.size() > 1 && this.cmdFastWalkEnabled) { + next = this.path.poll(); + } + + if(next == null || !this.isValidTile(next)) { + this.path.clear(); + this.findPath(); + + if(this.path.isEmpty()) { + return; + } + + next = this.path.poll(); + } + + RoomRotation nextRotation = this.handleNextRotation(next); + double nextHeight = this.handleNextHeight(next); + + this.setRotation(nextRotation); + this.addStatus(RoomUnitStatus.MOVE, next.getX() + "," + next.getY() + "," + nextHeight); + this.nextPosition = next; + this.nextZ = nextHeight; + } else { + this.stopWalking(); + } + } + } + + private RoomRotation handleNextRotation(RoomTile next) { + return RoomRotation.values()[Rotation.Calculate(this.currentPosition.getX(), this.currentPosition.getY(), next.getX(), next.getY())]; + } + + private double handleNextHeight(RoomTile next) { + double height = 0.0D; + + RoomItem nextTileItem = this.room.getRoomItemManager().getTopItemAt(next); + + if(nextTileItem != null) { + height += nextTileItem.getNextZ(); + + if (!nextTileItem.getBaseItem().allowSit() && !nextTileItem.getBaseItem().allowLay()) { + height += Item.getCurrentHeight(nextTileItem); + } + } else { + height += this.room.getLayout().getHeightAtSquare(next.getX(), next.getY()); + } + + return height; + } + + /** + * Checks whether the provided {@link RoomTile} is a valid tile for the character to walk on. + * + * @param tile The {@link RoomTile} to be validated. + * @return {@code true} if the tile is valid for walking, {@code false} otherwise. + * Returns {@code true} if the character can override the tile (e.g., walk on furniture). + * Otherwise, the method checks various conditions to determine the tile's validity: + * - The tile's height difference from the character's current height should be within the allowable step height range. + * - The tile should not be blocked, invalid, or have an open state with a height difference above the maximum step height. + * - If the room allows walkthrough, the tile should not be occupied by other room units (excluding the character's target position). + * - If the room disallows walkthrough, the tile should not be occupied by any room units. + * - If there's a room item on the tile, it is considered a valid tile. + */ + private boolean isValidTile(RoomTile tile) { + boolean canOverrideTile = this.canOverrideTile(tile); + if (canOverrideTile) { + return true; + } + + double heightDifference = tile.getStackHeight() - this.currentZ; + + boolean areRoomUnitsAtTile = this.room.getRoomUnitManager().areRoomUnitsAt(tile); + boolean isAboveMaximumStepHeight = (!RoomLayout.ALLOW_FALLING && heightDifference < -RoomLayout.MAXIMUM_STEP_HEIGHT); + boolean isOpenTileAboveMaxHeight = (tile.getState() == RoomTileState.OPEN && heightDifference > RoomLayout.MAXIMUM_STEP_HEIGHT); + boolean isTileBlocked = tile.getState().equals(RoomTileState.BLOCKED) || tile.getState().equals(RoomTileState.INVALID); + + if(isTileBlocked || isAboveMaximumStepHeight || isOpenTileAboveMaxHeight) { + return false; + } else { + if(this.room.getRoomInfo().isAllowWalkthrough()) { + if(areRoomUnitsAtTile && !this.targetPosition.equals(tile)) { + return false; + } + } else { + if(areRoomUnitsAtTile) { + return false; + } + } + } + + RoomItem item = this.room.getRoomItemManager().getTopItemAt(tile); + + if(item != null) { + return true; + } + + return true; + } + public void clear() { - this.setRoom(null); + super.clear(); + this.canWalk = true; this.canRotate = true; - this.fastWalkEnabled = false; - this.cmdTeleportEnabled = false; + this.cmdFastWalkEnabled = false; this.clearStatuses(); this.previousEffectId = 0; this.previousEffectEndTimestamp = -1; this.isKicked = false; + this.cacheable.clear(); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomAvatar.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomAvatar.java index c7fbd1c7..cea754ad 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomAvatar.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomAvatar.java @@ -1,12 +1,10 @@ package com.eu.habbo.habbohotel.rooms.entities.units.types; import com.eu.habbo.Emulator; -import com.eu.habbo.habbohotel.items.Item; -import com.eu.habbo.habbohotel.items.interactions.interfaces.ConditionalGate; import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.pets.RideablePet; -import com.eu.habbo.habbohotel.rooms.*; -import com.eu.habbo.habbohotel.rooms.entities.RoomRotation; +import com.eu.habbo.habbohotel.rooms.RoomTile; +import com.eu.habbo.habbohotel.rooms.RoomUnitStatus; import com.eu.habbo.habbohotel.rooms.entities.items.RoomItem; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnit; import com.eu.habbo.habbohotel.users.DanceType; @@ -16,37 +14,33 @@ import com.eu.habbo.habbohotel.wired.WiredTriggerType; import com.eu.habbo.messages.outgoing.rooms.users.AvatarEffectMessageComposer; import com.eu.habbo.messages.outgoing.rooms.users.DanceMessageComposer; import com.eu.habbo.messages.outgoing.rooms.users.UserUpdateComposer; -import com.eu.habbo.plugin.Event; -import com.eu.habbo.plugin.events.users.UserIdleEvent; -import com.eu.habbo.plugin.events.users.UserTakeStepEvent; -import com.eu.habbo.threading.runnables.RoomUnitKick; -import com.eu.habbo.util.pathfinding.Rotation; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; -import java.util.*; +import java.util.ArrayList; +import java.util.List; @Slf4j @Getter @Setter @Accessors(chain = true) public class RoomAvatar extends RoomUnit { - private RideablePet rideablePet; - private boolean rideLock; - private DanceType danceType; - private int handItem; - private long handItemTimestamp; - private int effectId; - private int effectEndTimestamp; - private int previousEffectId; - private int previousEffectEndTimestamp; + protected RideablePet ridingPet; + protected boolean rideLocked; + protected DanceType danceType; + protected int handItem; + protected long handItemTimestamp; + protected int effectId; + protected int effectEndTimestamp; + protected int previousEffectId; + protected int previousEffectEndTimestamp; public RoomAvatar() { super(); - this.rideablePet = null; + this.ridingPet = null; this.danceType = DanceType.NONE; this.handItem = 0; this.handItemTimestamp = 0; @@ -57,267 +51,61 @@ public class RoomAvatar extends RoomUnit { } @Override - public boolean cycle(Room room) { - try { - if (this.hasStatus(RoomUnitStatus.SIGN)) { - this.getRoom().sendComposer(new UserUpdateComposer(this).compose()); - this.removeStatus(RoomUnitStatus.SIGN); - } + public void cycle() { + this.handleSignStatus(); + this.processWalking(); + } - if(!this.isWalking() || this.getPath() == null || this.getPath().isEmpty()) { - if (this.hasStatus(RoomUnitStatus.MOVE) && !this.isAnimateWalk()) { - this.removeStatus(RoomUnitStatus.MOVE); - } - - if(!this.isWalking()) { - RoomItem topItem = this.getRoom().getRoomItemManager().getTopItemAt(this.getCurrentPosition()); - return this.handleSitStatus(topItem) || this.handleLayStatus(topItem); - } - } - - Habbo habbo = null; - boolean canFastWalk = false; - - if(this instanceof RoomHabbo roomHabbo) { - habbo = room.getRoomUnitManager().getHabboByRoomUnit(roomHabbo); - canFastWalk = habbo == null || habbo.getHabboInfo().getRiding() == null; - } - - for (Map.Entry set : this.getStatuses().entrySet()) { - if (set.getKey().isRemoveWhenWalking()) { - this.removeStatus(set.getKey()); - } - } - - if (this.getPath() == null || this.getPath().isEmpty()) { - return true; - } - - RoomTile next = this.getPath().poll(); - boolean overrideTile = next != null && this.canOverrideTile(next); - - if (this.getPath().isEmpty()) { - this.setSitUpdate(true); - - if (next != null && room.getRoomUnitManager().areRoomUnitsAt(next) && !overrideTile) { - return false; - } - } - - Deque peekPath = room.getLayout().findPath(this.getCurrentPosition(), this.getPath().peek(), this.getTargetPosition(), this); - - if (peekPath == null) { - peekPath = new LinkedList<>(); - } - - if (peekPath.size() >= 3) { - if (this.getPath().isEmpty()) { - this.setStatusUpdateNeeded(true); - return true; - } - - this.getPath().pop(); - //peekPath.pop(); //Start - peekPath.removeLast(); //End - - if (peekPath.peek() != next) { - next = peekPath.poll(); - for (int i = 0; i < peekPath.size(); i++) { - this.getPath().addFirst(peekPath.removeLast()); - } - } - } - - if (canFastWalk && this.isFastWalkEnabled() && this.getPath().size() > 1) { - next = this.getPath().poll(); - } - - if (next == null) { - this.setStatusUpdateNeeded(true); - return true; - } - - this.removeStatus(RoomUnitStatus.DEAD); - - if (habbo != null) { - RoomHabbo roomHabbo = (RoomHabbo) this; - if (roomHabbo.isIdle()) { - UserIdleEvent event = new UserIdleEvent(habbo, UserIdleEvent.IdleReason.WALKED, false); - Emulator.getPluginManager().fireEvent(event); - - if (!event.isCancelled() && !event.isIdle()) { - roomHabbo.unIdle(); - } - } - - if (Emulator.getPluginManager().isRegistered(UserTakeStepEvent.class, false)) { - Event e = new UserTakeStepEvent(habbo, room.getLayout().getTile(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()), next); - Emulator.getPluginManager().fireEvent(e); - - if (e.isCancelled()) { - this.setStatusUpdateNeeded(true); - return true; - } - - } - } - - RoomItem item = room.getRoomItemManager().getTopItemAt(next.getX(), next.getY()); - - double height = next.getStackHeight() - this.getCurrentPosition().getStackHeight(); - - if (!room.getLayout().tileWalkable(next) || (!RoomLayout.ALLOW_FALLING && height < -RoomLayout.MAXIMUM_STEP_HEIGHT) || (next.getState() == RoomTileState.OPEN && height > RoomLayout.MAXIMUM_STEP_HEIGHT)) { - this.getPath().clear(); - this.findPath(); - - if (this.getPath().isEmpty()) { - this.removeStatus(RoomUnitStatus.MOVE); - return false; - } - next = this.getPath().pop(); - } - - boolean canSitNextTile = room.canSitAt(next.getX(), next.getY()); - - if (canSitNextTile) { - RoomItem tallestChair = room.getRoomItemManager().getTallestChair(next); - - if (tallestChair != null) - item = tallestChair; - } - - if (next.equals(this.getTargetPosition()) && next.getState() == RoomTileState.SIT && !overrideTile && (item == null || item.getCurrentZ() - this.getCurrentZ() > RoomLayout.MAXIMUM_STEP_HEIGHT)) { - this.removeStatus(RoomUnitStatus.MOVE); + @Override + public boolean walkTo(RoomTile goalLocation) { + if (this.hasStatus(RoomUnitStatus.LAY)) { + if (this.room.getLayout().getTilesInFront(this.getCurrentPosition(), this.getBodyRotation().getValue(), 2).contains(goalLocation)) return false; - } - - double zHeight = 0.0D; - - if(habbo != null && habbo.getHabboInfo().getRiding() != null) { - zHeight += 1.0D; - } - - RoomItem roomItem = room.getRoomItemManager().getTopItemAt(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()); - if (roomItem != null && (roomItem != item || !RoomLayout.pointInSquare(roomItem.getCurrentPosition().getX(), roomItem.getCurrentPosition().getY(), roomItem.getCurrentPosition().getX() + roomItem.getBaseItem().getWidth() - 1, roomItem.getCurrentPosition().getY() + roomItem.getBaseItem().getLength() - 1, next.getX(), next.getY()))) - roomItem.onWalkOff(this, room, new Object[]{this.getCurrentPosition(), next}); - - - this.incrementTilesMoved(); - - RoomRotation oldRotation = this.getBodyRotation(); - - this.setRotation(RoomRotation.values()[Rotation.Calculate(this.getCurrentPosition().getX(), this.getCurrentPosition().getY(), next.getX(), next.getY())]); - if (item != null) { - if (item != roomItem || !RoomLayout.pointInSquare(item.getCurrentPosition().getX(), item.getCurrentPosition().getY(), item.getCurrentPosition().getX() + item.getBaseItem().getWidth() - 1, item.getCurrentPosition().getY() + item.getBaseItem().getLength() - 1, this.getCurrentPosition().getX(), this.getCurrentPosition().getY())) { - if (item.canWalkOn(this, room, null)) { - item.onWalkOn(this, room, new Object[]{this.getCurrentPosition(), next}); - } else if (item instanceof ConditionalGate conditionalGate) { - this.setRotation(oldRotation); - this.decrementTilesMoved(); - this.setGoalLocation(this.getCurrentPosition()); - this.removeStatus(RoomUnitStatus.MOVE); - this.instantUpdate(); - - if(this instanceof RoomHabbo) { - conditionalGate.onRejected(this, this.getRoom(), new Object[]{}); - } - - return false; - } - } else { - item.onWalk(this, room, new Object[]{this.getCurrentPosition(), next}); - } - - zHeight += item.getCurrentZ(); - - if (!item.getBaseItem().allowSit() && !item.getBaseItem().allowLay()) { - zHeight += Item.getCurrentHeight(item); - } - } else { - zHeight += room.getLayout().getHeightAtSquare(next.getX(), next.getY()); - } - - this.setPreviousLocation(this.getCurrentPosition()); - - this.addStatus(RoomUnitStatus.MOVE, next.getX() + "," + next.getY() + "," + zHeight); - - if(habbo != null) { - RideablePet rideablePet = habbo.getHabboInfo().getRiding(); - - if(rideablePet != null) { - RoomUnit ridingUnit = rideablePet.getRoomUnit(); - - if (ridingUnit != null) { - ridingUnit.setPreviousLocationZ(this.getCurrentZ()); - this.setCurrentZ(zHeight - 1.0); - ridingUnit.setRotation(RoomRotation.values()[Rotation.Calculate(this.getCurrentPosition().getX(), this.getCurrentPosition().getY(), next.getX(), next.getY())]); - ridingUnit.setPreviousLocation(this.getCurrentPosition()); - ridingUnit.setGoalLocation(this.getTargetPosition()); - ridingUnit.addStatus(RoomUnitStatus.MOVE, next.getX() + "," + next.getY() + "," + (zHeight - 1.0)); - room.sendComposer(new UserUpdateComposer(ridingUnit).compose()); - } - } - } - - this.setCurrentZ(zHeight); - this.setCurrentPosition(room.getLayout().getTile(next.getX(), next.getY())); - - if(this instanceof RoomHabbo roomHabbo) { - roomHabbo.resetIdleTicks(); - } - - if(habbo != null) { - RoomItem topItem = room.getRoomItemManager().getTopItemAt(next); - - boolean isAtDoor = next.getX() == room.getLayout().getDoorX() && next.getY() == room.getLayout().getDoorY(); - boolean publicRoomKicks = !room.getRoomInfo().isPublicRoom() || Emulator.getConfig().getBoolean("hotel.room.public.doortile.kick"); - boolean invalidated = topItem != null && topItem.invalidatesToRoomKick(); - - if (this.isCanLeaveRoomByDoor() && isAtDoor && publicRoomKicks && !invalidated) { - Emulator.getThreading().run(new RoomUnitKick(habbo, room, false), 500); - } - } - - return false; - - } catch (Exception e) { - log.error("Caught exception", e); - return false; } + + if (this.room.canLayAt(goalLocation)) { + RoomItem bed = this.room.getRoomItemManager().getTopItemAt(goalLocation.getX(), goalLocation.getY()); + + if (bed != null && bed.getBaseItem().allowLay()) { + this.room.getLayout().getTile(bed.getCurrentPosition().getX(), bed.getCurrentPosition().getY()); + RoomTile pillow = switch (bed.getRotation()) { + case 0, 4 -> this.room.getLayout().getTile(goalLocation.getX(), bed.getCurrentPosition().getY()); + case 2, 8 -> this.room.getLayout().getTile(bed.getCurrentPosition().getX(), goalLocation.getY()); + default -> this.room.getLayout().getTile(bed.getCurrentPosition().getX(), bed.getCurrentPosition().getY()); + }; + + if (pillow != null && this.room.canLayAt(pillow)) { + goalLocation = pillow; + } + } + } + + return super.walkTo(goalLocation); } public void dismountPet(boolean isRemoving) { - Habbo habbo = null; - - if(this instanceof RoomHabbo roomHabbo) { - habbo = this.getRoom().getRoomUnitManager().getHabboByRoomUnit(roomHabbo); - } - - if(habbo == null || habbo.getHabboInfo().getRiding() == null) { + if(!this.isRiding()) { return; } - RideablePet ridingPet = habbo.getHabboInfo().getRiding(); + this.ridingPet.setRider(null); + this.ridingPet.setTask(PetTasks.FREE); - ridingPet.setRider(null); - ridingPet.setTask(PetTasks.FREE); - - habbo.getHabboInfo().setRiding(null); + this.ridingPet = null; this.giveEffect(0, -1); - this.setCurrentZ(ridingPet.getRoomUnit().getCurrentZ()); - this.setPreviousLocationZ(ridingPet.getRoomUnit().getCurrentZ()); + this.setCurrentZ(this.ridingPet.getRoomUnit().getCurrentZ()); this.stopWalking(); - ridingPet.getRoomUnit().stopWalking(); + this.ridingPet.getRoomUnit().stopWalking(); this.instantUpdate(); - ridingPet.getRoomUnit().instantUpdate(); + this.ridingPet.getRoomUnit().instantUpdate(); - List availableTiles = isRemoving ? new ArrayList<>() : this.getRoom().getLayout().getWalkableTilesAround(this.getCurrentPosition()); + List availableTiles = isRemoving ? new ArrayList<>() : this.room.getLayout().getWalkableTilesAround(this.getCurrentPosition()); RoomTile tile = availableTiles.isEmpty() ? this.getCurrentPosition() : availableTiles.get(0); - this.setGoalLocation(tile); + this.walkTo(tile); this.setStatusUpdateNeeded(true); } @@ -325,12 +113,12 @@ public class RoomAvatar extends RoomUnit { if (this.danceType != danceType) { boolean isDancing = !this.danceType.equals(DanceType.NONE); this.danceType = danceType; - this.getRoom().sendComposer(new DanceMessageComposer(this).compose()); + this.room.sendComposer(new DanceMessageComposer(this).compose()); if (danceType.equals(DanceType.NONE) && isDancing) { - WiredHandler.handle(WiredTriggerType.STOPS_DANCING, this, this.getRoom(), new Object[]{this}); + WiredHandler.handle(WiredTriggerType.STOPS_DANCING, this, this.room, new Object[]{this}); } else if (!danceType.equals(DanceType.NONE) && !isDancing) { - WiredHandler.handle(WiredTriggerType.STARTS_DANCING, this, this.getRoom(), new Object[]{this}); + WiredHandler.handle(WiredTriggerType.STARTS_DANCING, this, this.room, new Object[]{this}); } } } @@ -355,7 +143,7 @@ public class RoomAvatar extends RoomUnit { } if(this instanceof RoomHabbo) { - Habbo habbo = this.getRoom().getRoomUnitManager().getHabboByRoomUnit(this); + Habbo habbo = this.room.getRoomUnitManager().getHabboByRoomUnit(this); if(habbo == null || (habbo.getHabboInfo().isInGame() && !forceEffect)) { return; } @@ -367,11 +155,11 @@ public class RoomAvatar extends RoomUnit { duration += Emulator.getIntUnixTimestamp(); } - if ((this.getRoom().isAllowEffects() || forceEffect) && !this.isSwimming()) { + if ((this.room.isAllowEffects() || forceEffect) && !this.isSwimming()) { this.effectId = effectId; this.effectEndTimestamp = duration; - this.getRoom().sendComposer(new AvatarEffectMessageComposer(this).compose()); + this.room.sendComposer(new AvatarEffectMessageComposer(this).compose()); } } @@ -380,11 +168,22 @@ public class RoomAvatar extends RoomUnit { this.previousEffectEndTimestamp = endTimestamp; } + private void handleSignStatus() { + if (this.hasStatus(RoomUnitStatus.SIGN)) { + this.room.sendComposer(new UserUpdateComposer(this).compose()); + this.removeStatus(RoomUnitStatus.SIGN); + } + } + + public boolean isRiding() { + return this.ridingPet != null; + } + @Override public void clear() { super.clear(); - this.rideablePet = null; + this.ridingPet = null; this.danceType = DanceType.NONE; this.handItem = 0; this.handItemTimestamp = 0; diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomBot.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomBot.java index 9ca00a75..3f15cfde 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomBot.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomBot.java @@ -1,71 +1,20 @@ package com.eu.habbo.habbohotel.rooms.entities.units.types; -import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.bots.Bot; -import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnitType; -import com.eu.habbo.habbohotel.wired.WiredHandler; -import com.eu.habbo.habbohotel.wired.WiredTriggerType; import lombok.Getter; @Getter public class RoomBot extends RoomAvatar { + private Bot unit; + public RoomBot() { super(); } @Override - public boolean cycle(Room room) { - Bot bot = this.getRoom().getRoomUnitManager().getBotByRoomUnit(this); - - if(bot == null) { - return false; - } - - if (this.getRoom().isAllowBotsWalk()) { - if(bot.canWalk()) { - if (!this.isWalking()) { - if (this.getWalkTimeOut() < Emulator.getIntUnixTimestamp() && bot.getFollowingHabboId() == 0) { - this.setGoalLocation(Emulator.getConfig().getBoolean("hotel.bot.limit.walking.distance", true) ? this.getRoom().getLayout().getRandomWalkableTilesAround(this, this.getRoom().getLayout().getTile(this.getBotStartLocation().getX(), this.getBotStartLocation().getY()), this.getRoom(), Emulator.getConfig().getInt("hotel.bot.limit.walking.distance.radius", 5)) : this.getRoom().getRandomWalkableTile()); - int timeOut = Emulator.getRandom().nextInt(20) * 2; - this.setWalkTimeOut((timeOut < 10 ? 5 : timeOut) + Emulator.getIntUnixTimestamp()); - } - } - } - } - - if (!bot.getChatLines().isEmpty() && bot.getChatTimeOut() <= Emulator.getIntUnixTimestamp() && bot.isChatAuto()) { - if (this.getRoom() != null) { - short test = 0; - - if(bot.isChatRandom()) { - bot.setLastChatIndex((short) Emulator.getRandom().nextInt(bot.getChatLines().size())); - } else if(bot.getLastChatIndex() == bot.getChatLines().size() - 1) { - bot.resetLastChatIndex(); - } else { - bot.incrementLastChatIndex(); - } - - if (bot.getLastChatIndex() >= bot.getChatLines().size()) { - bot.resetLastChatIndex(); - } - - String message = bot.getChatLines().get(bot.getLastChatIndex()) - .replace(Emulator.getTexts().getValue("wired.variable.owner", "%owner%"), this.getRoom().getRoomInfo().getOwnerInfo().getUsername()) - .replace(Emulator.getTexts().getValue("wired.variable.item_count", "%item_count%"), String.valueOf(this.getRoom().getRoomItemManager().getCurrentItems().size())) - .replace(Emulator.getTexts().getValue("wired.variable.name", "%name%"), bot.getName()) - .replace(Emulator.getTexts().getValue("wired.variable.roomname", "%roomname%"), this.getRoom().getRoomInfo().getName()) - .replace(Emulator.getTexts().getValue("wired.variable.user_count", "%user_count%"), String.valueOf(this.getRoom().getRoomUnitManager().getRoomHabbosCount())); - - if(!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this, room, new Object[]{ message })) { - bot.talk(message); - } - - bot.setChatTimeOut(Emulator.getIntUnixTimestamp() + bot.getChatDelay()); - } - } - - return super.cycle(room); + public void cycle() { + super.cycle(); } public RoomUnitType getRoomUnitType() { diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomHabbo.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomHabbo.java index 518ec753..66cbe021 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomHabbo.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomHabbo.java @@ -1,11 +1,17 @@ package com.eu.habbo.habbohotel.rooms.entities.units.types; +import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnitType; import com.eu.habbo.habbohotel.users.DanceType; +import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.outgoing.rooms.users.RoomUnitOnRollerComposer; import com.eu.habbo.messages.outgoing.rooms.users.SleepMessageComposer; +import com.eu.habbo.plugin.events.users.UserIdleEvent; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -16,9 +22,12 @@ import lombok.extern.slf4j.Slf4j; @Setter @Accessors(chain = true) public class RoomHabbo extends RoomAvatar { + private Habbo unit; private Room loadingRoom; private Room previousRoom; + private boolean cmdTeleportEnabled; + // @Setter // private boolean isKicked; private int kickCount; @@ -28,13 +37,50 @@ public class RoomHabbo extends RoomAvatar { public RoomHabbo() { super(); - + this.cmdTeleportEnabled = false; // this.isKicked = false; // this.overridableTiles = new HashSet<>(); } - public boolean cycle(Room room) { - return super.cycle(room); + @Override + public void cycle() { + super.cycle(); + } + + @Override + public boolean walkTo(RoomTile goalLocation) { + if(this.rideLocked || this.isTeleporting() || this.isKicked()) { + return false; + } + + if(this.cmdTeleportEnabled) { + if (this.isRiding()) { + this.room.sendComposer(new RoomUnitOnRollerComposer(this, null, this.currentPosition, this.currentZ, goalLocation, goalLocation.getStackHeight() + 1.0D, this.room).compose()); + this.room.sendComposer(new RoomUnitOnRollerComposer(this.ridingPet.getRoomUnit(), goalLocation, this.room).compose()); + } else { + this.room.sendComposer(new RoomUnitOnRollerComposer(this, goalLocation, this.room).compose()); + } + + return false; + } + + if (this.isRiding() && this.ridingPet.getTask() != null && this.ridingPet.getTask().equals(PetTasks.JUMP)) { + return false; + } + + // Reset idle status + if (this.isIdle()) { + UserIdleEvent event = new UserIdleEvent(this.unit, UserIdleEvent.IdleReason.WALKED, false); + Emulator.getPluginManager().fireEvent(event); + + if (!event.isCancelled()) { + if (!event.isIdle()) { + this.unIdle(); + } + } + } + + return super.walkTo(goalLocation); } public boolean isLoadingRoom() { @@ -56,17 +102,17 @@ public class RoomHabbo extends RoomAvatar { this.setDance(DanceType.NONE); } - this.getRoom().sendComposer(new SleepMessageComposer(this).compose()); + this.room.sendComposer(new SleepMessageComposer(this).compose()); - WiredHandler.handle(WiredTriggerType.IDLES, this, this.getRoom(), new Object[]{this}); + WiredHandler.handle(WiredTriggerType.IDLES, this, this.room, new Object[]{this}); } public void unIdle() { this.resetIdleTicks(); - this.getRoom().sendComposer(new SleepMessageComposer(this).compose()); + this.room.sendComposer(new SleepMessageComposer(this).compose()); - WiredHandler.handle(WiredTriggerType.UNIDLES, this, this.getRoom(), new Object[]{this}); + WiredHandler.handle(WiredTriggerType.UNIDLES, this, this.room, new Object[]{this}); } public boolean isIdle() { @@ -92,5 +138,6 @@ public class RoomHabbo extends RoomAvatar { @Override public void clear() { super.clear(); + this.cmdTeleportEnabled = false; } } diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomPet.java b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomPet.java index 9607678a..45cee9b3 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomPet.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/entities/units/types/RoomPet.java @@ -1,184 +1,24 @@ package com.eu.habbo.habbohotel.rooms.entities.units.types; -import com.eu.habbo.habbohotel.items.Item; -import com.eu.habbo.habbohotel.items.interactions.interfaces.ConditionalGate; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.RideablePet; -import com.eu.habbo.habbohotel.rooms.*; -import com.eu.habbo.habbohotel.rooms.entities.RoomRotation; -import com.eu.habbo.habbohotel.rooms.entities.items.RoomItem; +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.rooms.RoomUnitStatus; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnit; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnitType; import com.eu.habbo.habbohotel.users.Habbo; -import com.eu.habbo.util.pathfinding.Rotation; import lombok.extern.slf4j.Slf4j; -import java.util.Deque; -import java.util.LinkedList; -import java.util.Map; - @Slf4j public class RoomPet extends RoomUnit { + private Pet unit; + public RoomPet() { super(); } @Override - public boolean cycle(Room room) { - try { - Pet pet = this.getRoom().getRoomUnitManager().getPetByRoomUnit(this); - - if(pet == null) { - return false; - } - - if (this.handleRider(pet, room)) { - return true; - } - - if(!this.isWalking() || this.getPath() == null || this.getPath().isEmpty()) { - if (this.hasStatus(RoomUnitStatus.MOVE) && !this.isAnimateWalk()) { - this.removeStatus(RoomUnitStatus.MOVE); - } - - if(!this.isWalking()) { - RoomItem topItem = this.getRoom().getRoomItemManager().getTopItemAt(this.getCurrentPosition()); - return this.handleSitStatus(topItem) || this.handleLayStatus(topItem); - } - } - - for (Map.Entry set : this.getStatuses().entrySet()) { - if (set.getKey().isRemoveWhenWalking()) { - this.removeStatus(set.getKey()); - } - } - - if (this.getPath() == null || this.getPath().isEmpty()) { - return true; - } - - RoomTile next = this.getPath().poll(); - boolean overrideChecks = next != null && this.canOverrideTile(next); - - if (this.getPath().isEmpty()) { - this.setSitUpdate(true); - - if (next != null && room.getRoomUnitManager().areRoomUnitsAt(next) && !overrideChecks) { - return false; - } - } - - Deque peekPath = room.getLayout().findPath(this.getCurrentPosition(), this.getPath().peek(), this.getTargetPosition(), this); - - if (peekPath == null) { - peekPath = new LinkedList<>(); - } - - if (peekPath.size() >= 3) { - if (this.getPath().isEmpty()) { - this.setStatusUpdateNeeded(true); - return true; - } - - this.getPath().pop(); - //peekPath.pop(); //Start - peekPath.removeLast(); //End - - if (peekPath.peek() != next) { - next = peekPath.poll(); - for (int i = 0; i < peekPath.size(); i++) { - this.getPath().addFirst(peekPath.removeLast()); - } - } - } - - if (next == null) { - this.setStatusUpdateNeeded(true); - return true; - } - - this.removeStatus(RoomUnitStatus.DEAD); - - RoomItem item = room.getRoomItemManager().getTopItemAt(next.getX(), next.getY()); - - double height = next.getStackHeight() - this.getCurrentPosition().getStackHeight(); - if (!room.getLayout().tileWalkable(next) || (!RoomLayout.ALLOW_FALLING && height < -RoomLayout.MAXIMUM_STEP_HEIGHT) || (next.getState() == RoomTileState.OPEN && height > RoomLayout.MAXIMUM_STEP_HEIGHT)) { - this.getPath().clear(); - this.findPath(); - - if (this.getPath().isEmpty()) { - this.removeStatus(RoomUnitStatus.MOVE); - return false; - } - next = this.getPath().pop(); - - } - - boolean canSitNextTile = room.canSitAt(next.getX(), next.getY()); - - if (canSitNextTile) { - RoomItem tallestChair = room.getRoomItemManager().getTallestChair(next); - - if (tallestChair != null) - item = tallestChair; - } - - if (next.equals(this.getTargetPosition()) && next.getState() == RoomTileState.SIT && !overrideChecks && (item == null || item.getCurrentZ() - this.getCurrentZ() > RoomLayout.MAXIMUM_STEP_HEIGHT)) { - this.removeStatus(RoomUnitStatus.MOVE); - return false; - } - - double zHeight = 0.0D; - - RoomItem roomItem = room.getRoomItemManager().getTopItemAt(this.getCurrentPosition().getX(), this.getCurrentPosition().getY()); - if (roomItem != null && (roomItem != item || !RoomLayout.pointInSquare(roomItem.getCurrentPosition().getX(), roomItem.getCurrentPosition().getY(), roomItem.getCurrentPosition().getX() + roomItem.getBaseItem().getWidth() - 1, roomItem.getCurrentPosition().getY() + roomItem.getBaseItem().getLength() - 1, next.getX(), next.getY()))) - roomItem.onWalkOff(this, room, new Object[]{this.getCurrentPosition(), next}); - - - this.incrementTilesMoved(); - - RoomRotation oldRotation = this.getBodyRotation(); - this.setRotation(RoomRotation.values()[Rotation.Calculate(this.getCurrentPosition().getX(), this.getCurrentPosition().getY(), next.getX(), next.getY())]); - if (item != null) { - if (item != roomItem || !RoomLayout.pointInSquare(item.getCurrentPosition().getX(), item.getCurrentPosition().getY(), item.getCurrentPosition().getX() + item.getBaseItem().getWidth() - 1, item.getCurrentPosition().getY() + item.getBaseItem().getLength() - 1, this.getCurrentPosition().getX(), this.getCurrentPosition().getY())) { - if (item.canWalkOn(this, room, null)) { - item.onWalkOn(this, room, new Object[]{this.getCurrentPosition(), next}); - } else if (item instanceof ConditionalGate conditionalGate) { - this.setRotation(oldRotation); - this.decrementTilesMoved(); - this.setGoalLocation(this.getCurrentPosition()); - this.removeStatus(RoomUnitStatus.MOVE); - this.instantUpdate(); - - return false; - } - } else { - item.onWalk(this, room, new Object[]{this.getCurrentPosition(), next}); - } - - zHeight += item.getCurrentZ(); - - if (!item.getBaseItem().allowSit() && !item.getBaseItem().allowLay()) { - zHeight += Item.getCurrentHeight(item); - } - } else { - zHeight += room.getLayout().getHeightAtSquare(next.getX(), next.getY()); - } - - - this.setPreviousLocation(this.getCurrentPosition()); - - this.addStatus(RoomUnitStatus.MOVE, next.getX() + "," + next.getY() + "," + zHeight); - - this.setCurrentZ(zHeight); - this.setCurrentPosition(room.getLayout().getTile(next.getX(), next.getY())); - - return false; - } catch (Exception e) { - log.error("Caught exception", e); - return false; - } - } + public void cycle() {} public boolean handleRider(Pet pet, Room room) { Habbo rider = null; @@ -198,8 +38,6 @@ public class RoomPet extends RoomUnit { if (!this.getCurrentPosition().equals(rider.getRoomUnit().getCurrentPosition())) { this.addStatus(RoomUnitStatus.MOVE, rider.getRoomUnit().getCurrentPosition().getX() + "," + rider.getRoomUnit().getCurrentPosition().getY() + "," + (rider.getRoomUnit().getCurrentPosition().getStackHeight())); - this.setPreviousLocation(rider.getRoomUnit().getPreviousPosition()); - this.setPreviousLocationZ(rider.getRoomUnit().getPreviousPosition().getStackHeight()); this.setCurrentPosition(rider.getRoomUnit().getCurrentPosition()); this.setCurrentZ(rider.getRoomUnit().getCurrentPosition().getStackHeight()); } diff --git a/src/main/java/com/eu/habbo/habbohotel/units/Unit.java b/src/main/java/com/eu/habbo/habbohotel/units/Unit.java index 52e6e721..aece2d88 100644 --- a/src/main/java/com/eu/habbo/habbohotel/units/Unit.java +++ b/src/main/java/com/eu/habbo/habbohotel/units/Unit.java @@ -6,6 +6,6 @@ import lombok.Setter; @Getter @Setter -public class Unit { +public abstract class Unit { private RoomUnit roomUnit; } \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java b/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java index 6d9b98e2..2b0bd2e2 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java @@ -70,6 +70,8 @@ public class Habbo extends Unit implements Runnable { this.messenger.loadFriendRequests(this); this.roomUnit = new RoomHabbo(); + this.roomUnit.setUnit(this); + this.update = false; } diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java index f72e7a18..0affa40a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboInfo.java @@ -8,7 +8,6 @@ import com.eu.habbo.habbohotel.games.GamePlayer; import com.eu.habbo.habbohotel.messenger.MessengerCategory; import com.eu.habbo.habbohotel.navigation.NavigatorSavedSearch; import com.eu.habbo.habbohotel.permissions.PermissionGroup; -import com.eu.habbo.habbohotel.pets.RideablePet; import gnu.trove.map.hash.TIntIntHashMap; import lombok.Getter; import lombok.Setter; @@ -40,7 +39,6 @@ public class HabboInfo implements Runnable { private int homeRoom; private boolean online; private int roomQueueId; - private RideablePet riding; private Class currentGame; private TIntIntHashMap currencies; private GamePlayer gamePlayer; diff --git a/src/main/java/com/eu/habbo/messages/incoming/hotelview/QuitEvent.java b/src/main/java/com/eu/habbo/messages/incoming/hotelview/QuitEvent.java index 7a8b5c0b..9ed3a345 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/hotelview/QuitEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/hotelview/QuitEvent.java @@ -28,9 +28,7 @@ public class QuitEvent extends MessageHandler { this.client.sendResponse(new CloseConnectionMessageComposer()); } - if (roomHabbo != null) { - roomHabbo.clearWalking(); - roomHabbo.setInRoom(false); - } + roomHabbo.clear(); + roomHabbo.setInRoom(false); } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CustomizeAvatarWithFurniEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CustomizeAvatarWithFurniEvent.java index a5d0a21f..b507f0b8 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CustomizeAvatarWithFurniEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/CustomizeAvatarWithFurniEvent.java @@ -35,7 +35,9 @@ public class CustomizeAvatarWithFurniEvent extends MessageHandler { if (clothing != null) { if (!this.client.getHabbo().getInventory().getWardrobeComponent().getClothing().contains(clothing.getId())) { + //Deprecated item.setRoomId(0); + item.setRoom(null); RoomTile tile = this.client.getHabbo().getRoomUnit().getRoom().getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY()); this.client.getHabbo().getRoomUnit().getRoom().getRoomItemManager().removeRoomItem(item); this.client.getHabbo().getRoomUnit().getRoom().updateTile(tile); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PlacePostItEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PlacePostItEvent.java index e5bc4c86..c925be10 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PlacePostItEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PlacePostItEvent.java @@ -29,7 +29,9 @@ public class PlacePostItEvent extends MessageHandler { if (room.getPostItNotes().size() < Room.MAXIMUM_POSTITNOTES) { room.getRoomItemManager().addRoomItem(item); item.setExtraData("FFFF33"); + //Deprecated item.setRoomId(this.client.getHabbo().getRoomUnit().getRoom().getRoomInfo().getId()); + item.setRoom(this.client.getHabbo().getRoomUnit().getRoom()); item.setWallPosition(location); item.setOwnerInfo(this.client.getHabbo().getHabboInfo()); item.needsUpdate(true); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RemoveItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RemoveItemEvent.java index 6841f9fa..879979aa 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RemoveItemEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RemoveItemEvent.java @@ -24,7 +24,9 @@ public class RemoveItemEvent extends MessageHandler { if (item instanceof InteractionPostIt || item instanceof InteractionExternalImage) { if (item.getOwnerInfo().getId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermissionRight(Permission.ACC_ANYROOMOWNER)) { + //Deprecated item.setRoomId(0); + item.setRoom(null); room.getRoomItemManager().removeRoomItem(item); room.sendComposer(new ItemRemoveMessageComposer(item).compose()); Emulator.getThreading().run(new QueryDeleteHabboItem(item.getId())); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CustomizePetWithFurniEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CustomizePetWithFurniEvent.java index 46737ae3..7dfc73a3 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CustomizePetWithFurniEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/CustomizePetWithFurniEvent.java @@ -85,7 +85,9 @@ public class CustomizePetWithFurniEvent extends MessageHandler { room.getRoomItemManager().removeRoomItem(item); room.sendComposer(new RemoveFloorItemComposer(item, true).compose()); + //Deprecated item.setRoomId(0); + item.setRoom(null); Emulator.getGameEnvironment().getItemManager().deleteItem(item); } } else if (pet instanceof MonsterplantPet) { diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MountPetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MountPetEvent.java index 291983e0..18c4941d 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MountPetEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MountPetEvent.java @@ -29,8 +29,8 @@ public class MountPetEvent extends MessageHandler { } //dismount - if (habbo.getHabboInfo().getRiding() != null) { - boolean mountAnotherPet = petId != habbo.getHabboInfo().getRiding().getId(); + if (habbo.getRoomUnit().isRiding()) { + boolean mountAnotherPet = petId != habbo.getRoomUnit().getRidingPet().getId(); habbo.getRoomUnit().dismountPet(false); @@ -57,8 +57,8 @@ public class MountPetEvent extends MessageHandler { } RoomTile goalTile = availableTiles.get(0); - habbo.getRoomUnit().setGoalLocation(goalTile); - habbo.getRoomUnit().setRideLock(true); + habbo.getRoomUnit().walkTo(goalTile); + habbo.getRoomUnit().setRideLocked(true); Emulator.getThreading().run(new RoomUnitRidePet(rideablePet, habbo, goalTile)); rideablePet.getRoomUnit().setWalkTimeOut(3 + Emulator.getIntUnixTimestamp()); rideablePet.getRoomUnit().stopWalking(); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java index 94a18293..be3ad3b0 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/MovePetEvent.java @@ -24,10 +24,8 @@ public class MovePetEvent extends MessageHandler { if (tile != null) { pet.getRoomUnit().setLocation(tile); - pet.getRoomUnit().setPreviousLocation(tile); pet.getRoomUnit().setCurrentZ(tile.getZ()); pet.getRoomUnit().setRotation(RoomRotation.fromValue(this.packet.readInt())); - pet.getRoomUnit().setPreviousLocationZ(pet.getRoomUnit().getCurrentZ()); room.sendComposer(new UserUpdateComposer(pet.getRoomUnit()).compose()); pet.setNeedsUpdate(true); } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PlacePetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PlacePetEvent.java index 8bad80f6..83e081da 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PlacePetEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/PlacePetEvent.java @@ -6,7 +6,6 @@ import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.rooms.RoomUnitStatus; -import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnit; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnitType; import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomPet; import com.eu.habbo.messages.incoming.MessageHandler; @@ -17,6 +16,7 @@ import com.eu.habbo.messages.outgoing.rooms.pets.RoomPetComposer; public class PlacePetEvent extends MessageHandler { @Override public void handle() { + //TODO Improve This Room room = this.client.getHabbo().getRoomUnit().getRoom(); if (room == null) @@ -74,22 +74,23 @@ public class PlacePetEvent extends MessageHandler { } pet.setRoom(room); - RoomUnit roomUnit = pet.getRoomUnit(); + RoomPet roomPet = pet.getRoomUnit(); - if (roomUnit == null) { - roomUnit = new RoomPet(); + if (roomPet == null) { + roomPet = new RoomPet(); + roomPet.setUnit(pet); } - roomUnit.setRoom(room); + roomPet.setRoom(room); - roomUnit.setLocation(tile); - roomUnit.setCurrentZ(tile.getStackHeight()); - roomUnit.addStatus(RoomUnitStatus.SIT, "0"); - roomUnit.setRoomUnitType(RoomUnitType.PET); + roomPet.setLocation(tile); + roomPet.setCurrentZ(tile.getStackHeight()); + roomPet.addStatus(RoomUnitStatus.SIT, "0"); + roomPet.setRoomUnitType(RoomUnitType.PET); if (playerTile != null) { - roomUnit.lookAtPoint(playerTile); + roomPet.lookAtPoint(playerTile); } - pet.setRoomUnit(roomUnit); + pet.setRoomUnit(roomPet); room.getRoomUnitManager().addRoomUnit(pet); pet.setNeedsUpdate(true); Emulator.getThreading().run(pet); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RespectPetEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RespectPetEvent.java index e61b8109..76ef0283 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RespectPetEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/RespectPetEvent.java @@ -37,7 +37,7 @@ public class RespectPetEvent extends MessageHandler { RoomTile tile = habbo.getRoomUnit().getClosestAdjacentTile(pet.getRoomUnit().getCurrentPosition().getX(), pet.getRoomUnit().getCurrentPosition().getY(), true); if(tile != null) { - habbo.getRoomUnit().setGoalLocation(tile); + habbo.getRoomUnit().walkTo(tile); } Emulator.getThreading().run(new RoomUnitWalkToLocation(habbo.getRoomUnit(), tile, room, tasks, tasks)); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/MoveAvatarEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/MoveAvatarEvent.java index 9cca3aa2..cbdc673e 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/MoveAvatarEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/MoveAvatarEvent.java @@ -1,23 +1,14 @@ package com.eu.habbo.messages.incoming.rooms.users; -import com.eu.habbo.Emulator; -import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomTile; -import com.eu.habbo.habbohotel.rooms.RoomUnitStatus; -import com.eu.habbo.habbohotel.rooms.entities.items.RoomItem; import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomHabbo; import com.eu.habbo.habbohotel.users.Habbo; 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; import lombok.extern.slf4j.Slf4j; @Slf4j public class MoveAvatarEvent extends MessageHandler { - - @Override public int getRatelimit() { return 500; @@ -25,156 +16,52 @@ public class MoveAvatarEvent extends MessageHandler { @Override public void handle() throws Exception { - if (this.client.getHabbo().getRoomUnit().getRoom() != null) { - int x = this.packet.readInt(); // Position X - int y = this.packet.readInt(); // Position Y + int x = this.packet.readInt(); + int y = this.packet.readInt(); - // Get Habbo object - Habbo habbo = this.client.getHabbo(); + Habbo habbo = this.client.getHabbo(); - if(habbo == null) { + if(habbo == null) { + return; + } + + RoomHabbo roomHabbo = this.client.getHabbo().getRoomUnit(); + + if(roomHabbo == null) { + return; + } + + Room room = habbo.getRoomUnit().getRoom(); + + if (room == null || room.getLayout() == null) { + return; + } + + if (roomHabbo.getCurrentPosition().equals(x,y)) { + return; + } + + if (roomHabbo.getCacheable().get("control") != null) { + habbo = (Habbo) roomHabbo.getCacheable().get("control"); + + if (habbo.getRoomUnit().getRoom() != room) { + habbo.getRoomUnit().getCacheable().remove("controller"); + this.client.getHabbo().getRoomUnit().getCacheable().remove("control"); + habbo = this.client.getHabbo(); + } + } + + roomHabbo = habbo.getRoomUnit(); + + if (roomHabbo != null && roomHabbo.isInRoom() && roomHabbo.isCanWalk()) { + RoomTile tile = room.getLayout().getTile((short) x, (short) y); + + if (tile == null) { return; } - // Get Room Habbo object (Unique GUID?) - RoomHabbo roomHabbo = this.client.getHabbo().getRoomUnit(); - - if(roomHabbo == null) { - return; - } - - // If habbo is teleporting, don't calculate a new path - if (roomHabbo.isTeleporting()) { - return; - } - - // If habbo is being kicked don't calculate a new path - if (roomHabbo.isKicked()) { - return; - } - - //Is going to ride a pet, can't cancel - if(roomHabbo.isRideLock()) { - return; - } - - // Get the room the habbo is in - Room room = habbo.getRoomUnit().getRoom(); - - if (room == null || room.getLayout() == null) { - return; - } - - // Don't calulcate a new path if are already at the end position - if (x == roomHabbo.getCurrentPosition().getX() && y == roomHabbo.getCurrentPosition().getY()) { - return; - } - - // If habbo has control (im assuming admin, do something else, but we dont care about this part here) - if (roomHabbo.getCacheable().get("control") != null) { - habbo = (Habbo) roomHabbo.getCacheable().get("control"); - - if (habbo.getRoomUnit().getRoom() != room) { - habbo.getRoomUnit().getCacheable().remove("controller"); - this.client.getHabbo().getRoomUnit().getCacheable().remove("control"); - habbo = this.client.getHabbo(); - } - } - - // Recover roomUnit if necessary - roomHabbo = habbo.getRoomUnit(); - - // If our room unit is not nullptr and we are in a room and we can walk, then calculate a new path - if (roomHabbo != null && roomHabbo.isInRoom() && roomHabbo.isCanWalk()) { - - //If teleport command is enabled - if(roomHabbo.isCmdTeleportEnabled()) { - RoomTile t = room.getLayout().getTile((short) x, (short) y); - - if (habbo.getHabboInfo().getRiding() != null) { - room.sendComposer(new RoomUnitOnRollerComposer(roomHabbo, null, roomHabbo.getCurrentPosition(), roomHabbo.getCurrentZ(), t, t.getStackHeight() + 1.0D, room).compose()); - room.sendComposer(new RoomUnitOnRollerComposer(habbo.getHabboInfo().getRiding().getRoomUnit(), t, room).compose()); - } else { - room.sendComposer(new RoomUnitOnRollerComposer(roomHabbo, t, room).compose()); - } - - return; - } - - // Don't calculate a new path if we are on a horse - if (habbo.getHabboInfo().getRiding() != null && habbo.getHabboInfo().getRiding().getTask() != null && habbo.getHabboInfo().getRiding().getTask().equals(PetTasks.JUMP)) { - return; - } - - // Reset idle status - if (roomHabbo.isIdle()) { - UserIdleEvent event = new UserIdleEvent(habbo, UserIdleEvent.IdleReason.WALKED, false); - Emulator.getPluginManager().fireEvent(event); - - if (!event.isCancelled()) { - if (!event.isIdle()) { - if (roomHabbo.getRoom() != null) { - roomHabbo.unIdle(); - } - } - } - } - - // Get room height map - RoomTile tile = room.getLayout().getTile((short) x, (short) y); - - // this should never happen, if it does it would be a design flaw - if (tile == null) { - return; - } - - // Don't care - if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.LAY)) { - if (room.getLayout().getTilesInFront(habbo.getRoomUnit().getCurrentPosition(), habbo.getRoomUnit().getBodyRotation().getValue(), 2).contains(tile)) - return; - } - - if (room.canLayAt(tile)) { - RoomItem bed = room.getRoomItemManager().getTopItemAt(tile.getX(), tile.getY()); - - if (bed != null && bed.getBaseItem().allowLay()) { - room.getLayout().getTile(bed.getCurrentPosition().getX(), bed.getCurrentPosition().getY()); - RoomTile pillow = switch (bed.getRotation()) { - case 0, 4 -> room.getLayout().getTile((short) x, bed.getCurrentPosition().getY()); - case 2, 8 -> room.getLayout().getTile(bed.getCurrentPosition().getX(), (short) y); - default -> - room.getLayout().getTile(bed.getCurrentPosition().getX(), bed.getCurrentPosition().getY()); - }; - - if (pillow != null && room.canLayAt(pillow)) { - roomHabbo.setGoalLocation(pillow); - return; - } - } - } - - THashSet items = room.getRoomItemManager().getItemsAt(tile); - - if (items.size() > 0) { - for (RoomItem item : items) { - RoomTile overriddenTile = item.getOverrideGoalTile(roomHabbo, 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.getX(), tile.getY())) { - roomHabbo.setGoalLocation(tile); - } - } + log.info("CLICKED ON TILE [x]: {} [y]: {}", tile.getX(), tile.getY()); + roomHabbo.walkTo(tile); } } } diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java index 0b45d625..ffa13289 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUnitOnRollerComposer.java @@ -83,7 +83,6 @@ public class RoomUnitOnRollerComposer extends MessageComposer { this.roomUnit.setLocation(this.newLocation); this.roomUnit.setCurrentZ(this.newLocation.getStackHeight()); - this.roomUnit.setPreviousLocationZ(this.newLocation.getStackHeight()); if (topItemNewLocation != null && topItemNewLocation != roller && oldTopItem != topItemNewLocation) { try { diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserUpdateComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserUpdateComposer.java index 39239c4c..45dd404e 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserUpdateComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserUpdateComposer.java @@ -1,6 +1,5 @@ package com.eu.habbo.messages.outgoing.rooms.users; -import com.eu.habbo.habbohotel.rooms.RoomUnitStatus; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnit; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.messages.ServerMessage; @@ -9,7 +8,6 @@ import com.eu.habbo.messages.outgoing.Outgoing; import gnu.trove.set.hash.THashSet; import java.util.Collection; -import java.util.Map; public class UserUpdateComposer extends MessageComposer { private Collection habbos; @@ -41,42 +39,29 @@ public class UserUpdateComposer extends MessageComposer { this.response.appendInt(this.roomUnits.size()); for (RoomUnit roomUnit : this.roomUnits) { this.response.appendInt(roomUnit.getVirtualId()); - this.response.appendInt(roomUnit.getPreviousPosition().getX()); - this.response.appendInt(roomUnit.getPreviousPosition().getY()); - this.response.appendString((this.overrideZ != -1 ? this.overrideZ : roomUnit.getPreviousLocationZ()) + ""); - + this.response.appendInt(roomUnit.getCurrentPosition().getX()); + this.response.appendInt(roomUnit.getCurrentPosition().getY()); + this.response.appendString(String.valueOf(this.overrideZ != -1 ? this.overrideZ : roomUnit.getCurrentZ())); this.response.appendInt(roomUnit.getHeadRotation().getValue()); this.response.appendInt(roomUnit.getBodyRotation().getValue()); - StringBuilder status = new StringBuilder("/"); - for (Map.Entry entry : roomUnit.getStatuses().entrySet()) { - status.append(entry.getKey()).append(" ").append(entry.getValue()).append("/"); - } - - this.response.appendString(status.toString()); - roomUnit.setPreviousLocation(roomUnit.getCurrentPosition()); + this.response.appendString(roomUnit.getCurrentStatuses()); } } else { synchronized (this.habbos) { this.response.appendInt(this.habbos.size()); for (Habbo habbo : this.habbos) { this.response.appendInt(habbo.getRoomUnit().getVirtualId()); - this.response.appendInt(habbo.getRoomUnit().getPreviousPosition().getX()); - this.response.appendInt(habbo.getRoomUnit().getPreviousPosition().getY()); - this.response.appendString(habbo.getRoomUnit().getPreviousLocationZ() + ""); + this.response.appendInt(habbo.getRoomUnit().getCurrentPosition().getX()); + this.response.appendInt(habbo.getRoomUnit().getCurrentPosition().getY()); + this.response.appendString(String.valueOf(habbo.getRoomUnit().getCurrentZ())); this.response.appendInt(habbo.getRoomUnit().getHeadRotation().getValue()); this.response.appendInt(habbo.getRoomUnit().getBodyRotation().getValue()); - StringBuilder status = new StringBuilder("/"); - - for (Map.Entry entry : habbo.getRoomUnit().getStatuses().entrySet()) { - status.append(entry.getKey()).append(" ").append(entry.getValue()).append("/"); - } - this.response.appendString(status.toString()); - habbo.getRoomUnit().setPreviousLocation(habbo.getRoomUnit().getCurrentPosition()); + this.response.appendString(habbo.getRoomUnit().getCurrentStatuses()); } } } diff --git a/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java index 4e1e0902..c361c32b 100644 --- a/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java +++ b/src/main/java/com/eu/habbo/plugin/events/roomunit/RoomUnitSetGoalEvent.java @@ -16,6 +16,6 @@ public class RoomUnitSetGoalEvent extends RoomUnitEvent { public void setGoal(RoomTile t) { - super.roomUnit.setGoalLocation(t); + super.roomUnit.walkTo(t); } } diff --git a/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java b/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java index 478c4168..5b122bf5 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java +++ b/src/main/java/com/eu/habbo/threading/runnables/BotFollowHabbo.java @@ -40,7 +40,7 @@ public class BotFollowHabbo implements Runnable { } if (target.getX() >= 0 && target.getY() >= 0) { - this.bot.getRoomUnit().setGoalLocation(target); + this.bot.getRoomUnit().walkTo(target); this.bot.getRoomUnit().setCanWalk(true); Emulator.getThreading().run(this, 500); } diff --git a/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java b/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java index 068122d9..a7f3d280 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java +++ b/src/main/java/com/eu/habbo/threading/runnables/ClearRentedSpace.java @@ -24,7 +24,9 @@ public class ClearRentedSpace implements Runnable { for (RoomItem i : this.room.getRoomItemManager().getItemsAt(t)) { if (i.getOwnerInfo().getId() == this.item.getRenterId()) { items.add(i); + //Deprecated i.setRoomId(0); + i.setRoom(null); i.needsUpdate(true); } } diff --git a/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java b/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java index 614df84a..f5aa2255 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java +++ b/src/main/java/com/eu/habbo/threading/runnables/CrackableExplode.java @@ -31,7 +31,9 @@ public class CrackableExplode implements Runnable { if (!this.habboItem.resetable()) { this.room.getRoomItemManager().removeRoomItem(this.habboItem); this.room.sendComposer(new RemoveFloorItemComposer(this.habboItem, true).compose()); + //Deprecated this.habboItem.setRoomId(0); + this.habboItem.setRoom(null); Emulator.getGameEnvironment().getItemManager().deleteItem(this.habboItem); } else { this.habboItem.reset(this.room); @@ -51,8 +53,9 @@ public class CrackableExplode implements Runnable { } else { newItem.setCurrentPosition(this.tile); newItem.setCurrentZ(this.room.getStackHeight(this.tile.getX(), this.tile.getY(), false)); - + //Deprecated newItem.setRoomId(this.room.getRoomInfo().getId()); + newItem.setRoom(this.room); newItem.needsUpdate(true); this.room.getRoomItemManager().addRoomItem(newItem); this.room.updateItem(newItem); diff --git a/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java b/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java index 0f074672..ad3b71db 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java +++ b/src/main/java/com/eu/habbo/threading/runnables/OneWayGateActionOne.java @@ -21,13 +21,9 @@ public class OneWayGateActionOne implements Runnable { RoomTile t = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(this.oneWayGate.getCurrentPosition().getX(), this.oneWayGate.getCurrentPosition().getY()), (this.oneWayGate.getRotation() + 4) % 8); - if (this.client.getHabbo().getRoomUnit().isAnimateWalk()) { - this.client.getHabbo().getRoomUnit().setAnimateWalk(false); - } - if (t.isWalkable()) { if (this.room.getLayout().tileWalkable(t) && this.client.getHabbo().getRoomUnit().getCurrentPosition().getX() == this.oneWayGate.getCurrentPosition().getX() && this.client.getHabbo().getRoomUnit().getCurrentPosition().getY() == this.oneWayGate.getCurrentPosition().getY()) { - this.client.getHabbo().getRoomUnit().setGoalLocation(t); + this.client.getHabbo().getRoomUnit().walkTo(t); if (!this.oneWayGate.getExtraData().equals("0")) { Emulator.getThreading().run(new HabboItemNewState(this.oneWayGate, this.room, "0"), 1000); diff --git a/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java b/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java index edc3ab1a..b7230e04 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java +++ b/src/main/java/com/eu/habbo/threading/runnables/PetFollowHabbo.java @@ -30,7 +30,7 @@ public class PetFollowHabbo implements Runnable { if (target.getX() >= 0 && target.getY() >= 0) { if (this.pet.getRoom().getLayout().tileWalkable(target)) { - this.pet.getRoomUnit().setGoalLocation(target); + this.pet.getRoomUnit().walkTo(target); this.pet.getRoomUnit().setCanWalk(true); this.pet.setTask(PetTasks.FOLLOW); } diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRidePet.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRidePet.java index 0d7d2e59..cc63da40 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRidePet.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitRidePet.java @@ -24,13 +24,11 @@ public class RoomUnitRidePet implements Runnable { if (habbo.getRoomUnit().getCurrentPosition().distance(pet.getRoomUnit().getCurrentPosition()) <= 1) { habbo.getRoomUnit().stopWalking(); habbo.getRoomUnit().giveEffect(77, -1); - habbo.getHabboInfo().setRiding(pet); + habbo.getRoomUnit().setRidingPet(pet); habbo.getRoomUnit().setCurrentPosition(this.pet.getRoomUnit().getCurrentPosition()); - habbo.getRoomUnit().setPreviousLocation(this.pet.getRoomUnit().getCurrentPosition()); habbo.getRoomUnit().setCurrentZ(this.pet.getRoomUnit().getCurrentZ() + 1); - habbo.getRoomUnit().setPreviousLocationZ(this.pet.getRoomUnit().getCurrentZ() + 1); habbo.getRoomUnit().setRotation(this.pet.getRoomUnit().getBodyRotation()); - habbo.getRoomUnit().setRideLock(false); + habbo.getRoomUnit().setRideLocked(false); pet.setRider(habbo); habbo.getRoomUnit().getRoom().sendComposer(new UserUpdateComposer(habbo.getRoomUnit()).compose()); habbo.getRoomUnit().getRoom().sendComposer(new AvatarEffectMessageComposer(habbo.getRoomUnit()).compose()); @@ -38,7 +36,7 @@ public class RoomUnitRidePet implements Runnable { } else { pet.getRoomUnit().setWalkTimeOut(3 + Emulator.getIntUnixTimestamp()); pet.getRoomUnit().stopWalking(); - habbo.getRoomUnit().setGoalLocation(goalTile); + habbo.getRoomUnit().walkTo(goalTile); Emulator.getThreading().run(this, 500); } } diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java index 197c6f89..2ae7a6f2 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java @@ -46,9 +46,7 @@ public class RoomUnitTeleport implements Runnable { } this.roomUnit.setPath(new LinkedList<>()); this.roomUnit.setCurrentPosition(newLocation); - this.roomUnit.setPreviousLocation(newLocation); this.roomUnit.setCurrentZ(this.z); - this.roomUnit.setPreviousLocationZ(this.z); this.roomUnit.removeStatus(RoomUnitStatus.MOVE); //ServerMessage teleportMessage = new RoomUnitOnRollerComposer(this.roomUnit, newLocation, this.room).compose(); this.roomUnit.setLocation(newLocation); diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java index 208f773e..bd73bbf7 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleportWalkToAction.java @@ -35,7 +35,7 @@ public class RoomUnitTeleportWalkToAction implements Runnable { log.error("Caught exception", e); } } else if (tile.isWalkable()) { - this.habbo.getRoomUnit().setGoalLocation(tile); + this.habbo.getRoomUnit().walkTo(tile); Emulator.getThreading().run(this, (long) this.habbo.getRoomUnit().getPath().size() + 2 * 510); } diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java index 999b0b1d..df9e9c86 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitVendingMachineAction.java @@ -36,7 +36,7 @@ public class RoomUnitVendingMachineAction implements Runnable { } } else { if (this.room.getLayout().getTile(tile.getX(), tile.getY()).isWalkable()) { - this.habbo.getRoomUnit().setGoalLocation(tile); + this.habbo.getRoomUnit().walkTo(tile); Emulator.getThreading().run(this, (long) this.habbo.getRoomUnit().getPath().size() + 2 * 510); } } diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java index 118f2a98..88fa53f8 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToRoomUnit.java @@ -64,7 +64,7 @@ public class RoomUnitWalkToRoomUnit implements Runnable { return; } - this.walker.setGoalLocation(this.goalTile); + this.walker.walkTo(this.goalTile); if (this.walker.getPath().isEmpty() && this.failedReached != null) { for (Runnable r : this.failedReached) { diff --git a/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java b/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java index dbb92645..22092b4f 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java +++ b/src/main/java/com/eu/habbo/threading/runnables/TeleportInteraction.java @@ -42,7 +42,7 @@ class TeleportInteraction extends Thread { this.room.updateItem(this.teleportOne); RoomTile tile = RoomItem.getSquareInFront(this.room.getLayout(), this.teleportTwo); if (tile != null) { - this.client.getHabbo().getRoomUnit().setGoalLocation(tile); + this.client.getHabbo().getRoomUnit().walkTo(tile); } Emulator.getThreading().run(this.teleportTwo, 500); Emulator.getThreading().run(this.teleportOne, 500); @@ -95,7 +95,7 @@ class TeleportInteraction extends Thread { this.state = 4; Emulator.getThreading().run(this, 500); } else if (this.state == 2) { - this.client.getHabbo().getRoomUnit().setGoalLocation(this.room.getLayout().getTile(this.teleportOne.getCurrentPosition().getX(), this.teleportOne.getCurrentPosition().getY())); + this.client.getHabbo().getRoomUnit().walkTo(this.room.getLayout().getTile(this.teleportOne.getCurrentPosition().getX(), this.teleportOne.getCurrentPosition().getY())); this.client.getHabbo().getRoomUnit().setRotation(RoomRotation.values()[this.newRotation(this.teleportOne.getRotation())]); this.client.getHabbo().getRoomUnit().addStatus(RoomUnitStatus.MOVE, this.teleportOne.getCurrentPosition().getX() + "," + this.teleportOne.getCurrentPosition().getY() + "," + this.teleportOne.getCurrentZ()); //room.sendComposer(new RoomUserStatusComposer(this.client.getHabbo().getRoomUnit())); diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java index 408e82a9..0e41dea4 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionFive.java @@ -19,7 +19,7 @@ class HopperActionFive implements Runnable { this.client.getHabbo().getRoomUnit().setTeleporting(false); RoomTile tile = this.room.getLayout().getTileInFront(this.room.getLayout().getTile(this.currentTeleport.getCurrentPosition().getX(), this.currentTeleport.getCurrentPosition().getY()), this.currentTeleport.getRotation()); if (tile != null) { - this.client.getHabbo().getRoomUnit().setGoalLocation(tile); + this.client.getHabbo().getRoomUnit().walkTo(tile); } Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, this.room, "0"), 1000); diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java index 1b97cbd9..3f7c1188 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionOne.java @@ -23,7 +23,6 @@ public class HopperActionOne implements Runnable { this.room.scheduledComposers.add(new UserUpdateComposer(this.client.getHabbo().getRoomUnit()).compose()); this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(this.teleportOne.getCurrentPosition().getX(), this.teleportOne.getCurrentPosition().getY())); this.client.getHabbo().getRoomUnit().setCurrentZ(this.teleportOne.getCurrentZ()); - this.client.getHabbo().getRoomUnit().setPreviousLocationZ(this.teleportOne.getCurrentZ()); Emulator.getThreading().run(() -> { HopperActionOne.this.client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE); diff --git a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java index 2cd4aa22..aca84321 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java +++ b/src/main/java/com/eu/habbo/threading/runnables/hopper/HopperActionThree.java @@ -43,7 +43,6 @@ class HopperActionThree implements Runnable { targetTeleport.setExtraData("2"); targetRoom.updateItem(targetTeleport); this.client.getHabbo().getRoomUnit().setLocation(this.room.getLayout().getTile(targetTeleport.getCurrentPosition().getX(), targetTeleport.getCurrentPosition().getY())); - this.client.getHabbo().getRoomUnit().setPreviousLocationZ(targetTeleport.getCurrentZ()); this.client.getHabbo().getRoomUnit().setCurrentZ(targetTeleport.getCurrentZ()); this.client.getHabbo().getRoomUnit().setRotation(RoomRotation.values()[targetTeleport.getRotation() % 8]); this.client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE); diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java index df1826e9..034c1d1c 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionFive.java @@ -49,7 +49,7 @@ class TeleportActionFive implements Runnable { }); unit.setCanLeaveRoomByDoor(false); - unit.setGoalLocation(tile); + unit.walkTo(tile); unit.setStatusUpdateNeeded(true); unit.setLeavingTeleporter(true); Emulator.getThreading().run(new RoomUnitWalkToLocation(unit, tile, room, onSuccess, onSuccess)); diff --git a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java index 16400f3c..a80e13c2 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java +++ b/src/main/java/com/eu/habbo/threading/runnables/teleport/TeleportActionThree.java @@ -56,7 +56,6 @@ class TeleportActionThree implements Runnable { this.client.getHabbo().getRoomUnit().getPath().clear(); this.client.getHabbo().getRoomUnit().removeStatus(RoomUnitStatus.MOVE); this.client.getHabbo().getRoomUnit().setCurrentZ(teleportLocation.getStackHeight()); - this.client.getHabbo().getRoomUnit().setPreviousLocationZ(teleportLocation.getStackHeight()); if (targetRoom != this.room) { this.room.getRoomUnitManager().removeHabbo(this.client.getHabbo(), false); @@ -67,10 +66,7 @@ class TeleportActionThree implements Runnable { targetTeleport.setExtraData("2"); targetRoom.updateItem(targetTeleport); - //targetRoom.updateHabbo(this.client.getHabbo()); - //LOGGER.info((targetTeleport.getX() + " | " + targetTeleport.getY()); this.client.getHabbo().getRoomUnit().setRoom(targetRoom); - //Emulator.getThreading().run(new HabboItemNewState(this.currentTeleport, this.room, "0"), 500); Emulator.getThreading().run(new TeleportActionFour(targetTeleport, targetRoom, this.client), this.currentTeleport instanceof InteractionTeleportTile ? 0 : 500); }