mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
76 lines
3.0 KiB
C#
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); |