From 28ca622bce92269d7325d3b41d60192889dfc550 Mon Sep 17 00:00:00 2001 From: StopWuyu Date: Fri, 22 Aug 2025 21:53:00 +0800 Subject: [PATCH] feat: head frame --- Common/Database/Player/PlayerData.cs | 27 ++++++++++++++++--- Common/Util/GameConstants.cs | 5 ++++ .../ChallengePeak/ChallengePeakManager.cs | 16 ++++++++++- GameServer/Game/Player/PlayerInstance.cs | 14 +++++++++- GameServer/Game/Sync/BaseSyncData.cs | 8 ++++++ .../Game/Sync/Player/PlayerBoardSync.cs | 16 +++++++++++ .../PacketGetPlayerBoardDataScRsp.cs | 3 ++- .../PlayerSync/PacketPlayerSyncScNotify.cs | 13 +++++++++ 8 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 GameServer/Game/Sync/BaseSyncData.cs create mode 100644 GameServer/Game/Sync/Player/PlayerBoardSync.cs diff --git a/Common/Database/Player/PlayerData.cs b/Common/Database/Player/PlayerData.cs index a14be156..001d8f9e 100644 --- a/Common/Database/Player/PlayerData.cs +++ b/Common/Database/Player/PlayerData.cs @@ -45,6 +45,8 @@ public class PlayerData : BaseDatabaseDataHelper [SugarColumn(IsNullable = true, IsJson = true)] public Position? Rot { get; set; } + [SugarColumn(IsJson = true)] public PlayerHeadFrameInfo HeadFrame { get; set; } = new(); + [SugarColumn(IsNullable = true)] public int PlaneId { get; set; } [SugarColumn(IsNullable = true)] public int FloorId { get; set; } @@ -104,11 +106,12 @@ public class PlayerData : BaseDatabaseDataHelper Platform = PlatformType.Pc, LastActiveTime = LastActiveTime, ChatBubbleId = (uint)ChatBubble, - PersonalCard = (uint)PersonalCard + PersonalCard = (uint)PersonalCard, + HeadFrame = HeadFrame.ToProto() }; var pos = 0; - var instance = DatabaseHelper.Instance!.GetInstance(Uid)!; + var instance = DatabaseHelper.Instance!.GetInstance(Uid); if (instance == null) { // Handle server profile @@ -131,7 +134,7 @@ public class PlayerData : BaseDatabaseDataHelper } foreach (var avatar in instance.AssistAvatars.Select( - assist => instance.FormalAvatars.Find(x => x.AvatarId == assist)!)) + assist => instance.FormalAvatars.Find(x => x.AvatarId == assist))) if (avatar != null) info.AssistSimpleInfoList.Add(new AssistSimpleInfo { @@ -159,7 +162,8 @@ public class PlayerData : BaseDatabaseDataHelper WorldLevel = (uint)WorldLevel, EMOBIJBDKEI = true, // ShowDisplayAvatar RecordInfo = new PlayerRecordInfo(), - PrivacySettings = new PrivacySettings() + PrivacySettings = new PrivacySettings(), + HeadFrame = HeadFrame.ToProto() }; var avatarInfo = DatabaseHelper.Instance!.GetInstance(Uid); @@ -198,4 +202,19 @@ public class PlayerData : BaseDatabaseDataHelper return info; } +} + +public class PlayerHeadFrameInfo +{ + public long HeadFrameExpireTime { get; set; } + public uint HeadFrameId { get; set; } + + public HeadFrameInfo ToProto() + { + return new HeadFrameInfo + { + HeadFrameExpireTime = HeadFrameExpireTime, + HeadFrameId = HeadFrameId + }; + } } \ No newline at end of file diff --git a/Common/Util/GameConstants.cs b/Common/Util/GameConstants.cs index 65338730..04daeb8f 100644 --- a/Common/Util/GameConstants.cs +++ b/Common/Util/GameConstants.cs @@ -21,6 +21,11 @@ public static class GameConstants public const int CHALLENGE_BOSS_ENTRANCE = 1030402; public const int CURRENT_ROGUE_TOURN_SEASON = 2; + public const uint CHALLENGE_PEAK_BRONZE_FRAME_ID = 226001; + public const uint CHALLENGE_PEAK_SILVER_FRAME_ID = 226002; + public const uint CHALLENGE_PEAK_GOLD_FRAME_ID = 226003; + public const uint CHALLENGE_PEAK_ULTRA_FRAME_ID = 226004; + public static readonly List UpgradeWorldLevel = [20, 30, 40, 50, 60, 65]; public static readonly List AllowedChessRogueEntranceId = [8020701, 8020901, 8020401, 8020201]; } \ No newline at end of file diff --git a/GameServer/Game/ChallengePeak/ChallengePeakManager.cs b/GameServer/Game/ChallengePeak/ChallengePeakManager.cs index aa53ca69..fc6bfa99 100644 --- a/GameServer/Game/ChallengePeak/ChallengePeakManager.cs +++ b/GameServer/Game/ChallengePeak/ChallengePeakManager.cs @@ -47,7 +47,7 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla { starNum += (int)levelPbData.PeakStar; - levelProto.PeakRoundCount = levelPbData.RoundCnt; + levelProto.PeakRoundsCount = levelPbData.RoundCnt; levelProto.PeakLevelAvatarIdList.AddRange(levelPbData.BaseAvatarList); levelProto.PeakTargetList.AddRange(levelPbData.FinishedTargetList); @@ -193,6 +193,20 @@ public class ChallengePeakManager(PlayerInstance player) : BasePlayerManager(pla }; Player.ChallengeManager!.ChallengeData.PeakBossLevelDatas[levelId] = data; + + // set head frame + if (isHard) + { + await Player.SetPlayerHeadFrameId(GameConstants.CHALLENGE_PEAK_ULTRA_FRAME_ID, long.MaxValue); + } + else + { + var targetFrameId = data.PeakStar + 226000; + if (Player.Data.HeadFrame.HeadFrameId < targetFrameId) + { + await Player.SetPlayerHeadFrameId(targetFrameId, long.MaxValue); + } + } } else { diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index ef019fd2..c857b509 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -26,6 +26,7 @@ using EggLink.DanhengServer.GameServer.Game.RogueMagic; using EggLink.DanhengServer.GameServer.Game.RogueTourn; using EggLink.DanhengServer.GameServer.Game.Scene; using EggLink.DanhengServer.GameServer.Game.Shop; +using EggLink.DanhengServer.GameServer.Game.Sync.Player; using EggLink.DanhengServer.GameServer.Game.Task; using EggLink.DanhengServer.GameServer.Game.TrainParty; using EggLink.DanhengServer.GameServer.Server; @@ -301,7 +302,7 @@ public partial class PlayerInstance(PlayerData data) foreach (var avatar in LineupManager.GetCurLineup()!.BaseAvatars!) { - var avatarData = AvatarManager.GetFormalAvatar(avatar.BaseAvatarId); + var avatarData = AvatarManager!.GetFormalAvatar(avatar.BaseAvatarId); if (avatarData is { CurrentHp: <= 0 }) // revive avatarData.CurrentHp = 2000; @@ -328,6 +329,17 @@ public partial class PlayerInstance(PlayerData data) #region Actions + public async ValueTask SetPlayerHeadFrameId(uint headFrameId, long expireTime) + { + Data.HeadFrame = new PlayerHeadFrameInfo + { + HeadFrameId = headFrameId, + HeadFrameExpireTime = expireTime + }; + + await SendPacket(new PacketPlayerSyncScNotify([new PlayerBoardSync(this)])); + } + public async ValueTask ChangeAvatarPathType(int baseAvatarId, MultiPathAvatarTypeEnum type) { FormalAvatarInfo avatar; diff --git a/GameServer/Game/Sync/BaseSyncData.cs b/GameServer/Game/Sync/BaseSyncData.cs new file mode 100644 index 00000000..3ceae9f6 --- /dev/null +++ b/GameServer/Game/Sync/BaseSyncData.cs @@ -0,0 +1,8 @@ +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Game.Sync; + +public abstract class BaseSyncData +{ + public abstract void SyncData(in PlayerSyncScNotify notify); +} \ No newline at end of file diff --git a/GameServer/Game/Sync/Player/PlayerBoardSync.cs b/GameServer/Game/Sync/Player/PlayerBoardSync.cs new file mode 100644 index 00000000..0620bede --- /dev/null +++ b/GameServer/Game/Sync/Player/PlayerBoardSync.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Game.Sync.Player; + +public class PlayerBoardSync(PlayerInstance player) : BaseSyncData +{ + public override void SyncData(in PlayerSyncScNotify notify) + { + notify.PlayerboardModuleSync = new PlayerBoardModuleSync + { + Signature = player.Data.Signature, + HeadFrame = player.Data.HeadFrame.ToProto() + }; + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/PlayerBoard/PacketGetPlayerBoardDataScRsp.cs b/GameServer/Server/Packet/Send/PlayerBoard/PacketGetPlayerBoardDataScRsp.cs index 010ea5a6..cd3d029d 100644 --- a/GameServer/Server/Packet/Send/PlayerBoard/PacketGetPlayerBoardDataScRsp.cs +++ b/GameServer/Server/Packet/Send/PlayerBoard/PacketGetPlayerBoardDataScRsp.cs @@ -17,7 +17,8 @@ public class PacketGetPlayerBoardDataScRsp : BasePacket UnlockedHeadIconList = { player.PlayerUnlockData!.HeadIcons.Select(x => new HeadIconData { Id = (uint)x }) }, AssistAvatarIdList = { player.AvatarManager!.AvatarData.AssistAvatars.Select(x => (uint)x) }, - DisplayAvatarVec = new DisplayAvatarVec() + DisplayAvatarVec = new DisplayAvatarVec(), + HeadFrame = player.Data.HeadFrame.ToProto() }; var pos = 0; diff --git a/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs b/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs index 77f292fc..68497037 100644 --- a/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs +++ b/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs @@ -4,6 +4,7 @@ using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.Database.Message; using EggLink.DanhengServer.Database.Quests; using EggLink.DanhengServer.Enums.Item; +using EggLink.DanhengServer.GameServer.Game.Sync; using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; @@ -11,6 +12,18 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.PlayerSync; public class PacketPlayerSyncScNotify : BasePacket { + public PacketPlayerSyncScNotify(List datas) : base(CmdIds.PlayerSyncScNotify) + { + var proto = new PlayerSyncScNotify(); + + foreach (var data in datas) + { + data.SyncData(proto); + } + + SetData(proto); + } + public PacketPlayerSyncScNotify(ItemData item) : base(CmdIds.PlayerSyncScNotify) { var proto = new PlayerSyncScNotify();