diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.dll b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.dll index 85b458a..7d28d6f 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.dll and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0001.dll differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.dll b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.dll index 8bbe9dd..712348f 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.dll and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish.dll differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.dll b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.dll index 16768c2..bcbccb2 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.dll and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0001.dll differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.dll b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.dll index ce9624f..31fff85 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.dll and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor.dll differ diff --git a/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h b/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h index 9994778..bf5e514 100644 --- a/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h +++ b/ProjectFish/Source/ProjectFish/DataAsset/BagConfigAsset.h @@ -41,7 +41,10 @@ struct FPlacedSkillInfo PositionX = InX; PositionY = InY; } - + FIntPoint GetSkillSize() + { + return GetSkillSizeValue(SkillAsset->SkillSize); + } // 检查技能是否占用指定位置 bool OccupiesPosition(int32 X, int32 Y) const { diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index cad24f8..e412b0a 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -59,22 +59,22 @@ enum class ESkillTriggerType: uint8 UENUM(BlueprintType) enum class EPassiveTriggerCondition: uint8 { - ItemTriggered UMETA(DisplayName = "自身或者敌人的物品触发时,激活"), + ItemTriggered UMETA(DisplayName = "指定物品触发时,激活"), DealDamage UMETA(DisplayName = "造成伤害"), SkillDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"), SkillDurabilityRestore UMETA(DisplayName = "物品耐久度回复"), HealthFirstBelowPercent UMETA(DisplayName = "生命值百分比首次低于"), }; -// 被动技能触发目标 -UENUM(BlueprintType) -enum class EPassiveTriggerTarget: uint8 -{ - Self UMETA(DisplayName = "自身"), - Enemy UMETA(DisplayName = "对方"), - SelfSpecificItem UMETA(DisplayName = "我方指定装备"), - EnemySpecificItem UMETA(DisplayName = "对方指定装备"), -}; +// // 被动技能触发目标 +// UENUM(BlueprintType) +// enum class EPassiveTriggerTarget: uint8 +// { +// Self UMETA(DisplayName = "自身"), +// Enemy UMETA(DisplayName = "对方"), +// SelfSpecificItem UMETA(DisplayName = "我方指定装备"), +// EnemySpecificItem UMETA(DisplayName = "对方指定装备"), +// }; // 光环技能触发条件类型 UENUM(BlueprintType) @@ -87,13 +87,13 @@ enum class EAuraTriggerCondition: uint8 EquipmentCountNotLessThan UMETA(DisplayName = "装备物品数量不少于"), }; -// 光环技能触发目标 -UENUM(BlueprintType) -enum class EAuraTriggerTarget: uint8 -{ - Self UMETA(DisplayName = "自身"), - Enemy UMETA(DisplayName = "对方") -}; +// // 光环技能触发目标 +// UENUM(BlueprintType) +// enum class EAuraTriggerTarget: uint8 +// { +// Self UMETA(DisplayName = "自身"), +// Enemy UMETA(DisplayName = "对方") +// }; @@ -124,6 +124,32 @@ static FIntPoint GetSkillSizeValue(ESkillSize SizeType) return FIntPoint(); } +//对象选择器 +USTRUCT(BlueprintType) +struct FTargetSelector +{ + GENERATED_BODY() + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器类型")) + EEffectTargetType SelecterType; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定技能的分类" + , EditConditionHides, EditCondition = "SelecterType == EEffectTargetType::SelfSkillType || SelecterType == EEffectTargetType::TargetSkillType")) + ESkillType SkillType = ESkillType::Type1; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "目标是否全部还是指定数目" + , EditConditionHides, EditCondition = "SelecterType != EEffectTargetType::Target && SelecterType != EEffectTargetType::Self")) + bool bAll = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "目标是否包含自身" + , EditConditionHides, EditCondition = "SelecterType == EEffectTargetType::SelfSkill || SelecterType == EEffectTargetType::SelfSkillType")) + bool bIncludeSelf = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定数目" + , EditConditionHides, EditCondition = "SelecterType != EEffectTargetType::Target && SelecterType != EEffectTargetType::Self && !bAll")) + int32 MaxEffectTargetNum = 1; + +}; + // 被动触发条件配置 USTRUCT(BlueprintType) struct FPassiveTriggerConfig @@ -132,16 +158,16 @@ struct FPassiveTriggerConfig UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发条件类型")) EPassiveTriggerCondition Condition = EPassiveTriggerCondition::ItemTriggered; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标")) - EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self; + FTargetSelector Target ; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides, EditCondition = "Condition == EPassiveTriggerCondition::HealthFirstBelowPercent", ClampMin = 0, ClampMax = 1)) float PercentageValue = 0.5f; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides, - EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem")) - FGuid SpecificSkillID; + // UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides, + // EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem")) + // FGuid SpecificSkillID; }; // 光环技能触发条件配置 USTRUCT(BlueprintType) @@ -154,7 +180,7 @@ struct FAuraTriggerConfig UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标", EditConditionHides, EditCondition = "Condition != EAuraTriggerCondition::None")) - EAuraTriggerTarget Target = EAuraTriggerTarget::Self; + EEffectTargetType Target = EEffectTargetType::Self; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides, EditCondition = "Condition == EAuraTriggerCondition::HealthBelowPercent || Condition == EAuraTriggerCondition::HealthAbovePercent", @@ -181,28 +207,7 @@ struct FSkillContext -//技能选择器 -USTRUCT(BlueprintType) -struct FSkillTargetSelector -{ - GENERATED_BODY() - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器类型")) - EEffectTargetType SelecterType; - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定技能的分类" - , EditConditionHides, EditCondition = "SelecterType == EEffectTargetType::SelfSkillType || SelecterType == EEffectTargetType::TargetSkillType")) - ESkillType SkillType = ESkillType::Type1; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "目标是否全部还是指定数目" - , EditConditionHides, EditCondition = "SelecterType != EEffectTargetType::Target && SelecterType != EEffectTargetType::Self")) - bool bAll = true; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定数目" - , EditConditionHides, EditCondition = "SelecterType != EEffectTargetType::Target && SelecterType != EEffectTargetType::Self && !bAll")) - int32 MaxEffectTargetNum = 1; - - -}; //技能效果 USTRUCT(BlueprintType) @@ -219,7 +224,7 @@ struct FSkillEffectData FString ParamAddition; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器")) - FSkillTargetSelector SkillSelecter; + FTargetSelector SkillSelecter; }; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp index a7b6e68..5c9d935 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp @@ -5,7 +5,7 @@ #include "AsyncTreeDifferences.h" #include "Skill.h" -#include "SkillManager.h" + void USkillEffect::InitSkillEffect(class USkill* skill, FSkillEffectData data) @@ -17,7 +17,7 @@ void USkillEffect::InitSkillEffect(class USkill* skill, FSkillEffectData data) // Add default functionality here for any ISkillEffect functions that are not pure virtual. void USkillEffect::Execute(const FSkillContext& context) { - TArray targets= GetApplyTargets(context); + TArray targets= context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); FString strTargets; for (auto target: targets) { @@ -49,129 +49,129 @@ void USkillEffect::EffectEnded(const FSkillContext& context) { } -TArray USkillEffect::GetApplyTargets(const FSkillContext& context) -{ - TArray result; - switch (effectData.SkillSelecter.SelecterType) - { - case EEffectTargetType::Target: - { - //目标是敌人 - result.Add(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); - break;; - } - case EEffectTargetType::Self: - { - //目标是敌人 - result.Add(OwnerSkill->GetOwner()); - break;; - } - case EEffectTargetType::TargetSkill: - { - TArray Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); - if (effectData.SkillSelecter.bAll) - { - result.Append(Skills); - } - else - { - int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); - for (int i = 0; i < TargetNum; i++) - { - int randomIndex = FMath::RandRange(0, Skills.Num() - 1); - result.Add(Skills[randomIndex]); - Skills.RemoveAt(randomIndex); - } - } - break;; - } - case EEffectTargetType::SelfSkill: - { - TArray Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); - if (effectData.SkillSelecter.bAll) - { - result.Append(Skills); - } - else - { - int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); - for (int i = 0; i < TargetNum; i++) - { - int randomIndex = FMath::RandRange(0, Skills.Num() - 1); - result.Add(Skills[randomIndex]); - Skills.RemoveAt(randomIndex); - } - } - break;; - } - case EEffectTargetType::AroundSkill: - { - TArray aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill); - for (auto skill: aroundSkills) - { - result.Add(skill); - } - break; - } - case EEffectTargetType::SelfSkillType: - { - //筛选指定类型的技能 - TArray Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); - for (int i = Skills.Num() - 1; i >= 0; i--) - { - if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) - { - Skills.RemoveAt(i); - } - } - - if (effectData.SkillSelecter.bAll) - { - result.Append(Skills); - } - else - { - int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); - for (int i = 0; i < TargetNum; i++) - { - int randomIndex = FMath::RandRange(0, Skills.Num() - 1); - result.Add(Skills[randomIndex]); - Skills.RemoveAt(randomIndex); - } - } - break; - } - case EEffectTargetType::TargetSkillType: - { - //筛选指定类型的技能 - TArray Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); - for (int i = Skills.Num() - 1; i >= 0; i--) - { - if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) - { - Skills.RemoveAt(i); - } - } - - if (effectData.SkillSelecter.bAll) - { - result.Append(Skills); - } - else - { - int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); - for (int i = 0; i < TargetNum; i++) - { - int randomIndex = FMath::RandRange(0, Skills.Num() - 1); - result.Add(Skills[randomIndex]); - Skills.RemoveAt(randomIndex); - } - } - break; - } - } - return result; -} +// TArray USkillEffect::GetApplyTargets(const FSkillContext& context) +// { +// TArray result; +// switch (effectData.SkillSelecter.SelecterType) +// { +// case EEffectTargetType::Target: +// { +// //目标是敌人 +// result.Add(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); +// break;; +// } +// case EEffectTargetType::Self: +// { +// //目标是敌人 +// result.Add(OwnerSkill->GetOwner()); +// break;; +// } +// case EEffectTargetType::TargetSkill: +// { +// TArray Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); +// if (effectData.SkillSelecter.bAll) +// { +// result.Append(Skills); +// } +// else +// { +// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); +// for (int i = 0; i < TargetNum; i++) +// { +// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); +// result.Add(Skills[randomIndex]); +// Skills.RemoveAt(randomIndex); +// } +// } +// break;; +// } +// case EEffectTargetType::SelfSkill: +// { +// TArray Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); +// if (effectData.SkillSelecter.bAll) +// { +// result.Append(Skills); +// } +// else +// { +// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); +// for (int i = 0; i < TargetNum; i++) +// { +// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); +// result.Add(Skills[randomIndex]); +// Skills.RemoveAt(randomIndex); +// } +// } +// break;; +// } +// case EEffectTargetType::AroundSkill: +// { +// TArray aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill); +// for (auto skill: aroundSkills) +// { +// result.Add(skill); +// } +// break; +// } +// case EEffectTargetType::SelfSkillType: +// { +// //筛选指定类型的技能 +// TArray Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); +// for (int i = Skills.Num() - 1; i >= 0; i--) +// { +// if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) +// { +// Skills.RemoveAt(i); +// } +// } +// +// if (effectData.SkillSelecter.bAll) +// { +// result.Append(Skills); +// } +// else +// { +// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); +// for (int i = 0; i < TargetNum; i++) +// { +// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); +// result.Add(Skills[randomIndex]); +// Skills.RemoveAt(randomIndex); +// } +// } +// break; +// } +// case EEffectTargetType::TargetSkillType: +// { +// //筛选指定类型的技能 +// TArray Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); +// for (int i = Skills.Num() - 1; i >= 0; i--) +// { +// if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) +// { +// Skills.RemoveAt(i); +// } +// } +// +// if (effectData.SkillSelecter.bAll) +// { +// result.Append(Skills); +// } +// else +// { +// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); +// for (int i = 0; i < TargetNum; i++) +// { +// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); +// result.Add(Skills[randomIndex]); +// Skills.RemoveAt(randomIndex); +// } +// } +// break; +// } +// } +// return result; +// } FString USkillEffect::GetSkillEffectDes() { diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h index 0244598..a4c62ce 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "ProjectFish/Definations.h" #include "UObject/Interface.h" +#include "SkillManager.h" #include "SkillEffect.generated.h" @@ -20,7 +21,7 @@ public: virtual void Execute(const FSkillContext& context) ; virtual void Cancel(const FSkillContext& context) ; virtual void EffectEnded(const FSkillContext& context); - TArray GetApplyTargets(const FSkillContext& context); + //TArray GetApplyTargets(const FSkillContext& context); UFUNCTION(BlueprintPure) virtual FString GetSkillEffectDes(); diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Charge.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Charge.cpp index 25acf79..e56c529 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Charge.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Charge.cpp @@ -7,11 +7,12 @@ #include "Kismet/KismetStringLibrary.h" #include "ProjectFish/PawnWithSkill.h" #include "ProjectFish/Skill/Skill.h" +#include "ProjectFish/Skill/SkillManager.h" void USkillEffect_Charge::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(USkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Damage.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Damage.cpp index 0422763..6ee6290 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Damage.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Damage.cpp @@ -10,7 +10,7 @@ void USkillEffect_Damage::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp index 8a91a47..f118c6b 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp @@ -8,7 +8,7 @@ void USkillEffect_DamageReduce::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) @@ -27,7 +27,7 @@ void USkillEffect_DamageReduce::Execute(const FSkillContext& context) void USkillEffect_DamageReduce::EffectEnded(const FSkillContext& context) { Super::EffectEnded(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceFishRod.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceFishRod.cpp index 14e2ff4..2c4cb8f 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceFishRod.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceFishRod.cpp @@ -9,7 +9,7 @@ void USkillEffect_EnhanceFishRod::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceSkill.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceSkill.cpp index cb626ac..d203ad4 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceSkill.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_EnhanceSkill.cpp @@ -7,7 +7,7 @@ void USkillEffect_EnhanceSkill::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(USkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Heal.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Heal.cpp index 8e6cfad..5b716ff 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Heal.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_Heal.cpp @@ -10,7 +10,7 @@ void USkillEffect_Heal::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifyCD.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifyCD.cpp index 5d6e83a..862d5b1 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifyCD.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifyCD.cpp @@ -10,7 +10,7 @@ void USkillEffect_ModifyCD::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(USkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp index c410a51..b8aeb4b 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp @@ -11,7 +11,7 @@ void USkillEffect_ModifySpeed::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(USkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp index 44bd9e9..d6ee944 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp @@ -11,7 +11,7 @@ void USkillEffect_SER::Execute(const FSkillContext& context) { Super::Execute(context); - TArray targets = GetApplyTargets(context); + TArray targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); for (auto target: targets) { if (!target->GetClass()->IsChildOf(USkill::StaticClass())) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp index 78d51b9..8e6b72c 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp @@ -63,11 +63,11 @@ void USkillManager::AddBagWithSkills(UBagConfigAsset* Bag, APawnWithSkill* Pawn, BagPositions.Add(FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY)); Skills.Add(skill); //设置占用状态 - for (int x = 0; x < Bag->BagShapeAsset->BagWidth; x++) + for (int x = PlacedSkill.PositionX; x < PlacedSkill.PositionX + PlacedSkill.GetSkillSize().X; x++) { - for (int y = 0; y < Bag->BagShapeAsset->BagHeight; y++) + for (int y = PlacedSkill.PositionY; y < PlacedSkill.PositionY + PlacedSkill.GetSkillSize().Y; y++) { - states->Add(FIntPoint(x, y) + FIntPoint(x, y), GetSkillIndex(skill)); + states->Add(FIntPoint(x, y) , GetSkillIndex(skill)); } } } @@ -96,12 +96,13 @@ TArray USkillManager::GetSkillsAround(USkill* TargetSkill) TArray aroundSkills; TMap *BagStates = PawnBagState.Find(TargetSkill->GetOwner()); FIntPoint BagPos = TargetSkill->GetBagPos(); + FIntPoint SkillSize = TargetSkill->GetSkillSize(); FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner()); TObjectPtr data = TargetSkill->GetSkillData(); int beginX = FMath::Max(0, BagPos.X- 1); - int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1); + int endX = FMath::Min(BagSize.X - 1, BagPos.X + SkillSize.X ); int beginY = FMath::Max(0, BagPos.Y - 1); - int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + 1); + int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + SkillSize.Y ); for (int x = beginX; x <= endX; x++) { for (int y = beginY; y <= endY; y++) @@ -189,4 +190,152 @@ TArray USkillManager::GetSkillsByType(ESkillType SkillType) const return Result; } +TArray USkillManager::GetTargetsBySelector( USkill* OwnerSkill, FTargetSelector TargetSelector) +{ + TArray result; + switch (TargetSelector.SelecterType) + { + case EEffectTargetType::Target: + { + //目标是敌人 + result.Add(GetEnemyPawn(OwnerSkill->GetOwner())); + break;; + } + case EEffectTargetType::Self: + { + //目标是敌人 + result.Add(OwnerSkill->GetOwner()); + break;; + } + case EEffectTargetType::TargetSkill: + { + TArray SpecifySkills = GetSkillsByOwner(GetEnemyPawn(OwnerSkill->GetOwner())); + //是否排除自身 + if (!TargetSelector.bIncludeSelf) + { + SpecifySkills.Remove(OwnerSkill); + } + //全部还是指定数量随机 + if (TargetSelector.bAll) + { + result.Append(SpecifySkills); + } + else + { + int TargetNum = FMath::Min(TargetSelector.MaxEffectTargetNum, SpecifySkills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, SpecifySkills.Num() - 1); + result.Add(SpecifySkills[randomIndex]); + SpecifySkills.RemoveAt(randomIndex); + } + } + break;; + } + case EEffectTargetType::SelfSkill: + { + TArray SpecifySkills = GetSkillsByOwner(OwnerSkill->GetOwner()); + //是否排除自身 + if (!TargetSelector.bIncludeSelf) + { + SpecifySkills.Remove(OwnerSkill); + } + //全部还是指定数量随机 + if (TargetSelector.bAll) + { + result.Append(SpecifySkills); + } + else + { + int TargetNum = FMath::Min(TargetSelector.MaxEffectTargetNum, SpecifySkills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, SpecifySkills.Num() - 1); + result.Add(SpecifySkills[randomIndex]); + SpecifySkills.RemoveAt(randomIndex); + } + } + break;; + } + case EEffectTargetType::AroundSkill: + { + TArray aroundSpecifySkills = GetSkillsAround(OwnerSkill); + for (auto skill: aroundSpecifySkills) + { + result.Add(skill); + } + break; + } + case EEffectTargetType::SelfSkillType: + { + //筛选指定类型的技能 + TArray SpecifySkills = GetSkillsByOwner(OwnerSkill->GetOwner()); + + //是否排除自身 + if (!TargetSelector.bIncludeSelf) + { + SpecifySkills.Remove(OwnerSkill); + } + //全部还是指定数量随机 + for (int i = SpecifySkills.Num() - 1; i >= 0; i--) + { + if (!SpecifySkills[i]->GetSkillData()->SkillTypes.Contains(TargetSelector.SkillType)) + { + SpecifySkills.RemoveAt(i); + } + } + + if (TargetSelector.bAll) + { + result.Append(SpecifySkills); + } + else + { + int TargetNum = FMath::Min(TargetSelector.MaxEffectTargetNum, SpecifySkills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, SpecifySkills.Num() - 1); + result.Add(SpecifySkills[randomIndex]); + SpecifySkills.RemoveAt(randomIndex); + } + } + break; + } + case EEffectTargetType::TargetSkillType: + { + //筛选指定类型的技能 + TArray SpecifySkills = GetSkillsByOwner(GetEnemyPawn(OwnerSkill->GetOwner())); + //是否排除自身 + if (!TargetSelector.bIncludeSelf) + { + SpecifySkills.Remove(OwnerSkill); + } + for (int i = SpecifySkills.Num() - 1; i >= 0; i--) + { + if (!SpecifySkills[i]->GetSkillData()->SkillTypes.Contains(TargetSelector.SkillType)) + { + SpecifySkills.RemoveAt(i); + } + } + + if (TargetSelector.bAll) + { + result.Append(SpecifySkills); + } + else + { + int TargetNum = FMath::Min(TargetSelector.MaxEffectTargetNum, SpecifySkills.Num()); + for (int i = 0; i < TargetNum; i++) + { + int randomIndex = FMath::RandRange(0, SpecifySkills.Num() - 1); + result.Add(SpecifySkills[randomIndex]); + SpecifySkills.RemoveAt(randomIndex); + } + } + break; + } + } + return result; +} + diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h index 086528a..598846a 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h @@ -65,6 +65,7 @@ public: UFUNCTION(BlueprintPure) TArray GetSkillsByType(ESkillType SkillType) const; + TArray GetTargetsBySelector( USkill* OwnerSkill, FTargetSelector TargetSelector); protected: UPROPERTY(BlueprintReadWrite) TArray Skills; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp index fba4182..e6866d4 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp @@ -39,38 +39,17 @@ void USkillTrigger::OnSkillExecute(const FString& SkillName) void USkillTrigger::InitPassiveConditionTriggers() { + EEffectTargetType targetType = PassiveTriggerConfig.Target.SelecterType; 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) + if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) { - 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) + TArray PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (auto Object : PawnSkills) { + USkill* Skill = Cast(Object); if (Skill != SkillContext.OwnerSkill) Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute); } @@ -84,10 +63,12 @@ void USkillTrigger::InitPassiveConditionTriggers() case EPassiveTriggerCondition::DealDamage: { - //造成伤害触发 - if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy) + //造成伤害时触发 + if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) { - APawnWithSkill* ReceiveDamagePawn =PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy ? SkillContext.OwnerSkill->GetOwner() : SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()); + //监测哪个角色受到了伤害 + bool enemyMakeDamage = (targetType == EEffectTargetType::TargetSkill || targetType == EEffectTargetType::TargetSkillType); + APawnWithSkill* ReceiveDamagePawn = enemyMakeDamage ? SkillContext.OwnerSkill->GetOwner() : SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()); ReceiveDamagePawn->OnReceiveDamage.AddLambda([this](UObject* Source) { //UE_LOG(LogTemp, Error, TEXT("receive damge source = %s"), *Source->GetName()); @@ -101,7 +82,7 @@ void USkillTrigger::InitPassiveConditionTriggers() DamgePawn = Cast(Source); } - if (Source != SkillContext.OwnerSkill && DamgePawn == SkillContext.OwnerSkill->GetOwner() ) + if (Source != SkillContext.OwnerSkill && DamgePawn != SkillContext.OwnerSkill->GetOwner() ) OnTrigger(); }); } @@ -114,18 +95,19 @@ void USkillTrigger::InitPassiveConditionTriggers() case EPassiveTriggerCondition::SkillDurabilityDecrease: { //物品耐久度减少触发 - if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem) + if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) { - //目标技能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) + // //目标技能iD + // FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; + // //目标pawn + // APawnWithSkill* TargetPawn = targetType == EEffectTargetType::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner(): + // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); + // + // TArray SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID); + TArray PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : PawnSkills) { + USkill* Skill = Cast(Object); Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset) { if (EnduranceOffset < 0) @@ -143,18 +125,19 @@ void USkillTrigger::InitPassiveConditionTriggers() case EPassiveTriggerCondition::SkillDurabilityRestore: { //物品耐久度恢复触发 - if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem) + if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) { - //目标技能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) + // //目标技能iD + // FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; + // //目标pawn + // APawnWithSkill* TargetPawn = targetType == EEffectTargetType::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner(): + // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); + // + // TArray SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID); + TArray PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : PawnSkills) { + USkill* Skill = Cast(Object); Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset) { if (EnduranceOffset > 0) @@ -172,21 +155,26 @@ void USkillTrigger::InitPassiveConditionTriggers() case EPassiveTriggerCondition::HealthFirstBelowPercent: { //目标生命值低于x时触发 - if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy) + if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) { - - //目标pawn - APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): - SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); - //绑定生命值发生变化 - TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source) + // //目标pawn + // APawnWithSkill* TargetPawn = targetType == EEffectTargetType::Self ? SkillContext.OwnerSkill->GetOwner(): + // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); + TArray PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : PawnSkills) { - if (!this->bTriggered && - TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue) + APawnWithSkill* TargetPawn = Cast(Object); + //绑定生命值发生变化 + TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source) { - OnTrigger(); - } - }); + if (!this->bTriggered && + TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue) + { + OnTrigger(); + } + }); + } + } else { @@ -202,6 +190,7 @@ void USkillTrigger::InitPassiveConditionTriggers() void USkillTrigger::InitAuraConditionTriggers() { + EEffectTargetType targetType = PassiveTriggerConfig.Target.SelecterType; switch (AuraTriggerConfig.Condition) { case EAuraTriggerCondition::None: @@ -211,69 +200,115 @@ void USkillTrigger::InitAuraConditionTriggers() } 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) + if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) { - OnTrigger(); - } - //动态检测 - TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source) - { - if (!this->bTriggered && - TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue) + // //目标pawn + // APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): + // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); + TArray Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : Pawn) { - OnTrigger(); + APawnWithSkill* TargetPawn = Cast(Object); + //初始检测 + if (!this->bTriggered && + TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue) + { + OnTrigger(); + } + //动态检测 + TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source) + { + if (!this->bTriggered && + TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue) + { + OnTrigger(); + } + }); } - }); + + } + else + { + UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配")); + } + 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) + if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) { - OnTrigger(); - } - //动态检测 - TargetPawn->OnEnduranceChanged.AddLambda([this, TargetPawn]() - { - if (!this->bTriggered && - TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue) + // //目标pawn + // APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): + // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); + TArray Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : Pawn) { - OnTrigger(); + APawnWithSkill* TargetPawn = Cast(Object); + //初始检测 + if (!this->bTriggered && + TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue) + { + OnTrigger(); + } + //动态检测 + TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source) + { + if (!this->bTriggered && + TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue) + { + OnTrigger(); + } + }); } - }); + + } + else + { + UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配")); + } 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) + if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) { - OnTrigger(); + TArray Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : Pawn) + { + APawnWithSkill* TargetPawn = Cast(Object); + if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() <= this->AuraTriggerConfig.CountValue) + { + OnTrigger(); + } + } + } + else + { + UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配")); + } + break; } 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) + if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) { - OnTrigger(); + TArray Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); + for (UObject* Object : Pawn) + { + APawnWithSkill* TargetPawn = Cast(Object); + if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() >= this->AuraTriggerConfig.CountValue) + { + OnTrigger(); + } + } + + } + else + { + UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配")); } break; }