Fix challenge rewards not working due to new update behavior

This commit is contained in:
Melledy
2024-02-07 05:01:37 -08:00
parent e6f837c54d
commit 6e52dcdba2
11 changed files with 516 additions and 260 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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() {

View File

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

View File

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