182 lines
5.4 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "SkillTrigger.h"
#include "Skill.h"
#include "SkillManager.h"
#include "ProjectFish/PawnWithSkill.h"
void USkillTrigger::Init_Implementation(FSkillContext context, const FPassiveTriggerConfig& InPassiveTriggerConfig, const FAuraTriggerConfig& InAuraTriggerConfig)
{
SkillContext = context;
PassiveTriggerConfig = InPassiveTriggerConfig;
AuraTriggerConfig = InAuraTriggerConfig;
InitConditionTriggers();
}
void USkillTrigger::OnTrigger()
{
bTriggered = true;
SkillContext.OwnerSkill->ExecuteSkill();
}
void USkillTrigger::InitConditionTriggers()
{
if (SkillContext.OwnerSkill->GetSkillData()->triggerType == ESkillTriggerType::PassiveSkill)
InitPassiveConditionTriggers();
else
{
InitAuraConditionTriggers();
}
}
void USkillTrigger::InitPassiveConditionTriggers()
{
switch (PassiveTriggerConfig.Condition)
{
case EPassiveTriggerCondition::ItemTriggered:
{
//物品执行时触发
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem)
{
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(SkillContext.OwnerSkill->GetOwner(), TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillExecute.AddLambda([this](FString SkillName)
{
OnTrigger();
});
}
}
else if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()), TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillExecute.AddLambda([this](FString SkillName)
{
OnTrigger();
});
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::DealDamage:
{
//造成伤害触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
{
APawnWithSkill* ReceiveDamagePawn =PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy ? SkillContext.OwnerSkill->GetOwner() : SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner());
ReceiveDamagePawn->OnReceiveDamage.AddLambda([this]()
{
OnTrigger();
});
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::SkillDurabilityDecrease:
{
//物品耐久度减少触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{
//目标技能iD
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{
if (EnduranceOffset < 0)
OnTrigger();
});
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::SkillDurabilityRestore:
{
//物品耐久度恢复触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{
//目标技能iD
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
for (USkill* Skill : SpecificSkills)
{
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{
if (EnduranceOffset > 0)
OnTrigger();
});
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
case EPassiveTriggerCondition::HealthFirstBelowPercent:
{
//目标生命值低于x时触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
{
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//绑定生命值发生变化
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn]()
{
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue)
{
OnTrigger();
}
});
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break;
}
default:
break;
}
}
void USkillTrigger::InitAuraConditionTriggers()
{
}