diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index f79488f..7df6217 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -68,4 +68,6 @@ public class GameData { @Getter private static DataTable StarTowerStageDataTable = new DataTable<>(); @Getter private static DataTable PotentialDataTable = new DataTable<>(); @Getter private static DataTable SubNoteSkillPromoteGroupDataTable = new DataTable<>(); + + @Getter private static DataTable ScoreBossControlDataTable = new DataTable<>(); } diff --git a/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java b/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java new file mode 100644 index 0000000..4f08530 --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/ScoreBossControlDef.java @@ -0,0 +1,18 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import lombok.Getter; + +@Getter +@ResourceType(name = "ScoreBossControl.json") +public class ScoreBossControlDef extends BaseDef { + private int Id; + private IntOpenHashSet LevelGroup; + + @Override + public int getId() { + return Id; + } +} diff --git a/src/main/java/emu/nebula/game/player/Player.java b/src/main/java/emu/nebula/game/player/Player.java index cb655fb..a9d507b 100644 --- a/src/main/java/emu/nebula/game/player/Player.java +++ b/src/main/java/emu/nebula/game/player/Player.java @@ -18,6 +18,7 @@ import emu.nebula.game.instance.InstanceManager; import emu.nebula.game.inventory.Inventory; import emu.nebula.game.mail.Mailbox; import emu.nebula.game.quest.QuestManager; +import emu.nebula.game.scoreboss.ScoreBossManager; import emu.nebula.game.story.StoryManager; import emu.nebula.game.tower.StarTowerManager; import emu.nebula.net.GameSession; @@ -64,7 +65,8 @@ public class Player implements GameDatabaseObject { // Managers private final transient CharacterStorage characters; - private transient GachaManager gachaManager; + private final transient GachaManager gachaManager; + private final transient ScoreBossManager scoreBossManager; // Referenced data private transient Inventory inventory; @@ -80,9 +82,12 @@ public class Player implements GameDatabaseObject { @Deprecated // Morphia only public Player() { + // Init player managers this.characters = new CharacterStorage(this); this.gachaManager = new GachaManager(this); + this.scoreBossManager = new ScoreBossManager(this); + // Init next packages stack this.nextPackages = new Stack<>(); } diff --git a/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java b/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java new file mode 100644 index 0000000..b7828bc --- /dev/null +++ b/src/main/java/emu/nebula/game/scoreboss/ScoreBossManager.java @@ -0,0 +1,50 @@ +package emu.nebula.game.scoreboss; + +import emu.nebula.data.GameData; +import emu.nebula.data.resources.ScoreBossControlDef; +import emu.nebula.game.player.Player; +import emu.nebula.game.player.PlayerManager; +import lombok.Getter; + +@Getter +public class ScoreBossManager extends PlayerManager { + private int levelId; + private long buildId; + + public ScoreBossManager(Player player) { + super(player); + } + + public int getControlId() { + return 1; + } + + public ScoreBossControlDef getControlData() { + return GameData.getScoreBossControlDataTable().get(this.getControlId()); + } + + public boolean apply(int levelId, long buildId) { + // Get level + var control = getControlData(); + if (control == null || !control.getLevelGroup().contains(levelId)) { + return false; + } + + // Get build + var build = this.getPlayer().getStarTowerManager().getBuildById(buildId); + if (build == null) { + return false; + } + + // Set + this.levelId = levelId; + this.buildId = buildId; + + // Success + return true; + } + + public void settle(int star, int score) { + // TODO + } +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossApplyReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossApplyReq.java new file mode 100644 index 0000000..e4c9290 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossApplyReq.java @@ -0,0 +1,24 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ScoreBossApply.ScoreBossApplyReq; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.score_boss_apply_req) +public class HandlerScoreBossApplyReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = ScoreBossApplyReq.parseFrom(message); + + // Apply + boolean success = session.getPlayer().getScoreBossManager().apply(req.getLevelId(), req.getBuildId()); + + // Encode and send + return session.encodeMsg(success ? NetMsgId.score_boss_apply_succeed_ack : NetMsgId.score_boss_apply_failed_ack); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java new file mode 100644 index 0000000..6ac2c36 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossInfoReq.java @@ -0,0 +1,22 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ScoreBossInfoOuterClass.ScoreBossInfo; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.score_boss_info_req) +public class HandlerScoreBossInfoReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Build response + var rsp = ScoreBossInfo.newInstance() + .setControlId(session.getPlayer().getScoreBossManager().getControlId()); + + // 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 new file mode 100644 index 0000000..8f58f0b --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossRankReq.java @@ -0,0 +1,23 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ScoreBossRank.ScoreBossRankInfo; +import emu.nebula.net.HandlerId; +import emu.nebula.Nebula; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.score_boss_rank_req) +public class HandlerScoreBossRankReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Build response + var rsp = ScoreBossRankInfo.newInstance() + .setLastRefreshTime(Nebula.getCurrentTime()); + + // Encode and send + return session.encodeMsg(NetMsgId.score_boss_rank_succeed_ack, rsp); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java new file mode 100644 index 0000000..0303b5e --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerScoreBossSettleReq.java @@ -0,0 +1,28 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.ScoreBossSettle.ScoreBossSettleReq; +import emu.nebula.proto.ScoreBossSettle.ScoreBossSettleResp; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.score_boss_settle_req) +public class HandlerScoreBossSettleReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = ScoreBossSettleReq.parseFrom(message); + + // Settle + session.getPlayer().getScoreBossManager().settle(req.getStar(), req.getScore()); + + // Build response + var rsp = ScoreBossSettleResp.newInstance(); + + // Encode and send + return session.encodeMsg(NetMsgId.score_boss_settle_succeed_ack, rsp); + } + +}