diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index dccc289..239bba4 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -41,6 +41,7 @@ public class GameData { @Getter private static DataTable DictionaryEntryDataTable = new DataTable<>(); @Getter private static DataTable DailyInstanceDataTable = new DataTable<>(); + @Getter private static DataTable DailyInstanceRewardGroupDataTable = new DataTable<>(); @Getter private static DataTable RegionBossLevelDataTable = new DataTable<>(); @Getter private static DataTable SkillInstanceDataTable = new DataTable<>(); @Getter private static DataTable CharGemInstanceDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java b/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java index 48b151f..f029a7e 100644 --- a/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java +++ b/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java @@ -1,24 +1,21 @@ package emu.nebula.data.resources; import emu.nebula.data.BaseDef; +import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; import emu.nebula.game.instance.InstanceData; import emu.nebula.game.inventory.ItemParamMap; -import emu.nebula.util.JsonUtils; import lombok.Getter; @Getter @ResourceType(name = "DailyInstance.json") public class DailyInstanceDef extends BaseDef implements InstanceData { private int Id; + private int AwardDropId; private int PreLevelId; private int PreLevelStar; private int OneStarEnergyConsume; private int NeedWorldClass; - private String BaseAwardPreview; - - private transient ItemParamMap firstRewards; - private transient ItemParamMap rewards; @Override public int getId() { @@ -30,28 +27,40 @@ public class DailyInstanceDef extends BaseDef implements InstanceData { return OneStarEnergyConsume; } + public DailyInstanceRewardGroupDef getRewardGroup(int rewardType) { + int groupId = this.getAwardDropId() + rewardType; + return GameData.getDailyInstanceRewardGroupDataTable().get(groupId); + } + @Override - public void onLoad() { - // Init reward maps - this.firstRewards = new ItemParamMap(); - this.rewards = new ItemParamMap(); + public ItemParamMap getFirstRewards() { + return null; + } + + @Override + public ItemParamMap getRewards() { + return null; + } + + @Override + public ItemParamMap getFirstRewards(int rewardType) { + var data = this.getRewardGroup(rewardType); - // Parse rewards - var awards = JsonUtils.decodeList(this.BaseAwardPreview, int[].class); - if (awards == null) { - return; + if (data != null) { + return data.getFirstRewards(); + } else { + return null; } + } + + @Override + public ItemParamMap getRewards(int rewardType) { + var data = this.getRewardGroup(rewardType); - for (int[] award : awards) { - int itemId = award[0]; - int count = award[1]; - boolean isFirst = award[2] == 1; - - if (isFirst) { - this.firstRewards.put(itemId, count); - } else { - this.rewards.put(itemId, count); - } + if (data != null) { + return data.getRewards(); + } else { + return null; } } } diff --git a/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java b/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java new file mode 100644 index 0000000..9cb7781 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java @@ -0,0 +1,47 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import emu.nebula.game.inventory.ItemParamMap; +import emu.nebula.util.JsonUtils; +import lombok.Getter; + +@Getter +@ResourceType(name = "DailyInstanceRewardGroup.json") +public class DailyInstanceRewardGroupDef extends BaseDef { + private int Id; + private String BaseAwardPreview; + + private transient ItemParamMap firstRewards; + private transient ItemParamMap rewards; + + @Override + public int getId() { + return Id; + } + + @Override + public void onLoad() { + // Init reward maps + this.firstRewards = new ItemParamMap(); + this.rewards = new ItemParamMap(); + + // Parse rewards + var awards = JsonUtils.decodeList(this.BaseAwardPreview, int[].class); + if (awards == null) { + return; + } + + for (int[] award : awards) { + int itemId = award[0]; + int count = award[1]; + boolean isFirst = award[2] == 1; + + if (isFirst) { + this.firstRewards.put(itemId, count); + } else { + this.rewards.put(itemId, count); + } + } + } +} diff --git a/src/main/java/emu/nebula/game/instance/InstanceData.java b/src/main/java/emu/nebula/game/instance/InstanceData.java index 5df10e7..9b620ad 100644 --- a/src/main/java/emu/nebula/game/instance/InstanceData.java +++ b/src/main/java/emu/nebula/game/instance/InstanceData.java @@ -15,6 +15,14 @@ public interface InstanceData { public ItemParamMap getRewards(); + public default ItemParamMap getFirstRewards(int rewardType) { + return this.getFirstRewards(); + } + + public default ItemParamMap getRewards(int rewardType) { + return this.getRewards(); + } + /** * Checks if the player has enough energy to complete this instance * @return true if the player has enough energy diff --git a/src/main/java/emu/nebula/game/instance/InstanceManager.java b/src/main/java/emu/nebula/game/instance/InstanceManager.java index 108dddd..2234353 100644 --- a/src/main/java/emu/nebula/game/instance/InstanceManager.java +++ b/src/main/java/emu/nebula/game/instance/InstanceManager.java @@ -19,7 +19,6 @@ import emu.nebula.proto.Public.WeekBossLevel; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import lombok.Getter; -import lombok.Setter; @Getter @Entity(value = "instances", useDiscriminator = false) @@ -33,8 +32,8 @@ public class InstanceManager extends PlayerManager implements GameDatabaseObject private Int2IntMap charGemLog; private Int2IntMap weekBossLog; - @Setter private transient int curInstanceId; + private transient int rewardType; @Deprecated // Morphia public InstanceManager() { @@ -54,6 +53,15 @@ public class InstanceManager extends PlayerManager implements GameDatabaseObject this.save(); } + public void setCurInstanceId(int id) { + this.setCurInstanceId(id, 0); + } + + public void setCurInstanceId(int id, int rewardType) { + this.curInstanceId = id; + this.rewardType = rewardType; + } + public void saveInstanceLog(Int2IntMap log, String logName, int id, int newStar) { // Get current star int star = log.get(id); diff --git a/src/main/java/emu/nebula/game/inventory/Inventory.java b/src/main/java/emu/nebula/game/inventory/Inventory.java index b2682e1..41a93f8 100644 --- a/src/main/java/emu/nebula/game/inventory/Inventory.java +++ b/src/main/java/emu/nebula/game/inventory/Inventory.java @@ -197,6 +197,12 @@ public class Inventory extends PlayerManager { changes = new PlayerChangeInfo(); } + // Sanity + if (params == null || params.isEmpty()) { + return changes; + } + + // Add items for (var param : params.getEntrySet()) { this.addItem(param.getIntKey(), param.getIntValue(), changes); } @@ -222,6 +228,12 @@ public class Inventory extends PlayerManager { changes = new PlayerChangeInfo(); } + // Sanity + if (params == null || params.isEmpty()) { + return changes; + } + + // Remove items for (var param : params.getEntrySet()) { this.removeItem(param.getIntKey(), param.getIntValue(), changes); } diff --git a/src/main/java/emu/nebula/game/inventory/ItemParamMap.java b/src/main/java/emu/nebula/game/inventory/ItemParamMap.java index 0057ff0..5be0896 100644 --- a/src/main/java/emu/nebula/game/inventory/ItemParamMap.java +++ b/src/main/java/emu/nebula/game/inventory/ItemParamMap.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; +import emu.nebula.proto.Public.Item; import emu.nebula.proto.Public.ItemInfo; import emu.nebula.proto.Public.ItemTpl; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; @@ -60,6 +61,8 @@ public class ItemParamMap extends Int2IntOpenHashMap { return this.int2IntEntrySet(); } + // Converters (lists/streams) + public List toList() { List list = new ArrayList<>(); @@ -76,6 +79,12 @@ public class ItemParamMap extends Int2IntOpenHashMap { .map(e -> ItemTpl.newInstance().setTid(e.getIntKey()).setQty(e.getIntValue())); } + public Stream toItemProtoStream() { + return getEntrySet() + .stream() + .map(e -> Item.newInstance().setTid(e.getIntKey()).setQty(e.getIntValue())); + } + // Helpers public static ItemParamMap fromTemplates(RepeatedMessage items) { diff --git a/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java index 7a4f45b..4f8abd8 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java @@ -16,19 +16,14 @@ public class HandlerCharGemInstanceApplyReq extends NetHandler { var req = CharGemInstanceApplyReq.parseFrom(message); var data = GameData.getCharGemInstanceDataTable().get(req.getId()); - if (data == null) { + if (data == null || !data.hasEnergy(session.getPlayer())) { return this.encodeMsg(NetMsgId.char_gem_instance_apply_failed_ack); } - // Check player energy - if (data.getEnergyConsume() > session.getPlayer().getEnergy()) { - return this.encodeMsg(NetMsgId.char_gem_instance_apply_failed_ack); - } - - // Set player + // Set player instance id session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); - // Template + // Send response return this.encodeMsg(NetMsgId.char_gem_instance_apply_succeed_ack); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceApplyReq.java index b5925ae..4cbe929 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceApplyReq.java @@ -16,19 +16,19 @@ public class HandlerDailyInstanceApplyReq extends NetHandler { var req = DailyInstanceApplyReq.parseFrom(message); var data = GameData.getDailyInstanceDataTable().get(req.getId()); - if (data == null) { + if (data == null || !data.hasEnergy(session.getPlayer())) { return this.encodeMsg(NetMsgId.daily_instance_apply_failed_ack); } - // Check player energy - if (data.getEnergyConsume() > session.getPlayer().getEnergy()) { + // Check reward group + if (data.getRewardGroup(req.getRewardType()) == null) { return this.encodeMsg(NetMsgId.daily_instance_apply_failed_ack); } // Set player - session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); + session.getPlayer().getInstanceManager().setCurInstanceId(req.getId(), req.getRewardType()); - // Template + // Send response return this.encodeMsg(NetMsgId.daily_instance_apply_succeed_ack); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceSettleReq.java b/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceSettleReq.java index d49df54..7af909a 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceSettleReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerDailyInstanceSettleReq.java @@ -41,6 +41,17 @@ public class HandlerDailyInstanceSettleReq extends NetHandler { .setExp(settleData.getExp()) .setChange(changes.toProto()); + // Add reward items + if (settleData.isWin()) { + int rewardType = player.getInstanceManager().getRewardType(); + + data.getRewards(rewardType).toItemProtoStream().forEach(rsp::addSelect); + + if (settleData.isFirst()) { + data.getFirstRewards(rewardType).toItemProtoStream().forEach(rsp::addFirst); + } + } + // Send response return this.encodeMsg(NetMsgId.daily_instance_settle_succeed_ack, rsp); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerRegionBossLevelApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerRegionBossLevelApplyReq.java index dfdaea8..d39056b 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerRegionBossLevelApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerRegionBossLevelApplyReq.java @@ -16,19 +16,14 @@ public class HandlerRegionBossLevelApplyReq extends NetHandler { var req = RegionBossLevelApplyReq.parseFrom(message); var data = GameData.getRegionBossLevelDataTable().get(req.getId()); - if (data == null) { + if (data == null || !data.hasEnergy(session.getPlayer())) { return this.encodeMsg(NetMsgId.region_boss_level_apply_failed_ack); } - // Check player energy - if (data.getEnergyConsume() > session.getPlayer().getEnergy()) { - return this.encodeMsg(NetMsgId.region_boss_level_apply_failed_ack); - } - - // Set player + // Set player instance id session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); - // Template + // Send response return this.encodeMsg(NetMsgId.region_boss_level_apply_succeed_ack); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerSkillInstanceApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerSkillInstanceApplyReq.java index b78e56a..e09922d 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerSkillInstanceApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerSkillInstanceApplyReq.java @@ -16,19 +16,14 @@ public class HandlerSkillInstanceApplyReq extends NetHandler { var req = SkillInstanceApplyReq.parseFrom(message); var data = GameData.getSkillInstanceDataTable().get(req.getId()); - if (data == null) { + if (data == null || !data.hasEnergy(session.getPlayer())) { return this.encodeMsg(NetMsgId.skill_instance_apply_failed_ack); } - // Check player energy - if (data.getEnergyConsume() > session.getPlayer().getEnergy()) { - return this.encodeMsg(NetMsgId.skill_instance_apply_failed_ack); - } - - // Set player + // Set player instance id session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); - // Template + // Send response return this.encodeMsg(NetMsgId.skill_instance_apply_succeed_ack); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerWeekBossApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerWeekBossApplyReq.java index c758c48..2dbc25d 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerWeekBossApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerWeekBossApplyReq.java @@ -16,14 +16,14 @@ public class HandlerWeekBossApplyReq extends NetHandler { var req = WeekBossApplyReq.parseFrom(message); var data = GameData.getWeekBossLevelDataTable().get(req.getId()); - if (data == null) { + if (data == null || !data.hasEnergy(session.getPlayer())) { return this.encodeMsg(NetMsgId.week_boss_apply_failed_ack); } - // Set player + // Set player instance id session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); - // Template + // Send response return this.encodeMsg(NetMsgId.week_boss_apply_succeed_ack); }