From 6453c547777ffc87528f7339db53056ba6efb9be Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sun, 3 Dec 2023 04:30:48 -0800 Subject: [PATCH] Implement material exchange --- .../data/excel/ItemComposeExcel.java | 3 +- .../game/inventory/InventoryService.java | 72 ++++++++++++++----- .../packet/recv/HandlerComposeItemCsReq.java | 15 +++- 3 files changed, 67 insertions(+), 23 deletions(-) diff --git a/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java b/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java index 6759cea..b42c292 100644 --- a/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java +++ b/src/main/java/emu/lunarcore/data/excel/ItemComposeExcel.java @@ -15,7 +15,8 @@ public class ItemComposeExcel extends GameResource { private int ItemID; private FormulaType FormulaType; private List MaterialCost; - private int[] SpecialMaterialCost; + private IntOpenHashSet SpecialMaterialCost; + private int SpecialMaterialCostNumber; private int CoinCost; private int WorldLevelRequire; private IntOpenHashSet RelicList; diff --git a/src/main/java/emu/lunarcore/game/inventory/InventoryService.java b/src/main/java/emu/lunarcore/game/inventory/InventoryService.java index 7a3c001..4d5318d 100644 --- a/src/main/java/emu/lunarcore/game/inventory/InventoryService.java +++ b/src/main/java/emu/lunarcore/game/inventory/InventoryService.java @@ -569,34 +569,68 @@ public class InventoryService extends BaseGameService { return returnItems; } - public List composeItem(Player player, int composeId, int count) { + public List composeItem(Player player, int composeId, int count, List costItems) { // Sanity check if (count <= 0) return null; // Get item compose excel data ItemComposeExcel excel = GameData.getItemComposeExcelMap().get(composeId); - if (excel == null || excel.getFormulaType() != FormulaType.Normal) { - return null; - } + if (excel == null) return null; - // Verify items + credits - if (!player.getInventory().verifyItems(excel.getMaterialCost(), count) || !player.getInventory().verifyScoin(excel.getCoinCost() * count)) { - return null; - } - - // Pay items - player.getInventory().removeItemsByParams(excel.getMaterialCost(), count); - player.addSCoin(-excel.getCoinCost() * count); - - // Compose item + // Composed item list List items = new ArrayList<>(); - GameItem item = new GameItem(excel.getItemID(), count); - items.add(item); + + if (excel.getFormulaType() == FormulaType.Normal) { // Material synthesis + // Verify items + credits + if (!player.getInventory().verifyItems(excel.getMaterialCost(), count) || !player.getInventory().verifyScoin(excel.getCoinCost() * count)) { + return null; + } + + // Pay items + player.getInventory().removeItemsByParams(excel.getMaterialCost(), count); + player.addSCoin(-excel.getCoinCost() * count); + + // Create item + items.add(new GameItem(excel.getItemID(), count)); + } else if (excel.getFormulaType() == FormulaType.Sepcial) { // Material exchange + // Verify items + int totalAmount = 0; + + for (ItemParam param : costItems) { + // Make sure param item is in special material cost + if (!excel.getSpecialMaterialCost().contains(param.getId())) { + return null; + } + + // Make sure we have enough + GameItem costItem = player.getInventory().getItemByParam(param); + if (costItem == null) return null; + + // Verify amount + if (costItem.getCount() >= param.getCount()) { + totalAmount += param.getCount(); + } + } + + // Sanity check the amount of materials were exchanging + if (totalAmount != count * excel.getSpecialMaterialCostNumber()) { + return null; + } + + // Pay items + player.getInventory().removeItemsByParams(costItems, count); + + // Create item + items.add(new GameItem(excel.getItemID(), count)); + } // Add items to inventory - player.getInventory().addItems(items); - - return items; + if (items.size() > 0) { + player.getInventory().addItems(items); + return items; + } else { + return null; + } } public List composeRelic(Player player, int composeId, int relicId, int mainAffix, int count) { diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java index e6824dc..a304f36 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerComposeItemCsReq.java @@ -1,9 +1,12 @@ package emu.lunarcore.server.packet.recv; +import java.util.ArrayList; import java.util.List; +import emu.lunarcore.data.common.ItemParam; import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.proto.ComposeItemCsReqOuterClass.ComposeItemCsReq; +import emu.lunarcore.proto.ItemCostOuterClass.ItemCost; import emu.lunarcore.server.game.GameSession; import emu.lunarcore.server.packet.CmdId; import emu.lunarcore.server.packet.Opcodes; @@ -17,10 +20,16 @@ public class HandlerComposeItemCsReq extends PacketHandler { public void handle(GameSession session, byte[] data) throws Exception { var req = ComposeItemCsReq.parseFrom(data); + List costItems = new ArrayList<>(req.getComposeItemList().getItemList().length()); + for (ItemCost cost : req.getComposeItemList().getItemList()) { + costItems.add(new ItemParam(cost)); + } + List returnList = session.getServer().getInventoryService().composeItem( - session.getPlayer(), - req.getComposeId(), - req.getCount() + session.getPlayer(), + req.getComposeId(), + req.getCount(), + costItems ); session.send(new PacketComposeItemScRsp(req.getComposeId(), req.getCount(), returnList));