diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 36d9db5..080b39e 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -107,6 +107,7 @@ public class GameData { @Getter private static DataTable RegionBossLevelDataTable = new DataTable<>(); @Getter private static DataTable SkillInstanceDataTable = new DataTable<>(); @Getter private static DataTable CharGemInstanceDataTable = new DataTable<>(); + @Getter private static DataTable CharGemInstanceRewardGroupDataTable = new DataTable<>(); @Getter private static DataTable WeekBossLevelDataTable = new DataTable<>(); // ===== Star Tower ===== diff --git a/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java b/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java index a42d193..746c865 100644 --- a/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java +++ b/src/main/java/emu/nebula/data/resources/CharGemInstanceDef.java @@ -1,6 +1,7 @@ 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.ItemRewardList; @@ -17,6 +18,7 @@ public class CharGemInstanceDef extends BaseDef implements InstanceData { private int PreLevelStar; private int NeedWorldClass; private int EnergyConsume; + private int DropId; private String BaseAwardPreview; private transient ItemRewardList firstRewards; @@ -59,4 +61,36 @@ public class CharGemInstanceDef extends BaseDef implements InstanceData { } } } + + public CharGemInstanceRewardGroupDef getRewardGroup(int rewardType) { + // Instances without a drop id don't have selectable rewards + if (this.DropId <= 0) { + return null; + } + + int groupId = this.getDropId() + rewardType; + return GameData.getCharGemInstanceRewardGroupDataTable().get(groupId); + } + + @Override + public ItemRewardList getFirstRewards(int rewardType) { + var data = this.getRewardGroup(rewardType); + + if (data != null) { + return data.getFirstRewards(); + } else { + return this.firstRewards; + } + } + + @Override + public ItemRewardList getRewards(int rewardType) { + var data = this.getRewardGroup(rewardType); + + if (data != null) { + return data.getRewards(); + } else { + return this.rewards; + } + } } diff --git a/src/main/java/emu/nebula/data/resources/CharGemInstanceRewardGroupDef.java b/src/main/java/emu/nebula/data/resources/CharGemInstanceRewardGroupDef.java new file mode 100644 index 0000000..f502c2f --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/CharGemInstanceRewardGroupDef.java @@ -0,0 +1,59 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import emu.nebula.game.inventory.ItemRewardList; +import emu.nebula.game.inventory.ItemRewardParam; +import emu.nebula.util.JsonUtils; + +import lombok.Getter; + +@Getter +@ResourceType(name = "CharGemInstanceRewardGroup.json") +public class CharGemInstanceRewardGroupDef extends BaseDef { + private int GroupId; + private int RewardType; + private String BaseAwardPreview; + + // Parsed rewards + private transient ItemRewardList firstRewards; + private transient ItemRewardList rewards; + + @Override + public int getId() { + return GroupId + RewardType; + } + + @Override + public void onLoad() { + // Init reward lists + this.firstRewards = new ItemRewardList(); + this.rewards = new ItemRewardList(); + + // Parse rewards + var awards = JsonUtils.decodeList(this.BaseAwardPreview, int[].class); + if (awards == null) { + return; + } + + for (int[] award : awards) { + int itemId = award[0]; + int min = award[1]; + int max = award.length >= 4 ? award[2] : min; + boolean isFirst = award[award.length - 1] == 1; + + if (min == -1) { + min = 0; + max = 1; + } + + var reward = new ItemRewardParam(itemId, min, max); + + if (isFirst) { + this.firstRewards.add(reward); + } else { + this.rewards.add(reward); + } + } + } +} diff --git a/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java b/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java index ec8f4c3..a9e2f5e 100644 --- a/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java +++ b/src/main/java/emu/nebula/data/resources/DailyInstanceDef.java @@ -27,6 +27,12 @@ public class DailyInstanceDef extends BaseDef implements InstanceData { return OneStarEnergyConsume; } + @Override + public int getMaxStar() { + // Daily instance stars are saved as a bitmask (1 + 2 + 4) + return 7; + } + public DailyInstanceRewardGroupDef getRewardGroup(int rewardType) { int groupId = this.getAwardDropId() + rewardType; return GameData.getDailyInstanceRewardGroupDataTable().get(groupId); diff --git a/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java b/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java index a44069e..86818c9 100644 --- a/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java +++ b/src/main/java/emu/nebula/data/resources/DailyInstanceRewardGroupDef.java @@ -15,6 +15,7 @@ public class DailyInstanceRewardGroupDef extends BaseDef { private int DailyRewardType; private String BaseAwardPreview; + // Parsed rewards private transient ItemRewardList firstRewards; private transient ItemRewardList rewards; diff --git a/src/main/java/emu/nebula/game/instance/InstanceData.java b/src/main/java/emu/nebula/game/instance/InstanceData.java index b5edc42..9d6f650 100644 --- a/src/main/java/emu/nebula/game/instance/InstanceData.java +++ b/src/main/java/emu/nebula/game/instance/InstanceData.java @@ -11,6 +11,14 @@ public interface InstanceData { public int getEnergyConsume(); + /** + * Gets the highest star value that can be saved for this instance + * @return the max star value + */ + public default int getMaxStar() { + return 3; + } + // Item rewards public ItemRewardList getFirstRewards(); diff --git a/src/main/java/emu/nebula/game/instance/InstanceManager.java b/src/main/java/emu/nebula/game/instance/InstanceManager.java index b28f1e5..64ec610 100644 --- a/src/main/java/emu/nebula/game/instance/InstanceManager.java +++ b/src/main/java/emu/nebula/game/instance/InstanceManager.java @@ -84,19 +84,12 @@ public class InstanceManager extends PlayerManager { return null; } - // Check if we have 3 starred this instance + // Get star count of our best run int stars = log.get(data.getId()); - if (rewardType > 0) { - // Daily instance - if (stars != 7) { - return null; - } - } else { - // Other instances - if (stars != 3) { - return null; - } + // Check if we have 3 starred this instance + if (stars != data.getMaxStar()) { + return null; } // Check energy cost diff --git a/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java index f951bf2..3246b6c 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceApplyReq.java @@ -20,8 +20,13 @@ public class HandlerCharGemInstanceApplyReq extends NetHandler { return session.encodeMsg(NetMsgId.char_gem_instance_apply_failed_ack); } + // Check reward group + if (data.getDropId() > 0 && data.getRewardGroup(req.getRewardType()) == null) { + return session.encodeMsg(NetMsgId.char_gem_instance_apply_failed_ack); + } + // Set player instance id - session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); + session.getPlayer().getInstanceManager().setCurInstanceId(req.getId(), req.getRewardType()); // Send response return session.encodeMsg(NetMsgId.char_gem_instance_apply_succeed_ack); diff --git a/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceSweepReq.java b/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceSweepReq.java index 39e7541..61a006b 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceSweepReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerCharGemInstanceSweepReq.java @@ -28,12 +28,17 @@ public class HandlerCharGemInstanceSweepReq extends NetHandler { return session.encodeMsg(NetMsgId.char_gem_instance_sweep_failed_ack); } + // Check reward group + if (data.getDropId() > 0 && data.getRewardGroup(req.getRewardType()) == null) { + return session.encodeMsg(NetMsgId.char_gem_instance_sweep_failed_ack); + } + // Sweep var change = session.getPlayer().getInstanceManager().sweepInstance( data, QuestCondition.CharGemInstanceClearTotal, session.getPlayer().getProgress().getCharGemLog(), - 0, + req.getRewardType(), req.getTimes() );