Fix basic trials not rewarding materials

This commit is contained in:
Melledy
2025-10-29 20:49:34 -07:00
parent d024ab62a8
commit e002bec13a
13 changed files with 147 additions and 57 deletions

View File

@@ -41,6 +41,7 @@ public class GameData {
@Getter private static DataTable<DictionaryEntryDef> DictionaryEntryDataTable = new DataTable<>(); @Getter private static DataTable<DictionaryEntryDef> DictionaryEntryDataTable = new DataTable<>();
@Getter private static DataTable<DailyInstanceDef> DailyInstanceDataTable = new DataTable<>(); @Getter private static DataTable<DailyInstanceDef> DailyInstanceDataTable = new DataTable<>();
@Getter private static DataTable<DailyInstanceRewardGroupDef> DailyInstanceRewardGroupDataTable = new DataTable<>();
@Getter private static DataTable<RegionBossLevelDef> RegionBossLevelDataTable = new DataTable<>(); @Getter private static DataTable<RegionBossLevelDef> RegionBossLevelDataTable = new DataTable<>();
@Getter private static DataTable<SkillInstanceDef> SkillInstanceDataTable = new DataTable<>(); @Getter private static DataTable<SkillInstanceDef> SkillInstanceDataTable = new DataTable<>();
@Getter private static DataTable<CharGemInstanceDef> CharGemInstanceDataTable = new DataTable<>(); @Getter private static DataTable<CharGemInstanceDef> CharGemInstanceDataTable = new DataTable<>();

View File

@@ -1,24 +1,21 @@
package emu.nebula.data.resources; package emu.nebula.data.resources;
import emu.nebula.data.BaseDef; import emu.nebula.data.BaseDef;
import emu.nebula.data.GameData;
import emu.nebula.data.ResourceType; import emu.nebula.data.ResourceType;
import emu.nebula.game.instance.InstanceData; import emu.nebula.game.instance.InstanceData;
import emu.nebula.game.inventory.ItemParamMap; import emu.nebula.game.inventory.ItemParamMap;
import emu.nebula.util.JsonUtils;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@ResourceType(name = "DailyInstance.json") @ResourceType(name = "DailyInstance.json")
public class DailyInstanceDef extends BaseDef implements InstanceData { public class DailyInstanceDef extends BaseDef implements InstanceData {
private int Id; private int Id;
private int AwardDropId;
private int PreLevelId; private int PreLevelId;
private int PreLevelStar; private int PreLevelStar;
private int OneStarEnergyConsume; private int OneStarEnergyConsume;
private int NeedWorldClass; private int NeedWorldClass;
private String BaseAwardPreview;
private transient ItemParamMap firstRewards;
private transient ItemParamMap rewards;
@Override @Override
public int getId() { public int getId() {
@@ -30,28 +27,40 @@ public class DailyInstanceDef extends BaseDef implements InstanceData {
return OneStarEnergyConsume; return OneStarEnergyConsume;
} }
public DailyInstanceRewardGroupDef getRewardGroup(int rewardType) {
int groupId = this.getAwardDropId() + rewardType;
return GameData.getDailyInstanceRewardGroupDataTable().get(groupId);
}
@Override @Override
public void onLoad() { public ItemParamMap getFirstRewards() {
// Init reward maps return null;
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) { @Override
int itemId = award[0]; public ItemParamMap getRewards() {
int count = award[1]; return null;
boolean isFirst = award[2] == 1; }
if (isFirst) { @Override
this.firstRewards.put(itemId, count); public ItemParamMap getFirstRewards(int rewardType) {
var data = this.getRewardGroup(rewardType);
if (data != null) {
return data.getFirstRewards();
} else { } else {
this.rewards.put(itemId, count); return null;
} }
} }
@Override
public ItemParamMap getRewards(int rewardType) {
var data = this.getRewardGroup(rewardType);
if (data != null) {
return data.getRewards();
} else {
return null;
}
} }
} }

View File

@@ -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);
}
}
}
}

View File

@@ -15,6 +15,14 @@ public interface InstanceData {
public ItemParamMap getRewards(); 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 * Checks if the player has enough energy to complete this instance
* @return true if the player has enough energy * @return true if the player has enough energy

View File

@@ -19,7 +19,6 @@ import emu.nebula.proto.Public.WeekBossLevel;
import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
@Getter @Getter
@Entity(value = "instances", useDiscriminator = false) @Entity(value = "instances", useDiscriminator = false)
@@ -33,8 +32,8 @@ public class InstanceManager extends PlayerManager implements GameDatabaseObject
private Int2IntMap charGemLog; private Int2IntMap charGemLog;
private Int2IntMap weekBossLog; private Int2IntMap weekBossLog;
@Setter
private transient int curInstanceId; private transient int curInstanceId;
private transient int rewardType;
@Deprecated // Morphia @Deprecated // Morphia
public InstanceManager() { public InstanceManager() {
@@ -54,6 +53,15 @@ public class InstanceManager extends PlayerManager implements GameDatabaseObject
this.save(); 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) { public void saveInstanceLog(Int2IntMap log, String logName, int id, int newStar) {
// Get current star // Get current star
int star = log.get(id); int star = log.get(id);

View File

@@ -197,6 +197,12 @@ public class Inventory extends PlayerManager {
changes = new PlayerChangeInfo(); changes = new PlayerChangeInfo();
} }
// Sanity
if (params == null || params.isEmpty()) {
return changes;
}
// Add items
for (var param : params.getEntrySet()) { for (var param : params.getEntrySet()) {
this.addItem(param.getIntKey(), param.getIntValue(), changes); this.addItem(param.getIntKey(), param.getIntValue(), changes);
} }
@@ -222,6 +228,12 @@ public class Inventory extends PlayerManager {
changes = new PlayerChangeInfo(); changes = new PlayerChangeInfo();
} }
// Sanity
if (params == null || params.isEmpty()) {
return changes;
}
// Remove items
for (var param : params.getEntrySet()) { for (var param : params.getEntrySet()) {
this.removeItem(param.getIntKey(), param.getIntValue(), changes); this.removeItem(param.getIntKey(), param.getIntValue(), changes);
} }

View File

@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
import emu.nebula.proto.Public.Item;
import emu.nebula.proto.Public.ItemInfo; import emu.nebula.proto.Public.ItemInfo;
import emu.nebula.proto.Public.ItemTpl; import emu.nebula.proto.Public.ItemTpl;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
@@ -60,6 +61,8 @@ public class ItemParamMap extends Int2IntOpenHashMap {
return this.int2IntEntrySet(); return this.int2IntEntrySet();
} }
// Converters (lists/streams)
public List<ItemParam> toList() { public List<ItemParam> toList() {
List<ItemParam> list = new ArrayList<>(); List<ItemParam> list = new ArrayList<>();
@@ -76,6 +79,12 @@ public class ItemParamMap extends Int2IntOpenHashMap {
.map(e -> ItemTpl.newInstance().setTid(e.getIntKey()).setQty(e.getIntValue())); .map(e -> ItemTpl.newInstance().setTid(e.getIntKey()).setQty(e.getIntValue()));
} }
public Stream<Item> toItemProtoStream() {
return getEntrySet()
.stream()
.map(e -> Item.newInstance().setTid(e.getIntKey()).setQty(e.getIntValue()));
}
// Helpers // Helpers
public static ItemParamMap fromTemplates(RepeatedMessage<ItemTpl> items) { public static ItemParamMap fromTemplates(RepeatedMessage<ItemTpl> items) {

View File

@@ -16,19 +16,14 @@ public class HandlerCharGemInstanceApplyReq extends NetHandler {
var req = CharGemInstanceApplyReq.parseFrom(message); var req = CharGemInstanceApplyReq.parseFrom(message);
var data = GameData.getCharGemInstanceDataTable().get(req.getId()); 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); return this.encodeMsg(NetMsgId.char_gem_instance_apply_failed_ack);
} }
// Check player energy // Set player instance id
if (data.getEnergyConsume() > session.getPlayer().getEnergy()) {
return this.encodeMsg(NetMsgId.char_gem_instance_apply_failed_ack);
}
// Set player
session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); session.getPlayer().getInstanceManager().setCurInstanceId(req.getId());
// Template // Send response
return this.encodeMsg(NetMsgId.char_gem_instance_apply_succeed_ack); return this.encodeMsg(NetMsgId.char_gem_instance_apply_succeed_ack);
} }

View File

@@ -16,19 +16,19 @@ public class HandlerDailyInstanceApplyReq extends NetHandler {
var req = DailyInstanceApplyReq.parseFrom(message); var req = DailyInstanceApplyReq.parseFrom(message);
var data = GameData.getDailyInstanceDataTable().get(req.getId()); 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); return this.encodeMsg(NetMsgId.daily_instance_apply_failed_ack);
} }
// Check player energy // Check reward group
if (data.getEnergyConsume() > session.getPlayer().getEnergy()) { if (data.getRewardGroup(req.getRewardType()) == null) {
return this.encodeMsg(NetMsgId.daily_instance_apply_failed_ack); return this.encodeMsg(NetMsgId.daily_instance_apply_failed_ack);
} }
// Set player // 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); return this.encodeMsg(NetMsgId.daily_instance_apply_succeed_ack);
} }

View File

@@ -41,6 +41,17 @@ public class HandlerDailyInstanceSettleReq extends NetHandler {
.setExp(settleData.getExp()) .setExp(settleData.getExp())
.setChange(changes.toProto()); .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 // Send response
return this.encodeMsg(NetMsgId.daily_instance_settle_succeed_ack, rsp); return this.encodeMsg(NetMsgId.daily_instance_settle_succeed_ack, rsp);
} }

View File

@@ -16,19 +16,14 @@ public class HandlerRegionBossLevelApplyReq extends NetHandler {
var req = RegionBossLevelApplyReq.parseFrom(message); var req = RegionBossLevelApplyReq.parseFrom(message);
var data = GameData.getRegionBossLevelDataTable().get(req.getId()); 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); return this.encodeMsg(NetMsgId.region_boss_level_apply_failed_ack);
} }
// Check player energy // Set player instance id
if (data.getEnergyConsume() > session.getPlayer().getEnergy()) {
return this.encodeMsg(NetMsgId.region_boss_level_apply_failed_ack);
}
// Set player
session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); session.getPlayer().getInstanceManager().setCurInstanceId(req.getId());
// Template // Send response
return this.encodeMsg(NetMsgId.region_boss_level_apply_succeed_ack); return this.encodeMsg(NetMsgId.region_boss_level_apply_succeed_ack);
} }

View File

@@ -16,19 +16,14 @@ public class HandlerSkillInstanceApplyReq extends NetHandler {
var req = SkillInstanceApplyReq.parseFrom(message); var req = SkillInstanceApplyReq.parseFrom(message);
var data = GameData.getSkillInstanceDataTable().get(req.getId()); 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); return this.encodeMsg(NetMsgId.skill_instance_apply_failed_ack);
} }
// Check player energy // Set player instance id
if (data.getEnergyConsume() > session.getPlayer().getEnergy()) {
return this.encodeMsg(NetMsgId.skill_instance_apply_failed_ack);
}
// Set player
session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); session.getPlayer().getInstanceManager().setCurInstanceId(req.getId());
// Template // Send response
return this.encodeMsg(NetMsgId.skill_instance_apply_succeed_ack); return this.encodeMsg(NetMsgId.skill_instance_apply_succeed_ack);
} }

View File

@@ -16,14 +16,14 @@ public class HandlerWeekBossApplyReq extends NetHandler {
var req = WeekBossApplyReq.parseFrom(message); var req = WeekBossApplyReq.parseFrom(message);
var data = GameData.getWeekBossLevelDataTable().get(req.getId()); 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); return this.encodeMsg(NetMsgId.week_boss_apply_failed_ack);
} }
// Set player // Set player instance id
session.getPlayer().getInstanceManager().setCurInstanceId(req.getId()); session.getPlayer().getInstanceManager().setCurInstanceId(req.getId());
// Template // Send response
return this.encodeMsg(NetMsgId.week_boss_apply_succeed_ack); return this.encodeMsg(NetMsgId.week_boss_apply_succeed_ack);
} }