mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-01-28 03:13:12 +08:00
implement BattlePass (Except missions) (#1316)
* BattlePass * BattlePass
This commit is contained in:
parent
5c80146aaa
commit
d8f2421832
15
proto/BattlePassAllDataNotify.proto
Normal file
15
proto/BattlePassAllDataNotify.proto
Normal file
@ -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;
|
||||||
|
}
|
15
proto/BattlePassBuySuccNotify.proto
Normal file
15
proto/BattlePassBuySuccNotify.proto
Normal file
@ -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;
|
||||||
|
}
|
13
proto/BattlePassCurScheduleUpdateNotify.proto
Normal file
13
proto/BattlePassCurScheduleUpdateNotify.proto
Normal file
@ -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;
|
||||||
|
}
|
9
proto/BattlePassCycle.proto
Normal file
9
proto/BattlePassCycle.proto
Normal file
@ -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;
|
||||||
|
}
|
19
proto/BattlePassMission.proto
Normal file
19
proto/BattlePassMission.proto
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
10
proto/BattlePassMissionDelNotify.proto
Normal file
10
proto/BattlePassMissionDelNotify.proto
Normal file
@ -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;
|
||||||
|
}
|
12
proto/BattlePassMissionUpdateNotify.proto
Normal file
12
proto/BattlePassMissionUpdateNotify.proto
Normal file
@ -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;
|
||||||
|
}
|
9
proto/BattlePassProduct.proto
Normal file
9
proto/BattlePassProduct.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/BattlePassRewardTag.proto
Normal file
11
proto/BattlePassRewardTag.proto
Normal file
@ -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;
|
||||||
|
}
|
10
proto/BattlePassRewardTakeOption.proto
Normal file
10
proto/BattlePassRewardTakeOption.proto
Normal file
@ -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;
|
||||||
|
}
|
24
proto/BattlePassSchedule.proto
Normal file
24
proto/BattlePassSchedule.proto
Normal file
@ -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;
|
||||||
|
}
|
9
proto/BattlePassUnlockStatus.proto
Normal file
9
proto/BattlePassUnlockStatus.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/BuyBattlePassLevelReq.proto
Normal file
11
proto/BuyBattlePassLevelReq.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/BuyBattlePassLevelRsp.proto
Normal file
11
proto/BuyBattlePassLevelRsp.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/GetBattlePassProductReq.proto
Normal file
11
proto/GetBattlePassProductReq.proto
Normal file
@ -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;
|
||||||
|
}
|
14
proto/GetBattlePassProductRsp.proto
Normal file
14
proto/GetBattlePassProductRsp.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/SetBattlePassViewedReq.proto
Normal file
11
proto/SetBattlePassViewedReq.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/SetBattlePassViewedRsp.proto
Normal file
11
proto/SetBattlePassViewedRsp.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/TakeBattlePassMissionPointReq.proto
Normal file
11
proto/TakeBattlePassMissionPointReq.proto
Normal file
@ -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;
|
||||||
|
}
|
11
proto/TakeBattlePassMissionPointRsp.proto
Normal file
11
proto/TakeBattlePassMissionPointRsp.proto
Normal file
@ -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;
|
||||||
|
}
|
13
proto/TakeBattlePassRewardReq.proto
Normal file
13
proto/TakeBattlePassRewardReq.proto
Normal file
@ -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;
|
||||||
|
}
|
15
proto/TakeBattlePassRewardRsp.proto
Normal file
15
proto/TakeBattlePassRewardRsp.proto
Normal file
@ -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;
|
||||||
|
}
|
@ -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<String> 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);
|
||||||
|
}
|
||||||
|
}
|
@ -94,6 +94,8 @@ public class GameData {
|
|||||||
private static final Int2ObjectMap<FurnitureMakeConfigData> furnitureMakeConfigDataMap = new Int2ObjectOpenHashMap<>();
|
private static final Int2ObjectMap<FurnitureMakeConfigData> furnitureMakeConfigDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
private static final Int2ObjectMap<InvestigationMonsterData> investigationMonsterDataMap = new Int2ObjectOpenHashMap<>();
|
private static final Int2ObjectMap<InvestigationMonsterData> investigationMonsterDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
private static final Int2ObjectMap<CityData> cityDataMap = new Int2ObjectOpenHashMap<>();
|
private static final Int2ObjectMap<CityData> cityDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
|
private static final Int2ObjectMap<BattlePassMissionExcelConfigData> battlePassMissionExcelConfigDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
|
private static final Int2ObjectMap<BattlePassRewardExcelConfigData> battlePassRewardExcelConfigDataMap = new Int2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
// Cache
|
// Cache
|
||||||
private static Map<Integer, List<Integer>> fetters = new HashMap<>();
|
private static Map<Integer, List<Integer>> fetters = new HashMap<>();
|
||||||
@ -416,4 +418,11 @@ public class GameData {
|
|||||||
return cityDataMap;
|
return cityDataMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Int2ObjectMap<BattlePassMissionExcelConfigData> getBattlePassMissionExcelConfigDataMap() {
|
||||||
|
return battlePassMissionExcelConfigDataMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Int2ObjectMap<BattlePassRewardExcelConfigData> getBattlePassRewardExcelConfigDataMap() {
|
||||||
|
return battlePassRewardExcelConfigDataMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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<Integer> freeRewardIdList;
|
||||||
|
private List<Integer> paidRewardIdList;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getId() {
|
||||||
|
return this.level;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoad() {
|
||||||
|
}
|
||||||
|
}
|
@ -29,6 +29,9 @@ public class Account {
|
|||||||
private List<String> permissions;
|
private List<String> permissions;
|
||||||
private Locale locale;
|
private Locale locale;
|
||||||
|
|
||||||
|
private int point;
|
||||||
|
private int awardTakenLevel;
|
||||||
|
|
||||||
private String banReason;
|
private String banReason;
|
||||||
private int banEndTime;
|
private int banEndTime;
|
||||||
private int banStartTime;
|
private int banStartTime;
|
||||||
@ -209,6 +212,22 @@ public class Account {
|
|||||||
return this.permissions.remove(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
|
// TODO make unique
|
||||||
public String generateLoginToken() {
|
public String generateLoginToken() {
|
||||||
this.token = Utils.bytesToHex(Crypto.createSessionKey(32));
|
this.token = Utils.bytesToHex(Crypto.createSessionKey(32));
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@ import emu.grasscutter.game.ability.AbilityManager;
|
|||||||
import emu.grasscutter.game.avatar.Avatar;
|
import emu.grasscutter.game.avatar.Avatar;
|
||||||
import emu.grasscutter.game.avatar.AvatarProfileData;
|
import emu.grasscutter.game.avatar.AvatarProfileData;
|
||||||
import emu.grasscutter.game.avatar.AvatarStorage;
|
import emu.grasscutter.game.avatar.AvatarStorage;
|
||||||
|
import emu.grasscutter.game.battlepass.BattlePassManager;
|
||||||
import emu.grasscutter.game.entity.EntityMonster;
|
import emu.grasscutter.game.entity.EntityMonster;
|
||||||
import emu.grasscutter.game.entity.EntityVehicle;
|
import emu.grasscutter.game.entity.EntityVehicle;
|
||||||
import emu.grasscutter.game.home.GameHome;
|
import emu.grasscutter.game.home.GameHome;
|
||||||
@ -169,6 +170,7 @@ public class Player {
|
|||||||
@Transient private DeforestationManager deforestationManager;
|
@Transient private DeforestationManager deforestationManager;
|
||||||
@Transient private GameHome home;
|
@Transient private GameHome home;
|
||||||
@Transient private FurnitureManager furnitureManager;
|
@Transient private FurnitureManager furnitureManager;
|
||||||
|
@Transient private BattlePassManager battlePassManager;
|
||||||
|
|
||||||
private long springLastUsed;
|
private long springLastUsed;
|
||||||
private HashMap<String, MapMark> mapMarks;
|
private HashMap<String, MapMark> mapMarks;
|
||||||
@ -290,6 +292,10 @@ public class Player {
|
|||||||
this.account = account;
|
this.account = account;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setBattlePassManager(Player player){
|
||||||
|
this.battlePassManager = new BattlePassManager(player);
|
||||||
|
}
|
||||||
|
|
||||||
public GameSession getSession() {
|
public GameSession getSession() {
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
@ -1206,6 +1212,10 @@ public class Player {
|
|||||||
return furnitureManager;
|
return furnitureManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BattlePassManager getBattlePassManager(){
|
||||||
|
return battlePassManager;
|
||||||
|
}
|
||||||
|
|
||||||
public AbilityManager getAbilityManager() {
|
public AbilityManager getAbilityManager() {
|
||||||
return abilityManager;
|
return abilityManager;
|
||||||
}
|
}
|
||||||
@ -1348,6 +1358,7 @@ public class Player {
|
|||||||
session.send(new PacketPlayerStoreNotify(this));
|
session.send(new PacketPlayerStoreNotify(this));
|
||||||
session.send(new PacketAvatarDataNotify(this));
|
session.send(new PacketAvatarDataNotify(this));
|
||||||
session.send(new PacketFinishedParentQuestNotify(this));
|
session.send(new PacketFinishedParentQuestNotify(this));
|
||||||
|
session.send(new PacketBattlePassAllDataNotify(this));
|
||||||
session.send(new PacketQuestListNotify(this));
|
session.send(new PacketQuestListNotify(this));
|
||||||
session.send(new PacketCodexDataFullNotify(this));
|
session.send(new PacketCodexDataFullNotify(this));
|
||||||
session.send(new PacketAllWidgetDataNotify(this));
|
session.send(new PacketAllWidgetDataNotify(this));
|
||||||
|
@ -76,6 +76,7 @@ public class GameSession implements GameSessionManager.KcpChannel {
|
|||||||
this.player = player;
|
this.player = player;
|
||||||
this.player.setSession(this);
|
this.player.setSession(this);
|
||||||
this.player.setAccount(this.getAccount());
|
this.player.setAccount(this.getAccount());
|
||||||
|
this.player.setBattlePassManager(this.player);;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SessionState getState() {
|
public SessionState getState() {
|
||||||
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
@ -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()));
|
||||||
|
}
|
||||||
|
}
|
@ -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<BattlePassRewardTagOuterClass.BattlePassRewardTag> 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());
|
||||||
|
}
|
||||||
|
}
|
@ -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<BattlePassRewardTagOuterClass.BattlePassRewardTag> 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());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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<Integer> missionIdList , GameSession session) {
|
||||||
|
super(PacketOpcodes.BattlePassMissionUpdateNotify);
|
||||||
|
|
||||||
|
var proto
|
||||||
|
= BattlePassMissionUpdateNotifyOuterClass.BattlePassMissionUpdateNotify.newBuilder();
|
||||||
|
|
||||||
|
Map<Integer, BattlePassMissionExcelConfigData> 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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<BattlePassRewardTakeOptionOuterClass.BattlePassRewardTakeOption> takeOptionList , GameSession session) {
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user