diff --git a/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs b/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs index f4dc58b5..013ac28a 100644 --- a/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs +++ b/Common/Data/Config/AdventureAbility/AdventureModifierConfig.cs @@ -123,6 +123,11 @@ public class AdventureModifierConfig ?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) .ToList() ?? []; + if (obj.ContainsKey(nameof(OnAfterLocalPlayerUseSkill))) + info.OnAfterLocalPlayerUseSkill = obj[nameof(OnAfterLocalPlayerUseSkill)] + ?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) + .ToList() ?? []; + // TODO: others return info; diff --git a/Common/Data/Config/Character/CharacterConfigInfo.cs b/Common/Data/Config/Character/CharacterConfigInfo.cs new file mode 100644 index 00000000..0ed6bf04 --- /dev/null +++ b/Common/Data/Config/Character/CharacterConfigInfo.cs @@ -0,0 +1,7 @@ +namespace EggLink.DanhengServer.Data.Config.Character; + +public class CharacterConfigInfo +{ + public List SkillList { get; set; } = []; + public List AbilityList { get; set; } = []; +} \ No newline at end of file diff --git a/Common/Data/Config/Character/SkillConfigInfo.cs b/Common/Data/Config/Character/SkillConfigInfo.cs new file mode 100644 index 00000000..52bf009a --- /dev/null +++ b/Common/Data/Config/Character/SkillConfigInfo.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.Enums.Avatar; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace EggLink.DanhengServer.Data.Config.Character; + +public class SkillConfigInfo +{ + public string EntryAbility { get; set; } = ""; + + [JsonConverter(typeof(StringEnumConverter))] + public SkillUseTypeEnum UseType { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public AdventureSkillTypeEnum AdventureSkillType { get; set; } +} \ No newline at end of file diff --git a/Common/Data/Config/Task/AdventureByPlayerCurrentSkillType.cs b/Common/Data/Config/Task/AdventureByPlayerCurrentSkillType.cs new file mode 100644 index 00000000..733ba469 --- /dev/null +++ b/Common/Data/Config/Task/AdventureByPlayerCurrentSkillType.cs @@ -0,0 +1,11 @@ +using EggLink.DanhengServer.Enums.Avatar; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace EggLink.DanhengServer.Data.Config.Task; + +public class AdventureByPlayerCurrentSkillType : PredicateConfigInfo +{ + [JsonConverter(typeof(StringEnumConverter))] + public AdventureSkillTypeEnum SkillType { get; set; } +} \ No newline at end of file diff --git a/Common/Data/Config/Task/ByAnd.cs b/Common/Data/Config/Task/ByAnd.cs new file mode 100644 index 00000000..fe142813 --- /dev/null +++ b/Common/Data/Config/Task/ByAnd.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json.Linq; + +namespace EggLink.DanhengServer.Data.Config.Task; + +public class ByAnd : PredicateConfigInfo +{ + public List PredicateList { get; set; } = []; + public new static PredicateConfigInfo LoadFromJsonObject(JObject obj) + { + var info = new ByAnd + { + Type = obj[nameof(Type)]!.ToObject()! + }; + + foreach (var item in + obj[nameof(PredicateList)]?.Select(x => PredicateConfigInfo.LoadFromJsonObject((x as JObject)!)) ?? []) + info.PredicateList.Add(item); + + return info; + } +} \ No newline at end of file diff --git a/Common/Data/Config/Task/ByCompareCarryMazebuff.cs b/Common/Data/Config/Task/ByCompareCarryMazebuff.cs new file mode 100644 index 00000000..4c9439fe --- /dev/null +++ b/Common/Data/Config/Task/ByCompareCarryMazebuff.cs @@ -0,0 +1,6 @@ +namespace EggLink.DanhengServer.Data.Config.Task; + +public class ByCompareCarryMazebuff : PredicateConfigInfo +{ + public int BuffID { get; set; } +} \ No newline at end of file diff --git a/Common/Data/Config/Task/PredicateConfigInfo.cs b/Common/Data/Config/Task/PredicateConfigInfo.cs index 50340d22..d13b7ca1 100644 --- a/Common/Data/Config/Task/PredicateConfigInfo.cs +++ b/Common/Data/Config/Task/PredicateConfigInfo.cs @@ -15,7 +15,13 @@ public class PredicateConfigInfo : TaskConfigInfo var typeStr = info.Type.Replace("RPG.GameCore.", ""); var className = "EggLink.DanhengServer.Data.Config.Task." + typeStr; - if (typeStr == "ByIsContainAdventureModifier") return ByIsContainAdventureModifier.LoadFromJsonObject(obj); + switch (typeStr) + { + case "ByIsContainAdventureModifier": + return ByIsContainAdventureModifier.LoadFromJsonObject(obj); + case "ByAnd": + return ByAnd.LoadFromJsonObject(obj); + } var typeClass = System.Type.GetType(className); if (typeClass != null) diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 5156cf68..734ad83e 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using EggLink.DanhengServer.Data.Config; using EggLink.DanhengServer.Data.Config.AdventureAbility; +using EggLink.DanhengServer.Data.Config.Character; using EggLink.DanhengServer.Data.Config.Scene; using EggLink.DanhengServer.Data.Custom; using EggLink.DanhengServer.Data.Excel; @@ -57,6 +58,7 @@ public static class GameData public static Dictionary AdventurePlayerData { get; private set; } = []; public static Dictionary SummonUnitDataData { get; private set; } = []; public static Dictionary DecideAvatarOrderData { get; private set; } = []; + public static Dictionary CharacterConfigInfoData { get; private set; } = []; #endregion diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs index 2ba101eb..12bc23a1 100644 --- a/Common/Data/ResourceManager.cs +++ b/Common/Data/ResourceManager.cs @@ -1,6 +1,7 @@ using System.Reflection; using EggLink.DanhengServer.Data.Config; using EggLink.DanhengServer.Data.Config.AdventureAbility; +using EggLink.DanhengServer.Data.Config.Character; using EggLink.DanhengServer.Data.Config.Rogue; using EggLink.DanhengServer.Data.Config.Scene; using EggLink.DanhengServer.Data.Config.SummonUnit; @@ -37,6 +38,7 @@ public class ResourceManager var t6 = Task.Run(LoadDialogueInfo); var t7 = Task.Run(LoadRogueChestMapInfo); var t8 = Task.Run(LoadAdventureModifier); + var t9 = Task.Run(LoadLocalPlayer); GameData.ActivityConfig = LoadCustomFile("Activity", "ActivityConfig") ?? new ActivityConfig(); GameData.BannersConfig = LoadCustomFile("Banner", "Banners") ?? new BannersConfig(); GameData.VideoKeysConfig = @@ -52,7 +54,7 @@ public class ResourceManager LoadChessRogueDiceSurfaceEffectData(); LoadRogueMagicRoomData(); - Task.WaitAll(t1, t2, t3, t4, t5, t6, t7, t8); + Task.WaitAll(t1, t2, t3, t4, t5, t6, t7, t8, t9); // copy modifiers foreach (var value in GameData.AdventureAbilityConfigListData.Values) @@ -408,7 +410,6 @@ public class ResourceManager var count = 0; var res = Parallel.ForEach(GameData.AdventurePlayerData.Values, adventure => { - var avatar = GameData.AvatarConfigData[adventure.AvatarID]; var adventurePath = adventure.PlayerJsonPath.Replace("_Config.json", "_Ability.json") .Replace("ConfigCharacter", "ConfigAdventureAbility"); var path = ConfigManager.Config.Path.ResourcePath + "/" + adventurePath; @@ -792,6 +793,50 @@ public class ResourceManager I18NManager.Translate("Word.AdventureModifierInfo"))); } + public static void LoadLocalPlayer() + { + Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem", + I18NManager.Translate("Word.LocalPlayerCharacter"))); + var count = 0; + var res = Parallel.ForEach(GameData.AdventurePlayerData.Values, excel => + { + var path = ConfigManager.Config.Path.ResourcePath + "/" + excel.PlayerJsonPath; + var file = new FileInfo(path); + if (!file.Exists) return; + try + { + using var reader = file.OpenRead(); + using StreamReader reader2 = new(reader); + var text = reader2.ReadToEnd().Replace("$type", "Type"); + + var info = JsonConvert.DeserializeObject(text); + if (info == null) return; + + GameData.CharacterConfigInfoData.Add(excel.ID, info); + count++; + } + catch (Exception ex) + { + ResourceCache.IsComplete = false; + Logger.Error( + I18NManager.Translate("Server.ServerInfo.FailedToReadItem", excel.PlayerJsonPath, + I18NManager.Translate("Word.Error")), ex); + } + }); + + // wait it done + while (!res.IsCompleted) Thread.Sleep(10); + + if (count < GameData.SummonUnitDataData.Count) + Logger.Warn(I18NManager.Translate("Server.ServerInfo.ConfigMissing", + I18NManager.Translate("Word.LocalPlayerCharacterInfo"), + $"{ConfigManager.Config.Path.ResourcePath}/Config/ConfigCharacter", + I18NManager.Translate("Word.LocalPlayerCharacter"))); + + Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadedItems", count.ToString(), + I18NManager.Translate("Word.LocalPlayerCharacterInfo"))); + } + public static void LoadChessRogueRoomData() { Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem", diff --git a/Common/Enums/Avatar/AdventureSkillTypeEnum.cs b/Common/Enums/Avatar/AdventureSkillTypeEnum.cs new file mode 100644 index 00000000..e43af1ba --- /dev/null +++ b/Common/Enums/Avatar/AdventureSkillTypeEnum.cs @@ -0,0 +1,9 @@ +namespace EggLink.DanhengServer.Enums.Avatar; + +public enum AdventureSkillTypeEnum +{ + NormalAtk = 0, + MazeSkill = 1, + CustomSkill = 2, + Unknown = 3 +} \ No newline at end of file diff --git a/Common/Enums/Avatar/SkillUseTypeEnum.cs b/Common/Enums/Avatar/SkillUseTypeEnum.cs new file mode 100644 index 00000000..4dc19541 --- /dev/null +++ b/Common/Enums/Avatar/SkillUseTypeEnum.cs @@ -0,0 +1,10 @@ +namespace EggLink.DanhengServer.Enums.Avatar; + +public enum SkillUseTypeEnum +{ + Unknow = 0, + UIButtonClick = 1, + SelectEntity = 2, + Passive = 3, + UIButtonPress = 4 +} \ No newline at end of file diff --git a/Common/Util/ConfigManager.cs b/Common/Util/ConfigManager.cs index 62c7accf..f4976205 100644 --- a/Common/Util/ConfigManager.cs +++ b/Common/Util/ConfigManager.cs @@ -8,7 +8,7 @@ public static class ConfigManager { public static readonly Logger Logger = new("ConfigManager"); private static readonly string ConfigFilePath = "Config.json"; - private static readonly string HotfixFilePath = Config.Path.ConfigPath + "/Hotfix.json"; + private static string HotfixFilePath => Config.Path.ConfigPath + "/Hotfix.json"; public static ConfigContainer Config { get; private set; } = new(); public static HotfixContainer Hotfix { get; private set; } = new(); diff --git a/GameServer/Game/Battle/MazeBuff.cs b/GameServer/Game/Battle/MazeBuff.cs index 1c516220..78e8d974 100644 --- a/GameServer/Game/Battle/MazeBuff.cs +++ b/GameServer/Game/Battle/MazeBuff.cs @@ -9,6 +9,10 @@ public class MazeBuff(int buffID, int buffLevel, int owner) { Duration = buff.Duration; OwnerAvatarId = buff.OwnerAvatarId; + foreach (var buffDynamicValue in buff.DynamicValues) + { + DynamicValues.Add(buffDynamicValue.Key, buffDynamicValue.Value); + } } public int BuffID { get; } = buffID; diff --git a/GameServer/Game/Battle/SceneSkillManager.cs b/GameServer/Game/Battle/SceneSkillManager.cs index 4ef99523..67c52055 100644 --- a/GameServer/Game/Battle/SceneSkillManager.cs +++ b/GameServer/Game/Battle/SceneSkillManager.cs @@ -54,6 +54,12 @@ public class SceneSkillManager(PlayerInstance player) : BasePlayerManager(player var res = await Player.TaskManager!.AbilityLevelTask.TriggerTasks(abilities, targetAbility.OnStart, attackEntity, targetEntities, req); + // check if avatar execute + if (attackEntity is AvatarSceneInfo) + { + await Player.SceneInstance!.OnUseSkill(req); + } + return new SkillResultData(Retcode.RetSucc, res.Instance, res.BattleInfos); } diff --git a/GameServer/Game/Scene/Entity/EntityNpc.cs b/GameServer/Game/Scene/Entity/EntityNpc.cs index 6c19c81b..c8794059 100644 --- a/GameServer/Game/Scene/Entity/EntityNpc.cs +++ b/GameServer/Game/Scene/Entity/EntityNpc.cs @@ -14,6 +14,7 @@ public class EntityNpc(SceneInstance scene, GroupInfo group, NpcInfo npcInfo) : public int InstId { get; set; } = npcInfo.ID; public int EntityID { get; set; } public int GroupID { get; set; } = group.Id; + public List BuffList { get; set; } = []; public async ValueTask AddBuff(SceneBuff buff) { diff --git a/GameServer/Game/Scene/Entity/EntityProp.cs b/GameServer/Game/Scene/Entity/EntityProp.cs index ce97a57a..9cde4014 100644 --- a/GameServer/Game/Scene/Entity/EntityProp.cs +++ b/GameServer/Game/Scene/Entity/EntityProp.cs @@ -21,6 +21,7 @@ public class EntityProp(SceneInstance scene, MazePropExcel excel, GroupInfo grou public GroupInfo Group { get; set; } = group; public ScenePropTimelineData? PropTimelineData { get; set; } public int EntityID { get; set; } + public List BuffList { get; set; } = []; public int GroupID { get; set; } = group.Id; public async ValueTask AddBuff(SceneBuff buff) diff --git a/GameServer/Game/Scene/Entity/EntitySummonUnit.cs b/GameServer/Game/Scene/Entity/EntitySummonUnit.cs index 8491c9db..fa1ab60e 100644 --- a/GameServer/Game/Scene/Entity/EntitySummonUnit.cs +++ b/GameServer/Game/Scene/Entity/EntitySummonUnit.cs @@ -18,6 +18,7 @@ public class EntitySummonUnit : IGameEntity public List TriggerList { get; set; } = []; public int EntityID { get; set; } public int GroupID { get; set; } = 0; + public List BuffList { get; set; } = []; public async ValueTask AddBuff(SceneBuff buff) { diff --git a/GameServer/Game/Scene/Entity/IGameEntity.cs b/GameServer/Game/Scene/Entity/IGameEntity.cs index f2b295cf..da0ef5ac 100644 --- a/GameServer/Game/Scene/Entity/IGameEntity.cs +++ b/GameServer/Game/Scene/Entity/IGameEntity.cs @@ -8,6 +8,7 @@ public interface IGameEntity public int EntityID { get; set; } public int GroupID { get; set; } + public List BuffList { get; set; } public ValueTask AddBuff(SceneBuff buff); public ValueTask ApplyBuff(BattleInstance instance); diff --git a/GameServer/Game/Scene/SceneInstance.cs b/GameServer/Game/Scene/SceneInstance.cs index 9771f138..746a73cd 100644 --- a/GameServer/Game/Scene/SceneInstance.cs +++ b/GameServer/Game/Scene/SceneInstance.cs @@ -2,6 +2,7 @@ using EggLink.DanhengServer.Data.Config.Scene; using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Database.Avatar; +using EggLink.DanhengServer.Enums.Avatar; using EggLink.DanhengServer.Enums.Scene; using EggLink.DanhengServer.GameServer.Game.Activity.Loaders; using EggLink.DanhengServer.GameServer.Game.Battle; @@ -302,6 +303,26 @@ public class SceneInstance EntityLoader?.SyncEntity(); } + public async ValueTask OnUseSkill(SceneCastSkillCsReq req) + { + foreach (var entity in Entities.Values.OfType()) + { + if (!GameData.AvatarConfigData.TryGetValue(entity.AvatarInfo.GetAvatarId(), out var excel)) continue; + GameData.AdventureAbilityConfigListData.TryGetValue(excel.AdventurePlayerID, out var avatarAbility); + if (avatarAbility == null) continue; + foreach (var modifier in entity.Modifiers.ToArray()) + { + // get modifier info + if (!GameData.AdventureModifierData.TryGetValue(modifier, out var config)) continue; + if (config.OnAfterLocalPlayerUseSkill.Count > 0) + { + await Player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility, + config.OnAfterLocalPlayerUseSkill, entity, [], req); + } + } + } + } + #endregion #region Entity Management @@ -475,13 +496,37 @@ public class SceneInstance #endregion } -public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, PlayerInstance player) - : IGameEntity, IGameModifier +public class AvatarSceneInfo : IGameEntity, IGameModifier { - public AvatarInfo AvatarInfo = avatarInfo; - public AvatarType AvatarType = avatarType; + public AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, PlayerInstance player) + { + AvatarInfo = avatarInfo; + AvatarType = avatarType; + Player = player; - public List BuffList = []; + // initialize enter ability + if (!GameData.AvatarConfigData.TryGetValue(avatarInfo.GetAvatarId(), out var excel)) return; + var configInfo = GameData.CharacterConfigInfoData.GetValueOrDefault(excel.AdventurePlayerID); + GameData.AdventureAbilityConfigListData.TryGetValue(excel.AdventurePlayerID, out var avatarAbility); + if (configInfo == null || avatarAbility == null) return; + + foreach (var info in configInfo.SkillList.Where(x => x.UseType == SkillUseTypeEnum.Passive)) + { + // cast ability + var abilityStr = info.EntryAbility; + // get ability + var ability = avatarAbility.AbilityList.FirstOrDefault(x => x.Name == abilityStr); + if (ability == null) continue; + _ = Player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility, ability.OnStart, this, [], + new SceneCastSkillCsReq()); + } + } + + public AvatarInfo AvatarInfo; + public AvatarType AvatarType; + public PlayerInstance Player; + + public List BuffList { get; set; } = []; public int EntityID { @@ -508,14 +553,14 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe oldBuff.CreatedTime = Extensions.GetUnixMs(); oldBuff.Duration = buff.Duration; - await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, oldBuff)); + await Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, oldBuff)); await AddModifier(buffExcel.ModifierName); return; } } BuffList.Add(buff); - await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, buff)); + await Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, buff)); await AddModifier(buffExcel.ModifierName); } @@ -524,7 +569,7 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe 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)); + await Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, BuffList)); foreach (var sceneBuff in BuffList) { @@ -552,13 +597,13 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe GameData.AdventureAbilityConfigListData.TryGetValue(AvatarInfo.GetAvatarId(), out var avatarAbility); if (modifier == null || avatarAbility == null) return; - await player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility, modifier.OnCreate, this, [], + await Player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility, modifier.OnCreate, this, [], new SceneCastSkillCsReq { TargetMotion = new MotionInfo { - Pos = player.Data.Pos?.ToProto() ?? new Vector(), - Rot = player.Data.Rot?.ToProto() ?? new Vector() + Pos = Player.Data.Pos?.ToProto() ?? new Vector(), + Rot = Player.Data.Rot?.ToProto() ?? new Vector() } }); @@ -573,7 +618,7 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe GameData.AdventureAbilityConfigListData.TryGetValue(AvatarInfo.GetAvatarId(), out var avatarAbility); if (modifier == null || avatarAbility == null) return; - await player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility, modifier.OnDestroy, this, [], + await Player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility, modifier.OnDestroy, this, [], new SceneCastSkillCsReq()); Modifiers.Remove(modifierName); @@ -588,7 +633,7 @@ 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])); await RemoveModifier(buffExcel.ModifierName); } diff --git a/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs b/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs index 425f8349..01c16ec8 100644 --- a/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs +++ b/GameServer/Game/Task/AvatarTask/AbilityLevelTask.cs @@ -76,9 +76,9 @@ public class AbilityLevelTask(PlayerInstance player) if (res is ValueTask valueTask) return await valueTask; } } - catch + catch (Exception e) { - // ignored + Logger.GetByClassName().Error("An error occured, ", e); } return new AbilityLevelResult(); @@ -101,7 +101,13 @@ public class AbilityLevelTask(PlayerInstance player) if (method != null) { var resp = method.Invoke(this, [param with { Act = predicateTaskList.Predicate }]); - if (resp is true) + if (resp is not bool res) + { + return new AbilityLevelResult(instance, battleInfos); + } + + res = predicateTaskList.Predicate.Inverse ? !res : res; + if (res) foreach (var task in predicateTaskList.SuccessTaskList) { var result = await TriggerTask(param with { Act = task }); @@ -194,11 +200,22 @@ public class AbilityLevelTask(PlayerInstance player) { var resp = method.Invoke(this, [addMazeBuff.TargetType, param.CasterEntity, param.TargetEntities]); - if (resp is List target) - foreach (var entity in target) - await entity.AddBuff(new SceneBuff(addMazeBuff.ID, 1, - (param.CasterEntity as AvatarSceneInfo)?.AvatarInfo.GetAvatarId() ?? 0, - addMazeBuff.LifeTime.FixedValue.Value < -1 ? 20 : -1)); + + Dictionary dynamic = []; + foreach (var dynamicValue in addMazeBuff.DynamicValues) + { + dynamic.Add(dynamicValue.Key, dynamicValue.Value.GetValue()); + } + + if (resp is not List target) return new AbilityLevelResult(instance, battleInfos); + + foreach (var entity in target) + await entity.AddBuff(new SceneBuff(addMazeBuff.ID, 1, + (param.CasterEntity as AvatarSceneInfo)?.AvatarInfo.GetBaseAvatarId() ?? 0, + addMazeBuff.LifeTime.FixedValue.Value < -1 ? 20 : -1) + { + DynamicValues = dynamic + }); } } @@ -400,6 +417,49 @@ public class AbilityLevelTask(PlayerInstance player) return true; } + public bool AdventureByPlayerCurrentSkillType(AbilityLevelParam param) + { + if (param.Act is AdventureByPlayerCurrentSkillType byPlayerCurrentSkillType) + { + return param.Request.SkillIndex == (uint)byPlayerCurrentSkillType.SkillType; + } + + return false; + } + + public bool ByCompareCarryMazebuff(AbilityLevelParam param) + { + if (param.Act is ByCompareCarryMazebuff byCompareCarryMazebuff) + { + return param.CasterEntity.BuffList.Any(x => x.BuffId == byCompareCarryMazebuff.BuffID); + } + + return false; + } + + public bool ByAnd(AbilityLevelParam param) + { + if (param.Act is ByAnd byAnd) + { + foreach (var task in byAnd.PredicateList) + { + var methodName = task.Type.Replace("RPG.GameCore.", ""); + var method = GetType().GetMethod(methodName); + if (method != null) + { + var resp = method.Invoke(this, [param with { Act = task }]); + if (resp is not bool res) return false; + res = task.Inverse ? !res : res; + if (!res) return false; + } + } + + return true; + } + + return false; + } + #endregion }