fix some events (most events are available)

This commit is contained in:
Somebody
2024-02-02 19:35:23 +08:00
committed by Melledy
parent bac849d72a
commit c079e17070
30 changed files with 3480 additions and 211 deletions

View File

@@ -6,6 +6,10 @@ public abstract class GameResource implements Comparable<GameResource> {
public void onLoad() {
}
public void onFinalize() {
}
@Override

View File

@@ -6,6 +6,7 @@ import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
import emu.lunarcore.data.config.*;
import org.reflections.Reflections;
import com.google.gson.Gson;
@@ -17,11 +18,7 @@ import com.google.gson.reflect.TypeToken;
import emu.lunarcore.LunarCore;
import emu.lunarcore.data.ResourceDeserializers.LunarCoreDoubleDeserializer;
import emu.lunarcore.data.ResourceDeserializers.LunarCoreHashDeserializer;
import emu.lunarcore.data.config.FloorInfo;
import emu.lunarcore.data.config.FloorInfo.FloorGroupSimpleInfo;
import emu.lunarcore.data.config.GroupInfo;
import emu.lunarcore.data.config.SkillAbilityInfo;
import emu.lunarcore.data.config.SummonUnitInfo;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
public class ResourceLoader {
@@ -46,7 +43,9 @@ public class ResourceLoader {
loadMazeAbilities();
// Load rogue maps
loadRogueMapGen();
// Load rogue dialogue events
loadRogueDialogueEvent();
// Done
loaded = true;
LunarCore.getLogger().info("Resource loading complete");
@@ -164,6 +163,14 @@ public class ResourceLoader {
}
});
if (map != null) {
map.forEach((k, v) -> {
if (v instanceof GameResource) {
((GameResource) v).onFinalize();
}
});
}
return count.get();
}
}
@@ -286,6 +293,37 @@ public class ResourceLoader {
// Done
LunarCore.getLogger().info("Loaded " + count + " maze abilities for avatars.");
}
// Might be better to cache
private static void loadRogueDialogueEvent() {
// Loaded configs count
int count = 0;
// Load dialogue event configs
for (var dialogueEventExcel : GameData.getRogueDialogueEventList().values()) {
// Get file
File file = new File(LunarCore.getConfig().getResourceDir() + "/" + dialogueEventExcel.getJsonPath());
if (!file.exists()) {
file = new File(LunarCore.getConfig().getResourceDir() + "/" + dialogueEventExcel.getSecondPath());
if (!file.exists()) continue;
}
try (FileReader reader = new FileReader(file)) {
RogueDialogueEventInfo info = gson.fromJson(reader, RogueDialogueEventInfo.class);
dialogueEventExcel.setInfo(info);
count++;
} catch (Exception e) {
e.printStackTrace();
}
}
// Notify the server owner if we are missing any files
if (count < GameData.getRogueDialogueEventList().size()) {
//LunarCore.getLogger().warn("Rogue dialogue event configs are missing, please check your resources folder: {resources}/Config/Level/RogueDialogue/RogueDialogueEvent/Act. Rogue event may not work!");
}
// Done
LunarCore.getLogger().info("Loaded " + count + " rogue events.");
}
private static void loadRogueMapGen() {
File file = new File(LunarCore.getConfig().getDataDir() + "/RogueMapGen.json");

View File

@@ -0,0 +1,39 @@
package emu.lunarcore.data.config;
import com.google.gson.annotations.SerializedName;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
/**
* Original name: LevelRogueDialogueEvent
*/
@Getter
public class RogueDialogueEventInfo {
private List<RogueDialogueEvent> OnInitSequece = new ArrayList<>();
private List<RogueDialogueEvent> OnStartSequece = new ArrayList<>();
@Getter
public static class RogueDialogueEvent {
private List<TaskListInfo> TaskList = new ArrayList<>();
}
@Getter
public static class TaskListInfo {
@SerializedName("$type") public String Type = "";
private List<OptionListInfo> OptionList = new ArrayList<>();
private CustomStringInfo CustomString = new CustomStringInfo();
}
@Getter
public static class OptionListInfo {
private String TriggerCustomString;
private int DialogueEventID;
}
@Getter
public static class CustomStringInfo {
private String Value;
}
}

View File

@@ -4,15 +4,17 @@ import emu.lunarcore.data.GameData;
import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType;
import emu.lunarcore.data.ResourceType.LoadPriority;
import emu.lunarcore.data.config.RogueDialogueEventInfo;
import emu.lunarcore.game.enums.DialogueEventCostType;
import emu.lunarcore.game.enums.DialogueEventType;
import emu.lunarcore.game.rogue.RogueBuffType;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@ResourceType(name = {"DialogueEvent.json"}, loadPriority = LoadPriority.LOW)
@ResourceType(name = {"DialogueEvent.json"})
public class DialogueEventExcel extends GameResource {
public int EventID;
public DialogueEventType RogueEffectType;
@@ -21,6 +23,8 @@ public class DialogueEventExcel extends GameResource {
public List<Integer> CostParamList;
public List<Integer> ConditionIDList;
public RogueBuffType AeonOption;
@Setter private RogueDialogueEventInfo info;
@Override
public int getId() {
return EventID;
@@ -30,4 +34,12 @@ public class DialogueEventExcel extends GameResource {
public void onLoad() {
GameData.getRogueDialogueEventList().put(EventID, this);
}
public String getJsonPath() {
return "Config/Level/RogueDialogue/RogueDialogueEvent/Act/Act00" + this.getId() + ".json";
}
public String getSecondPath() {
return "Config/Level/RogueDialogue/RogueDialogueEvent/Act/Act4038" + this.getId() + ".json";
}
}

View File

@@ -1,5 +1,6 @@
package emu.lunarcore.data.excel;
import emu.lunarcore.LunarCore;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType;
@@ -8,7 +9,9 @@ import emu.lunarcore.game.rogue.RogueBuffData;
import lombok.Getter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Getter
@ResourceType(name = {"RogueBuffGroup.json"}, loadPriority = LoadPriority.LOW)
@@ -16,7 +19,7 @@ public class RogueBuffGroupExcel extends GameResource {
private int JHOKDPADHFM; // RogueBuffGroupID
private List<Integer> ADJICNNJFEM; // RogueBuffTagList or RogueBuffGroupList
private List<RogueBuffData> rogueBuffList = new ArrayList<>();
private transient Set<RogueBuffData> rogueBuffList = new HashSet<>();
@Override
public int getId() {
@@ -35,7 +38,26 @@ public class RogueBuffGroupExcel extends GameResource {
if (rogueBuffGroup != null) rogueBuffList.addAll(rogueBuffGroup.getRogueBuffList());
}
}
GameData.getRogueBuffGroupExcelMap().put(JHOKDPADHFM, this);
}
@Override
public void onFinalize() {
for (int rogueTagId : ADJICNNJFEM) {
if (rogueTagId >= 1000000 && rogueTagId <= 9999999) {
var rogueBuff = GameData.getRogueBuffTagExcelMap().get(rogueTagId);
if (rogueBuff != null) rogueBuffList.add(new RogueBuffData(rogueBuff.getMazeBuffID(), rogueBuff.getMazeBuffLevel()));
} else {
// RogueBuffGroup
var rogueBuffGroup = GameData.getRogueBuffGroupExcelMap().get(rogueTagId);
if (rogueBuffGroup == null)
continue;
if(rogueBuffGroup.getRogueBuffList().isEmpty()) {
rogueBuffGroup.onFinalize();
}
rogueBuffList.addAll(rogueBuffGroup.getRogueBuffList());
}
}
}
}

View File

@@ -1,8 +1,11 @@
package emu.lunarcore.game.rogue;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.GameDepot;
import emu.lunarcore.data.excel.RogueBuffExcel;
import emu.lunarcore.proto.ItemCostListOuterClass.ItemCostList;
@@ -24,19 +27,21 @@ public class RogueBuffSelectMenu {
// Cache
private transient WeightedList<RogueBuffExcel> randomBuffs;
private transient Set<RogueBuffData> allRandomBuffs;
@Deprecated // Morphia only!
public RogueBuffSelectMenu() {}
public RogueBuffSelectMenu(RogueInstance rogue) {
this(rogue, false);
this(rogue, false, GameData.getRogueBuffGroupExcelMap().get(110002).getRogueBuffList());
}
public RogueBuffSelectMenu(RogueInstance rogue, boolean generateAeonBuffs) {
public RogueBuffSelectMenu(RogueInstance rogue, boolean generateAeonBuffs, Set<RogueBuffData> buffs) {
this.rogue = rogue;
this.maxBuffs = 3;
this.maxRerolls = rogue.getBaseRerolls();
this.buffs = new ArrayList<>();
this.allRandomBuffs = buffs;
if (generateAeonBuffs) {
this.generateAeonBuffs();
@@ -45,6 +50,10 @@ public class RogueBuffSelectMenu {
}
}
public RogueBuffSelectMenu(RogueInstance rogue, boolean generateAeonBuffs) {
this(rogue, generateAeonBuffs, new HashSet<>());
}
public void setMaxRerolls(int i) {
this.maxBuffs = i;
}
@@ -62,19 +71,19 @@ public class RogueBuffSelectMenu {
if (this.randomBuffs == null) {
this.randomBuffs = new WeightedList<>();
for (var excel : GameDepot.getRogueRandomBuffList()) {
if (rogue.getBuffs().containsKey(excel.getMazeBuffID())) {
for (var excel : this.getAllRandomBuffs()) {
if (rogue.getBuffs().containsKey(excel.getExcel().getMazeBuffID())) {
continue;
}
// Calculate buff weights
double weight = 10.0 / excel.getRogueBuffRarity();
double weight = 10.0 / excel.getExcel().getRogueBuffRarity();
if (getRogue().getAeonBuffType() == excel.getRogueBuffType()) {
if (getRogue().getAeonBuffType() == excel.getExcel().getRogueBuffType()) {
weight *= 2;
}
this.randomBuffs.add(weight, excel);
this.randomBuffs.add(weight, excel.getExcel());
};
}

View File

@@ -17,12 +17,9 @@ import emu.lunarcore.game.scene.entity.EntityMonster;
import emu.lunarcore.game.scene.entity.EntityNpc;
import emu.lunarcore.game.scene.entity.EntityProp;
import emu.lunarcore.game.scene.entity.extra.PropRogueData;
import emu.lunarcore.proto.RogueDialogueEventParamOuterClass.RogueDialogueEventParam;
import emu.lunarcore.server.packet.send.PacketSyncRogueDialogueEventDataScNotify;
import emu.lunarcore.util.Utils;
import java.util.ArrayList;
public class RogueEntityLoader extends SceneEntityLoader {
@Override
@@ -136,19 +133,18 @@ public class RogueEntityLoader extends SceneEntityLoader {
// Add rogue dialogue
if (npc.getNpcId() == 3013) {
RogueNPCExcel rogueNpcExcel = Utils.randomElement(GameDepot.getRogueRandomNpcList());
npc.setRogueNpcId(rogueNpcExcel.getId());
var params = new ArrayList<RogueDialogueEventParam>();
var start = rogueNpcExcel.getId();
while (true) {
var event = GameData.getRogueDialogueEventList().get(start);
if (event == null) break;
params.add(RogueDialogueEventParam.newInstance()
.setDialogueEventId(start)
.setIsValid(true));
start++;
}
scene.getPlayer().sendPacket(new PacketSyncRogueDialogueEventDataScNotify(rogueNpcExcel.getId(), params));
int npcId;
RogueInstance instance;
do {
RogueNPCExcel rogueNpcExcel = Utils.randomElement(GameDepot.getRogueRandomNpcList());
npcId = rogueNpcExcel.getId();
instance = scene.getPlayer().getRogueInstance();
} while (instance.setDialogueParams(npcId) == null);
npc.setRogueNpcId(npcId);
npc.setEventId(++instance.eventId);
scene.getPlayer().sendPacket(new PacketSyncRogueDialogueEventDataScNotify(npcId, instance.curDialogueParams.get(npcId),
instance.eventId));
}
return npc;

View File

@@ -1,7 +1,14 @@
package emu.lunarcore.game.rogue;
import emu.lunarcore.LunarCore;
import emu.lunarcore.data.GameData;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.scene.entity.EntityNpc;
import emu.lunarcore.proto.FinishRogueDialogueGroupCsReqOuterClass;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.recv.HandlerFinishRogueDialogueGroupCsReq;
import emu.lunarcore.server.packet.send.PacketSyncRogueCommonPendingActionScNotify;
import emu.lunarcore.util.WeightedList;
import lombok.Getter;
@@ -17,15 +24,19 @@ public class RogueEventManager {
this.player = rogueInstance.getPlayer();
}
public void handleEvent(int eventId) {
public int handleEvent(int eventId) {
var event = GameData.getRogueDialogueEventList().get(eventId);
if (event == null || event.getRogueEffectType() == null) return;
if (event == null || event.getRogueEffectType() == null) return 0;
List<Integer> param = event.getRogueEffectParamList();
switch (event.getRogueEffectType()) {
case GetItem -> rogueInstance.setMoney(rogueInstance.getMoney() + param.get(1));
case TriggerBattle -> this.getPlayer().getServer().getBattleService().startBattle(player, param.get(0));
case GetItem -> rogueInstance.addDialogueMoney(param.get(1));
case TriggerBattle -> {
//this.getPlayer().getServer().getBattleService().startBattle(player, param.get(0));
}
case TriggerRogueMiracleSelect -> this.getRogueInstance().createMiracleSelect(1);
case TriggerRogueBuffSelect -> this.getRogueInstance().createBuffSelect(1);
case TriggerRogueBuffSelect -> {
this.getRogueInstance().createBuffSelect(param.get(2), param.get(0));
}
case GetRogueBuff -> {
var rogueBuff = GameData.getRogueBuffGroupExcelMap().get(param.get(0));
if (rogueBuff != null) {
@@ -48,8 +59,27 @@ public class RogueEventManager {
var rogueBuff = GameData.getRogueBuffGroupExcelMap().get(param.get(0));
this.getRogueInstance().addBuff(rogueBuff.getRogueBuffList());
}
case TriggerDialogueEventList -> {
for (var id : param) {
this.handleEvent(id);
}
}
case TriggerRandomEventList -> {
this.handleEvent(11604); // temp
handleCost(eventId);
return 0;
}
case GetAllRogueBuffInGroupAndGetItem -> {
var rogueBuff = GameData.getRogueBuffGroupExcelMap().get(param.get(0));
this.getRogueInstance().addBuff(rogueBuff.getRogueBuffList());
this.getRogueInstance().addDialogueMoney(param.get(2));
}
default -> {
LunarCore.getLogger().info("RogueEventManager: unhandled event type: " + event.getRogueEffectType()); // DEBUG
}
}
handleCost(eventId);
return 0;
}
public void handleCost(int eventId) {

View File

@@ -4,9 +4,7 @@ import java.util.*;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.config.AnchorInfo;
import emu.lunarcore.data.excel.RogueAeonExcel;
import emu.lunarcore.data.excel.RogueAreaExcel;
import emu.lunarcore.data.excel.RogueMapExcel;
import emu.lunarcore.data.excel.*;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.enums.RogueBuffAeonType;
import emu.lunarcore.game.inventory.GameItem;
@@ -20,9 +18,11 @@ import emu.lunarcore.proto.HandleRogueCommonPendingActionScRspOuterClass.HandleR
import emu.lunarcore.proto.RogueAeonOuterClass.RogueAeon;
import emu.lunarcore.proto.RogueAvatarInfoOuterClass.RogueAvatarInfo;
import emu.lunarcore.proto.RogueBuffInfoOuterClass.RogueBuffInfo;
import emu.lunarcore.proto.RogueBuffOuterClass.RogueBuff;
import emu.lunarcore.proto.RogueBuffSourceOuterClass.RogueBuffSource;
import emu.lunarcore.proto.RogueCommonPendingActionOuterClass.RogueCommonPendingAction;
import emu.lunarcore.proto.RogueCurrentInfoOuterClass.RogueCurrentInfo;
import emu.lunarcore.proto.RogueDialogueEventParamOuterClass.RogueDialogueEventParam;
import emu.lunarcore.proto.RogueFinishInfoOuterClass.RogueFinishInfo;
import emu.lunarcore.proto.RogueMapInfoOuterClass.RogueMapInfo;
import emu.lunarcore.proto.RogueMiracleInfoOuterClass.RogueMiracleInfo;
@@ -33,6 +33,8 @@ import emu.lunarcore.proto.RogueStatusOuterClass.RogueStatus;
import emu.lunarcore.proto.RogueVirtualItemOuterClass.RogueVirtualItem;
import emu.lunarcore.server.packet.send.*;
import emu.lunarcore.util.Utils;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
import us.hebi.quickbuf.RepeatedInt;
@@ -52,20 +54,25 @@ public class RogueInstance {
private Map<Integer, RogueBuffData> buffs;
private Map<Integer, RogueMiracleData> miracles;
private int pendingBuffSelects;
//private int pendingBuffSelects;
private List<Set<RogueBuffData>> pendingBuffSelects = new ArrayList<>();
private RogueBuffSelectMenu buffSelect;
private int pendingMiracleSelects;
private RogueMiracleSelectMenu miracleSelect;
private int pendingBonusSelects;
private RogueBonusSelectMenu bonusSelect;
private RogueCommonPendingAction pendingAction;
public RogueCommonPendingAction pendingAction;
private int baseRerolls;
private int aeonId;
private int aeonBuffType;
private int maxAeonBuffs;
private int money; // universal debris
private int id = 2; // idk what this is for, but it's needed for the packet
public int id = 2; // idk what this is for, but it's needed for the packet
public int eventId = 690;
public Int2ObjectMap<List<RogueDialogueEventParam>> curDialogueParams = new Int2ObjectOpenHashMap<>();
private final Set<RogueBuffData> normalBuff = GameData.getRogueBuffGroupExcelMap().get(100005).getRogueBuffList();
private final Set<RogueBuffData> uncommonBuff = GameData.getRogueBuffGroupExcelMap().get(100003).getRogueBuffList();
private int roomScore;
private int earnedTalentCoin;
@@ -121,7 +128,7 @@ public class RogueInstance {
}
// Extra blessings
if (player.getRogueManager().hasTalent(21)) {
this.pendingBuffSelects += 1;
this.pendingBuffSelects.add(normalBuff);
}
}
@@ -169,22 +176,46 @@ public class RogueInstance {
}
}
public synchronized void createBuffSelect(int amount) {
this.pendingBuffSelects += amount;
public synchronized void createBuffSelect(int amount, int groupId) {
var buffs = GameData.getRogueBuffGroupExcelMap().get(groupId).getRogueBuffList();
if (!buffs.isEmpty()) {
for (int i = 0; i < amount; i++) {
this.pendingBuffSelects.add(buffs);
}
RogueBuffSelectMenu buffSelect = this.updateBuffSelect();
}
RogueBuffSelectMenu buffSelect = this.updateBuffSelect();
// if (buffSelect != null) {
// getPlayer().sendPacket(new PacketSyncRogueBuffSelectInfoScNotify(buffSelect));
// }
}
public synchronized void createBuffSelect(int amount, Set<RogueBuffData> buffs) {
if (!buffs.isEmpty()) {
for (int i = 0; i < amount; i++) {
this.pendingBuffSelects.add(buffs);
}
RogueBuffSelectMenu buffSelect = this.updateBuffSelect();
}
// if (buffSelect != null) {
// getPlayer().sendPacket(new PacketSyncRogueBuffSelectInfoScNotify(buffSelect));
// }
}
public synchronized void createBuffSelect(int amount) {
for (int i = 0; i < amount; i++) {
this.pendingBuffSelects.add(normalBuff);
}
RogueBuffSelectMenu buffSelect = this.updateBuffSelect();
}
public synchronized RogueBuffSelectMenu updateBuffSelect() {
if (this.getBuffSelect() == null) {
// Creates a new blessing selection menu if we have any pending buff selects
if (this.pendingBuffSelects > 0) {
if (!this.pendingBuffSelects.isEmpty()) {
// Regular blessing selection with 3 random blessings
this.buffSelect = new RogueBuffSelectMenu(this, false);
this.pendingBuffSelects--;
this.buffSelect = new RogueBuffSelectMenu(this, false, this.pendingBuffSelects.get(0));
this.pendingBuffSelects.remove(0);
} else if (this.getAeonId() != 0) {
// Check if we should add aeon blessings
if (shouldAddAeonBuff()) {
@@ -257,18 +288,34 @@ public class RogueInstance {
return buff;
}
public synchronized void addBuff(List<RogueBuffData> buffs) {
public synchronized void addBuff(Set<RogueBuffData> buffs) {
for (var buff : buffs) {
this.addBuff(buff);
}
}
public synchronized void addBuff(RogueBuffData buff) {
this.addBuff(buff, RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_DIALOGUE);
}
public synchronized void addBuff(RogueBuffData buff, RogueBuffSource source) {
this.getBuffs().put(buff.getId(), buff);
getPlayer().sendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_DIALOGUE, buff.toDataProto()));
getPlayer().sendPacket(new PacketSyncRogueCommonActionResultScNotify(source, buff.toDataProto()));
this.updateBuffSelect();
}
public synchronized RogueBuff enhanceBuff(int buffId) {
var buff = this.getBuffs().get(buffId);
if (buff == null) return null;
var cost = 100 + (buff.getExcel().getRogueBuffRarity() - 1) * 30;
if (this.getMoney() < cost) return null;
this.setMoney(this.getMoney() - cost);
this.getBuffs().remove(buffId);
this.addBuff(new RogueBuffData(buff.getId(), buff.getLevel() + 1), RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_ENHANCE);
return RogueBuff.newInstance()
.setBuffId(buffId)
.setLevel(buff.getLevel() + 1);
}
public synchronized void createMiracleSelect(int amount) {
this.pendingMiracleSelects += amount;
@@ -368,16 +415,25 @@ public class RogueInstance {
data.getMutableBonusSelect();
data.setTimes(this.id - 2);
this.getPlayer().sendPacket(new PacketHandleRogueCommonPendingActionScRsp(data));
this.onSelectDialogue(bonus.getEventId());
try {
this.onSelectDialogue(bonus.getEventId());
} catch (Exception ignored) {
}
return bonus;
}
public synchronized void setMoney(int money) {
if (this.money <= money) {
getPlayer().sendPacket(new PacketScenePlaneEventScNotify(new GameItem(31, money - this.money)));
this.getPlayer().sendPacket(new PacketScenePlaneEventScNotify(new GameItem(31, money - this.money)));
}
this.money = money;
getPlayer().sendPacket(new PacketSyncRogueVirtualItemInfoScNotify(this.getPlayer()));
this.getPlayer().sendPacket(new PacketSyncRogueVirtualItemInfoScNotify(this.getPlayer()));
}
public synchronized void addDialogueMoney(int money) {
this.money += money;
this.getPlayer().sendPacket(new PacketSyncRogueVirtualItemInfoScNotify(this.getPlayer()));
this.getPlayer().sendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_DIALOGUE, money));
}
public synchronized void pickAvatar(RepeatedInt avatarId) {
@@ -390,6 +446,62 @@ public class RogueInstance {
this.getPlayer().sendPacket(new PacketPickRogueAvatarScRsp(newAvatarIds));
}
public synchronized List<RogueDialogueEventParam> setDialogueParams(int npcId) {
try {
this.curDialogueParams.clear();
DialogueEventExcel event = GameData.getRogueDialogueEventList().get(npcId);
var sequence = event.getInfo().getOnStartSequece();
ArrayList<RogueDialogueEventParam> params = new ArrayList<>();
Int2ObjectMap<String> map = new Int2ObjectOpenHashMap<>();
Map<String, String> argMap = new HashMap<>();
for (var e : sequence) {
var talkList = e.getTaskList();
var tempName = "";
for (var talk : talkList) {
if (talk.getOptionList() != null && !talk.getOptionList().isEmpty()){
for (var option : talk.getOptionList()) {
if (option.getDialogueEventID() != 0) {
map.put(option.getDialogueEventID(), option.getTriggerCustomString());
}
}
continue;
}
if (talk.Type.equals("RPG.GameCore.WaitCustomString")) {
tempName = talk.getCustomString().getValue();
continue;
}
if (!Objects.equals(tempName, "") && talk.Type.equals("RPG.GameCore.TriggerCustomString")) {
argMap.put(tempName, talk.getCustomString().getValue());
tempName = "";
}
}
}
map.forEach((k, v) -> {
var param = RogueDialogueEventParam.newInstance()
.setDialogueEventId(k)
.setIsValid(true);
if (argMap.containsKey(v) && argMap.get(v).equals("RelateToBuff")) {
param.setArgId(this.getAeonId());
}
params.add(param);
});
this.getCurDialogueParams().put(npcId, params);
return params;
} catch (Exception e) {
return null;
}
}
public synchronized RogueRoomData enterRoom(int siteId) {
// Set status on previous room
RogueRoomData prevRoom = this.getCurrentRoom();
@@ -448,8 +560,8 @@ public class RogueInstance {
// Dialogue stuff
public void onSelectDialogue(int dialogueEventId) {
this.eventManager.handleEvent(dialogueEventId);
public int onSelectDialogue(int dialogueEventId) {
return this.eventManager.handleEvent(dialogueEventId);
}
// Battle
@@ -483,7 +595,12 @@ public class RogueInstance {
} else {
// Give blessings to player
int amount = battle.getNpcMonsters().size();
this.createBuffSelect(amount);
if (this.getCurrentRoom().getExcel().getRogueRoomType() == 6) { // area boss
this.createBuffSelect(amount, this.getUncommonBuff());
} else {
this.createBuffSelect(amount);
}
this.setMoney(this.getMoney() + Utils.randomRange(20, 80) * amount);
}
} else {
this.getPlayer().getRogueManager().quitRogue();

View File

@@ -24,6 +24,7 @@ public class EntityNpc implements GameEntity {
@Setter private int rogueNpcId;
@Setter private boolean isDialogueFinished = false;
@Setter private int eventId = 0;
public EntityNpc(Scene scene, GroupInfo group, NpcInfo npcInfo) {
this.scene = scene;
@@ -44,7 +45,8 @@ public class EntityNpc implements GameEntity {
if (this.rogueNpcId > 0) {
var rogue = NpcRogueInfo.newInstance()
.setRogueNpcId(this.rogueNpcId)
.setFinishDialogue(isDialogueFinished);
.setFinishDialogue(isDialogueFinished)
.setGBMDBBBMBEJ(eventId);
npc.getMutableExtraInfo().setRogueInfo(rogue);
}

View File

@@ -0,0 +1,20 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.proto.EnhanceRogueBuffCsReqOuterClass.EnhanceRogueBuffCsReq;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketEnhanceRogueBuffScRsp;
@Opcodes(CmdId.EnhanceRogueBuffCsReq)
public class HandlerEnhanceRogueBuffCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] data) throws Exception {
var proto = EnhanceRogueBuffCsReq.parseFrom(data);
var buffId = proto.getBuffId();
var buff = session.getPlayer().getRogueInstance().enhanceBuff(buffId);
session.send(new PacketEnhanceRogueBuffScRsp(buff));
}
}

View File

@@ -0,0 +1,15 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketGetRogueBuffEnhanceInfoScRsp;
@Opcodes(CmdId.GetRogueBuffEnhanceInfoCsReq)
public class HandlerGetRogueBuffEnhanceInfoCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] data) throws Exception {
session.send(new PacketGetRogueBuffEnhanceInfoScRsp(session.getPlayer()));
}
}

View File

@@ -9,7 +9,7 @@ import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketSceneGroupRefreshScNotify;
@Opcodes(CmdId.RogueNpcDisappearCsReq)
public class HandleRogueNpcDisappearCsReq extends PacketHandler {
public class HandlerRogueNpcDisappearCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] data) throws Exception {
var req = RogueNpcDisappearCsReq.parseFrom(data);

View File

@@ -1,7 +1,6 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.game.scene.entity.EntityNpc;
import emu.lunarcore.proto.FinishRogueDialogueGroupCsReqOuterClass.FinishRogueDialogueGroupCsReq;
import emu.lunarcore.proto.SelectRogueDialogueEventCsReqOuterClass.SelectRogueDialogueEventCsReq;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
@@ -15,17 +14,17 @@ public class HandlerSelectRogueDialogueEventCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] data) throws Exception {
var req = SelectRogueDialogueEventCsReq.parseFrom(data);
if (session.getPlayer().getRogueInstance() != null) {
session.getPlayer().getRogueInstance().onSelectDialogue(req.getDialogueEventId());
}
EntityNpc npc = (EntityNpc)session.getPlayer().getScene().getEntityById(req.getEntityId());
session.send(new PacketSelectRogueDialogueEventScRsp(req.getDialogueEventId(), npc));
new HandlerFinishRogueDialogueGroupCsReq().handle(session, FinishRogueDialogueGroupCsReq.newInstance() // using it before the event is implemented
.setEntityId(req.getEntityId())
.toByteArray());
if (npc == null) return;
int callback = 0;
if (session.getPlayer().getRogueInstance() != null) {
callback = session.getPlayer().getRogueInstance().onSelectDialogue(req.getDialogueEventId());
}
session.send(new PacketSelectRogueDialogueEventScRsp(req.getDialogueEventId(), npc, callback));
}
}

View File

@@ -0,0 +1,18 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.proto.EnhanceRogueBuffScRspOuterClass.EnhanceRogueBuffScRsp;
import emu.lunarcore.proto.RogueBuffOuterClass.RogueBuff;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketEnhanceRogueBuffScRsp extends BasePacket {
public PacketEnhanceRogueBuffScRsp(RogueBuff buff) {
super(CmdId.EnhanceRogueBuffScRsp);
var proto = EnhanceRogueBuffScRsp.newInstance()
.setIsSuccess(true)
.setRogueBuff(buff);
this.setData(proto);
}
}

View File

@@ -0,0 +1,42 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.data.excel.RogueBuffExcel;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.proto.GetRogueBuffEnhanceInfoScRspOuterClass.GetRogueBuffEnhanceInfoScRsp;
import emu.lunarcore.proto.ItemCostListOuterClass.ItemCostList;
import emu.lunarcore.proto.ItemCostOuterClass.ItemCost;
import emu.lunarcore.proto.ItemCostOuterClass.PileItem;
import emu.lunarcore.proto.RogueBuffEnhanceInfoOuterClass.RogueBuffEnhanceInfo;
import emu.lunarcore.proto.RogueBuffEnhanceShopInfoOuterClass.RogueBuffEnhanceShopInfo;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketGetRogueBuffEnhanceInfoScRsp extends BasePacket {
public PacketGetRogueBuffEnhanceInfoScRsp(Player player) {
super(CmdId.GetRogueBuffEnhanceInfoScRsp);
var buffs = player.getRogueInstance().getBuffs();
var proto = GetRogueBuffEnhanceInfoScRsp.newInstance();
var shop = RogueBuffEnhanceShopInfo.newInstance();
for (var buff : buffs.values()) {
if (buff.getLevel() > 1) continue;
shop.addBuffInfo(RogueBuffEnhanceInfo.newInstance()
.setBuffId(buff.getId())
.setItemCostList(this.getItemCostList(buff.getExcel()))
.setHNHFMFCDCOC(1));
}
proto.setShopInfo(shop);
this.setData(proto);
}
public ItemCostList getItemCostList(RogueBuffExcel excel) {
int cost = 100 + (excel.getRogueBuffRarity() - 1) * 30;
return ItemCostList.newInstance()
.addItemList(ItemCost.newInstance()
.setPileItem(PileItem.newInstance()
.setItemId(31)
.setItemNum(cost)));
}
}

View File

@@ -1,47 +1,45 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.GameDepot;
import emu.lunarcore.data.excel.RogueNPCExcel;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.game.scene.entity.EntityNpc;
import emu.lunarcore.proto.MEMPJPLINCNOuterClass.MEMPJPLINCN;
import emu.lunarcore.proto.RogueDialogueEventOuterClass.RogueDialogueEvent;
import emu.lunarcore.proto.RogueDialogueEventParamOuterClass.RogueDialogueEventParam;
import emu.lunarcore.proto.SelectRogueDialogueEventScRspOuterClass.SelectRogueDialogueEventScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.util.Utils;
import java.util.ArrayList;
public class PacketSelectRogueDialogueEventScRsp extends BasePacket {
public PacketSelectRogueDialogueEventScRsp(int dialogueEventId, EntityNpc npc) {
public PacketSelectRogueDialogueEventScRsp(int dialogueEventId, EntityNpc npc, int nextEventId) {
super(CmdId.SelectRogueDialogueEventScRsp);
var data = SelectRogueDialogueEventScRsp.newInstance()
.setDialogueEventId(dialogueEventId);
RogueNPCExcel rogueNpcExcel = Utils.randomElement(GameDepot.getRogueRandomNpcList());
var params = new ArrayList<RogueDialogueEventParam>();
var start = rogueNpcExcel.getId();
while (true) {
var event = GameData.getRogueDialogueEventList().get(start);
if (event == null) break;
params.add(RogueDialogueEventParam.newInstance()
.setDialogueEventId(start)
.setIsValid(true));
start++;
var instance = npc.getScene().getPlayer().getRogueInstance();
var params = instance.curDialogueParams.get(npc.getRogueNpcId());
if (params == null) {
params = instance.setDialogueParams(npc.getRogueNpcId());
}
var event = RogueDialogueEvent.newInstance()
.setNpcId(npc.getRogueNpcId())
.setGameModeType(5)
.addAllNNOHLEAOJPP(dialogueEventId)
.addSelectEventId(dialogueEventId)
.setGBMDBBBMBEJ(instance.getEventId())
.addAllRogueDialogueEventParam(params.toArray(RogueDialogueEventParam[]::new));
var l = MEMPJPLINCN.newInstance();
for (var param : params) {
l.addBLGIMDCNDHJ(param.getDialogueEventId());
}
if (nextEventId != 0) {
l.addBLGIMDCNDHJ(nextEventId);
}
data.addLELKNNDCGJM(l);
data.setEventData(event);
this.setData(data);
}
}

View File

@@ -5,6 +5,7 @@ import emu.lunarcore.proto.RogueMiracleDataOuterClass.RogueMiracleData;
import emu.lunarcore.proto.RogueActionResultDataOuterClass.RogueActionResultData;
import emu.lunarcore.proto.RogueActionResultOuterClass.RogueActionResult;
import emu.lunarcore.proto.RogueBuffSourceOuterClass.RogueBuffSource;
import emu.lunarcore.proto.RogueVirtualItemDataOuterClass.RogueVirtualItemData;
import emu.lunarcore.proto.SyncRogueCommonActionResultScNotifyOuterClass.SyncRogueCommonActionResultScNotify;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
@@ -13,7 +14,8 @@ public class PacketSyncRogueCommonActionResultScNotify extends BasePacket {
public PacketSyncRogueCommonActionResultScNotify(RogueActionResult action) {
super(CmdId.SyncRogueCommonActionResultScNotify);
var proto = SyncRogueCommonActionResultScNotify.newInstance();
var proto = SyncRogueCommonActionResultScNotify.newInstance()
.setOCPBNBPAMEN(101);
proto.setAction(action);
@@ -35,4 +37,10 @@ public class PacketSyncRogueCommonActionResultScNotify extends BasePacket {
this(source, RogueActionResultData.newInstance()
.setAddBuffList(buff));
}
public PacketSyncRogueCommonActionResultScNotify(RogueBuffSource source, int addMoneyNum) {
this(source, RogueActionResultData.newInstance()
.setAddItemList(RogueVirtualItemData.newInstance()
.setNum(addMoneyNum)));
}
}

View File

@@ -27,6 +27,10 @@ public class PacketSyncRogueCommonPendingActionScNotify extends BasePacket {
.setRogueAction(action));
}
public PacketSyncRogueCommonPendingActionScNotify(int id) {
this(RogueAction.newInstance(), id);
}
public PacketSyncRogueCommonPendingActionScNotify(RogueCommonBuffSelectInfo info, int id) {
this(RogueAction.newInstance()
.setBuffSelectInfo(info), id);

View File

@@ -1,5 +1,6 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.LunarCore;
import emu.lunarcore.proto.RogueDialogueEventOuterClass.RogueDialogueEvent;
import emu.lunarcore.proto.RogueDialogueEventParamOuterClass.RogueDialogueEventParam;
import emu.lunarcore.proto.SyncRogueDialogueEventDataScNotifyOuterClass.SyncRogueDialogueEventDataScNotify;
@@ -14,14 +15,15 @@ public class PacketSyncRogueDialogueEventDataScNotify extends BasePacket {
var proto = SyncRogueDialogueEventDataScNotify.newInstance()
.addRogueDialogueEvent(event);
this.setData(proto);
}
public PacketSyncRogueDialogueEventDataScNotify(int rogueNpcId, List<RogueDialogueEventParam> params) {
public PacketSyncRogueDialogueEventDataScNotify(int rogueNpcId, List<RogueDialogueEventParam> params, int eventId) {
this(RogueDialogueEvent.newInstance()
.setGameModeType(5) // rogue explore
.setNpcId(rogueNpcId)
.setGBMDBBBMBEJ(eventId)
.addAllRogueDialogueEventParam(params.toArray(RogueDialogueEventParam[]::new)));
}
}