182 lines
5.4 KiB
C++
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()
|
|
{
|
|
}
|
|
|