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 1fd17654..26360efd 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/Bot.java @@ -1,17 +1,18 @@ package com.eu.habbo.habbohotel.bots; import com.eu.habbo.Emulator; -import com.eu.habbo.database.DatabaseConstants; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomChatMessage; import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; import com.eu.habbo.habbohotel.rooms.RoomUserAction; import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomBot; -import com.eu.habbo.habbohotel.units.Unit; +import com.eu.habbo.habbohotel.units.type.Avatar; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboGender; +import com.eu.habbo.habbohotel.users.HabboInfo; import com.eu.habbo.habbohotel.wired.WiredHandler; import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.outgoing.rooms.users.*; import com.eu.habbo.plugin.events.bots.BotChatEvent; import com.eu.habbo.plugin.events.bots.BotShoutEvent; @@ -28,86 +29,53 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; @Slf4j -public class Bot extends Unit implements Runnable { - @Getter - @Setter +@Getter +@Setter +@Accessors(chain = true) +public class Bot extends Avatar implements Runnable { private transient int id; - @Getter private String name; - @Getter private String motto; - @Getter private String figure; - @Getter private HabboGender gender; - @Getter private int ownerId; - @Getter private String ownerName; - @Getter - @Setter - private Room room; - @Getter + + private HabboInfo ownerInfo; + private boolean chatAuto; - @Getter private boolean chatRandom; - @Getter private short chatDelay; - @Getter - @Setter private int chatTimeOut; private int chatTimestamp; - @Getter - @Setter private short lastChatIndex; - @Getter private final int bubbleId; - @Getter private final String type; - @Getter private int effect; - private transient boolean canWalk = true; - private boolean needsUpdate; - @Getter - @Setter + private transient boolean canWalk; + private boolean sqlUpdateNeeded; + private boolean xyzUpdateNeeded; private transient int followingHabboId; - @Getter - @Setter - @Accessors(chain = true) - private RoomBot roomUnit; + protected final RoomBot roomUnit; public static final String NO_CHAT_SET = "${bot.skill.chatter.configuration.text.placeholder}"; public static String[] PLACEMENT_MESSAGES = "Yo!;Hello I'm a real party animal!;Hello!".split(";"); - @Getter private final ArrayList chatLines; - public Bot(int id, String name, String motto, String figure, HabboGender gender, int ownerId, String ownerName) { - this.id = id; - this.name = name; - this.motto = motto; - this.figure = figure; - this.gender = gender; - this.ownerId = ownerId; - this.ownerName = ownerName; - this.chatAuto = false; - this.chatRandom = false; - this.chatDelay = 1000; - this.chatLines = new ArrayList<>(); - this.type = "generic_bot"; - this.room = null; - this.bubbleId = RoomChatMessageBubbles.BOT_RENTABLE.getType(); - } - public Bot(ResultSet set) throws SQLException { this.id = set.getInt("id"); this.name = set.getString("name"); this.motto = set.getString("motto"); this.figure = set.getString("figure"); this.gender = HabboGender.valueOf(set.getString("gender")); - this.ownerId = set.getInt(DatabaseConstants.USER_ID); + + //@Deprecated + this.ownerId = set.getInt("owner_id"); this.ownerName = set.getString("owner_name"); + + this.ownerInfo = Emulator.getGameEnvironment().getHabboManager().getOfflineHabboInfo(set.getInt("owner_id")); + this.chatAuto = set.getString("chat_auto").equals("1"); this.chatRandom = set.getString("chat_random").equals("1"); this.chatDelay = set.getShort("chat_delay"); @@ -115,61 +83,30 @@ public class Bot extends Unit implements Runnable { this.type = set.getString("type"); this.effect = set.getInt("effect"); this.canWalk = set.getString("freeroam").equals("1"); - this.room = null; this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; - this.needsUpdate = false; + this.sqlUpdateNeeded = false; this.bubbleId = set.getInt("bubble_id"); this.roomUnit = new RoomBot(); this.roomUnit.setUnit(this); } - public Bot(Bot bot) { - this.name = bot.getName(); - this.motto = bot.getMotto(); - this.figure = bot.getFigure(); - this.gender = bot.getGender(); - this.ownerId = bot.getOwnerId(); - this.ownerName = bot.getOwnerName(); - this.chatAuto = true; - this.chatRandom = false; - this.chatDelay = 10; - this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; - this.chatLines = new ArrayList<>(List.of("Default Message :D")); - this.type = bot.getType(); - this.effect = bot.getEffect(); - this.bubbleId = bot.getBubbleId(); - this.needsUpdate = false; - } + public static void initialise() {} - public static void initialise() { - - } - - public static void dispose() { - - } - - public void needsUpdate(boolean needsUpdate) { - this.needsUpdate = needsUpdate; - } - - public boolean needsUpdate() { - return this.needsUpdate; - } + public static void dispose() {} @Override public void run() { - if (this.needsUpdate) { - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE bots SET name = ?, motto = ?, figure = ?, gender = ?, user_id = ?, room_id = ?, rot = ?, dance = ?, freeroam = ?, chat_lines = ?, chat_auto = ?, chat_random = ?, chat_delay = ?, effect = ?, bubble_id = ? WHERE id = ?")) { + if (this.sqlUpdateNeeded) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE bots SET name = ?, motto = ?, figure = ?, gender = ?, owner_id = ?, room_id = ?, rot = ?, dance = ?, freeroam = ?, chat_lines = ?, chat_auto = ?, chat_random = ?, chat_delay = ?, effect = ?, bubble_id = ? WHERE id = ?")) { statement.setString(1, this.name); statement.setString(2, this.motto); statement.setString(3, this.figure); statement.setString(4, this.gender.toString()); - statement.setInt(5, this.ownerId); - statement.setInt(6, this.room == null ? 0 : this.room.getRoomInfo().getId()); - statement.setInt(7, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getBodyRotation().getValue()); - statement.setInt(8, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getDanceType().getType()); + statement.setInt(5, this.ownerInfo.getId()); + statement.setInt(6, this.roomUnit.getRoom() == null ? 0 : this.roomUnit.getRoom().getRoomInfo().getId()); + statement.setInt(7, this.roomUnit.getBodyRotation().getValue()); + statement.setInt(8, this.roomUnit.getDanceType().getType()); statement.setString(9, this.canWalk ? "1" : "0"); StringBuilder text = new StringBuilder(); for (String s : this.chatLines) { @@ -183,7 +120,7 @@ public class Bot extends Unit implements Runnable { statement.setInt(15, this.bubbleId); statement.setInt(16, this.id); statement.execute(); - this.needsUpdate = false; + this.sqlUpdateNeeded = false; } catch (SQLException e) { log.error("Caught SQL exception", e); } @@ -191,122 +128,108 @@ public class Bot extends Unit implements Runnable { } public void talk(String message) { - if (this.room != null) { + if (this.roomUnit.getRoom() != null) { BotChatEvent event = new BotTalkEvent(this, message); if (Emulator.getPluginManager().fireEvent(event).isCancelled()) return; this.chatTimestamp = Emulator.getIntUnixTimestamp(); - this.room.botChat(new ChatMessageComposer(new RoomChatMessage(event.getMessage(), this.getRoomUnit(), RoomChatMessageBubbles.getBubble(this.getBubbleId()))).compose()); + this.roomUnit.getRoom().botChat(new ChatMessageComposer(new RoomChatMessage(event.getMessage(), this.roomUnit, RoomChatMessageBubbles.getBubble(this.getBubbleId()))).compose()); if (message.equals("o/") || message.equals("_o/")) { - this.room.sendComposer(new ExpressionMessageComposer(this.getRoomUnit(), RoomUserAction.WAVE).compose()); + this.roomUnit.getRoom().sendComposer(new ExpressionMessageComposer(this.roomUnit, RoomUserAction.WAVE).compose()); } } } public void shout(String message) { - if (this.room != null) { + if (this.roomUnit.getRoom() != null) { BotChatEvent event = new BotShoutEvent(this, message); if (Emulator.getPluginManager().fireEvent(event).isCancelled()) return; this.chatTimestamp = Emulator.getIntUnixTimestamp(); - this.room.botChat(new ShoutMessageComposer(new RoomChatMessage(event.getMessage(), this.getRoomUnit(), RoomChatMessageBubbles.getBubble(this.getBubbleId()))).compose()); + this.roomUnit.getRoom().botChat(new ShoutMessageComposer(new RoomChatMessage(event.getMessage(), this.roomUnit, RoomChatMessageBubbles.getBubble(this.getBubbleId()))).compose()); if (message.equals("o/") || message.equals("_o/")) { - this.room.sendComposer(new ExpressionMessageComposer(this.getRoomUnit(), RoomUserAction.WAVE).compose()); + this.roomUnit.getRoom().sendComposer(new ExpressionMessageComposer(this.roomUnit, RoomUserAction.WAVE).compose()); } } } public void whisper(String message, Habbo habbo) { - if (this.room != null && habbo != null) { + if (this.roomUnit.getRoom() != null && habbo != null) { BotWhisperEvent event = new BotWhisperEvent(this, message, habbo); if (Emulator.getPluginManager().fireEvent(event).isCancelled()) return; this.chatTimestamp = Emulator.getIntUnixTimestamp(); - event.getTarget().getClient().sendResponse(new WhisperMessageComposer(new RoomChatMessage(event.getMessage(), this.getRoomUnit(), RoomChatMessageBubbles.getBubble(this.getBubbleId())))); + event.getTarget().getClient().sendResponse(new WhisperMessageComposer(new RoomChatMessage(event.getMessage(), this.roomUnit, RoomChatMessageBubbles.getBubble(this.getBubbleId())))); } } public void onPlace(Habbo habbo, Room room) { - if (this.getRoomUnit() != null) { - this.getRoomUnit().giveEffect(this.effect, -1); + if (this.roomUnit != null) { + this.roomUnit.giveEffect(this.effect, -1); } if(PLACEMENT_MESSAGES.length > 0) { String message = PLACEMENT_MESSAGES[Emulator.getRandom().nextInt(PLACEMENT_MESSAGES.length)]; - if (!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.getRoomUnit(), room, new Object[]{message})) { + if (!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.roomUnit, room, new Object[]{message})) { this.talk(message); } } } - public void onPickUp(Habbo habbo, Room room) { - - } + public void onPickUp(Habbo habbo, Room room) {} public void onUserSay(final RoomChatMessage message) {} - public int getBubbleId() { - return bubbleId; - } - public void setName(String name) { this.name = name; - this.needsUpdate = true; + this.sqlUpdateNeeded = true; //if(this.room != null) - //this.room.sendComposer(new ChangeNameUpdatedComposer(this.getRoomUnit(), this.getName()).compose()); + //this.roomUnit.getRoom().sendComposer(new ChangeNameUpdatedComposer(this.roomUnit, this.getName()).compose()); } public void setMotto(String motto) { this.motto = motto; - this.needsUpdate = true; + this.sqlUpdateNeeded = true; } public void setFigure(String figure) { this.figure = figure; - this.needsUpdate = true; - - if (this.room != null) - this.room.sendComposer(new RoomUsersComposer(this).compose()); + this.sqlUpdateNeeded = true; + this.roomUnit.getRoom().sendComposer(new RoomUsersComposer(this).compose()); } public void setGender(HabboGender gender) { this.gender = gender; - this.needsUpdate = true; - - if (this.room != null) - this.room.sendComposer(new RoomUsersComposer(this).compose()); + this.sqlUpdateNeeded = true; + this.roomUnit.getRoom().sendComposer(new RoomUsersComposer(this).compose()); } public void setOwnerId(int ownerId) { this.ownerId = ownerId; - this.needsUpdate = true; - - if (this.room != null) - this.room.sendComposer(new RoomUsersComposer(this).compose()); + this.sqlUpdateNeeded = true; + this.roomUnit.getRoom().sendComposer(new RoomUsersComposer(this).compose()); } public void setOwnerName(String ownerName) { this.ownerName = ownerName; - this.needsUpdate = true; - - if (this.room != null) - this.room.sendComposer(new RoomUsersComposer(this).compose()); + this.sqlUpdateNeeded = true; + this.roomUnit.getRoom().sendComposer(new RoomUsersComposer(this).compose()); } public void setChatAuto(boolean chatAuto) { this.chatAuto = chatAuto; - this.needsUpdate = true; + this.sqlUpdateNeeded = true; } public void setChatRandom(boolean chatRandom) { this.chatRandom = chatRandom; - this.needsUpdate = true; + this.sqlUpdateNeeded = true; } public boolean hasChat() { @@ -315,28 +238,24 @@ public class Bot extends Unit implements Runnable { public void setChatDelay(short chatDelay) { this.chatDelay = (short) Math.min(Math.max(chatDelay, BotManager.MINIMUM_CHAT_SPEED), BotManager.MAXIMUM_CHAT_SPEED); - this.needsUpdate = true; + this.sqlUpdateNeeded = true; this.chatTimeOut = Emulator.getIntUnixTimestamp() + this.chatDelay; } - public int getChatTimestamp() { - return this.chatTimestamp; - } - public void clearChat() { synchronized (this.chatLines) { this.chatLines.clear(); - this.needsUpdate = true; + this.sqlUpdateNeeded = true; } } public void setEffect(int effect, int duration) { this.effect = effect; - this.needsUpdate = true; + this.sqlUpdateNeeded = true; - if (this.getRoomUnit() != null) { - if (this.room != null) { - this.getRoomUnit().giveEffect(this.effect, duration); + if (this.roomUnit != null) { + if (this.roomUnit.getRoom() != null) { + this.roomUnit.giveEffect(this.effect, duration); } } } @@ -344,14 +263,14 @@ public class Bot extends Unit implements Runnable { public void addChatLines(ArrayList chatLines) { synchronized (this.chatLines) { this.chatLines.addAll(chatLines); - this.needsUpdate = true; + this.sqlUpdateNeeded = true; } } public void addChatLine(String chatLine) { synchronized (this.chatLines) { this.chatLines.add(chatLine); - this.needsUpdate = true; + this.sqlUpdateNeeded = true; } } @@ -363,37 +282,6 @@ public class Bot extends Unit implements Runnable { this.canWalk = canWalk; } - public void onPlaceUpdate() { - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE bots SET name = ?, motto = ?, figure = ?, gender = ?, user_id = ?, room_id = ?, x = ?, y = ?, z = ?, rot = ?, dance = ?, freeroam = ?, chat_lines = ?, chat_auto = ?, chat_random = ?, chat_delay = ?, effect = ?, bubble_id = ? WHERE id = ?")) { - statement.setString(1, this.name); - statement.setString(2, this.motto); - statement.setString(3, this.figure); - statement.setString(4, this.gender.toString()); - statement.setInt(5, this.ownerId); - statement.setInt(6, this.room == null ? 0 : this.room.getRoomInfo().getId()); - statement.setInt(7, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getCurrentPosition().getX()); - statement.setInt(8, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getCurrentPosition().getY()); - statement.setDouble(9, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getCurrentZ()); - statement.setInt(10, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getBodyRotation().getValue()); - statement.setInt(11, this.getRoomUnit() == null ? 0 : this.getRoomUnit().getDanceType().getType()); - statement.setString(12, this.canWalk ? "1" : "0"); - StringBuilder text = new StringBuilder(); - for (String s : this.chatLines) { - text.append(s).append("\r"); - } - statement.setString(13, text.toString()); - statement.setString(14, this.chatAuto ? "1" : "0"); - statement.setString(15, this.chatRandom ? "1" : "0"); - statement.setInt(16, this.chatDelay); - statement.setInt(17, this.effect); - statement.setInt(18, this.bubbleId); - statement.setInt(19, this.id); - statement.execute(); - } catch (SQLException e) { - log.error("Caught SQL exception", e); - } - } - public void incrementLastChatIndex() { this.lastChatIndex++; } @@ -401,4 +289,32 @@ public class Bot extends Unit implements Runnable { public void resetLastChatIndex() { this.lastChatIndex = 0; } + + @Override + public void serialize(ServerMessage message) { + message.appendInt(-this.id); + message.appendString(this.name); + message.appendString(this.motto); + message.appendString(this.figure); + message.appendInt(this.roomUnit.getVirtualId()); + message.appendInt(this.roomUnit.getCurrentPosition().getX()); + message.appendInt(this.roomUnit.getCurrentPosition().getY()); + message.appendString(String.valueOf(this.roomUnit.getCurrentZ())); + message.appendInt(this.roomUnit.getBodyRotation().getValue()); + message.appendInt(4); + message.appendString(this.gender.name().toUpperCase()); + message.appendInt(this.ownerId); + message.appendString(this.ownerName); + message.appendInt(10); + message.appendShort(0); + message.appendShort(1); + message.appendShort(2); + message.appendShort(3); + message.appendShort(4); + message.appendShort(5); + message.appendShort(6); + message.appendShort(7); + message.appendShort(8); + message.appendShort(9); + } } 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 c0914662..a06492db 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/BotManager.java @@ -2,25 +2,11 @@ package com.eu.habbo.habbohotel.bots; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.permissions.Permission; -import com.eu.habbo.habbohotel.rooms.FurnitureMovementError; import com.eu.habbo.habbohotel.rooms.Room; -import com.eu.habbo.habbohotel.rooms.RoomTile; -import com.eu.habbo.habbohotel.rooms.RoomTileState; -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.RoomUnitType; -import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomBot; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboInfo; -import com.eu.habbo.messages.outgoing.generic.alerts.BotErrorComposer; -import com.eu.habbo.messages.outgoing.generic.alerts.BubbleAlertKeys; -import com.eu.habbo.messages.outgoing.generic.alerts.NotificationDialogMessageComposer; import com.eu.habbo.messages.outgoing.inventory.BotAddedToInventoryComposer; -import com.eu.habbo.messages.outgoing.inventory.BotRemovedFromInventoryComposer; -import com.eu.habbo.messages.outgoing.rooms.users.RoomUsersComposer; -import com.eu.habbo.messages.outgoing.rooms.users.UserUpdateComposer; import com.eu.habbo.plugin.events.bots.BotPickUpEvent; -import com.eu.habbo.plugin.events.bots.BotPlacedEvent; import gnu.trove.map.hash.THashMap; import lombok.extern.slf4j.Slf4j; @@ -103,71 +89,6 @@ public class BotManager { return bot; } - public void placeBot(Bot bot, Habbo habbo, Room room, RoomTile location) { - BotPlacedEvent event = new BotPlacedEvent(bot, location, habbo); - - Emulator.getPluginManager().fireEvent(event); - - if (event.isCancelled()) - return; - - if (room != null && bot != null && habbo != null) { - if (room.getRoomInfo().isRoomOwner(habbo) || habbo.hasPermissionRight(Permission.ACC_ANYROOMOWNER) || habbo.hasPermissionRight(Permission.ACC_PLACEFURNI)) { - if (room.getRoomUnitManager().getCurrentBots().size() >= Room.MAXIMUM_BOTS && !habbo.hasPermissionRight(Permission.ACC_UNLIMITED_BOTS)) { - habbo.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_MAX_BOTS)); - return; - } - - if (room.getRoomUnitManager().hasHabbosAt(location) || (!location.isWalkable() && location.getState() != RoomTileState.SIT && location.getState() != RoomTileState.LAY)) - return; - - if (!room.getRoomUnitManager().getBotsAt(location).isEmpty()) { - habbo.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_BOTS_SELECTED_TILE_NOT_FREE)); - return; - } - - RoomBot roomBot = bot.getRoomUnit(); - roomBot.setRotation(RoomRotation.SOUTH); - roomBot.setLocation(location); - double stackHeight = room.getRoomItemManager().getTopHeightAt(location.getX(), location.getY()); - roomBot.setCurrentZ(stackHeight); - roomBot.setRoom(room); - roomBot.setRoomUnitType(RoomUnitType.BOT); - roomBot.setCanWalk(room.isAllowBotsWalk()); - - bot.setRoom(room); - - bot.onPlaceUpdate(); - - room.getRoomUnitManager().addRoomUnit(bot); - Emulator.getThreading().run(bot); - room.sendComposer(new RoomUsersComposer(bot).compose()); - room.sendComposer(new UserUpdateComposer(bot.getRoomUnit()).compose()); - habbo.getInventory().getBotsComponent().removeBot(bot); - habbo.getClient().sendResponse(new BotRemovedFromInventoryComposer(bot)); - bot.onPlace(habbo, room); - - RoomItem topItem = room.getRoomItemManager().getTopItemAt(location.getX(), location.getY()); - - if (topItem != null) { - try { - topItem.onWalkOn(bot.getRoomUnit(), room, null); - } catch (Exception e) { - log.error("Caught exception", e); - } - } - } else { - habbo.getClient().sendResponse(new NotificationDialogMessageComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.getKey(), FurnitureMovementError.NO_RIGHTS.getErrorCode())); - } - } - } - - public void pickUpBot(int botId, Habbo habbo, Room room) { - if (habbo.getRoomUnit().getRoom() != null) { - this.pickUpBot(habbo.getRoomUnit().getRoom().getRoomUnitManager().getRoomBotById(Math.abs(botId)), habbo, room); - } - } - public void pickUpBot(Bot bot, Habbo habbo, Room room) { HabboInfo botOwnerInfo = habbo == null ? Emulator.getGameEnvironment().getHabboManager().getHabboInfo(bot.getOwnerId()) : habbo.getHabboInfo(); @@ -190,7 +111,7 @@ public class BotManager { bot.setFollowingHabboId(0); bot.setOwnerId(botOwnerInfo.getId()); bot.setOwnerName(botOwnerInfo.getUsername()); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); Emulator.getThreading().run(bot); Habbo receiver = habbo == null ? Emulator.getGameEnvironment().getHabboManager().getHabbo(botOwnerInfo.getId()) : habbo; diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java b/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java index a4ad12ef..c07261cc 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/ButlerBot.java @@ -30,10 +30,6 @@ public class ButlerBot extends Bot { super(set); } - public ButlerBot(Bot bot) { - super(bot); - } - public static void initialise() { if (serveItems == null) serveItems = new THashMap<>(); @@ -58,11 +54,11 @@ public class ButlerBot extends Bot { @Override public void onUserSay(final RoomChatMessage message) { - if (this.getRoomUnit().hasStatus(RoomUnitStatus.MOVE) || this.getRoom() == null) { + if (this.roomUnit.hasStatus(RoomUnitStatus.MOVE) || this.roomUnit.getRoom() == null) { return; } - double distanceBetweenBotAndHabbo = this.getRoomUnit().getCurrentPosition().distance(message.getHabbo().getRoomUnit().getCurrentPosition()); + double distanceBetweenBotAndHabbo = this.roomUnit.getCurrentPosition().distance(message.getHabbo().getRoomUnit().getCurrentPosition()); if (distanceBetweenBotAndHabbo <= Emulator.getConfig().getInt("hotel.bot.butler.commanddistance")) { @@ -81,7 +77,7 @@ public class ButlerBot extends Bot { } // Start give handitem process - if (this.getRoomUnit().isCanWalk()) { + if (this.roomUnit.isCanWalk()) { final String key = keyword; final Bot bot = this; @@ -91,16 +87,16 @@ public class ButlerBot extends Bot { // Step 2: Prepare tasks for when the Bot (carrying the handitem) reaches the Habbo final List tasks = new ArrayList<>(); tasks.add(new RoomUnitGiveHanditem(serveEvent.getHabbo().getRoomUnit(), serveEvent.getHabbo().getRoomUnit().getRoom(), serveEvent.getItemId())); - tasks.add(new RoomUnitGiveHanditem(this.getRoomUnit(), serveEvent.getHabbo().getRoomUnit().getRoom(), 0)); + tasks.add(new RoomUnitGiveHanditem(this.roomUnit, serveEvent.getHabbo().getRoomUnit().getRoom(), 0)); tasks.add(() -> { - if (this.getRoom() != null) { + if (this.roomUnit.getRoom() != null) { String botMessage = Emulator.getTexts() .getValue("bots.butler.given") .replace("%key%", key) .replace("%username%", serveEvent.getHabbo().getHabboInfo().getUsername()); - if (!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.getRoomUnit(), this.getRoom(), new Object[]{botMessage})) { + if (!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.roomUnit, this.roomUnit.getRoom(), new Object[]{botMessage})) { bot.talk(botMessage); } } @@ -116,20 +112,20 @@ public class ButlerBot extends Bot { }); // Give bot the handitem that it's going to give the Habbo - Emulator.getThreading().run(new RoomUnitGiveHanditem(this.getRoomUnit(), serveEvent.getHabbo().getRoomUnit().getRoom(), serveEvent.getItemId())); + Emulator.getThreading().run(new RoomUnitGiveHanditem(this.roomUnit, serveEvent.getHabbo().getRoomUnit().getRoom(), serveEvent.getItemId())); if (distanceBetweenBotAndHabbo > Emulator.getConfig().getInt("hotel.bot.butler.reachdistance", 3)) { - Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(this.getRoomUnit(), serveEvent.getHabbo().getRoomUnit(), serveEvent.getHabbo().getRoomUnit().getRoom(), tasks, failedReached, Emulator.getConfig().getInt("hotel.bot.butler.reachdistance", 3))); + Emulator.getThreading().run(new RoomUnitWalkToRoomUnit(this.roomUnit, serveEvent.getHabbo().getRoomUnit(), serveEvent.getHabbo().getRoomUnit().getRoom(), tasks, failedReached, Emulator.getConfig().getInt("hotel.bot.butler.reachdistance", 3))); } else { Emulator.getThreading().run(failedReached.get(0), 1000); } } else { - if (this.getRoom() != null) { + if (this.roomUnit.getRoom() != null) { serveEvent.getHabbo().getRoomUnit().setHandItem(serveEvent.getItemId()); - this.getRoom().sendComposer(new CarryObjectMessageComposer(serveEvent.getHabbo().getRoomUnit()).compose()); + this.roomUnit.getRoom().sendComposer(new CarryObjectMessageComposer(serveEvent.getHabbo().getRoomUnit()).compose()); String msg = Emulator.getTexts().getValue("bots.butler.given").replace("%key%", keyword).replace("%username%", serveEvent.getHabbo().getHabboInfo().getUsername()); - if (!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.getRoomUnit(), this.getRoom(), new Object[]{msg})) { + if (!WiredHandler.handle(WiredTriggerType.SAY_SOMETHING, this.roomUnit, this.roomUnit.getRoom(), new Object[]{msg})) { this.talk(msg); } } diff --git a/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java b/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java index 672dfff2..bcca553e 100644 --- a/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java +++ b/src/main/java/com/eu/habbo/habbohotel/bots/VisitorBot.java @@ -20,10 +20,6 @@ public class VisitorBot extends Bot { super(set); } - public VisitorBot(Bot bot) { - super(bot); - } - public static void initialise() { DATE_FORMAT = new SimpleDateFormat(Emulator.getConfig().getValue("bots.visitor.dateformat")); } diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java index 386753b4..6885f3c1 100644 --- a/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/CatalogManager.java @@ -902,7 +902,7 @@ public class CatalogManager { if (bot != null) { bot.setOwnerId(habbo.getClient().getHabbo().getHabboInfo().getId()); bot.setOwnerName(habbo.getClient().getHabbo().getHabboInfo().getUsername()); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); Emulator.getThreading().run(bot); habbo.getClient().getHabbo().getInventory().getBotsComponent().addBot(bot); habbo.getClient().sendResponse(new BotAddedToInventoryComposer(bot)); diff --git a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java index 930c2c09..7c2d7607 100644 --- a/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java +++ b/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/effects/WiredEffectBotTeleport.java @@ -51,7 +51,7 @@ public class WiredEffectBotTeleport extends InteractionWiredEffect { for (RoomItem item : this.getWiredSettings().getItems(room)) { if (item.getRoomId() != 0) { - Room room1 = bot.getRoom(); + Room room1 = bot.getRoomUnit().getRoom(); if (item.getRoomId() == room1.getRoomInfo().getId()) { if (i == j) { teleportUnitToTile(bot.getRoomUnit(), room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); 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 4a845ae0..07f50e2c 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 @@ -54,7 +54,7 @@ public class WiredEffectBotWalkToFurni extends InteractionWiredEffect { RoomItem item = possibleItems.get(Emulator.getRandom().nextInt(possibleItems.size())); if (item.getRoomId() != 0) { - Room room1 = bot.getRoom(); + Room room1 = bot.getRoomUnit().getRoom(); if (item.getRoomId() == room1.getRoomInfo().getId()) { bot.getRoomUnit().walkTo(room.getLayout().getTile(item.getCurrentPosition().getX(), item.getCurrentPosition().getY())); } diff --git a/src/main/java/com/eu/habbo/habbohotel/pets/RideablePet.java b/src/main/java/com/eu/habbo/habbohotel/pets/RideablePet.java index fb26f720..d846e793 100644 --- a/src/main/java/com/eu/habbo/habbohotel/pets/RideablePet.java +++ b/src/main/java/com/eu/habbo/habbohotel/pets/RideablePet.java @@ -37,6 +37,10 @@ public class RideablePet extends Pet { this.hasSaddle = hasSaddle; } + public boolean hasRider() { + return this.rider != null; + } + public boolean anyoneCanRide() { return this.anyoneCanRide; } 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 24946e74..abbe4d51 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -16,7 +16,6 @@ import com.eu.habbo.habbohotel.items.interactions.games.InteractionGameTimer; import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.RideablePet; -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.RoomUnit; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnitType; @@ -392,75 +391,6 @@ public class Room implements Comparable, ISerialize, Runnable { this.sendComposer(new UserUpdateComposer(roomUnit).compose()); } - public void updateHabbosAt(RoomTile tile) { - RoomItem item = this.roomItemManager.getTopItemAt(tile.getX(), tile.getY()); - - Collection habbos = this.roomUnitManager.getHabbosAt(tile); - - if(habbos == null || habbos.isEmpty()) { - return; - } - - //Improve this - for (Habbo habbo : habbos) { - double z = habbo.getRoomUnit().getCurrentPosition().getStackHeight(); - - if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.SIT) && ((item == null && !habbo.getRoomUnit().isCmdSitEnabled()) || (item != null && !item.getBaseItem().allowSit()))) { - habbo.getRoomUnit().removeStatus(RoomUnitStatus.SIT); - } - - if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.LAY) && ((item == null && !habbo.getRoomUnit().isCmdLayEnabled()) || (item != null && !item.getBaseItem().allowLay()))) { - habbo.getRoomUnit().removeStatus(RoomUnitStatus.LAY); - } - - 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().setRotation(RoomRotation.fromValue(item.getRotation())); - } else { - habbo.getRoomUnit().setCurrentZ(z); - } - } - } - - public void updateBotsAt(RoomTile tile) { - this.updateBotsAt(tile.getX(), tile.getY()); - } - - public void updateBotsAt(short x, short y) { - RoomItem topItem = this.roomItemManager.getTopItemAt(x, y); - - THashSet roomUnits = new THashSet<>(); - - RoomTile tile = this.layout.getTile(x, y); - this.roomUnitManager.getBotsAt(tile).forEach(bot -> { - if (topItem != null) { - if (topItem.getBaseItem().allowSit()) { - bot.getRoomUnit().setCurrentZ(topItem.getCurrentZ()); - bot.getRoomUnit().setRotation(RoomRotation.fromValue(topItem.getRotation())); - } else { - bot.getRoomUnit().setCurrentZ(topItem.getCurrentZ() + Item.getCurrentHeight(topItem)); - - if (topItem.getBaseItem().allowLay()) { - bot.getRoomUnit().addStatus(RoomUnitStatus.LAY, String.valueOf(topItem.getCurrentZ() + topItem.getBaseItem().getHeight())); - } - } - } else { - bot.getRoomUnit().setCurrentZ(bot.getRoomUnit().getCurrentPosition().getStackHeight()); - } - roomUnits.add(bot.getRoomUnit()); - }); - - if (!roomUnits.isEmpty()) { - this.sendComposer(new UserUpdateComposer(roomUnits).compose()); - } - } - public void startTrade(Habbo userOne, Habbo userTwo) { RoomTrade trade = new RoomTrade(userOne, userTwo, this); synchronized (this.activeTrades) { @@ -1741,12 +1671,6 @@ public class Room implements Comparable, ISerialize, Runnable { } 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); - if(tile == null) { return false; } @@ -1754,7 +1678,7 @@ public class Room implements Comparable, ISerialize, Runnable { if (this.roomUnitManager.hasHabbosAt(tile)) return false; - THashSet items = this.roomItemManager.getItemsAt(x, y); + THashSet items = this.roomItemManager.getItemsAt(tile); return this.canSitAt(items) || this.canLayAt(items); } @@ -1769,7 +1693,7 @@ public class Room implements Comparable, ISerialize, Runnable { if (this.roomUnitManager.hasHabbosAt(tile)) return false; - return this.canSitAt(this.roomItemManager.getItemsAt(x, y)); + return this.canSitAt(this.roomItemManager.getItemsAt(tile)); } boolean canSitAt(THashSet items) { 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 f3efbb36..71c1610d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java @@ -318,8 +318,8 @@ public class RoomItemManager { this.room.sendComposer(new ObjectAddMessageComposer(item, this.room.getFurniOwnerName(item.getOwnerInfo().getId())).compose()); for (RoomTile t : occupiedTiles) { - this.room.updateHabbosAt(t); - this.room.updateBotsAt(t); + this.room.getRoomUnitManager().updateHabbosAt(t); + this.room.getRoomUnitManager().updateBotsAt(t); } Emulator.getThreading().run(item); @@ -514,8 +514,8 @@ public class RoomItemManager { //Update Habbos at old position for (RoomTile t : occupiedTiles) { - this.room.updateHabbosAt(t); - this.room.updateBotsAt(t); + this.room.getRoomUnitManager().updateHabbosAt(t); + this.room.getRoomUnitManager().updateBotsAt(t); } if (Emulator.getConfig().getBoolean("wired.place.under", false)) { @@ -572,8 +572,8 @@ public class RoomItemManager { this.room.sendComposer(new HeightMapUpdateMessageComposer(this.room, updatedTiles).compose()); this.room.updateTiles(updatedTiles); updatedTiles.forEach(tile -> { - this.room.updateHabbosAt(tile); - this.room.updateBotsAt(tile.getX(), tile.getY()); + this.room.getRoomUnitManager().updateHabbosAt(tile); + this.room.getRoomUnitManager().updateBotsAt(tile); }); } else if (item.getBaseItem().getType() == FurnitureType.WALL) { this.room.sendComposer(new ItemRemoveMessageComposer(item).compose()); 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 1f6ce701..f7ccff0a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomLayout.java @@ -1,6 +1,7 @@ package com.eu.habbo.habbohotel.rooms; import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnit; import gnu.trove.set.hash.THashSet; import lombok.Getter; @@ -562,8 +563,9 @@ public class RoomLayout { public RoomTile getRandomWalkableTilesAround(RoomUnit roomUnit, RoomTile tile, Room room, int radius) { if(!this.tileExists(tile.getX(), tile.getY())) { tile = this.getTile(roomUnit.getCurrentPosition().getX(), roomUnit.getCurrentPosition().getY()); - room.getRoomUnitManager().getRoomBotById(roomUnit.getVirtualId()).needsUpdate(true); - } + Bot bot = room.getRoomUnitManager().getRoomBotById(roomUnit.getVirtualId()); + bot.setSqlUpdateNeeded(true); + } List newTiles = new ArrayList<>(); 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 11c890d5..8f2a4395 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -710,7 +710,7 @@ public class RoomManager { } - habbo.getClient().sendResponse(new RoomUsersComposer(room.getRoomUnitManager().getCurrentBots().values(), true)); + habbo.getClient().sendResponse(new RoomUsersComposer(room.getRoomUnitManager().getCurrentBots().values())); if (!room.getRoomUnitManager().getCurrentBots().isEmpty()) { room.getRoomUnitManager().getCurrentBots().values().stream() diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightsManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightsManager.java index 2f88a241..be3a7955 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightsManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomRightsManager.java @@ -87,14 +87,14 @@ public class RoomRightsManager { return; } - if (this.rights.add(habbo.getHabboInfo().getId())) { - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_rights VALUES (?, ?)")) { - statement.setInt(1, this.room.getRoomInfo().getId()); - statement.setInt(2, habbo.getHabboInfo().getId()); - statement.execute(); - } catch (SQLException e) { - log.error(CAUGHT_SQL_EXCEPTION, e); - } + this.rights.add(habbo.getHabboInfo().getId()); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("INSERT INTO room_rights VALUES (?, ?)")) { + statement.setInt(1, this.room.getRoomInfo().getId()); + statement.setInt(2, habbo.getHabboInfo().getId()); + statement.execute(); + } catch (SQLException e) { + log.error(CAUGHT_SQL_EXCEPTION, e); } this.room.getRoomRightsManager().refreshRightsForHabbo(habbo); 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 ab5b85f1..589fa924 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomUnitManager.java @@ -2,6 +2,8 @@ package com.eu.habbo.habbohotel.rooms; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.bots.Bot; +import com.eu.habbo.habbohotel.bots.BotManager; +import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.PetManager; @@ -15,13 +17,16 @@ 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.habbohotel.users.HabboInfo; import com.eu.habbo.messages.outgoing.generic.alerts.BotErrorComposer; +import com.eu.habbo.messages.outgoing.inventory.BotAddedToInventoryComposer; import com.eu.habbo.messages.outgoing.inventory.BotRemovedFromInventoryComposer; 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.RoomUsersComposer; import com.eu.habbo.messages.outgoing.rooms.users.UserRemoveMessageComposer; import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.bots.BotPickUpEvent; import com.eu.habbo.plugin.events.bots.BotPlacedEvent; import gnu.trove.set.hash.THashSet; import lombok.Getter; @@ -67,28 +72,31 @@ public class RoomUnitManager { private synchronized void loadBots(Connection connection) { this.currentBots.clear(); - try (PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots INNER JOIN users ON bots.user_id = users.id WHERE room_id = ?")) { + try (PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots INNER JOIN users ON bots.owner_id = users.id WHERE room_id = ?")) { statement.setInt(1, this.room.getRoomInfo().getId()); 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) { + + RoomTile spawnTile = this.room.getLayout().getTile((short) set.getInt("x"), (short) set.getInt("y")); + + if(spawnTile == null) { + bot.getRoomUnit().setCurrentPosition(this.room.getLayout().getDoorTile()); bot.getRoomUnit().setCurrentZ(this.room.getLayout().getDoorTile().getStackHeight()); - bot.getRoomUnit().setLocation(this.room.getLayout().getDoorTile()); bot.getRoomUnit().setRotation(RoomRotation.fromValue(this.room.getLayout().getDoorDirection())); } else { + + bot.getRoomUnit().setCurrentPosition(spawnTile); bot.getRoomUnit().setCurrentZ(set.getDouble("z")); bot.getRoomUnit().setRotation(RoomRotation.values()[set.getInt("rot")]); } - bot.getRoomUnit().setRoomUnitType(RoomUnitType.BOT); + bot.getRoomUnit().setDanceType(DanceType.values()[set.getInt("dance")]); + + //@DEPRECATED bot.getRoomUnit().setInRoom(true); bot.getRoomUnit().giveEffect(set.getInt("effect"), Integer.MAX_VALUE, false); @@ -150,7 +158,9 @@ public class RoomUnitManager { this.currentHabbos.put(((Habbo) unit).getHabboInfo().getId(), (Habbo) unit); unit.getRoomUnit().getRoom().updateDatabaseUserCount(); } - case BOT -> this.currentBots.put(((Bot) unit).getId(), (Bot) unit); + case BOT -> { + this.currentBots.put(((Bot) unit).getId(), (Bot) unit); + } case PET -> { this.currentPets.put(((Pet) unit).getId(), (Pet) unit); Habbo habbo = this.getRoomHabboById(((Pet) unit).getUserId()); @@ -170,6 +180,10 @@ public class RoomUnitManager { return this.currentRoomUnits.values().stream().anyMatch(roomUnit -> roomUnit.getCurrentPosition().equals(tile)); } + public boolean areRoomUnitsAt(RoomTile tile, RoomUnit skippedRoomUnit) { + return this.currentRoomUnits.values().stream().filter(roomUnit -> !roomUnit.equals(skippedRoomUnit)).anyMatch(roomUnit -> roomUnit.getCurrentPosition().equals(tile)); + } + public List getAvatarsAt(RoomTile tile) { return Stream.concat(this.getHabbosAt(tile).stream(), this.getBotsAt(tile).stream()).map(Unit::getRoomUnit).collect(Collectors.toList()); } @@ -202,6 +216,41 @@ public class RoomUnitManager { return this.currentHabbos.values().stream().filter(habbo -> habbo.getRoomUnit() == roomUnit).findFirst().orElse(null); } + public void updateHabbosAt(RoomTile tile) { + Collection habbos = this.getHabbosAt(tile); + + if(habbos == null || habbos.isEmpty()) { + return; + } + + RoomItem item = this.room.getRoomItemManager().getTopItemAt(tile.getX(), tile.getY()); + + for (Habbo habbo : habbos) { + double z = habbo.getRoomUnit().getCurrentPosition().getStackHeight(); + + if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.SIT) && ((item == null && !habbo.getRoomUnit().isCmdSitEnabled()) || (item != null && !item.getBaseItem().allowSit()))) { + habbo.getRoomUnit().removeStatus(RoomUnitStatus.SIT); + } + + if (habbo.getRoomUnit().hasStatus(RoomUnitStatus.LAY) && ((item == null && !habbo.getRoomUnit().isCmdLayEnabled()) || (item != null && !item.getBaseItem().allowLay()))) { + habbo.getRoomUnit().removeStatus(RoomUnitStatus.LAY); + } + + 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().setRotation(RoomRotation.fromValue(item.getRotation())); + } else { + habbo.getRoomUnit().setCurrentZ(z); + } + } + } + public Bot getRoomBotById(int botId) { return this.currentBots.get(botId); } @@ -224,16 +273,17 @@ public class RoomUnitManager { return this.currentBots.values().stream().filter(bot -> bot.getRoomUnit().getCurrentPosition().equals(tile)).collect(Collectors.toSet()); } - public void placeBot(Bot bot, Habbo habbo, int x, int y) { + public void placeBot(Bot bot, Habbo botOwner, int x, int y) { synchronized (this.currentBots) { RoomTile spawnTile = room.getLayout().getTile((short) x, (short) y); - if(spawnTile == null) { - spawnTile = room.getLayout().getDoorTile(); + if(spawnTile == null || (!spawnTile.isWalkable() && !this.room.canSitOrLayAt(spawnTile)) || this.areRoomUnitsAt(spawnTile)) { + botOwner.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_BOTS_SELECTED_TILE_NOT_FREE)); + return; } if (Emulator.getPluginManager().isRegistered(BotPlacedEvent.class, false)) { - Event event = new BotPlacedEvent(bot, spawnTile, habbo); + Event event = new BotPlacedEvent(bot, spawnTile, botOwner); Emulator.getPluginManager().fireEvent(event); if (event.isCancelled()) { @@ -241,13 +291,8 @@ public class RoomUnitManager { } } - if(this.currentBots.size() >= Room.MAXIMUM_BOTS && !habbo.hasPermissionRight(Permission.ACC_UNLIMITED_BOTS)) { - habbo.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_MAX_BOTS)); - return; - } - - if((!spawnTile.isWalkable() && !this.room.canSitOrLayAt(spawnTile)) || this.areRoomUnitsAt(spawnTile)) { - habbo.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_BOTS_SELECTED_TILE_NOT_FREE)); + if(this.currentBots.size() >= Room.MAXIMUM_BOTS && !botOwner.hasPermissionRight(Permission.ACC_UNLIMITED_BOTS)) { + botOwner.getClient().sendResponse(new BotErrorComposer(BotErrorComposer.ROOM_ERROR_MAX_BOTS)); return; } @@ -259,15 +304,92 @@ public class RoomUnitManager { roomBot.setRotation(RoomRotation.SOUTH); roomBot.setCanWalk(this.room.isAllowBotsWalk()); + bot.setSqlUpdateNeeded(true); + Emulator.getThreading().run(bot); + this.addRoomUnit(bot); this.room.sendComposer(new RoomUsersComposer(bot).compose()); roomBot.instantUpdate(); - habbo.getInventory().getBotsComponent().removeBot(bot); - habbo.getClient().sendResponse(new BotRemovedFromInventoryComposer(bot)); - bot.onPlace(habbo, room); + botOwner.getInventory().getBotsComponent().removeBot(bot); + botOwner.getClient().sendResponse(new BotRemovedFromInventoryComposer(bot)); + bot.onPlace(botOwner, room); + } + } + + public void updateBotsAt(RoomTile tile) { + Collection bots = this.getBotsAt(tile); + + if(bots == null || bots.isEmpty()) { + return; + } + + RoomItem item = this.room.getRoomItemManager().getTopItemAt(tile.getX(), tile.getY()); + + bots.forEach(bot -> { + double z = bot.getRoomUnit().getCurrentPosition().getStackHeight(); + + if (bot.getRoomUnit().hasStatus(RoomUnitStatus.SIT) && ((item == null && !bot.getRoomUnit().isCmdSitEnabled()) || (item != null && !item.getBaseItem().allowSit()))) { + bot.getRoomUnit().removeStatus(RoomUnitStatus.SIT); + } + + if (bot.getRoomUnit().hasStatus(RoomUnitStatus.LAY) && ((item == null && !bot.getRoomUnit().isCmdLayEnabled()) || (item != null && !item.getBaseItem().allowLay()))) { + bot.getRoomUnit().removeStatus(RoomUnitStatus.LAY); + } + + if (item != null && (item.getBaseItem().allowSit() || item.getBaseItem().allowLay())) { + if(item.getBaseItem().allowSit()) { + bot.getRoomUnit().addStatus(RoomUnitStatus.SIT, String.valueOf(Item.getCurrentHeight(item))); + } else if(item.getBaseItem().allowLay()) { + bot.getRoomUnit().addStatus(RoomUnitStatus.LAY, String.valueOf(Item.getCurrentHeight(item))); + } + + bot.getRoomUnit().setCurrentZ(item.getCurrentZ()); + bot.getRoomUnit().setRotation(RoomRotation.fromValue(item.getRotation())); + } else { + bot.getRoomUnit().setCurrentZ(z); + } + }); + } + + public void pickUpBot(Bot bot, Habbo picker) { + HabboInfo botOwnerInfo = picker == null ? bot.getOwnerInfo() : picker.getHabboInfo(); + + BotPickUpEvent pickedUpEvent = new BotPickUpEvent(bot, picker); + Emulator.getPluginManager().fireEvent(pickedUpEvent); + + if (pickedUpEvent.isCancelled()) + return; + + if (picker == null || (bot.getOwnerInfo().getId() == picker.getHabboInfo().getId() || picker.hasPermissionRight(Permission.ACC_ANYROOMOWNER))) { + if (picker != null && !picker.hasPermissionRight(Permission.ACC_UNLIMITED_BOTS) && picker.getInventory().getBotsComponent().getBots().size() >= BotManager.MAXIMUM_BOT_INVENTORY_SIZE) { + picker.alert(Emulator.getTexts().getValue("error.bots.max.inventory").replace("%amount%", String.valueOf(BotManager.MAXIMUM_BOT_INVENTORY_SIZE))); + return; + } + + bot.onPickUp(picker, this.room); + + bot.setFollowingHabboId(0); + + //@DEPRECATED + bot.setOwnerId(botOwnerInfo.getId()); + bot.setOwnerName(botOwnerInfo.getUsername()); + + bot.setOwnerInfo(botOwnerInfo); + + this.removeBot(bot); + + bot.setSqlUpdateNeeded(true); + Emulator.getThreading().run(bot); + + Habbo receiver = picker == null ? Emulator.getGameEnvironment().getHabboManager().getHabbo(botOwnerInfo.getId()) : picker; + + if (receiver != null) { + receiver.getInventory().getBotsComponent().addBot(bot); + receiver.getClient().sendResponse(new BotAddedToInventoryComposer(bot)); + } } } @@ -384,9 +506,10 @@ public class RoomUnitManager { roomHabbo.clear(); } - public boolean removeBot(Bot bot) { + public void removeBot(Bot bot) { synchronized (this.currentBots) { if (this.currentBots.containsKey(bot.getId())) { + //TODO gotta do a method to removeUnit and clear tile if (bot.getRoomUnit() != null && bot.getRoomUnit().getCurrentPosition() != null) { bot.getRoomUnit().getCurrentPosition().removeUnit(bot.getRoomUnit()); } @@ -394,15 +517,13 @@ public class RoomUnitManager { this.currentBots.remove(bot.getId()); this.currentRoomUnits.remove(bot.getRoomUnit().getVirtualId()); + //@DEPRECATED bot.getRoomUnit().setInRoom(false); - bot.setRoom(null); + bot.getRoomUnit().setRoom(null); this.room.sendComposer(new UserRemoveMessageComposer(bot.getRoomUnit()).compose()); - return true; } } - - return false; } public Pet removePet(int petId) { @@ -471,7 +592,7 @@ public class RoomUnitManager { while(botIterator.hasNext()) { try { Bot bot = botIterator.next(); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); Emulator.getThreading().run(bot); } catch (NoSuchElementException e) { log.error("Caught Exception", e); diff --git a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomWordFilterManager.java b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomWordFilterManager.java index 698a9790..446922b0 100644 --- a/src/main/java/com/eu/habbo/habbohotel/rooms/RoomWordFilterManager.java +++ b/src/main/java/com/eu/habbo/habbohotel/rooms/RoomWordFilterManager.java @@ -78,4 +78,17 @@ public class RoomWordFilterManager { } } } + + public void removeAllWords() { + synchronized (this.filteredWords) { + this.filteredWords.clear(); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("DELETE FROM room_wordfilter WHERE room_id = ?")) { + statement.setInt(1, this.room.getRoomInfo().getId()); + statement.execute(); + } catch (SQLException e) { + log.error(CAUGHT_SQL_EXCEPTION, e); + } + } + } } 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 efdefff8..52b5dd07 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 @@ -5,11 +5,13 @@ import com.eu.habbo.habbohotel.bots.Bot; import com.eu.habbo.habbohotel.items.Item; import com.eu.habbo.habbohotel.items.interactions.InteractionWater; import com.eu.habbo.habbohotel.items.interactions.InteractionWaterItem; +import com.eu.habbo.habbohotel.pets.RideablePet; import com.eu.habbo.habbohotel.rooms.*; 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.rooms.entities.units.types.RoomPet; import com.eu.habbo.habbohotel.units.Unit; import com.eu.habbo.habbohotel.users.DanceType; import com.eu.habbo.messages.outgoing.rooms.users.UserUpdateComposer; @@ -32,59 +34,57 @@ import java.util.concurrent.ConcurrentHashMap; @Accessors(chain = true) public abstract class RoomUnit extends RoomEntity { @Setter - private int virtualId; + protected int virtualId; @Setter - private Unit unit; + protected Unit unit; @Setter - private RoomUnitType roomUnitType; + protected RoomUnitType roomUnitType; @Setter - private RoomRotation bodyRotation; + protected RoomRotation bodyRotation; @Setter - private RoomRotation headRotation; + protected RoomRotation headRotation; @Setter - private boolean canWalk; + protected boolean canWalk; @Setter - private boolean canRotate; + protected boolean canRotate; @Setter - private boolean isTeleporting; + protected boolean isTeleporting; @Setter - private boolean cmdSitEnabled = false; + protected boolean cmdSitEnabled = false; @Setter - private boolean cmdStandEnabled = false; + protected boolean cmdStandEnabled = false; @Setter - private boolean cmdLayEnabled = false; + protected boolean cmdLayEnabled = false; @Setter - private boolean isSwimming = false; + protected boolean isSwimming = false; @Setter - private boolean cmdFastWalkEnabled; + protected boolean cmdFastWalkEnabled; @Setter - private boolean temporalFastWalkEnabled; - private final ConcurrentHashMap statuses; + protected boolean temporalFastWalkEnabled; + protected final ConcurrentHashMap statuses; @Setter - private boolean statusUpdateNeeded; + protected boolean statusUpdateNeeded; @Setter - private boolean isWiredTeleporting = false; + protected boolean isWiredTeleporting = false; @Setter - private boolean isLeavingTeleporter = false; - private final THashMap cacheable; + protected boolean isLeavingTeleporter = false; + protected final THashMap cacheable; @Setter - private boolean isKicked; + protected boolean isKicked; @Setter - private int kickCount = 0; + protected int kickCount = 0; @Setter - private boolean inRoom; + protected boolean inRoom; @Setter @Accessors(chain = true) - private boolean invisible = false; + protected boolean invisible = false; @Setter - private boolean canLeaveRoomByDoor = true; + protected boolean canLeaveRoomByDoor = true; @Setter - private int walkTimeOut; - private int previousEffectId; - private int previousEffectEndTimestamp; - private int timeInRoom; - private RoomRightLevels rightsLevel = RoomRightLevels.NONE; - private final THashSet overridableTiles; + protected int walkTimeOut; + protected int timeInRoom; + protected RoomRightLevels rightsLevel = RoomRightLevels.NONE; + protected final THashSet overridableTiles; public RoomUnit() { this.virtualId = 0; @@ -103,10 +103,6 @@ public abstract class RoomUnit extends RoomEntity { this.walkTimeOut = Emulator.getIntUnixTimestamp(); this.timeInRoom = 0; - //RoomAvatar - this.previousEffectId = 0; - this.previousEffectEndTimestamp = -1; - //RoomHabbo this.isKicked = false; this.overridableTiles = new THashSet<>(); @@ -170,7 +166,7 @@ public abstract class RoomUnit extends RoomEntity { if (this.room != null) { Bot bot = this.room.getRoomUnitManager().getRoomBotById(getVirtualId()); if (bot != null) { - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); } } @@ -243,7 +239,7 @@ public abstract class RoomUnit extends RoomEntity { 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 canSitOrLayAtTarget = hasValidTargetPosition && hasValidRoom && this.room.canSitOrLayAt(this.targetPosition); boolean canOverrideTile = hasValidTargetPosition && this.canOverrideTile(this.targetPosition); if (hasValidLayout && (isTargetPositionWalkable || canSitOrLayAtTarget || canOverrideTile)) { @@ -496,7 +492,7 @@ public abstract class RoomUnit extends RoomEntity { this.setCurrentZ(this.getNextZ()); } - if(!this.path.isEmpty()) { + if(this.path != null && !this.path.isEmpty()) { RoomTile next = this.path.poll(); if(this.path.size() > 1 && (this.cmdFastWalkEnabled || this.temporalFastWalkEnabled)) { @@ -570,8 +566,18 @@ public abstract class RoomUnit extends RoomEntity { double heightDifference = tile.getStackHeight() - this.currentZ; - //TODO Why bots are not being detected? boolean areRoomUnitsAtTile = this.room.getRoomUnitManager().areRoomUnitsAt(tile); + + if(this instanceof RoomAvatar roomAvatar && roomAvatar.isRiding()) { + areRoomUnitsAtTile = this.room.getRoomUnitManager().areRoomUnitsAt(tile, roomAvatar.getRidingPet().getRoomUnit()); + } + + if(this instanceof RoomPet roomPet) { + if(roomPet.getUnit() instanceof RideablePet rideablePet && rideablePet.hasRider()) { + areRoomUnitsAtTile = this.room.getRoomUnitManager().areRoomUnitsAt(tile, rideablePet.getRider().getRoomUnit()); + } + } + 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); @@ -579,14 +585,13 @@ public abstract class RoomUnit extends RoomEntity { 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; - } + if(areRoomUnitsAtTile && this.targetPosition.equals(tile)) { + this.stopWalking(); + return false; + } + + if(areRoomUnitsAtTile && !this.room.getRoomInfo().isAllowWalkthrough()) { + return false; } } @@ -606,8 +611,6 @@ public abstract class RoomUnit extends RoomEntity { this.canRotate = true; 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 4d90050d..0e978c4b 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 @@ -26,7 +26,7 @@ import java.util.List; @Getter @Setter @Accessors(chain = true) -public class RoomAvatar extends RoomUnit { +public abstract class RoomAvatar extends RoomUnit { protected RideablePet ridingPet; protected boolean rideLocked; protected DanceType danceType; @@ -91,8 +91,6 @@ public class RoomAvatar extends RoomUnit { this.ridingPet.setRider(null); this.ridingPet.setTask(PetTasks.FREE); - this.ridingPet = null; - this.giveEffect(0, -1); this.setCurrentZ(this.ridingPet.getRoomUnit().getCurrentZ()); this.stopWalking(); @@ -102,6 +100,8 @@ public class RoomAvatar extends RoomUnit { this.instantUpdate(); this.ridingPet.getRoomUnit().instantUpdate(); + this.ridingPet = null; + List availableTiles = isRemoving ? new ArrayList<>() : this.room.getLayout().getWalkableTilesAround(this.getCurrentPosition()); RoomTile tile = availableTiles.isEmpty() ? this.getCurrentPosition() : availableTiles.get(0); @@ -184,6 +184,7 @@ public class RoomAvatar extends RoomUnit { super.clear(); this.ridingPet = null; + this.rideLocked = false; 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 3f15cfde..b522a776 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,10 +1,26 @@ 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.RoomChatMessage; +import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; +import com.eu.habbo.habbohotel.rooms.RoomUserAction; import com.eu.habbo.habbohotel.rooms.entities.units.RoomUnitType; +import com.eu.habbo.habbohotel.wired.WiredHandler; +import com.eu.habbo.habbohotel.wired.WiredTriggerType; +import com.eu.habbo.messages.outgoing.rooms.users.ChatMessageComposer; +import com.eu.habbo.messages.outgoing.rooms.users.ExpressionMessageComposer; +import com.eu.habbo.plugin.Event; +import com.eu.habbo.plugin.events.bots.BotTalkEvent; import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Getter +@Setter +@Accessors(chain = true) public class RoomBot extends RoomAvatar { private Bot unit; @@ -14,9 +30,67 @@ public class RoomBot extends RoomAvatar { @Override public void cycle() { + if(this.room.isAllowBotsWalk() && this.unit.canWalk()) { + if (!this.isWalking()) { + if (this.getWalkTimeOut() < Emulator.getIntUnixTimestamp() && this.unit.getFollowingHabboId() == 0) { + this.walkTo(Emulator.getConfig().getBoolean("hotel.bot.limit.walking.distance", true) ? this.getRoom().getLayout().getRandomWalkableTilesAround(this, this.currentPosition, 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()); + } + } + } + + boolean hasChatLines = !this.unit.getChatLines().isEmpty(); + boolean hasAutoChatEnabled = this.unit.isChatAuto(); + boolean chatTimeOutPassed = Emulator.getIntUnixTimestamp() >= this.unit.getChatTimeOut(); + + if (hasChatLines && chatTimeOutPassed && hasAutoChatEnabled) { + if(this.unit.isChatRandom()) { + this.unit.setLastChatIndex((short) Emulator.getRandom().nextInt(this.unit.getChatLines().size())); + } else if(this.unit.getLastChatIndex() == this.unit.getChatLines().size() - 1) { + this.unit.resetLastChatIndex(); + } else { + this.unit.incrementLastChatIndex(); + } + + if (this.unit.getLastChatIndex() >= this.unit.getChatLines().size()) { + this.unit.resetLastChatIndex(); + } + + String message = this.unit.getChatLines().get(this.unit.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%"), this.unit.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 })) { + this.talk(message); + } + + this.unit.setChatTimeOut(Emulator.getIntUnixTimestamp() + this.unit.getChatDelay()); + } + super.cycle(); } + public void talk(String message) { + if (Emulator.getPluginManager().isRegistered(BotTalkEvent.class, false)) { + Event event = new BotTalkEvent(this.unit, message); + Emulator.getPluginManager().fireEvent(event); + + if (event.isCancelled()) + return; + } + + this.unit.setChatTimestamp(Emulator.getIntUnixTimestamp()); + this.room.botChat(new ChatMessageComposer(new RoomChatMessage(message, this, RoomChatMessageBubbles.getBubble(this.unit.getBubbleId()))).compose()); + + if (message.equals("o/") || message.equals("_o/")) { + this.room.sendComposer(new ExpressionMessageComposer(this, RoomUserAction.WAVE).compose()); + } + } + public RoomUnitType getRoomUnitType() { return RoomUnitType.BOT; } 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 2b59408f..9e0f13c0 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 @@ -2,7 +2,6 @@ package com.eu.habbo.habbohotel.rooms.entities.units.types; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.RideablePet; -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; @@ -19,13 +18,15 @@ public class RoomPet extends RoomUnit { @Override public void cycle() { - super.cycle(); + if (!this.handleRider()) { + super.cycle(); + } } - public boolean handleRider(Pet pet, Room room) { + public boolean handleRider() { Habbo rider = null; - if (pet instanceof RideablePet rideablePet) { + if (this.unit instanceof RideablePet rideablePet) { rider = rideablePet.getRider(); } @@ -38,7 +39,7 @@ public class RoomPet extends RoomUnit { this.removeStatus(RoomUnitStatus.MOVE); } - if (!this.getCurrentPosition().equals(rider.getRoomUnit().getCurrentPosition())) { + if (!this.currentPosition.equals(rider.getRoomUnit().getCurrentPosition())) { this.addStatus(RoomUnitStatus.MOVE, rider.getRoomUnit().getCurrentPosition().getX() + "," + rider.getRoomUnit().getCurrentPosition().getY() + "," + (rider.getRoomUnit().getCurrentPosition().getStackHeight())); this.setCurrentPosition(rider.getRoomUnit().getCurrentPosition()); this.setCurrentZ(rider.getRoomUnit().getCurrentPosition().getStackHeight()); diff --git a/src/main/java/com/eu/habbo/habbohotel/units/type/Avatar.java b/src/main/java/com/eu/habbo/habbohotel/units/type/Avatar.java new file mode 100644 index 00000000..becf31e0 --- /dev/null +++ b/src/main/java/com/eu/habbo/habbohotel/units/type/Avatar.java @@ -0,0 +1,10 @@ +package com.eu.habbo.habbohotel.units.type; + +import com.eu.habbo.habbohotel.units.Unit; +import com.eu.habbo.messages.ISerialize; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public abstract class Avatar extends Unit implements ISerialize {} 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 2b0bd2e2..74fe2c3b 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/Habbo.java @@ -5,6 +5,7 @@ import com.eu.habbo.habbohotel.achievements.AchievementManager; import com.eu.habbo.habbohotel.bots.Bot; import com.eu.habbo.habbohotel.catalog.ClothItem; import com.eu.habbo.habbohotel.gameclients.GameClient; +import com.eu.habbo.habbohotel.guilds.Guild; import com.eu.habbo.habbohotel.messenger.Messenger; import com.eu.habbo.habbohotel.permissions.Permission; import com.eu.habbo.habbohotel.pets.Pet; @@ -14,8 +15,9 @@ import com.eu.habbo.habbohotel.rooms.RoomChatMessageBubbles; import com.eu.habbo.habbohotel.rooms.RoomUserAction; import com.eu.habbo.habbohotel.rooms.entities.items.RoomItem; import com.eu.habbo.habbohotel.rooms.entities.units.types.RoomHabbo; -import com.eu.habbo.habbohotel.units.Unit; +import com.eu.habbo.habbohotel.units.type.Avatar; import com.eu.habbo.habbohotel.users.inventory.BadgesComponent; +import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.outgoing.generic.alerts.*; import com.eu.habbo.messages.outgoing.inventory.*; import com.eu.habbo.messages.outgoing.rooms.FloodControlMessageComposer; @@ -40,7 +42,7 @@ import java.util.*; import java.util.stream.Collectors; @Slf4j -public class Habbo extends Unit implements Runnable { +public class Habbo extends Avatar implements Runnable { @Getter private RoomHabbo roomUnit; @Getter @@ -345,7 +347,7 @@ public class Habbo extends Unit implements Runnable { public void deleteBot(Bot bot) { this.removeBot(bot); - bot.getRoom().getRoomUnitManager().removeBot(bot); + bot.getRoomUnit().getRoom().getRoomUnitManager().removeBot(bot); Emulator.getGameEnvironment().getBotManager().deleteBot(bot); } @@ -467,4 +469,34 @@ public class Habbo extends Unit implements Runnable { .flatMap(c -> Arrays.stream(c).boxed()) .collect(Collectors.toSet()); } + + @Override + public void serialize(ServerMessage message) { + message.appendInt(this.habboInfo.getId()); + message.appendString(this.habboInfo.getUsername()); + message.appendString(this.habboInfo.getMotto()); + message.appendString(this.habboInfo.getLook()); + message.appendInt(this.roomUnit.getVirtualId()); + message.appendInt(this.roomUnit.getCurrentPosition().getX()); + message.appendInt(this.roomUnit.getCurrentPosition().getY()); + message.appendString(String.valueOf(this.roomUnit.getCurrentZ())); + message.appendInt(this.roomUnit.getBodyRotation().getValue()); + message.appendInt(1); + message.appendString(this.habboInfo.getGender().name().toUpperCase()); + message.appendInt(this.habboStats.getGuild() != 0 ? this.habboStats.getGuild() : -1); + message.appendInt(this.habboStats.getGuild() != 0 ? 1 : -1); + + String name = ""; + if (this.habboStats.getGuild() != 0) { + Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(this.habboStats.getGuild()); + + if (g != null) + name = g.getName(); + } + message.appendString(name); + + message.appendString(""); + message.appendInt(this.habboStats.getAchievementScore()); + message.appendBoolean(true); + } } diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java index e97a3f5e..81e07d5a 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/BotsComponent.java @@ -25,7 +25,7 @@ public class BotsComponent { private void loadBots(Habbo habbo) { synchronized (this.bots) { - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots INNER JOIN users ON users.id = bots.user_id WHERE user_id = ? AND room_id = 0 ORDER BY id ASC")) { + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT users.username AS owner_name, bots.* FROM bots INNER JOIN users ON users.id = bots.owner_id WHERE owner_id = ? AND room_id = 0 ORDER BY id ASC")) { statement.setInt(1, habbo.getHabboInfo().getId()); try (ResultSet set = statement.executeQuery()) { while (set.next()) { @@ -60,7 +60,7 @@ public class BotsComponent { public void dispose() { synchronized (this.bots) { for (Map.Entry map : this.bots.entrySet()) { - if (map.getValue().needsUpdate()) { + if (map.getValue().isSqlUpdateNeeded()) { Emulator.getThreading().run(map.getValue()); } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteRoomEvent.java b/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteRoomEvent.java index 7c790233..25cf6167 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteRoomEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/navigator/DeleteRoomEvent.java @@ -2,7 +2,6 @@ package com.eu.habbo.messages.incoming.navigator; import com.eu.habbo.Emulator; import com.eu.habbo.habbohotel.bots.Bot; -import com.eu.habbo.habbohotel.guilds.Guild; import com.eu.habbo.habbohotel.modtool.ScripterManager; import com.eu.habbo.habbohotel.pets.Pet; import com.eu.habbo.habbohotel.pets.RideablePet; @@ -29,92 +28,82 @@ public class DeleteRoomEvent extends MessageHandler { Room room = Emulator.getGameEnvironment().getRoomManager().getActiveRoomById(roomId); - if (room != null) { - if (room.getRoomInfo().isRoomOwner(this.client.getHabbo())) { - if (room.getRoomInfo().getId() == this.client.getHabbo().getHabboInfo().getHomeRoom()) { - return; + if(room == null) { + return; + } + + if(!room.getRoomInfo().isRoomOwner(this.client.getHabbo())) { + String message = Emulator.getTexts().getValue("scripter.warning.room.delete").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%roomname%", room.getRoomInfo().getName()).replace("%roomowner%", room.getRoomInfo().getOwnerInfo().getUsername()); + ScripterManager.scripterDetected(this.client, message); + log.info(message); + return; + } + + if (room.getRoomInfo().getId() == this.client.getHabbo().getHabboInfo().getHomeRoom()) { + return; + } + + if (Emulator.getPluginManager().fireEvent(new NavigatorRoomDeletedEvent(this.client.getHabbo(), room)).isCancelled()) { + return; + } + + room.getRoomItemManager().ejectAllFurni(); + room.getRoomItemManager().ejectUserFurni(room.getRoomInfo().getOwnerInfo().getId()); + + List bots = new ArrayList<>(room.getRoomUnitManager().getCurrentBots().values()); + for (Bot bot : bots) { + Emulator.getGameEnvironment().getBotManager().pickUpBot(bot, null, room); + } + + List pets = new ArrayList<>(room.getRoomUnitManager().getCurrentPets().values()); + for (Pet pet : pets) { + if (pet instanceof RideablePet rideablePet) { + if (rideablePet.getRider() != null) { + rideablePet.getRider().getRoomUnit().dismountPet(true); } - - if (Emulator.getPluginManager().fireEvent(new NavigatorRoomDeletedEvent(this.client.getHabbo(), room)).isCancelled()) { - return; - } - - room.getRoomItemManager().ejectAllFurni(); - room.getRoomItemManager().ejectUserFurni(room.getRoomInfo().getOwnerInfo().getId()); - - List bots = new ArrayList<>(room.getRoomUnitManager().getCurrentBots().values()); - for (Bot bot : bots) { - Emulator.getGameEnvironment().getBotManager().pickUpBot(bot, null, room); - } - - List pets = new ArrayList<>(room.getRoomUnitManager().getCurrentPets().values()); - for (Pet pet : pets) { - if (pet instanceof RideablePet rideablePet) { - if (rideablePet.getRider() != null) { - rideablePet.getRider().getRoomUnit().dismountPet(true); - } - } - - pet.removeFromRoom(); - Emulator.getThreading().run(pet); - - Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(pet.getUserId()); - - if (owner != null) { - owner.getClient().sendResponse(new PetAddedToInventoryComposer(pet)); - owner.getInventory().getPetsComponent().addPet(pet); - } - } - - if (room.getRoomInfo().getGuild().getId() > 0) { - Guild guild = Emulator.getGameEnvironment().getGuildManager().getGuild(room.getRoomInfo().getGuild().getId()); - - if (guild != null) { - Emulator.getGameEnvironment().getGuildManager().deleteGuild(guild); - } - } - - room.preventUnloading = false; - room.dispose(); - Emulator.getGameEnvironment().getRoomManager().uncacheRoom(room); - - try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) { - try (PreparedStatement statement = connection.prepareStatement("DELETE FROM rooms WHERE id = ? LIMIT 1")) { - statement.setInt(1, roomId); - statement.execute(); - } - - if (room.getRoomInfo().isModelOverridden()) { - try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM room_models_custom WHERE id = ? LIMIT 1")) { - stmt.setInt(1, roomId); - stmt.execute(); - } - } - - room.dispose(); - - try (PreparedStatement rights = connection.prepareStatement("DELETE FROM room_rights WHERE room_id = ?")) { - rights.setInt(1, roomId); - rights.execute(); - } - - try (PreparedStatement votes = connection.prepareStatement("DELETE FROM room_votes WHERE room_id = ?")) { - votes.setInt(1, roomId); - votes.execute(); - } - - try (PreparedStatement filter = connection.prepareStatement("DELETE FROM room_wordfilter WHERE room_id = ?")) { - filter.setInt(1, roomId); - filter.execute(); - } - } catch (SQLException e) { - log.error("Caught SQL exception", e); - } - } else { - String message = Emulator.getTexts().getValue("scripter.warning.room.delete").replace("%username%", this.client.getHabbo().getHabboInfo().getUsername()).replace("%roomname%", room.getRoomInfo().getName()).replace("%roomowner%", room.getRoomInfo().getOwnerInfo().getUsername()); - ScripterManager.scripterDetected(this.client, message); - log.info(message); } + + pet.removeFromRoom(); + Emulator.getThreading().run(pet); + + Habbo owner = Emulator.getGameEnvironment().getHabboManager().getHabbo(pet.getUserId()); + + if (owner != null) { + owner.getClient().sendResponse(new PetAddedToInventoryComposer(pet)); + owner.getInventory().getPetsComponent().addPet(pet); + } + } + + if (room.getRoomInfo().hasGuild()) { + Emulator.getGameEnvironment().getGuildManager().deleteGuild(room.getRoomInfo().getGuild()); + } + + room.preventUnloading = false; + + room.getRoomRightsManager().removeAllRights(); + room.getRoomWordFilterManager().removeAllWords(); + room.dispose(); + Emulator.getGameEnvironment().getRoomManager().uncacheRoom(room); + + try (Connection connection = Emulator.getDatabase().getDataSource().getConnection()) { + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM rooms WHERE id = ? LIMIT 1")) { + statement.setInt(1, roomId); + statement.execute(); + } + + if (room.getRoomInfo().isModelOverridden()) { + try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM room_models_custom WHERE id = ? LIMIT 1")) { + stmt.setInt(1, roomId); + stmt.execute(); + } + } + + try (PreparedStatement votes = connection.prepareStatement("DELETE FROM room_votes WHERE room_id = ?")) { + votes.setInt(1, roomId); + votes.execute(); + } + } catch (SQLException e) { + log.error("Caught SQL exception", e); } } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/CommandBotEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/CommandBotEvent.java index ab11a546..657a96ad 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/CommandBotEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/CommandBotEvent.java @@ -26,13 +26,14 @@ public class CommandBotEvent extends MessageHandler { if (room == null) return; - if (room.getRoomInfo().getOwnerInfo().getId() == this.client.getHabbo().getHabboInfo().getId() || this.client.getHabbo().hasPermissionRight(Permission.ACC_ANYROOMOWNER)) { + if (room.getRoomInfo().isRoomOwner(this.client.getHabbo()) || this.client.getHabbo().hasPermissionRight(Permission.ACC_ANYROOMOWNER)) { int botId = this.packet.readInt(); Bot bot = room.getRoomUnitManager().getRoomBotById(Math.abs(botId)); - if (bot == null) + if (bot == null) { return; + } int settingId = this.packet.readInt(); @@ -45,10 +46,11 @@ public class CommandBotEvent extends MessageHandler { Emulator.getPluginManager().fireEvent(lookEvent); if (lookEvent.isCancelled()) break; + bot.setFigure(lookEvent.getNewLook()); bot.setGender(lookEvent.getGender()); bot.setEffect(lookEvent.getEffect(), -1); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); } case 2 -> { String messageString = this.packet.readString(); @@ -102,16 +104,16 @@ public class CommandBotEvent extends MessageHandler { bot.setChatDelay((short) chatEvent.getChatDelay()); bot.clearChat(); bot.addChatLines(chat); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); } case 3 -> { bot.setCanWalk(!bot.canWalk()); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); } case 4 -> { bot.getRoomUnit().setDanceType(DanceType.values()[(bot.getRoomUnit().getDanceType().getType() + 1) % DanceType.values().length]); room.sendComposer(new DanceMessageComposer(bot.getRoomUnit()).compose()); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); } case 5 -> { String name = this.packet.readString(); @@ -128,7 +130,7 @@ public class CommandBotEvent extends MessageHandler { break; bot.setName(nameEvent.getName()); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); room.sendComposer(new UserNameChangedMessageComposer(bot.getRoomUnit().getVirtualId(), bot.getRoomUnit().getVirtualId(), nameEvent.getName()).compose()); } } @@ -140,12 +142,12 @@ public class CommandBotEvent extends MessageHandler { String motto = this.packet.readString(); if (motto.length() > Emulator.getConfig().getInt("motto.max_length", 38)) break; bot.setMotto(motto); - bot.needsUpdate(true); + bot.setSqlUpdateNeeded(true); room.sendComposer(new RoomUsersComposer(bot).compose()); } } - if (bot.needsUpdate()) { + if (bot.isSqlUpdateNeeded()) { Emulator.getThreading().run(bot); } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/RemoveBotFromFlatEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/RemoveBotFromFlatEvent.java index 9a351609..d55a372a 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/RemoveBotFromFlatEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/bots/RemoveBotFromFlatEvent.java @@ -1,6 +1,6 @@ package com.eu.habbo.messages.incoming.rooms.bots; -import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.bots.Bot; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.messages.incoming.MessageHandler; @@ -11,9 +11,18 @@ public class RemoveBotFromFlatEvent extends MessageHandler { public void handle() { Room room = this.client.getHabbo().getRoomUnit().getRoom(); - if (room == null) + if (room == null) { return; + } - Emulator.getGameEnvironment().getBotManager().pickUpBot(this.packet.readInt(), this.client.getHabbo(), room); + int botId = this.packet.readInt(); + + Bot bot = room.getRoomUnitManager().getRoomBotById(Math.abs(botId)); + + if(bot == null) { + return; + } + + room.getRoomUnitManager().pickUpBot(bot, this.client.getHabbo()); } } diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java index c491cb35..4a1be99d 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/RoomUsersComposer.java @@ -1,153 +1,36 @@ package com.eu.habbo.messages.outgoing.rooms.users; -import com.eu.habbo.Emulator; -import com.eu.habbo.habbohotel.bots.Bot; -import com.eu.habbo.habbohotel.guilds.Guild; -import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.habbohotel.units.type.Avatar; import com.eu.habbo.messages.ServerMessage; import com.eu.habbo.messages.outgoing.MessageComposer; import com.eu.habbo.messages.outgoing.Outgoing; import java.util.Collection; +import java.util.List; public class RoomUsersComposer extends MessageComposer { - private Habbo habbo; - private Collection habbos; - private Bot bot; - private Collection bots; + private final Collection avatars; - public RoomUsersComposer(Habbo habbo) { - this.habbo = habbo; + public RoomUsersComposer(Avatar avatar) { + this.avatars = List.of(avatar); } - public RoomUsersComposer(Collection habbos) { - this.habbos = habbos; - } - - public RoomUsersComposer(Bot bot) { - this.bot = bot; - } - - public RoomUsersComposer(Collection bots, boolean isBot) { - this.bots = bots; + public RoomUsersComposer(Collection avatars) { + this.avatars = avatars; } @Override protected ServerMessage composeInternal() { this.response.init(Outgoing.usersComposer); - if (this.habbo != null) { - this.response.appendInt(1); - this.response.appendInt(this.habbo.getHabboInfo().getId()); - this.response.appendString(this.habbo.getHabboInfo().getUsername()); - this.response.appendString(this.habbo.getHabboInfo().getMotto()); - this.response.appendString(this.habbo.getHabboInfo().getLook()); - this.response.appendInt(this.habbo.getRoomUnit().getVirtualId()); //Room Unit ID - this.response.appendInt(this.habbo.getRoomUnit().getCurrentPosition().getX()); - this.response.appendInt(this.habbo.getRoomUnit().getCurrentPosition().getY()); - this.response.appendString(this.habbo.getRoomUnit().getCurrentZ() + ""); - this.response.appendInt(this.habbo.getRoomUnit().getBodyRotation().getValue()); - this.response.appendInt(1); - this.response.appendString(this.habbo.getHabboInfo().getGender().name().toUpperCase()); - this.response.appendInt(this.habbo.getHabboStats().getGuild() != 0 ? this.habbo.getHabboStats().getGuild() : -1); - this.response.appendInt(this.habbo.getHabboStats().getGuild() != 0 ? 1 : -1); - - String name = ""; - if (this.habbo.getHabboStats().getGuild() != 0) { - Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(this.habbo.getHabboStats().getGuild()); - - if (g != null) - name = g.getName(); - } - this.response.appendString(name); - - this.response.appendString(""); - this.response.appendInt(this.habbo.getHabboStats().getAchievementScore()); - this.response.appendBoolean(true); - } else if (this.habbos != null) { - this.response.appendInt(this.habbos.size()); - for (Habbo habbo : this.habbos) { - if (habbo != null) { - this.response.appendInt(habbo.getHabboInfo().getId()); - this.response.appendString(habbo.getHabboInfo().getUsername()); - this.response.appendString(habbo.getHabboInfo().getMotto()); - this.response.appendString(habbo.getHabboInfo().getLook()); - this.response.appendInt(habbo.getRoomUnit().getVirtualId()); //Room Unit ID - this.response.appendInt(habbo.getRoomUnit().getCurrentPosition().getX()); - this.response.appendInt(habbo.getRoomUnit().getCurrentPosition().getY()); - this.response.appendString(habbo.getRoomUnit().getCurrentZ() + ""); - this.response.appendInt(habbo.getRoomUnit().getBodyRotation().getValue()); - this.response.appendInt(1); - this.response.appendString(habbo.getHabboInfo().getGender().name().toUpperCase()); - this.response.appendInt(habbo.getHabboStats().getGuild() != 0 ? habbo.getHabboStats().getGuild() : -1); - this.response.appendInt(habbo.getHabboStats().getGuild() != 0 ? habbo.getHabboStats().getGuild() : -1); - String name = ""; - if (habbo.getHabboStats().getGuild() != 0) { - Guild g = Emulator.getGameEnvironment().getGuildManager().getGuild(habbo.getHabboStats().getGuild()); - - if (g != null) - name = g.getName(); - } - this.response.appendString(name); - this.response.appendString(""); - this.response.appendInt(habbo.getHabboStats().getAchievementScore()); - this.response.appendBoolean(true); + if (this.avatars != null) { + this.response.appendInt(this.avatars.size()); + for (Avatar avatar : this.avatars) { + if (avatar != null) { + avatar.serialize(this.response); } } - } else if (this.bot != null) { - this.response.appendInt(1); - this.response.appendInt(-this.bot.getId()); - this.response.appendString(this.bot.getName()); - this.response.appendString(this.bot.getMotto()); - this.response.appendString(this.bot.getFigure()); - this.response.appendInt(this.bot.getRoomUnit().getVirtualId()); - this.response.appendInt(this.bot.getRoomUnit().getCurrentPosition().getX()); - this.response.appendInt(this.bot.getRoomUnit().getCurrentPosition().getY()); - this.response.appendString(this.bot.getRoomUnit().getCurrentZ() + ""); - this.response.appendInt(this.bot.getRoomUnit().getBodyRotation().getValue()); - this.response.appendInt(4); - this.response.appendString(this.bot.getGender().name().toUpperCase()); - this.response.appendInt(this.bot.getOwnerId()); - this.response.appendString(this.bot.getOwnerName()); - this.response.appendInt(10); - this.response.appendShort(0); - this.response.appendShort(1); - this.response.appendShort(2); - this.response.appendShort(3); - this.response.appendShort(4); - this.response.appendShort(5); - this.response.appendShort(6); - this.response.appendShort(7); - this.response.appendShort(8); - this.response.appendShort(9); - } else if (this.bots != null) { - this.response.appendInt(this.bots.size()); - for (Bot bot : this.bots) { - this.response.appendInt(-bot.getId()); - this.response.appendString(bot.getName()); - this.response.appendString(bot.getMotto()); - this.response.appendString(bot.getFigure()); - this.response.appendInt(bot.getRoomUnit().getVirtualId()); - this.response.appendInt(bot.getRoomUnit().getCurrentPosition().getX()); - this.response.appendInt(bot.getRoomUnit().getCurrentPosition().getY()); - this.response.appendString(bot.getRoomUnit().getCurrentZ() + ""); - this.response.appendInt(bot.getRoomUnit().getBodyRotation().getValue()); - this.response.appendInt(4); - this.response.appendString(bot.getGender().name().toUpperCase()); - this.response.appendInt(bot.getOwnerId()); - this.response.appendString(bot.getOwnerName()); - this.response.appendInt(10); - this.response.appendShort(0); - this.response.appendShort(1); - this.response.appendShort(2); - this.response.appendShort(3); - this.response.appendShort(4); - this.response.appendShort(5); - this.response.appendShort(6); - this.response.appendShort(7); - this.response.appendShort(8); - this.response.appendShort(9); - } } + return this.response; } -} +} \ No newline at end of file diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserRemoveMessageComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserRemoveMessageComposer.java index deab7c0f..b846b460 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserRemoveMessageComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/users/UserRemoveMessageComposer.java @@ -13,7 +13,7 @@ public class UserRemoveMessageComposer extends MessageComposer { @Override protected ServerMessage composeInternal() { this.response.init(Outgoing.userRemoveMessageComposer); - this.response.appendString(this.roomUnit.getVirtualId() + ""); + this.response.appendString(String.valueOf(this.roomUnit.getVirtualId())); return this.response; } } 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 2ae7a6f2..4cf9b23c 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java +++ b/src/main/java/com/eu/habbo/threading/runnables/RoomUnitTeleport.java @@ -54,8 +54,8 @@ public class RoomUnitTeleport implements Runnable { this.roomUnit.setStatusUpdateNeeded(true); roomUnit.setWiredTeleporting(false); - this.room.updateHabbosAt(newLocation); - this.room.updateBotsAt(newLocation.getX(), newLocation.getY()); + this.room.getRoomUnitManager().updateHabbosAt(newLocation); + this.room.getRoomUnitManager().updateBotsAt(newLocation); topItem = room.getRoomItemManager().getTopItemAt(x, y); if (topItem != null && roomUnit.getCurrentPosition().equals(room.getLayout().getTile((short) x, (short) y))) {