mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-23 10:44:36 +01:00
Fix challenge rewards not working due to new update behavior
This commit is contained in:
@@ -46,7 +46,6 @@ public class GameData {
|
||||
@Getter private static Int2ObjectMap<ChallengeGroupExcel> challengeGroupExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<ChallengeExcel> challengeExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<ChallengeTargetExcel> challengeTargetExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
private static Int2ObjectMap<ChallengeRewardExcel> challengeRewardExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@Getter private static Int2ObjectMap<RogueManagerExcel> rogueManagerExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@Getter private static Int2ObjectMap<RogueTalentExcel> rogueTalentExcelMap = new Int2ObjectOpenHashMap<>();
|
||||
@@ -221,10 +220,6 @@ public class GameData {
|
||||
return monsterDropExcelMap.get((monsterNpcId << 4) + worldLevel);
|
||||
}
|
||||
|
||||
public static ChallengeRewardExcel getChallengeRewardExcel(int groupId, int starCount) {
|
||||
return challengeRewardExcelMap.get((groupId << 16) + starCount);
|
||||
}
|
||||
|
||||
public static RogueMapExcel getRogueMapExcel(int rogueMapId, int siteId) {
|
||||
return rogueMapExcelMap.get((rogueMapId << 8) + siteId);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@ public class GameDepot {
|
||||
// Relics
|
||||
private static Int2ObjectMap<List<RelicMainAffixExcel>> relicMainAffixDepot = new Int2ObjectOpenHashMap<>();
|
||||
private static Int2ObjectMap<List<RelicSubAffixExcel>> relicSubAffixDepot = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
// Challenges
|
||||
@Getter private static Int2ObjectMap<List<ChallengeRewardExcel>> challengeRewardLines = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
// Rogue
|
||||
@Getter private static Int2ObjectMap<int[]> rogueMapGen = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
@@ -3,6 +3,7 @@ package emu.lunarcore.data.common;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import emu.lunarcore.proto.ItemCostOuterClass.ItemCost;
|
||||
import emu.lunarcore.proto.ItemOuterClass.Item;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@@ -48,4 +49,10 @@ public class ItemParam {
|
||||
public static enum ItemParamType {
|
||||
UNKNOWN, PILE, UNIQUE;
|
||||
}
|
||||
|
||||
public Item toProto() {
|
||||
return Item.newInstance()
|
||||
.setItemId(this.getId())
|
||||
.setNum(this.getCount());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import emu.lunarcore.data.ResourceType;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@ResourceType(name = {"ChallengeGroupConfig.json"})
|
||||
@ResourceType(name = {"ChallengeGroupConfig.json", "ChallengeStoryGroupConfig.json"})
|
||||
public class ChallengeGroupExcel extends GameResource {
|
||||
private int GroupID;
|
||||
private int RewardLineGroupID;
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
package emu.lunarcore.data.excel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.GameResource;
|
||||
import emu.lunarcore.data.ResourceType;
|
||||
import emu.lunarcore.data.ResourceType.LoadPriority;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@ResourceType(name = {"ChallengeMazeRewardLine.json"})
|
||||
@ResourceType(name = {"ChallengeMazeRewardLine.json", "ChallengeStoryRewardLine.json"}, loadPriority = LoadPriority.LOW)
|
||||
public class ChallengeRewardExcel extends GameResource {
|
||||
private int GroupID;
|
||||
private int StarCount;
|
||||
@@ -15,4 +19,10 @@ public class ChallengeRewardExcel extends GameResource {
|
||||
public int getId() {
|
||||
return (GroupID << 16) + StarCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
var rewardLine = GameDepot.getChallengeRewardLines().computeIfAbsent(GroupID, id -> new ArrayList<>());
|
||||
rewardLine.add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
package emu.lunarcore.game.challenge;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import emu.lunarcore.GameConstants;
|
||||
import emu.lunarcore.LunarCore;
|
||||
import emu.lunarcore.data.GameData;
|
||||
import emu.lunarcore.data.GameDepot;
|
||||
import emu.lunarcore.data.common.ItemParam;
|
||||
import emu.lunarcore.data.excel.ChallengeExcel;
|
||||
import emu.lunarcore.game.inventory.GameItem;
|
||||
import emu.lunarcore.game.player.BasePlayerManager;
|
||||
import emu.lunarcore.game.player.Player;
|
||||
import emu.lunarcore.game.player.lineup.PlayerLineup;
|
||||
import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType;
|
||||
import emu.lunarcore.proto.StartChallengeStoryBuffInfoOuterClass.StartChallengeStoryBuffInfo;
|
||||
import emu.lunarcore.proto.TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo;
|
||||
import emu.lunarcore.server.packet.Retcode;
|
||||
import emu.lunarcore.server.packet.send.PacketStartChallengeScRsp;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
@@ -119,18 +122,15 @@ public class ChallengeManager extends BasePlayerManager {
|
||||
info.save();
|
||||
}
|
||||
|
||||
public synchronized List<GameItem> takeRewards(int groupId, int starCount) {
|
||||
public synchronized List<TakenChallengeRewardInfo> takeRewards(int groupId) {
|
||||
// Get excels
|
||||
var challengeGroup = GameData.getChallengeGroupExcelMap().get(groupId);
|
||||
if (challengeGroup == null) return null;
|
||||
|
||||
var challengeReward = GameData.getChallengeRewardExcel(challengeGroup.getRewardLineGroupID(), starCount);
|
||||
if (challengeReward == null) return null;
|
||||
var challengeRewardLine = GameDepot.getChallengeRewardLines().get(challengeGroup.getRewardLineGroupID());
|
||||
if (challengeRewardLine == null) return null;
|
||||
|
||||
var rewardExcel = GameData.getRewardExcelMap().get(challengeReward.getRewardID());
|
||||
if (rewardExcel == null) return null;
|
||||
|
||||
// Validate
|
||||
// Get total stars
|
||||
int totalStars = 0;
|
||||
for (ChallengeHistory ch : this.getHistory().values()) {
|
||||
// Legacy compatibility
|
||||
@@ -148,22 +148,47 @@ public class ChallengeManager extends BasePlayerManager {
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the player has enough stars
|
||||
if (totalStars < starCount) {
|
||||
return null;
|
||||
// Rewards
|
||||
List<TakenChallengeRewardInfo> rewardInfos = new ArrayList<>();
|
||||
List<ItemParam> rewardItems = new ArrayList<>();
|
||||
|
||||
// Get challenge rewards
|
||||
for (var challengeReward : challengeRewardLine) {
|
||||
// Check if we have enough stars to take this reward
|
||||
if (totalStars < challengeReward.getStarCount()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get reward info
|
||||
var reward = this.getTakenRewards().computeIfAbsent(groupId, id -> new ChallengeGroupReward(getPlayer(), groupId));
|
||||
|
||||
// Check if reward has been taken
|
||||
if (reward.hasTakenReward(challengeReward.getStarCount())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Set reward as taken
|
||||
reward.setTakenReward(challengeReward.getStarCount());
|
||||
|
||||
// Get reward excel
|
||||
var rewardExcel = GameData.getRewardExcelMap().get(challengeReward.getRewardID());
|
||||
if (rewardExcel == null) continue;
|
||||
|
||||
// Add rewards
|
||||
var proto = TakenChallengeRewardInfo.newInstance()
|
||||
.setStarCount(challengeReward.getStarCount());
|
||||
|
||||
for (ItemParam itemParam : rewardExcel.getRewards()) {
|
||||
proto.getMutableReward().addItemList(itemParam.toProto());
|
||||
rewardItems.add(itemParam);
|
||||
}
|
||||
|
||||
rewardInfos.add(proto);
|
||||
}
|
||||
|
||||
// Get reward info
|
||||
var reward = this.getTakenRewards().computeIfAbsent(groupId, id -> new ChallengeGroupReward(getPlayer(), groupId));
|
||||
|
||||
if (reward.hasTakenReward(starCount)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
reward.setTakenReward(starCount);
|
||||
|
||||
// Add items to inventory
|
||||
return getPlayer().getInventory().addItemParams(rewardExcel.getRewards());
|
||||
getPlayer().getInventory().addItemParams(rewardItems);
|
||||
return rewardInfos;
|
||||
}
|
||||
|
||||
public void loadFromDatabase() {
|
||||
|
||||
@@ -2,8 +2,8 @@ package emu.lunarcore.server.packet.recv;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import emu.lunarcore.game.inventory.GameItem;
|
||||
import emu.lunarcore.proto.TakeChallengeRewardCsReqOuterClass.TakeChallengeRewardCsReq;
|
||||
import emu.lunarcore.proto.TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo;
|
||||
import emu.lunarcore.server.game.GameSession;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
import emu.lunarcore.server.packet.Opcodes;
|
||||
@@ -17,8 +17,8 @@ public class HandlerTakeChallengeRewardCsReq extends PacketHandler {
|
||||
public void handle(GameSession session, byte[] data) throws Exception {
|
||||
var req = TakeChallengeRewardCsReq.parseFrom(data);
|
||||
|
||||
List<GameItem> rewards = session.getPlayer().getChallengeManager().takeRewards(req.getGroupId(), req.getStarCount());
|
||||
session.send(new PacketTakeChallengeRewardScRsp(req.getGroupId(), req.getStarCount(), rewards));
|
||||
List<TakenChallengeRewardInfo> rewardInfos = session.getPlayer().getChallengeManager().takeRewards(req.getGroupId());
|
||||
session.send(new PacketTakeChallengeRewardScRsp(req.getGroupId(), rewardInfos));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,24 +2,23 @@ package emu.lunarcore.server.packet.send;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import emu.lunarcore.game.inventory.GameItem;
|
||||
import emu.lunarcore.proto.TakeChallengeRewardScRspOuterClass.TakeChallengeRewardScRsp;
|
||||
import emu.lunarcore.proto.TakenChallengeRewardInfoOuterClass.TakenChallengeRewardInfo;
|
||||
import emu.lunarcore.server.packet.BasePacket;
|
||||
import emu.lunarcore.server.packet.CmdId;
|
||||
|
||||
public class PacketTakeChallengeRewardScRsp extends BasePacket {
|
||||
|
||||
public PacketTakeChallengeRewardScRsp(int groupId, int starCount, Collection<GameItem> rewards) {
|
||||
public PacketTakeChallengeRewardScRsp(int groupId, Collection<TakenChallengeRewardInfo> rewards) {
|
||||
super(CmdId.TakeChallengeRewardScRsp);
|
||||
|
||||
var data = TakeChallengeRewardScRsp.newInstance();
|
||||
|
||||
if (rewards != null) {
|
||||
data.setGroupId(groupId)
|
||||
.setStarCount(starCount);
|
||||
data.setGroupId(groupId);
|
||||
|
||||
for (GameItem item : rewards) {
|
||||
data.getMutableReward().addItemList(item.toProto());
|
||||
for (var rewardInfo : rewards) {
|
||||
data.getMutableTakenRewardList().add(rewardInfo);
|
||||
}
|
||||
} else {
|
||||
data.setRetcode(1);
|
||||
|
||||
Reference in New Issue
Block a user