diff --git a/Common/Database/Challenge/ChallengeData.cs b/Common/Database/Challenge/ChallengeData.cs index f7ede889..7b754716 100644 --- a/Common/Database/Challenge/ChallengeData.cs +++ b/Common/Database/Challenge/ChallengeData.cs @@ -14,6 +14,7 @@ public class ChallengeData : BaseDatabaseDataHelper [SugarColumn(IsJson = true)] public Dictionary TakenRewards { get; set; } = new(); [SugarColumn(IsJson = true)] public Dictionary PeakLevelDatas { get; set; } = new(); + [SugarColumn(IsJson = true)] public Dictionary PeakBossLevelDatas { get; set; } = new(); public void Delete(int challengeId) { @@ -24,8 +25,21 @@ public class ChallengeData : BaseDatabaseDataHelper public class ChallengePeakLevelData { public int LevelId { get; set; } + public uint RoundCnt { get; set; } public uint PeakStar { get; set; } public List BaseAvatarList { get; set; } = []; + public List FinishedTargetList { get; set; } = []; +} + +public class ChallengePeakBossLevelData +{ + public int LevelId { get; set; } + public uint BuffId { get; set; } + public bool IsHard { get; set; } + public uint RoundCnt { get; set; } + public uint PeakStar { get; set; } + public List BaseAvatarList { get; set; } = []; + public List FinishedTargetList { get; set; } = []; } public class ChallengeHistoryData(int uid, int challengeId) diff --git a/GameServer/Game/Challenge/Instances/ChallengePeakInstance.cs b/GameServer/Game/Challenge/Instances/ChallengePeakInstance.cs index 57143314..232651cd 100644 --- a/GameServer/Game/Challenge/Instances/ChallengePeakInstance.cs +++ b/GameServer/Game/Challenge/Instances/ChallengePeakInstance.cs @@ -19,6 +19,7 @@ public class ChallengePeakInstance(PlayerInstance player, ChallengeDataPb data) #region Properties public ChallengePeakConfigExcel Config { get; } = GameData.ChallengePeakConfigData[(int)data.Peak.CurrentPeakLevelId]; + public List AllBattleTargets { get; } = []; public bool IsWin { get; private set; } #endregion @@ -63,14 +64,22 @@ public class ChallengePeakInstance(PlayerInstance player, ChallengeDataPb data) { var excel = GameData.BattleTargetConfigData.GetValueOrDefault(Config.BossExcel.HardTarget); if (excel != null) + { battle.AddBattleTarget(5, excel.ID, 0, excel.TargetParam); + AllBattleTargets.Add(excel.ID); + } } - - foreach (var targetId in Config.NormalTargetList) + else { - var excel = GameData.BattleTargetConfigData.GetValueOrDefault(targetId); - if (excel != null) - battle.AddBattleTarget(5, excel.ID, 0, excel.TargetParam); + foreach (var targetId in Config.NormalTargetList) + { + var excel = GameData.BattleTargetConfigData.GetValueOrDefault(targetId); + if (excel != null) + { + battle.AddBattleTarget(5, excel.ID, 0, excel.TargetParam); + AllBattleTargets.Add(excel.ID); + } + } } } @@ -85,12 +94,17 @@ public class ChallengePeakInstance(PlayerInstance player, ChallengeDataPb data) if (monsters == 0) { Data.Peak.CurStatus = (int)ChallengeStatus.ChallengeFinish; - Data.Peak.Stars = CalculateStars(req); + var res = CalculateStars(req); + Data.Peak.Stars = res.Item1; + Data.Peak.RoundCnt = req.Stt.RoundCnt; IsWin = true; + + await Player.SendPacket(new PacketChallengePeakSettleScNotify(this, res.Item2)); - await Player.SendPacket(new PacketChallengePeakSettleScNotify(this)); // Call MissionManager await Player.MissionManager!.HandleFinishType(MissionFinishTypeEnum.ChallengeFinish, this); + + await Player.ChallengePeakManager!.SaveHistory(this, res.Item2); } // Set saved technique points (This will be restored if the player resets the challenge) @@ -110,27 +124,38 @@ public class ChallengePeakInstance(PlayerInstance player, ChallengeDataPb data) Data.Peak.CurStatus = (int)ChallengeStatus.ChallengeFailed; // Send challenge result data - await Player.SendPacket(new PacketChallengePeakSettleScNotify(this)); + await Player.SendPacket(new PacketChallengePeakSettleScNotify(this, [])); break; } } - public uint CalculateStars(PVEBattleResultCsReq req) + public (uint, List) CalculateStars(PVEBattleResultCsReq req) { - var targets = Config.NormalTargetList; + var targets = AllBattleTargets; var stars = 0u; + List finishedIds = []; foreach (var targetId in targets) { var target = req.Stt.BattleTargetInfo[5].BattleTargetList_.FirstOrDefault(x => x.Id == targetId); if (target == null) continue; + var excel = GameData.BattleTargetConfigData.GetValueOrDefault(targetId); + if (excel == null) continue; - if (target.Progress <= target.TotalProgress) - stars += 1u << targets.IndexOf(targetId); + if (target.Progress <= excel.TargetParam) + { + stars += 1u; + finishedIds.Add((uint)targetId); + } } - return Math.Min(stars, 7); + if (Data.Peak.IsHard && Config.BossExcel != null) + { + stars = 3; + } + + return (Math.Min(stars, 3), finishedIds); } #endregion diff --git a/GameServer/Game/ChallengePeak/ChallengePeakManager.cs b/GameServer/Game/ChallengePeak/ChallengePeakManager.cs index 7f93258c..95624bff 100644 --- a/GameServer/Game/ChallengePeak/ChallengePeakManager.cs +++ b/GameServer/Game/ChallengePeak/ChallengePeakManager.cs @@ -8,9 +8,7 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.Challenge; using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChallengePeak; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Proto.ServerSide; -using System.Drawing.Drawing2D; using EggLink.DanhengServer.Util; -using ChallengePeakInfo = EggLink.DanhengServer.Proto.ChallengePeakInfo; using ChallengePeakLevelInfo = EggLink.DanhengServer.Proto.ChallengePeakLevelInfo; namespace EggLink.DanhengServer.GameServer.Game.ChallengePeak; @@ -22,31 +20,37 @@ namespace EggLink.DanhengServer.GameServer.Game.ChallengePeak; /// public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(player) { - public ChallengePeakInfo GetChallengePeakInfo(int groupId) + public bool BossIsHard { get; set; } = true; + public ChallengePeakLevelInfo GetChallengePeakInfo(int groupId) { - var proto = new ChallengePeakInfo + var proto = new ChallengePeakLevelInfo { - CurPeakGroupId = (uint)groupId, + PeakGroupId = (uint)groupId, }; var data = GameData.ChallengePeakGroupConfigData.GetValueOrDefault(groupId); if (data == null) return proto; + var starNum = 0; foreach (var levelId in data.PreLevelIDList) { var levelData = GameData.ChallengePeakConfigData.GetValueOrDefault(levelId); if (levelData == null) continue; - var levelProto = new ChallengePeakLevelInfo + var levelProto = new ChallengePeakPreLevel { PeakLevelId = (uint)levelId, - IsRead = true + IsFinished = true }; if (Player.ChallengeManager!.ChallengeData.PeakLevelDatas.TryGetValue(levelId, out var levelPbData)) { - levelProto.PeakStar = levelPbData.PeakStar; - levelProto.PeakLevelLineup.AddRange(levelPbData.BaseAvatarList); + starNum += (int)levelPbData.PeakStar; + + levelProto.PeakRoundCount = levelPbData.RoundCnt; + levelProto.PeakLevelAvatarIdList.AddRange(levelPbData.BaseAvatarList); + levelProto.PeakTargetList.AddRange(levelPbData.FinishedTargetList); + foreach (var avatarId in levelPbData.BaseAvatarList) { var avatar = Player.AvatarManager!.GetFormalAvatar((int)avatarId); @@ -55,11 +59,15 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla levelProto.PeakAvatarInfoList.Add(avatar.ToPeakAvatarProto()); proto.PeakAvatarInfoList.Add(avatar.ToPeakAvatarProto()); } + + proto.FinishedPreNum++; } - proto.PeakLevelInfoList.Add(levelProto); + proto.PeakPreLevelInfoList.Add(levelProto); } + proto.PreLevelStars = (uint)starNum; + // boss var bossLevelId = data.BossLevelID; if (bossLevelId <= 0) return proto; @@ -67,26 +75,67 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla var bossLevelData = GameData.ChallengePeakBossConfigData.GetValueOrDefault(bossLevelId); if (bossLevelData == null) return proto; - var bossProto = new ChallengePeakLevelInfo + var bossProto = new ChallengePeakBossLevel { PeakLevelId = (uint)bossLevelId, - IsRead = true + IsFinished = true, + PeakEasyBoss = new ChallengePeakBossInfo(), + PeakHardBoss = new ChallengePeakBossInfo() }; - if (Player.ChallengeManager!.ChallengeData.PeakLevelDatas.TryGetValue(bossLevelId, out var bossPbData)) + HashSet targetIds = []; + HashSet avatarIds = []; + if (Player.ChallengeManager!.ChallengeData.PeakBossLevelDatas.TryGetValue(bossLevelId << 2 & 0, out var bossPbData)) // easy (is hard = 0) { - bossProto.PeakStar = bossPbData.PeakStar; - bossProto.PeakLevelLineup.AddRange(bossPbData.BaseAvatarList); + bossProto.PeakEasyBoss.PeakLevelAvatarIdList.AddRange(bossPbData.BaseAvatarList); + bossProto.PeakEasyBoss.BossDisplayAvatarIdList.AddRange(bossPbData.BaseAvatarList); + + bossProto.PeakEasyBoss.LeastRoundsCount = bossPbData.RoundCnt; + bossProto.PeakEasyBoss.IsFinished = true; + bossProto.PeakEasyBoss.BuffId = bossPbData.BuffId; + + foreach (var targetId in bossPbData.FinishedTargetList) + { + targetIds.Add(targetId); + } + foreach (var avatarId in bossPbData.BaseAvatarList) { - var avatar = Player.AvatarManager!.GetFormalAvatar((int)avatarId); - if (avatar == null) continue; - bossProto.PeakAvatarInfoList.Add(avatar.ToPeakAvatarProto()); - proto.PeakAvatarInfoList.Add(avatar.ToPeakAvatarProto()); + avatarIds.Add(avatarId); } } - proto.PeakLevelInfoList.Add(bossProto); + if (Player.ChallengeManager!.ChallengeData.PeakBossLevelDatas.TryGetValue(bossLevelId << 2 | 1, out var bossHardPbData)) // easy (is hard = 1) + { + bossProto.IsUltraBossWin = true; + bossProto.PeakHardBoss.PeakLevelAvatarIdList.AddRange(bossHardPbData.BaseAvatarList); + bossProto.PeakHardBoss.BossDisplayAvatarIdList.AddRange(bossHardPbData.BaseAvatarList); + + bossProto.PeakHardBoss.LeastRoundsCount = bossHardPbData.RoundCnt; + bossProto.PeakHardBoss.IsFinished = true; + bossProto.PeakHardBoss.BuffId = bossHardPbData.BuffId; + + foreach (var targetId in bossHardPbData.FinishedTargetList) + { + targetIds.Add(targetId); + } + + foreach (var avatarId in bossHardPbData.BaseAvatarList) + { + avatarIds.Add(avatarId); + } + } + + foreach (var avatarId in avatarIds) + { + var avatar = Player.AvatarManager!.GetFormalAvatar((int)avatarId); + if (avatar == null) continue; + proto.PeakAvatarInfoList.Add(avatar.ToPeakAvatarProto()); + } + + bossProto.PeakTargetList.AddRange(targetIds); + + proto.PeakBossLevel = bossProto; return proto; } @@ -98,7 +147,7 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla { List avatarIds = []; - foreach (var avatarId in lineup.PeakLevelLineup.ToList()) + foreach (var avatarId in lineup.PeakLevelAvatarIdList.ToList()) { var avatar = Player.AvatarManager!.GetFormalAvatar((int)avatarId); if (avatar != null) @@ -123,6 +172,64 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla await Player.SendPacket(new PacketChallengePeakGroupDataUpdateScNotify(GetChallengePeakInfo(groupId))); } + public async ValueTask SaveHistory(ChallengePeakInstance inst, List targetIds) + { + if (inst.Config.BossExcel != null) + { + // is hard + var isHard = inst.Data.Peak.IsHard; + var levelId = (int)inst.Data.Peak.CurrentPeakLevelId << 2 | (isHard ? 1 : 0); + + // get old data + if (Player.ChallengeManager!.ChallengeData.PeakBossLevelDatas.TryGetValue(levelId, out var oldData) && + oldData.FinishedTargetList.Count > targetIds.Count && oldData.RoundCnt < inst.Data.Peak.RoundCnt) + { + // better data already exists, do not overwrite + return; + } + + // Save boss data + var data = new ChallengePeakBossLevelData + { + LevelId = (int)inst.Data.Peak.CurrentPeakLevelId, + IsHard = isHard, + BaseAvatarList = Player.LineupManager!.GetCurLineup()?.BaseAvatars?.Select(x => (uint)x.BaseAvatarId).ToList() ?? [], + RoundCnt = inst.Data.Peak.RoundCnt, + BuffId = inst.Data.Peak.Buffs.FirstOrDefault(), + FinishedTargetList = targetIds, + PeakStar = (uint)targetIds.Count + }; + + Player.ChallengeManager!.ChallengeData.PeakBossLevelDatas[levelId] = data; + } + else + { + // Save level data + var levelId = (int)inst.Data.Peak.CurrentPeakLevelId; + + // get old data + if (Player.ChallengeManager!.ChallengeData.PeakLevelDatas.TryGetValue(levelId, out var oldData) && + oldData.FinishedTargetList.Count > targetIds.Count && oldData.RoundCnt < inst.Data.Peak.RoundCnt) + { + // better data already exists, do not overwrite + return; + } + + var data = new ChallengePeakLevelData + { + LevelId = levelId, + BaseAvatarList = Player.LineupManager!.GetCurLineup()?.BaseAvatars?.Select(x => (uint)x.BaseAvatarId).ToList() ?? [], + RoundCnt = inst.Data.Peak.RoundCnt, + FinishedTargetList = targetIds, + PeakStar = (uint)targetIds.Count + }; + + Player.ChallengeManager!.ChallengeData.PeakLevelDatas[levelId] = data; + } + + await Player.SendPacket(new PacketChallengePeakGroupDataUpdateScNotify(GetChallengePeakInfo((int)inst.Data.Peak.CurrentPeakGroupId))); + } + public async ValueTask StartChallenge(int levelId, uint buffId, List avatarIdList) { // Get challenge excel @@ -164,7 +271,7 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla lineup.Mp = 5; // Max Mp // Make sure this lineup has avatars set - if (Player.AvatarManager!.AvatarData!.FormalAvatars.Count == 0) + if (Player.AvatarManager!.AvatarData.FormalAvatars.Count == 0) { await Player.SendPacket(new PacketStartChallengePeakScRsp(Retcode.RetChallengeLineupEmpty)); return; @@ -182,12 +289,17 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla { Peak = new ChallengePeakDataPb { + CurrentPeakGroupId = (uint)(GameData.ChallengePeakGroupConfigData.Values + .FirstOrDefault(x => x.BossLevelID == levelId || x.PreLevelIDList.Contains(levelId))?.ID ?? 1), CurrentPeakLevelId = (uint)levelId, CurrentExtraLineup = ChallengeLineupTypePb.Challenge1, CurStatus = 1 } }; + if (excel.BossExcel != null) + data.Peak.IsHard = BossIsHard; + if (buffId > 0) { data.Peak.Buffs.Add(buffId); diff --git a/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakBossHardModeCsReq.cs b/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakBossHardModeCsReq.cs new file mode 100644 index 00000000..0acdf5aa --- /dev/null +++ b/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakBossHardModeCsReq.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.ChallengePeak; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.ChallengePeak; + +[Opcode(CmdIds.SetChallengePeakBossHardModeCsReq)] +public class HandlerSetChallengePeakBossHardModeCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = SetChallengePeakBossHardModeCsReq.Parser.ParseFrom(data); + + connection.Player!.ChallengePeakManager!.BossIsHard = req.IsHard; + + await connection.SendPacket(new PacketSetChallengePeakBossHardModeScRsp(req.PeakGroupId, req.IsHard)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakMobLineupAvatarCsReq.cs b/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakMobLineupAvatarCsReq.cs index 6ec1248b..0aea988f 100644 --- a/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakMobLineupAvatarCsReq.cs +++ b/GameServer/Server/Packet/Recv/ChallengePeak/HandlerSetChallengePeakMobLineupAvatarCsReq.cs @@ -10,7 +10,7 @@ public class HandlerSetChallengePeakMobLineupAvatarCsReq : Handler { var req = SetChallengePeakMobLineupAvatarCsReq.Parser.ParseFrom(data); - await connection.Player!.ChallengePeakManager!.SetLineupAvatars((int)req.CurPeakGroupId, req.LineupList.ToList()); + await connection.Player!.ChallengePeakManager!.SetLineupAvatars((int)req.PeakGroupId, req.LineupList.ToList()); await connection.SendPacket(CmdIds.SetChallengePeakMobLineupAvatarScRsp); } diff --git a/GameServer/Server/Packet/Recv/ChallengePeak/HandlerStartChallengePeakCsReq.cs b/GameServer/Server/Packet/Recv/ChallengePeak/HandlerStartChallengePeakCsReq.cs index b2581b29..76703700 100644 --- a/GameServer/Server/Packet/Recv/ChallengePeak/HandlerStartChallengePeakCsReq.cs +++ b/GameServer/Server/Packet/Recv/ChallengePeak/HandlerStartChallengePeakCsReq.cs @@ -11,6 +11,6 @@ public class HandlerStartChallengePeakCsReq : Handler var req = StartChallengePeakCsReq.Parser.ParseFrom(data); await connection.Player!.ChallengePeakManager!.StartChallenge((int)req.PeakLevelId, req.PeakBossBuff, - req.PeakLevelLineup.Select(x => (int)x).ToList()); + req.PeakLevelAvatarIdList.Select(x => (int)x).ToList()); } } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Challenge/PacketChallengeBossPhaseSettleNotify.cs b/GameServer/Server/Packet/Send/Challenge/PacketChallengeBossPhaseSettleNotify.cs index 4ea588a0..0c9f58cc 100644 --- a/GameServer/Server/Packet/Send/Challenge/PacketChallengeBossPhaseSettleNotify.cs +++ b/GameServer/Server/Packet/Send/Challenge/PacketChallengeBossPhaseSettleNotify.cs @@ -20,8 +20,8 @@ public class PacketChallengeBossPhaseSettleNotify : BasePacket Star = challenge.Data.Boss.Stars, Phase = challenge.Data.Boss.CurrentStage, IsReward = true, - IsSecondHalf = challenge.Data.Boss.CurrentStage == challenge.Config.StageNum, - PageType = 1 + ShowRemainAction = challenge.Data.Boss.CurrentStage == challenge.Config.StageNum, + CurChallengeType = 1 }; proto.BattleTargetList.AddRange(targetLists?.BattleTargetList_ ?? []); diff --git a/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakGroupDataUpdateScNotify.cs b/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakGroupDataUpdateScNotify.cs index 17b48f68..a530c061 100644 --- a/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakGroupDataUpdateScNotify.cs +++ b/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakGroupDataUpdateScNotify.cs @@ -5,7 +5,7 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.ChallengePeak; public class PacketChallengePeakGroupDataUpdateScNotify : BasePacket { - public PacketChallengePeakGroupDataUpdateScNotify(ChallengePeakInfo info) : base(CmdIds.ChallengePeakGroupDataUpdateScNotify) + public PacketChallengePeakGroupDataUpdateScNotify(ChallengePeakLevelInfo info) : base(CmdIds.ChallengePeakGroupDataUpdateScNotify) { var proto = new ChallengePeakGroupDataUpdateScNotify { diff --git a/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakSettleScNotify.cs b/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakSettleScNotify.cs index 5b09fd18..d4b22ab9 100644 --- a/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakSettleScNotify.cs +++ b/GameServer/Server/Packet/Send/ChallengePeak/PacketChallengePeakSettleScNotify.cs @@ -6,13 +6,15 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.ChallengePeak; public class PacketChallengePeakSettleScNotify : BasePacket { - public PacketChallengePeakSettleScNotify(ChallengePeakInstance inst) : base(CmdIds.ChallengePeakSettleScNotify) + public PacketChallengePeakSettleScNotify(ChallengePeakInstance inst, List targetIdList) : base(CmdIds.ChallengePeakSettleScNotify) { var proto = new ChallengePeakSettleScNotify { - PeakStar = inst.Data.Peak.Stars, + PeakRoundCount = inst.Data.Peak.RoundCnt, IsWin = inst.IsWin, - PeakLevelId = inst.Data.Peak.CurrentPeakLevelId + PeakLevelId = inst.Data.Peak.CurrentPeakLevelId, + PeakTargetList = { targetIdList }, + IsUltraBossWin = inst is { IsWin: true, Config.BossExcel: not null } && inst.Data.Peak.IsHard }; SetData(proto); diff --git a/GameServer/Server/Packet/Send/ChallengePeak/PacketGetChallengePeakDataScRsp.cs b/GameServer/Server/Packet/Send/ChallengePeak/PacketGetChallengePeakDataScRsp.cs index 58818521..05f5ec0d 100644 --- a/GameServer/Server/Packet/Send/ChallengePeak/PacketGetChallengePeakDataScRsp.cs +++ b/GameServer/Server/Packet/Send/ChallengePeak/PacketGetChallengePeakDataScRsp.cs @@ -11,12 +11,12 @@ public class PacketGetChallengePeakDataScRsp : BasePacket { var proto = new GetChallengePeakDataScRsp { - FHODLMICBGP = 1 + CurPeakGroupId = 1 }; foreach (var groupId in GameData.ChallengePeakGroupConfigData.Keys) { - proto.ChallengePeakList.Add(player.ChallengePeakManager!.GetChallengePeakInfo(groupId)); + proto.ChallengePeakLevelList.Add(player.ChallengePeakManager!.GetChallengePeakInfo(groupId)); } SetData(proto); diff --git a/GameServer/Server/Packet/Send/ChallengePeak/PacketGetCurChallengePeakScRsp.cs b/GameServer/Server/Packet/Send/ChallengePeak/PacketGetCurChallengePeakScRsp.cs index d8ad1b84..952b19dd 100644 --- a/GameServer/Server/Packet/Send/ChallengePeak/PacketGetCurChallengePeakScRsp.cs +++ b/GameServer/Server/Packet/Send/ChallengePeak/PacketGetCurChallengePeakScRsp.cs @@ -13,10 +13,10 @@ public class PacketGetCurChallengePeakScRsp : BasePacket if (player.ChallengeManager!.ChallengeInstance is ChallengePeakInstance peak) { - proto.IsRead = true; + proto.IsFinished = true; proto.PeakLevelId = peak.Data.Peak.CurrentPeakLevelId; proto.PeakBossBuff = peak.Data.Peak.Buffs.FirstOrDefault(0u); - proto.PeakStar = peak.Data.Peak.Stars; + proto.PeakRoundCount = peak.Data.Peak.RoundCnt; } SetData(proto); diff --git a/GameServer/Server/Packet/Send/ChallengePeak/PacketSetChallengePeakBossHardModeScRsp.cs b/GameServer/Server/Packet/Send/ChallengePeak/PacketSetChallengePeakBossHardModeScRsp.cs new file mode 100644 index 00000000..30c8ce94 --- /dev/null +++ b/GameServer/Server/Packet/Send/ChallengePeak/PacketSetChallengePeakBossHardModeScRsp.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.ChallengePeak; + +public class PacketSetChallengePeakBossHardModeScRsp : BasePacket +{ + public PacketSetChallengePeakBossHardModeScRsp(uint groupId, bool isHard) : base(CmdIds.SetChallengePeakBossHardModeScRsp) + { + var proto = new SetChallengePeakBossHardModeScRsp + { + IsHard = isHard, + PeakGroupId = groupId + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/TrainParty/PacketTrainPartyBuildDiyScRsp.cs b/GameServer/Server/Packet/Send/TrainParty/PacketTrainPartyBuildDiyScRsp.cs index 82f9de96..10234314 100644 --- a/GameServer/Server/Packet/Send/TrainParty/PacketTrainPartyBuildDiyScRsp.cs +++ b/GameServer/Server/Packet/Send/TrainParty/PacketTrainPartyBuildDiyScRsp.cs @@ -15,7 +15,21 @@ public class PacketTrainPartyBuildDiyScRsp : BasePacket } : new TrainPartyBuildDiyScRsp { - AreaId = (uint)area.AreaId + AreaId = (uint)area.AreaId, + DynamicInfo = { area.DynamicInfo.Select(x => new AreaDynamicInfo + { + DiceSlotId = (uint)x.Key, + DiyDynamicId = (uint)x.Value + }) }, + //FFLPKLLDHLM = {new CIKOHJNAGON // TODO update + //{ + // AreaId = (uint)area.AreaId, + // KCJBMKJLFBA = area.DynamicInfo.Select(x => new AreaDynamicInfo + // { + // DiceSlotId = (uint)x.Key, + // DiyDynamicId = (uint)x.Value + // }).First(), + //}} }; SetData(proto); diff --git a/ServerSideProto/ChallengeData.cs b/ServerSideProto/ChallengeData.cs index e5f27b7a..ee68f9a9 100644 --- a/ServerSideProto/ChallengeData.cs +++ b/ServerSideProto/ChallengeData.cs @@ -44,20 +44,21 @@ namespace EggLink.DanhengServer.Proto.ServerSide { "IAEoDRIRCglDdXJTdGF0dXMYBSABKA0SDwoHU2F2ZWRNcBgGIAEoDRIyChJD", "dXJyZW50RXh0cmFMaW5ldXAYByABKA4yFi5DaGFsbGVuZ2VMaW5ldXBUeXBl", "UGISDQoFU3RhcnMYCCABKA0SEwoLU2NvcmVTdGFnZTEYCSABKA0SEwoLU2Nv", - "cmVTdGFnZTIYCiABKA0SDQoFQnVmZnMYCyADKA0i8wEKE0NoYWxsZW5nZVBl", - "YWtEYXRhUGISGgoSQ3VycmVudFBlYWtMZXZlbElkGAIgASgNEg0KBUJ1ZmZz", - "GAMgAygNEhEKCUN1clN0YXR1cxgEIAEoDRIcCghTdGFydFBvcxgFIAEoCzIK", - "LlZlY3RvcjNQYhIcCghTdGFydFJvdBgGIAEoCzIKLlZlY3RvcjNQYhIPCgdT", - "YXZlZE1wGAcgASgNEg0KBVN0YXJzGAggASgNEjIKEkN1cnJlbnRFeHRyYUxp", - "bmV1cBgJIAEoDjIWLkNoYWxsZW5nZUxpbmV1cFR5cGVQYhIOCgZJc0hhcmQY", - "CiABKAgiwQEKD0NoYWxsZW5nZURhdGFQYhIoCgZtZW1vcnkYASABKAsyFi5D", - "aGFsbGVuZ2VNZW1vcnlEYXRhUGJIABImCgVzdG9yeRgCIAEoCzIVLkNoYWxs", - "ZW5nZVN0b3J5RGF0YVBiSAASJAoEYm9zcxgDIAEoCzIULkNoYWxsZW5nZUJv", - "c3NEYXRhUGJIABIkCgRwZWFrGAQgASgLMhQuQ2hhbGxlbmdlUGVha0RhdGFQ", - "YkgAQhAKDmNoYWxsZW5nZV90eXBlKlEKFUNoYWxsZW5nZUxpbmV1cFR5cGVQ", - "YhIICgROb25lEAASDgoKQ2hhbGxlbmdlMRABEg4KCkNoYWxsZW5nZTIQAxIO", - "CgpDaGFsbGVuZ2UzEARCKaoCJkVnZ0xpbmsuRGFuaGVuZ1NlcnZlci5Qcm90", - "by5TZXJ2ZXJTaWRlYgZwcm90bzM=")); + "cmVTdGFnZTIYCiABKA0SDQoFQnVmZnMYCyADKA0ioQIKE0NoYWxsZW5nZVBl", + "YWtEYXRhUGISGgoSQ3VycmVudFBlYWtHcm91cElkGAEgASgNEhoKEkN1cnJl", + "bnRQZWFrTGV2ZWxJZBgCIAEoDRINCgVCdWZmcxgDIAMoDRIRCglDdXJTdGF0", + "dXMYBCABKA0SHAoIU3RhcnRQb3MYBSABKAsyCi5WZWN0b3IzUGISHAoIU3Rh", + "cnRSb3QYBiABKAsyCi5WZWN0b3IzUGISDwoHU2F2ZWRNcBgHIAEoDRINCgVT", + "dGFycxgIIAEoDRIyChJDdXJyZW50RXh0cmFMaW5ldXAYCSABKA4yFi5DaGFs", + "bGVuZ2VMaW5ldXBUeXBlUGISDgoGSXNIYXJkGAogASgIEhAKCFJvdW5kQ250", + "GAsgASgNIsEBCg9DaGFsbGVuZ2VEYXRhUGISKAoGbWVtb3J5GAEgASgLMhYu", + "Q2hhbGxlbmdlTWVtb3J5RGF0YVBiSAASJgoFc3RvcnkYAiABKAsyFS5DaGFs", + "bGVuZ2VTdG9yeURhdGFQYkgAEiQKBGJvc3MYAyABKAsyFC5DaGFsbGVuZ2VC", + "b3NzRGF0YVBiSAASJAoEcGVhaxgEIAEoCzIULkNoYWxsZW5nZVBlYWtEYXRh", + "UGJIAEIQCg5jaGFsbGVuZ2VfdHlwZSpRChVDaGFsbGVuZ2VMaW5ldXBUeXBl", + "UGISCAoETm9uZRAAEg4KCkNoYWxsZW5nZTEQARIOCgpDaGFsbGVuZ2UyEAMS", + "DgoKQ2hhbGxlbmdlMxAEQimqAiZFZ2dMaW5rLkRhbmhlbmdTZXJ2ZXIuUHJv", + "dG8uU2VydmVyU2lkZWIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengeLineupTypePb), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -65,7 +66,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengeMemoryDataPb), global::EggLink.DanhengServer.Proto.ServerSide.ChallengeMemoryDataPb.Parser, new[]{ "ChallengeMazeId", "StartPos", "StartRot", "CurrentStage", "CurStatus", "DeadAvatarNum", "SavedMp", "CurrentExtraLineup", "RoundsLeft", "Stars" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengeStoryDataPb), global::EggLink.DanhengServer.Proto.ServerSide.ChallengeStoryDataPb.Parser, new[]{ "ChallengeMazeId", "StartPos", "StartRot", "CurrentStage", "CurStatus", "SavedMp", "CurrentExtraLineup", "Stars", "ScoreStage1", "ScoreStage2", "Buffs" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengeBossDataPb), global::EggLink.DanhengServer.Proto.ServerSide.ChallengeBossDataPb.Parser, new[]{ "ChallengeMazeId", "StartPos", "StartRot", "CurrentStage", "CurStatus", "SavedMp", "CurrentExtraLineup", "Stars", "ScoreStage1", "ScoreStage2", "Buffs" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengePeakDataPb), global::EggLink.DanhengServer.Proto.ServerSide.ChallengePeakDataPb.Parser, new[]{ "CurrentPeakLevelId", "Buffs", "CurStatus", "StartPos", "StartRot", "SavedMp", "Stars", "CurrentExtraLineup", "IsHard" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengePeakDataPb), global::EggLink.DanhengServer.Proto.ServerSide.ChallengePeakDataPb.Parser, new[]{ "CurrentPeakGroupId", "CurrentPeakLevelId", "Buffs", "CurStatus", "StartPos", "StartRot", "SavedMp", "Stars", "CurrentExtraLineup", "IsHard", "RoundCnt" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.ChallengeDataPb), global::EggLink.DanhengServer.Proto.ServerSide.ChallengeDataPb.Parser, new[]{ "Memory", "Story", "Boss", "Peak" }, new[]{ "ChallengeType" }, null, null, null) })); } @@ -2061,6 +2062,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public ChallengePeakDataPb(ChallengePeakDataPb other) : this() { + currentPeakGroupId_ = other.currentPeakGroupId_; currentPeakLevelId_ = other.currentPeakLevelId_; buffs_ = other.buffs_.Clone(); curStatus_ = other.curStatus_; @@ -2070,6 +2072,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { stars_ = other.stars_; currentExtraLineup_ = other.currentExtraLineup_; isHard_ = other.isHard_; + roundCnt_ = other.roundCnt_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -2079,6 +2082,18 @@ namespace EggLink.DanhengServer.Proto.ServerSide { return new ChallengePeakDataPb(this); } + /// Field number for the "CurrentPeakGroupId" field. + public const int CurrentPeakGroupIdFieldNumber = 1; + private uint currentPeakGroupId_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint CurrentPeakGroupId { + get { return currentPeakGroupId_; } + set { + currentPeakGroupId_ = value; + } + } + /// Field number for the "CurrentPeakLevelId" field. public const int CurrentPeakLevelIdFieldNumber = 2; private uint currentPeakLevelId_; @@ -2186,6 +2201,18 @@ namespace EggLink.DanhengServer.Proto.ServerSide { } } + /// Field number for the "RoundCnt" field. + public const int RoundCntFieldNumber = 11; + private uint roundCnt_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint RoundCnt { + get { return roundCnt_; } + set { + roundCnt_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -2201,6 +2228,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { if (ReferenceEquals(other, this)) { return true; } + if (CurrentPeakGroupId != other.CurrentPeakGroupId) return false; if (CurrentPeakLevelId != other.CurrentPeakLevelId) return false; if(!buffs_.Equals(other.buffs_)) return false; if (CurStatus != other.CurStatus) return false; @@ -2210,6 +2238,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { if (Stars != other.Stars) return false; if (CurrentExtraLineup != other.CurrentExtraLineup) return false; if (IsHard != other.IsHard) return false; + if (RoundCnt != other.RoundCnt) return false; return Equals(_unknownFields, other._unknownFields); } @@ -2217,6 +2246,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override int GetHashCode() { int hash = 1; + if (CurrentPeakGroupId != 0) hash ^= CurrentPeakGroupId.GetHashCode(); if (CurrentPeakLevelId != 0) hash ^= CurrentPeakLevelId.GetHashCode(); hash ^= buffs_.GetHashCode(); if (CurStatus != 0) hash ^= CurStatus.GetHashCode(); @@ -2226,6 +2256,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { if (Stars != 0) hash ^= Stars.GetHashCode(); if (CurrentExtraLineup != global::EggLink.DanhengServer.Proto.ServerSide.ChallengeLineupTypePb.None) hash ^= CurrentExtraLineup.GetHashCode(); if (IsHard != false) hash ^= IsHard.GetHashCode(); + if (RoundCnt != 0) hash ^= RoundCnt.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -2244,6 +2275,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE output.WriteRawMessage(this); #else + if (CurrentPeakGroupId != 0) { + output.WriteRawTag(8); + output.WriteUInt32(CurrentPeakGroupId); + } if (CurrentPeakLevelId != 0) { output.WriteRawTag(16); output.WriteUInt32(CurrentPeakLevelId); @@ -2277,6 +2312,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { output.WriteRawTag(80); output.WriteBool(IsHard); } + if (RoundCnt != 0) { + output.WriteRawTag(88); + output.WriteUInt32(RoundCnt); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -2287,6 +2326,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (CurrentPeakGroupId != 0) { + output.WriteRawTag(8); + output.WriteUInt32(CurrentPeakGroupId); + } if (CurrentPeakLevelId != 0) { output.WriteRawTag(16); output.WriteUInt32(CurrentPeakLevelId); @@ -2320,6 +2363,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { output.WriteRawTag(80); output.WriteBool(IsHard); } + if (RoundCnt != 0) { + output.WriteRawTag(88); + output.WriteUInt32(RoundCnt); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -2330,6 +2377,9 @@ namespace EggLink.DanhengServer.Proto.ServerSide { [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public int CalculateSize() { int size = 0; + if (CurrentPeakGroupId != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(CurrentPeakGroupId); + } if (CurrentPeakLevelId != 0) { size += 1 + pb::CodedOutputStream.ComputeUInt32Size(CurrentPeakLevelId); } @@ -2355,6 +2405,9 @@ namespace EggLink.DanhengServer.Proto.ServerSide { if (IsHard != false) { size += 1 + 1; } + if (RoundCnt != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(RoundCnt); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -2367,6 +2420,9 @@ namespace EggLink.DanhengServer.Proto.ServerSide { if (other == null) { return; } + if (other.CurrentPeakGroupId != 0) { + CurrentPeakGroupId = other.CurrentPeakGroupId; + } if (other.CurrentPeakLevelId != 0) { CurrentPeakLevelId = other.CurrentPeakLevelId; } @@ -2398,6 +2454,9 @@ namespace EggLink.DanhengServer.Proto.ServerSide { if (other.IsHard != false) { IsHard = other.IsHard; } + if (other.RoundCnt != 0) { + RoundCnt = other.RoundCnt; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -2413,6 +2472,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { default: _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); break; + case 8: { + CurrentPeakGroupId = input.ReadUInt32(); + break; + } case 16: { CurrentPeakLevelId = input.ReadUInt32(); break; @@ -2456,6 +2519,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { IsHard = input.ReadBool(); break; } + case 88: { + RoundCnt = input.ReadUInt32(); + break; + } } } #endif @@ -2471,6 +2538,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { default: _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); break; + case 8: { + CurrentPeakGroupId = input.ReadUInt32(); + break; + } case 16: { CurrentPeakLevelId = input.ReadUInt32(); break; @@ -2514,6 +2585,10 @@ namespace EggLink.DanhengServer.Proto.ServerSide { IsHard = input.ReadBool(); break; } + case 88: { + RoundCnt = input.ReadUInt32(); + break; + } } } } diff --git a/ServerSideProto/ProtoFile/ChallengeData.proto b/ServerSideProto/ProtoFile/ChallengeData.proto index 83248679..ca8ba595 100644 --- a/ServerSideProto/ProtoFile/ChallengeData.proto +++ b/ServerSideProto/ProtoFile/ChallengeData.proto @@ -57,6 +57,7 @@ message ChallengeBossDataPb { } message ChallengePeakDataPb { + uint32 CurrentPeakGroupId = 1; uint32 CurrentPeakLevelId = 2; repeated uint32 Buffs = 3; uint32 CurStatus = 4; @@ -66,6 +67,7 @@ message ChallengePeakDataPb { uint32 Stars = 8; ChallengeLineupTypePb CurrentExtraLineup = 9; bool IsHard = 10; + uint32 RoundCnt = 11; } message ChallengeDataPb {