From 1f4b1b47702d6e8e48b88acd7474863417943b05 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 2 Oct 2023 08:38:39 -0700 Subject: [PATCH] Added basic support for challenges --- .../java/emu/lunarcore/data/GameData.java | 1 + .../lunarcore/data/excel/ChallengeExcel.java | 29 +++++++++++++++ .../game/challenge/ChallengeService.java | 28 ++++++++++++++ .../emu/lunarcore/server/game/GameServer.java | 5 ++- .../recv/HandlerStartChallengeCsReq.java | 19 ++++++++++ .../send/PacketStartChallengeScRsp.java | 37 +++++++++++++++++++ 6 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java create mode 100644 src/main/java/emu/lunarcore/game/challenge/ChallengeService.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketStartChallengeScRsp.java diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java index 06b696d..8cbd715 100644 --- a/src/main/java/emu/lunarcore/data/GameData.java +++ b/src/main/java/emu/lunarcore/data/GameData.java @@ -27,6 +27,7 @@ public class GameData { @Getter private static Int2ObjectMap mazePlaneExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap mapEntranceExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap heroExcelMap = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap challengeExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap avatarPromotionExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap avatarSkillTreeExcelMap = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java b/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java new file mode 100644 index 0000000..096fa06 --- /dev/null +++ b/src/main/java/emu/lunarcore/data/excel/ChallengeExcel.java @@ -0,0 +1,29 @@ +package emu.lunarcore.data.excel; + +import emu.lunarcore.data.GameResource; +import emu.lunarcore.data.ResourceType; +import lombok.Getter; + +@Getter +@ResourceType(name = {"ChallengeMazeConfig.json"}) +public class ChallengeExcel extends GameResource { + private int ID; + private int MapEntranceID; + private int StageNum; + private int MazeBuffID; + + private int MazeGroupID1; + private int[] ConfigList1; + private int[] NpcMonsterIDList1; + private int[] EventIDList1; + private int MazeGroupID2; + private int[] ConfigList2; + private int[] NpcMonsterIDList2; + private int[] EventIDList2; + + @Override + public int getId() { + return ID; + } + +} diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeService.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeService.java new file mode 100644 index 0000000..fc9618b --- /dev/null +++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeService.java @@ -0,0 +1,28 @@ +package emu.lunarcore.game.challenge; + +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.ChallengeExcel; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.game.BaseGameService; +import emu.lunarcore.server.game.GameServer; +import emu.lunarcore.server.packet.send.PacketStartChallengeScRsp; + +public class ChallengeService extends BaseGameService { + + public ChallengeService(GameServer server) { + super(server); + } + + public void startChallenge(Player player, int challengeId) { + ChallengeExcel excel = GameData.getChallengeExcelMap().get(challengeId); + if (excel == null) { + player.sendPacket(new PacketStartChallengeScRsp()); + return; + } + + player.enterScene(excel.getMapEntranceID(), 0, false); + + // Send packet + player.sendPacket(new PacketStartChallengeScRsp(player, challengeId)); + } +} diff --git a/src/main/java/emu/lunarcore/server/game/GameServer.java b/src/main/java/emu/lunarcore/server/game/GameServer.java index b6b6b03..4e67bd4 100644 --- a/src/main/java/emu/lunarcore/server/game/GameServer.java +++ b/src/main/java/emu/lunarcore/server/game/GameServer.java @@ -7,6 +7,7 @@ import java.util.List; import emu.lunarcore.Config.GameServerConfig; import emu.lunarcore.LunarRail; import emu.lunarcore.game.battle.BattleService; +import emu.lunarcore.game.challenge.ChallengeService; import emu.lunarcore.game.gacha.GachaService; import emu.lunarcore.game.player.Player; import emu.lunarcore.game.service.ChatService; @@ -31,7 +32,8 @@ public class GameServer extends KcpServer { @Getter private final InventoryService inventoryService; @Getter private final GachaService gachaService; @Getter private final ChatService chatService; - + @Getter private final ChallengeService challengeService; + public GameServer(GameServerConfig serverConfig) { // Game Server base this.serverConfig = serverConfig; @@ -46,6 +48,7 @@ public class GameServer extends KcpServer { this.inventoryService = new InventoryService(this); this.gachaService = new GachaService(this); this.chatService = new ChatService(this); + this.challengeService = new ChallengeService(this); // Hook into shutdown event. Runtime.getRuntime().addShutdownHook(new Thread(this::onShutdown)); diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java new file mode 100644 index 0000000..569d64c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java @@ -0,0 +1,19 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.StartChallengeCsReqOuterClass.StartChallengeCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; + +@Opcodes(CmdId.StartChallengeCsReq) +public class HandlerStartChallengeCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = StartChallengeCsReq.parseFrom(data); + + session.getServer().getChallengeService().startChallenge(session.getPlayer(), req.getChallengeId()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketStartChallengeScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketStartChallengeScRsp.java new file mode 100644 index 0000000..6c5c911 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketStartChallengeScRsp.java @@ -0,0 +1,37 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.ChallengeInfoOuterClass.ChallengeInfo; +import emu.lunarcore.proto.ChallengeStatusOuterClass.ChallengeStatus; +import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType; +import emu.lunarcore.proto.StartChallengeScRspOuterClass.StartChallengeScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketStartChallengeScRsp extends BasePacket { + + public PacketStartChallengeScRsp() { + super(CmdId.StartChallengeScRsp); + + var data = StartChallengeScRsp.newInstance() + .setRetcode(1); + + this.setData(data); + } + + public PacketStartChallengeScRsp(Player player, int challengeId) { + super(CmdId.StartChallengeScRsp); + + var challengeInfo = ChallengeInfo.newInstance() + .setChallengeId(challengeId) + .setStatus(ChallengeStatus.CHALLENGE_DOING) + .setExtraLineupType(ExtraLineupType.LINEUP_CHALLENGE); + + var data = StartChallengeScRsp.newInstance() + .setLineup(player.getCurrentLineup().toProto().setExtraLineupType(ExtraLineupType.LINEUP_CHALLENGE)) // TODO temporary + .setScene(player.getScene().toProto()) + .setChallengeInfo(challengeInfo); + + this.setData(data); + } +}