mirror of
https://github.com/Melledy/Nebula.git
synced 2025-12-12 12:24:35 +01:00
Implement Boss Blitz star rewards
This commit is contained in:
@@ -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<>();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user