Files
DanhengServer-OpenSource/GameServer/Game/Battle/SceneSkillManager.cs
2025-04-21 22:11:14 +08:00

76 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)
if (GameData.AvatarConfigData.TryGetValue(avatar.AvatarInfo.GetAvatarId(), out var excel))
return GameData.AdventureAbilityConfigListData.GetValueOrDefault(excel.AdventurePlayerID);
return null;
}
}
public record SkillResultData(
Retcode RetCode,
BattleInstance? Instance = null,
List<HitMonsterInstance>? TriggerBattleInfos = null);