mirror of
https://github.com/Melledy/Nebula.git
synced 2026-11-04 21:36:51 +01:00
Refactor battle pass and some gacha stuff
This commit is contained in:
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);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user