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 97484248..3afd12e0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java @@ -113,15 +113,19 @@ public class BotManager { return; } - if (!room.hasHabbosAt(location.x, location.y) && !location.isWalkable() && location.state != RoomTileState.SIT) + if (room.hasHabbosAt(location.x, location.y) || (!location.isWalkable() && location.state != RoomTileState.SIT && location.state != RoomTileState.LAY)) return; RoomUnit roomUnit = new RoomUnit(); roomUnit.setRotation(RoomUserRotation.SOUTH); roomUnit.setLocation(location); HabboItem topItem = room.getTopItemAt(location.x, location.y); - roomUnit.setZ(roomUnit.getCurrentLocation().getStackHeight()); - roomUnit.setPreviousLocationZ(roomUnit.getCurrentLocation().getStackHeight()); + + double topItemHeight = 0; + if (topItem != null) topItemHeight = Item.getCurrentHeight(topItem); + roomUnit.setPreviousLocationZ(roomUnit.getCurrentLocation().getStackHeight() - topItemHeight); + + roomUnit.setPathFinderRoom(room); roomUnit.setRoomUnitType(RoomUnitType.BOT); roomUnit.setCanWalk(room.isAllowBotsWalk()); @@ -136,7 +140,6 @@ public class BotManager { bot.onPlace(habbo, room); if (topItem != null) { - roomUnit.setZ(topItem.getBaseItem().allowSit() ? topItem.getZ() : topItem.getZ() + Item.getCurrentHeight(topItem)); try { topItem.onWalkOn(bot.getRoomUnit(), room, null); } catch (Exception e) { diff --git a/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java index 376f910c..6b7ff3f5 100644 --- a/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java +++ b/src/main/java/com/eu/habbo/habbohotel/gameclients/GameClient.java @@ -5,6 +5,7 @@ import com.eu.habbo.core.Logging; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.messages.PacketManager; import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.MessageComposer; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -17,12 +18,12 @@ import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; public class GameClient { - public final ConcurrentHashMap incomingPacketCounter = new ConcurrentHashMap<>(25); private final Channel channel; public long lastPacketCounterCleared = Emulator.getIntUnixTimestamp(); private Habbo habbo; private String machineId = ""; + public final ConcurrentHashMap, Long> messageTimestamps = new ConcurrentHashMap<>(); public GameClient(Channel channel) { this.channel = channel; diff --git a/src/main/java/com/eu/habbo/habbohotel/games/Game.java b/src/main/java/com/eu/habbo/habbohotel/games/Game.java index 30d97d03..b64d8292 100644 --- a/src/main/java/com/eu/habbo/habbohotel/games/Game.java +++ b/src/main/java/com/eu/habbo/habbohotel/games/Game.java @@ -91,8 +91,11 @@ public abstract class Game implements Runnable { GameTeam team = this.getTeamForHabbo(habbo); if (team != null && team.isMember(habbo)) { - team.removeMember(habbo.getHabboInfo().getGamePlayer()); - habbo.getHabboInfo().getGamePlayer().reset(); + if (habbo.getHabboInfo().getGamePlayer() != null) { + team.removeMember(habbo.getHabboInfo().getGamePlayer()); + habbo.getHabboInfo().getGamePlayer().reset(); + } + habbo.getHabboInfo().setCurrentGame(null); habbo.getHabboInfo().setGamePlayer(null); habbo.getClient().sendResponse(new GuideSessionPartnerIsPlayingComposer(false)); @@ -101,23 +104,6 @@ public abstract class Game implements Runnable { } } } - - /* - boolean deleteGame = true; - for (GameTeam team : this.teams.values()) - { - if (team.getMembers().size() > 0 ) - { - deleteGame = false; - break; - } - } - - if (deleteGame) - { - this.room.deleteGame(this); - } - */ } diff --git a/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java b/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java index 5a5ba98b..aad945b1 100644 --- a/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java +++ b/src/main/java/com/eu/habbo/habbohotel/games/GameTeam.java @@ -72,7 +72,7 @@ public class GameTeam { for (GamePlayer player : this.members) { if (player == null || player.getHabbo() == null) continue; - player.getHabbo().getHabboInfo().getGamePlayer().reset(); + if (player.getHabbo().getHabboInfo().getGamePlayer() != null) player.getHabbo().getHabboInfo().getGamePlayer().reset(); player.getHabbo().getHabboInfo().setCurrentGame(null); player.getHabbo().getHabboInfo().setGamePlayer(null); } 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 4e6969e2..dbfea5f1 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/ItemManager.java @@ -38,6 +38,7 @@ import com.eu.habbo.habbohotel.items.interactions.games.tag.bunnyrun.Interaction import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagField; import com.eu.habbo.habbohotel.items.interactions.games.tag.icetag.InteractionIceTagPole; import com.eu.habbo.habbohotel.items.interactions.games.tag.rollerskate.InteractionRollerskateField; +import com.eu.habbo.habbohotel.items.interactions.pets.*; import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemHead; import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemLegs; import com.eu.habbo.habbohotel.items.interactions.totems.InteractionTotemPlanet; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java b/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java index 631f15d5..4e9ce06d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/YoutubeManager.java @@ -77,42 +77,44 @@ public class YoutubeManager { long millis = System.currentTimeMillis(); - ExecutorService youtubeDataLoaderPool = Executors.newFixedThreadPool(10); + Emulator.getThreading().run(() -> { + ExecutorService youtubeDataLoaderPool = Executors.newFixedThreadPool(10); - Emulator.getLogging().logStart("YouTube Manager -> Loading..."); + Emulator.getLogging().logStart("YouTube Manager -> Loading..."); - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM youtube_playlists")) { - try (ResultSet set = statement.executeQuery()) { - while (set.next()) { - final int itemId = set.getInt("item_id"); - final String playlistId = set.getString("playlist_id"); + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM youtube_playlists")) { + try (ResultSet set = statement.executeQuery()) { + while (set.next()) { + final int itemId = set.getInt("item_id"); + final String playlistId = set.getString("playlist_id"); - youtubeDataLoaderPool.submit(() -> { - ArrayList playlists = this.playlists.getOrDefault(itemId, new ArrayList<>()); + youtubeDataLoaderPool.submit(() -> { + ArrayList playlists = this.playlists.getOrDefault(itemId, new ArrayList<>()); - YoutubePlaylist playlist = this.getPlaylistDataById(playlistId); - if (playlist != null) { - playlists.add(playlist); - } else { - Emulator.getLogging().logErrorLine("Failed to load YouTube playlist: " + playlistId); - } + YoutubePlaylist playlist = this.getPlaylistDataById(playlistId); + if (playlist != null) { + playlists.add(playlist); + } else { + Emulator.getLogging().logErrorLine("Failed to load YouTube playlist: " + playlistId); + } - this.playlists.put(itemId, playlists); - }); + this.playlists.put(itemId, playlists); + }); + } } + } catch (SQLException e) { + Emulator.getLogging().logSQLException(e); } - } catch (SQLException e) { - Emulator.getLogging().logSQLException(e); - } - youtubeDataLoaderPool.shutdown(); - try { - youtubeDataLoaderPool.awaitTermination(60, TimeUnit.SECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } + youtubeDataLoaderPool.shutdown(); + try { + youtubeDataLoaderPool.awaitTermination(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } - Emulator.getLogging().logStart("YouTube Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + Emulator.getLogging().logStart("YouTube Manager -> Loaded! (" + (System.currentTimeMillis() - millis) + " MS)"); + }); } public YoutubePlaylist getPlaylistDataById(String playlistId) { diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java index 36d978e8..791109a4 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionTrophy.java @@ -1,16 +1,11 @@ package com.eu.habbo.habbohotel.items.interactions; -import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.items.Item; -import com.eu.habbo.habbohotel.rooms.Room; -import com.eu.habbo.habbohotel.rooms.RoomUnit; -import com.eu.habbo.habbohotel.users.HabboItem; -import com.eu.habbo.messages.ServerMessage; import java.sql.ResultSet; import java.sql.SQLException; -public class InteractionTrophy extends HabboItem { +public class InteractionTrophy extends InteractionDefault { public InteractionTrophy(ResultSet set, Item baseItem) throws SQLException { super(set, baseItem); } @@ -18,41 +13,4 @@ public class InteractionTrophy extends HabboItem { public InteractionTrophy(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { super(id, userId, item, extradata, limitedStack, limitedSells); } - - @Override - public void serializeExtradata(ServerMessage serverMessage) { - serverMessage.appendInt((this.isLimited() ? 256 : 0)); - serverMessage.appendString(this.getExtradata()); - super.serializeExtradata(serverMessage); - } - - @Override - public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) { - return true; - } - - @Override - public boolean isWalkable() { - return false; - } - - @Override - public void onClick(GameClient client, Room room, Object[] objects) throws Exception { - super.onClick(client, room, objects); - } - - @Override - public void onWalk(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { - - } - - @Override - public void onWalkOn(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { - - } - - @Override - public void onWalkOff(RoomUnit roomUnit, Room room, Object[] objects) throws Exception { - - } } 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 4ddc40bf..55b96e98 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 @@ -83,11 +83,10 @@ public class InteractionVendingMachine extends HabboItem { } } - List onSuccess = new ArrayList<>(); - List onFail = new ArrayList<>(); - RoomTile finalTile = tile; - onSuccess.add(() -> { + client.getHabbo().getRoomUnit().setGoalLocation(tile); + + Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), tile, room, () -> { this.setExtradata("1"); room.scheduledComposers.add(new FloorItemUpdateComposer(this).compose()); @@ -98,7 +97,7 @@ public class InteractionVendingMachine extends HabboItem { } Emulator.getThreading().run(() -> { - Runnable procedure = () -> { + client.getHabbo().getRoomUnit().setMoveBlockingTask(Emulator.getThreading().run(() -> { if (client.getHabbo().getRoomUnit().getCurrentLocation().equals(finalTile)) { this.rotateToMachine(client.getHabbo().getRoomUnit()); room.sendComposer(new RoomUserStatusComposer(client.getHabbo().getRoomUnit()).compose()); @@ -117,14 +116,9 @@ public class InteractionVendingMachine extends HabboItem { } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } - }; - - client.getHabbo().getRoomUnit().setMoveBlockingTask(Emulator.getThreading().run(procedure, 300)); + }, 300)); }, 250); - }); - - client.getHabbo().getRoomUnit().setGoalLocation(tile); - Emulator.getThreading().run(new RoomUnitWalkToLocation(client.getHabbo().getRoomUnit(), tile, room, onSuccess, onFail)); + }, null)); } } } diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java index f8971b4f..5b98b827 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/games/freeze/InteractionFreezeTile.java @@ -76,7 +76,7 @@ public class InteractionFreezeTile extends HabboItem { @Override public boolean canStackAt(Room room, List>> itemsAtLocation) { for (Pair> set : itemsAtLocation) { - if (!set.getValue().isEmpty()) return false; + if (set.getValue() != null && !set.getValue().isEmpty()) return false; } return super.canStackAt(room, itemsAtLocation); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionMonsterPlantSeed.java similarity index 95% rename from src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java rename to src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionMonsterPlantSeed.java index f9ac09da..8bbe249c 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionMonsterPlantSeed.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionMonsterPlantSeed.java @@ -1,4 +1,4 @@ -package com.eu.habbo.habbohotel.items.interactions; +package com.eu.habbo.habbohotel.items.interactions.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.gameclients.GameClient; @@ -33,7 +33,7 @@ public class InteractionMonsterPlantSeed extends HabboItem { public static int randomRarityLevel() { int number = Emulator.getRandom().nextInt(66); int count = 0; - for (int i = 1; i <= 11; i++) { + for (int i = 1; i < 11; i++) { count += 11 - i; if (number <= count) { return i; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java similarity index 97% rename from src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java rename to src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java index 36fb719a..d7293389 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionNest.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionNest.java @@ -1,4 +1,4 @@ -package com.eu.habbo.habbohotel.items.interactions; +package com.eu.habbo.habbohotel.items.interactions.pets; import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.items.Item; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetBreedingNest.java similarity index 99% rename from src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java rename to src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetBreedingNest.java index 48049fee..16d219a9 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetBreedingNest.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetBreedingNest.java @@ -1,4 +1,4 @@ -package com.eu.habbo.habbohotel.items.interactions; +package com.eu.habbo.habbohotel.items.interactions.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.achievements.AchievementManager; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java similarity index 94% rename from src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java rename to src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java index b0a3131f..a18ada6b 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetDrink.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetDrink.java @@ -1,8 +1,9 @@ -package com.eu.habbo.habbohotel.items.interactions; +package com.eu.habbo.habbohotel.items.interactions.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.achievements.AchievementManager; import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionDefault; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.rooms.Room; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java similarity index 94% rename from src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java rename to src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java index 07e3fd90..8f2dd02c 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetFood.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetFood.java @@ -1,7 +1,8 @@ -package com.eu.habbo.habbohotel.items.interactions; +package com.eu.habbo.habbohotel.items.interactions.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionDefault; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.rooms.Room; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java similarity index 95% rename from src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java rename to src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java index f70540b8..680bae5a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPetToy.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/pets/InteractionPetToy.java @@ -1,7 +1,8 @@ -package com.eu.habbo.habbohotel.items.interactions; +package com.eu.habbo.habbohotel.items.interactions.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.items.Item; +import com.eu.habbo.habbohotel.items.interactions.InteractionDefault; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetTasks; import com.eu.habbo.habbohotel.rooms.Room; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java index dbd0907d..3a9b1f3c 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectChangeFurniDirection.java @@ -62,7 +62,7 @@ public class WiredEffectChangeFurniDirection extends InteractionWiredEffect { RoomTile targetTile = room.getLayout().getTileInFront(room.getLayout().getTile(entry.getKey().getX(), entry.getKey().getY()), entry.getValue().getValue()); int count = 1; - while ((targetTile == null || !targetTile.getAllowStack() || targetTile.state == RoomTileState.INVALID) && count < 8) { + while ((targetTile == null || !targetTile.getAllowStack() || targetTile.state == RoomTileState.INVALID || targetTile.state == RoomTileState.BLOCKED) && count < 8) { entry.setValue(this.nextRotation(entry.getValue())); targetTile = room.getLayout().getTileInFront(room.getLayout().getTile(entry.getKey().getX(), entry.getKey().getY()), entry.getValue().getValue()); count++; diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java index dc90e2b7..b318a033 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectMatchFurni.java @@ -44,6 +44,9 @@ public class WiredEffectMatchFurni extends InteractionWiredEffect { THashSet tilesToUpdate = new THashSet<>(this.settings.size()); //this.refresh(); + if(this.settings.isEmpty()) + return false; + for (WiredMatchFurniSetting setting : this.settings) { HabboItem item = room.getHabboItem(setting.itemId); if (item != null) { @@ -126,7 +129,6 @@ public class WiredEffectMatchFurni extends InteractionWiredEffect { if (slideAnimation && t != null) { room.sendComposer(new FloorItemOnRollerComposer(item, null, t, offsetZ, room).compose()); - room.updateTiles(room.getLayout().getTilesAt(room.getLayout().getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation())); } else { room.updateItem(item); } diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java b/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java index 8771b7b3..1eae8a4b 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetData.java @@ -2,10 +2,10 @@ package com.eu.habbo.habbohotel.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.items.Item; -import com.eu.habbo.habbohotel.items.interactions.InteractionNest; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetDrink; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetToy; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetToy; import com.eu.habbo.habbohotel.users.HabboItem; import gnu.trove.map.hash.THashMap; import gnu.trove.set.hash.THashSet; 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 d4079923..7335963d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/PetManager.java @@ -3,10 +3,10 @@ package com.eu.habbo.habbohotel.pets; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.gameclients.GameClient; import com.eu.habbo.habbohotel.items.Item; -import com.eu.habbo.habbohotel.items.interactions.InteractionNest; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetDrink; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetToy; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetToy; import com.eu.habbo.habbohotel.pets.actions.*; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomTile; 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 180474e7..83ec6207 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 @@ -1,6 +1,6 @@ package com.eu.habbo.habbohotel.pets.actions; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetBreedingNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetBreedingNest; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetAction; import com.eu.habbo.habbohotel.pets.PetTasks; 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 29a7748c..17d2e66d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -19,6 +19,10 @@ import com.eu.habbo.habbohotel.items.interactions.games.battlebanzai.Interaction import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagField; import com.eu.habbo.habbohotel.items.interactions.games.tag.InteractionTagPole; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetBreedingNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood; import com.eu.habbo.habbohotel.items.interactions.wired.extra.WiredBlob; import com.eu.habbo.habbohotel.messenger.MessengerBuddy; import com.eu.habbo.habbohotel.permissions.Permission; @@ -566,6 +570,9 @@ public class Room implements Comparable, ISerialize, Runnable { HabboItem lowestChair = this.getLowestChair(tile); THashSet items = this.getItemsAt(tile); if (items == null) return RoomTileState.INVALID; + + if (items.stream().anyMatch(i -> i.getBaseItem().allowLay())) return RoomTileState.LAY; + for (HabboItem item : items) { if (exclude != null && item == exclude) continue; @@ -576,10 +583,10 @@ public class Room implements Comparable, ISerialize, Runnable { if (lowestItem == null || lowestItem.getZ() < item.getZ()) { lowestItem = item; - result = this.checkStateForItem(lowestItem); + result = this.checkStateForItem(lowestItem, tile); } else if (lowestItem.getZ() == item.getZ()) { if (result == RoomTileState.OPEN) { - result = this.checkStateForItem(item); + result = this.checkStateForItem(item, tile); } } } @@ -589,7 +596,7 @@ public class Room implements Comparable, ISerialize, Runnable { return result; } - private RoomTileState checkStateForItem(HabboItem item) { + private RoomTileState checkStateForItem(HabboItem item, RoomTile tile) { RoomTileState result = RoomTileState.BLOCKED; if (item.isWalkable()) { @@ -604,6 +611,11 @@ public class Room implements Comparable, ISerialize, Runnable { result = RoomTileState.LAY; } + RoomTileState overriddenState = item.getOverrideTileState(tile, this); + if (overriddenState != null) { + result = overriddenState; + } + return result; } @@ -844,10 +856,11 @@ public class Room implements Comparable, ISerialize, Runnable { return; if (this.loaded) { - if (!this.traxManager.disposed()) { - this.traxManager.dispose(); - } try { + if (!this.traxManager.disposed()) { + this.traxManager.dispose(); + } + this.roomCycleTask.cancel(false); this.scheduledTasks.clear(); this.scheduledComposers.clear(); @@ -927,12 +940,16 @@ public class Room implements Comparable, ISerialize, Runnable { } } - this.wordQuiz = ""; - this.yesVotes = 0; - this.noVotes = 0; - this.updateDatabaseUserCount(); - this.preLoaded = true; - this.layout = null; + try { + this.wordQuiz = ""; + this.yesVotes = 0; + this.noVotes = 0; + this.updateDatabaseUserCount(); + this.preLoaded = true; + this.layout = null; + } catch (Exception e) { + Emulator.getLogging().logErrorLine(e); + } } Emulator.getPluginManager().fireEvent(new RoomUnloadedEvent(this)); @@ -2368,6 +2385,9 @@ public class Room implements Comparable, ISerialize, Runnable { } public HabboItem getHabboItem(int id) { + if (this.roomItems == null || this.roomSpecialTypes == null) + return null; // room not loaded completely + HabboItem item; synchronized (this.roomItems) { item = this.roomItems.get(id); @@ -2586,13 +2606,15 @@ public class Room implements Comparable, ISerialize, Runnable { this.sendComposer(new RoomUserRemoveComposer(habbo.getRoomUnit()).compose()); } - HabboItem item = this.getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); + if (habbo.getRoomUnit().getCurrentLocation() != null) { + HabboItem item = this.getTopItemAt(habbo.getRoomUnit().getX(), habbo.getRoomUnit().getY()); - if (item != null) { - try { - item.onWalkOff(habbo.getRoomUnit(), this, new Object[]{}); - } catch (Exception e) { - Emulator.getLogging().logErrorLine(e); + if (item != null) { + try { + item.onWalkOff(habbo.getRoomUnit(), this, new Object[]{}); + } catch (Exception e) { + Emulator.getLogging().logErrorLine(e); + } } } @@ -4344,6 +4366,8 @@ public class Room implements Comparable, ISerialize, Runnable { if (!this.layout.fitsOnMap(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation)) return FurnitureMovementError.INVALID_MOVE; + if (item instanceof InteractionStackHelper) return FurnitureMovementError.NONE; + THashSet occupiedTiles = this.layout.getTilesAt(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); for (RoomTile t : occupiedTiles) { @@ -4352,24 +4376,20 @@ public class Room implements Comparable, ISerialize, Runnable { if (this.hasPetsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_PETS; } - boolean magicTile = item instanceof InteractionStackHelper; + List>> tileFurniList = new ArrayList<>(); + for (RoomTile t : occupiedTiles) { + tileFurniList.add(Pair.create(t, this.getItemsAt(t))); - if (!magicTile) { - List>> tileFurniList = new ArrayList<>(); - for (RoomTile t : occupiedTiles) { - tileFurniList.add(Pair.create(t, this.getItemsAt(t))); - - HabboItem topItem = this.getTopItemAt(t.x, t.y, item); - if (topItem != null && !topItem.getBaseItem().allowStack() && !t.getAllowStack()) { - return FurnitureMovementError.CANT_STACK; - } - } - - if (!item.canStackAt(this, tileFurniList)) { + HabboItem topItem = this.getTopItemAt(t.x, t.y, item); + if (topItem != null && !topItem.getBaseItem().allowStack() && !t.getAllowStack()) { return FurnitureMovementError.CANT_STACK; } } + if (!item.canStackAt(this, tileFurniList)) { + return FurnitureMovementError.CANT_STACK; + } + return FurnitureMovementError.NONE; } @@ -4451,26 +4471,31 @@ public class Room implements Comparable, ISerialize, Runnable { boolean magicTile = item instanceof InteractionStackHelper; + Optional stackHelper = this.getItemsAt(tile).stream().filter(i -> i instanceof InteractionStackHelper).findAny(); + //Check if can be placed at new position THashSet occupiedTiles = this.layout.getTilesAt(tile, item.getBaseItem().getWidth(), item.getBaseItem().getLength(), rotation); - if (topItem != item) { - for (RoomTile t : occupiedTiles) { - HabboItem tileTopItem = this.getTopItemAt(t.x, t.y); - if (!magicTile && ((tileTopItem != null && tileTopItem != item ? (t.state.equals(RoomTileState.INVALID) || !t.getAllowStack() || !tileTopItem.getBaseItem().allowStack()) : this.calculateTileState(t, item).equals(RoomTileState.INVALID)))) - return FurnitureMovementError.CANT_STACK; - if (this.hasHabbosAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_HABBOS; - if (this.hasBotsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_BOTS; - if (this.hasPetsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_PETS; + + if (!stackHelper.isPresent()) { + if (topItem != item) { + for (RoomTile t : occupiedTiles) { + HabboItem tileTopItem = this.getTopItemAt(t.x, t.y); + if (!magicTile && ((tileTopItem != null && tileTopItem != item ? (t.state.equals(RoomTileState.INVALID) || !t.getAllowStack() || !tileTopItem.getBaseItem().allowStack()) : this.calculateTileState(t, item).equals(RoomTileState.INVALID)))) + return FurnitureMovementError.CANT_STACK; + if (this.hasHabbosAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_HABBOS; + if (this.hasBotsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_BOTS; + if (this.hasPetsAt(t.x, t.y)) return FurnitureMovementError.TILE_HAS_PETS; + } } - } - List>> tileFurniList = new ArrayList<>(); - for (RoomTile t : occupiedTiles) { - tileFurniList.add(Pair.create(t, this.getItemsAt(t))); - } + List>> tileFurniList = new ArrayList<>(); + for (RoomTile t : occupiedTiles) { + tileFurniList.add(Pair.create(t, this.getItemsAt(t))); + } - if (!magicTile && !item.canStackAt(this, tileFurniList)) { - return FurnitureMovementError.CANT_STACK; + if (!magicTile && !item.canStackAt(this, tileFurniList)) { + return FurnitureMovementError.CANT_STACK; + } } THashSet oldOccupiedTiles = this.layout.getTilesAt(this.layout.getTile(item.getX(), item.getY()), item.getBaseItem().getWidth(), item.getBaseItem().getLength(), item.getRotation()); @@ -4491,8 +4516,16 @@ public class Room implements Comparable, ISerialize, Runnable { } //Place at new position - double height = this.getStackHeight(tile.x, tile.y, false, item); - if (item.equals(topItem) && tile.x == item.getX() && tile.y == item.getY()) height = item.getZ(); + double height; + + if (stackHelper.isPresent()) { + height = stackHelper.get().getExtradata().isEmpty() ? Double.valueOf("0.0") : (Double.valueOf(stackHelper.get().getExtradata()) / 100); + } else if (item.equals(topItem) && tile.x == item.getX() && tile.y == item.getY()) { + height = item.getZ(); + } else { + height = this.getStackHeight(tile.x, tile.y, false, item); + } + if(height > 40d) return FurnitureMovementError.CANT_STACK; item.setX(tile.x); 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 3f99af34..03a4a382 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java @@ -265,41 +265,48 @@ public class RoomLayout { public final Deque findPath(RoomTile oldTile, RoomTile newTile, RoomTile goalLocation, RoomUnit roomUnit, boolean isWalktroughRetry) { if (this.room == null || !this.room.isLoaded() || oldTile == null || newTile == null || oldTile.equals(newTile) || newTile.state == RoomTileState.INVALID) return new LinkedList<>(); + LinkedList openList = new LinkedList<>(); List closedList = new LinkedList<>(); - RoomTile current; openList.add(oldTile.copy()); - while (!openList.isEmpty()) { - current = this.lowestFInOpen(openList); - if ((current.x == newTile.x) && (current.y == newTile.y)) { - return this.calcPath(this.findTile(openList, oldTile.x, oldTile.y), current); + while (!openList.isEmpty()) { + RoomTile current = this.lowestFInOpen(openList); + if (current.x == newTile.x && current.y == newTile.y) { + return this.calcPath(this.findTile(openList, oldTile.x, oldTile.y), current); } + closedList.add(current); openList.remove(current); - List adjacentNodes = this.getAdjacent(openList, current, newTile); + + List adjacentNodes = this.getAdjacent(openList, current, newTile, roomUnit); for (RoomTile currentAdj : adjacentNodes) { if (closedList.contains(currentAdj)) continue; - if (roomUnit.canOverrideTile(currentAdj) || (currentAdj.state != RoomTileState.BLOCKED && currentAdj.x == doorX && currentAdj.y == doorY)) { - currentAdj.setPrevious(current); - currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y)); - currentAdj.setgCosts(current); - openList.add(currentAdj); - continue; - } - if ((currentAdj.state == RoomTileState.BLOCKED) || ((currentAdj.state == RoomTileState.SIT || currentAdj.state == RoomTileState.LAY) && !currentAdj.equals(goalLocation))) { + + if (roomUnit.canOverrideTile(currentAdj) || (currentAdj.state != RoomTileState.BLOCKED && currentAdj.x == doorX && currentAdj.y == doorY)) { + currentAdj.setPrevious(current); + currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y)); + currentAdj.setgCosts(current); + openList.add(currentAdj); + continue; + } + + if (currentAdj.state == RoomTileState.BLOCKED || ((currentAdj.state == RoomTileState.SIT || currentAdj.state == RoomTileState.LAY) && !currentAdj.equals(goalLocation))) { closedList.add(currentAdj); openList.remove(currentAdj); continue; } + double height = currentAdj.getStackHeight() - current.getStackHeight(); if (!ALLOW_FALLING && height < -MAXIMUM_STEP_HEIGHT) continue; if (currentAdj.state == RoomTileState.OPEN && height > MAXIMUM_STEP_HEIGHT) continue; + if (currentAdj.hasUnits() && ((!isWalktroughRetry && !this.room.isAllowWalkthrough()) || currentAdj.equals(goalLocation))) { closedList.add(currentAdj); openList.remove(currentAdj); continue; } + if (!openList.contains(currentAdj)) { currentAdj.setPrevious(current); currentAdj.sethCosts(this.findTile(openList, newTile.x, newTile.y)); @@ -311,9 +318,8 @@ public class RoomLayout { } } } - // System.out.println("Invalid Path."); - if (!this.room.isAllowWalkthrough()) { + if (!this.room.isAllowWalkthrough() && !isWalktroughRetry) { return this.findPath(oldTile, newTile, goalLocation, roomUnit, true); } @@ -335,7 +341,7 @@ public class RoomLayout { return null; } - private Deque calcPath(RoomTile start, RoomTile goal) { + public Deque calcPath(RoomTile start, RoomTile goal) { LinkedList path = new LinkedList<>(); if (start == null) return path; @@ -364,13 +370,13 @@ public class RoomLayout { return cheapest; } - private List getAdjacent(List openList, RoomTile node, RoomTile nextTile) { + private List getAdjacent(List openList, RoomTile node, RoomTile nextTile, RoomUnit unit) { short x = node.x; short y = node.y; List adj = new LinkedList<>(); if (x > 0) { RoomTile temp = this.findTile(openList, (short) (x - 1), y); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(false); if (!adj.contains(temp)) @@ -380,7 +386,7 @@ public class RoomLayout { } if (x < this.mapSizeX) { RoomTile temp = this.findTile(openList, (short) (x + 1), y); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(false); if (!adj.contains(temp)) @@ -390,7 +396,7 @@ public class RoomLayout { } if (y > 0) { RoomTile temp = this.findTile(openList, x, (short) (y - 1)); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(false); if (!adj.contains(temp)) @@ -400,7 +406,7 @@ public class RoomLayout { } if (y < this.mapSizeY) { RoomTile temp = this.findTile(openList, x, (short) (y + 1)); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(false); if (!adj.contains(temp)) @@ -414,7 +420,7 @@ public class RoomLayout { RoomTile offY = this.findTile(openList, x, (short) (y + 1)); if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { RoomTile temp = this.findTile(openList, (short) (x + 1), (short) (y + 1)); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(true); if (!adj.contains(temp)) @@ -428,7 +434,7 @@ public class RoomLayout { RoomTile offY = this.findTile(openList, x, (short) (y - 1)); if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { RoomTile temp = this.findTile(openList, (short) (x - 1), (short) (y - 1)); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(true); if (!adj.contains(temp)) @@ -442,7 +448,7 @@ public class RoomLayout { RoomTile offY = this.findTile(openList, x, (short) (y + 1)); if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { RoomTile temp = this.findTile(openList, (short) (x - 1), (short) (y + 1)); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(true); if (!adj.contains(temp)) @@ -456,7 +462,7 @@ public class RoomLayout { RoomTile offY = this.findTile(openList, x, (short) (y - 1)); if (offX != null && offY != null && (offX.isWalkable() || offY.isWalkable())) { RoomTile temp = this.findTile(openList, (short) (x + 1), (short) (y - 1)); - if (temp != null && temp.state != RoomTileState.BLOCKED && temp.state != RoomTileState.INVALID) { + if (this.canWalkOn(temp, unit)) { if (temp.state != RoomTileState.SIT || nextTile.getStackHeight() - node.getStackHeight() <= 2.0) { temp.isDiagonally(true); if (!adj.contains(temp)) @@ -469,6 +475,10 @@ public class RoomLayout { return adj; } + private boolean canWalkOn(RoomTile tile, RoomUnit unit) { + return tile != null && (unit.canOverrideTile(tile) || (tile.state != RoomTileState.BLOCKED && tile.state != RoomTileState.INVALID)); + } + public void moveDiagonally(boolean value) { this.CANMOVEDIAGONALY = value; } @@ -545,10 +555,14 @@ public class RoomLayout { } public List getTilesAround(RoomTile tile, int directionOffset) { - List tiles = new ArrayList<>(8); + return getTilesAround(tile, directionOffset, true); + } + + public List getTilesAround(RoomTile tile, int directionOffset, boolean diagonal) { + List tiles = new ArrayList<>(diagonal ? 8 : 4); if (tile != null) { - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 8; i += (diagonal ? 1 : 2)) { RoomTile t = this.getTileInFront(tile, (i + directionOffset) % 8); if (t != null) { tiles.add(t); 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 b0512576..2faa824c 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -596,7 +596,7 @@ public class RoomManager { habbo.getRoomUnit().clearStatus(); if (habbo.getRoomUnit().getCurrentLocation() == null) { habbo.getRoomUnit().setLocation(doorLocation != null ? doorLocation : room.getLayout().getDoorTile()); - habbo.getRoomUnit().setZ(habbo.getRoomUnit().getCurrentLocation().getStackHeight()); + if (habbo.getRoomUnit().getCurrentLocation() != null) habbo.getRoomUnit().setZ(habbo.getRoomUnit().getCurrentLocation().getStackHeight()); if (doorLocation == null) { habbo.getRoomUnit().setBodyRotation(RoomUserRotation.values()[room.getLayout().getDoorDirection()]); @@ -713,21 +713,23 @@ public class RoomManager { if (!room.getCurrentHabbos().isEmpty()) { Collection habbosToSendEnter = room.getCurrentHabbos().values(); + Collection visibleHabbos = room.getHabbos(); if (Emulator.getPluginManager().isRegistered(HabboAddedToRoomEvent.class, false)) { - HabboAddedToRoomEvent event = Emulator.getPluginManager().fireEvent(new HabboAddedToRoomEvent(habbo, room, habbosToSendEnter)); + HabboAddedToRoomEvent event = Emulator.getPluginManager().fireEvent(new HabboAddedToRoomEvent(habbo, room, habbosToSendEnter, visibleHabbos)); habbosToSendEnter = event.habbosToSendEnter; + visibleHabbos = event.visibleHabbos; } for (Habbo habboToSendEnter : habbosToSendEnter) { GameClient client = habboToSendEnter.getClient(); if (client != null) { client.sendResponse(new RoomUsersComposer(habbo).compose()); - habboToSendEnter.getClient().sendResponse(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); + client.sendResponse(new RoomUserStatusComposer(habbo.getRoomUnit()).compose()); } } - for (Habbo h : room.getHabbos()) { + for (Habbo h : visibleHabbos) { if (!h.getRoomUnit().isInvisible()) { habbos.add(h); } diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java index 8f340378..0b912776 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomSpecialTypes.java @@ -15,6 +15,10 @@ import com.eu.habbo.habbohotel.items.interactions.games.football.scoreboards.Int import com.eu.habbo.habbohotel.items.interactions.games.freeze.InteractionFreezeExitTile; import com.eu.habbo.habbohotel.items.interactions.games.freeze.gates.InteractionFreezeGate; import com.eu.habbo.habbohotel.items.interactions.games.freeze.scoreboards.InteractionFreezeScoreboard; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetDrink; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetToy; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.habbohotel.wired.WiredConditionType; import com.eu.habbo.habbohotel.wired.WiredEffectType; diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java index b85f8946..e0aa77b9 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnit.java @@ -28,6 +28,7 @@ import gnu.trove.set.hash.THashSet; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; +import java.util.stream.Collectors; public class RoomUnit { public boolean isWiredTeleporting = false; @@ -290,7 +291,7 @@ public class RoomUnit { if (item != null) { if (item != habboItem || !RoomLayout.pointInSquare(item.getX(), item.getY(), item.getX() + item.getBaseItem().getWidth() - 1, item.getY() + item.getBaseItem().getLength() - 1, this.getX(), this.getY())) { if (item.canWalkOn(this, room, null)) { - item.onWalkOn(this, room, null); + item.onWalkOn(this, room, new Object[]{this.getCurrentLocation(), next}); } else if (item instanceof InteractionGuildGate || item instanceof InteractionHabboClubGate) { this.setRotation(oldRotation); this.tilesWalked--; @@ -305,7 +306,7 @@ public class RoomUnit { return false; } } else { - item.onWalk(this, room, null); + item.onWalk(this, room, new Object[]{this.getCurrentLocation(), next}); } zHeight += item.getZ(); @@ -714,6 +715,9 @@ public class RoomUnit { public boolean canOverrideTile(RoomTile tile) { if (tile == null || room == null || room.getLayout() == null) return false; + if (room.getItemsAt(tile).stream().anyMatch(i -> i.canOverrideTile(this, room, tile))) + return true; + int tileIndex = (room.getLayout().getMapSizeY() * tile.y) + tile.x + 1; return this.overridableTiles.contains(tileIndex); } @@ -726,6 +730,8 @@ public class RoomUnit { } public void removeOverrideTile(RoomTile tile) { + if (room == null || room.getLayout() == null) return; + int tileIndex = (room.getLayout().getMapSizeY() * tile.y) + tile.x + 1; this.overridableTiles.remove(tileIndex); } @@ -750,6 +756,10 @@ public class RoomUnit { return topItem == null || (!(topItem instanceof InteractionWater) && !(topItem instanceof InteractionWaterItem)); } + public RoomTile getClosestTile(List tiles) { + return tiles.stream().min(Comparator.comparingDouble(a -> a.distance(this.getCurrentLocation()))).orElse(null); + } + public RoomTile getClosestAdjacentTile(short x, short y, boolean diagonal) { RoomTile baseTile = room.getLayout().getTile(x, y); @@ -768,10 +778,12 @@ public class RoomUnit { rotations.add(RoomUserRotation.SOUTH_WEST.getValue()); } - return rotations.stream() - .map(rotation -> room.getLayout().getTileInFront(baseTile, rotation)) - .filter(t -> t != null && t.isWalkable() && !room.hasHabbosAt(t.x, t.y)) - .min(Comparator.comparingDouble(a -> a.distance(this.getCurrentLocation()))).orElse(null); + return this.getClosestTile( + rotations.stream() + .map(rotation -> room.getLayout().getTileInFront(baseTile, rotation)) + .filter(t -> t != null && t.isWalkable() && (this.getCurrentLocation().equals(t) || !room.hasHabbosAt(t.x, t.y))) + .collect(Collectors.toList()) + ); } public ScheduledFuture getMoveBlockingTask() { diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java index 04b13d82..334ddc17 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/TraxManager.java @@ -261,7 +261,7 @@ public class TraxManager implements Disposable { public InteractionMusicDisc fromItemId(int itemId) { for (InteractionMusicDisc musicDisc : this.songs) { - if (musicDisc.getId() == itemId) { + if (musicDisc != null && musicDisc.getId() == itemId) { return musicDisc; } } diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java index 4fe8a220..f689c504 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java @@ -10,10 +10,7 @@ import com.eu.habbo.habbohotel.items.IEventTriggers; import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.interactions.*; import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; -import com.eu.habbo.habbohotel.rooms.Room; -import com.eu.habbo.habbohotel.rooms.RoomLayout; -import com.eu.habbo.habbohotel.rooms.RoomTile; -import com.eu.habbo.habbohotel.rooms.RoomUnit; +import com.eu.habbo.habbohotel.rooms.*; import com.eu.habbo.habbohotel.wired.WiredEffectType; import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredTriggerType; @@ -25,12 +22,14 @@ import gnu.trove.set.hash.THashSet; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.math3.util.Pair; +import java.awt.*; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Deque; import java.util.List; public abstract class HabboItem implements Runnable, IEventTriggers { @@ -487,4 +486,30 @@ public abstract class HabboItem implements Runnable, IEventTriggers { } public boolean invalidatesToRoomKick() { return false; } + + public List getOccupyingTiles(RoomLayout layout) { + List tiles = new ArrayList<>(); + + Rectangle rect = RoomLayout.getRectangle(this.getX(), this.getY(), this.getBaseItem().getWidth(), this.getBaseItem().getLength(), this.getRotation()); + + for (int i = rect.x; i < rect.x + rect.getWidth(); i++) { + for (int j = rect.y; j < rect.y + rect.getHeight(); j++) { + tiles.add(layout.getTile((short) i, (short) j)); + } + } + + return tiles; + } + + public RoomTile getOverrideGoalTile(RoomUnit unit, Room room, RoomTile tile) { + return tile; + } + + public RoomTileState getOverrideTileState(RoomTile tile, Room room) { + return null; + } + + public boolean canOverrideTile(RoomUnit unit, Room room, RoomTile tile) { + return false; + } } diff --git a/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java index cc0c9ac7..ce4b7361 100644 --- a/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java +++ b/src/main/java/com/eu/habbo/habbohotel/wired/WiredHandler.java @@ -139,12 +139,11 @@ public class WiredHandler { } for (InteractionWiredCondition condition : conditions) { - if ((condition.operator() == WiredConditionOperator.OR && matchedConditions.contains(condition.getType())) || - (condition.operator() == WiredConditionOperator.AND && condition.execute(roomUnit, room, stuff))) { - condition.activateBox(room); - } else { - if (!Emulator.getPluginManager().fireEvent(new WiredConditionFailedEvent(room, roomUnit, trigger, condition)).isCancelled()) - return false; + if (!((condition.operator() == WiredConditionOperator.OR && matchedConditions.contains(condition.getType())) || + (condition.operator() == WiredConditionOperator.AND && condition.execute(roomUnit, room, stuff))) && + !Emulator.getPluginManager().fireEvent(new WiredConditionFailedEvent(room, roomUnit, trigger, condition)).isCancelled()) { + + return false; } } } diff --git a/src/main/java/com/eu/habbo/messages/PacketManager.java b/src/main/java/com/eu/habbo/messages/PacketManager.java index 7ebfe092..8acc8689 100644 --- a/src/main/java/com/eu/habbo/messages/PacketManager.java +++ b/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -171,6 +171,20 @@ public class PacketManager { return; } + final MessageHandler handler = handlerClass.newInstance(); + + if (handler.getRatelimit() > 0) { + if (client.messageTimestamps.containsKey(handlerClass) && System.currentTimeMillis() - client.messageTimestamps.get(handlerClass) < handler.getRatelimit()) { + if (PacketManager.DEBUG_SHOW_PACKETS) { + Emulator.getLogging().logPacketLine("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + packet.getMessageId() + "][" + Logging.ANSI_RED + "RATELIMITED" + Logging.ANSI_RESET + "] => " + packet.getMessageBody()); + } + + return; + } else { + client.messageTimestamps.put(handlerClass, System.currentTimeMillis()); + } + } + if (PacketManager.DEBUG_SHOW_PACKETS) Emulator.getLogging().logPacketLine("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + packet.getMessageId() + "] => " + packet.getMessageBody()); @@ -178,8 +192,6 @@ public class PacketManager { System.out.println(("[" + Logging.ANSI_CYAN + "CLIENT" + Logging.ANSI_RESET + "][" + client.getHabbo().getHabboInfo().getUsername() + "][" + packet.getMessageId() + "] => " + packet.getMessageBody())); } - final MessageHandler handler = handlerClass.newInstance(); - handler.client = client; handler.packet = packet; diff --git a/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java b/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java index 98baf3b6..38920afe 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java +++ b/src/main/java/com/eu/habbo/messages/incoming/MessageHandler.java @@ -9,4 +9,8 @@ public abstract class MessageHandler { public boolean isCancelled = false; public abstract void handle() throws Exception; + + public int getRatelimit() { + return 0; + } } \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java index ac8902e4..113dd0e3 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/floorplaneditor/FloorPlanEditorSaveEvent.java @@ -58,6 +58,11 @@ public class FloorPlanEditorSaveEvent extends MessageHandler { if (mapRows.length > 64) errors.add("${notification.floorplan_editor.error.message.too_large_height}"); else if (Arrays.stream(mapRows).anyMatch(l -> l.length() > 64 || l.length() == 0)) errors.add("${notification.floorplan_editor.error.message.too_large_width}"); + + if (errors.length() > 0) { + this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FLOORPLAN_EDITOR_ERROR.key, errors.toString())); + return; + } } int doorX = this.packet.readInt(); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java index e953255c..04934da6 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/MoodLightSaveSettingsEvent.java @@ -14,6 +14,7 @@ import java.util.List; public class MoodLightSaveSettingsEvent extends MessageHandler { public static List MOODLIGHT_AVAILABLE_COLORS = Arrays.asList("#74F5F5,#0053F7,#E759DE,#EA4532,#F2F851,#82F349,#000000".split(",")); + public static int MIN_BRIGHTNESS = (int) Math.floor(0.3 * 0xFF); @Override public void handle() throws Exception { @@ -33,7 +34,7 @@ public class MoodLightSaveSettingsEvent extends MessageHandler { return; } - if (brightness > 0xFF || brightness <= (0.3 * 0xFF)) { + if (brightness > 0xFF || brightness < MIN_BRIGHTNESS) { ScripterManager.scripterDetected(this.client, "User tried to set a moodlight's brightness to out-of-bounds ([76, 255]): " + brightness); return; } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java index c64d111e..e9e04c73 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/ToggleFloorItemEvent.java @@ -2,7 +2,7 @@ package com.eu.habbo.messages.incoming.rooms.items; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.items.interactions.InteractionDice; -import com.eu.habbo.habbohotel.items.interactions.InteractionMonsterPlantSeed; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionMonsterPlantSeed; import com.eu.habbo.habbohotel.items.interactions.InteractionWired; import com.eu.habbo.habbohotel.pets.MonsterplantPet; import com.eu.habbo.habbohotel.rooms.Room; @@ -12,7 +12,6 @@ import com.eu.habbo.messages.outgoing.rooms.items.RemoveFloorItemComposer; import com.eu.habbo.messages.outgoing.rooms.pets.PetPackageComposer; import com.eu.habbo.messages.outgoing.rooms.users.RoomUserStatusComposer; import com.eu.habbo.threading.runnables.QueryDeleteHabboItem; -import gnu.trove.set.hash.THashSet; public class ToggleFloorItemEvent extends MessageHandler { @Override diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlaylists.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlaylists.java index 469861d0..6c4b804b 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlaylists.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/youtube/YoutubeRequestPlaylists.java @@ -1,11 +1,15 @@ package com.eu.habbo.messages.incoming.rooms.items.youtube; import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.YoutubeManager; import com.eu.habbo.habbohotel.items.interactions.InteractionYoutubeTV; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.handshake.ConnectionErrorComposer; import com.eu.habbo.messages.outgoing.rooms.items.youtube.YoutubeDisplayListComposer; +import java.util.ArrayList; + public class YoutubeRequestPlaylists extends MessageHandler { @Override public void handle() throws Exception { @@ -17,7 +21,15 @@ public class YoutubeRequestPlaylists extends MessageHandler { if (item instanceof InteractionYoutubeTV) { InteractionYoutubeTV tv = (InteractionYoutubeTV) item; - this.client.sendResponse(new YoutubeDisplayListComposer(itemId, Emulator.getGameEnvironment().getItemManager().getYoutubeManager().getPlaylistsForItemId(item.getBaseItem().getId()), tv.currentPlaylist)); + ArrayList playlists = Emulator.getGameEnvironment().getItemManager().getYoutubeManager().getPlaylistsForItemId(item.getBaseItem().getId()); + + if (playlists == null) { + Emulator.getLogging().logErrorLine("No YouTube playlists set for base item #" + item.getBaseItem().getId()); + this.client.sendResponse(new ConnectionErrorComposer(1000)); + return; + } + + this.client.sendResponse(new YoutubeDisplayListComposer(itemId, playlists, tv.currentPlaylist)); } } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ConfirmPetBreedingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ConfirmPetBreedingEvent.java index 668ee248..13a1e200 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ConfirmPetBreedingEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/ConfirmPetBreedingEvent.java @@ -1,6 +1,6 @@ package com.eu.habbo.messages.incoming.rooms.pets; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetBreedingNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetBreedingNest; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.incoming.MessageHandler; diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/StopBreedingEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/StopBreedingEvent.java index 4370231e..5d19000d 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/StopBreedingEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/pets/StopBreedingEvent.java @@ -1,6 +1,6 @@ package com.eu.habbo.messages.incoming.rooms.pets; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetBreedingNest; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetBreedingNest; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.incoming.MessageHandler; diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java index c14d6f66..22c0d5cc 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/users/RoomUserWalkEvent.java @@ -11,8 +11,14 @@ import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.incoming.MessageHandler; import com.eu.habbo.messages.outgoing.rooms.users.RoomUnitOnRollerComposer; import com.eu.habbo.plugin.events.users.UserIdleEvent; +import gnu.trove.set.hash.THashSet; public class RoomUserWalkEvent extends MessageHandler { + @Override + public int getRatelimit() { + return 500; + } + @Override public void handle() throws Exception { if (this.client.getHabbo().getHabboInfo().getCurrentRoom() != null) { @@ -115,6 +121,23 @@ public class RoomUserWalkEvent extends MessageHandler { } } + THashSet items = room.getItemsAt(tile); + + if (items.size() > 0) { + for (HabboItem item : items) { + RoomTile overriddenTile = item.getOverrideGoalTile(roomUnit, room, tile); + + if (overriddenTile == null) { + return; // null cancels the entire event + } + + if (!overriddenTile.equals(tile) && overriddenTile.isWalkable()) { + tile = overriddenTile; + break; + } + } + } + // This is where we set the end location and begin finding a path if (tile.isWalkable() || room.canSitOrLayAt(tile.x, tile.y)) { if (roomUnit.getMoveBlockingTask() != null) roomUnit.getMoveBlockingTask().get(); diff --git a/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java index 6a9cdf33..eecb7858 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/users/UserProfileComposer.java @@ -46,7 +46,7 @@ public class UserProfileComposer extends MessageComposer { this.response.appendString(this.habboInfo.getUsername()); this.response.appendString(this.habboInfo.getLook()); this.response.appendString(this.habboInfo.getMotto()); - this.response.appendString(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date(this.habboInfo.getAccountCreated() * 1000L))); + this.response.appendString(new SimpleDateFormat("dd-MM-yyyy").format(new Date(this.habboInfo.getAccountCreated() * 1000L))); int achievementScore = 0; if (this.habbo != null) { diff --git a/src/main/java/com/eu/habbo/plugin/events/users/HabboAddedToRoomEvent.java b/src/main/java/com/eu/habbo/plugin/events/users/HabboAddedToRoomEvent.java index d31f4a6c..8753b8bf 100644 --- a/src/main/java/com/eu/habbo/plugin/events/users/HabboAddedToRoomEvent.java +++ b/src/main/java/com/eu/habbo/plugin/events/users/HabboAddedToRoomEvent.java @@ -8,13 +8,14 @@ import java.util.Collection; public class HabboAddedToRoomEvent extends UserEvent { public final Room room; - public final Collection habbosToSendEnter; + public Collection habbosToSendEnter; + public Collection visibleHabbos; - - public HabboAddedToRoomEvent(Habbo habbo, Room room, Collection habbosToSendEnter) { + public HabboAddedToRoomEvent(Habbo habbo, Room room, Collection habbosToSendEnter, Collection visibleHabbos) { super(habbo); this.room = room; this.habbosToSendEnter = habbosToSendEnter; + this.visibleHabbos = visibleHabbos; } } diff --git a/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java b/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java index 28c0cf96..331e5949 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java +++ b/src/main/java/com/eu/habbo/threading/runnables/PetEatAction.java @@ -2,7 +2,7 @@ package com.eu.habbo.threading.runnables; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.achievements.AchievementManager; -import com.eu.habbo.habbohotel.items.interactions.InteractionPetFood; +import com.eu.habbo.habbohotel.items.interactions.pets.InteractionPetFood; import com.eu.habbo.habbohotel.pets.GnomePet; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetTasks; diff --git a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java index 21356e91..7a648ff0 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitWalkToLocation.java @@ -5,6 +5,7 @@ import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.rooms.RoomUnit; +import java.util.ArrayList; import java.util.List; public class RoomUnitWalkToLocation implements Runnable { @@ -14,6 +15,18 @@ public class RoomUnitWalkToLocation implements Runnable { private List targetReached; private List failedReached; + public RoomUnitWalkToLocation(RoomUnit walker, RoomTile goalTile, Room room, Runnable targetReached, Runnable failedReached) { + this.walker = walker; + this.goalTile = goalTile; + this.room = room; + + this.targetReached = new ArrayList<>(); + if (targetReached != null) this.targetReached.add(targetReached); + + this.failedReached = new ArrayList<>(); + if (failedReached != null) this.targetReached.add(failedReached); + } + public RoomUnitWalkToLocation(RoomUnit walker, RoomTile goalTile, Room room, List targetReached, List failedReached) { this.walker = walker; this.goalTile = goalTile;