diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index d0727ab..9bbce42 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -18,6 +18,7 @@ import lombok.Getter; @SuppressWarnings("unused") public class GameData { + // Characters @Getter private static DataTable CharacterDataTable = new DataTable<>(); @Getter private static DataTable CharacterAdvanceDataTable = new DataTable<>(); @Getter private static DataTable CharacterSkillUpgradeDataTable = new DataTable<>(); @@ -27,12 +28,14 @@ public class GameData { @Getter private static DataTable TalentGroupDataTable = new DataTable<>(); @Getter private static DataTable TalentDataTable = new DataTable<>(); + // Discs @Getter private static DataTable DiscDataTable = new DataTable<>(); @Getter private static DataTable DiscStrengthenDataTable = new DataTable<>(); @Getter private static DataTable DiscItemExpDataTable = new DataTable<>(); @Getter private static DataTable DiscPromoteDataTable = new DataTable<>(); @Getter private static DataTable DiscPromoteLimitDataTable = new DataTable<>(); + // Items @Getter private static DataTable ItemDataTable = new DataTable<>(); @Getter private static DataTable ProductionDataTable = new DataTable<>(); @Getter private static DataTable PlayerHeadDataTable = new DataTable<>(); @@ -43,9 +46,14 @@ public class GameData { @Getter private static DataTable MallShopDataTable = new DataTable<>(); @Getter private static DataTable MallGemDataTable = new DataTable<>(); + @Getter private static DataTable ResidentShopDataTable = new DataTable<>(); + @Getter private static DataTable ResidentGoodsDataTable = new DataTable<>(); + + // Dictionary @Getter private static DataTable DictionaryTabDataTable = new DataTable<>(); @Getter private static DataTable DictionaryEntryDataTable = new DataTable<>(); + // Instances @Getter private static DataTable DailyInstanceDataTable = new DataTable<>(); @Getter private static DataTable DailyInstanceRewardGroupDataTable = new DataTable<>(); @Getter private static DataTable RegionBossLevelDataTable = new DataTable<>(); @@ -62,9 +70,11 @@ public class GameData { @Getter private static DataTable StoryDataTable = new DataTable<>(); @Getter private static DataTable StorySetSectionDataTable = new DataTable<>(); + // Daily quests @Getter private static DataTable DailyQuestDataTable = new DataTable<>(); @Getter private static DataTable DailyQuestActiveDataTable = new DataTable<>(); + // Star tower @Getter private static DataTable StarTowerDataTable = new DataTable<>(); @Getter private static DataTable StarTowerStageDataTable = new DataTable<>(); @Getter private static DataTable PotentialDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/HandbookDef.java b/src/main/java/emu/nebula/data/resources/HandbookDef.java index aa7523f..27d6195 100644 --- a/src/main/java/emu/nebula/data/resources/HandbookDef.java +++ b/src/main/java/emu/nebula/data/resources/HandbookDef.java @@ -2,11 +2,10 @@ package emu.nebula.data.resources; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; -import emu.nebula.data.ResourceType.LoadPriority; import lombok.Getter; @Getter -@ResourceType(name = "Handbook.json", loadPriority = LoadPriority.LOW) +@ResourceType(name = "Handbook.json") public class HandbookDef extends BaseDef { private int Id; private int Index; diff --git a/src/main/java/emu/nebula/data/resources/ResidentGoodsDef.java b/src/main/java/emu/nebula/data/resources/ResidentGoodsDef.java new file mode 100644 index 0000000..6ce79a4 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/ResidentGoodsDef.java @@ -0,0 +1,36 @@ +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 = "ResidentGoods.json") +public class ResidentGoodsDef extends BaseDef { + private int Id; + private int ShopId; + private int MaximumLimit; + + private int ItemId; + private int ItemQuantity; + + private int CurrencyItemId; + private int Price; + + private transient ItemParamMap products; + + @Override + public int getId() { + return Id; + } + + @Override + public void onLoad() { + this.products = new ItemParamMap(); + + if (this.ItemId > 0) { + this.products.add(this.ItemId, this.ItemQuantity); + } + } +} diff --git a/src/main/java/emu/nebula/data/resources/ResidentShopDef.java b/src/main/java/emu/nebula/data/resources/ResidentShopDef.java new file mode 100644 index 0000000..93bdc54 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/ResidentShopDef.java @@ -0,0 +1,16 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = "ResidentShop.json") +public class ResidentShopDef extends BaseDef { + private int Id; + + @Override + public int getId() { + return Id; + } +} diff --git a/src/main/java/emu/nebula/game/inventory/Inventory.java b/src/main/java/emu/nebula/game/inventory/Inventory.java index 91cc625..5f69f88 100644 --- a/src/main/java/emu/nebula/game/inventory/Inventory.java +++ b/src/main/java/emu/nebula/game/inventory/Inventory.java @@ -594,6 +594,11 @@ public class Inventory extends PlayerManager implements GameDatabaseObject { change = new PlayerChangeInfo(); } + // Sanity check + if (buyCount <= 0) { + return change; + } + // Make sure we have the currency int cost = buyCount * currencyCount; diff --git a/src/main/java/emu/nebula/server/handlers/HandlerResidentShopGetReq.java b/src/main/java/emu/nebula/server/handlers/HandlerResidentShopGetReq.java new file mode 100644 index 0000000..09079a4 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerResidentShopGetReq.java @@ -0,0 +1,31 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.Public.ResidentShop; +import emu.nebula.proto.ResidentShopGet.ResidentShopGetResp; +import emu.nebula.net.HandlerId; +import emu.nebula.data.GameData; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.resident_shop_get_req) +public class HandlerResidentShopGetReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Build response + var rsp = ResidentShopGetResp.newInstance(); + + for (var data : GameData.getResidentShopDataTable()) { + var proto = ResidentShop.newInstance() + .setId(data.getId()) + .setRefreshTime(Long.MAX_VALUE); + + rsp.addShops(proto); + } + + // Encode and send + return session.encodeMsg(NetMsgId.resident_shop_get_succeed_ack, rsp); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerResidentShopPurchaseReq.java b/src/main/java/emu/nebula/server/handlers/HandlerResidentShopPurchaseReq.java new file mode 100644 index 0000000..3551d65 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerResidentShopPurchaseReq.java @@ -0,0 +1,46 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ResidentShopPurchase.ResidentShopPurchaseReq; +import emu.nebula.proto.ResidentShopPurchase.ResidentShopPurchaseResp; +import emu.nebula.net.HandlerId; +import emu.nebula.data.GameData; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.resident_shop_purchase_req) +public class HandlerResidentShopPurchaseReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = ResidentShopPurchaseReq.parseFrom(message); + + // Get goods + var data = GameData.getResidentGoodsDataTable().get(req.getGoodsId()); + if (data == null) { + return session.encodeMsg(NetMsgId.resident_shop_purchase_failed_ack); + } + + // Buy + var change = session.getPlayer().getInventory().buyItem( + data.getCurrencyItemId(), + data.getPrice(), + data.getProducts(), + req.getNumber() + ); + + // Build response + var rsp = ResidentShopPurchaseResp.newInstance() + .setChange(change.toProto()) + .setPurchasedNumber(0); // Prevent avaliable item count from decreasing + + rsp.getMutableShop() + .setId(data.getShopId()) + .setRefreshTime(Long.MAX_VALUE); + + // Encode and send + return session.encodeMsg(NetMsgId.resident_shop_purchase_succeed_ack, rsp); + } + +}