更新 技能物品 选择对象的配置 以及显示bug修改

This commit is contained in:
997146918 2025-09-15 16:16:13 +08:00
parent 56abff04e3
commit 7f84d384b9
20 changed files with 485 additions and 290 deletions

View File

@ -41,7 +41,10 @@ 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,6 +124,32 @@ 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
@ -132,16 +158,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 = "触发目标"))
EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self; FTargetSelector Target ;
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)
@ -154,7 +180,7 @@ struct FAuraTriggerConfig
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标", EditConditionHides, UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标", EditConditionHides,
EditCondition = "Condition != EAuraTriggerCondition::None")) EditCondition = "Condition != EAuraTriggerCondition::None"))
EAuraTriggerTarget Target = EAuraTriggerTarget::Self; EEffectTargetType Target = EEffectTargetType::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",
@ -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) USTRUCT(BlueprintType)
@ -219,7 +224,7 @@ struct FSkillEffectData
FString ParamAddition; FString ParamAddition;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器")) UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器"))
FSkillTargetSelector SkillSelecter; FTargetSelector 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= GetApplyTargets(context); TArray<UObject*> targets= context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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,6 +5,7 @@
#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"
@ -20,7 +21,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,11 +7,12 @@
#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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = GetApplyTargets(context); TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
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 = 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<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 + 1); int endX = FMath::Min(BagSize.X - 1, BagPos.X + SkillSize.X );
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 + 1); int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + SkillSize.Y );
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++)
@ -189,4 +190,152 @@ 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,6 +65,7 @@ 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,38 +39,17 @@ 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)
{ {
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner()); for (auto Object : PawnSkills)
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);
} }
@ -84,10 +63,12 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::DealDamage: 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) 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());
@ -101,7 +82,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();
}); });
} }
@ -114,18 +95,19 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::SkillDurabilityDecrease: case EPassiveTriggerCondition::SkillDurabilityDecrease:
{ {
//物品耐久度减少触发 //物品耐久度减少触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem) if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target)
{ {
//目标技能iD // //目标技能iD
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; // FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
//目标pawn // //目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner(): // APawnWithSkill* TargetPawn = targetType == EEffectTargetType::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 (USkill* Skill : SpecificSkills) for (UObject* Object : PawnSkills)
{ {
USkill* Skill = Cast<USkill>(Object);
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset) Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{ {
if (EnduranceOffset < 0) if (EnduranceOffset < 0)
@ -143,18 +125,19 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::SkillDurabilityRestore: case EPassiveTriggerCondition::SkillDurabilityRestore:
{ {
//物品耐久度恢复触发 //物品耐久度恢复触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem) if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target)
{ {
//目标技能iD // //目标技能iD
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID; // FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
//目标pawn // //目标pawn
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner(): // APawnWithSkill* TargetPawn = targetType == EEffectTargetType::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 (USkill* Skill : SpecificSkills) for (UObject* Object : PawnSkills)
{ {
USkill* Skill = Cast<USkill>(Object);
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset) Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
{ {
if (EnduranceOffset > 0) if (EnduranceOffset > 0)
@ -172,21 +155,26 @@ void USkillTrigger::InitPassiveConditionTriggers()
case EPassiveTriggerCondition::HealthFirstBelowPercent: case EPassiveTriggerCondition::HealthFirstBelowPercent:
{ {
//目标生命值低于x时触发 //目标生命值低于x时触发
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy) if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target)
{ {
// //目标pawn
//目标pawn // APawnWithSkill* TargetPawn = targetType == EEffectTargetType::Self ? SkillContext.OwnerSkill->GetOwner():
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner(): // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner()); TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
//绑定生命值发生变化 for (UObject* Object : PawnSkills)
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source)
{ {
if (!this->bTriggered && APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object);
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue) //绑定生命值发生变化
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source)
{ {
OnTrigger(); if (!this->bTriggered &&
} TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue)
}); {
OnTrigger();
}
});
}
} }
else else
{ {
@ -202,6 +190,7 @@ 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:
@ -211,69 +200,115 @@ void USkillTrigger::InitAuraConditionTriggers()
} }
case EAuraTriggerCondition::HealthBelowPercent: case EAuraTriggerCondition::HealthBelowPercent:
{ {
//目标pawn if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target)
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(); // //目标pawn
} // APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
//动态检测 // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source) TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
{ for (UObject* Object : Pawn)
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue)
{ {
OnTrigger(); APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(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; break;
} }
case EAuraTriggerCondition::HealthAbovePercent: case EAuraTriggerCondition::HealthAbovePercent:
{ {
//目标pawn if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target)
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(); // //目标pawn
} // APawnWithSkill* TargetPawn = AuraTriggerConfig.Target == EAuraTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
//动态检测 // SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
TargetPawn->OnEnduranceChanged.AddLambda([this, TargetPawn]() TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
{ for (UObject* Object : Pawn)
if (!this->bTriggered &&
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue)
{ {
OnTrigger(); APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(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; break;
} }
case EAuraTriggerCondition::EquipmentCountNotMoreThan: case EAuraTriggerCondition::EquipmentCountNotMoreThan:
{ {
//目标pawn if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target)
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(); TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
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:
{ {
//目标pawn if (targetType == EEffectTargetType::Self || targetType == EEffectTargetType::Target)
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(); TArray<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
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;
} }