Compare commits

..

No commits in common. "7f84d384b94577f91fae2a7c2d1e2d440c415c78" and "9c786adc4dc7523600ad3a1f269a0bedf90f1314" have entirely different histories.

21 changed files with 291 additions and 486 deletions

View File

@ -41,10 +41,7 @@ struct FPlacedSkillInfo
PositionX = InX; PositionX = InX;
PositionY = InY; PositionY = InY;
} }
FIntPoint GetSkillSize()
{
return GetSkillSizeValue(SkillAsset->SkillSize);
}
// 检查技能是否占用指定位置 // 检查技能是否占用指定位置
bool OccupiesPosition(int32 X, int32 Y) const bool OccupiesPosition(int32 X, int32 Y) const
{ {

View File

@ -59,22 +59,22 @@ enum class ESkillTriggerType: uint8
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EPassiveTriggerCondition: uint8 enum class EPassiveTriggerCondition: uint8
{ {
ItemTriggered UMETA(DisplayName = "指定物品触发时,激活"), ItemTriggered UMETA(DisplayName = "自身或者敌人的物品触发时,激活"),
DealDamage UMETA(DisplayName = "造成伤害"), DealDamage UMETA(DisplayName = "造成伤害"),
SkillDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"), SkillDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"),
SkillDurabilityRestore UMETA(DisplayName = "物品耐久度回复"), SkillDurabilityRestore UMETA(DisplayName = "物品耐久度回复"),
HealthFirstBelowPercent UMETA(DisplayName = "生命值百分比首次低于"), HealthFirstBelowPercent UMETA(DisplayName = "生命值百分比首次低于"),
}; };
// // 被动技能触发目标 // 被动技能触发目标
// UENUM(BlueprintType) UENUM(BlueprintType)
// enum class EPassiveTriggerTarget: uint8 enum class EPassiveTriggerTarget: uint8
// { {
// Self UMETA(DisplayName = "自身"), Self UMETA(DisplayName = "自身"),
// Enemy UMETA(DisplayName = "对方"), Enemy UMETA(DisplayName = "对方"),
// SelfSpecificItem UMETA(DisplayName = "我方指定装备"), SelfSpecificItem UMETA(DisplayName = "我方指定装备"),
// EnemySpecificItem UMETA(DisplayName = "对方指定装备"), EnemySpecificItem UMETA(DisplayName = "对方指定装备"),
// }; };
// 光环技能触发条件类型 // 光环技能触发条件类型
UENUM(BlueprintType) UENUM(BlueprintType)
@ -87,13 +87,13 @@ enum class EAuraTriggerCondition: uint8
EquipmentCountNotLessThan UMETA(DisplayName = "装备物品数量不少于"), EquipmentCountNotLessThan UMETA(DisplayName = "装备物品数量不少于"),
}; };
// // 光环技能触发目标 // 光环技能触发目标
// UENUM(BlueprintType) UENUM(BlueprintType)
// enum class EAuraTriggerTarget: uint8 enum class EAuraTriggerTarget: uint8
// { {
// Self UMETA(DisplayName = "自身"), Self UMETA(DisplayName = "自身"),
// Enemy UMETA(DisplayName = "对方") Enemy UMETA(DisplayName = "对方")
// }; };
@ -124,32 +124,6 @@ static FIntPoint GetSkillSizeValue(ESkillSize SizeType)
return FIntPoint(); 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) USTRUCT(BlueprintType)
struct FPassiveTriggerConfig struct FPassiveTriggerConfig
@ -158,16 +132,16 @@ struct FPassiveTriggerConfig
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发条件类型")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发条件类型"))
EPassiveTriggerCondition Condition = EPassiveTriggerCondition::ItemTriggered; EPassiveTriggerCondition Condition = EPassiveTriggerCondition::ItemTriggered;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
FTargetSelector Target ; EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides, UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides,
EditCondition = "Condition == EPassiveTriggerCondition::HealthFirstBelowPercent", EditCondition = "Condition == EPassiveTriggerCondition::HealthFirstBelowPercent",
ClampMin = 0, ClampMax = 1)) ClampMin = 0, ClampMax = 1))
float PercentageValue = 0.5f; float PercentageValue = 0.5f;
// UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides, UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides,
// EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem")) EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem"))
// FGuid SpecificSkillID; FGuid SpecificSkillID;
}; };
// 光环技能触发条件配置 // 光环技能触发条件配置
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
@ -180,7 +154,7 @@ struct FAuraTriggerConfig
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标", EditConditionHides, UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标", EditConditionHides,
EditCondition = "Condition != EAuraTriggerCondition::None")) EditCondition = "Condition != EAuraTriggerCondition::None"))
EEffectTargetType Target = EEffectTargetType::Self; EAuraTriggerTarget Target = EAuraTriggerTarget::Self;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides, UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides,
EditCondition = "Condition == EAuraTriggerCondition::HealthBelowPercent || Condition == EAuraTriggerCondition::HealthAbovePercent", EditCondition = "Condition == EAuraTriggerCondition::HealthBelowPercent || Condition == EAuraTriggerCondition::HealthAbovePercent",
@ -207,7 +181,28 @@ 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) USTRUCT(BlueprintType)
@ -224,7 +219,7 @@ struct FSkillEffectData
FString ParamAddition; FString ParamAddition;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器"))
FTargetSelector SkillSelecter; FSkillTargetSelector SkillSelecter;
}; };

View File

@ -5,7 +5,7 @@
#include "AsyncTreeDifferences.h" #include "AsyncTreeDifferences.h"
#include "Skill.h" #include "Skill.h"
#include "SkillManager.h"
void USkillEffect::InitSkillEffect(class USkill* skill, FSkillEffectData data) 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. // Add default functionality here for any ISkillEffect functions that are not pure virtual.
void USkillEffect::Execute(const FSkillContext& context) void USkillEffect::Execute(const FSkillContext& context)
{ {
TArray<UObject*> targets= context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets= GetApplyTargets(context);
FString strTargets; FString strTargets;
for (auto target: targets) for (auto target: targets)
{ {
@ -49,129 +49,129 @@ void USkillEffect::EffectEnded(const FSkillContext& context)
{ {
} }
// TArray<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context) TArray<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context)
// { {
// TArray<UObject*> result; TArray<UObject*> result;
// switch (effectData.SkillSelecter.SelecterType) switch (effectData.SkillSelecter.SelecterType)
// { {
// case EEffectTargetType::Target: case EEffectTargetType::Target:
// { {
// //目标是敌人 //目标是敌人
// result.Add(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); result.Add(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner()));
// break;; break;;
// } }
// case EEffectTargetType::Self: case EEffectTargetType::Self:
// { {
// //目标是敌人 //目标是敌人
// result.Add(OwnerSkill->GetOwner()); result.Add(OwnerSkill->GetOwner());
// break;; break;;
// } }
// case EEffectTargetType::TargetSkill: case EEffectTargetType::TargetSkill:
// { {
// TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner()));
// if (effectData.SkillSelecter.bAll) if (effectData.SkillSelecter.bAll)
// { {
// result.Append(Skills); result.Append(Skills);
// } }
// else else
// { {
// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
// for (int i = 0; i < TargetNum; i++) for (int i = 0; i < TargetNum; i++)
// { {
// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
// result.Add(Skills[randomIndex]); result.Add(Skills[randomIndex]);
// Skills.RemoveAt(randomIndex); Skills.RemoveAt(randomIndex);
// } }
// } }
// break;; break;;
// } }
// case EEffectTargetType::SelfSkill: case EEffectTargetType::SelfSkill:
// { {
// TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner());
// if (effectData.SkillSelecter.bAll) if (effectData.SkillSelecter.bAll)
// { {
// result.Append(Skills); result.Append(Skills);
// } }
// else else
// { {
// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
// for (int i = 0; i < TargetNum; i++) for (int i = 0; i < TargetNum; i++)
// { {
// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
// result.Add(Skills[randomIndex]); result.Add(Skills[randomIndex]);
// Skills.RemoveAt(randomIndex); Skills.RemoveAt(randomIndex);
// } }
// } }
// break;; break;;
// } }
// case EEffectTargetType::AroundSkill: case EEffectTargetType::AroundSkill:
// { {
// TArray<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill); TArray<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill);
// for (auto skill: aroundSkills) for (auto skill: aroundSkills)
// { {
// result.Add(skill); result.Add(skill);
// } }
// break; break;
// } }
// case EEffectTargetType::SelfSkillType: case EEffectTargetType::SelfSkillType:
// { {
// //筛选指定类型的技能 //筛选指定类型的技能
// TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner()); TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner());
// for (int i = Skills.Num() - 1; i >= 0; i--) for (int i = Skills.Num() - 1; i >= 0; i--)
// { {
// if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType))
// { {
// Skills.RemoveAt(i); Skills.RemoveAt(i);
// } }
// } }
//
// if (effectData.SkillSelecter.bAll) if (effectData.SkillSelecter.bAll)
// { {
// result.Append(Skills); result.Append(Skills);
// } }
// else else
// { {
// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
// for (int i = 0; i < TargetNum; i++) for (int i = 0; i < TargetNum; i++)
// { {
// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
// result.Add(Skills[randomIndex]); result.Add(Skills[randomIndex]);
// Skills.RemoveAt(randomIndex); Skills.RemoveAt(randomIndex);
// } }
// } }
// break; break;
// } }
// case EEffectTargetType::TargetSkillType: case EEffectTargetType::TargetSkillType:
// { {
// //筛选指定类型的技能 //筛选指定类型的技能
// TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner())); TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner()));
// for (int i = Skills.Num() - 1; i >= 0; i--) for (int i = Skills.Num() - 1; i >= 0; i--)
// { {
// if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType)) if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType))
// { {
// Skills.RemoveAt(i); Skills.RemoveAt(i);
// } }
// } }
//
// if (effectData.SkillSelecter.bAll) if (effectData.SkillSelecter.bAll)
// { {
// result.Append(Skills); result.Append(Skills);
// } }
// else else
// { {
// int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num()); int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
// for (int i = 0; i < TargetNum; i++) for (int i = 0; i < TargetNum; i++)
// { {
// int randomIndex = FMath::RandRange(0, Skills.Num() - 1); int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
// result.Add(Skills[randomIndex]); result.Add(Skills[randomIndex]);
// Skills.RemoveAt(randomIndex); Skills.RemoveAt(randomIndex);
// } }
// } }
// break; break;
// } }
// } }
// return result; return result;
// } }
FString USkillEffect::GetSkillEffectDes() FString USkillEffect::GetSkillEffectDes()
{ {

View File

@ -5,7 +5,6 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "ProjectFish/Definations.h" #include "ProjectFish/Definations.h"
#include "UObject/Interface.h" #include "UObject/Interface.h"
#include "SkillManager.h"
#include "SkillEffect.generated.h" #include "SkillEffect.generated.h"
@ -21,7 +20,7 @@ public:
virtual void Execute(const FSkillContext& context) ; virtual void Execute(const FSkillContext& context) ;
virtual void Cancel(const FSkillContext& context) ; virtual void Cancel(const FSkillContext& context) ;
virtual void EffectEnded(const FSkillContext& context); virtual void EffectEnded(const FSkillContext& context);
//TArray<UObject*> GetApplyTargets(const FSkillContext& context); TArray<UObject*> GetApplyTargets(const FSkillContext& context);
UFUNCTION(BlueprintPure) UFUNCTION(BlueprintPure)
virtual FString GetSkillEffectDes(); virtual FString GetSkillEffectDes();

View File

@ -7,12 +7,11 @@
#include "Kismet/KismetStringLibrary.h" #include "Kismet/KismetStringLibrary.h"
#include "ProjectFish/PawnWithSkill.h" #include "ProjectFish/PawnWithSkill.h"
#include "ProjectFish/Skill/Skill.h" #include "ProjectFish/Skill/Skill.h"
#include "ProjectFish/Skill/SkillManager.h"
void USkillEffect_Charge::Execute(const FSkillContext& context) void USkillEffect_Charge::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(USkill::StaticClass())) if (!target->GetClass()->IsChildOf(USkill::StaticClass()))

View File

@ -10,7 +10,7 @@
void USkillEffect_Damage::Execute(const FSkillContext& context) void USkillEffect_Damage::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))

View File

@ -8,7 +8,7 @@
void USkillEffect_DamageReduce::Execute(const FSkillContext& context) void USkillEffect_DamageReduce::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
@ -27,7 +27,7 @@ void USkillEffect_DamageReduce::Execute(const FSkillContext& context)
void USkillEffect_DamageReduce::EffectEnded(const FSkillContext& context) void USkillEffect_DamageReduce::EffectEnded(const FSkillContext& context)
{ {
Super::EffectEnded(context); Super::EffectEnded(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))

View File

@ -9,7 +9,7 @@
void USkillEffect_EnhanceFishRod::Execute(const FSkillContext& context) void USkillEffect_EnhanceFishRod::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))

View File

@ -7,7 +7,7 @@
void USkillEffect_EnhanceSkill::Execute(const FSkillContext& context) void USkillEffect_EnhanceSkill::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(USkill::StaticClass())) if (!target->GetClass()->IsChildOf(USkill::StaticClass()))

View File

@ -10,7 +10,7 @@
void USkillEffect_Heal::Execute(const FSkillContext& context) void USkillEffect_Heal::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))

View File

@ -10,7 +10,7 @@
void USkillEffect_ModifyCD::Execute(const FSkillContext& context) void USkillEffect_ModifyCD::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(USkill::StaticClass())) if (!target->GetClass()->IsChildOf(USkill::StaticClass()))

View File

@ -11,7 +11,7 @@
void USkillEffect_ModifySpeed::Execute(const FSkillContext& context) void USkillEffect_ModifySpeed::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(USkill::StaticClass())) if (!target->GetClass()->IsChildOf(USkill::StaticClass()))

View File

@ -11,7 +11,7 @@
void USkillEffect_SER::Execute(const FSkillContext& context) void USkillEffect_SER::Execute(const FSkillContext& context)
{ {
Super::Execute(context); Super::Execute(context);
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter); TArray<UObject*> targets = GetApplyTargets(context);
for (auto target: targets) for (auto target: targets)
{ {
if (!target->GetClass()->IsChildOf(USkill::StaticClass())) if (!target->GetClass()->IsChildOf(USkill::StaticClass()))

View File

@ -63,11 +63,11 @@ void USkillManager::AddBagWithSkills(UBagConfigAsset* Bag, APawnWithSkill* Pawn,
BagPositions.Add(FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY)); BagPositions.Add(FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY));
Skills.Add(skill); Skills.Add(skill);
//设置占用状态 //设置占用状态
for (int x = PlacedSkill.PositionX; x < PlacedSkill.PositionX + PlacedSkill.GetSkillSize().X; x++) for (int x = 0; x < Bag->BagShapeAsset->BagWidth; x++)
{ {
for (int y = PlacedSkill.PositionY; y < PlacedSkill.PositionY + PlacedSkill.GetSkillSize().Y; y++) for (int y = 0; y < Bag->BagShapeAsset->BagHeight; y++)
{ {
states->Add(FIntPoint(x, y) , GetSkillIndex(skill)); states->Add(FIntPoint(x, y) + FIntPoint(x, y), GetSkillIndex(skill));
} }
} }
} }
@ -96,13 +96,12 @@ TArray<USkill*> USkillManager::GetSkillsAround(USkill* TargetSkill)
TArray<USkill*> aroundSkills; TArray<USkill*> aroundSkills;
TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner()); TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner());
FIntPoint BagPos = TargetSkill->GetBagPos(); FIntPoint BagPos = TargetSkill->GetBagPos();
FIntPoint SkillSize = TargetSkill->GetSkillSize();
FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner()); FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner());
TObjectPtr<USkillAsset> data = TargetSkill->GetSkillData(); TObjectPtr<USkillAsset> data = TargetSkill->GetSkillData();
int beginX = FMath::Max(0, BagPos.X- 1); int beginX = FMath::Max(0, BagPos.X- 1);
int endX = FMath::Min(BagSize.X - 1, BagPos.X + SkillSize.X ); int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1);
int beginY = FMath::Max(0, BagPos.Y - 1); int beginY = FMath::Max(0, BagPos.Y - 1);
int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + SkillSize.Y ); int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + 1);
for (int x = beginX; x <= endX; x++) for (int x = beginX; x <= endX; x++)
{ {
for (int y = beginY; y <= endY; y++) for (int y = beginY; y <= endY; y++)
@ -190,152 +189,4 @@ TArray<USkill*> USkillManager::GetSkillsByType(ESkillType SkillType) const
return Result; return Result;
} }
TArray<UObject*> USkillManager::GetTargetsBySelector( USkill* OwnerSkill, FTargetSelector TargetSelector)
{
TArray<UObject*> 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<USkill*> 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<USkill*> 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<USkill*> aroundSpecifySkills = GetSkillsAround(OwnerSkill);
for (auto skill: aroundSpecifySkills)
{
result.Add(skill);
}
break;
}
case EEffectTargetType::SelfSkillType:
{
//筛选指定类型的技能
TArray<USkill*> 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<USkill*> 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;
}

View File

@ -65,7 +65,6 @@ public:
UFUNCTION(BlueprintPure) UFUNCTION(BlueprintPure)
TArray<class USkill*> GetSkillsByType(ESkillType SkillType) const; TArray<class USkill*> GetSkillsByType(ESkillType SkillType) const;
TArray<UObject*> GetTargetsBySelector( USkill* OwnerSkill, FTargetSelector TargetSelector);
protected: protected:
UPROPERTY(BlueprintReadWrite) UPROPERTY(BlueprintReadWrite)
TArray<class USkill *> Skills; TArray<class USkill *> Skills;

View File

@ -39,17 +39,38 @@ void USkillTrigger::OnSkillExecute(const FString& SkillName)
void USkillTrigger::InitPassiveConditionTriggers() void USkillTrigger::InitPassiveConditionTriggers()
{ {
EEffectTargetType targetType = PassiveTriggerConfig.Target.SelecterType;
switch (PassiveTriggerConfig.Condition) switch (PassiveTriggerConfig.Condition)
{ {
case EPassiveTriggerCondition::ItemTriggered: case EPassiveTriggerCondition::ItemTriggered:
{ {
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) //物品执行时触发
//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.AddDynamic(this, &USkillTrigger::OnSkillExecute);
//
// }
// }
// 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.AddDynamic(this, &USkillTrigger::OnSkillExecute);
// }
// }
if (PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Enemy)
{ {
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
for (auto Object : PawnSkills) SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner());
TArray<USkill*> PawnSkills = SkillContext.SkillManager->GetSkillsByOwner(TargetPawn);
for (USkill* Skill : PawnSkills)
{ {
USkill* Skill = Cast<USkill>(Object);
if (Skill != SkillContext.OwnerSkill) if (Skill != SkillContext.OwnerSkill)
Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute); Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute);
} }
@ -63,12 +84,10 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::DealDamage: case EPassiveTriggerCondition::DealDamage:
{ {
//造成伤害触发 //造成伤害触发
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
{ {
//监测哪个角色受到了伤害 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) ReceiveDamagePawn->OnReceiveDamage.AddLambda([this](UObject* Source)
{ {
//UE_LOG(LogTemp, Error, TEXT("receive damge source = %s"), *Source->GetName()); //UE_LOG(LogTemp, Error, TEXT("receive damge source = %s"), *Source->GetName());
@ -82,7 +101,7 @@ void USkillTrigger::InitPassiveConditionTriggers()
DamgePawn = Cast<APawnWithSkill>(Source); DamgePawn = Cast<APawnWithSkill>(Source);
} }
if (Source != SkillContext.OwnerSkill && DamgePawn != SkillContext.OwnerSkill->GetOwner() ) if (Source != SkillContext.OwnerSkill && DamgePawn == SkillContext.OwnerSkill->GetOwner() )
OnTrigger(); OnTrigger();
}); });
} }
@ -95,19 +114,18 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::SkillDurabilityDecrease: case EPassiveTriggerCondition::SkillDurabilityDecrease:
{ {
//物品耐久度减少触发 //物品耐久度减少触发
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{ {
// //目标技能iD //目标技能iD
// FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
// //目标pawn //目标pawn
// APawnWithSkill* TargetPawn = targetType == EEffectTargetType::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner(): APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
// SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//
// TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID); TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
for (UObject* Object : PawnSkills) for (USkill* Skill : SpecificSkills)
{ {
USkill* Skill = Cast<USkill>(Object);
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset) Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{ {
if (EnduranceOffset < 0) if (EnduranceOffset < 0)
@ -125,19 +143,18 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::SkillDurabilityRestore: case EPassiveTriggerCondition::SkillDurabilityRestore:
{ {
//物品耐久度恢复触发 //物品耐久度恢复触发
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target) if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
{ {
// //目标技能iD //目标技能iD
// FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
// //目标pawn //目标pawn
// APawnWithSkill* TargetPawn = targetType == EEffectTargetType::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner(): APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
// SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//
// TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID); TArray<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
for (UObject* Object : PawnSkills) for (USkill* Skill : SpecificSkills)
{ {
USkill* Skill = Cast<USkill>(Object);
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset) Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{ {
if (EnduranceOffset > 0) if (EnduranceOffset > 0)
@ -155,26 +172,21 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::HealthFirstBelowPercent: case EPassiveTriggerCondition::HealthFirstBelowPercent:
{ {
//目标生命值低于x时触发 //目标生命值低于x时触发
if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
{ {
// //目标pawn
// APawnWithSkill* TargetPawn = targetType == EEffectTargetType::Self ? SkillContext.OwnerSkill->GetOwner():
// SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
for (UObject* Object : PawnSkills)
{
APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object);
//绑定生命值发生变化
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source)
{
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue)
{
OnTrigger();
}
});
}
//目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
//绑定生命值发生变化
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source)
{
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue)
{
OnTrigger();
}
});
} }
else else
{ {
@ -190,7 +202,6 @@ void USkillTrigger::InitPassiveConditionTriggers()
void USkillTrigger::InitAuraConditionTriggers() void USkillTrigger::InitAuraConditionTriggers()
{ {
EEffectTargetType targetType = PassiveTriggerConfig.Target.SelecterType;
switch (AuraTriggerConfig.Condition) switch (AuraTriggerConfig.Condition)
{ {
case EAuraTriggerCondition::None: case EAuraTriggerCondition::None:
@ -200,115 +211,69 @@ void USkillTrigger::InitAuraConditionTriggers()
} }
case EAuraTriggerCondition::HealthBelowPercent: case EAuraTriggerCondition::HealthBelowPercent:
{ {
if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) //目标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)
{ {
// //目标pawn OnTrigger();
// APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): }
// SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); //动态检测
TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source)
for (UObject* Object : Pawn) {
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue)
{ {
APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object); OnTrigger();
//初始检测
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; break;
} }
case EAuraTriggerCondition::HealthAbovePercent: case EAuraTriggerCondition::HealthAbovePercent:
{ {
if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) //目标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)
{ {
// //目标pawn OnTrigger();
// APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): }
// SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); //动态检测
TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); TargetPawn->OnEnduranceChanged.AddLambda([this, TargetPawn]()
for (UObject* Object : Pawn) {
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue)
{ {
APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object); OnTrigger();
//初始检测
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; break;
} }
case EAuraTriggerCondition::EquipmentCountNotMoreThan: case EAuraTriggerCondition::EquipmentCountNotMoreThan:
{ {
if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) //目标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)
{ {
TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); OnTrigger();
for (UObject* Object : Pawn)
{
APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object);
if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() <= this->AuraTriggerConfig.CountValue)
{
OnTrigger();
}
}
} }
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
}
break; break;
} }
case EAuraTriggerCondition::EquipmentCountNotLessThan: case EAuraTriggerCondition::EquipmentCountNotLessThan:
{ {
if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target) //目标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)
{ {
TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target); OnTrigger();
for (UObject* Object : Pawn)
{
APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object);
if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() >= this->AuraTriggerConfig.CountValue)
{
OnTrigger();
}
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
} }
break; break;
} }