From b408d59b05c2c3cf4eb3fdce7e8bbc9216bd4259 Mon Sep 17 00:00:00 2001 From: Alejandro <25-alejandro@users.noreply.git.krews.org> Date: Sat, 18 May 2019 13:38:30 +0300 Subject: [PATCH] Fix placing furni from gifts to a room. Closes #55 --- .../catalog/marketplace/MarketPlace.java | 7 ++- .../eu/habbo/habbohotel/users/HabboItem.java | 15 ++++++ .../users/inventory/ItemsComponent.java | 2 +- .../catalog/recycler/RecycleEvent.java | 2 +- .../crafting/CraftingCraftItemEvent.java | 2 +- .../crafting/CraftingCraftSecretEvent.java | 2 +- .../rooms/items/PostItPlaceEvent.java | 3 +- .../rooms/items/RoomPlaceItemEvent.java | 8 +-- .../inventory/InventoryItemsComposer.java | 2 +- .../InventoryUpdateItemComposer.java | 5 +- .../items/PresentItemOpenedComposer.java | 4 +- .../habbo/threading/runnables/OpenGift.java | 51 +++++++++++++++++-- 12 files changed, 81 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java index 645c261c..92a79c4d 100644 --- a/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java +++ b/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java @@ -414,11 +414,14 @@ public class MarketPlace RequestOffersEvent.cachedResults.clear(); try { + client.sendResponse(new RemoveHabboItemComposer(event.item.getGiftAdjustedId())); + client.sendResponse(new InventoryRefreshComposer()); + + event.item.setFromGift(false); + MarketPlaceOffer offer = new MarketPlaceOffer(event.item, event.price, client.getHabbo()); client.getHabbo().getInventory().addMarketplaceOffer(offer); client.getHabbo().getInventory().getItemsComponent().removeHabboItem(event.item); - client.sendResponse(new RemoveHabboItemComposer(event.item.getId())); - client.sendResponse(new InventoryRefreshComposer()); item.setUserId(-1); item.needsUpdate(true); Emulator.getThreading().run(item); diff --git a/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java b/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java index 68aa8ba2..e3c3e9ed 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java @@ -43,6 +43,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers private int limitedSells; private boolean needsUpdate = false; private boolean needsDelete = false; + private boolean isFromGift = false; public HabboItem(ResultSet set, Item baseItem) throws SQLException { @@ -131,6 +132,12 @@ public abstract class HabboItem implements Runnable, IEventTriggers return this.id; } + public int getGiftAdjustedId() { + if (this.isFromGift) return -this.id; + + return this.id; + } + public int getUserId() { return this.userId; @@ -508,4 +515,12 @@ public abstract class HabboItem implements Runnable, IEventTriggers { return true; } + + public boolean isFromGift() { + return isFromGift; + } + + public void setFromGift(boolean fromGift) { + isFromGift = fromGift; + } } diff --git a/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java b/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java index f38e543c..d83efed7 100644 --- a/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java +++ b/src/main/java/com/eu/habbo/habbohotel/users/inventory/ItemsComponent.java @@ -117,7 +117,7 @@ public class ItemsComponent public HabboItem getHabboItem(int itemId) { - return this.items.get(itemId); + return this.items.get(Math.abs(itemId)); } public HabboItem getAndRemoveHabboItem(final Item item) diff --git a/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java index 3ca79b8e..59cf6391 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/catalog/recycler/RecycleEvent.java @@ -50,7 +50,7 @@ public class RecycleEvent extends MessageHandler for (HabboItem item : items) { this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); - this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + this.client.sendResponse(new RemoveHabboItemComposer(item.getGiftAdjustedId())); Emulator.getThreading().run(new QueryDeleteHabboItem(item.getId())); } } diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java index 9c900a5c..eb0bc703 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftItemEvent.java @@ -74,7 +74,7 @@ public class CraftingCraftItemEvent extends MessageHandler @Override public boolean execute(HabboItem object) { - CraftingCraftItemEvent.this.client.sendResponse(new RemoveHabboItemComposer(object.getId())); + CraftingCraftItemEvent.this.client.sendResponse(new RemoveHabboItemComposer(object.getGiftAdjustedId())); return true; } }); diff --git a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java index 38eaeadb..d3fd19ff 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/crafting/CraftingCraftSecretEvent.java @@ -93,7 +93,7 @@ public class CraftingCraftSecretEvent extends MessageHandler for (HabboItem item : habboItems) { this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); - this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + this.client.sendResponse(new RemoveHabboItemComposer(item.getGiftAdjustedId())); Emulator.getThreading().run(new QueryDeleteHabboItem(item.getId())); } this.client.sendResponse(new InventoryRefreshComposer()); diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java index c2417458..dfbbfd6f 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/PostItPlaceEvent.java @@ -36,7 +36,8 @@ public class PostItPlaceEvent extends MessageHandler item.needsUpdate(true); room.sendComposer(new AddWallItemComposer(item, this.client.getHabbo().getHabboInfo().getUsername()).compose()); this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item); - this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + this.client.sendResponse(new RemoveHabboItemComposer(item.getGiftAdjustedId())); + item.setFromGift(false); Emulator.getThreading().run(item); if (room.getOwnerId() != this.client.getHabbo().getHabboInfo().getId()) diff --git a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java index 2355b093..478a320f 100644 --- a/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java +++ b/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java @@ -23,11 +23,6 @@ public class RoomPlaceItemEvent extends MessageHandler int itemId = -1; if (values.length != 0) itemId = Integer.valueOf(values[0]); - if(itemId < 0) - { - this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, FurnitureMovementError.INVALID_MOVE.errorCode)); - return; - } if(!this.client.getHabbo().getRoomUnit().isInRoom()) { @@ -122,7 +117,8 @@ public class RoomPlaceItemEvent extends MessageHandler } } - this.client.sendResponse(new RemoveHabboItemComposer(item.getId())); + this.client.sendResponse(new RemoveHabboItemComposer(item.getGiftAdjustedId())); this.client.getHabbo().getInventory().getItemsComponent().removeHabboItem(item.getId()); + item.setFromGift(false); } } diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java index 981ae02b..6073a2f3 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryItemsComposer.java @@ -47,7 +47,7 @@ public class InventoryItemsComposer extends MessageComposer implements TIntObjec @Override public boolean execute(int a, HabboItem habboItem) { - this.response.appendInt(habboItem.getId()); + this.response.appendInt(habboItem.getGiftAdjustedId()); this.response.appendString(habboItem.getBaseItem().getType().code); this.response.appendInt(habboItem.getId()); this.response.appendInt(habboItem.getBaseItem().getSpriteId()); diff --git a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java index 7ec74e1e..82567fb2 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/inventory/InventoryUpdateItemComposer.java @@ -19,8 +19,7 @@ public class InventoryUpdateItemComposer extends MessageComposer public ServerMessage compose() { this.response.init(Outgoing.InventoryItemUpdateComposer); - this.response.appendInt(2); - this.response.appendInt(this.habboItem.getId()); + this.response.appendInt(this.habboItem.getGiftAdjustedId()); this.response.appendString(this.habboItem.getBaseItem().getType().code); this.response.appendInt(this.habboItem.getId()); this.response.appendInt(this.habboItem.getBaseItem().getSpriteId()); @@ -55,7 +54,7 @@ public class InventoryUpdateItemComposer extends MessageComposer this.response.appendBoolean(false); this.response.appendInt(-1); - if (this.habboItem.getBaseItem().getType() != FurnitureType.WALL) { + if (this.habboItem.getBaseItem().getType() == FurnitureType.FLOOR) { this.response.appendString(""); //slotId this.response.appendInt(0); } diff --git a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java index 3f072ae7..5261a482 100644 --- a/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java +++ b/src/main/java/com/eu/habbo/messages/outgoing/rooms/items/PresentItemOpenedComposer.java @@ -22,11 +22,11 @@ public class PresentItemOpenedComposer extends MessageComposer public ServerMessage compose() { this.response.init(Outgoing.PresentItemOpenedComposer); - this.response.appendString(this.item.getBaseItem().getType().code); + this.response.appendString(this.item.getBaseItem().getType().code.toLowerCase()); this.response.appendInt(this.item.getBaseItem().getSpriteId()); this.response.appendString(this.item.getBaseItem().getName()); this.response.appendInt(this.item.getId()); - this.response.appendString(this.item.getBaseItem().getType().code); + this.response.appendString(this.item.getBaseItem().getType().code.toLowerCase()); this.response.appendBoolean(this.unknown); this.response.appendString(this.text); return this.response; diff --git a/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java b/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java index 40b01146..a9b56aef 100644 --- a/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java +++ b/src/main/java/com/eu/habbo/threading/runnables/OpenGift.java @@ -1,16 +1,25 @@ package com.eu.habbo.threading.runnables; import com.eu.habbo.Emulator; +import com.eu.habbo.habbohotel.items.FurnitureType; import com.eu.habbo.habbohotel.items.interactions.InteractionGift; import com.eu.habbo.habbohotel.rooms.Room; import com.eu.habbo.habbohotel.rooms.RoomTile; import com.eu.habbo.habbohotel.users.Habbo; import com.eu.habbo.habbohotel.users.HabboItem; import com.eu.habbo.messages.outgoing.inventory.AddHabboItemComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryItemsComposer; import com.eu.habbo.messages.outgoing.inventory.InventoryRefreshComposer; +import com.eu.habbo.messages.outgoing.inventory.InventoryUpdateItemComposer; import com.eu.habbo.messages.outgoing.rooms.items.PresentItemOpenedComposer; import gnu.trove.set.hash.THashSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + public class OpenGift implements Runnable { private final HabboItem item; @@ -42,6 +51,8 @@ public class OpenGift implements Runnable i.run(); } + if (inside != null) inside.setFromGift(true); + this.habbo.getInventory().getItemsComponent().addItems(items); RoomTile tile = this.room.getLayout().getTile(this.item.getX(), this.item.getY()); @@ -49,15 +60,49 @@ public class OpenGift implements Runnable { this.room.updateTile(tile); } - this.habbo.getClient().sendResponse(new AddHabboItemComposer(items)); - this.habbo.getClient().sendResponse(new InventoryRefreshComposer()); - Emulator.getThreading().run(new QueryDeleteHabboItem(this.item.getId())); Emulator.getThreading().run(new RemoveFloorItemTask(this.room, this.item), this.item.getBaseItem().getName().contains("present_wrap") ? 5000 : 0); + this.habbo.getClient().sendResponse(new InventoryRefreshComposer()); + + Map> unseenItems = new HashMap<>(); + + for (HabboItem item : items) { + switch (item.getBaseItem().getType()) { + case WALL: + case FLOOR: + if (!unseenItems.containsKey(AddHabboItemComposer.AddHabboItemCategory.OWNED_FURNI)) unseenItems.put(AddHabboItemComposer.AddHabboItemCategory.OWNED_FURNI, new ArrayList<>()); + + unseenItems.get(AddHabboItemComposer.AddHabboItemCategory.OWNED_FURNI).add(item.getGiftAdjustedId()); + + break; + + case BADGE: + if (!unseenItems.containsKey(AddHabboItemComposer.AddHabboItemCategory.BADGE)) unseenItems.put(AddHabboItemComposer.AddHabboItemCategory.BADGE, new ArrayList<>()); + + unseenItems.get(AddHabboItemComposer.AddHabboItemCategory.BADGE).add(item.getId()); // badges cannot be placed so no need for gift adjusted ID + break; + + case PET: + if (!unseenItems.containsKey(AddHabboItemComposer.AddHabboItemCategory.PET)) unseenItems.put(AddHabboItemComposer.AddHabboItemCategory.PET, new ArrayList<>()); + + unseenItems.get(AddHabboItemComposer.AddHabboItemCategory.PET).add(item.getGiftAdjustedId()); + break; + + case ROBOT: + if (!unseenItems.containsKey(AddHabboItemComposer.AddHabboItemCategory.BOT)) unseenItems.put(AddHabboItemComposer.AddHabboItemCategory.BOT, new ArrayList<>()); + + unseenItems.get(AddHabboItemComposer.AddHabboItemCategory.BOT).add(item.getGiftAdjustedId()); + break; + } + } + + this.habbo.getClient().sendResponse(new AddHabboItemComposer(unseenItems)); + if (inside != null) { + this.habbo.getClient().sendResponse(new InventoryUpdateItemComposer(inside)); this.habbo.getClient().sendResponse(new PresentItemOpenedComposer(inside, "", false)); } }