feat: grid fight trait & pending actions

This commit is contained in:
Somebody
2025-11-15 22:22:52 +08:00
parent 9b860ff924
commit 8e33f64570
37 changed files with 546 additions and 158 deletions

View File

@@ -39,7 +39,7 @@ public class CommandGrid : ICommand
return;
}
await inst.GetComponent<GridFightRoleComponent>().AddAvatar(roleId, tier);
await inst.GetComponent<GridFightRoleComponent>().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<GridFightBasicComponent>().UpdateGoldNum(gold, true, GridFightSrc.KGridFightSrcNone);
await inst.GetComponent<GridFightBasicComponent>().UpdateGoldNum(gold);
await arg.SendMsg(I18NManager.Translate("Game.Command.Grid.UpdateGold", gold.ToString()));
}
}

View File

@@ -0,0 +1,19 @@
namespace EggLink.DanhengServer.Data.Excel;
[ResourceEntity("GridFightCombinationBonus.json")]
public class GridFightCombinationBonusExcel : ExcelResource
{
public uint BonusID { get; set; }
public List<uint> CombinationBonusList { get; set; } = [];
public List<uint> BonusNumberList { get; set; } = [];
public override int GetId()
{
return (int)BonusID;
}
public override void Loaded()
{
GameData.GridFightCombinationBonusData.TryAdd(BonusID, this);
}
}

View File

@@ -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()
{

View File

@@ -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<uint> TraitEffectList { get; set; } = [];
public List<uint> BEIDList { get; set; } = [];
public override int GetId()
{
return (int)ID;
}
public override void Loaded()
{
GameData.GridFightTraitBasicInfoData.TryAdd(ID, this);
}
}

View File

@@ -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);
}
}

View File

@@ -107,6 +107,8 @@ public static class GameData
public static Dictionary<uint, GridFightRoleBasicInfoExcel> GridFightRoleBasicInfoData { get; private set; } = [];
public static Dictionary<uint, GridFightRoleStarExcel> GridFightRoleStarData { get; private set; } = [];
public static Dictionary<uint, GridFightCombinationBonusExcel> GridFightCombinationBonusData { get; private set; } =
[];
public static Dictionary<uint, GridFightDivisionInfoExcel> GridFightDivisionInfoData { get; private set; } = [];
public static Dictionary<uint, GridFightDivisionStageExcel> GridFightDivisionStageData { get; private set; } = [];
public static Dictionary<uint, GridFightEquipmentExcel> GridFightEquipmentData { get; private set; } = [];
@@ -120,6 +122,8 @@ public static class GameData
public static Dictionary<uint, GridFightPortalBuffExcel> GridFightPortalBuffData { get; private set; } = [];
public static Dictionary<uint, GridFightItemsExcel> GridFightItemsData { get; private set; } = [];
public static Dictionary<uint, GridFightTalentExcel> GridFightTalentData { get; private set; } = [];
public static Dictionary<uint, GridFightTraitBasicInfoExcel> GridFightTraitBasicInfoData { get; private set; } = [];
public static Dictionary<uint, Dictionary<uint, GridFightTraitLayerExcel>> GridFightTraitLayerData { get; private set; } = [];
public static Dictionary<uint, GridFightSeasonTalentExcel> GridFightSeasonTalentData { get; private set; } = [];
public static Dictionary<uint, Dictionary<uint, GridFightStageRouteExcel>> GridFightStageRouteData { get; private set; } = [];
public static Dictionary<uint, GridFightNodeTemplateExcel> GridFightNodeTemplateData { get; private set; } = [];

View File

@@ -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
}

View File

@@ -0,0 +1,11 @@
namespace EggLink.DanhengServer.Enums.GridFight;
public enum GridFightEquipDressTypeEnum
{
DressRuleNotUnique = 0,
DressRuleUnique = 1,
DressRuleAllSlotEmpty = 2,
DressRuleLeader = 3,
DressRuleTraitOnly = 4,
DressRuleUniqueAndExclusiveTrait = 5
}

View File

@@ -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<GridFightRoleComponent>();
public GridFightRoleComponent RoleComponent { get; set; } = inst.GetComponent<GridFightRoleComponent>();
public GridFightLevelComponent LevelComponent { get; set; } = inst.GetComponent<GridFightLevelComponent>();
public GridFightBasicComponent BasicComponent { get; set; } = inst.GetComponent<GridFightBasicComponent>();
public GridFightAugmentComponent AugmentComponent { get; set; } = inst.GetComponent<GridFightAugmentComponent>();
public GridFightTraitComponent TraitComponent { get; set; } = inst.GetComponent<GridFightTraitComponent>();
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)) }
};
}
}

View File

@@ -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<Retcode> UpdateGoldNum(int changeNum, bool sendPacket = true, GridFightSrc src = GridFightSrc.KGridFightSrcManualRefreshGoods)
public async ValueTask<Retcode> 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;

View File

@@ -122,29 +122,26 @@ public class GridFightLevelComponent : BaseGridFightComponent
List<BaseGridFightSyncData> syncs = [new GridFightLevelSyncData(src, this)];
//await Inst.RollPortalBuff();
syncs.AddRange(await Inst.CreatePendingAction<GridFightElitePendingAction>(sendPacket: false));
if (CurrentSection.Excel.IsAugment == 1)
{
// create augment action
syncs.AddRange(await Inst.CreatePendingAction<GridFightAugmentPendingAction>(sendPacket: false));
await Inst.CreatePendingAction<GridFightAugmentPendingAction>(sendPacket: false);
}
if (CurrentSection.Excel.NodeType == GridFightNodeTypeEnum.Supply)
{
// create supply action
syncs.AddRange(await Inst.CreatePendingAction<GridFightSupplyPendingAction>(sendPacket: false));
await Inst.CreatePendingAction<GridFightSupplyPendingAction>(sendPacket: false);
await Inst.CreatePendingAction<GridFightElitePendingAction>(sendPacket: false);
}
else
else if (CurrentSection.Excel.NodeType == GridFightNodeTypeEnum.EliteBranch)
{
syncs.AddRange(await Inst.CreatePendingAction<GridFightElitePendingAction>(sendPacket: false));
if (CurrentSection.Excel.NodeType is not GridFightNodeTypeEnum.Boss
and not GridFightNodeTypeEnum.EliteBranch)
{
syncs.AddRange(await Inst.CreatePendingAction<GridFightPreparePendingAction>(sendPacket: false));
}
await Inst.CreatePendingAction<GridFightEliteBranchPendingAction>(sendPacket: false);
}
await Inst.CreatePendingAction<GridFightEnterNodePendingAction>(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<GridFightGameEncounterInfo> 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<uint> 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<int> 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<GridFightMonsterExcel> elites = ParentSection.Excel.NodeType switch
{
GridFightNodeTypeEnum.Boss => [..monster5Pool],
_ => [monster4Pool.RandomElement()],
};
List<GridFightMonsterExcel> 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<GridFightMonsterExcel> monsters, uint campId)
{
public uint Wave { get; set; } = wave;
public uint CampId { get; set; } = campId;
public List<GridFightMonsterExcel> Monsters { get; } = monsters;
public List<GridFightGameMonsterInfo> 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<GridFightMonsterExcel>
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<List<List<uint>>> 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<GridFightGameMonsterWaveInfo> 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<GridFightGameMonsterWaveInfo> GenerateMonsterType(GridFightGameSectionInfo section)
{
List<GridFightGameMonsterWaveInfo> waves = [];
var monsters = section.MonsterCamp.Monsters
.Where(x => x.MonsterTier <= 2).ToList();
List<GridFightMonsterExcel> 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<GridFightGameMonsterWaveInfo> GenerateCampMonsterType(GridFightGameSectionInfo section)
{
List<GridFightGameMonsterWaveInfo> waves = [];
var rules = RandomWaveRule.RandomElement();
foreach (var rule in rules)
{
List<GridFightMonsterExcel> 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<GridFightGameMonsterWaveInfo> GenerateBossType(GridFightGameSectionInfo section)
{
List<GridFightGameMonsterWaveInfo> 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<GridFightMonsterExcel> 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;
}
}

View File

@@ -18,7 +18,7 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo
}
public async ValueTask<List<BaseGridFightSyncData>> 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<BaseGridFightSyncData> syncs = [new GridFightRoleAddSyncData(src, info, syncGroup)];
List<BaseGridFightSyncData> 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<GridFightTraitComponent>().CheckTrait();
return syncs;
}
@@ -155,10 +157,12 @@ public class GridFightRoleComponent(GridFightInstance inst) : BaseGridFightCompo
await Inst.Player.SendPacket(new PacketGridFightSyncUpdateResultScNotify(syncs));
}
Inst.GetComponent<GridFightTraitComponent>().CheckTrait();
return syncs;
}
public List<BaseAvatarInfo> GetForegroundAvatarInfos(uint maxAvatarNum)
public List<BaseAvatarInfo> GetForegroundAvatarInfos()
{
var foreground = Data.Roles.Where(x => x.Pos <= 4).OrderBy(x => x.Pos).ToList();
List<BaseAvatarInfo> 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<GridFightTraitComponent>().CheckTrait();
return Retcode.RetSucc;
}

View File

@@ -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<GridFightBasicComponent>().UpdateGoldNum((int)-totalCost, false);
var code = await Inst.GetComponent<GridFightBasicComponent>().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<GridFightBasicComponent>().UpdateGoldNum((int)-Data.RefreshCost);
var code = await Inst.GetComponent<GridFightBasicComponent>().UpdateGoldNum((int)-Data.RefreshCost, src:GridFightSrc.KGridFightSrcManualRefreshGoods);
if (code != Retcode.RetSucc)
{
return code;

View File

@@ -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<GridFightRoleComponent>();
Dictionary<uint, uint> 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<GridFightRoleComponent>();
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
};
}
}

View File

@@ -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<GridFightRoleDamageSttInfo> 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<GridFightRoleComponent>().AddAvatar(1414, 3, false);
_ = GetComponent<GridFightShopComponent>().RefreshShop(true, false);
_ = CreatePendingAction<GridFightPortalBuffPendingAction>(sendPacket:false);
_ = CreatePendingAction<GridFightElitePendingAction>(sendPacket: false);
_ = CreatePendingAction<GridFightEnterNodePendingAction>(sendPacket: false);
}
public T GetComponent<T>() 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<GridFightBasicComponent>();
var levelComp = GetComponent<GridFightLevelComponent>();
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<GridFightRoleComponent>().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<GridFightLevelComponent>()));
}
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<List<BaseGridFightSyncData>> CheckCurNodeFinish(GridFightSrc src)
{
var levelComp = GetComponent<GridFightLevelComponent>();
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

View File

@@ -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
};
}

View File

@@ -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();
}

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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()
{

View File

@@ -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() }
})
}
};

View File

@@ -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_; }
}
/// <summary>Field number for the "ExtraRoleNum" field.</summary>
public const int ExtraRoleNumFieldNumber = 3;
private uint extraRoleNum_;
/// <summary>Field number for the "TraitLayer" field.</summary>
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;
}
}

View File

@@ -83,7 +83,7 @@ message GridFightGameTraitEffectPb {
message GridFightGameTraitPb {
uint32 TraitId = 1;
repeated GridFightGameTraitEffectPb Effects = 2;
uint32 ExtraRoleNum = 3;
uint32 TraitLayer = 3;
}
message GridFightTraitInfoPb {