完善被动技能触发器逻辑
This commit is contained in:
parent
4ee512332b
commit
3189d06477
Binary file not shown.
BIN
ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.pdb
Normal file
BIN
ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.pdb
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -2,7 +2,7 @@
|
||||
"BuildId": "37670630",
|
||||
"Modules":
|
||||
{
|
||||
"ProjectFish": "UnrealEditor-ProjectFish-0001.dll",
|
||||
"ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0001.dll"
|
||||
"ProjectFish": "UnrealEditor-ProjectFish-0004.dll",
|
||||
"ProjectFishEditor": "UnrealEditor-ProjectFishEditor-0004.dll"
|
||||
}
|
||||
}
|
||||
@ -59,8 +59,8 @@ enum class EPassiveTriggerCondition: uint8
|
||||
{
|
||||
ItemTriggered UMETA(DisplayName = "物品触发"),
|
||||
DealDamage UMETA(DisplayName = "造成伤害"),
|
||||
ItemDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"),
|
||||
ItemDurabilityRestore UMETA(DisplayName = "物品耐久度回复"),
|
||||
SkillDurabilityDecrease UMETA(DisplayName = "物品耐久度减少"),
|
||||
SkillDurabilityRestore UMETA(DisplayName = "物品耐久度回复"),
|
||||
HealthFirstBelowPercent UMETA(DisplayName = "生命值百分比首次低于"),
|
||||
};
|
||||
|
||||
@ -134,10 +134,10 @@ struct FPassiveTriggerConfig
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "触发目标"))
|
||||
EPassiveTriggerTarget Target = EPassiveTriggerTarget::Self;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-100)", EditConditionHides,
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "百分比值 (0-1)", EditConditionHides,
|
||||
EditCondition = "Condition == EPassiveTriggerCondition::HealthFirstBelowPercent",
|
||||
ClampMin = 0, ClampMax = 100))
|
||||
float PercentageValue = 50.0f;
|
||||
ClampMin = 0, ClampMax = 1))
|
||||
float PercentageValue = 0.5f;
|
||||
|
||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "指定物品", EditConditionHides,
|
||||
EditCondition = "Target == EPassiveTriggerTarget::SelfSpecificItem || Target == EPassiveTriggerTarget::EnemySpecificItem"))
|
||||
|
||||
@ -15,58 +15,6 @@
|
||||
#include "SkillEffects/SkillEffect_ModifySpeed.h"
|
||||
#include "SkillEffects/SkillEffect_SER.h"
|
||||
|
||||
// void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
|
||||
// {
|
||||
// this->Owner = owner;
|
||||
// this->SkillManager = skillManager;
|
||||
// this->SkillData = skillData;
|
||||
// this->BagPosition = BagPos;
|
||||
// this->RemainingTime = SkillData->CD;
|
||||
// this->RemainingEndurance = SkillData->Endurance;
|
||||
// for (auto effectData: SkillData->SkillEffects)
|
||||
// {
|
||||
// USkillEffect* skillEffect = nullptr ;
|
||||
// switch (effectData.EffectType)
|
||||
// {
|
||||
// case ESkillEffectType::Damage:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Damage::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::Heal:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Heal::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::ModifyCooldown:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifyCD::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::Charge:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_Charge::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::ModifySpeed:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifySpeed::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::SkillEnduranceRestore:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_SER::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::EnhanceFishRod:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceFishRod::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::EnhanceSkill:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass());
|
||||
// break;
|
||||
// case ESkillEffectType::DamageReduce:
|
||||
// skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
|
||||
// break;
|
||||
// default:
|
||||
// const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
|
||||
// UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
|
||||
// }
|
||||
// if (IsValid(skillEffect))
|
||||
// {
|
||||
// skillEffect->InitSkillEffect(this, effectData);
|
||||
// this->SkillEffects.Add(skillEffect);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
// }
|
||||
|
||||
void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill)
|
||||
{
|
||||
@ -155,6 +103,8 @@ void USkill::InitSkillTrigger()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool USkill::SkillTickAble()
|
||||
{
|
||||
//剩余次数无限制或者拥有者没有被韧性眩晕
|
||||
@ -191,7 +141,9 @@ void USkill::ExecuteSkill()
|
||||
{
|
||||
RemainingTime = 0;
|
||||
if (RemainingEndurance >0)
|
||||
--RemainingEndurance;
|
||||
{
|
||||
ApplyRemainingEnduranceOffset(-1);
|
||||
}
|
||||
FSkillContext context;
|
||||
context.OwnerSkill = this;
|
||||
context.SkillManager = SkillManager;
|
||||
@ -229,12 +181,17 @@ void USkill::ApplyRemainingTimeOffset(int timeOffset)
|
||||
this->RemainingTime += timeOffset;
|
||||
}
|
||||
|
||||
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset)
|
||||
void USkill::ApplyRemainingEnduranceOffset(int Offset)
|
||||
{
|
||||
if (SkillData->Endurance != -1)
|
||||
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData->Endurance);
|
||||
{
|
||||
RemainingEndurance = FMath::Clamp( RemainingEndurance + Offset, 0, SkillData->Endurance);
|
||||
OnSkillEnduranceChange.Broadcast(Offset);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class APawnWithSkill* USkill::GetOwner()
|
||||
{
|
||||
return Owner;
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
|
||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FSkillUpdate);
|
||||
DECLARE_MULTICAST_DELEGATE_OneParam(FSkillExecute, FString );
|
||||
DECLARE_MULTICAST_DELEGATE_OneParam(FSkillEnduranceChange, int32 );
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@ -40,7 +41,8 @@ public:
|
||||
void SetSkillData( TObjectPtr<USkillAsset> SkillData);
|
||||
UFUNCTION(BlueprintCallable)
|
||||
void ApplyRemainingTimeOffset(int timeOffset);
|
||||
void ApplyRemainingRemainingEnduranceOffset(int Offset);
|
||||
|
||||
void ApplyRemainingEnduranceOffset(int Offset);
|
||||
|
||||
UFUNCTION(BlueprintPure)
|
||||
bool SkillTickAble();
|
||||
@ -53,6 +55,7 @@ public:
|
||||
FSkillUpdate OnSkillUpdate;
|
||||
|
||||
FSkillExecute OnSkillExecute;
|
||||
FSkillEnduranceChange OnSkillEnduranceChange;
|
||||
protected:
|
||||
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ void USkillEffect_SER::Execute(const FSkillContext& context)
|
||||
{
|
||||
//修改技能的冷却时间
|
||||
USkill* skill = Cast<USkill>(target);
|
||||
skill->ApplyRemainingRemainingEnduranceOffset(effectData.EffectValue);
|
||||
skill->ApplyRemainingEnduranceOffset(effectData.EffectValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@ void USkillTrigger::Init_Implementation(FSkillContext context, const FPassiveTri
|
||||
|
||||
void USkillTrigger::OnTrigger()
|
||||
{
|
||||
bTriggered = true;
|
||||
SkillContext.OwnerSkill->ExecuteSkill();
|
||||
}
|
||||
|
||||
@ -37,7 +38,7 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
{
|
||||
case EPassiveTriggerCondition::ItemTriggered:
|
||||
{
|
||||
//物品触发
|
||||
//物品执行时触发
|
||||
FGuid TriggerSkillID = PassiveTriggerConfig.SpecificSkillID;
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem)
|
||||
{
|
||||
@ -83,6 +84,90 @@ void USkillTrigger::InitPassiveConditionTriggers()
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EPassiveTriggerCondition::SkillDurabilityDecrease:
|
||||
{
|
||||
//物品耐久度减少触发
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
|
||||
{
|
||||
//目标技能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)
|
||||
{
|
||||
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
|
||||
{
|
||||
if (EnduranceOffset < 0)
|
||||
OnTrigger();
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case EPassiveTriggerCondition::SkillDurabilityRestore:
|
||||
{
|
||||
//物品耐久度恢复触发
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem || PassiveTriggerConfig.Target == EPassiveTriggerTarget::EnemySpecificItem)
|
||||
{
|
||||
//目标技能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)
|
||||
{
|
||||
Skill->OnSkillEnduranceChange.AddLambda([this](int32 EnduranceOffset)
|
||||
{
|
||||
if (EnduranceOffset > 0)
|
||||
OnTrigger();
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case EPassiveTriggerCondition::HealthFirstBelowPercent:
|
||||
{
|
||||
//目标生命值低于x时触发
|
||||
if (PassiveTriggerConfig.Target == EPassiveTriggerTarget::Self || PassiveTriggerConfig.Target == EPassiveTriggerTarget::Enemy)
|
||||
{
|
||||
|
||||
//目标pawn
|
||||
APawnWithSkill* TargetPawn = PassiveTriggerConfig.Target == EPassiveTriggerTarget::SelfSpecificItem ? SkillContext.OwnerSkill->GetOwner():
|
||||
SkillContext.SkillManager->GetEnemyPawn( SkillContext.OwnerSkill->GetOwner());
|
||||
//绑定生命值发生变化
|
||||
TargetPawn->OnReceiveDamage.AddLambda([this, TargetPawn]()
|
||||
{
|
||||
if (!this->bTriggered &&
|
||||
TargetPawn->CurrentEndurance /TargetPawn ->MaxEndurance < this->PassiveTriggerConfig.PercentageValue)
|
||||
{
|
||||
OnTrigger();
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("Target 与 Condition 不匹配"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
@ -35,4 +35,6 @@ protected:
|
||||
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
FAuraTriggerConfig AuraTriggerConfig;
|
||||
|
||||
bool bTriggered = false;
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user