Compare commits
No commits in common. "7f84d384b94577f91fae2a7c2d1e2d440c415c78" and "9c786adc4dc7523600ad3a1f269a0bedf90f1314" have entirely different histories.
7f84d384b9
...
9c786adc4d
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -41,10 +41,7 @@ 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,32 +124,6 @@ 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
|
||||
@ -158,16 +132,16 @@ struct FPassiveTriggerConfig
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发条件类型"))
|
||||
EPassiveTriggerCondition Condition = EPassiveTriggerCondition::ItemTriggered;
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
|
||||
FTargetSelector Target ;
|
||||
EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self;
|
||||
|
||||
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)
|
||||
@ -180,7 +154,7 @@ struct FAuraTriggerConfig
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标", EditConditionHides,
|
||||
EditCondition = "Condition != EAuraTriggerCondition::None"))
|
||||
EEffectTargetType Target = EEffectTargetType::Self;
|
||||
EAuraTriggerTarget Target = EAuraTriggerTarget::Self;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides,
|
||||
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)
|
||||
@ -224,7 +219,7 @@ struct FSkillEffectData
|
||||
FString ParamAddition;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "技能选择器"))
|
||||
FTargetSelector SkillSelecter;
|
||||
FSkillTargetSelector 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= context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets= GetApplyTargets(context);
|
||||
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,7 +5,6 @@
|
||||
#include "CoreMinimal.h"
|
||||
#include "ProjectFish/Definations.h"
|
||||
#include "UObject/Interface.h"
|
||||
#include "SkillManager.h"
|
||||
#include "SkillEffect.generated.h"
|
||||
|
||||
|
||||
@ -21,7 +20,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,12 +7,11 @@
|
||||
#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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = context.SkillManager->GetTargetsBySelector(context.OwnerSkill, effectData.SkillSelecter);
|
||||
TArray<UObject*> targets = GetApplyTargets(context);
|
||||
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 = 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;
|
||||
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 + SkillSize.X );
|
||||
int endX = FMath::Min(BagSize.X - 1, BagPos.X + 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 y = beginY; y <= endY; y++)
|
||||
@ -190,152 +189,4 @@ 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,7 +65,6 @@ 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,17 +39,38 @@ void USkillTrigger::OnSkillExecute(const FString& SkillName)
|
||||
|
||||
void USkillTrigger::InitPassiveConditionTriggers()
|
||||
{
|
||||
EEffectTargetType targetType = PassiveTriggerConfig.Target.SelecterType;
|
||||
switch (PassiveTriggerConfig.Condition)
|
||||
{
|
||||
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);
|
||||
for (auto Object : PawnSkills)
|
||||
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)
|
||||
{
|
||||
USkill* Skill = Cast<USkill>(Object);
|
||||
if (Skill != SkillContext.OwnerSkill)
|
||||
Skill->OnSkillExecute.AddDynamic(this, &USkillTrigger::OnSkillExecute);
|
||||
}
|
||||
@ -63,12 +84,10 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
|
||||
case EPassiveTriggerCondition::DealDamage:
|
||||
{
|
||||
//造成伤害时触发
|
||||
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target)
|
||||
//造成伤害触发
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
|
||||
{
|
||||
//监测哪个角色受到了伤害
|
||||
bool enemyMakeDamage = (targetType == EEffectTargetType::TargetSkill || targetType == EEffectTargetType::TargetSkillType);
|
||||
APawnWithSkill* ReceiveDamagePawn = enemyMakeDamage ? SkillContext.OwnerSkill->GetOwner() : SkillContext.SkillManager->GetEnemyPawn(SkillContext.OwnerSkill->GetOwner());
|
||||
APawnWithSkill* ReceiveDamagePawn =PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy ? 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());
|
||||
@ -82,7 +101,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();
|
||||
});
|
||||
}
|
||||
@ -95,19 +114,18 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
case EPassiveTriggerCondition::SkillDurabilityDecrease:
|
||||
{
|
||||
//物品耐久度减少触发
|
||||
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target)
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
|
||||
{
|
||||
// //目标技能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)
|
||||
//目标技能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)
|
||||
{
|
||||
USkill* Skill = Cast<USkill>(Object);
|
||||
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
|
||||
{
|
||||
if (EnduranceOffset < 0)
|
||||
@ -125,19 +143,18 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
case EPassiveTriggerCondition::SkillDurabilityRestore:
|
||||
{
|
||||
//物品耐久度恢复触发
|
||||
if (targetType !=EEffectTargetType::Self && targetType !=EEffectTargetType::Target)
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
|
||||
{
|
||||
// //目标技能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)
|
||||
//目标技能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)
|
||||
{
|
||||
USkill* Skill = Cast<USkill>(Object);
|
||||
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
|
||||
{
|
||||
if (EnduranceOffset > 0)
|
||||
@ -155,26 +172,21 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
case EPassiveTriggerCondition::HealthFirstBelowPercent:
|
||||
{
|
||||
//目标生命值低于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
|
||||
{
|
||||
@ -190,7 +202,6 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
|
||||
void USkillTrigger::InitAuraConditionTriggers()
|
||||
{
|
||||
EEffectTargetType targetType = PassiveTriggerConfig.Target.SelecterType;
|
||||
switch (AuraTriggerConfig.Condition)
|
||||
{
|
||||
case EAuraTriggerCondition::None:
|
||||
@ -200,115 +211,69 @@ void USkillTrigger::InitAuraConditionTriggers()
|
||||
}
|
||||
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
|
||||
// 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();
|
||||
}
|
||||
//动态检测
|
||||
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn](UObject* Source)
|
||||
{
|
||||
if (!this->bTriggered &&
|
||||
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->AuraTriggerConfig.PercentageValue)
|
||||
{
|
||||
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();
|
||||
}
|
||||
});
|
||||
OnTrigger();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
|
||||
});
|
||||
break;
|
||||
}
|
||||
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
|
||||
// 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();
|
||||
}
|
||||
//动态检测
|
||||
TargetPawn->OnEnduranceChanged.AddLambda([this, TargetPawn]()
|
||||
{
|
||||
if (!this->bTriggered &&
|
||||
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance > this->AuraTriggerConfig.PercentageValue)
|
||||
{
|
||||
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();
|
||||
}
|
||||
});
|
||||
OnTrigger();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
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);
|
||||
for (UObject* Object : Pawn)
|
||||
{
|
||||
APawnWithSkill* TargetPawn = Cast<APawnWithSkill>(Object);
|
||||
if (!this->bTriggered && SkillContext.SkillManager->GetSkillsByOwner(TargetPawn).Num() <= this->AuraTriggerConfig.CountValue)
|
||||
{
|
||||
OnTrigger();
|
||||
}
|
||||
}
|
||||
|
||||
OnTrigger();
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
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);
|
||||
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 不匹配"));
|
||||
OnTrigger();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user