server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/Event/Battle/BattleExecuteSkillEventHandler.cs
2026-02-10 18:21:30 +01:00

74 lines
No EOL
2.7 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.DTOs.Skills;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Helpers.Damages;
namespace WingsEmu.Plugins.BasicImplementations.Event.Battle;
public class BattleExecuteSkillEventHandler : IAsyncEventProcessor<BattleExecuteSkillEvent>
{
private readonly ISkillExecutor _skillExecutor;
public BattleExecuteSkillEventHandler(ISkillExecutor skillExecutor) => _skillExecutor = skillExecutor;
public async Task HandleAsync(BattleExecuteSkillEvent e, CancellationToken cancellation)
{
IBattleEntity caster = e.Entity;
IBattleEntity target = e.Target;
SkillInfo skillInfo = e.SkillInfo;
DateTime endSkillCastTime = e.EndSkillCastTime;
Position position = e.Position;
caster.SetCastingSkill(skillInfo, endSkillCastTime);
skillInfo.Cooldown = (short)caster.ApplyCooldownReduction(skillInfo);
if (skillInfo.TargetType == TargetType.NonTarget)
{
switch (skillInfo.TargetAffectedEntities)
{
case TargetAffectedEntities.Enemies:
_skillExecutor.ExecuteDamageZoneHitSkill(caster, caster.SkillCast, position);
break;
case TargetAffectedEntities.DebuffForEnemies:
_skillExecutor.ExecuteDebuffZoneHitSkill(caster, caster.SkillCast, position);
break;
case TargetAffectedEntities.BuffForAllies:
_skillExecutor.ExecuteBuffZoneHitSkill(caster, caster.SkillCast, position);
break;
}
return;
}
switch (skillInfo.TargetAffectedEntities)
{
case TargetAffectedEntities.Enemies:
_skillExecutor.ExecuteDamageSkill(caster, target, caster.SkillCast, position);
break;
case TargetAffectedEntities.BuffForAllies:
_skillExecutor.ExecuteBuffSkill(caster, target, caster.SkillCast);
break;
case TargetAffectedEntities.DebuffForEnemies:
_skillExecutor.ExecuteDebuffSkill(caster, target, caster.SkillCast);
break;
case TargetAffectedEntities.None:
if (caster is not IPlayerEntity character)
{
caster.CancelCastingSkill();
return;
}
character.Session.SendSpecialistGuri(skillInfo.CastId);
character.CancelCastingSkill();
break;
default:
return;
}
}
}