From 94343d1f77dd13b079e83f1fe5cf511f03eb0540 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sun, 8 Oct 2023 06:08:07 -0700 Subject: [PATCH] Implement challenge history --- .../game/challenge/ChallengeData.java | 8 +- .../game/challenge/ChallengeHistory.java | 48 ++++++++++ .../game/challenge/ChallengeManager.java | 87 +++++++++++++++++++ .../game/challenge/ChallengeService.java | 40 --------- .../emu/lunarcore/game/player/Player.java | 4 + .../emu/lunarcore/server/game/GameServer.java | 4 - .../packet/recv/HandlerGetChallengeCsReq.java | 17 ++++ .../recv/HandlerStartChallengeCsReq.java | 2 +- .../packet/send/PacketGetChallengeScRsp.java | 21 +++++ 9 files changed, 185 insertions(+), 46 deletions(-) create mode 100644 src/main/java/emu/lunarcore/game/challenge/ChallengeHistory.java create mode 100644 src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java delete mode 100644 src/main/java/emu/lunarcore/game/challenge/ChallengeService.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChallengeCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetChallengeScRsp.java diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeData.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeData.java index 975ff1e..b7d24a9 100644 --- a/src/main/java/emu/lunarcore/game/challenge/ChallengeData.java +++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeData.java @@ -48,6 +48,10 @@ public class ChallengeData { this.setupStage1(); } + private int getChallengeId() { + return this.getExcel().getId(); + } + private void setupStage1() { this.setupStage( excel.getMazeGroupID1(), @@ -120,6 +124,8 @@ public class ChallengeData { // Last stage this.status = ChallengeStatus.CHALLENGE_FINISH; this.stars = 9; // TODO calculate the right amount stars + // Save history + player.getChallengeManager().addHistory(this.getChallengeId(), this.getStars()); // Send challenge result data player.sendPacket(new PacketChallengeSettleNotify(this)); } else { @@ -139,7 +145,7 @@ public class ChallengeData { this.status = ChallengeStatus.CHALLENGE_FAILED; } } - + public void onUpdate() { // End challenge if its done if (status != ChallengeStatus.CHALLENGE_DOING) { diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeHistory.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeHistory.java new file mode 100644 index 0000000..e114bd3 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeHistory.java @@ -0,0 +1,48 @@ +package emu.lunarcore.game.challenge; + +import org.bson.types.ObjectId; + +import dev.morphia.annotations.Entity; +import dev.morphia.annotations.Id; +import emu.lunarcore.LunarRail; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.ChallengeOuterClass.Challenge; +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +@Entity(value = "challenge", useDiscriminator = false) +public class ChallengeHistory { + @Id + private ObjectId id; + + private int ownerUid; + private int challengeId; + private int takenReward; + private int stars; + + @Deprecated // Morphia + public ChallengeHistory() {} + + public ChallengeHistory(Player player, int challengeId) { + this.ownerUid = player.getUid(); + this.challengeId = challengeId; + } + + public Challenge toProto() { + var proto = Challenge.newInstance() + .setChallengeId(this.getChallengeId()) + .setTakenReward(this.getTakenReward()) + .setStars(this.getStars()); + + return proto; + } + + public void delete() { + LunarRail.getGameDatabase().delete(this); + } + + public void save() { + LunarRail.getGameDatabase().save(this); + } +} diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java new file mode 100644 index 0000000..e72eeb0 --- /dev/null +++ b/src/main/java/emu/lunarcore/game/challenge/ChallengeManager.java @@ -0,0 +1,87 @@ +package emu.lunarcore.game.challenge; + +import java.util.stream.Stream; + +import emu.lunarcore.LunarRail; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.ChallengeExcel; +import emu.lunarcore.game.avatar.GameAvatar; +import emu.lunarcore.game.player.BasePlayerManager; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.player.PlayerLineup; +import emu.lunarcore.proto.ExtraLineupTypeOuterClass.ExtraLineupType; +import emu.lunarcore.server.packet.send.PacketStartChallengeScRsp; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import lombok.Getter; + +@Getter +public class ChallengeManager extends BasePlayerManager { + private Int2ObjectMap history; + + public ChallengeManager(Player player) { + super(player); + this.history = new Int2ObjectOpenHashMap<>(); + } + + public void startChallenge(int challengeId) { + // Get challenge excel + ChallengeExcel excel = GameData.getChallengeExcelMap().get(challengeId); + if (excel == null) { + getPlayer().sendPacket(new PacketStartChallengeScRsp()); + return; + } + + // Sanity check lineups + if (excel.getStageNum() >= 1) { + PlayerLineup lineup = getPlayer().getLineupManager().getLineupByIndex(0, ExtraLineupType.LINEUP_CHALLENGE_VALUE); + // Make sure this lineup has avatars set + if (lineup.getAvatars().size() == 0) { + return; + } + // Set technique points + lineup.setMp(5); + } + if (excel.getStageNum() >= 2) { + PlayerLineup lineup = getPlayer().getLineupManager().getLineupByIndex(0, ExtraLineupType.LINEUP_CHALLENGE_2_VALUE); + // Make sure this lineup has avatars set + if (lineup.getAvatars().size() == 0) { + return; + } + // Set technique points + lineup.setMp(5); + } + + // Enter scene + boolean success = getPlayer().enterScene(excel.getMapEntranceID(), 0, false); + if (success == false) { + return; + } + + // Set challenge data for player + ChallengeData data = new ChallengeData(getPlayer(), excel); + + getPlayer().setChallengeData(data); + getPlayer().getLineupManager().setCurrentExtraLineup(data.getCurrentExtraLineup(), false); + + // Send packet + getPlayer().sendPacket(new PacketStartChallengeScRsp(getPlayer(), challengeId)); + } + + public void addHistory(int challengeId, int stars) { + // Get history info + var info = this.getHistory().computeIfAbsent(challengeId, id -> new ChallengeHistory(getPlayer(), id)); + + // Set + info.setStars(stars); + info.save(); + } + + public void loadFromDatabase() { + Stream stream = LunarRail.getGameDatabase().getObjects(ChallengeHistory.class, "ownerUid", this.getPlayer().getUid()); + + stream.forEach(info -> { + this.getHistory().put(info.getChallengeId(), info); + }); + } +} diff --git a/src/main/java/emu/lunarcore/game/challenge/ChallengeService.java b/src/main/java/emu/lunarcore/game/challenge/ChallengeService.java deleted file mode 100644 index 6e59841..0000000 --- a/src/main/java/emu/lunarcore/game/challenge/ChallengeService.java +++ /dev/null @@ -1,40 +0,0 @@ -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; - } - - // Sanity check lineups TODO - - // Enter scene - boolean success = player.enterScene(excel.getMapEntranceID(), 0, false); - if (success == false) { - return; - } - - // Set challenge data for player - ChallengeData data = new ChallengeData(player, excel); - - player.setChallengeData(data); - player.getLineupManager().setCurrentExtraLineup(data.getCurrentExtraLineup(), false); - - // Send packet - player.sendPacket(new PacketStartChallengeScRsp(player, challengeId)); - } -} diff --git a/src/main/java/emu/lunarcore/game/player/Player.java b/src/main/java/emu/lunarcore/game/player/Player.java index eac153c..9617e91 100644 --- a/src/main/java/emu/lunarcore/game/player/Player.java +++ b/src/main/java/emu/lunarcore/game/player/Player.java @@ -21,6 +21,7 @@ import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.avatar.HeroPath; import emu.lunarcore.game.battle.Battle; import emu.lunarcore.game.challenge.ChallengeData; +import emu.lunarcore.game.challenge.ChallengeManager; import emu.lunarcore.game.chat.ChatManager; import emu.lunarcore.game.chat.ChatMessage; import emu.lunarcore.game.enums.PropState; @@ -79,6 +80,7 @@ public class Player { private transient final AvatarStorage avatars; private transient final Inventory inventory; private transient final ChatManager chatManager; + private transient final ChallengeManager challengeManager; // Database persistent data private LineupManager lineupManager; @@ -98,6 +100,7 @@ public class Player { this.avatars = new AvatarStorage(this); this.inventory = new Inventory(this); this.chatManager = new ChatManager(this); + this.challengeManager = new ChallengeManager(this); } // Called when player is created @@ -491,6 +494,7 @@ public class Player { // Load avatars and inventory first this.getAvatars().loadFromDatabase(); this.getInventory().loadFromDatabase(); + this.getChallengeManager().loadFromDatabase(); // Load Etc this.getLineupManager().validate(this); diff --git a/src/main/java/emu/lunarcore/server/game/GameServer.java b/src/main/java/emu/lunarcore/server/game/GameServer.java index d82f9e0..423269b 100644 --- a/src/main/java/emu/lunarcore/server/game/GameServer.java +++ b/src/main/java/emu/lunarcore/server/game/GameServer.java @@ -7,12 +7,10 @@ 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.InventoryService; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import kcp.highway.ChannelConfig; import kcp.highway.KcpServer; @@ -31,7 +29,6 @@ public class GameServer extends KcpServer { @Getter private final BattleService battleService; @Getter private final InventoryService inventoryService; @Getter private final GachaService gachaService; - @Getter private final ChallengeService challengeService; public GameServer(GameServerConfig serverConfig) { // Game Server base @@ -46,7 +43,6 @@ public class GameServer extends KcpServer { this.battleService = new BattleService(this); this.inventoryService = new InventoryService(this); this.gachaService = new GachaService(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/HandlerGetChallengeCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChallengeCsReq.java new file mode 100644 index 0000000..70b7645 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetChallengeCsReq.java @@ -0,0 +1,17 @@ +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.PacketGetChallengeScRsp; + +@Opcodes(CmdId.GetChallengeCsReq) +public class HandlerGetChallengeCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + session.send(new PacketGetChallengeScRsp(session.getPlayer())); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java index 569d64c..8917cb3 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerStartChallengeCsReq.java @@ -13,7 +13,7 @@ public class HandlerStartChallengeCsReq extends PacketHandler { public void handle(GameSession session, byte[] header, byte[] data) throws Exception { var req = StartChallengeCsReq.parseFrom(data); - session.getServer().getChallengeService().startChallenge(session.getPlayer(), req.getChallengeId()); + session.getPlayer().getChallengeManager().startChallenge(req.getChallengeId()); } } diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetChallengeScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetChallengeScRsp.java new file mode 100644 index 0000000..b9f5002 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetChallengeScRsp.java @@ -0,0 +1,21 @@ +package emu.lunarcore.server.packet.send; + +import emu.lunarcore.game.player.Player; +import emu.lunarcore.proto.GetChallengeScRspOuterClass.GetChallengeScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetChallengeScRsp extends BasePacket { + + public PacketGetChallengeScRsp(Player player) { + super(CmdId.GetChallengeScRsp); + + var data = GetChallengeScRsp.newInstance(); + + for (var history : player.getChallengeManager().getHistory().values()) { + data.addChallengeList(history.toProto()); + } + + this.setData(data); + } +}