From 1791365e0f44531f0b5140dd7b726eee7f61489d Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 16 Jun 2024 16:06:29 +0200 Subject: [PATCH] Fix able to get package from Cash shop surprise Packages aren't real items and crash the client. --- src/main/java/constants/id/ItemId.java | 4 ++ src/main/java/server/CashShop.java | 45 ++++++++-------------- src/test/java/constants/id/ItemIdTest.java | 19 +++++++++ 3 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 src/test/java/constants/id/ItemIdTest.java diff --git a/src/main/java/constants/id/ItemId.java b/src/main/java/constants/id/ItemId.java index 2624966f0b..dda0323a2f 100644 --- a/src/main/java/constants/id/ItemId.java +++ b/src/main/java/constants/id/ItemId.java @@ -312,6 +312,10 @@ public class ItemId { return itemId == NX_CARD_100 || itemId == NX_CARD_250; } + public static boolean isCashPackage(int itemId) { + return itemId / 10000 == 910; + } + // Face expression private static final int FACE_EXPRESSION_MIN = 5160000; private static final int FACE_EXPRESSION_MAX = 5160014; diff --git a/src/main/java/server/CashShop.java b/src/main/java/server/CashShop.java index 498fe12fdc..6801764fe1 100644 --- a/src/main/java/server/CashShop.java +++ b/src/main/java/server/CashShop.java @@ -49,6 +49,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -231,7 +232,6 @@ public class CashShop { public static class CashItemFactory { private static volatile Map items = new HashMap<>(); - private static volatile List randomitemsns = new ArrayList<>(); private static volatile Map> packages = new HashMap<>(); private static volatile List specialcashitems = new ArrayList<>(); @@ -239,7 +239,6 @@ public class CashShop { DataProvider etc = DataProviderFactory.getDataProvider(WZFiles.ETC); Map loadedItems = new HashMap<>(); - List onSaleItems = new ArrayList<>(); for (Data item : etc.getData("Commodity.img").getChildren()) { int sn = DataTool.getIntConvert("SN", item); int itemId = DataTool.getIntConvert("ItemId", item); @@ -248,13 +247,8 @@ public class CashShop { short count = (short) DataTool.getIntConvert("Count", item, 1); boolean onSale = DataTool.getIntConvert("OnSale", item, 0) == 1; loadedItems.put(sn, new CashItem(sn, itemId, price, period, count, onSale)); - - if (onSale) { - onSaleItems.add(sn); - } } CashItemFactory.items = loadedItems; - CashItemFactory.randomitemsns = onSaleItems; Map> loadedPackages = new HashMap<>(); for (Data cashPackage : etc.getData("CashPackage.img").getChildren()) { @@ -281,13 +275,20 @@ public class CashShop { CashItemFactory.specialcashitems = loadedSpecialItems; } - public static CashItem getRandomCashItem() { - if (randomitemsns.isEmpty()) { - return null; + public static Optional getRandomCashItem() { + if (items.isEmpty()) { + return Optional.empty(); } - int rnd = (int) (Math.random() * randomitemsns.size()); - return items.get(randomitemsns.get(rnd)); + List itemPool = items.values().stream() + .filter(CashItem::isOnSale) + .filter(cashItem -> !ItemId.isCashPackage(cashItem.itemId)) + .toList(); + return Optional.of(getRandomItem(itemPool)); + } + + private static CashItem getRandomItem(List items) { + return items.get(new Random().nextInt(items.size())); } public static CashItem getItem(int sn) { @@ -311,20 +312,6 @@ public class CashShop { public static List getSpecialCashItems() { return specialcashitems; } - - public static void reloadSpecialCashItems() {//Yay? - List loadedSpecialItems = new ArrayList<>(); - try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT * FROM specialcashitems"); - ResultSet rs = ps.executeQuery()) { - while (rs.next()) { - loadedSpecialItems.add(new SpecialCashItem(rs.getInt("sn"), rs.getInt("modifier"), rs.getByte("info"))); - } - } catch (SQLException ex) { - ex.printStackTrace(); - } - CashItemFactory.specialcashitems = loadedSpecialItems; - } } public record CashShopSurpriseResult(Item usedCashShopSurprise, Item reward) { @@ -545,8 +532,8 @@ public class CashShop { return Optional.empty(); } - CashItem cashItemReward = CashItemFactory.getRandomCashItem(); - if (cashItemReward == null) { + Optional cashItemReward = CashItemFactory.getRandomCashItem(); + if (cashItemReward.isEmpty()) { return Optional.empty(); } @@ -556,7 +543,7 @@ public class CashShop { removeFromInventory(cashShopSurprise); } - Item itemReward = cashItemReward.toItem(); + Item itemReward = cashItemReward.get().toItem(); addToInventory(itemReward); return Optional.of(new CashShopSurpriseResult(cashShopSurprise, itemReward)); diff --git a/src/test/java/constants/id/ItemIdTest.java b/src/test/java/constants/id/ItemIdTest.java new file mode 100644 index 0000000000..988eebacea --- /dev/null +++ b/src/test/java/constants/id/ItemIdTest.java @@ -0,0 +1,19 @@ +package constants.id; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ItemIdTest { + + @Test + void isCashPackage() { + assertTrue(ItemId.isCashPackage(9102237)); + } + + @Test + void isNotCashPackage() { + assertFalse(ItemId.isCashPackage(4000000)); + } +}