From 8e33f64570d49592e9a576f2b9a9358db93f8cf2 Mon Sep 17 00:00:00 2001 From: Somebody Date: Sat, 15 Nov 2025 22:22:52 +0800 Subject: [PATCH] feat: grid fight trait & pending actions --- Command/Command/Cmd/CommandGrid.cs | 4 +- .../Excel/GridFightCombinationBonusExcel.cs | 19 ++ Common/Data/Excel/GridFightEquipmentExcel.cs | 12 +- .../Excel/GridFightTraitBasicInfoExcel.cs | 20 ++ Common/Data/Excel/GridFightTraitLayerExcel.cs | 20 ++ Common/Data/GameData.cs | 4 + .../GridFight/GridFightEquipCategoryEnum.cs | 16 ++ .../GridFight/GridFightEquipDressTypeEnum.cs | 11 + .../Battle/Custom/BattleGridFightOptions.cs | 16 +- .../Component/GridFightBasicComponent.cs | 22 +- .../Component/GridFightLevelComponent.cs | 231 +++++++++++++----- .../Component/GridFightRoleComponent.cs | 14 +- .../Component/GridFightShopComponent.cs | 7 +- .../Component/GridFightTraitComponent.cs | 152 ++++++++++++ .../Game/GridFight/GridFightInstance.cs | 43 +++- ....cs => GridFightEnterNodePendingAction.cs} | 4 +- .../GridFight/Sync/BaseGridFightSyncData.cs | 3 +- .../Sync/GridFightAddAugmentSyncData.cs | 2 +- .../Sync/GridFightAddPortalBuffSyncData.cs | 2 +- .../Sync/GridFightBuyExpCostSyncData.cs | 2 +- .../Sync/GridFightComboNumSyncData.cs | 2 +- .../GridFightFinishPendingActionSyncData.cs | 2 +- .../GridFight/Sync/GridFightGoldSyncData.cs | 2 +- .../GridFight/Sync/GridFightLevelSyncData.cs | 6 +- .../Sync/GridFightLineupHpSyncData.cs | 2 +- .../Sync/GridFightLockInfoSyncData.cs | 2 +- .../Sync/GridFightMaxAvatarNumSyncData.cs | 2 +- .../Sync/GridFightPendingActionSyncData.cs | 2 +- .../Sync/GridFightPlayerLevelSyncData.cs | 2 +- .../Sync/GridFightRoleAddSyncData.cs | 2 +- .../Sync/GridFightRoleDamageSttSyncData.cs | 2 +- .../Sync/GridFightRoleRemoveSyncData.cs | 2 +- .../Sync/GridFightRoleUpdateSyncData.cs | 2 +- .../GridFight/Sync/GridFightShopSyncData.cs | 2 +- ...PacketGridFightSyncUpdateResultScNotify.cs | 2 +- ServerSideProto/GridFightData.cs | 64 ++--- ServerSideProto/ProtoFile/GridFightData.proto | 2 +- 37 files changed, 546 insertions(+), 158 deletions(-) create mode 100644 Common/Data/Excel/GridFightCombinationBonusExcel.cs create mode 100644 Common/Data/Excel/GridFightTraitBasicInfoExcel.cs create mode 100644 Common/Data/Excel/GridFightTraitLayerExcel.cs create mode 100644 Common/Enums/GridFight/GridFightEquipCategoryEnum.cs create mode 100644 Common/Enums/GridFight/GridFightEquipDressTypeEnum.cs create mode 100644 GameServer/Game/GridFight/Component/GridFightTraitComponent.cs rename GameServer/Game/GridFight/PendingAction/{GridFightPreparePendingAction.cs => GridFightEnterNodePendingAction.cs} (62%) diff --git a/Command/Command/Cmd/CommandGrid.cs b/Command/Command/Cmd/CommandGrid.cs index 4ac724d6..224ed0e9 100644 --- a/Command/Command/Cmd/CommandGrid.cs +++ b/Command/Command/Cmd/CommandGrid.cs @@ -39,7 +39,7 @@ public class CommandGrid : ICommand return; } - await inst.GetComponent().AddAvatar(roleId, tier); + await inst.GetComponent().AddAvatar(roleId, tier, src:GridFightSrc.KGridFightSrcNone); await arg.SendMsg(I18NManager.Translate("Game.Command.Grid.AddedRole")); } @@ -67,7 +67,7 @@ public class CommandGrid : ICommand var gold = arg.GetInt(0); - await inst.GetComponent().UpdateGoldNum(gold, true, GridFightSrc.KGridFightSrcNone); + await inst.GetComponent().UpdateGoldNum(gold); await arg.SendMsg(I18NManager.Translate("Game.Command.Grid.UpdateGold", gold.ToString())); } } \ No newline at end of file diff --git a/Common/Data/Excel/GridFightCombinationBonusExcel.cs b/Common/Data/Excel/GridFightCombinationBonusExcel.cs new file mode 100644 index 00000000..062897ae --- /dev/null +++ b/Common/Data/Excel/GridFightCombinationBonusExcel.cs @@ -0,0 +1,19 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("GridFightCombinationBonus.json")] +public class GridFightCombinationBonusExcel : ExcelResource +{ + public uint BonusID { get; set; } + public List CombinationBonusList { get; set; } = []; + public List BonusNumberList { get; set; } = []; + + public override int GetId() + { + return (int)BonusID; + } + + public override void Loaded() + { + GameData.GridFightCombinationBonusData.TryAdd(BonusID, this); + } +} \ No newline at end of file diff --git a/Common/Data/Excel/GridFightEquipmentExcel.cs b/Common/Data/Excel/GridFightEquipmentExcel.cs index ffe2bbea..5add3840 100644 --- a/Common/Data/Excel/GridFightEquipmentExcel.cs +++ b/Common/Data/Excel/GridFightEquipmentExcel.cs @@ -1,10 +1,20 @@ +using EggLink.DanhengServer.Enums.GridFight; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + namespace EggLink.DanhengServer.Data.Excel; [ResourceEntity("GridFightEquipment.json")] public class GridFightEquipmentExcel : ExcelResource { public uint ID { get; set; } - public string EquipCategory { get; set; } = ""; // TODO use enum + + [JsonConverter(typeof(StringEnumConverter))] + public GridFightEquipCategoryEnum EquipCategory { get; set; } + + + [JsonConverter(typeof(StringEnumConverter))] + public GridFightEquipDressTypeEnum DressRule { get; set; } public override int GetId() { diff --git a/Common/Data/Excel/GridFightTraitBasicInfoExcel.cs b/Common/Data/Excel/GridFightTraitBasicInfoExcel.cs new file mode 100644 index 00000000..72122070 --- /dev/null +++ b/Common/Data/Excel/GridFightTraitBasicInfoExcel.cs @@ -0,0 +1,20 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("GridFightTraitBasicInfo.json")] +public class GridFightTraitBasicInfoExcel : ExcelResource +{ + public uint ID { get; set; } + public uint SeasonID { get; set; } + public List TraitEffectList { get; set; } = []; + public List BEIDList { get; set; } = []; + + public override int GetId() + { + return (int)ID; + } + + public override void Loaded() + { + GameData.GridFightTraitBasicInfoData.TryAdd(ID, this); + } +} \ No newline at end of file diff --git a/Common/Data/Excel/GridFightTraitLayerExcel.cs b/Common/Data/Excel/GridFightTraitLayerExcel.cs new file mode 100644 index 00000000..9e63cc18 --- /dev/null +++ b/Common/Data/Excel/GridFightTraitLayerExcel.cs @@ -0,0 +1,20 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("GridFightTraitLayer.json")] +public class GridFightTraitLayerExcel : ExcelResource +{ + public uint TraitID { get; set; } + public uint Layer { get; set; } + public uint MazebuffID { get; set; } + + public override int GetId() + { + return (int)TraitID; + } + + public override void Loaded() + { + GameData.GridFightTraitLayerData.TryAdd(TraitID, []); + GameData.GridFightTraitLayerData[TraitID].TryAdd(Layer, this); + } +} \ No newline at end of file diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 90f060e2..b6ac1c34 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -107,6 +107,8 @@ public static class GameData public static Dictionary GridFightRoleBasicInfoData { get; private set; } = []; public static Dictionary GridFightRoleStarData { get; private set; } = []; + public static Dictionary GridFightCombinationBonusData { get; private set; } = + []; public static Dictionary GridFightDivisionInfoData { get; private set; } = []; public static Dictionary GridFightDivisionStageData { get; private set; } = []; public static Dictionary GridFightEquipmentData { get; private set; } = []; @@ -120,6 +122,8 @@ public static class GameData public static Dictionary GridFightPortalBuffData { get; private set; } = []; public static Dictionary GridFightItemsData { get; private set; } = []; public static Dictionary GridFightTalentData { get; private set; } = []; + public static Dictionary GridFightTraitBasicInfoData { get; private set; } = []; + public static Dictionary> GridFightTraitLayerData { get; private set; } = []; public static Dictionary GridFightSeasonTalentData { get; private set; } = []; public static Dictionary> GridFightStageRouteData { get; private set; } = []; public static Dictionary GridFightNodeTemplateData { get; private set; } = []; diff --git a/Common/Enums/GridFight/GridFightEquipCategoryEnum.cs b/Common/Enums/GridFight/GridFightEquipCategoryEnum.cs new file mode 100644 index 00000000..072ab5be --- /dev/null +++ b/Common/Enums/GridFight/GridFightEquipCategoryEnum.cs @@ -0,0 +1,16 @@ +namespace EggLink.DanhengServer.Enums.GridFight; + +public enum GridFightEquipCategoryEnum +{ + None = 0, + Basic = 1, + Craftable = 2, + Emblem = 3, + Crown = 4, + TraitSpecial = 5, + Artifacts = 6, + Radiant = 7, + Support = 8, + Other = 9, + Material = 10 +} \ No newline at end of file diff --git a/Common/Enums/GridFight/GridFightEquipDressTypeEnum.cs b/Common/Enums/GridFight/GridFightEquipDressTypeEnum.cs new file mode 100644 index 00000000..c0160d4b --- /dev/null +++ b/Common/Enums/GridFight/GridFightEquipDressTypeEnum.cs @@ -0,0 +1,11 @@ +namespace EggLink.DanhengServer.Enums.GridFight; + +public enum GridFightEquipDressTypeEnum +{ + DressRuleNotUnique = 0, + DressRuleUnique = 1, + DressRuleAllSlotEmpty = 2, + DressRuleLeader = 3, + DressRuleTraitOnly = 4, + DressRuleUniqueAndExclusiveTrait = 5 +} \ No newline at end of file diff --git a/GameServer/Game/Battle/Custom/BattleGridFightOptions.cs b/GameServer/Game/Battle/Custom/BattleGridFightOptions.cs index bb4784dc..77ff52b5 100644 --- a/GameServer/Game/Battle/Custom/BattleGridFightOptions.cs +++ b/GameServer/Game/Battle/Custom/BattleGridFightOptions.cs @@ -14,17 +14,18 @@ public class BattleGridFightOptions(GridFightGameSectionInfo curSection, GridFig { public GridFightGameEncounterInfo Encounter { get; set; } = curSection.Encounters.RandomElement(); public GridFightInstance Inst { get; set; } = inst; - public GridFightRoleComponent AvatarComponent { get; set; } = inst.GetComponent(); + public GridFightRoleComponent RoleComponent { get; set; } = inst.GetComponent(); public GridFightLevelComponent LevelComponent { get; set; } = inst.GetComponent(); public GridFightBasicComponent BasicComponent { get; set; } = inst.GetComponent(); public GridFightAugmentComponent AugmentComponent { get; set; } = inst.GetComponent(); + public GridFightTraitComponent TraitComponent { get; set; } = inst.GetComponent(); public GridFightGameSectionInfo CurSection { get; set; } = curSection; public PlayerInstance Player { get; set; } = player; public void HandleProto(SceneBattleInfo proto, BattleInstance battle) { - var avatars = AvatarComponent.GetForegroundAvatarInfos(0); - var backAvatars = AvatarComponent.GetBackgroundAvatarInfos(BasicComponent.GetFieldCount()); + var avatars = RoleComponent.GetForegroundAvatarInfos(); + var backAvatars = RoleComponent.GetBackgroundAvatarInfos(BasicComponent.GetFieldCount()); var tempLineup = new LineupInfo { @@ -60,12 +61,12 @@ public class BattleGridFightOptions(GridFightGameSectionInfo curSection, GridFig { wave.Monsters.Select(x => new SceneMonster { - MonsterId = x.MonsterID, + MonsterId = x.Monster.MonsterID, ExtraInfo = new SceneMonsterExtraInfo { BattleGridFightInfo = new SceneMonsterGridFightInfo { - Tier = Math.Max(1, x.MonsterTier) + Tier = Math.Max(1, x.Tier) } } }) @@ -73,7 +74,7 @@ public class BattleGridFightOptions(GridFightGameSectionInfo curSection, GridFig }); } - foreach (var role in AvatarComponent.Data.Roles) + foreach (var role in RoleComponent.Data.Roles) { if (!GameData.GridFightRoleStarData.TryGetValue(role.RoleId << 4 | role.Tier, out var roleConf)) continue; battle.BattleEvents.TryAdd((int)roleConf.BEID, new BattleEventInstance((int)roleConf.BEID, 5000)); @@ -89,7 +90,7 @@ public class BattleGridFightOptions(GridFightGameSectionInfo curSection, GridFig { GridGameAvatarList = { - AvatarComponent.Data.Roles.Where(x => x.Pos <= BasicComponent.GetFieldCount()).OrderBy(x => x.Pos).Select(x => x.ToBattleInfo()) + RoleComponent.Data.Roles.Where(x => x.Pos <= BasicComponent.GetFieldCount()).OrderBy(x => x.Pos).Select(x => x.ToBattleInfo()) }, GridFightCurLevel = BasicComponent.Data.CurLevel, GridFightLineupHp = BasicComponent.Data.CurHp, @@ -107,6 +108,7 @@ public class BattleGridFightOptions(GridFightGameSectionInfo curSection, GridFig PenaltyBonusRuleId = ruleId, GridFightAugmentInfo = { AugmentComponent.Data.Augments.Select(x => x.ToBattleInfo()) }, GridFightPortalBuffList = { LevelComponent.PortalBuffs.Select(x => x.ToBattleInfo()) }, + GridFightTraitInfo = { TraitComponent.Data.Traits.Select(x => x.ToBattleInfo(RoleComponent)) } }; } } \ No newline at end of file diff --git a/GameServer/Game/GridFight/Component/GridFightBasicComponent.cs b/GameServer/Game/GridFight/Component/GridFightBasicComponent.cs index 0da2a5b4..2a998212 100644 --- a/GameServer/Game/GridFight/Component/GridFightBasicComponent.cs +++ b/GameServer/Game/GridFight/Component/GridFightBasicComponent.cs @@ -15,8 +15,8 @@ public class GridFightBasicComponent(GridFightInstance inst) : BaseGridFightComp public GridFightBasicInfoPb Data { get; set; } = new() { CurHp = 100, - CurLevel = 1, - MaxAvatarNum = 1, + CurLevel = 3, + MaxAvatarNum = 3, BuyLevelCost = 1, CurGold = 0 }; @@ -25,7 +25,7 @@ public class GridFightBasicComponent(GridFightInstance inst) : BaseGridFightComp #region Data Management - public async ValueTask UpdateGoldNum(int changeNum, bool sendPacket = true, GridFightSrc src = GridFightSrc.KGridFightSrcManualRefreshGoods) + public async ValueTask UpdateGoldNum(int changeNum, bool sendPacket = true, GridFightSrc src = GridFightSrc.KGridFightSrcNone) { if (changeNum < 0 && -changeNum > Data.CurGold) { @@ -99,10 +99,10 @@ public class GridFightBasicComponent(GridFightInstance inst) : BaseGridFightComp if (sendPacket) { await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify( - new GridFightGoldSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data), - new GridFightPlayerLevelSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data), - new GridFightMaxAvatarNumSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data), - new GridFightBuyExpCostSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data))); + new GridFightGoldSyncData(GridFightSrc.KGridFightSrcNone, Data), + new GridFightPlayerLevelSyncData(GridFightSrc.KGridFightSrcNone, Data), + new GridFightMaxAvatarNumSyncData(GridFightSrc.KGridFightSrcNone, Data), + new GridFightBuyExpCostSyncData(GridFightSrc.KGridFightSrcNone, Data))); } return Retcode.RetSucc; @@ -130,10 +130,10 @@ public class GridFightBasicComponent(GridFightInstance inst) : BaseGridFightComp if (sendPacket) { await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify( - new GridFightGoldSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data), - new GridFightPlayerLevelSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data), - new GridFightMaxAvatarNumSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data), - new GridFightBuyExpCostSyncData(GridFightSrc.KGridFightSrcBuyGoods, Data))); + new GridFightGoldSyncData(GridFightSrc.KGridFightSrcNone, Data), + new GridFightPlayerLevelSyncData(GridFightSrc.KGridFightSrcNone, Data), + new GridFightMaxAvatarNumSyncData(GridFightSrc.KGridFightSrcNone, Data), + new GridFightBuyExpCostSyncData(GridFightSrc.KGridFightSrcNone, Data))); } return Retcode.RetSucc; diff --git a/GameServer/Game/GridFight/Component/GridFightLevelComponent.cs b/GameServer/Game/GridFight/Component/GridFightLevelComponent.cs index cf18d9bc..486dcf68 100644 --- a/GameServer/Game/GridFight/Component/GridFightLevelComponent.cs +++ b/GameServer/Game/GridFight/Component/GridFightLevelComponent.cs @@ -122,29 +122,26 @@ public class GridFightLevelComponent : BaseGridFightComponent List syncs = [new GridFightLevelSyncData(src, this)]; - //await Inst.RollPortalBuff(); + syncs.AddRange(await Inst.CreatePendingAction(sendPacket: false)); if (CurrentSection.Excel.IsAugment == 1) { // create augment action - syncs.AddRange(await Inst.CreatePendingAction(sendPacket: false)); + await Inst.CreatePendingAction(sendPacket: false); } if (CurrentSection.Excel.NodeType == GridFightNodeTypeEnum.Supply) { // create supply action - syncs.AddRange(await Inst.CreatePendingAction(sendPacket: false)); + await Inst.CreatePendingAction(sendPacket: false); + await Inst.CreatePendingAction(sendPacket: false); } - else + else if (CurrentSection.Excel.NodeType == GridFightNodeTypeEnum.EliteBranch) { - syncs.AddRange(await Inst.CreatePendingAction(sendPacket: false)); - - if (CurrentSection.Excel.NodeType is not GridFightNodeTypeEnum.Boss - and not GridFightNodeTypeEnum.EliteBranch) - { - syncs.AddRange(await Inst.CreatePendingAction(sendPacket: false)); - } + await Inst.CreatePendingAction(sendPacket: false); } + await Inst.CreatePendingAction(sendPacket: false); + if (sendPacket) { await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify(syncs)); @@ -314,6 +311,7 @@ public class GridFightGameSectionInfo public GridFightStageRouteExcel Excel { get; } public uint ChapterId { get; } public uint SectionId { get; } + public uint BranchId { get; set; } = 1; public GridFightCampExcel MonsterCamp { get; set; } public List Encounters { get; } = []; @@ -328,7 +326,20 @@ public class GridFightGameSectionInfo if (Excel.NodeType is not GridFightNodeTypeEnum.Monster and not GridFightNodeTypeEnum.CampMonster and not GridFightNodeTypeEnum.Boss and not GridFightNodeTypeEnum.EliteBranch) return; - Encounters.Add(new GridFightGameEncounterInfo(1, 1, this)); + if (Excel.NodeType is GridFightNodeTypeEnum.EliteBranch) + { + List difficulties = [1, 2, 3]; + BranchId = 0; + + foreach (var diff in difficulties.OrderBy(_ => Guid.NewGuid()).Take(2)) + { + Encounters.Add(new GridFightGameEncounterInfo(diff, diff, this)); + } + } + else + { + Encounters.Add(new GridFightGameEncounterInfo(1, 1, this)); + } } public GridFightRouteInfo ToRouteInfo() @@ -336,7 +347,7 @@ public class GridFightGameSectionInfo return new GridFightRouteInfo { FightCampId = MonsterCamp.ID, - EliteBranchId = 0, + EliteBranchId = BranchId, RouteEncounterList = { Encounters.Select(x => x.ToProto()) } }; } @@ -359,51 +370,8 @@ public class GridFightGameEncounterInfo EncounterDifficulty = difficulty; ParentSection = section; - var waveNum = ParentSection.Excel.NodeType switch - { - //GridFightNodeTypeEnum.Boss => 2, - //GridFightNodeTypeEnum.EliteBranch => 2, - _ => 1 - }; - - List monsterNum = ParentSection.Excel.NodeType switch - { - GridFightNodeTypeEnum.Boss => [1], - GridFightNodeTypeEnum.EliteBranch => [3], - GridFightNodeTypeEnum.CampMonster => [3], - _ => [Random.Shared.Next(3, 5)] - }; - - var monsterPool = ParentSection.MonsterCamp.Monsters.Where(x => x.MonsterTier <= 2).OrderBy(_ => Guid.NewGuid()).ToList(); - var monster4Pool = ParentSection.MonsterCamp.Monsters.Where(x => x.MonsterTier is 4 or 3).OrderBy(_ => Guid.NewGuid()).ToList(); - var monster5Pool = ParentSection.MonsterCamp.Monsters.Where(x => x.MonsterTier == 5).OrderBy(_ => Guid.NewGuid()).ToList(); - for (var i = 0; i < waveNum; i++) - { - if (i < waveNum - 1 || ParentSection.Excel.NodeType is GridFightNodeTypeEnum.Monster) - { - // no elite - var res = monsterPool.OrderBy(_ => Guid.NewGuid()).Take(monsterNum[i]).ToList(); - MonsterWaves.Add(new GridFightGameMonsterWaveInfo((uint)(i + 1), res, ParentSection.MonsterCamp.ID)); - } - else - { - List elites = ParentSection.Excel.NodeType switch - { - GridFightNodeTypeEnum.Boss => [..monster5Pool], - _ => [monster4Pool.RandomElement()], - }; - - List monsters = [..elites]; - var remain = monsterNum[i] - 1; - - if (remain > 0) - { - monsters.AddRange(monsterPool.OrderBy(_ => Guid.NewGuid()).Take(remain).ToList()); - } - - MonsterWaves.Add(new GridFightGameMonsterWaveInfo((uint)(i + 1), monsters, ParentSection.MonsterCamp.ID)); - } - } + var waves = GridFightEncounterGenerateHelper.GenerateMonsterWaves(section); + MonsterWaves.AddRange(waves); } public uint EncounterIndex { get; set; } @@ -426,8 +394,9 @@ public class GridFightGameEncounterInfo public class GridFightGameMonsterWaveInfo(uint wave, List monsters, uint campId) { public uint Wave { get; set; } = wave; - public uint CampId { get; set; } = campId; - public List Monsters { get; } = monsters; + + public List Monsters { get; } = monsters + .Select(x => new GridFightGameMonsterInfo(x, campId, (uint)Random.Shared.Next(1, (int)(x.MonsterTier + 1)))).ToList(); public GridEncounterMonsterWave ToProto() { @@ -436,13 +405,143 @@ public class GridFightGameMonsterWaveInfo(uint wave, List EncounterWave = Wave, FightMonsterList = { - Monsters.Select(x => new GridFightMonsterInfo - { - MonsterId = x.MonsterID, - MonsterCampId = CampId, - Tier = x.MonsterTier - }) + Monsters.Select(x => x.ToProto()) } }; } +} + +public class GridFightGameMonsterInfo(GridFightMonsterExcel monsters, uint campId, uint tier) +{ + public uint CampId { get; set; } = campId; + public GridFightMonsterExcel Monster { get; } = monsters; + public uint Tier { get; } = tier; + + public GridFightMonsterInfo ToProto() + { + return new GridFightMonsterInfo + { + MonsterId = Monster.MonsterID, + MonsterCampId = CampId, + Tier = Tier + }; + } +} + +public static class GridFightEncounterGenerateHelper +{ + private static readonly List>> RandomWaveRule = + [ + [[3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]], + [[3, 2, 2, 2, 2], [3, 3, 2, 2, 2]], + [[3, 3, 3, 2, 2, 2, 2, 2]], + [[2, 2, 2, 2, 3, 3]] + ]; + + public static List GenerateMonsterWaves(GridFightGameSectionInfo section) + { + switch (section.Excel.NodeType) + { + case GridFightNodeTypeEnum.Monster: + return GenerateMonsterType(section); + + case GridFightNodeTypeEnum.CampMonster: + case GridFightNodeTypeEnum.EliteBranch: + return GenerateCampMonsterType(section); + + case GridFightNodeTypeEnum.Boss: + return GenerateBossType(section); + default: + break; + } + + return []; + } + + public static List GenerateMonsterType(GridFightGameSectionInfo section) + { + List waves = []; + + var monsters = section.MonsterCamp.Monsters + .Where(x => x.MonsterTier <= 2).ToList(); + + List targets = []; + + for (var i = 0; i < 5; i++) + { + targets.Add(monsters.RandomElement()); + } + + waves.Add(new GridFightGameMonsterWaveInfo(1, targets, section.MonsterCamp.ID)); + + return waves; + } + + public static List GenerateCampMonsterType(GridFightGameSectionInfo section) + { + List waves = []; + + var rules = RandomWaveRule.RandomElement(); + + foreach (var rule in rules) + { + List excels = []; + + foreach (var tier in rule) + { + var targets = section.MonsterCamp.Monsters.Where(x => x.MonsterTier == tier).ToList(); + if (targets.Count == 0) + continue; + + var selected = targets.RandomElement(); + excels.Add(selected); + } + + // random order + excels = excels.OrderBy(_ => Guid.NewGuid()).ToList(); + waves.Add(new GridFightGameMonsterWaveInfo((uint)(waves.Count + 1), excels, section.MonsterCamp.ID)); + } + + return waves; + } + + public static List GenerateBossType(GridFightGameSectionInfo section) + { + List waves = []; + + var waveNum = section.ChapterId == 3 ? 2 : 1; + + for (var i = 0; i < waveNum; i++) + { + if (i == waveNum - 1) + { + // boss wave + var bossMonsters = section.MonsterCamp.Monsters + .Where(x => x.MonsterTier == (section.ChapterId == 3 ? 6 : 5)) + .ToList(); + + if (bossMonsters.Count == 0) + continue; + + waves.Add(new GridFightGameMonsterWaveInfo((uint)(waves.Count + 1), bossMonsters, section.MonsterCamp.ID)); + } + else + { + // normal wave + var monsters = section.MonsterCamp.Monsters + .Where(x => x.MonsterTier <= 2).ToList(); + + List targets = []; + + for (var j = 0; j < 5; j++) + { + targets.Add(monsters.RandomElement()); + } + + waves.Add(new GridFightGameMonsterWaveInfo((uint)(waves.Count + 1), targets, section.MonsterCamp.ID)); + } + } + + return waves; + } } \ No newline at end of file diff --git a/GameServer/Game/GridFight/Component/GridFightRoleComponent.cs b/GameServer/Game/GridFight/Component/GridFightRoleComponent.cs index 5d112640..1aa4c262 100644 --- a/GameServer/Game/GridFight/Component/GridFightRoleComponent.cs +++ b/GameServer/Game/GridFight/Component/GridFightRoleComponent.cs @@ -18,7 +18,7 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo } public async ValueTask> AddAvatar(uint roleId, uint tier = 1, bool sendPacket = true, - bool checkMerge = true, GridFightSrc src = GridFightSrc.KGridFightSrcBuyGoods, uint syncGroup = 0, uint targetPos = 0) + bool checkMerge = true, GridFightSrc src = GridFightSrc.KGridFightSrcBuyGoods, uint syncGroup = 0, uint targetPos = 0, params uint[] param) { if (!GameData.GridFightRoleBasicInfoData.TryGetValue(roleId, out var excel)) return []; @@ -55,7 +55,7 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo Data.Roles.Add(info); - List syncs = [new GridFightRoleAddSyncData(src, info, syncGroup)]; + List syncs = [new GridFightRoleAddSyncData(src, info, syncGroup, param)]; if (checkMerge) { @@ -68,6 +68,8 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify(syncs)); } + Inst.GetComponent().CheckTrait(); + return syncs; } @@ -155,10 +157,12 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify(syncs)); } + Inst.GetComponent().CheckTrait(); + return syncs; } - public List GetForegroundAvatarInfos(uint maxAvatarNum) + public List GetForegroundAvatarInfos() { var foreground = Data.Roles.Where(x => x.Pos <= 4).OrderBy(x => x.Pos).ToList(); List res = []; @@ -230,7 +234,7 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo if (role != null) { role.Pos = pos.Pos; - syncs.Add(new GridFightRoleUpdateSyncData(GridFightSrc.KGridFightSrcCopyRole, role)); + syncs.Add(new GridFightRoleUpdateSyncData(GridFightSrc.KGridFightSrcNone, role)); } } @@ -239,6 +243,8 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify(syncs)); } + Inst.GetComponent().CheckTrait(); + return Retcode.RetSucc; } diff --git a/GameServer/Game/GridFight/Component/GridFightShopComponent.cs b/GameServer/Game/GridFight/Component/GridFightShopComponent.cs index 76d60122..f0d0c044 100644 --- a/GameServer/Game/GridFight/Component/GridFightShopComponent.cs +++ b/GameServer/Game/GridFight/Component/GridFightShopComponent.cs @@ -49,7 +49,7 @@ public class GridFightShopComponent(GridFightInstance inst) : BaseGridFightCompo var totalCost = (uint)targetGoods.Select(x => GetGoodsPrice(x.Rarity, x.RoleItem.Tier)).Sum(x => x); // COST - var code = await Inst.GetComponent().UpdateGoldNum((int)-totalCost, false); + var code = await Inst.GetComponent().UpdateGoldNum((int)-totalCost, false, GridFightSrc.KGridFightSrcBuyGoods); if (code != Retcode.RetSucc) { return code; @@ -61,7 +61,8 @@ public class GridFightShopComponent(GridFightInstance inst) : BaseGridFightCompo { if (item.ItemTypeCase == GridFightShopItemPb.ItemTypeOneofCase.RoleItem) { - syncs.AddRange(await avatarComp.AddAvatar(item.RoleItem.RoleId, item.RoleItem.Tier, false)); + syncs.AddRange(await avatarComp.AddAvatar(item.RoleItem.RoleId, item.RoleItem.Tier, false, + param: (uint)Data.ShopItems.IndexOf(item))); } else { @@ -136,7 +137,7 @@ public class GridFightShopComponent(GridFightInstance inst) : BaseGridFightCompo else { // cost - var code = await Inst.GetComponent().UpdateGoldNum((int)-Data.RefreshCost); + var code = await Inst.GetComponent().UpdateGoldNum((int)-Data.RefreshCost, src:GridFightSrc.KGridFightSrcManualRefreshGoods); if (code != Retcode.RetSucc) { return code; diff --git a/GameServer/Game/GridFight/Component/GridFightTraitComponent.cs b/GameServer/Game/GridFight/Component/GridFightTraitComponent.cs new file mode 100644 index 00000000..80422818 --- /dev/null +++ b/GameServer/Game/GridFight/Component/GridFightTraitComponent.cs @@ -0,0 +1,152 @@ +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Proto.ServerSide; + +namespace EggLink.DanhengServer.GameServer.Game.GridFight.Component; + +public class GridFightTraitComponent(GridFightInstance inst) : BaseGridFightComponent(inst) +{ + public GridFightTraitInfoPb Data { get; set; } = new(); + + public void CheckTrait() + { + var roleComp = Inst.GetComponent(); + + Dictionary traitCount = []; + + foreach (var traitId in GameData.GridFightTraitBasicInfoData.Keys) + { + traitCount[traitId] = 0; // initialize + } + + foreach (var role in roleComp.Data.Roles.Where(x => x.Pos <= GridFightRoleComponent.PrepareAreaPos)) + { + if (!GameData.GridFightRoleBasicInfoData.TryGetValue(role.RoleId, out var excel)) continue; + + foreach (var traitId in excel.TraitList) + { + traitCount[traitId]++; // increase count + } + } + + foreach (var (traitId, count) in traitCount) + { + var traitExcel = GameData.GridFightTraitBasicInfoData.GetValueOrDefault(traitId); + if (traitExcel == null) continue; + + var traitLayers = GameData.GridFightTraitLayerData.GetValueOrDefault(traitId); + if (traitLayers == null) continue; + + var layers = traitLayers.Where(x => x.Key <= count).ToList(); + var layer = layers.Count > 0 ? layers.Max(x => x.Value.Layer) : 0; + + var existingTrait = Data.Traits.FirstOrDefault(x => x.TraitId == traitId); + + if (existingTrait != null) + { + existingTrait.TraitLayer = layer; + } + else + { + if (layer == 0) continue; // do not add if no layer + + Data.Traits.Add(new GridFightGameTraitPb + { + TraitId = traitId, + TraitLayer = layer, + Effects = + { + traitExcel.TraitEffectList.Select(x => new GridFightGameTraitEffectPb + { + EffectId = x + }) + } + }); + } + } + } + + public override GridFightGameInfo ToProto() + { + var roleComp = Inst.GetComponent(); + + return new GridFightGameInfo + { + GridTraitGameInfo = new GridFightGameTraitInfo + { + GridFightTraitInfo = { Data.Traits.Select(x => x.ToProto(roleComp)) } + } + }; + } +} + +public static class GridFightTraitInfoPbExtensions +{ + public static GridGameTraitInfo ToProto(this GridFightGameTraitPb info, GridFightRoleComponent roleComp) + { + var traitRoles = roleComp.Data.Roles.Where(x => + GameData.GridFightRoleBasicInfoData.GetValueOrDefault(x.RoleId)?.TraitList.Contains(info.TraitId) == true).ToList(); + + return new GridGameTraitInfo + { + TraitId = info.TraitId, + TraitEffectLayer = info.TraitLayer, + GridFightTraitMemberUniqueIdList = { traitRoles.Select(x => x.UniqueId) }, + TraitEffectList = { info.Effects.Select(x => x.ToProto())} + }; + } + + public static BattleGridFightTraitInfo ToBattleInfo(this GridFightGameTraitPb info, GridFightRoleComponent roleComp) + { + var traitRoles = roleComp.Data.Roles.Where(x => + x.Pos <= GridFightRoleComponent.PrepareAreaPos && GameData.GridFightRoleBasicInfoData + .GetValueOrDefault(x.RoleId)?.TraitList.Contains(info.TraitId) == true).ToList(); + + var phainonRole = roleComp.Data.Roles.FirstOrDefault(x => + x.Pos <= GridFightRoleComponent.PrepareAreaPos && x.RoleId == 1408); // hardcode + + var res = new BattleGridFightTraitInfo + { + TraitId = info.TraitId, + TraitEffectLayer = info.TraitLayer, + MemberList = { traitRoles.Select(x => new GridFightTraitMember + { + GridUpdateSrc = GridFightTraitSrc.KGridFightTraitSrcRole, + MemberRoleId = x.RoleId, + MemberRoleUniqueId = x.UniqueId, + MemberType = GridFightTraitMemberType.KGridFightTraitMemberRole + }) }, + TraitEffectList = { info.Effects.Select(x => x.ToBattleInfo())} + }; + + if (phainonRole != null && traitRoles.All(x => x.UniqueId != phainonRole.UniqueId)) + { + res.MemberList.Add(new GridFightTraitMember + { + GridUpdateSrc = GridFightTraitSrc.KGridFightTraitSrcDummy, + MemberRoleId = phainonRole.RoleId, + MemberRoleUniqueId = phainonRole.UniqueId, + MemberType = GridFightTraitMemberType.KGridFightTraitMemberRole + }); + } + + return res; + } + + public static GridFightTraitEffectInfo ToProto(this GridFightGameTraitEffectPb info) + { + return new GridFightTraitEffectInfo + { + EffectId = info.EffectId, + EffectDnaNum = info.Param + }; + } + + public static BattleGridFightTraitEffectInfo ToBattleInfo(this GridFightGameTraitEffectPb info) + { + return new BattleGridFightTraitEffectInfo + { + EffectId = info.EffectId + }; + } +} \ No newline at end of file diff --git a/GameServer/Game/GridFight/GridFightInstance.cs b/GameServer/Game/GridFight/GridFightInstance.cs index 2ab7c74a..eb32e6d4 100644 --- a/GameServer/Game/GridFight/GridFightInstance.cs +++ b/GameServer/Game/GridFight/GridFightInstance.cs @@ -59,7 +59,7 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division _ => 1u }; - await basicComp.UpdateGoldNum((int)(baseCoin + interestCoin + comboCoin), false, GridFightSrc.KGridFightSrcNone); + await basicComp.UpdateGoldNum((int)(baseCoin + interestCoin + comboCoin), false); await basicComp.AddLevelExp(expNum, false); List sttList = []; @@ -76,7 +76,7 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division comboCoin)); - syncs.Add(new GridFightGoldSyncData(GridFightSrc.KGridFightSrcBattleEnd, basicComp.Data)); + syncs.Add(new GridFightGoldSyncData(GridFightSrc.KGridFightSrcBattleEnd, basicComp.Data, 0, levelComp.CurrentSection.ChapterId, levelComp.CurrentSection.SectionId)); syncs.Add(new GridFightPlayerLevelSyncData(GridFightSrc.KGridFightSrcBattleEnd, basicComp.Data)); syncs.Add(new GridFightLineupHpSyncData(GridFightSrc.KGridFightSrcBattleEnd, basicComp.Data)); syncs.Add(new GridFightComboNumSyncData(GridFightSrc.KGridFightSrcBattleEnd, basicComp.Data)); @@ -93,12 +93,14 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division Components.Add(new GridFightLevelComponent(this)); Components.Add(new GridFightRoleComponent(this)); Components.Add(new GridFightAugmentComponent(this)); + Components.Add(new GridFightTraitComponent(this)); _ = GetComponent().AddAvatar(1414, 3, false); _ = GetComponent().RefreshShop(true, false); _ = CreatePendingAction(sendPacket:false); _ = CreatePendingAction(sendPacket: false); + _ = CreatePendingAction(sendPacket: false); } public T GetComponent() where T : BaseGridFightComponent @@ -189,6 +191,8 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division public async ValueTask HandleResultRequest(GridFightHandlePendingActionCsReq req) { var basicComp = GetComponent(); + var levelComp = GetComponent(); + var curAction = GetCurAction(); // end @@ -231,10 +235,32 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division break; case GridFightHandlePendingActionCsReq.GridFightActionTypeOneofCase.EliteAction: + break; + case GridFightHandlePendingActionCsReq.GridFightActionTypeOneofCase.EliteBranchAction: + var target = req.EliteBranchAction.EliteBranchId; + levelComp.CurrentSection.BranchId = target; + // sync + syncs.Add(new GridFightLevelSyncData(GridFightSrc.KGridFightSrcNone, levelComp)); + break; case GridFightHandlePendingActionCsReq.GridFightActionTypeOneofCase.SupplyAction: src = GridFightSrc.KGridFightSrcSelectSupply; - await CheckCurNodeFinish(src); + + PendingActions.Remove(curAction.QueuePosition); + + if (curAction is GridFightSupplyPendingAction supplyAction) + { + foreach (var supply in req.SupplyAction.SelectSupplyIndexes) + { + var role = supplyAction.RoleList[(int)supply]; + + syncs.AddRange(await GetComponent().AddAvatar(role.RoleId, 1, false, true, + GridFightSrc.KGridFightSrcSelectSupply, 0, 0, req.SupplyAction.SelectSupplyIndexes.ToArray())); + } + } + + syncs.AddRange(await CheckCurNodeFinish(src)); + break; } @@ -248,9 +274,6 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division basicComp.Data.LockType = (uint)GridFightLockType.KGridFightLockTypeNone; syncs.Add(new GridFightLockInfoSyncData(GridFightSrc.KGridFightSrcNone, basicComp.Data.Clone())); - - // sync level - syncs.Add(new GridFightLevelSyncData(GridFightSrc.KGridFightSrcNone, GetComponent())); } if (PendingActions.Count > 0) @@ -265,17 +288,17 @@ public class GridFightInstance(PlayerInstance player, uint season, uint division await Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify(syncs)); } - public async ValueTask CheckCurNodeFinish(GridFightSrc src) + public async ValueTask> CheckCurNodeFinish(GridFightSrc src) { var levelComp = GetComponent(); var curSection = levelComp.CurrentSection; - if (curSection.Encounters.Count != 0) return; + if (curSection.Encounters.Count != 0) return []; - if (PendingActions.Count != 0) return; + if (PendingActions.Count != 0) return []; // next - await levelComp.EnterNextSection(src:GridFightSrc.KGridFightSrcNone); + return await levelComp.EnterNextSection(src:GridFightSrc.KGridFightSrcNone); } #endregion diff --git a/GameServer/Game/GridFight/PendingAction/GridFightPreparePendingAction.cs b/GameServer/Game/GridFight/PendingAction/GridFightEnterNodePendingAction.cs similarity index 62% rename from GameServer/Game/GridFight/PendingAction/GridFightPreparePendingAction.cs rename to GameServer/Game/GridFight/PendingAction/GridFightEnterNodePendingAction.cs index 680141d8..61f90875 100644 --- a/GameServer/Game/GridFight/PendingAction/GridFightPreparePendingAction.cs +++ b/GameServer/Game/GridFight/PendingAction/GridFightEnterNodePendingAction.cs @@ -2,13 +2,13 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.GridFight.PendingAction; -public class GridFightPreparePendingAction(GridFightInstance inst) : BaseGridFightPendingAction(inst) +public class GridFightEnterNodePendingAction(GridFightInstance inst) : BaseGridFightPendingAction(inst) { public override GridFightPendingAction ToProto() { return new GridFightPendingAction { - PrepareAction = new GridFightPrepareActionInfo(), + EnterNodeAction = new GridFightEnterNodeActionInfo(), QueuePosition = QueuePosition }; } diff --git a/GameServer/Game/GridFight/Sync/BaseGridFightSyncData.cs b/GameServer/Game/GridFight/Sync/BaseGridFightSyncData.cs index 827e6443..4861edf5 100644 --- a/GameServer/Game/GridFight/Sync/BaseGridFightSyncData.cs +++ b/GameServer/Game/GridFight/Sync/BaseGridFightSyncData.cs @@ -2,9 +2,10 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public abstract class BaseGridFightSyncData(GridFightSrc src, uint groupId = 0) +public abstract class BaseGridFightSyncData(GridFightSrc src, uint groupId = 0, params uint[] syncParams) { public GridFightSrc Src { get; set; } = src; public uint GroupId { get; set; } = groupId; + public uint[] SyncParams { get; set; } = syncParams; public abstract GridFightSyncData ToProto(); } \ No newline at end of file diff --git a/GameServer/Game/GridFight/Sync/GridFightAddAugmentSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightAddAugmentSyncData.cs index ca432152..b6ce29c5 100644 --- a/GameServer/Game/GridFight/Sync/GridFightAddAugmentSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightAddAugmentSyncData.cs @@ -4,7 +4,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightAddAugmentSyncData(GridFightSrc src, GridFightGameAugmentPb augment, uint groupId = 0) : BaseGridFightSyncData(src, groupId) +public class GridFightAddAugmentSyncData(GridFightSrc src, GridFightGameAugmentPb augment, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightAddPortalBuffSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightAddPortalBuffSyncData.cs index 45847fa3..90166feb 100644 --- a/GameServer/Game/GridFight/Sync/GridFightAddPortalBuffSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightAddPortalBuffSyncData.cs @@ -3,7 +3,7 @@ using GridFightPortalBuffInfo = EggLink.DanhengServer.GameServer.Game.GridFight. namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightAddPortalBuffSyncData(GridFightSrc src, GridFightPortalBuffInfo info, uint groupId = 0) : BaseGridFightSyncData(src, groupId) +public class GridFightAddPortalBuffSyncData(GridFightSrc src, GridFightPortalBuffInfo info, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightBuyExpCostSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightBuyExpCostSyncData.cs index 3fc709f0..d5f29de7 100644 --- a/GameServer/Game/GridFight/Sync/GridFightBuyExpCostSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightBuyExpCostSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightBuyExpCostSyncData(GridFightSrc src, GridFightBasicInfoPb info) : BaseGridFightSyncData(src) +public class GridFightBuyExpCostSyncData(GridFightSrc src, GridFightBasicInfoPb info, params uint[] param) : BaseGridFightSyncData(src, 0, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightComboNumSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightComboNumSyncData.cs index f23d830c..f9f2c71f 100644 --- a/GameServer/Game/GridFight/Sync/GridFightComboNumSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightComboNumSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightComboNumSyncData(GridFightSrc src, GridFightBasicInfoPb info) : BaseGridFightSyncData(src) +public class GridFightComboNumSyncData(GridFightSrc src, GridFightBasicInfoPb info, params uint[] param) : BaseGridFightSyncData(src, 0, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightFinishPendingActionSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightFinishPendingActionSyncData.cs index 6f3fb936..0905ab00 100644 --- a/GameServer/Game/GridFight/Sync/GridFightFinishPendingActionSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightFinishPendingActionSyncData.cs @@ -2,7 +2,7 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightFinishPendingActionSyncData(GridFightSrc src, uint queuePosition) : BaseGridFightSyncData(src) +public class GridFightFinishPendingActionSyncData(GridFightSrc src, uint queuePosition, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightGoldSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightGoldSyncData.cs index feaf3bab..58a71b73 100644 --- a/GameServer/Game/GridFight/Sync/GridFightGoldSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightGoldSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightGoldSyncData(GridFightSrc src, GridFightBasicInfoPb basic) : BaseGridFightSyncData(src) +public class GridFightGoldSyncData(GridFightSrc src, GridFightBasicInfoPb basic, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightLevelSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightLevelSyncData.cs index ed6a1995..40080c66 100644 --- a/GameServer/Game/GridFight/Sync/GridFightLevelSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightLevelSyncData.cs @@ -3,7 +3,11 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightLevelSyncData(GridFightSrc src, GridFightLevelComponent level) : BaseGridFightSyncData(src) +public class GridFightLevelSyncData( + GridFightSrc src, + GridFightLevelComponent level, + uint groupId = 0, + params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightLineupHpSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightLineupHpSyncData.cs index 50557a6a..b2f55bf4 100644 --- a/GameServer/Game/GridFight/Sync/GridFightLineupHpSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightLineupHpSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightLineupHpSyncData(GridFightSrc src, GridFightBasicInfoPb info) : BaseGridFightSyncData(src) +public class GridFightLineupHpSyncData(GridFightSrc src, GridFightBasicInfoPb info, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightLockInfoSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightLockInfoSyncData.cs index 747e5b6f..f46fef36 100644 --- a/GameServer/Game/GridFight/Sync/GridFightLockInfoSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightLockInfoSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightLockInfoSyncData(GridFightSrc src, GridFightBasicInfoPb info, uint groupId = 0) : BaseGridFightSyncData(src, groupId) +public class GridFightLockInfoSyncData(GridFightSrc src, GridFightBasicInfoPb info, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightMaxAvatarNumSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightMaxAvatarNumSyncData.cs index 4c1c5634..a774ecd6 100644 --- a/GameServer/Game/GridFight/Sync/GridFightMaxAvatarNumSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightMaxAvatarNumSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightMaxAvatarNumSyncData(GridFightSrc src, GridFightBasicInfoPb info) : BaseGridFightSyncData(src) +public class GridFightMaxAvatarNumSyncData(GridFightSrc src, GridFightBasicInfoPb info, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightPendingActionSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightPendingActionSyncData.cs index bb50167b..795c0aa1 100644 --- a/GameServer/Game/GridFight/Sync/GridFightPendingActionSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightPendingActionSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightPendingActionSyncData(GridFightSrc src, BaseGridFightPendingAction action, uint groupId = 0) : BaseGridFightSyncData(src, groupId) +public class GridFightPendingActionSyncData(GridFightSrc src, BaseGridFightPendingAction action, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightPlayerLevelSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightPlayerLevelSyncData.cs index 463f96b3..64da47c2 100644 --- a/GameServer/Game/GridFight/Sync/GridFightPlayerLevelSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightPlayerLevelSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightPlayerLevelSyncData(GridFightSrc src, GridFightBasicInfoPb info) : BaseGridFightSyncData(src) +public class GridFightPlayerLevelSyncData(GridFightSrc src, GridFightBasicInfoPb info, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightRoleAddSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightRoleAddSyncData.cs index 60bb00d5..2511de45 100644 --- a/GameServer/Game/GridFight/Sync/GridFightRoleAddSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightRoleAddSyncData.cs @@ -4,7 +4,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightRoleAddSyncData(GridFightSrc src, GridFightRoleInfoPb role, uint groupId = 0) : BaseGridFightSyncData(src, groupId) +public class GridFightRoleAddSyncData(GridFightSrc src, GridFightRoleInfoPb role, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightRoleDamageSttSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightRoleDamageSttSyncData.cs index 1ad89554..316ff144 100644 --- a/GameServer/Game/GridFight/Sync/GridFightRoleDamageSttSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightRoleDamageSttSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightRoleDamageSttSyncData(GridFightSrc src, GridFightLevelComponent comp) : BaseGridFightSyncData(src) +public class GridFightRoleDamageSttSyncData(GridFightSrc src, GridFightLevelComponent comp, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightRoleRemoveSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightRoleRemoveSyncData.cs index cda6025e..c7c98cb6 100644 --- a/GameServer/Game/GridFight/Sync/GridFightRoleRemoveSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightRoleRemoveSyncData.cs @@ -3,7 +3,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightRoleRemoveSyncData(GridFightSrc src, GridFightRoleInfoPb role, uint groupId = 0) : BaseGridFightSyncData(src, groupId) +public class GridFightRoleRemoveSyncData(GridFightSrc src, GridFightRoleInfoPb role, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightRoleUpdateSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightRoleUpdateSyncData.cs index 78d31ee2..0424122f 100644 --- a/GameServer/Game/GridFight/Sync/GridFightRoleUpdateSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightRoleUpdateSyncData.cs @@ -4,7 +4,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightRoleUpdateSyncData(GridFightSrc src, GridFightRoleInfoPb role) : BaseGridFightSyncData(src) +public class GridFightRoleUpdateSyncData(GridFightSrc src, GridFightRoleInfoPb role, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Game/GridFight/Sync/GridFightShopSyncData.cs b/GameServer/Game/GridFight/Sync/GridFightShopSyncData.cs index 62b20641..83d9275a 100644 --- a/GameServer/Game/GridFight/Sync/GridFightShopSyncData.cs +++ b/GameServer/Game/GridFight/Sync/GridFightShopSyncData.cs @@ -4,7 +4,7 @@ using EggLink.DanhengServer.Proto.ServerSide; namespace EggLink.DanhengServer.GameServer.Game.GridFight.Sync; -public class GridFightShopSyncData(GridFightSrc src, GridFightShopInfoPb data, uint level) : BaseGridFightSyncData(src) +public class GridFightShopSyncData(GridFightSrc src, GridFightShopInfoPb data, uint level, uint groupId = 0, params uint[] param) : BaseGridFightSyncData(src, groupId, param) { public override GridFightSyncData ToProto() { diff --git a/GameServer/Server/Packet/Send/GridFight/PacketGridFightSyncUpdateResultScNotify.cs b/GameServer/Server/Packet/Send/GridFight/PacketGridFightSyncUpdateResultScNotify.cs index e1d6774b..91c1e227 100644 --- a/GameServer/Server/Packet/Send/GridFight/PacketGridFightSyncUpdateResultScNotify.cs +++ b/GameServer/Server/Packet/Send/GridFight/PacketGridFightSyncUpdateResultScNotify.cs @@ -18,7 +18,7 @@ public class PacketGridFightSyncUpdateResultScNotify : BasePacket { GridUpdateSrc = x.Key.Src, UpdateDynamicList = { x.Select(j => j.ToProto()) }, - ONMDGNHMABO = { 0 } + SyncEffectParamList = { x.SelectMany(j => j.SyncParams).ToHashSet() } }) } }; diff --git a/ServerSideProto/GridFightData.cs b/ServerSideProto/GridFightData.cs index cb64a59e..6490f5bf 100644 --- a/ServerSideProto/GridFightData.cs +++ b/ServerSideProto/GridFightData.cs @@ -54,19 +54,19 @@ namespace EggLink.DanhengServer.Proto.ServerSide { "ASgJEg0KBXZhbHVlGAIgASgNOgI4ASJDChZHcmlkRmlnaHRBdWdtZW50SW5m", "b1BiEikKCEF1Z21lbnRzGAEgAygLMhcuR3JpZEZpZ2h0R2FtZUF1Z21lbnRQ", "YiJOChpHcmlkRmlnaHRHYW1lVHJhaXRFZmZlY3RQYhIPCgdUcmFpdElkGAEg", - "ASgNEhAKCEVmZmVjdElkGAIgASgNEg0KBVBhcmFtGAMgASgNImsKFEdyaWRG", + "ASgNEhAKCEVmZmVjdElkGAIgASgNEg0KBVBhcmFtGAMgASgNImkKFEdyaWRG", "aWdodEdhbWVUcmFpdFBiEg8KB1RyYWl0SWQYASABKA0SLAoHRWZmZWN0cxgC", - "IAMoCzIbLkdyaWRGaWdodEdhbWVUcmFpdEVmZmVjdFBiEhQKDEV4dHJhUm9s", - "ZU51bRgDIAEoDSI9ChRHcmlkRmlnaHRUcmFpdEluZm9QYhIlCgZUcmFpdHMY", - "ASADKAsyFS5HcmlkRmlnaHRHYW1lVHJhaXRQYiKvAgoUR3JpZEZpZ2h0Q29t", - "cG9uZW50UGISKAoIU2hvcEluZm8YASABKAsyFC5HcmlkRmlnaHRTaG9wSW5m", - "b1BiSAASKgoJQmFzaWNJbmZvGAIgASgLMhUuR3JpZEZpZ2h0QmFzaWNJbmZv", - "UGJIABIsCgpBdmF0YXJJbmZvGAMgASgLMhYuR3JpZEZpZ2h0QXZhdGFySW5m", - "b1BiSAASJgoHT3JiSW5mbxgEIAEoCzITLkdyaWRGaWdodE9yYkluZm9QYkgA", - "Ei4KC0F1Z21lbnRJbmZvGAUgASgLMhcuR3JpZEZpZ2h0QXVnbWVudEluZm9Q", - "YkgAEioKCVRyYWl0SW5mbxgGIAEoCzIVLkdyaWRGaWdodFRyYWl0SW5mb1Bi", - "SABCDwoNQ29tcG9uZW50VHlwZUIpqgImRWdnTGluay5EYW5oZW5nU2VydmVy", - "LlByb3RvLlNlcnZlclNpZGViBnByb3RvMw==")); + "IAMoCzIbLkdyaWRGaWdodEdhbWVUcmFpdEVmZmVjdFBiEhIKClRyYWl0TGF5", + "ZXIYAyABKA0iPQoUR3JpZEZpZ2h0VHJhaXRJbmZvUGISJQoGVHJhaXRzGAEg", + "AygLMhUuR3JpZEZpZ2h0R2FtZVRyYWl0UGIirwIKFEdyaWRGaWdodENvbXBv", + "bmVudFBiEigKCFNob3BJbmZvGAEgASgLMhQuR3JpZEZpZ2h0U2hvcEluZm9Q", + "YkgAEioKCUJhc2ljSW5mbxgCIAEoCzIVLkdyaWRGaWdodEJhc2ljSW5mb1Bi", + "SAASLAoKQXZhdGFySW5mbxgDIAEoCzIWLkdyaWRGaWdodEF2YXRhckluZm9Q", + "YkgAEiYKB09yYkluZm8YBCABKAsyEy5HcmlkRmlnaHRPcmJJbmZvUGJIABIu", + "CgtBdWdtZW50SW5mbxgFIAEoCzIXLkdyaWRGaWdodEF1Z21lbnRJbmZvUGJI", + "ABIqCglUcmFpdEluZm8YBiABKAsyFS5HcmlkRmlnaHRUcmFpdEluZm9QYkgA", + "Qg8KDUNvbXBvbmVudFR5cGVCKaoCJkVnZ0xpbmsuRGFuaGVuZ1NlcnZlci5Q", + "cm90by5TZXJ2ZXJTaWRlYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { @@ -82,7 +82,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameAugmentPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameAugmentPb.Parser, new[]{ "AugmentId", "SavedValues" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, }), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightAugmentInfoPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightAugmentInfoPb.Parser, new[]{ "Augments" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameTraitEffectPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameTraitEffectPb.Parser, new[]{ "TraitId", "EffectId", "Param" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameTraitPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameTraitPb.Parser, new[]{ "TraitId", "Effects", "ExtraRoleNum" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameTraitPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightGameTraitPb.Parser, new[]{ "TraitId", "Effects", "TraitLayer" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightTraitInfoPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightTraitInfoPb.Parser, new[]{ "Traits" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::EggLink.DanhengServer.Proto.ServerSide.GridFightComponentPb), global::EggLink.DanhengServer.Proto.ServerSide.GridFightComponentPb.Parser, new[]{ "ShopInfo", "BasicInfo", "AvatarInfo", "OrbInfo", "AugmentInfo", "TraitInfo" }, new[]{ "ComponentType" }, null, null, null) })); @@ -3401,7 +3401,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { public GridFightGameTraitPb(GridFightGameTraitPb other) : this() { traitId_ = other.traitId_; effects_ = other.effects_.Clone(); - extraRoleNum_ = other.extraRoleNum_; + traitLayer_ = other.traitLayer_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -3434,15 +3434,15 @@ namespace EggLink.DanhengServer.Proto.ServerSide { get { return effects_; } } - /// Field number for the "ExtraRoleNum" field. - public const int ExtraRoleNumFieldNumber = 3; - private uint extraRoleNum_; + /// Field number for the "TraitLayer" field. + public const int TraitLayerFieldNumber = 3; + private uint traitLayer_; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] - public uint ExtraRoleNum { - get { return extraRoleNum_; } + public uint TraitLayer { + get { return traitLayer_; } set { - extraRoleNum_ = value; + traitLayer_ = value; } } @@ -3463,7 +3463,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { } if (TraitId != other.TraitId) return false; if(!effects_.Equals(other.effects_)) return false; - if (ExtraRoleNum != other.ExtraRoleNum) return false; + if (TraitLayer != other.TraitLayer) return false; return Equals(_unknownFields, other._unknownFields); } @@ -3473,7 +3473,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { int hash = 1; if (TraitId != 0) hash ^= TraitId.GetHashCode(); hash ^= effects_.GetHashCode(); - if (ExtraRoleNum != 0) hash ^= ExtraRoleNum.GetHashCode(); + if (TraitLayer != 0) hash ^= TraitLayer.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -3497,9 +3497,9 @@ namespace EggLink.DanhengServer.Proto.ServerSide { output.WriteUInt32(TraitId); } effects_.WriteTo(output, _repeated_effects_codec); - if (ExtraRoleNum != 0) { + if (TraitLayer != 0) { output.WriteRawTag(24); - output.WriteUInt32(ExtraRoleNum); + output.WriteUInt32(TraitLayer); } if (_unknownFields != null) { _unknownFields.WriteTo(output); @@ -3516,9 +3516,9 @@ namespace EggLink.DanhengServer.Proto.ServerSide { output.WriteUInt32(TraitId); } effects_.WriteTo(ref output, _repeated_effects_codec); - if (ExtraRoleNum != 0) { + if (TraitLayer != 0) { output.WriteRawTag(24); - output.WriteUInt32(ExtraRoleNum); + output.WriteUInt32(TraitLayer); } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); @@ -3534,8 +3534,8 @@ namespace EggLink.DanhengServer.Proto.ServerSide { size += 1 + pb::CodedOutputStream.ComputeUInt32Size(TraitId); } size += effects_.CalculateSize(_repeated_effects_codec); - if (ExtraRoleNum != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ExtraRoleNum); + if (TraitLayer != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(TraitLayer); } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); @@ -3553,8 +3553,8 @@ namespace EggLink.DanhengServer.Proto.ServerSide { TraitId = other.TraitId; } effects_.Add(other.effects_); - if (other.ExtraRoleNum != 0) { - ExtraRoleNum = other.ExtraRoleNum; + if (other.TraitLayer != 0) { + TraitLayer = other.TraitLayer; } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -3580,7 +3580,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { break; } case 24: { - ExtraRoleNum = input.ReadUInt32(); + TraitLayer = input.ReadUInt32(); break; } } @@ -3607,7 +3607,7 @@ namespace EggLink.DanhengServer.Proto.ServerSide { break; } case 24: { - ExtraRoleNum = input.ReadUInt32(); + TraitLayer = input.ReadUInt32(); break; } } diff --git a/ServerSideProto/ProtoFile/GridFightData.proto b/ServerSideProto/ProtoFile/GridFightData.proto index 4e5a0582..10c2cc3b 100644 --- a/ServerSideProto/ProtoFile/GridFightData.proto +++ b/ServerSideProto/ProtoFile/GridFightData.proto @@ -83,7 +83,7 @@ message GridFightGameTraitEffectPb { message GridFightGameTraitPb { uint32 TraitId = 1; repeated GridFightGameTraitEffectPb Effects = 2; - uint32 ExtraRoleNum = 3; + uint32 TraitLayer = 3; } message GridFightTraitInfoPb {