diff --git a/Common/Data/Config/TaskInfo.cs b/Common/Data/Config/TaskInfo.cs index 5bf8ed15..4dcf3793 100644 --- a/Common/Data/Config/TaskInfo.cs +++ b/Common/Data/Config/TaskInfo.cs @@ -20,6 +20,7 @@ public class TaskInfo public List OnProjectileHit { get; set; } = []; public List OnProjectileLifetimeFinish { get; set; } = []; + public string ModifierName { get; set; } = ""; public LifeTimeInfo LifeTime { get; set; } = new(); [JsonIgnore] public TaskTypeEnum TaskType { get; set; } = TaskTypeEnum.None; @@ -35,6 +36,8 @@ public class TaskInfo TaskType = TaskTypeEnum.AddMazeBuff; else if (Type.Contains("RemoveMazeBuff")) TaskType = TaskTypeEnum.RemoveMazeBuff; + else if (Type.Contains("AddAdventureModifier")) + TaskType = TaskTypeEnum.AddAdventureModifier; else if (Type.Contains("AdventureModifyTeamPlayerHP")) TaskType = TaskTypeEnum.AdventureModifyTeamPlayerHP; else if (Type.Contains("AdventureModifyTeamPlayerSP")) @@ -49,7 +52,8 @@ public class TaskInfo TaskType = TaskTypeEnum.SuccessTaskList; else if (Type.Contains("AdventureTriggerAttack")) TaskType = TaskTypeEnum.AdventureTriggerAttack; - else if (Type.Contains("AdventureFireProjectile")) TaskType = TaskTypeEnum.AdventureFireProjectile; + else if (Type.Contains("AdventureFireProjectile")) + TaskType = TaskTypeEnum.AdventureFireProjectile; } public int GetID() diff --git a/Common/Enums/Avatar/DamageTypeEnum.cs b/Common/Enums/Avatar/DamageTypeEnum.cs index 0ef2bcf6..c8bd9a2d 100644 --- a/Common/Enums/Avatar/DamageTypeEnum.cs +++ b/Common/Enums/Avatar/DamageTypeEnum.cs @@ -8,5 +8,6 @@ public enum DamageTypeEnum Thunder = 1000114, Wind = 1000115, Quantum = 1000116, - Imaginary = 1000117 + Imaginary = 1000117, + All = 1000119 // Modified for AddAdventureModifier } \ No newline at end of file diff --git a/Common/Enums/Avatar/TaskTypeEnum.cs b/Common/Enums/Avatar/TaskTypeEnum.cs index 3ead1233..f1357236 100644 --- a/Common/Enums/Avatar/TaskTypeEnum.cs +++ b/Common/Enums/Avatar/TaskTypeEnum.cs @@ -12,5 +12,6 @@ public enum TaskTypeEnum SuccessTaskList = 7, AdventureTriggerAttack = 8, AdventureFireProjectile = 9, - DestroySummonUnit = 10 + DestroySummonUnit = 10, + AddAdventureModifier = 11 } \ No newline at end of file diff --git a/GameServer/Game/Battle/BattleInstance.cs b/GameServer/Game/Battle/BattleInstance.cs index ffe7e9c3..eadd5ed0 100644 --- a/GameServer/Game/Battle/BattleInstance.cs +++ b/GameServer/Game/Battle/BattleInstance.cs @@ -232,16 +232,13 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List - { - foreach (var monster in EntityMonsters) await monster.ApplyBuff(this); + foreach (var monster in EntityMonsters) monster.ApplyBuff(this); - foreach (var avatar in AvatarInfo) - if (avatars.Keys.FirstOrDefault(x => - x.GetSpecialAvatarId() == avatar.AvatarInfo.GetSpecialAvatarId()) != - null) // if avatar is in lineup - await avatar.ApplyBuff(this); - }).Wait(); + foreach (var avatar in AvatarInfo) + if (avatars.Keys.FirstOrDefault(x => + x.GetSpecialAvatarId() == avatar.AvatarInfo.GetSpecialAvatarId()) != + null) // if avatar is in lineup + avatar.ApplyBuff(this); foreach (var eventInstance in BattleEvents.Values) proto.BattleEvent.Add(eventInstance.ToProto()); @@ -255,19 +252,22 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List x.BuffID == buff.BuffID); - if (buffs.Count < 2) continue; - var count = 0; + if (buffs.Count > 1) continue; foreach (var mazeBuff in buffs) { - mazeBuff.WaveFlag = (int)Math.Pow(2, count); - count++; + mazeBuff.WaveFlag = 3; } } + foreach (var buff in Buffs) buff.WaveFlag ??= -1; + foreach (var buff in Buffs.Clone()) if (buff.BuffID == 122003) // Fei Xiao Maze Buff Buffs.Add(new MazeBuff(122002, buff.BuffLevel, 0) diff --git a/GameServer/Game/Battle/BattleManager.cs b/GameServer/Game/Battle/BattleManager.cs index ba54d12d..77b348a7 100644 --- a/GameServer/Game/Battle/BattleManager.cs +++ b/GameServer/Game/Battle/BattleManager.cs @@ -1,6 +1,7 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Database.Inventory; +using EggLink.DanhengServer.Enums.Avatar; using EggLink.DanhengServer.GameServer.Game.Battle.Skill; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Game.RogueMagic; @@ -88,7 +89,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) Player.InventoryManager!.HandlePlaneEvent(prop.PropInfo.EventID); } - Player.RogueManager!.GetRogueInstance()?.OnPropDestruct(prop); + if (Player.RogueManager!.GetRogueInstance() != null) + await Player.RogueManager!.GetRogueInstance()!.OnPropDestruct(prop); } if (targetList.Count > 0) @@ -151,15 +153,21 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) .OfType()); MazeBuff? mazeBuff = null; - if (castAvatar != null) + if (castAvatar != null && skill != null) { var index = battleInstance.Lineup.BaseAvatars!.FindIndex(x => x.BaseAvatarId == castAvatar.AvatarInfo.AvatarId); + GameData.AvatarConfigData.TryGetValue(castAvatar.AvatarInfo.GetAvatarId(), out var avatarExcel); if (avatarExcel != null) { - mazeBuff = new MazeBuff((int)avatarExcel.DamageType, 1, index); - mazeBuff.DynamicValues.Add("SkillIndex", skill.IsMazeSkill ? 2 : 1); + var buffType = avatarExcel.DamageType; + if (skill.AdventureModifiers.Contains("ADV_StageAbility_Maze_IgnoreWeakness_MazeSkillMark")) + buffType = DamageTypeEnum.All; + + mazeBuff = new MazeBuff((int)buffType, 1, index); + // TODO: Confirm SkillIndex value + mazeBuff.DynamicValues.Add("SkillIndex", 0); } } else @@ -193,7 +201,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, battleInstance, hitMonsterInstance)); - Player.SceneInstance?.ClearSummonUnit(); + if (Player.SceneInstance != null) await Player.SceneInstance!.ClearSummonUnit(); } else { @@ -242,7 +250,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) InvokeOnPlayerEnterBattle(player, battleInstance); await Player.SendPacket(new PacketSceneEnterStageScRsp(battleInstance)); - Player.SceneInstance?.ClearSummonUnit(); + if (Player.SceneInstance != null) await Player.SceneInstance!.ClearSummonUnit(); } public async ValueTask StartCocoonStage(int cocoonId, int wave, int worldLevel) @@ -301,7 +309,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) InvokeOnPlayerEnterBattle(player, battleInstance); await Player.SendPacket(new PacketStartCocoonStageScRsp(battleInstance, cocoonId, wave)); - Player.SceneInstance?.ClearSummonUnit(); + if (Player.SceneInstance != null) await Player.SceneInstance!.ClearSummonUnit(); } public (Retcode, BattleInstance?) StartBattleCollege(int collegeId) diff --git a/GameServer/Game/Battle/Skill/MazeSkill.cs b/GameServer/Game/Battle/Skill/MazeSkill.cs index 0a3d8916..5b875aa9 100644 --- a/GameServer/Game/Battle/Skill/MazeSkill.cs +++ b/GameServer/Game/Battle/Skill/MazeSkill.cs @@ -28,6 +28,7 @@ public class MazeSkill } public List Actions { get; } = []; + public HashSet AdventureModifiers { get; } = []; public bool TriggerBattle { get; private set; } = true; public bool IsMazeSkill { get; } = true; public AvatarConfigExcel? Excel { get; private set; } @@ -44,6 +45,9 @@ public class MazeSkill case TaskTypeEnum.RemoveMazeBuff: Actions.Add(new MazeRemoveMazeBuff(task.ID)); break; + case TaskTypeEnum.AddAdventureModifier: + AdventureModifiers.Add(task.ModifierName); + break; case TaskTypeEnum.AdventureModifyTeamPlayerHP: break; case TaskTypeEnum.AdventureModifyTeamPlayerSP: diff --git a/GameServer/Game/Scene/Entity/EntityMonster.cs b/GameServer/Game/Scene/Entity/EntityMonster.cs index 149135f3..da5af110 100644 --- a/GameServer/Game/Scene/Entity/EntityMonster.cs +++ b/GameServer/Game/Scene/Entity/EntityMonster.cs @@ -42,11 +42,21 @@ public class EntityMonster( { var oldBuff = BuffList.Find(x => x.BuffId == buff.BuffId); if (oldBuff != null) BuffList.Remove(oldBuff); + BuffList.Add(buff); - await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, buff)); + await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff], [])); } - public async ValueTask ApplyBuff(BattleInstance instance) + public async ValueTask RemoveBuff(int buffId) + { + var buff = BuffList.Find(x => x.BuffId == buffId); + if (buff == null) return; + + BuffList.Remove(buff); + await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [], [buff])); + } + + public void ApplyBuff(BattleInstance instance) { if (TempBuff != null) { @@ -62,8 +72,6 @@ public class EntityMonster( instance.Buffs.Add(new MazeBuff(buff)); } - await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, BuffList)); - BuffList.Clear(); } @@ -100,15 +108,6 @@ public class EntityMonster( return proto; } - public async ValueTask RemoveBuff(int buffId) - { - var buff = BuffList.Find(x => x.BuffId == buffId); - if (buff == null) return; - - BuffList.Remove(buff); - await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff])); - } - public int GetStageId() { if (CustomStageID > 0) return CustomStageID; diff --git a/GameServer/Game/Scene/Entity/EntityNpc.cs b/GameServer/Game/Scene/Entity/EntityNpc.cs index 6c19c81b..17058c74 100644 --- a/GameServer/Game/Scene/Entity/EntityNpc.cs +++ b/GameServer/Game/Scene/Entity/EntityNpc.cs @@ -20,10 +20,7 @@ public class EntityNpc(SceneInstance scene, GroupInfo group, NpcInfo npcInfo) : await System.Threading.Tasks.Task.CompletedTask; } - public async ValueTask ApplyBuff(BattleInstance instance) - { - await System.Threading.Tasks.Task.CompletedTask; - } + public void ApplyBuff(BattleInstance instance) { } public virtual SceneEntityInfo ToProto() { diff --git a/GameServer/Game/Scene/Entity/EntityProp.cs b/GameServer/Game/Scene/Entity/EntityProp.cs index fb946ab4..5a51b920 100644 --- a/GameServer/Game/Scene/Entity/EntityProp.cs +++ b/GameServer/Game/Scene/Entity/EntityProp.cs @@ -26,10 +26,7 @@ public class EntityProp(SceneInstance scene, MazePropExcel excel, GroupInfo grou await System.Threading.Tasks.Task.CompletedTask; } - public async ValueTask ApplyBuff(BattleInstance instance) - { - await System.Threading.Tasks.Task.CompletedTask; - } + public void ApplyBuff(BattleInstance instance) { } public virtual SceneEntityInfo ToProto() { diff --git a/GameServer/Game/Scene/Entity/EntitySummonUnit.cs b/GameServer/Game/Scene/Entity/EntitySummonUnit.cs index 8491c9db..b874fe8d 100644 --- a/GameServer/Game/Scene/Entity/EntitySummonUnit.cs +++ b/GameServer/Game/Scene/Entity/EntitySummonUnit.cs @@ -24,10 +24,7 @@ public class EntitySummonUnit : IGameEntity await ValueTask.CompletedTask; } - public async ValueTask ApplyBuff(BattleInstance instance) - { - await ValueTask.CompletedTask; - } + public void ApplyBuff(BattleInstance instance) { } public SceneEntityInfo ToProto() { diff --git a/GameServer/Game/Scene/Entity/IGameEntity.cs b/GameServer/Game/Scene/Entity/IGameEntity.cs index f2b295cf..75afe6dd 100644 --- a/GameServer/Game/Scene/Entity/IGameEntity.cs +++ b/GameServer/Game/Scene/Entity/IGameEntity.cs @@ -9,8 +9,7 @@ public interface IGameEntity public int GroupID { get; set; } public ValueTask AddBuff(SceneBuff buff); - public ValueTask ApplyBuff(BattleInstance instance); - + public void ApplyBuff(BattleInstance instance); public SceneEntityInfo ToProto(); } \ No newline at end of file diff --git a/GameServer/Game/Scene/SceneInstance.cs b/GameServer/Game/Scene/SceneInstance.cs index f097ca2e..073580f1 100644 --- a/GameServer/Game/Scene/SceneInstance.cs +++ b/GameServer/Game/Scene/SceneInstance.cs @@ -502,31 +502,17 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe } else { + // Update old buff's duration oldBuff.CreatedTime = Extensions.GetUnixMs(); oldBuff.Duration = buff.Duration; - await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, oldBuff)); + await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff], [])); return; } } BuffList.Add(buff); - await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, buff)); - } - - public async ValueTask ApplyBuff(BattleInstance instance) - { - if (BuffList.Count == 0) return; - foreach (var buff in BuffList.Where(buff => !buff.IsExpired())) instance.Buffs.Add(new MazeBuff(buff)); - - await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, BuffList)); - - BuffList.Clear(); - } - - public SceneEntityInfo ToProto() - { - return AvatarInfo.ToSceneEntityInfo(AvatarType); + await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff], [])); } public async ValueTask RemoveBuff(int buffId) @@ -535,6 +521,16 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe if (buff == null) return; BuffList.Remove(buff); - await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff])); + await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [], [buff])); } + + public void ApplyBuff(BattleInstance instance) + { + if (BuffList.Count == 0) return; + + foreach (var buff in BuffList.Where(buff => !buff.IsExpired())) instance.Buffs.Add(new MazeBuff(buff)); + BuffList.Clear(); + } + + public SceneEntityInfo ToProto() => AvatarInfo.ToSceneEntityInfo(AvatarType); } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Scene/PacketSyncEntityBuffChangeListScNotify.cs b/GameServer/Server/Packet/Send/Scene/PacketSyncEntityBuffChangeListScNotify.cs index 50785ebf..eaa18434 100644 --- a/GameServer/Server/Packet/Send/Scene/PacketSyncEntityBuffChangeListScNotify.cs +++ b/GameServer/Server/Packet/Send/Scene/PacketSyncEntityBuffChangeListScNotify.cs @@ -7,33 +7,34 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; public class PacketSyncEntityBuffChangeListScNotify : BasePacket { - public PacketSyncEntityBuffChangeListScNotify(IGameEntity entity, SceneBuff buff) : base( + public PacketSyncEntityBuffChangeListScNotify( + IGameEntity entity, List addBuffs, List removeBuffs) : base( CmdIds.SyncEntityBuffChangeListScNotify) { var proto = new SyncEntityBuffChangeListScNotify(); - var change = new EntityBuffChangeInfo + if (addBuffs!= null) { - EntityId = (uint)entity.EntityID, - BuffChangeInfo = buff.ToProto() - }; - proto.EntityBuffChangeList.Add(change); - - SetData(proto); - } - - public PacketSyncEntityBuffChangeListScNotify(IGameEntity entity, List buffs) : base( - CmdIds.SyncEntityBuffChangeListScNotify) - { - var proto = new SyncEntityBuffChangeListScNotify(); - - foreach (var buff in buffs) - { - var change = new EntityBuffChangeInfo + foreach (var buff in addBuffs) { - EntityId = (uint)entity.EntityID, - RemoveBuffId = (uint)buff.BuffId - }; - proto.EntityBuffChangeList.Add(change); + var add = new EntityBuffChangeInfo + { + EntityId = (uint)entity.EntityID, + BuffChangeInfo = buff.ToProto() + }; + proto.EntityBuffChangeList.Add(add); + } + } + if (removeBuffs!= null) + { + foreach (var buff in removeBuffs) + { + var remove = new EntityBuffChangeInfo + { + EntityId = (uint)entity.EntityID, + RemoveBuffId = (uint)buff.BuffId + }; + proto.EntityBuffChangeList.Add(remove); + } } SetData(proto);