Files
DanhengServer-OpenSource/GameServer/Game/Battle/SceneSkillManager.cs
2025-04-20 16:34:13 +08:00

78 lines
3.0 KiB
C#

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<SkillResultData> OnCast(SceneCastSkillCsReq req)
{
// get entities
List<IGameEntity> targetEntities = []; // enemy
IGameEntity? attackEntity; // caster
List<int> 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);
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)
{
return GameData.AdventureAbilityConfigListData.GetValueOrDefault(avatar.AvatarInfo.GetAvatarId());
}
return null;
}
}
public record SkillResultData(Retcode RetCode, BattleInstance? Instance = null, List<HitMonsterInstance>? TriggerBattleInfos = null);