From 0c21424c5a1f234e8ba36a59d71b312b72782035 Mon Sep 17 00:00:00 2001 From: Beny Date: Mon, 13 May 2019 04:11:27 +0100 Subject: [PATCH] Fix bots, pets and users on rollers --- .../com/eu/habbo/habbohotel/rooms/Room.java | 137 ++++++++---------- .../eu/habbo/habbohotel/rooms/RoomTile.java | 8 + .../rooms/users/RoomUnitOnRollerComposer.java | 8 - 3 files changed, 69 insertions(+), 84 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index b1c6f86d..da90908c 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -24,6 +24,7 @@ import com.eu.habbo.habbohotel.messenger.MessengerBuddy; import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetManager; +import com.eu.habbo.habbohotel.pets.RideablePet; import com.eu.habbo.habbohotel.users.*; import com.eu.habbo.habbohotel.wired.*; import com.eu.habbo.messages.ISerialize; @@ -52,6 +53,7 @@ import com.eu.habbo.plugin.events.users.UserExitRoomEvent; import com.eu.habbo.plugin.events.users.UserIdleEvent; import com.eu.habbo.plugin.events.users.UserRightsTakenEvent; import com.eu.habbo.plugin.events.users.UserRolledEvent; +import com.eu.habbo.threading.runnables.RoomUnitRidePet; import com.eu.habbo.threading.runnables.YouAreAPirate; import gnu.trove.TCollections; import gnu.trove.iterator.TIntObjectIterator; @@ -1570,11 +1572,13 @@ public class Room implements Comparable, ISerialize, Runnable HabboItem newRoller = null; - THashSet habbosOnRoller = Room.this.getHabbosAt(roller.getX(), roller.getY()); - THashSet botsOnRoller = Room.this.getBotsAt(Room.this.layout.getTile(roller.getX(), roller.getY())); + RoomTile rollerTile = this.getLayout().getTile(roller.getX(), roller.getY()); + + if(rollerTile == null) + return true; + THashSet itemsOnRoller = new THashSet<>(); - RoomTile rollerTile = Room.this.layout.getTile(roller.getX(), roller.getY()); for(HabboItem item : getItemsAt(rollerTile)) { if(item.getZ() >= roller.getZ() + Item.getCurrentHeight(roller)) { @@ -1585,17 +1589,14 @@ public class Room implements Comparable, ISerialize, Runnable // itemsOnRoller.addAll(this.getItemsAt(rollerTile)); itemsOnRoller.remove(roller); - if (habbosOnRoller.isEmpty() && itemsOnRoller.isEmpty() && botsOnRoller.isEmpty()) - { + if (!rollerTile.hasUnits() && itemsOnRoller.isEmpty()) return true; - } RoomTile tileInFront = Room.this.layout.getTileInFront(Room.this.layout.getTile(roller.getX(), roller.getY()), roller.getRotation()); if (tileInFront == null) return true; - if (!Room.this.layout.tileExists(tileInFront.x, tileInFront.y)) return true; @@ -1605,7 +1606,7 @@ public class Room implements Comparable, ISerialize, Runnable if (!tileInFront.getAllowStack() && !(tileInFront.isWalkable() || tileInFront.state == RoomTileState.SIT || tileInFront.state == RoomTileState.LAY)) return true; - if (Room.this.hasHabbosAt(tileInFront.x, tileInFront.y)) + if (tileInFront.hasUnits()) return true; THashSet itemsNewTile = new THashSet<>(); @@ -1679,92 +1680,76 @@ public class Room implements Comparable, ISerialize, Runnable roomUserRolledEvent = new UserRolledEvent(null, null, null); } - for (Habbo habbo : habbosOnRoller) - { - if (rolledUnitIds.contains(habbo.getRoomUnit().getId())) continue; + ArrayList unitsOnTile = new ArrayList(rollerTile.getUnits()); - rolledUnitIds.add(habbo.getRoomUnit().getId()); - - if (stackContainsRoller && !allowFurniture && !(topItem != null && topItem.isWalkable())) - continue; - - if (!habbo.getRoomUnit().hasStatus(RoomUnitStatus.MOVE)) - { - RoomTile tile = tileInFront.copy(); - tile.setStackHeight(habbo.getRoomUnit().getZ() + zOffset); - if (roomUserRolledEvent != null) - { - roomUserRolledEvent = new UserRolledEvent(habbo, roller, tile); - Emulator.getPluginManager().fireEvent(roomUserRolledEvent); - - if (roomUserRolledEvent.isCancelled()) - continue; - } - - updatedUnit.remove(habbo.getRoomUnit()); - messages.add(new RoomUnitOnRollerComposer(habbo.getRoomUnit(), roller, habbo.getRoomUnit().getCurrentLocation(), habbo.getRoomUnit().getZ(), tile, tile.getStackHeight(), room)); - - if (itemsOnRoller.isEmpty()) - { - HabboItem item = room.getTopItemAt(tileInFront.x, tileInFront.y); - - if (item != null && itemsNewTile.contains(item)) - { - try - { - item.onWalkOn(habbo.getRoomUnit(), room, null); - } catch (Exception e) - { - Emulator.getLogging().logErrorLine(e); - } - } + for(RoomUnit unit : rollerTile.getUnits()) { + if(unit.getRoomUnitType() == RoomUnitType.PET) { + Pet pet = this.getPet(unit); + if (pet instanceof RideablePet && ((RideablePet) pet).getRider() != null) { + unitsOnTile.remove(unit); } } - - if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.SIT)) - habbo.getRoomUnit().sitUpdate = true; - - break; } - - for (Bot bot: botsOnRoller) - { - if (rolledUnitIds.contains(bot.getRoomUnit().getId())) continue; - rolledUnitIds.add(bot.getRoomUnit().getId()); + for(RoomUnit unit : unitsOnTile) { + if (rolledUnitIds.contains(unit.getId())) continue; if (stackContainsRoller && !allowFurniture && !(topItem != null && topItem.isWalkable())) continue; - if (!bot.getRoomUnit().hasStatus(RoomUnitStatus.MOVE)) + if(unit.hasStatus(RoomUnitStatus.MOVE)) + continue; + + RoomTile tile = tileInFront.copy(); + tile.setStackHeight(unit.getZ() + zOffset); + + if (roomUserRolledEvent != null && unit.getRoomUnitType() == RoomUnitType.USER) { - RoomTile tile = tileInFront.copy(); - tile.setStackHeight(bot.getRoomUnit().getZ() + zOffset); + roomUserRolledEvent = new UserRolledEvent(getHabbo(unit), roller, tile); + Emulator.getPluginManager().fireEvent(roomUserRolledEvent); - updatedUnit.remove(bot.getRoomUnit()); - messages.add(new RoomUnitOnRollerComposer(bot.getRoomUnit(), roller, bot.getRoomUnit().getCurrentLocation(), bot.getRoomUnit().getZ(), tile, tile.getStackHeight(), room)); + if (roomUserRolledEvent.isCancelled()) + continue; + } - if (itemsOnRoller.isEmpty()) + // horse riding + boolean isRiding = false; + if(unit.getRoomUnitType() == RoomUnitType.USER) { + Habbo rollingHabbo = this.getHabbo(unit); + RideablePet riding = rollingHabbo.getHabboInfo().getRiding(); + if(riding != null) { + RoomUnit ridingUnit = riding.getRoomUnit(); + tile.setStackHeight(ridingUnit.getZ() + zOffset); + rolledUnitIds.add(ridingUnit.getId()); + updatedUnit.remove(ridingUnit); + messages.add(new RoomUnitOnRollerComposer(ridingUnit, roller, ridingUnit.getCurrentLocation(), ridingUnit.getZ(), tile, tile.getStackHeight(), room)); + isRiding = true; + } + } + + rolledUnitIds.add(unit.getId()); + updatedUnit.remove(unit); + messages.add(new RoomUnitOnRollerComposer(unit, roller, unit.getCurrentLocation(), unit.getZ() + (isRiding ? 1 : 0), tile, tile.getStackHeight() + (isRiding ? 1 : 0), room)); + + if (itemsOnRoller.isEmpty()) + { + HabboItem item = room.getTopItemAt(tileInFront.x, tileInFront.y); + + if (item != null && itemsNewTile.contains(item)) { - HabboItem item = room.getTopItemAt(tileInFront.x, tileInFront.y); - - if (item != null && itemsNewTile.contains(item)) + try { - try - { - item.onWalkOn(bot.getRoomUnit(), room, null); - } catch (Exception e) - { - Emulator.getLogging().logErrorLine(e); - } + item.onWalkOn(unit, room, null); + } catch (Exception e) + { + Emulator.getLogging().logErrorLine(e); } } } - if (bot.getRoomUnit().hasStatus(RoomUnitStatus.SIT)) - bot.getRoomUnit().sitUpdate = true; - - break; + if(unit.hasStatus(RoomUnitStatus.SIT)) { + unit.sitUpdate = true; + } } } 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 356af4ff..6b0f4918 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomTile.java @@ -2,6 +2,10 @@ package com.eu.habbo.habbohotel.rooms; import gnu.trove.set.hash.THashSet; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; + public class RoomTile { public final short x; @@ -205,6 +209,10 @@ public class RoomTile return this.x == x && this.y == y; } + public List getUnits() { + return new ArrayList(this.units); + } + public void addUnit(RoomUnit unit) { if(!this.units.contains(unit)) { this.units.add(unit); 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 d8a2469c..42c1b93b 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 @@ -46,14 +46,6 @@ public class RoomUnitOnRollerComposer extends MessageComposer if(!this.room.isLoaded()) return null; - if (!this.room.isAllowWalkthrough() && this.roller != null) - { - if (this.room.hasHabbosAt(this.newLocation.x, this.newLocation.y)) - { - return null; - } - } - this.response.init(Outgoing.ObjectOnRollerComposer); this.response.appendInt(this.oldLocation.x); this.response.appendInt(this.oldLocation.y);