From 7bb824c00982dd349496ac041102c235becd8d28 Mon Sep 17 00:00:00 2001 From: Fishia <74685931+fishiatee@users.noreply.github.com> Date: Tue, 17 Mar 2026 17:11:45 +0700 Subject: [PATCH] feat: properly handle level completion --- .../activity/type/PenguinCardActivity.java | 96 ++++++++++--------- .../HandlerActivityPenguinCardSettleReq.java | 10 ++ 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src/main/java/emu/nebula/game/activity/type/PenguinCardActivity.java b/src/main/java/emu/nebula/game/activity/type/PenguinCardActivity.java index 83a463c..2e57f63 100644 --- a/src/main/java/emu/nebula/game/activity/type/PenguinCardActivity.java +++ b/src/main/java/emu/nebula/game/activity/type/PenguinCardActivity.java @@ -1,25 +1,28 @@ package emu.nebula.game.activity.type; +import java.util.HashMap; +import java.util.Map; + import dev.morphia.annotations.Entity; import emu.nebula.data.GameData; import emu.nebula.data.resources.ActivityDef; import emu.nebula.game.activity.ActivityManager; import emu.nebula.game.activity.GameActivity; -import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.proto.ActivityDetail.ActivityMsg; +import emu.nebula.proto.Public.ActivityPenguinCardLevel; import emu.nebula.proto.Public.ActivityQuest; -import emu.nebula.proto.Public.ActivityTowerDefenseLevel; - import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.Getter; +import lombok.Setter; @Getter @Entity public class PenguinCardActivity extends GameActivity { - private Int2IntMap completedStages; - private Int2IntMap completedQuests; + private Map completedLevels = new Int2ObjectOpenHashMap<>(); + private Int2IntMap completedQuests = new Int2IntOpenHashMap(); @Deprecated // Morphia only public PenguinCardActivity() { @@ -28,50 +31,57 @@ public class PenguinCardActivity extends GameActivity { public PenguinCardActivity(ActivityManager manager, ActivityDef data) { super(manager, data); - this.completedStages = new Int2IntOpenHashMap(); - this.completedQuests = new Int2IntOpenHashMap(); } - - public PlayerChangeInfo claimReward(int level) { - // Get rewards - var rewards = GameData.getTowerDefenseLevelDataTable().get(level).getRewards(); - - // Add rewards - return getPlayer().getInventory().addItems(rewards); - } - - // public PlayerChangeInfo claimReward(int groupId) { - // // Create change info - // var change = new PlayerChangeInfo(); - - // // Make sure we haven't completed this group yet - // if (this.getCompleted().contains(groupId)) { - // return change; - // } - - // // Get trial control - // var control = GameData.getTrialControlDataTable().get(this.getId()); - // if (control == null) return change; - - // // Get group - // var group = GameData.getTrialGroupDataTable().get(groupId); - // if (group == null) return change; - - // // Set as completed - // this.getCompleted().add(groupId); - - // // Save to database - // this.save(); - - // // Add rewards - // return getPlayer().getInventory().addItems(group.getRewards(), change); - // } // Proto @Override public void encodeActivityMsg(ActivityMsg msg) { - msg.getMutablePenguinCard(); + var proto = msg.getMutablePenguinCard(); + + // Add completed levels + for (int id : this.completedLevels.keySet()) { + // Get level completion data + var data = this.completedLevels.get(id); + + // Create proto + var level = ActivityPenguinCardLevel.newInstance(); + + // Set proto params + level.setId(id); + level.setScore(data.getScore()); + level.setStar(data.getStars()); + + // Add to final msg proto + proto.addLevels(level); + } + + // Add completed quests + for (int id : this.completedQuests.keySet()) { + // Create proto + var quest = ActivityQuest.newInstance(); + + // Set proto params + quest.setActivityId(this.getId()); + quest.setId(id); + quest.setStatus(2); // TODO: properly handle event quests + + // Add to final msg proto + proto.addQuests(quest); + } + } + + @Getter + @Setter + @Entity(useDiscriminator = false) + public static class LevelStats { + private int stars; + private int score; + + @Deprecated + public LevelStats() { + + } } } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerActivityPenguinCardSettleReq.java b/src/main/java/emu/nebula/server/handlers/HandlerActivityPenguinCardSettleReq.java index 440c75a..44e59c3 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerActivityPenguinCardSettleReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerActivityPenguinCardSettleReq.java @@ -3,7 +3,10 @@ package emu.nebula.server.handlers; import emu.nebula.net.NetHandler; import emu.nebula.net.NetMsgId; import emu.nebula.proto.ActivityPenguinCardLevelSettle.ActivityPenguinCardSettleReq; +import it.unimi.dsi.fastutil.ints.IntList; import emu.nebula.net.HandlerId; +import emu.nebula.game.activity.type.PenguinCardActivity; +import emu.nebula.game.activity.type.PenguinCardActivity.LevelStats; import emu.nebula.net.GameSession; @HandlerId(NetMsgId.activity_penguin_card_level_settle_req) @@ -15,6 +18,13 @@ public class HandlerActivityPenguinCardSettleReq extends NetHandler { var req = ActivityPenguinCardSettleReq.parseFrom(message); // Get activity + var activity = session.getPlayer().getActivityManager().getActivity(PenguinCardActivity.class, 800001); + + // Update completed levels + LevelStats data = new LevelStats(); + data.setScore(req.getScore()); + data.setStars(req.getStar()); + activity.getCompletedLevels().put(req.getLevelId(), data); // Encode and send return session.encodeMsg(NetMsgId.activity_penguin_card_level_settle_succeed_ack);