diff --git a/src/main/java/com/eu/habbo/habbohotel/commands/list/TestCommand.java b/src/main/java/com/eu/habbo/habbohotel/commands/list/TestCommand.java index a7c05e22..a397ccbe 100644 --- a/src/main/java/com/eu/habbo/habbohotel/commands/list/TestCommand.java +++ b/src/main/java/com/eu/habbo/habbohotel/commands/list/TestCommand.java @@ -2,6 +2,10 @@ package com.eu.habbo.habbohotel.commands.list; import com.eu.habbo.habbohotel.commands.Command; import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.rooms.RoomUnitStatus; + +import java.util.Map; +import java.util.Set; public class TestCommand extends Command { public TestCommand() { @@ -10,7 +14,17 @@ public class TestCommand extends Command { @Override public boolean handle(GameClient gameClient, String[] params) { + StringBuilder message = new StringBuilder("RoomUnit Statuses"); + Set> statuses = gameClient.getHabbo().getRoomUnit().getStatuses().entrySet(); + + message.append("(").append(statuses.size()).append("):\r\n"); + + for(Map.Entry status : statuses) { + message.append(status.getKey().toString()).append("\r"); + } + + gameClient.getHabbo().alert(new String[]{message.toString()}); return true; } } 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 e884a59f..952527d7 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -784,7 +784,9 @@ public class Room implements Comparable, ISerialize, Runnable { habbo.getHabboStats().getChatCounter().decrementAndGet(); } - if (this.cycleRoomUnit(habbo.getRoomUnit())) { + habbo.getRoomUnit().cycle(this); + + if(habbo.getRoomUnit().isStatusUpdateNeeded()) { habbo.getRoomUnit().setStatusUpdateNeeded(false); updatedUnit.add(habbo.getRoomUnit()); } 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 7aef2ba5..67c88d87 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java @@ -381,12 +381,6 @@ public class RoomItemManager { THashSet occupiedTiles = this.room.getLayout().getTilesAt(targetTile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); THashSet newOccupiedTiles = this.room.getLayout().getTilesAt(targetTile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); - FurnitureMovementError fits = this.furnitureFitsAt(targetTile, item, rotation, true); - - if (!fits.equals(FurnitureMovementError.NONE) && !pluginHelper) { - return fits; - } - RoomItem topItem = this.getTopItemAt(occupiedTiles, null); if ((stackHelper.isEmpty() && !pluginHelper) || item.getBaseItem().getInteractionType().getType() == InteractionWater.class) { @@ -652,21 +646,15 @@ public class RoomItemManager { THashSet occupiedTiles = this.room.getLayout().getTilesAt(targetTile, baseItem.getWidth(), baseItem.getLength(), rotation); - for (RoomTile t : occupiedTiles) { - if (t.getState() == RoomTileState.INVALID) { + for (RoomTile occupiedTile : occupiedTiles) { + if (occupiedTile.getState() == RoomTileState.INVALID) { return FurnitureMovementError.INVALID_MOVE; } - if (!wiredPlaceUnder || (!item.isWalkable() && !baseItem.allowSit() && !baseItem.allowLay())) { - if (checkForUnits) { - if (this.room.getRoomUnitManager().hasHabbosAt(t)) { - return FurnitureMovementError.TILE_HAS_HABBOS; - } else if (this.room.getRoomUnitManager().hasBotsAt(t)) { - return FurnitureMovementError.TILE_HAS_BOTS; - } else if (this.room.getRoomUnitManager().hasPetsAt(t)) { - return FurnitureMovementError.TILE_HAS_PETS; - } - } + if(!Emulator.getConfig().getBoolean("wired.place.under", false) || (Emulator.getConfig().getBoolean("wired.place.under", false) && !item.isWalkable() && !item.getBaseItem().allowSit() && !item.getBaseItem().allowLay())) { + if (checkForUnits && this.room.getRoomUnitManager().hasHabbosAt(occupiedTile)) return FurnitureMovementError.TILE_HAS_HABBOS; + if (checkForUnits && this.room.getRoomUnitManager().hasBotsAt(occupiedTile)) return FurnitureMovementError.TILE_HAS_BOTS; + if (checkForUnits && this.room.getRoomUnitManager().hasPetsAt(occupiedTile)) return FurnitureMovementError.TILE_HAS_PETS; } } 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 3d9e61e4..38b17b0e 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 @@ -64,6 +64,17 @@ public class RoomAvatar extends RoomUnit { this.removeStatus(RoomUnitStatus.SIGN); } + 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 habboT = room.getRoomUnitManager().getHabboByRoomUnit(this); if (!this.isWalking() && !this.isKicked() && this.removeStatus(RoomUnitStatus.MOVE) == null && habboT != null) { @@ -263,7 +274,7 @@ public class RoomAvatar extends RoomUnit { } if(habbo != null) { - RoomItem topItem = room.getRoomItemManager().getTopItemAt(next.getX(), next.getY()); + 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"); @@ -333,28 +344,49 @@ public class RoomAvatar extends RoomUnit { } } - private void handleSitStatus(RoomItem topItem) { + private boolean handleSitStatus(RoomItem topItem) { + if(topItem == null || !topItem.getBaseItem().allowSit()) { + return false; + } + if(!this.isCmdSitEnabled()) { - if((topItem == null || !topItem.getBaseItem().allowSit()) && this.hasStatus(RoomUnitStatus.SIT)) { - this.removeStatus(RoomUnitStatus.SIT); - this.setStatusUpdateNeeded(true); - } else if(this.getCurrentPosition().getState() == RoomTileState.SIT && (!this.hasStatus(RoomUnitStatus.SIT))) { + if(this.getCurrentPosition().getState().equals(RoomTileState.SIT) && !this.hasStatus(RoomUnitStatus.SIT)) { this.setStatus(RoomUnitStatus.SIT, String.valueOf(Item.getCurrentHeight(topItem))); - this.setStatusUpdateNeeded(true); + this.setCurrentZ(topItem.getZ()); + this.setRotation(RoomRotation.values()[topItem.getRotation()]); + return true; + } else if(!topItem.getBaseItem().allowSit() && this.hasStatus(RoomUnitStatus.SIT)) { + this.removeStatus(RoomUnitStatus.SIT); + return true; } } + + return false; } - private void handleLayStatus(RoomItem topItem) { + private boolean handleLayStatus(RoomItem topItem) { + if(topItem == null || !topItem.getBaseItem().allowLay()) { + return false; + } + if(!this.isCmdLayEnabled()) { - if((topItem == null || !topItem.getBaseItem().allowLay()) && this.hasStatus(RoomUnitStatus.LAY)) { - this.removeStatus(RoomUnitStatus.LAY); - this.setStatusUpdateNeeded(true); - } else if(!this.hasStatus(RoomUnitStatus.LAY)) { + if(this.getCurrentPosition().getState().equals(RoomTileState.LAY) && !this.hasStatus(RoomUnitStatus.LAY)) { this.setStatus(RoomUnitStatus.LAY, String.valueOf(Item.getCurrentHeight(topItem))); - this.setStatusUpdateNeeded(true); + this.setRotation(RoomRotation.values()[topItem.getRotation() % 4]); + + if (topItem.getRotation() == 0 || topItem.getRotation() == 4) { + this.setLocation(this.getRoom().getLayout().getTile(this.getCurrentPosition().getX(), topItem.getY())); + } else { + this.setLocation(this.getRoom().getLayout().getTile(topItem.getX(), this.getCurrentPosition().getY())); + } + return true; + } else if (!topItem.getBaseItem().allowLay() && this.hasStatus(RoomUnitStatus.LAY)) { + this.removeStatus(RoomUnitStatus.LAY); + return true; } } + + return false; } @Override