Implement Boss Blitz star rewards

This commit is contained in:
Melledy
2025-12-07 16:31:19 -08:00
parent be5a6709fd
commit 005f138599
6 changed files with 118 additions and 1 deletions

View File

@@ -136,6 +136,7 @@ public class GameData {
// Score boss
@Getter private static DataTable<ScoreBossControlDef> ScoreBossControlDataTable = new DataTable<>();
@Getter private static DataTable<ScoreBossRewardDef> ScoreBossRewardDataTable = new DataTable<>();
// Activity
@Getter private static DataTable<ActivityDef> ActivityDataTable = new DataTable<>();

View File

@@ -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;
}
}

View File

@@ -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<ScoreBossRewardDef> 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);
}
}

View File

@@ -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<Integer, ScoreBossTeamEntry> 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();
}

View File

@@ -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

View File

@@ -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());
}
}