// 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::OnSkillExecute(const FString& SkillName) { OnTrigger(); } void USkillTrigger::InitPassiveConditionTriggers() { switch (PassiveTriggerConfig.Condition) { case EPassiveTriggerCondition::ItemTriggered: { //物品执行时触发 //FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; // if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem) // { // //自身 // TArray SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(SkillContext.OwnerSkill->GetOwner(), TriggerSkillID); // for (USkill* Skill : SpecificSkills) // { // Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute); // // } // } // else if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem) // { // //敌人 // TArray SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()), TriggerSkillID); // for (USkill* Skill : SpecificSkills) // { // Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute); // } // } if (PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Enemy) { APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()); TArray PawnSkills = SkillContext.SkillManager->GetSkillsByOwner(TargetPawn); for (USkill* Skill : PawnSkills) { if (Skill != SkillContext.OwnerSkill) Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute); } } 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 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 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() { switch (AuraTriggerConfig.Condition) { case EAuraTriggerCondition::None: { OnTrigger(); break; } case EAuraTriggerCondition::HealthBelowPercent: { //目标pawn APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); //初始检测 if (!this->bTriggered && TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue) { OnTrigger(); } //动态检测 TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn]() { if (!this->bTriggered && TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue) { OnTrigger(); } }); break; } case EAuraTriggerCondition::HealthAbovePercent: { //目标pawn APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); //初始检测 if (!this->bTriggered && TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue) { OnTrigger(); } //动态检测 TargetPawn->OnEnduranceChanged.AddLambda([this, TargetPawn]() { if (!this->bTriggered && TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue) { OnTrigger(); } }); break; } case EAuraTriggerCondition::EquipmentCountNotMoreThan: { //目标pawn APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() <= this->AuraTriggerConfig.CountValue) { OnTrigger(); } } case EAuraTriggerCondition::EquipmentCountNotLessThan: { //目标pawn APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() >= this->AuraTriggerConfig.CountValue) { OnTrigger(); } } default: break; } }