diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java index 34fccb75..e7952892 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlace.java @@ -279,8 +279,9 @@ public class MarketPlace { return; } + int soldTimestamp = Emulator.getIntUnixTimestamp(); try (PreparedStatement updateOffer = connection.prepareStatement("UPDATE marketplace_items SET state = 2, sold_timestamp = ? WHERE id = ? AND state = 1")) { - updateOffer.setInt(1, Emulator.getIntUnixTimestamp()); + updateOffer.setInt(1, soldTimestamp); updateOffer.setInt(2, offerId); int updated = updateOffer.executeUpdate(); if (updated == 0) { @@ -307,7 +308,11 @@ public class MarketPlace { client.sendResponse(new MarketplaceBuyErrorComposer(MarketplaceBuyErrorComposer.REFRESH, 0, offerId, price)); if (habbo != null) { - habbo.getInventory().getOffer(offerId).setState(MarketPlaceState.SOLD); + MarketPlaceOffer offer = habbo.getInventory().getOffer(offerId); + if (offer != null) { + offer.setState(MarketPlaceState.SOLD); + offer.setSoldTimestamp(soldTimestamp); + } } } } @@ -369,6 +374,11 @@ public class MarketPlace { event.item.setFromGift(false); MarketPlaceOffer offer = new MarketPlaceOffer(event.item, event.price, client.getHabbo()); + if (!offer.isPersisted()) { + LOGGER.warn("Marketplace offer insert failed for user {} item {}", client.getHabbo().getHabboInfo().getId(), event.item.getId()); + return false; + } + client.getHabbo().getInventory().addMarketplaceOffer(offer); client.getHabbo().getInventory().getItemsComponent().removeHabboItem(event.item); item.setUserId(-1); diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java index 37bd2ab1..ccf0dda1 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOffer.java @@ -98,6 +98,10 @@ public class MarketPlaceOffer implements Runnable { return this.offerId; } + public boolean isPersisted() { + return this.offerId > 0; + } + public void setOfferId(int offerId) { this.offerId = offerId; } diff --git a/Emulator/src/test/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOfferContractTest.java b/Emulator/src/test/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOfferContractTest.java new file mode 100644 index 00000000..518f6ee7 --- /dev/null +++ b/Emulator/src/test/java/com/eu/habbo/habbohotel/catalog/marketplace/MarketPlaceOfferContractTest.java @@ -0,0 +1,13 @@ +package com.eu.habbo.habbohotel.catalog.marketplace; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class MarketPlaceOfferContractTest { + + @Test + void exposesPersistenceState() { + assertDoesNotThrow(() -> MarketPlaceOffer.class.getDeclaredMethod("isPersisted")); + } +}