diff --git a/ProjectFish/Content/DataTable/PawnSkills.uasset b/ProjectFish/Content/DataTable/PawnSkills.uasset index 1776439..6240bf4 100644 Binary files a/ProjectFish/Content/DataTable/PawnSkills.uasset and b/ProjectFish/Content/DataTable/PawnSkills.uasset differ diff --git a/ProjectFish/Content/SkillTrigger/SkillTrigger_ReceiveDamage.uasset b/ProjectFish/Content/SkillTrigger/SkillTrigger_ReceiveDamage.uasset new file mode 100644 index 0000000..4e6797d Binary files /dev/null and b/ProjectFish/Content/SkillTrigger/SkillTrigger_ReceiveDamage.uasset differ diff --git a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset index 77d0b39..16f7936 100644 Binary files a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset and b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset differ diff --git a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset index c3e4a5d..ddbfa93 100644 Binary files a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset and b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset differ diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index 4d70b50..53bf6d8 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -18,7 +18,8 @@ enum class ESkillEffectType: uint8 ModifySpeed UMETA(DisplayName = "速度修改", ToolTip = "使技能冷却进度倍率进展 持续指定时间"), SkillEnduranceRestore UMETA(DisplayName = "技能耐久度恢复", ToolTip = "使技能耐久度恢复"), EnhanceFishRod UMETA(DisplayName = "增强鱼竿", ToolTip = "使鱼竿上海增加"), - EnhanceSkill UMETA(DisplayName = "增强技能", ToolTip = "增强指定的技能数值") + EnhanceSkill UMETA(DisplayName = "增强技能", ToolTip = "增强指定的技能数值"), + DamageReduce UMETA(DisplayName = "减伤", ToolTip = "减少所受的伤害"), }; //技能对象类型 diff --git a/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp b/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp index d06b4cd..f4aae2e 100644 --- a/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp +++ b/ProjectFish/Source/ProjectFish/PawnWithSkill.cpp @@ -13,7 +13,15 @@ APawnWithSkill::APawnWithSkill() void APawnWithSkill::ApplyyEndurance_Implementation(float enduranceOffset) { + if (enduranceOffset < 0) + { + //受到伤害 + OnReceiveDamage.Broadcast(); + //受到的伤害最低为1点 + enduranceOffset = FMath::Min(-1, enduranceOffset + DamageReduce); + } CurrentEndurance += enduranceOffset;; + } void APawnWithSkill::ApplyyTenacity_Implementation(float tenacityOffset) @@ -21,6 +29,11 @@ void APawnWithSkill::ApplyyTenacity_Implementation(float tenacityOffset) CurrentTenacity += tenacityOffset; } +void APawnWithSkill::SetDamageReduce(int32 damageReduce) +{ + DamageReduce = damageReduce; +} + // Called when the game starts or when spawned void APawnWithSkill::BeginPlay() { diff --git a/ProjectFish/Source/ProjectFish/PawnWithSkill.h b/ProjectFish/Source/ProjectFish/PawnWithSkill.h index 43d3303..e2ffe73 100644 --- a/ProjectFish/Source/ProjectFish/PawnWithSkill.h +++ b/ProjectFish/Source/ProjectFish/PawnWithSkill.h @@ -6,6 +6,7 @@ #include "GameFramework/Pawn.h" #include "PawnWithSkill.generated.h" +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnReceiveDamage); UCLASS() class PROJECTFISH_API APawnWithSkill : public APawn { @@ -18,6 +19,8 @@ public: void ApplyyEndurance(float enduranceOffset); UFUNCTION(BlueprintCallable, BlueprintNativeEvent) void ApplyyTenacity(float tenacityOffset); + + void SetDamageReduce(int32 damageReduce); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; @@ -31,6 +34,9 @@ public: UPROPERTY(BlueprintReadWrite, meta = (ToolTip = "当前耐久度")) float CurrentEndurance; + + UPROPERTY(BlueprintReadWrite, meta = (ToolTip = "减伤值")) + float DamageReduce; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "最大耐久度")) float MaxEndurance; @@ -43,5 +49,8 @@ public: UPROPERTY(BlueprintReadWrite, EditAnywhere, Category= Default, meta = (DisplayPriority = 0, ToolTip = "韧性归零时眩晕时长")) float TenacityStun_Time = 5; + + UPROPERTY(BlueprintAssignable) + FOnReceiveDamage OnReceiveDamage; }; diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp index 39c7161..76ace1e 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp @@ -6,6 +6,7 @@ #include "SkillTrigger.h" #include "SkillEffects/SkillEffect_Charge.h" #include "SkillEffects/SkillEffect_Damage.h" +#include "SkillEffects/SkillEffect_DamageReduce.h" #include "SkillEffects/SkillEffect_EnhanceFishRod.h" #include "SkillEffects/SkillEffect_EnhanceSkill.h" #include "SkillEffects/SkillEffect_Heal.h" @@ -50,6 +51,9 @@ void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkil 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))) @@ -77,7 +81,7 @@ void USkill::InitSkillTrigger() } else { - UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能,直接触发")); + //UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能,直接触发")); ExecuteSkill(); } } @@ -100,9 +104,12 @@ void USkill::TickSkill(float deltaTime) } if (RemainingEndurance == 0) { + FSkillContext context; + context.OwnerSkill = this; + context.SkillManager = SkillManager; for (auto Effect: SkillEffects) { - Effect->EffectEnded(); + Effect->EffectEnded(context); } } } diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp index 9a64fb1..b895bf8 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp @@ -41,7 +41,7 @@ void USkillEffect::Execute(const FSkillContext& context) , *( GetSkillEffectDes())); } -void USkillEffect::EffectEnded() +void USkillEffect::EffectEnded(const FSkillContext& context) { } diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h index 87bd62f..f8ec002 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.h @@ -18,7 +18,7 @@ class USkillEffect : public UObject public: void InitSkillEffect(class USkill* skill, FSkillEffectData data); virtual void Execute(const FSkillContext& context) ; - virtual void EffectEnded(); + virtual void EffectEnded(const FSkillContext& context); TArray GetApplyTargets(const FSkillContext& context); UFUNCTION(BlueprintPure) diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp new file mode 100644 index 0000000..8a91a47 --- /dev/null +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.cpp @@ -0,0 +1,49 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "SkillEffect_DamageReduce.h" + +#include "ProjectFish/Skill/Skill.h" + +void USkillEffect_DamageReduce::Execute(const FSkillContext& context) +{ + Super::Execute(context); + TArray targets = GetApplyTargets(context); + for (auto target: targets) + { + if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) + { + UE_LOG(LogTemp, Error, TEXT("skill %s apply target is not a pawn "), *(OwnerSkill->GetSkillName())); + } + else + { + //设置目标护盾值 + APawnWithSkill* OwnerPawn = Cast(target); + OwnerPawn->SetDamageReduce( (int32)(effectData.EffectValue)); + } + } +} + +void USkillEffect_DamageReduce::EffectEnded(const FSkillContext& context) +{ + Super::EffectEnded(context); + TArray targets = GetApplyTargets(context); + for (auto target: targets) + { + if (!target->GetClass()->IsChildOf(APawnWithSkill::StaticClass())) + { + UE_LOG(LogTemp, Error, TEXT("skill %s apply target is not a pawn "), *(OwnerSkill->GetSkillName())); + } + else + { + //恢复目标护盾值 + APawnWithSkill* OwnerPawn = Cast(target); + OwnerPawn->SetDamageReduce(0); + } + } +} + +FString USkillEffect_DamageReduce::GetSkillEffectDes() +{ + return FString::Printf(TEXT("减少目标受到的伤害 %d点"), (int32)(effectData.EffectValue)); +} diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.h b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.h new file mode 100644 index 0000000..c05414c --- /dev/null +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_DamageReduce.h @@ -0,0 +1,20 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "ProjectFish/Skill/SkillEffect.h" +#include "SkillEffect_DamageReduce.generated.h" + +/** + * + */ +UCLASS() +class PROJECTFISH_API USkillEffect_DamageReduce : public USkillEffect +{ + GENERATED_BODY() +public: + void Execute(const FSkillContext& context) override; + void EffectEnded(const FSkillContext& context) override; + FString GetSkillEffectDes() override; +}; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp index 571fb9d..f593203 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.cpp @@ -36,9 +36,9 @@ void USkillEffect_ModifySpeed::Execute(const FSkillContext& context) } } -void USkillEffect_ModifySpeed::EffectEnded() +void USkillEffect_ModifySpeed::EffectEnded(const FSkillContext& context) { - Super::EffectEnded(); + Super::EffectEnded(context); //GetWorld()->GetTimerManager().ClearTimer(TimerHandle); } diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.h b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.h index 7f549c0..1c84203 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffects/SkillEffect_ModifySpeed.h @@ -17,7 +17,7 @@ class PROJECTFISH_API USkillEffect_ModifySpeed : public USkillEffect GENERATED_BODY() public: void Execute(const FSkillContext& context) override; - void EffectEnded() override; + void EffectEnded(const FSkillContext& context) override; FString GetSkillEffectDes() override; private: FTimerHandle TimerHandle;