using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Config; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Game.Scene; using EggLink.DanhengServer.GameServer.Game.Scene.Entity; using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.Battle; public class SceneSkillManager(PlayerInstance player) : BasePlayerManager(player) { public async ValueTask OnCast(SceneCastSkillCsReq req) { // get entities List targetEntities = []; // enemy IGameEntity? attackEntity; // caster List addEntityIds = []; foreach (var id in req.AssistMonsterEntityIdList) if (Player.SceneInstance!.Entities.TryGetValue((int)id, out var v)) { targetEntities.Add(v); addEntityIds.Add((int)id); } foreach (var info in req.AssistMonsterEntityInfo) foreach (var id in info.EntityIdList) { if (addEntityIds.Contains((int)id)) continue; if (Player.SceneInstance!.Entities.TryGetValue((int)id, out var v)) { targetEntities.Add(v); addEntityIds.Add((int)id); } } attackEntity = Player.SceneInstance!.Entities.GetValueOrDefault((int)req.AttackedByEntityId); if (attackEntity == null) return new SkillResultData(Retcode.RetSceneEntityNotExist); // get ability file var abilities = GetAbilityConfig(attackEntity); if (abilities == null || abilities.AbilityList.Count < 1) return new SkillResultData(Retcode.RetMazeNoAbility); var abilityName = !string.IsNullOrEmpty(req.MazeAbilityStr) ? req.MazeAbilityStr : req.SkillIndex == 0 ? "NormalAtk01" : "MazeSkill"; var targetAbility = abilities.AbilityList.Find(x => x.Name.Contains(abilityName)); if (targetAbility == null) { targetAbility = abilities.AbilityList.FirstOrDefault(); if (targetAbility == null) return new SkillResultData(Retcode.RetMazeNoAbility); } // execute ability 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); } private AdventureAbilityConfigListInfo? GetAbilityConfig(IGameEntity entity) { if (entity is EntityMonster monster) return GameData.AdventureAbilityConfigListData.GetValueOrDefault(monster.MonsterData.ID); if (entity is AvatarSceneInfo avatar) if (GameData.AvatarConfigData.TryGetValue(avatar.AvatarInfo.AvatarId, out var excel)) return GameData.AdventureAbilityConfigListData.GetValueOrDefault(excel.AdventurePlayerID); return null; } } public record SkillResultData( Retcode RetCode, BattleInstance? Instance = null, List? TriggerBattleInfos = null);