From ebc48ab9552c7d65116276de8ff7f169f097c21d Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Wed, 29 Oct 2025 23:03:23 -0700 Subject: [PATCH] Implement disc limit break (crescendo) --- .../emu/nebula/game/character/GameDisc.java | 28 +++++++++++++ .../handlers/HandlerDiscLimitBreakReq.java | 40 +++++++++++++++++++ .../handlers/HandlerDiscStrengthenReq.java | 6 +-- 3 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/main/java/emu/nebula/server/handlers/HandlerDiscLimitBreakReq.java diff --git a/src/main/java/emu/nebula/game/character/GameDisc.java b/src/main/java/emu/nebula/game/character/GameDisc.java index a64d682..65fd2ea 100644 --- a/src/main/java/emu/nebula/game/character/GameDisc.java +++ b/src/main/java/emu/nebula/game/character/GameDisc.java @@ -190,6 +190,34 @@ public class GameDisc implements GameDatabaseObject { return changes.setSuccess(true); } + public PlayerChangeInfo limitBreak(int count) { + // Sanity check + if (count <= 0) { + return null; + } + + // Create params with limit break items + var materials = new ItemParamMap(); + materials.add(this.getData().getTransformItemId(), count); + + // Verify that the player has the items + if (!this.getPlayer().getInventory().verifyItems(materials)) { + return null; + } + + // Remove items + var changes = this.getPlayer().getInventory().removeItems(materials, null); + + // Add phase level + this.star = Math.max(this.star + count, 4); + + // Save to database + this.save(); + + // Success + return changes.setSuccess(true); + } + // Proto public Disc toProto() { diff --git a/src/main/java/emu/nebula/server/handlers/HandlerDiscLimitBreakReq.java b/src/main/java/emu/nebula/server/handlers/HandlerDiscLimitBreakReq.java new file mode 100644 index 0000000..692cde2 --- /dev/null +++ b/src/main/java/emu/nebula/server/handlers/HandlerDiscLimitBreakReq.java @@ -0,0 +1,40 @@ +package emu.nebula.server.handlers; + +import emu.nebula.net.NetHandler; +import emu.nebula.net.NetMsgId; +import emu.nebula.proto.DiscLimitBreak.DiscLimitBreakReq; +import emu.nebula.proto.DiscLimitBreak.DiscLimitBreakResp; +import emu.nebula.net.HandlerId; +import emu.nebula.net.GameSession; + +@HandlerId(NetMsgId.disc_limit_break_req) +public class HandlerDiscLimitBreakReq extends NetHandler { + + @Override + public byte[] handle(GameSession session, byte[] message) throws Exception { + // Parse request + var req = DiscLimitBreakReq.parseFrom(message); + + // Get character + var disc = session.getPlayer().getCharacters().getDiscById(req.getId()); + + if (disc == null) { + return this.encodeMsg(NetMsgId.disc_limit_break_failed_ack); + } + + // Limit break + var change = disc.limitBreak(req.getQty()); + + if (change == null) { + return this.encodeMsg(NetMsgId.disc_limit_break_failed_ack); + } + + // Create response + var rsp = DiscLimitBreakResp.newInstance() + .setStar(disc.getStar()) + .setChange(null); + + return this.encodeMsg(NetMsgId.disc_limit_break_succeed_ack, rsp); + } + +} diff --git a/src/main/java/emu/nebula/server/handlers/HandlerDiscStrengthenReq.java b/src/main/java/emu/nebula/server/handlers/HandlerDiscStrengthenReq.java index ef67cdc..bf4ec44 100644 --- a/src/main/java/emu/nebula/server/handlers/HandlerDiscStrengthenReq.java +++ b/src/main/java/emu/nebula/server/handlers/HandlerDiscStrengthenReq.java @@ -23,7 +23,7 @@ public class HandlerDiscStrengthenReq extends NetHandler { return this.encodeMsg(NetMsgId.disc_strengthen_failed_ack); } - // Upgrade character + // Level up disc var params = ItemParamMap.fromItemInfos(req.getItems()); var change = disc.upgrade(params); @@ -33,9 +33,9 @@ public class HandlerDiscStrengthenReq extends NetHandler { // Create response var rsp = DiscStrengthenResp.newInstance() - .setChange(change.toProto()) .setLevel(disc.getLevel()) - .setExp(disc.getExp()); + .setExp(disc.getExp()) + .setChange(change.toProto()); return this.encodeMsg(NetMsgId.disc_strengthen_succeed_ack, rsp); }