diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 4c4e24f..5b7bb0f 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -31,7 +31,8 @@ public class GameData { @Getter private static DataTable DiscPromoteLimitDataTable = new DataTable<>(); @Getter private static DataTable ItemDataTable = new DataTable<>(); - + @Getter private static DataTable ProductionDataTable = new DataTable<>(); + @Getter private static DataTable MallMonthlyCardDataTable = new DataTable<>(); @Getter private static DataTable MallPackageDataTable = new DataTable<>(); @Getter private static DataTable MallShopDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/CharacterSkillUpgradeDef.java b/src/main/java/emu/nebula/data/resources/CharacterSkillUpgradeDef.java index a9f683e..4eba494 100644 --- a/src/main/java/emu/nebula/data/resources/CharacterSkillUpgradeDef.java +++ b/src/main/java/emu/nebula/data/resources/CharacterSkillUpgradeDef.java @@ -3,13 +3,12 @@ package emu.nebula.data.resources; import emu.nebula.GameConstants; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; -import emu.nebula.data.ResourceType.LoadPriority; import emu.nebula.game.inventory.ItemParamMap; import lombok.Getter; @Getter -@ResourceType(name = "CharacterSkillUpgrade.json", loadPriority = LoadPriority.LOW) +@ResourceType(name = "CharacterSkillUpgrade.json") public class CharacterSkillUpgradeDef extends BaseDef { private int Group; private int AdvanceNum; diff --git a/src/main/java/emu/nebula/data/resources/ProductionDef.java b/src/main/java/emu/nebula/data/resources/ProductionDef.java new file mode 100644 index 0000000..36792a1 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/ProductionDef.java @@ -0,0 +1,34 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import emu.nebula.game.inventory.ItemParamMap; + +import lombok.Getter; + +@Getter +@ResourceType(name = "Production.json") +public class ProductionDef extends BaseDef { + private int Id; + private int UnlockWorldLevel; + private int ProductionId; + private int ProductionPerBatch; + private int RawMaterialId1; + private int RawMaterialCount1; + + private transient ItemParamMap materials; + + @Override + public int getId() { + return Id; + } + + @Override + public void onLoad() { + this.materials = new ItemParamMap(); + + if (this.RawMaterialId1 > 0) { + this.materials.add(this.RawMaterialId1, this.RawMaterialCount1); + } + } +} diff --git a/src/main/java/emu/nebula/game/inventory/Inventory.java b/src/main/java/emu/nebula/game/inventory/Inventory.java index 41a93f8..6907fae 100644 --- a/src/main/java/emu/nebula/game/inventory/Inventory.java +++ b/src/main/java/emu/nebula/game/inventory/Inventory.java @@ -296,6 +296,36 @@ public class Inventory extends PlayerManager { return hasItems; } + // Utility functions + + public PlayerChangeInfo produce(int id, int num) { + // Get production data + var data = GameData.getProductionDataTable().get(id); + if (data == null) { + return null; + } + + // Get materials + var materials = data.getMaterials().mulitply(num); + + // Verify that we have the materials + if (!this.verifyItems(materials)) { + return null; + } + + // Create change info + var changes = new PlayerChangeInfo(); + + // Remove items + this.removeItems(materials, changes); + + // Add produced items + this.addItem(data.getProductionId(), data.getProductionPerBatch() * num, changes); + + // Success + return changes.setSuccess(true); + } + // Database public void loadFromDatabase() { diff --git a/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java b/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java new file mode 100644 index 0000000..45615c2 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerItemProductReq.java @@ -0,0 +1,28 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ItemProduct.ItemProductReq; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.item_product_req) +public class HandlerItemProductReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = ItemProductReq.parseFrom(message); + + // Produce item + var changes = session.getPlayer().getInventory().produce(req.getId(), req.getNum()); + + if (changes == null) { + return this.encodeMsg(NetMsgId.item_product_failed_ack); + } + + // Send response + return this.encodeMsg(NetMsgId.item_product_succeed_ack, changes.toProto()); + } + +}