更新 技能物品 选择对象的配置 以及显示bug修改
This commit is contained in:
parent
56abff04e3
commit
7f84d384b9
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -41,7 +41,10 @@ struct FPlacedSkillInfo
|
||||
PositionX = InX;
|
||||
PositionY = InY;
|
||||
}
|
||||
|
||||
FIntPoint GetSkillSize()
|
||||
{
|
||||
return GetSkillSizeValue(SkillAsset->SkillSize);
|
||||
}
|
||||
// 检查技能是否占用指定位置
|
||||
bool OccupiesPosition(int32 X, int32 Y) const
|
||||
{
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -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<UObject*> targets= GetApplyTargets(context);
|
||||
TArray<UObject*> 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<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context)
|
||||
{
|
||||
TArray<UObject*> 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<USkill*> 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<USkill*> 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<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill);
|
||||
for (auto skill: aroundSkills)
|
||||
{
|
||||
result.Add(skill);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EEffectTargetType::SelfSkillType:
|
||||
{
|
||||
//筛选指定类型的技能
|
||||
TArray<USkill*> 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<USkill*> 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<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context)
|
||||
// {
|
||||
// TArray<UObject*> 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<USkill*> 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<USkill*> 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<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill);
|
||||
// for (auto skill: aroundSkills)
|
||||
// {
|
||||
// result.Add(skill);
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// case EEffectTargetType::SelfSkillType:
|
||||
// {
|
||||
// //筛选指定类型的技能
|
||||
// TArray<USkill*> 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<USkill*> 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()
|
||||
{
|
||||
|
||||
@ -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<UObject*> GetApplyTargets(const FSkillContext& context);
|
||||
//TArray<UObject*> GetApplyTargets(const FSkillContext& context);
|
||||
|
||||
UFUNCTION(BlueprintPure)
|
||||
virtual FString GetSkillEffectDes();
|
||||
|
||||
@ -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<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(USkill::StaticClass()))
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
void USkillEffect_Damage::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
void USkillEffect_DamageReduce::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> 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<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
void USkillEffect_EnhanceFishRod::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
void USkillEffect_EnhanceSkill::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(USkill::StaticClass()))
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
void USkillEffect_Heal::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
void USkillEffect_ModifyCD::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(USkill::StaticClass()))
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
void USkillEffect_ModifySpeed::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(USkill::StaticClass()))
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
void USkillEffect_SER::Execute(const FSkillContext& context)
|
||||
{
|
||||
Super::Execute(context);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
TArray<UObject*> targets = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
for (auto target: targets)
|
||||
{
|
||||
if (!target->GetClass()->IsChildOf(USkill::StaticClass()))
|
||||
|
||||
@ -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<USkill*> USkillManager::GetSkillsAround(USkill* TargetSkill)
|
||||
TArray<USkill*> aroundSkills;
|
||||
TMap<FIntPoint, int32> *BagStates = PawnBagState.Find(TargetSkill->GetOwner());
|
||||
FIntPoint BagPos = TargetSkill->GetBagPos();
|
||||
FIntPoint SkillSize = TargetSkill->GetSkillSize();
|
||||
FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner());
|
||||
TObjectPtr<USkillAsset> 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<USkill*> USkillManager::GetSkillsByType(ESkillType SkillType) const
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -65,6 +65,7 @@ public:
|
||||
UFUNCTION(BlueprintPure)
|
||||
TArray<class USkill*> GetSkillsByType(ESkillType SkillType) const;
|
||||
|
||||
TArray<UObject*> GetTargetsBySelector( USkill* OwnerSkill, FTargetSelector TargetSelector);
|
||||
protected:
|
||||
UPROPERTY(BlueprintReadWrite)
|
||||
TArray<class USkill *> Skills;
|
||||
|
||||
@ -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<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)
|
||||
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target)
|
||||
{
|
||||
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target ==EPassiveTriggerTarget::Self ? SkillContext.OwnerSkill->GetOwner():
|
||||
SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner());
|
||||
TArray<USkill*> PawnSkills = SkillContext.SkillManager->GetSkillsByOwner(TargetPawn);
|
||||
for (USkill* Skill : PawnSkills)
|
||||
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
|
||||
for (auto Object : PawnSkills)
|
||||
{
|
||||
USkill* Skill = Cast<USkill>(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<APawnWithSkill>(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<USkill*> 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<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
|
||||
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
|
||||
for (UObject* Object : PawnSkills)
|
||||
{
|
||||
USkill* Skill = Cast<USkill>(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<USkill*> 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<USkill*> SpecificSkills = SkillContext.SkillManager->GetSkillsByOwnerAndID(TargetPawn, TriggerSkillID);
|
||||
TArray<UObject*> PawnSkills = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
|
||||
for (UObject* Object : PawnSkills)
|
||||
{
|
||||
USkill* Skill = Cast<USkill>(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<UObject*> 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<APawnWithSkill>(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<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
|
||||
for (UObject* Object : Pawn)
|
||||
{
|
||||
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;
|
||||
}
|
||||
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<UObject*> Pawn = SkillContext.SkillManager->GetTargetsBySelector(SkillContext.OwnerSkill, PassiveTriggerConfig.Target);
|
||||
for (UObject* Object : Pawn)
|
||||
{
|
||||
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;
|
||||
}
|
||||
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<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;
|
||||
}
|
||||
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<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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user