更新 技能物品 选择对象的配置 以及显示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;
|
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
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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()))
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user