From 005f138599b381a5af2884535709a7356e2d788d Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sun, 7 Dec 2025 16:31:19 -0800 Subject: [PATCH] Implement Boss Blitz star rewards --- src/main/java/emu/nebula/data/GameData.java | 1 + .../data/resources/ScoreBossRewardDef.java | 19 +++++++ .../game/scoreboss/ScoreBossManager.java | 57 +++++++++++++++++++ .../game/scoreboss/ScoreBossRankEntry.java | 13 ++++- .../handlers/HandlerScoreBossInfoReq.java | 5 ++ .../HandlerScoreBossStarRewardReceiveReq.java | 24 ++++++++ 6 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/main/java/emu/nebula/data/resources/ScoreBossRewardDef.java create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerScoreBossStarRewardReceiveReq.java diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 018eaf4..865243d 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -136,6 +136,7 @@ public class GameData { // Score boss @Getter private static DataTable ScoreBossControlDataTable = new DataTable<>(); + @Getter private static DataTable ScoreBossRewardDataTable = new DataTable<>(); // Activity @Getter private static DataTable ActivityDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/ScoreBossRewardDef.java b/src/main/java/emu/nebula/data/resources/ScoreBossRewardDef.java new file mode 100644 index 0000000..65145e4 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/ScoreBossRewardDef.java @@ -0,0 +1,19 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; + +import lombok.Getter; + +@Getter +@ResourceType(name = "ScoreBossReward.json") +public class ScoreBossRewardDef extends BaseDef { + private int StarNeed; + private int RewardItemId1; + private int RewardNum1; + + @Override + public int getId() { + return StarNeed; + } +} diff --git a/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java b/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java index 83e0d5c..d3779e3 100644 --- a/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java +++ b/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java @@ -1,10 +1,17 @@ package emu.nebula.game.scoreboss; +import java.util.Collection; +import java.util.List; + import emu.nebula.Nebula; import emu.nebula.data.GameData; import emu.nebula.data.resources.ScoreBossControlDef; +import emu.nebula.data.resources.ScoreBossRewardDef; +import emu.nebula.game.inventory.ItemParamMap; import emu.nebula.game.player.Player; +import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.game.player.PlayerManager; + import lombok.Getter; @Getter @@ -91,4 +98,54 @@ public class ScoreBossManager extends PlayerManager { // Success return true; } + + public PlayerChangeInfo claimRewards(int star) { + // Get rank entry + this.getRankEntry(); + + if (this.ranking == null) { + return new PlayerChangeInfo(); + } + + // Init variables + Collection claims = null; + + // Add to claim list + if (star > 0) { + var data = GameData.getScoreBossRewardDataTable().get(star); + if (data != null) { + claims = List.of(data); + } + } else { + claims = GameData.getScoreBossRewardDataTable().values(); + } + + // Init rewards + var rewards = new ItemParamMap(); + int starCount = ranking.getStars(); + boolean shouldSave = false; + + // Try and claim + for (var data : claims) { + // Check if we have earned enough stars + if (starCount >= data.getStarNeed() && !ranking.getClaimedRewards().contains(data.getId())) { + // Add rewards + rewards.add(data.getRewardItemId1(), data.getRewardNum1()); + + // Set in claimed rewards + this.ranking.getClaimedRewards().add(data.getId()); + + // Set save flag so we update ranking to the database + shouldSave = true; + } + } + + // Save to database + if (shouldSave) { + this.ranking.save(); + } + + // Add rewards + return this.getPlayer().getInventory().addItems(rewards); + } } diff --git a/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java b/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java index 898d27b..8da72c0 100644 --- a/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java +++ b/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java @@ -16,7 +16,8 @@ import emu.nebula.proto.Public.HonorInfo; import emu.nebula.proto.ScoreBossRank.ScoreBossRankChar; import emu.nebula.proto.ScoreBossRank.ScoreBossRankData; import emu.nebula.proto.ScoreBossRank.ScoreBossRankTeam; - +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; import lombok.Getter; import lombok.Setter; @@ -35,6 +36,7 @@ public class ScoreBossRankEntry implements GameDatabaseObject { private int score; @SuppressWarnings("unused") private int stars; + private IntSet claimedRewards; private int controlId; private Map teams; @@ -64,6 +66,14 @@ public class ScoreBossRankEntry implements GameDatabaseObject { return stars; } + public IntSet getClaimedRewards() { + if (this.claimedRewards == null) { + this.claimedRewards = new IntOpenHashSet(); + } + + return this.claimedRewards; + } + public void update(Player player) { this.name = player.getName(); this.level = player.getLevel(); @@ -102,6 +112,7 @@ public class ScoreBossRankEntry implements GameDatabaseObject { private void reset() { this.score = 0; this.stars = 0; + this.getClaimedRewards().clear(); this.getTeams().clear(); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java index e12646a..714c757 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java @@ -41,6 +41,11 @@ public class HandlerScoreBossInfoReq extends NetHandler { rsp.addLevels(info); } + + // Add claimed rewards + for (int id : rankEntry.getClaimedRewards()) { + rsp.addStarRewards(id); + } } // Encode and send diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossStarRewardReceiveReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossStarRewardReceiveReq.java new file mode 100644 index 0000000..9186043 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossStarRewardReceiveReq.java @@ -0,0 +1,24 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ScoreBossStarRewardReceive.ScoreBossStarRewardReceiveReq; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.score_boss_star_reward_receive_req) +public class HandlerScoreBossStarRewardReceiveReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = ScoreBossStarRewardReceiveReq.parseFrom(message); + + // Claim rewards + var change = session.getPlayer().getScoreBossManager().claimRewards(req.getStar()); + + // Encode and send + return session.encodeMsg(NetMsgId.score_boss_star_reward_receive_succeed_ack, change.toProto()); + } + +}