diff --git a/proto/BattlePassAllDataNotify.proto b/proto/BattlePassAllDataNotify.proto new file mode 100644 index 000000000..bd80adc09 --- /dev/null +++ b/proto/BattlePassAllDataNotify.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassMission.proto"; +import "BattlePassSchedule.proto"; + +// CmdId: 2618 +// EnetChannelId: 0 +// EnetIsReliable: true +message BattlePassAllDataNotify { + bool have_cur_schedule = 11; + BattlePassSchedule cur_schedule = 10; + repeated BattlePassMission mission_list = 1; +} diff --git a/proto/BattlePassBuySuccNotify.proto b/proto/BattlePassBuySuccNotify.proto new file mode 100644 index 000000000..2d00bcdcb --- /dev/null +++ b/proto/BattlePassBuySuccNotify.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "ItemParam.proto"; + +// CmdId: 2614 +// EnetChannelId: 0 +// EnetIsReliable: true +message BattlePassBuySuccNotify { + uint32 schedule_id = 7; + uint32 product_play_type = 9; + repeated ItemParam item_list = 6; + uint32 add_point = 2; +} diff --git a/proto/BattlePassCurScheduleUpdateNotify.proto b/proto/BattlePassCurScheduleUpdateNotify.proto new file mode 100644 index 000000000..f392aea7d --- /dev/null +++ b/proto/BattlePassCurScheduleUpdateNotify.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassSchedule.proto"; + +// CmdId: 2604 +// EnetChannelId: 0 +// EnetIsReliable: true +message BattlePassCurScheduleUpdateNotify { + bool have_cur_schedule = 9; + BattlePassSchedule cur_schedule = 15; +} diff --git a/proto/BattlePassCycle.proto b/proto/BattlePassCycle.proto new file mode 100644 index 000000000..c36bdf564 --- /dev/null +++ b/proto/BattlePassCycle.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +message BattlePassCycle { + uint32 cycle_idx = 1; + uint32 begin_time = 2; + uint32 end_time = 3; +} diff --git a/proto/BattlePassMission.proto b/proto/BattlePassMission.proto new file mode 100644 index 000000000..54788243c --- /dev/null +++ b/proto/BattlePassMission.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +message BattlePassMission { + uint32 mission_id = 1; + uint32 cur_progress = 2; + uint32 total_progress = 3; + uint32 reward_battle_pass_point = 4; + uint32 mission_type = 5; + MissionStatus mission_status = 6; + + enum MissionStatus { + MISSION_STATUS_INVALID = 0; + MISSION_STATUS_UNFINISHED = 1; + MISSION_STATUS_FINISHED = 2; + MISSION_STATUS_POINT_TAKEN = 3; + } +} diff --git a/proto/BattlePassMissionDelNotify.proto b/proto/BattlePassMissionDelNotify.proto new file mode 100644 index 000000000..5b148cd1d --- /dev/null +++ b/proto/BattlePassMissionDelNotify.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2643 +// EnetChannelId: 0 +// EnetIsReliable: true +message BattlePassMissionDelNotify { + repeated uint32 del_mission_id_list = 4; +} diff --git a/proto/BattlePassMissionUpdateNotify.proto b/proto/BattlePassMissionUpdateNotify.proto new file mode 100644 index 000000000..58a8f4a2e --- /dev/null +++ b/proto/BattlePassMissionUpdateNotify.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassMission.proto"; + +// CmdId: 2609 +// EnetChannelId: 0 +// EnetIsReliable: true +message BattlePassMissionUpdateNotify { + repeated BattlePassMission mission_list = 6; +} diff --git a/proto/BattlePassProduct.proto b/proto/BattlePassProduct.proto new file mode 100644 index 000000000..d22d258f0 --- /dev/null +++ b/proto/BattlePassProduct.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +message BattlePassProduct { + string normal_product_id = 1; + string extra_product_id = 2; + string upgrade_product_id = 3; +} diff --git a/proto/BattlePassRewardTag.proto b/proto/BattlePassRewardTag.proto new file mode 100644 index 000000000..8a3067a18 --- /dev/null +++ b/proto/BattlePassRewardTag.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassUnlockStatus.proto"; + +message BattlePassRewardTag { + BattlePassUnlockStatus unlock_status = 1; + uint32 level = 2; + uint32 reward_id = 3; +} diff --git a/proto/BattlePassRewardTakeOption.proto b/proto/BattlePassRewardTakeOption.proto new file mode 100644 index 000000000..84a5527cb --- /dev/null +++ b/proto/BattlePassRewardTakeOption.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassRewardTag.proto"; + +message BattlePassRewardTakeOption { + BattlePassRewardTag tag = 1; + uint32 option_idx = 2; +} diff --git a/proto/BattlePassSchedule.proto b/proto/BattlePassSchedule.proto new file mode 100644 index 000000000..223875e08 --- /dev/null +++ b/proto/BattlePassSchedule.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassCycle.proto"; +import "BattlePassProduct.proto"; +import "BattlePassRewardTag.proto"; +import "BattlePassUnlockStatus.proto"; + +message BattlePassSchedule { + uint32 schedule_id = 1; + uint32 level = 2; + uint32 point = 3; + BattlePassUnlockStatus unlock_status = 4; + repeated BattlePassRewardTag reward_taken_list = 5; + uint32 begin_time = 6; + uint32 end_time = 7; + BattlePassCycle cur_cycle = 8; + bool is_extra_paid_reward_taken = 9; + BattlePassProduct product_info = 10; + bool is_viewed = 11; + uint32 cur_cycle_points = 12; + uint32 JPFMGBEBBBJ = 13; +} diff --git a/proto/BattlePassUnlockStatus.proto b/proto/BattlePassUnlockStatus.proto new file mode 100644 index 000000000..9c894896a --- /dev/null +++ b/proto/BattlePassUnlockStatus.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +enum BattlePassUnlockStatus { + BATTLE_PASS_UNLOCK_STATUS_INVALID = 0; + BATTLE_PASS_UNLOCK_STATUS_FREE = 1; + BATTLE_PASS_UNLOCK_STATUS_PAID = 2; +} diff --git a/proto/BuyBattlePassLevelReq.proto b/proto/BuyBattlePassLevelReq.proto new file mode 100644 index 000000000..bec8d27a6 --- /dev/null +++ b/proto/BuyBattlePassLevelReq.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2612 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message BuyBattlePassLevelReq { + uint32 buy_level = 10; +} diff --git a/proto/BuyBattlePassLevelRsp.proto b/proto/BuyBattlePassLevelRsp.proto new file mode 100644 index 000000000..62dd6d3d0 --- /dev/null +++ b/proto/BuyBattlePassLevelRsp.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2646 +// EnetChannelId: 0 +// EnetIsReliable: true +message BuyBattlePassLevelRsp { + int32 retcode = 9; + uint32 buy_level = 6; +} diff --git a/proto/GetBattlePassProductReq.proto b/proto/GetBattlePassProductReq.proto new file mode 100644 index 000000000..9cee2e697 --- /dev/null +++ b/proto/GetBattlePassProductReq.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2616 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message GetBattlePassProductReq { + uint32 battle_pass_product_play_type = 2; +} diff --git a/proto/GetBattlePassProductRsp.proto b/proto/GetBattlePassProductRsp.proto new file mode 100644 index 000000000..bb2e15f51 --- /dev/null +++ b/proto/GetBattlePassProductRsp.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2601 +// EnetChannelId: 0 +// EnetIsReliable: true +message GetBattlePassProductRsp { + int32 retcode = 13; + uint32 battle_pass_product_play_type = 9; + uint32 cur_schedule_id = 12; + string product_id = 7; + string price_tier = 5; +} diff --git a/proto/SetBattlePassViewedReq.proto b/proto/SetBattlePassViewedReq.proto new file mode 100644 index 000000000..42e52ad5a --- /dev/null +++ b/proto/SetBattlePassViewedReq.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2637 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message SetBattlePassViewedReq { + uint32 schedule_id = 6; +} diff --git a/proto/SetBattlePassViewedRsp.proto b/proto/SetBattlePassViewedRsp.proto new file mode 100644 index 000000000..3fb81d2f3 --- /dev/null +++ b/proto/SetBattlePassViewedRsp.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2632 +// EnetChannelId: 0 +// EnetIsReliable: true +message SetBattlePassViewedRsp { + int32 retcode = 15; + uint32 schedule_id = 10; +} diff --git a/proto/TakeBattlePassMissionPointReq.proto b/proto/TakeBattlePassMissionPointReq.proto new file mode 100644 index 000000000..b0bba9575 --- /dev/null +++ b/proto/TakeBattlePassMissionPointReq.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2626 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message TakeBattlePassMissionPointReq { + repeated uint32 mission_id_list = 7; +} diff --git a/proto/TakeBattlePassMissionPointRsp.proto b/proto/TakeBattlePassMissionPointRsp.proto new file mode 100644 index 000000000..bd6fa87e5 --- /dev/null +++ b/proto/TakeBattlePassMissionPointRsp.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 2647 +// EnetChannelId: 0 +// EnetIsReliable: true +message TakeBattlePassMissionPointRsp { + int32 retcode = 12; + repeated uint32 mission_id_list = 2; +} diff --git a/proto/TakeBattlePassRewardReq.proto b/proto/TakeBattlePassRewardReq.proto new file mode 100644 index 000000000..3da3c0064 --- /dev/null +++ b/proto/TakeBattlePassRewardReq.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassRewardTakeOption.proto"; + +// CmdId: 2628 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message TakeBattlePassRewardReq { + repeated BattlePassRewardTakeOption take_option_list = 4; +} diff --git a/proto/TakeBattlePassRewardRsp.proto b/proto/TakeBattlePassRewardRsp.proto new file mode 100644 index 000000000..e4eb03db0 --- /dev/null +++ b/proto/TakeBattlePassRewardRsp.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "BattlePassRewardTakeOption.proto"; +import "ItemParam.proto"; + +// CmdId: 2603 +// EnetChannelId: 0 +// EnetIsReliable: true +message TakeBattlePassRewardRsp { + int32 retcode = 2; + repeated BattlePassRewardTakeOption take_option_list = 1; + repeated ItemParam item_list = 5; +} diff --git a/src/main/java/emu/grasscutter/command/commands/SetBPLevelCommand.java b/src/main/java/emu/grasscutter/command/commands/SetBPLevelCommand.java new file mode 100644 index 000000000..2da2567dd --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/SetBPLevelCommand.java @@ -0,0 +1,23 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.player.Player; + +import java.util.List; + +@Command(label = "setbp", usage = "", aliases = "bp",permission = "player.setbp", description = "") +public final class SetBPLevelCommand implements CommandHandler { + @Override + public void execute(Player sender, Player targetPlayer, List args) { + if (args.size() < 1) { + CommandHandler.sendMessage(sender , "Need a arg"); + return; + } + + int level = Integer.parseInt(args.get(0)); + + sender.getBattlePassManager().addPoint(level); + sender.getBattlePassManager().updateAwardTakenLevel(0); + } +} diff --git a/src/main/java/emu/grasscutter/data/GameData.java b/src/main/java/emu/grasscutter/data/GameData.java index cfb9859c0..4be0d464f 100644 --- a/src/main/java/emu/grasscutter/data/GameData.java +++ b/src/main/java/emu/grasscutter/data/GameData.java @@ -94,6 +94,8 @@ public class GameData { private static final Int2ObjectMap furnitureMakeConfigDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap investigationMonsterDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap cityDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap battlePassMissionExcelConfigDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap battlePassRewardExcelConfigDataMap = new Int2ObjectOpenHashMap<>(); // Cache private static Map> fetters = new HashMap<>(); @@ -416,4 +418,11 @@ public class GameData { return cityDataMap; } + public static Int2ObjectMap getBattlePassMissionExcelConfigDataMap() { + return battlePassMissionExcelConfigDataMap; + } + + public static Int2ObjectMap getBattlePassRewardExcelConfigDataMap() { + return battlePassRewardExcelConfigDataMap; + } } diff --git a/src/main/java/emu/grasscutter/data/excels/BattlePassMissionExcelConfigData.java b/src/main/java/emu/grasscutter/data/excels/BattlePassMissionExcelConfigData.java new file mode 100644 index 000000000..10ecd963b --- /dev/null +++ b/src/main/java/emu/grasscutter/data/excels/BattlePassMissionExcelConfigData.java @@ -0,0 +1,29 @@ +package emu.grasscutter.data.excels; + +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.FieldDefaults; + +@ResourceType(name = {"BattlePassMissionExcelConfigData.json"}) +@FieldDefaults(level = AccessLevel.PRIVATE) +@Getter +@Setter +public class BattlePassMissionExcelConfigData extends GameResource { + + private int addPoint; + private int id; + private int progress; + private String refreshType; + + @Override + public void onLoad() { + } + + @Override + public int getId() { + return this.id; + } +} diff --git a/src/main/java/emu/grasscutter/data/excels/BattlePassRewardExcelConfigData.java b/src/main/java/emu/grasscutter/data/excels/BattlePassRewardExcelConfigData.java new file mode 100644 index 000000000..ca7f6277a --- /dev/null +++ b/src/main/java/emu/grasscutter/data/excels/BattlePassRewardExcelConfigData.java @@ -0,0 +1,27 @@ +package emu.grasscutter.data.excels; + +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@ResourceType(name = "BattlePassRewardExcelConfigData.json") +@Getter +@Setter +public class BattlePassRewardExcelConfigData extends GameResource { + private int indexId; + private int level; + private List freeRewardIdList; + private List paidRewardIdList; + + @Override + public int getId() { + return this.level; + } + + @Override + public void onLoad() { + } +} diff --git a/src/main/java/emu/grasscutter/game/Account.java b/src/main/java/emu/grasscutter/game/Account.java index 840c10b79..cdb118af8 100644 --- a/src/main/java/emu/grasscutter/game/Account.java +++ b/src/main/java/emu/grasscutter/game/Account.java @@ -29,6 +29,9 @@ public class Account { private List permissions; private Locale locale; + private int point; + private int awardTakenLevel; + private String banReason; private int banEndTime; private int banStartTime; @@ -208,7 +211,23 @@ public class Account { public boolean removePermission(String permission) { return this.permissions.remove(permission); } - + + public void setPoint(int point) { + this.point = point; + } + + public int getPoint() { + return point; + } + + public void setAwardTakenLevel(int level) { + this.awardTakenLevel = level; + } + + public int getAwardTakenLevel() { + return awardTakenLevel; + } + // TODO make unique public String generateLoginToken() { this.token = Utils.bytesToHex(Crypto.createSessionKey(32)); diff --git a/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java b/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java new file mode 100644 index 000000000..c4aa84f71 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/battlepass/BattlePassManager.java @@ -0,0 +1,40 @@ +package emu.grasscutter.game.battlepass; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.server.packet.send.PacketBattlePassCurScheduleUpdateNotify; + +public class BattlePassManager { + + private final Player player; + private int point; + private int awardTakenLevel; + + public BattlePassManager(Player player){ + this.player = player; + point = player.getAccount().getPoint(); + awardTakenLevel = player.getAccount().getAwardTakenLevel(); + } + + public void addPoint(int point){ + this.point += point; + player.getAccount().setPoint(point); + player.getSession().send(new PacketBattlePassCurScheduleUpdateNotify(player.getSession().getPlayer())); + //save the point data + player.getAccount().save(); + } + + public void updateAwardTakenLevel(int level){ + this.awardTakenLevel = level; + player.getAccount().setAwardTakenLevel(awardTakenLevel); + player.getSession().send(new PacketBattlePassCurScheduleUpdateNotify(player.getSession().getPlayer())); + player.getAccount().save(); + } + + public int getPoint() { + return point; + } + + public int getAwardTakenLevel() { + return awardTakenLevel; + } +} diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index afe5e3b10..ef32f1624 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -12,6 +12,7 @@ import emu.grasscutter.game.ability.AbilityManager; import emu.grasscutter.game.avatar.Avatar; import emu.grasscutter.game.avatar.AvatarProfileData; import emu.grasscutter.game.avatar.AvatarStorage; +import emu.grasscutter.game.battlepass.BattlePassManager; import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.entity.EntityVehicle; import emu.grasscutter.game.home.GameHome; @@ -169,6 +170,7 @@ public class Player { @Transient private DeforestationManager deforestationManager; @Transient private GameHome home; @Transient private FurnitureManager furnitureManager; + @Transient private BattlePassManager battlePassManager; private long springLastUsed; private HashMap mapMarks; @@ -290,6 +292,10 @@ public class Player { this.account = account; } + public void setBattlePassManager(Player player){ + this.battlePassManager = new BattlePassManager(player); + } + public GameSession getSession() { return session; } @@ -1206,6 +1212,10 @@ public class Player { return furnitureManager; } + public BattlePassManager getBattlePassManager(){ + return battlePassManager; + } + public AbilityManager getAbilityManager() { return abilityManager; } @@ -1348,6 +1358,7 @@ public class Player { session.send(new PacketPlayerStoreNotify(this)); session.send(new PacketAvatarDataNotify(this)); session.send(new PacketFinishedParentQuestNotify(this)); + session.send(new PacketBattlePassAllDataNotify(this)); session.send(new PacketQuestListNotify(this)); session.send(new PacketCodexDataFullNotify(this)); session.send(new PacketAllWidgetDataNotify(this)); diff --git a/src/main/java/emu/grasscutter/server/game/GameSession.java b/src/main/java/emu/grasscutter/server/game/GameSession.java index fdec9d2ca..effaea4a0 100644 --- a/src/main/java/emu/grasscutter/server/game/GameSession.java +++ b/src/main/java/emu/grasscutter/server/game/GameSession.java @@ -76,6 +76,7 @@ public class GameSession implements GameSessionManager.KcpChannel { this.player = player; this.player.setSession(this); this.player.setAccount(this.getAccount()); + this.player.setBattlePassManager(this.player);; } public SessionState getState() { diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakeBattlePassMissionPointReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakeBattlePassMissionPointReq.java new file mode 100644 index 000000000..c7a7e68cd --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakeBattlePassMissionPointReq.java @@ -0,0 +1,25 @@ +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.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) +public class HandlerTakeBattlePassMissionPointReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + var req + = TakeBattlePassMissionPointReqOuterClass.TakeBattlePassMissionPointReq.parseFrom(payload); + + session.send(new PacketBattlePassMissionUpdateNotify(req.getMissionIdListList() , session)); + session.send(new PacketBattlePassCurScheduleUpdateNotify(session.getPlayer())); + session.send(new PacketTakeBattlePassMissionPointRsp()); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakeBattlePassRewardReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakeBattlePassRewardReq.java new file mode 100644 index 000000000..6204d7489 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerTakeBattlePassRewardReq.java @@ -0,0 +1,24 @@ +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.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketTakeBattlePassRewardRsp; + +@Opcodes(PacketOpcodes.TakeBattlePassRewardReq) +public class HandlerTakeBattlePassRewardReq extends PacketHandler { + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + var req + = TakeBattlePassRewardReqOuterClass.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())); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java new file mode 100644 index 000000000..a986a220c --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassAllDataNotify.java @@ -0,0 +1,63 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.data.GameData; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.*; + +import java.util.ArrayList; +import java.util.List; + +public class PacketBattlePassAllDataNotify extends BasePacket { + public PacketBattlePassAllDataNotify(Player player) { + super(PacketOpcodes.BattlePassAllDataNotify); + + var value = player.getBattlePassManager().getPoint(); + + int level = (int) Math.floor(value / 1000d); + + var point = value - level * 1000; + + List rewardTags = new ArrayList<>(); + + for (int id = 1; id <= player.getAccount().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()); + + setData(proto.build()); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java new file mode 100644 index 000000000..0137e3e42 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassCurScheduleUpdateNotify.java @@ -0,0 +1,42 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.*; + +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; + + List rewardTags = new ArrayList<>(); + + for (int id = 1; id <= player.getAccount().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(); + + setData(proto.build()); + + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassMissionUpdateNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassMissionUpdateNotify.java new file mode 100644 index 000000000..06714e27e --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketBattlePassMissionUpdateNotify.java @@ -0,0 +1,40 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.excels.BattlePassMissionExcelConfigData; +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; + +public class PacketBattlePassMissionUpdateNotify extends BasePacket { + + public PacketBattlePassMissionUpdateNotify(List missionIdList , GameSession session) { + super(PacketOpcodes.BattlePassMissionUpdateNotify); + + var proto + = BattlePassMissionUpdateNotifyOuterClass.BattlePassMissionUpdateNotify.newBuilder(); + + Map missionMap + = GameData.getBattlePassMissionExcelConfigDataMap(); + + 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); + + this.setData(proto.build()); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassMissionPointRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassMissionPointRsp.java new file mode 100644 index 000000000..35d551d6a --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassMissionPointRsp.java @@ -0,0 +1,13 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.TakeBattlePassMissionPointRspOuterClass; + +import java.util.List; + +public class PacketTakeBattlePassMissionPointRsp extends BasePacket { + public PacketTakeBattlePassMissionPointRsp() { + super(PacketOpcodes.TakeBattlePassMissionPointRsp); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassRewardRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassRewardRsp.java new file mode 100644 index 000000000..f38e3fa68 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketTakeBattlePassRewardRsp.java @@ -0,0 +1,49 @@ +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.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.server.game.GameSession; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PacketTakeBattlePassRewardRsp extends BasePacket { + public PacketTakeBattlePassRewardRsp(List takeOptionList , GameSession session) { + super(PacketOpcodes.TakeBattlePassRewardRsp); + + var proto + = TakeBattlePassRewardRspOuterClass.TakeBattlePassRewardRsp.newBuilder(); + + Map excelConfigDataMap = GameData.getBattlePassRewardExcelConfigDataMap(); + Map rewardDataMap = GameData.getRewardDataMap(); + + List 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()); + } + + 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); + } +}