diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.exp index 4f30fc9..cd7d8d7 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.exp and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.exp differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.pdb new file mode 100644 index 0000000..4e29713 Binary files /dev/null and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFish-0004.pdb differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.exp b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.exp index 08491ec..22066d5 100644 Binary files a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.exp and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.exp differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.pdb b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.pdb new file mode 100644 index 0000000..c0d376f Binary files /dev/null and b/ProjectFish/Binaries/Win64/UnrealEditor-ProjectFishEditor-0004.pdb differ diff --git a/ProjectFish/Binaries/Win64/UnrealEditor.modules b/ProjectFish/Binaries/Win64/UnrealEditor.modules index fe900f8..8086c19 100644 --- a/ProjectFish/Binaries/Win64/UnrealEditor.modules +++ b/ProjectFish/Binaries/Win64/UnrealEditor.modules @@ -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" } } \ No newline at end of file diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index f940f46..803f6ea 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -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")) diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp index bb18ed8..3e2ab49 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp @@ -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(this, USkillEffect_Damage::StaticClass()); -// break; -// case ESkillEffectType::Heal: -// skillEffect = NewObject(this, USkillEffect_Heal::StaticClass()); -// break; -// case ESkillEffectType::ModifyCooldown: -// skillEffect = NewObject(this, USkillEffect_ModifyCD::StaticClass()); -// break; -// case ESkillEffectType::Charge: -// skillEffect = NewObject(this, USkillEffect_Charge::StaticClass()); -// break; -// case ESkillEffectType::ModifySpeed: -// skillEffect = NewObject(this, USkillEffect_ModifySpeed::StaticClass()); -// break; -// case ESkillEffectType::SkillEnduranceRestore: -// skillEffect = NewObject(this, USkillEffect_SER::StaticClass()); -// break; -// case ESkillEffectType::EnhanceFishRod: -// skillEffect = NewObject(this, USkillEffect_EnhanceFishRod::StaticClass()); -// break; -// case ESkillEffectType::EnhanceSkill: -// skillEffect = NewObject(this, USkillEffect_EnhanceSkill::StaticClass()); -// break; -// case ESkillEffectType::DamageReduce: -// skillEffect = NewObject(this, USkillEffect_DamageReduce::StaticClass()); -// break; -// default: -// const UEnum* EnumPtr = StaticEnum(); -// UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast(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; diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.h b/ProjectFish/Source/ProjectFish/Skill/Skill.h index 8dd0bf8..3ce284f 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.h +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.h @@ -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 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: diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp index 11327fd..44bd9e9 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_SER.cpp @@ -22,7 +22,7 @@ void USkillEffect_SER::Execute(const FSkillContext& context) { //修改技能的冷却时间 USkill* skill = Cast(target); - skill->ApplyRemainingRemainingEnduranceOffset(effectData.EffectValue); + skill->ApplyRemainingEnduranceOffset(effectData.EffectValue); } } } diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp index 9481d01..18b2651 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.cpp @@ -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 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 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: diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h index 45d4f5b..bd2ab0a 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillTrigger.h @@ -35,4 +35,6 @@ protected: UPROPERTY(BlueprintReadOnly) FAuraTriggerConfig AuraTriggerConfig; + + bool bTriggered = false; };