From 66ce7cf6987abf0b1f75b3ccd59192718c950926 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sat, 8 Nov 2025 22:00:06 -0800 Subject: [PATCH] Implement item quick growth --- .../emu/nebula/game/inventory/Inventory.java | 14 ++++--- .../nebula/game/player/PlayerChangeInfo.java | 4 ++ .../handlers/HandlerItemProductReq.java | 6 +-- .../handlers/HandlerItemQuickGrowthReq.java | 40 +++++++++++++++++++ 4 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerItemQuickGrowthReq.java diff --git a/src/main/java/emu/nebula/game/inventory/Inventory.java b/src/main/java/emu/nebula/game/inventory/Inventory.java index 5f69f88..d3fd066 100644 --- a/src/main/java/emu/nebula/game/inventory/Inventory.java +++ b/src/main/java/emu/nebula/game/inventory/Inventory.java @@ -537,11 +537,16 @@ public class Inventory extends PlayerManager implements GameDatabaseObject { // Utility functions - public PlayerChangeInfo produce(int id, int num) { + public PlayerChangeInfo produce(int id, int num, PlayerChangeInfo change) { + // Init change info + if (change == null) { + change = new PlayerChangeInfo(); + } + // Get production data var data = GameData.getProductionDataTable().get(id); if (data == null) { - return null; + return change; } // Get materials @@ -549,12 +554,9 @@ public class Inventory extends PlayerManager implements GameDatabaseObject { // Verify that we have the materials if (!this.verifyItems(materials)) { - return null; + return change; } - // Create change info - var change = new PlayerChangeInfo(); - // Remove items this.removeItems(materials, change); diff --git a/src/main/java/emu/nebula/game/player/PlayerChangeInfo.java b/src/main/java/emu/nebula/game/player/PlayerChangeInfo.java index 2060ba8..9dfc8d7 100644 --- a/src/main/java/emu/nebula/game/player/PlayerChangeInfo.java +++ b/src/main/java/emu/nebula/game/player/PlayerChangeInfo.java @@ -27,6 +27,10 @@ public class PlayerChangeInfo { return this; } + public boolean isEmpty() { + return this.list == null || this.list.isEmpty(); + } + public void add(ProtoMessage proto) { var any = Any.newInstance() .setTypeUrl(GameConstants.PROTO_BASE_TYPE_URL + proto.getClass().getSimpleName()) diff --git a/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java b/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java index dd6cd01..d9c461d 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java @@ -15,14 +15,14 @@ public class HandlerItemProductReq extends NetHandler { var req = ItemProductReq.parseFrom(message); // Produce item - var changes = session.getPlayer().getInventory().produce(req.getId(), req.getNum()); + var change = session.getPlayer().getInventory().produce(req.getId(), req.getNum(), null); - if (changes == null) { + if (change.isEmpty()) { return session.encodeMsg(NetMsgId.item_product_failed_ack); } // Send response - return session.encodeMsg(NetMsgId.item_product_succeed_ack, changes.toProto()); + return session.encodeMsg(NetMsgId.item_product_succeed_ack, change.toProto()); } } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerItemQuickGrowthReq.java b/src/main/java/emu/nebula/server/handlers/HandlerItemQuickGrowthReq.java new file mode 100644 index 0000000..cc62576 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerItemQuickGrowthReq.java @@ -0,0 +1,40 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ItemQuickGrowth.ItemGrowthReq; +import emu.nebula.net.HandlerId; +import emu.nebula.game.player.PlayerChangeInfo; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.item_quick_growth_req) +public class HandlerItemQuickGrowthReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = ItemGrowthReq.parseFrom(message); + + // Init change + var change = new PlayerChangeInfo(); + + // Create items + for (var item : req.getList()) { + if (item.hasProduct()) { + session.getPlayer().getInventory().produce( + item.getProduct().getId(), + item.getProduct().getNum(), + change + ); + } + } + + if (change.isEmpty()) { + return session.encodeMsg(NetMsgId.item_quick_growth_failed_ack); + } + + // Send response + return session.encodeMsg(NetMsgId.item_quick_growth_succeed_ack, change.toProto()); + } + +}