mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-19 18:34:49 +01:00
Implement battle pass triggers/rewards
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BuyBattlePassLevelReqOuterClass.BuyBattlePassLevelReq;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketBuyBattlePassLevelRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.BuyBattlePassLevelReq)
|
||||
public class HandlerBuyBattlePassLevelReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
BuyBattlePassLevelReq req = BuyBattlePassLevelReq.parseFrom(payload);
|
||||
|
||||
int buyLevel = session.getPlayer().getBattlePassManager().buyLevels(req.getBuyLevel());
|
||||
|
||||
session.send(new PacketBuyBattlePassLevelRsp(buyLevel));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SetBattlePassViewedReqOuterClass.SetBattlePassViewedReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketSetBattlePassViewedRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.SetBattlePassViewedReq)
|
||||
public class HandlerSetBattlePassViewedReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req = SetBattlePassViewedReq.parseFrom(payload);
|
||||
|
||||
session.getPlayer().getBattlePassManager().updateViewed();
|
||||
session.send(new PacketSetBattlePassViewedRsp(req.getScheduleId()));
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,10 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.TakeBattlePassMissionPointReqOuterClass;
|
||||
import emu.grasscutter.net.proto.TakeBattlePassMissionPointReqOuterClass.TakeBattlePassMissionPointReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketBattlePassCurScheduleUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketBattlePassMissionUpdateNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketTakeBattlePassMissionPointRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.TakeBattlePassMissionPointReq)
|
||||
@@ -15,11 +12,10 @@ public class HandlerTakeBattlePassMissionPointReq extends PacketHandler {
|
||||
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req
|
||||
= TakeBattlePassMissionPointReqOuterClass.TakeBattlePassMissionPointReq.parseFrom(payload);
|
||||
var req = TakeBattlePassMissionPointReq.parseFrom(payload);
|
||||
|
||||
session.getPlayer().getBattlePassManager().takeMissionPoint(req.getMissionIdListList());
|
||||
|
||||
session.send(new PacketBattlePassMissionUpdateNotify(req.getMissionIdListList() , session));
|
||||
session.send(new PacketBattlePassCurScheduleUpdateNotify(session.getPlayer()));
|
||||
session.send(new PacketTakeBattlePassMissionPointRsp());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package emu.grasscutter.server.packet.recv;
|
||||
import emu.grasscutter.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.TakeBattlePassRewardReqOuterClass;
|
||||
import emu.grasscutter.net.proto.TakeBattlePassRewardReqOuterClass.TakeBattlePassRewardReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketTakeBattlePassRewardRsp;
|
||||
|
||||
@@ -11,14 +11,8 @@ import emu.grasscutter.server.packet.send.PacketTakeBattlePassRewardRsp;
|
||||
public class HandlerTakeBattlePassRewardReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
var req
|
||||
= TakeBattlePassRewardReqOuterClass.TakeBattlePassRewardReq.parseFrom(payload);
|
||||
var req = TakeBattlePassRewardReq.parseFrom(payload);
|
||||
|
||||
//due to the list only have one element, so we can use get(0)
|
||||
session.send(new PacketTakeBattlePassRewardRsp(req.getTakeOptionListList() , session));
|
||||
|
||||
//update the awardTakenLevel
|
||||
req.getTakeOptionListList().forEach(battlePassRewardTakeOption ->
|
||||
session.getPlayer().getBattlePassManager().updateAwardTakenLevel(battlePassRewardTakeOption.getTag().getLevel()));
|
||||
session.getPlayer().getBattlePassManager().takeReward(req.getTakeOptionListList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.*;
|
||||
import emu.grasscutter.net.proto.BattlePassAllDataNotifyOuterClass.BattlePassAllDataNotify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -13,50 +14,25 @@ public class PacketBattlePassAllDataNotify extends BasePacket {
|
||||
public PacketBattlePassAllDataNotify(Player player) {
|
||||
super(PacketOpcodes.BattlePassAllDataNotify);
|
||||
|
||||
var value = player.getBattlePassManager().getPoint();
|
||||
var proto = BattlePassAllDataNotify.newBuilder();
|
||||
|
||||
proto
|
||||
.setHaveCurSchedule(true)
|
||||
.setCurSchedule(player.getBattlePassManager().getScheduleProto());
|
||||
|
||||
int level = (int) Math.floor(value / 1000d);
|
||||
|
||||
var point = value - level * 1000;
|
||||
|
||||
List<BattlePassRewardTagOuterClass.BattlePassRewardTag> rewardTags = new ArrayList<>();
|
||||
|
||||
for (int id = 1; id <= player.getBattlePassManager().getAwardTakenLevel(); id++)
|
||||
rewardTags.add(BattlePassRewardTagOuterClass.BattlePassRewardTag.newBuilder()
|
||||
.setLevel(id)
|
||||
.setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE)
|
||||
.setRewardId(1001000 + id)
|
||||
.build());
|
||||
|
||||
|
||||
var proto
|
||||
= BattlePassAllDataNotifyOuterClass.BattlePassAllDataNotify.newBuilder();
|
||||
|
||||
var missions
|
||||
= GameData.getBattlePassMissionExcelConfigDataMap();
|
||||
|
||||
|
||||
var curSchedule
|
||||
= BattlePassScheduleOuterClass.BattlePassSchedule.newBuilder()
|
||||
.setScheduleId(2700).setLevel(level).setPoint(point).setBeginTime(1653940800).setEndTime(2059483200).addAllRewardTakenList(rewardTags)
|
||||
.setIsViewed(true).setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE).setCurCyclePoints(0)
|
||||
.setCurCycle(BattlePassCycleOuterClass.BattlePassCycle.newBuilder().setBeginTime(1653940800).setEndTime(2059483200).setCycleIdx(3).build());
|
||||
|
||||
proto.setHaveCurSchedule(true).setCurSchedule(curSchedule);
|
||||
|
||||
|
||||
//TODO: UNFINISHED YET / Need to add mission data --> Hard work
|
||||
|
||||
for (var mission : missions.values())
|
||||
proto.addMissionList(BattlePassMissionOuterClass.BattlePassMission.newBuilder()
|
||||
.setMissionId(mission.getId())
|
||||
.setMissionStatus(BattlePassMissionOuterClass.BattlePassMission.MissionStatus.MISSION_STATUS_UNFINISHED)
|
||||
.setTotalProgress(mission.getProgress())
|
||||
.setMissionType(
|
||||
mission.getRefreshType() == null ? 0 :
|
||||
mission.getRefreshType().equals("BATTLE_PASS_MISSION_REFRESH_SCHEDULE") ? 2 : mission.getRefreshType().contains("CYCLE") ? 1 : 0)
|
||||
.setRewardBattlePassPoint(mission.getAddPoint())
|
||||
.build());
|
||||
for (var missionData : GameData.getBattlePassMissionDataMap().values()) {
|
||||
// Dont send invalid refresh types
|
||||
if (!missionData.isValidRefreshType()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if player has mission in bp manager. If not, then add an empty proto from the mission data
|
||||
if (player.getBattlePassManager().hasMission(missionData.getId())) {
|
||||
proto.addMissionList(player.getBattlePassManager().loadMissionById(missionData.getId()).toProto());
|
||||
} else {
|
||||
proto.addMissionList(missionData.toProto());
|
||||
}
|
||||
}
|
||||
|
||||
setData(proto.build());
|
||||
}
|
||||
|
||||
@@ -4,36 +4,22 @@ import emu.grasscutter.game.player.Player;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.*;
|
||||
import emu.grasscutter.net.proto.BattlePassCurScheduleUpdateNotifyOuterClass.BattlePassCurScheduleUpdateNotify;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PacketBattlePassCurScheduleUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketBattlePassCurScheduleUpdateNotify(Player player) {
|
||||
super(PacketOpcodes.BattlePassCurScheduleUpdateNotify);
|
||||
|
||||
var value = player.getBattlePassManager().getPoint();
|
||||
int level = (int) Math.floor(value / 1000d);
|
||||
var point = value - level * 1000;
|
||||
var proto = BattlePassCurScheduleUpdateNotify.newBuilder();
|
||||
|
||||
List<BattlePassRewardTagOuterClass.BattlePassRewardTag> rewardTags = new ArrayList<>();
|
||||
|
||||
for (int id = 1; id <= player.getBattlePassManager().getAwardTakenLevel(); id++)
|
||||
rewardTags.add(BattlePassRewardTagOuterClass.BattlePassRewardTag.newBuilder()
|
||||
.setLevel(id)
|
||||
.setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE)
|
||||
.setRewardId(1001000 + id)
|
||||
.build());
|
||||
|
||||
var curSchedule
|
||||
= BattlePassScheduleOuterClass.BattlePassSchedule.newBuilder()
|
||||
.setScheduleId(2700).setLevel(level).setPoint(point).setBeginTime(1653940800).setEndTime(2059483200).addAllRewardTakenList(rewardTags)
|
||||
.setIsViewed(true).setUnlockStatus(BattlePassUnlockStatusOuterClass.BattlePassUnlockStatus.BATTLE_PASS_UNLOCK_STATUS_FREE).setCurCyclePoints(0)
|
||||
.setCurCycle(BattlePassCycleOuterClass.BattlePassCycle.newBuilder().setBeginTime(1653940800).setEndTime(2059483200).setCycleIdx(3).build());
|
||||
|
||||
var proto = BattlePassCurScheduleUpdateNotifyOuterClass.BattlePassCurScheduleUpdateNotify.newBuilder();
|
||||
|
||||
proto.setHaveCurSchedule(true).setCurSchedule(curSchedule).build();
|
||||
proto
|
||||
.setHaveCurSchedule(true)
|
||||
.setCurSchedule(player.getBattlePassManager().getScheduleProto())
|
||||
.build();
|
||||
|
||||
setData(proto.build());
|
||||
|
||||
|
||||
@@ -1,39 +1,33 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.excels.BattlePassMissionExcelConfigData;
|
||||
import java.util.Collection;
|
||||
|
||||
import emu.grasscutter.game.battlepass.BattlePassMission;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BattlePassMissionOuterClass;
|
||||
import emu.grasscutter.net.proto.BattlePassMissionUpdateNotifyOuterClass;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import emu.grasscutter.net.proto.BattlePassMissionUpdateNotifyOuterClass.BattlePassMissionUpdateNotify;
|
||||
|
||||
public class PacketBattlePassMissionUpdateNotify extends BasePacket {
|
||||
|
||||
public PacketBattlePassMissionUpdateNotify(List<Integer> missionIdList , GameSession session) {
|
||||
public PacketBattlePassMissionUpdateNotify(BattlePassMission mission) {
|
||||
super(PacketOpcodes.BattlePassMissionUpdateNotify);
|
||||
|
||||
var proto
|
||||
= BattlePassMissionUpdateNotifyOuterClass.BattlePassMissionUpdateNotify.newBuilder();
|
||||
var proto = BattlePassMissionUpdateNotify.newBuilder()
|
||||
.addMissionList(mission.toProto())
|
||||
.build();
|
||||
|
||||
Map<Integer, BattlePassMissionExcelConfigData> missionMap
|
||||
= GameData.getBattlePassMissionExcelConfigDataMap();
|
||||
this.setData(proto);
|
||||
}
|
||||
|
||||
public PacketBattlePassMissionUpdateNotify(Collection<BattlePassMission> missions) {
|
||||
super(PacketOpcodes.BattlePassMissionUpdateNotify);
|
||||
|
||||
missionIdList.forEach(missionId -> proto.addMissionList
|
||||
(BattlePassMissionOuterClass.BattlePassMission.newBuilder().setMissionId(missionId).setMissionStatus
|
||||
(BattlePassMissionOuterClass.BattlePassMission.MissionStatus.MISSION_STATUS_POINT_TAKEN)
|
||||
.setTotalProgress(missionMap.get(missionId).getProgress()).setRewardBattlePassPoint(missionMap.get(missionId).getAddPoint()).build()));
|
||||
|
||||
var point = session.getPlayer().getBattlePassManager().getPoint();
|
||||
missionIdList.forEach(missionId
|
||||
-> session.getPlayer().getBattlePassManager().addPoint(missionMap.get(missionId).getAddPoint()));
|
||||
Grasscutter.getLogger().info("[PacketBattlePassMissionUpdateNotify] addPoint: {}", session.getPlayer().getBattlePassManager().getPoint() - point);
|
||||
var proto = BattlePassMissionUpdateNotify.newBuilder();
|
||||
|
||||
missions.forEach(mission -> {
|
||||
proto.addMissionList(mission.toProto());
|
||||
});
|
||||
|
||||
this.setData(proto.build());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BuyBattlePassLevelRspOuterClass.BuyBattlePassLevelRsp;
|
||||
|
||||
public class PacketBuyBattlePassLevelRsp extends BasePacket {
|
||||
|
||||
public PacketBuyBattlePassLevelRsp(int buyLevel) {
|
||||
super(PacketOpcodes.BuyBattlePassLevelRsp);
|
||||
|
||||
BuyBattlePassLevelRsp proto = BuyBattlePassLevelRsp.newBuilder()
|
||||
.setBuyLevel(buyLevel)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.SetBattlePassViewedRspOuterClass.SetBattlePassViewedRsp;
|
||||
|
||||
public class PacketSetBattlePassViewedRsp extends BasePacket {
|
||||
|
||||
public PacketSetBattlePassViewedRsp(int scheduleId) {
|
||||
super(PacketOpcodes.SetBattlePassViewedRsp);
|
||||
|
||||
SetBattlePassViewedRsp proto = SetBattlePassViewedRsp.newBuilder()
|
||||
.setScheduleId(scheduleId)
|
||||
.build();
|
||||
|
||||
this.setData(proto);
|
||||
}
|
||||
}
|
||||
@@ -1,49 +1,28 @@
|
||||
package emu.grasscutter.server.packet.send;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GameData;
|
||||
import emu.grasscutter.data.excels.BattlePassRewardExcelConfigData;
|
||||
import emu.grasscutter.data.excels.RewardData;
|
||||
import emu.grasscutter.data.common.ItemParamData;
|
||||
import emu.grasscutter.net.packet.BasePacket;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.BattlePassRewardTakeOptionOuterClass;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
||||
import emu.grasscutter.net.proto.TakeBattlePassRewardRspOuterClass;
|
||||
import emu.grasscutter.net.proto.BattlePassRewardTakeOptionOuterClass.BattlePassRewardTakeOption;
|
||||
import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam;
|
||||
import emu.grasscutter.net.proto.TakeBattlePassRewardRspOuterClass.TakeBattlePassRewardRsp;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class PacketTakeBattlePassRewardRsp extends BasePacket {
|
||||
public PacketTakeBattlePassRewardRsp(List<BattlePassRewardTakeOptionOuterClass.BattlePassRewardTakeOption> takeOptionList , GameSession session) {
|
||||
public PacketTakeBattlePassRewardRsp(List<BattlePassRewardTakeOption> takeOptionList, List<ItemParamData> rewardItems) {
|
||||
super(PacketOpcodes.TakeBattlePassRewardRsp);
|
||||
|
||||
var proto
|
||||
= TakeBattlePassRewardRspOuterClass.TakeBattlePassRewardRsp.newBuilder();
|
||||
|
||||
Map<Integer , BattlePassRewardExcelConfigData> excelConfigDataMap = GameData.getBattlePassRewardExcelConfigDataMap();
|
||||
Map<Integer , RewardData> rewardDataMap = GameData.getRewardDataMap();
|
||||
|
||||
List<Integer> rewardItemList = new ArrayList<>();
|
||||
|
||||
for (var takeOption : takeOptionList) {
|
||||
for (int level = session.getPlayer().getBattlePassManager().getAwardTakenLevel() + 1 ; level <= takeOption.getTag().getLevel() ; level++){
|
||||
rewardItemList.addAll(excelConfigDataMap.get(level).getFreeRewardIdList());
|
||||
rewardItemList.addAll(excelConfigDataMap.get(level).getPaidRewardIdList());
|
||||
var proto = TakeBattlePassRewardRsp.newBuilder()
|
||||
.addAllTakeOptionList(takeOptionList);
|
||||
|
||||
if (rewardItems != null) {
|
||||
for (ItemParamData param : rewardItems) {
|
||||
proto.addItemList(ItemParam.newBuilder().setItemId(param.getItemId()).setCount(param.getCount()));
|
||||
}
|
||||
|
||||
for (var rewardItemId : rewardItemList) {
|
||||
var rewardData = rewardDataMap.get(rewardItemId);
|
||||
if (rewardData == null) continue;
|
||||
rewardData.getRewardItemList().forEach(i ->
|
||||
proto.addItemList(ItemParamOuterClass.ItemParam.newBuilder().setItemId(i.getId()).setCount(i.getCount()).build()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
proto.addAllTakeOptionList(takeOptionList).build();
|
||||
|
||||
setData(proto);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user