Refactor battle pass and some gacha stuff

This commit is contained in:
Melledy committed 2026-10-22 22:14:17 -07:00
1 parent c9e62500ad
commit a928bb40f0
10 files changed
+160 -133

No files matched your search

@@ -1,13 +1,10 @@
package emu.nebula.server.handlers;
import emu.nebula.data.GameData;
import emu.nebula.game.player.PlayerChangeInfo;
import emu.nebula.net.GameSession;
import emu.nebula.net.HandlerId;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.BattlePassLevelBuy.BattlePassLevelBuyResp;
import emu.nebula.proto.Public.ChangeInfo;
import emu.nebula.proto.Public.UI32;
@HandlerId(NetMsgId.battle_pass_level_buy_req)
@@ -15,85 +12,31 @@ public class HandlerBattlePassLevelBuyReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
if (!session.getPlayer().isBattlePassUnlocked()) {
// Sanity check to make sure battlepass is unlocked
if (!session.getPlayer().getBattlePassManager().isUnlocked()) {
return session.encodeMsg(NetMsgId.battle_pass_level_buy_failed_ack);
}
// Parse request using UI32 (standard uint32 protobuf type)
// Parse request
var req = UI32.parseFrom(message);
int levelsToBuy = req.getValue();
if (levelsToBuy < 1) {
levelsToBuy = 1;
}
// Get battle pass
// Get battlepass
var battlePass = session.getPlayer().getBattlePassManager().getBattlePass();
// Calculate total cost and total exp
int currentLevel = battlePass.getLevel();
int totalGemCost = 0;
int totalExpToAdd = 0;
int affordableLevels = 0;
int costItemId = 2; // Gems
// Buy levels
var change = battlePass.buyLevels(req.getValue());
for (int i = 1; i <= levelsToBuy; i++) {
int targetLevel = currentLevel + i;
var levelData = GameData.getBattlePassLevelDataTable().get(targetLevel);
if (levelData == null) {
// Max level reached
break;
}
int cost = levelData.getQty();
int currentGems = session.getPlayer().getInventory().getResourceCount(costItemId);
if (currentGems < totalGemCost + cost) {
// Not enough gems for all levels
break;
}
totalGemCost += cost;
totalExpToAdd += levelData.getExp();
affordableLevels++;
}
if (affordableLevels == 0) {
// Check
if (change == null) {
return session.encodeMsg(NetMsgId.battle_pass_level_buy_failed_ack);
}
// Prepare change info
var change = new PlayerChangeInfo();
// Deduct gems (total cost)
if (totalGemCost > 0) {
var gemCost = session.getPlayer().getInventory().addItem(costItemId, -totalGemCost);
if (gemCost != null) {
change.add(gemCost);
}
}
// Add all exp at once (preserves current exp)
battlePass.addExp(totalExpToAdd);
// Save to database
battlePass.save();
// Build response
var rsp = BattlePassLevelBuyResp.newInstance()
.setLevel(battlePass.getLevel());
// Add change info (gem cost)
if (!change.isEmpty()) {
var changeProto = ChangeInfo.newInstance();
for (var any : change.getList()) {
changeProto.addProps(any);
}
rsp.setChange(changeProto);
}
.setLevel(battlePass.getLevel())
.setChange(change.toProto());
session.getPlayer().queueBattlePassStateNotify();
session.getPlayer().getBattlePassManager().updateState();
// Encode and send
return session.encodeMsg(NetMsgId.battle_pass_level_buy_succeed_ack, rsp);
@@ -1,6 +1,7 @@
package emu.nebula.server.handlers;
import emu.nebula.Nebula;
import emu.nebula.game.mall.MallOrderCollectResult;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.BattlePassOrderCollect.BattlePassOrderCollectResp;
@@ -13,7 +14,8 @@ public class HandlerBattlePassOrderCollectReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
if (!session.getPlayer().isBattlePassUnlocked()) {
// Sanity check to make sure battlepass is unlocked
if (!session.getPlayer().getBattlePassManager().isUnlocked()) {
return session.encodeMsg(NetMsgId.battle_pass_order_collect_failed_ack);
}
@@ -26,7 +28,7 @@ public class HandlerBattlePassOrderCollectReq extends NetHandler {
if (!battlePass.isPremium()) {
return session.encodeMsg(NetMsgId.battle_pass_order_collect_failed_ack);
}
collectResult = emu.nebula.game.mall.MallOrderCollectResult.empty();
collectResult = MallOrderCollectResult.empty();
}
// Build collect response
@@ -15,9 +15,10 @@ public class HandlerBattlePassOrderReq extends NetHandler {
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = BattlePassOrderReq.parseFrom(message);
// Validate mode (1 = Premium, 2 = Luxury)
int requestedMode = req.getMode();
if (!session.getPlayer().isBattlePassUnlocked() || requestedMode < 1 || requestedMode > 2) {
if (!session.getPlayer().getBattlePassManager().isUnlocked() || requestedMode < 1 || requestedMode > 2) {
return session.encodeMsg(NetMsgId.battle_pass_order_failed_ack);
}
@@ -12,7 +12,7 @@ public class HandlerBattlePassQuestRewardReceiveReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
if (!session.getPlayer().isBattlePassUnlocked()) {
if (!session.getPlayer().getBattlePassManager().isUnlocked()) {
return session.encodeMsg(NetMsgId.battle_pass_quest_reward_receive_failed_ack);
}
@@ -32,7 +32,7 @@ public class HandlerBattlePassQuestRewardReceiveReq extends NetHandler {
.setExp(battlePass.getExp())
.setExpThisWeek(battlePass.getExpWeek());
session.getPlayer().queueBattlePassStateNotify();
session.getPlayer().getBattlePassManager().updateState();
// Encode and send
return session.encodeMsg(NetMsgId.battle_pass_quest_reward_receive_succeed_ack, rsp);
@@ -13,7 +13,7 @@ public class HandlerBattlePassRewardReceiveReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
if (!session.getPlayer().isBattlePassUnlocked()) {
if (!session.getPlayer().getBattlePassManager().isUnlocked()) {
return session.encodeMsg(NetMsgId.battle_pass_reward_receive_failed_ack);
}
@@ -44,7 +44,7 @@ public class HandlerBattlePassRewardReceiveReq extends NetHandler {
.setPremiumReward(battlePass.getPremiumReward().toByteArray())
.setChange(change.toProto());
session.getPlayer().queueBattlePassStateNotify();
session.getPlayer().getBattlePassManager().updateState();
// Encode and send
return session.encodeMsg(NetMsgId.battle_pass_reward_receive_succeed_ack, rsp);