From be5a6709fdaf019d199f042831e0bed774a08533 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sun, 7 Dec 2025 16:02:44 -0800 Subject: [PATCH] Improve Boss Blitz UI --- .../game/scoreboss/ScoreBossManager.java | 8 ++--- .../game/scoreboss/ScoreBossRankEntry.java | 35 ++++++++++++++++--- .../handlers/HandlerScoreBossInfoReq.java | 28 +++++++++++++++ .../handlers/HandlerScoreBossRankReq.java | 2 +- .../handlers/HandlerScoreBossSettleReq.java | 2 +- 5 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java b/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java index fe54736..83e0d5c 100644 --- a/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java +++ b/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java @@ -27,7 +27,7 @@ public class ScoreBossManager extends PlayerManager { return GameData.getScoreBossControlDataTable().get(this.getControlId()); } - public ScoreBossRankEntry getRanking() { + public ScoreBossRankEntry getRankEntry() { if (this.ranking == null && !this.checkedDatabase) { this.ranking = Nebula.getGameDatabase().getObjectByUid(ScoreBossRankEntry.class, this.getPlayerUid()); this.checkedDatabase = true; @@ -57,7 +57,7 @@ public class ScoreBossManager extends PlayerManager { return true; } - public boolean settle(int stars, int score) { + public boolean settle(int stars, int score, int skillScore) { // Get level var control = getControlData(); if (control == null || !control.getLevelGroup().contains(this.getLevelId())) { @@ -71,7 +71,7 @@ public class ScoreBossManager extends PlayerManager { } // Get ranking from database - this.getRanking(); + this.getRankEntry(); // Create ranking if its not in the database if (this.ranking == null) { @@ -79,7 +79,7 @@ public class ScoreBossManager extends PlayerManager { } // Settle - this.ranking.settle(this.getPlayer(), build, getControlId(), getLevelId(), stars, score); + this.ranking.settle(this.getPlayer(), build, getControlId(), getLevelId(), stars, score, skillScore); // Save ranking this.ranking.save(); diff --git a/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java b/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java index 180cbcd..898d27b 100644 --- a/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java +++ b/src/main/java/emu/nebula/game/scoreboss/ScoreBossRankEntry.java @@ -33,6 +33,8 @@ public class ScoreBossRankEntry implements GameDatabaseObject { private int titleSuffix; private int[] honor; private int score; + @SuppressWarnings("unused") + private int stars; private int controlId; private Map teams; @@ -51,6 +53,17 @@ public class ScoreBossRankEntry implements GameDatabaseObject { this.teams = new HashMap<>(); } + // TODO replace later + public int getStars() { + int stars = 0; + + for (var team : this.getTeams().values()) { + stars += team.getStars(); + } + + return stars; + } + public void update(Player player) { this.name = player.getName(); this.level = player.getLevel(); @@ -60,28 +73,38 @@ public class ScoreBossRankEntry implements GameDatabaseObject { this.honor = player.getHonor(); } - public void settle(Player player, StarTowerBuild build, int controlId, int level, int stars, int score) { + public void settle(Player player, StarTowerBuild build, int controlId, int level, int stars, int score, int skillScore) { // Update player data this.update(player); // Reset score entry if control id doesn't match if (this.controlId != controlId) { this.controlId = controlId; - this.getTeams().clear(); + this.reset(); } // Set team entry - var team = new ScoreBossTeamEntry(player, build, stars, score); + var team = new ScoreBossTeamEntry(player, build, stars, score, skillScore); + + // Put in team map this.getTeams().put(level, team); - // Calculate score + // Calculate score/stars this.score = 0; + this.stars = 0; for (var t : this.getTeams().values()) { this.score += t.getLevelScore(); + this.stars += t.getStars(); } } + private void reset() { + this.score = 0; + this.stars = 0; + this.getTeams().clear(); + } + // Proto public ScoreBossRankData toProto() { @@ -115,6 +138,7 @@ public class ScoreBossRankEntry implements GameDatabaseObject { private int buildScore; private int stars; private int levelScore; + private int skillScore; private List characters; @Deprecated // Morphia only @@ -122,11 +146,12 @@ public class ScoreBossRankEntry implements GameDatabaseObject { } - public ScoreBossTeamEntry(Player player, StarTowerBuild build, int stars, int score) { + public ScoreBossTeamEntry(Player player, StarTowerBuild build, int stars, int score, int skillScore) { this.buildId = build.getUid(); this.buildScore = build.getScore(); this.stars = stars; this.levelScore = score; + this.skillScore = skillScore; this.characters = new ArrayList<>(); for (var charId : build.getCharIds()) { diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java index 6ac2c36..e12646a 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java @@ -2,6 +2,7 @@ package emu.nebula.server.handlers; import emu.nebula.net.NetHandler; import emu.nebula.net.NetMsgId; +import emu.nebula.proto.Public.ScoreBossLevel; import emu.nebula.proto.ScoreBossInfoOuterClass.ScoreBossInfo; import emu.nebula.net.HandlerId; import emu.nebula.net.GameSession; @@ -15,6 +16,33 @@ public class HandlerScoreBossInfoReq extends NetHandler { var rsp = ScoreBossInfo.newInstance() .setControlId(session.getPlayer().getScoreBossManager().getControlId()); + // Get rank entry + var rankEntry = session.getPlayer().getScoreBossManager().getRankEntry(); + if (rankEntry != null) { + // Set total score + rsp.setScore(rankEntry.getScore()); + rsp.setStar(rankEntry.getStars()); + + // Encode team data to proto + for (var teamEntry : rankEntry.getTeams().entrySet()) { + int id = teamEntry.getKey(); + var team = teamEntry.getValue(); + + var info = ScoreBossLevel.newInstance() + .setBuildId(team.getBuildId()) + .setLevelId(id) + .setScore(team.getLevelScore()) + .setSkillScore(team.getSkillScore()) + .setStar(team.getStars()); + + for (var charEntry : team.getCharacters()) { + info.addCharIds(charEntry.getId()); + } + + rsp.addLevels(info); + } + } + // Encode and send return session.encodeMsg(NetMsgId.score_boss_info_succeed_ack, rsp); } diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java index d490279..cb64b16 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java @@ -17,7 +17,7 @@ public class HandlerScoreBossRankReq extends NetHandler { .setLastRefreshTime(Nebula.getCurrentTime()); // Get self - var self = session.getPlayer().getScoreBossManager().getRanking(); + var self = session.getPlayer().getScoreBossManager().getRankEntry(); if (self != null) { rsp.setSelf(self.toProto()); diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java index 23568f5..f7aa2de 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java @@ -16,7 +16,7 @@ public class HandlerScoreBossSettleReq extends NetHandler { var req = ScoreBossSettleReq.parseFrom(message); // Settle - boolean success = session.getPlayer().getScoreBossManager().settle(req.getStar(), req.getScore()); + boolean success = session.getPlayer().getScoreBossManager().settle(req.getStar(), req.getScore(), req.getSkillScore()); if (success == false) { return session.encodeMsg(NetMsgId.score_boss_settle_failed_ack);