From 6f59d664d627a0905bdd0b84d94ce2b461b46b77 Mon Sep 17 00:00:00 2001 From: "PCYPC\\pcy35" Date: Wed, 15 Nov 2023 21:10:23 +0900 Subject: [PATCH] =?UTF-8?q?[=EB=B0=95=EC=B9=98=EC=98=81]=20Shield=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Blueprints/Actor/BP_ToughShield.uasset | Bin 34007 -> 34353 bytes .../SoundFX/Block/BlockImpact_cue.uasset | Bin 0 -> 9037 bytes .../Deflect_InPlace_Anim1_Montage.uasset | Bin 0 -> 13950 bytes .../Heroes/Kwang/Meshes/Kwang_Skeleton.uasset | Bin 54075 -> 54121 bytes Source/D1/Actor/BaseShield.cpp | 26 ++++++ Source/D1/Actor/BaseShield.h | 5 + Source/D1/Actor/BaseWeapon.h | 2 +- Source/D1/CombatPlayerCharacter.cpp | 87 +++++++++++++----- Source/D1/CombatPlayerCharacter.h | 4 + Source/D1/Components/CombatComponent.h | 1 + Source/D1/Definitions/CombatGameplayTags.cpp | 10 ++ Source/D1/Definitions/CombatGameplayTags.h | 2 + 12 files changed, 114 insertions(+), 23 deletions(-) create mode 100644 Content/CombatSystem/CourseFiles/SoundFX/Block/BlockImpact_cue.uasset create mode 100644 Content/ParagonKwang/Animations/Defense/Deflect_InPlace_Anim1_Montage.uasset diff --git a/Content/CombatSystem/Blueprints/Actor/BP_ToughShield.uasset b/Content/CombatSystem/Blueprints/Actor/BP_ToughShield.uasset index 426af099ea7a2745e18bb1c72c6b0d698db52aee..d53242b41c13eae5795a985355bf1f0288f996fc 100644 GIT binary patch delta 5462 zcmd5=U2I&%6`s2|v5g(a&R%2{oBSN&x{<6(ZAw+?gp?9A{2>KI0 zDwAjC?$~aS`DvLD6{M$4A*xBATP?&Ny+Qyxf141m(X(-v5J&ectXuh;P}l5pX;Bl%mo{^6`x|}6s?g%B~Bm09-hNI$#u91Lz z$?=-Ioa+72cxYfpEHW5OMB=eg@zJVhXBUs%@>${jPC{FE2M5Eg2ZJNQ-gs=^$zZIv zb&1>B89pA4jfSD4;ZP!Qf9zm17zzhKX$u^P#}dKbuo!6h`LnXSWYjE0HwexnChtRP_$1>NYpCVCq!1vU zVuHmQYB^B|j98EUM!ZV)laKc&@)xG|mE4HfcauDtvq~)1P?-Zk!$XWGEjFNX5hoe9 zSVQIFO)+k)IJX?55eAeMUDuM|&KtaeuBMiwfrhg@9a%$bk$R&@(GeW&$Ahu}s$z5bbJ zM^jhobY7eY{C$1 z(w{h#DK1B3TjF;4rgLrGUy1%%+9&-sLll!9Wc#8Fn$^;0HdpGJt%PjCK|*q`tf}m% z`$w9OTc}pgsYW`WbQebCrAjBYS|r~wee$fU)B_hIa6(c<&#TH3Vvd*{V0ghe%C%tp znC*MwGT2`)e_7@8uAnMxkD!9G9qp66pH0E|L9q%z5W+W_E(8L;SX)PP1SU;06I{mk$k?#d<&X%bJLpJYqwtw=gkB zAli|ND!SRMs_kLH%t^#lFf)j{+`;v#DT@oc?qFjJYeWq)z$5#bU9{WPBwe|MNj^%n z+f&0-jp`U2B6O|iKnAK;?_+X!xS{v~M(>mh{br5DrF^Vd z9O+t{A-8f_k4N`-BStG<87Ma_Su^i6R3gb^&5M6h+Bfj`93)k;xDE=_ z9Qz?ehh6t(S^CM>7c}>j=qzfYc!&YLGy2zYg$}=(i+Y{=aWdgWz- zSX7#s)s2JPDjz38HI!N&k1&c~7D}+Q_zwoU<72&jhx#JnXpgXLM7`5(R6M9^msW-D zhPXzdxsO2yYn>;*kbyy0I~ETlJHf3sAaW)+dG7fu=X$K7fW!c^0OZ7*m zN(WReX-uxXJ*!fk%h@#}OTGHs1@j9`0$Wcw(zfgH$oMjnx~@jlO2xui#`b8W9l?-15x zo9UGI4mB8^^373Cv0e_A95&4r81i2EvqYP0PP9tLaD(x6#nNY%g@}<4W_a>Ow*KZK zD<3=IPHjG^Fv_3Kd5m`X#E5zP1_At^#jj%Oy%%qdfB5#^A9R*odVTV)w=6k7+Hu`D z-p^4woHvH;a>H1yv6G@~%41^<>vwPlE!M~go3^^i;6HeC!DrWcPKte8VX@B4$M;VB zALZlSrkDFCCg1Hk8|v)+c>Z7YmVE2v_4Bb$TylbMYPy zL=(^aVE+cWYNAWNFj!QfSJ|@tB=Fw_{%A(v^RML3C$N%BCOh)Zt=7AB8sQvUDjuA- z9(o|yViO}{VRgU)SS4Gg+}qRRg1@_gN9KpfAZ8igXxPalZOnW zN*`1r?hI_*8_3i)hGR7x8~hOHV$i`_?;o11W&?gLENg?N>@XcZFU@cI4@go5 AIRF3v delta 5232 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 ZOirIgfB=A$s}n=D&K_k?P(LEz{~ta~zoh^G literal 0 HcmV?d00001 diff --git a/Content/ParagonKwang/Characters/Heroes/Kwang/Meshes/Kwang_Skeleton.uasset b/Content/ParagonKwang/Characters/Heroes/Kwang/Meshes/Kwang_Skeleton.uasset index d3da2f5e3e3d85525511cf4555ccda9bbd90709e..a9f234fcd6feedd4579b8e8f48d291a91bf75a70 100644 GIT binary patch delta 3539 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 z!@<3SetShieldWeapon(nullptr); } + +TArray ABaseShield::GetActionMontage(FGameplayTag characterAction) +{ + TArray outputArr; + + if (FCombatGameplayTags::Get().Character_Action_Attack_Blocking == characterAction) + outputArr = BlockAnimations; + else if (FCombatGameplayTags::Get().Character_Action_Attack_LightAttack == characterAction) + outputArr = LightAttackMontage; + else if (FCombatGameplayTags::Get().Character_Action_Attack_HeavyAttack == characterAction) + outputArr = HeavyAttackMontage; + else if (FCombatGameplayTags::Get().Character_Action_Attack_ChargedAttack == characterAction) + outputArr = ChargedAttackMontage; + else if (FCombatGameplayTags::Get().Character_Action_Attack_FallingAttack == characterAction) + outputArr = FallingAttackMontage; + else if (FCombatGameplayTags::Get().Character_Action_Attack_SprintAttack == characterAction) + outputArr = SprintAttackMontage; + else if (FCombatGameplayTags::Get().Character_Action_Dodge == characterAction) + outputArr = DodgeMontage; + else if (FCombatGameplayTags::Get().Character_Action_EnterCombat == characterAction) + outputArr.Add(EnterCombat); + else if (FCombatGameplayTags::Get().Character_Action_ExitCombat == characterAction) + outputArr.Add(ExitCombat); + + return outputArr; +} diff --git a/Source/D1/Actor/BaseShield.h b/Source/D1/Actor/BaseShield.h index f3e1a1e5..ca15c61a 100644 --- a/Source/D1/Actor/BaseShield.h +++ b/Source/D1/Actor/BaseShield.h @@ -17,4 +17,9 @@ class D1_API ABaseShield : public ABaseWeapon public: virtual void OnEquipped() override; virtual void OnUnequipped() override; + virtual TArray GetActionMontage(FGameplayTag characterAction) override; + +protected: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Montages") + TArray> BlockAnimations; }; diff --git a/Source/D1/Actor/BaseWeapon.h b/Source/D1/Actor/BaseWeapon.h index fe06cc17..e924ebdd 100644 --- a/Source/D1/Actor/BaseWeapon.h +++ b/Source/D1/Actor/BaseWeapon.h @@ -44,7 +44,7 @@ public: virtual void ToggleWeaponCombat(bool EnableCombat); public: - TArray GetActionMontage(FGameplayTag characterAction); + virtual TArray GetActionMontage(FGameplayTag characterAction); protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Initialization") diff --git a/Source/D1/CombatPlayerCharacter.cpp b/Source/D1/CombatPlayerCharacter.cpp index 3fe498dc..73c53924 100644 --- a/Source/D1/CombatPlayerCharacter.cpp +++ b/Source/D1/CombatPlayerCharacter.cpp @@ -188,6 +188,8 @@ void ACombatPlayerCharacter::ResetCombat_Implementation() CombatComponent->ResetAttack(); StateManagerComponent->ResetState(); StateManagerComponent->SetCurrentAction(FGameplayTag::EmptyTag); + if(CanPerformBlock()) + CombatComponent->SetBlockingState(true); } FRotator ACombatPlayerCharacter::GetDesiredRotation_Implementation() @@ -542,6 +544,7 @@ void ACombatPlayerCharacter::ToggleLockOn(const FInputActionValue& Value) void ACombatPlayerCharacter::Blocking(const FInputActionValue& Value) { + bIsBlockPressed = true; if(CanPerformBlock()) { CombatComponent->SetBlockingState(true); @@ -550,6 +553,7 @@ void ACombatPlayerCharacter::Blocking(const FInputActionValue& Value) void ACombatPlayerCharacter::StopBlocking(const FInputActionValue& Value) { + bIsBlockPressed = false; CombatComponent->SetBlockingState(false); } @@ -711,19 +715,26 @@ void ACombatPlayerCharacter::SprintStaminaCost() void ACombatPlayerCharacter::ApplyHitReaction(EDamageType InDamageType) { - switch (InDamageType) + if(WasHitBlocked()) { - case EDamageType::None: - PerformHitStun(); - break; - case EDamageType::MeleeDamage: - PerformHitStun(); - break; - case EDamageType::KnockdownDamage: - PerformKnockdown(); - break; - default: - break; + PerformBlock(); + } + else + { + switch (InDamageType) + { + case EDamageType::None: + PerformHitStun(); + break; + case EDamageType::MeleeDamage: + PerformHitStun(); + break; + case EDamageType::KnockdownDamage: + PerformKnockdown(); + break; + default: + break; + } } } @@ -738,15 +749,18 @@ void ACombatPlayerCharacter::ApplyImpactEffect(EDamageType InDamageType) void ACombatPlayerCharacter::ReceiveDamage(float Damage, const FPointDamageEvent* pointDamageEvent, const UAttackDamageType* damageTypeClass, AController* eventInstigator) { - //스텟 관련 처리 - StatsComponent->TakeDamageOnStat(Damage); - //앞에서 맞았는지 뒤에서 맞았는지 판별 bHitFront = UKismetMathLibrary::InRange_FloatFloat(this->GetDotProductTo(eventInstigator->GetPawn()), -0.1f, 1.f); LastHitInfo = pointDamageEvent->HitInfo; - //play sound, effect - ApplyImpactEffect(damageTypeClass->DamageType); + //공격을 막았을 경우 + if(WasHitBlocked()) + Damage = 0.f; //막았을 때는 데미지 처리안함 + else + ApplyImpactEffect(damageTypeClass->DamageType); //play sound, effect + + //스텟 관련 처리 + StatsComponent->TakeDamageOnStat(Damage); if (CanReceiveHitReaction()) ApplyHitReaction(damageTypeClass->DamageType); @@ -754,15 +768,18 @@ void ACombatPlayerCharacter::ReceiveDamage(float Damage, const FPointDamageEvent void ACombatPlayerCharacter::ReceiveDamage(float Damage, const FRadialDamageEvent* radialDamageEvent, const UAttackDamageType* damageTypeClass, AController* eventInstigator) { - //스텟 관련 처리 - StatsComponent->TakeDamageOnStat(Damage); - //앞에서 맞았는지 뒤에서 맞았는지 판별 bHitFront = UKismetMathLibrary::InRange_FloatFloat(this->GetDotProductTo(eventInstigator->GetPawn()), -0.1f, 1.f); LastHitInfo = radialDamageEvent->ComponentHits[0]; - //play sound, effect - ApplyImpactEffect(damageTypeClass->DamageType); + //공격을 막았을 경우 + if(WasHitBlocked()) + Damage = 0.f; //막았을 때는 데미지 처리안함 + else + ApplyImpactEffect(damageTypeClass->DamageType); //play sound, effect + + //스텟 관련 처리 + StatsComponent->TakeDamageOnStat(Damage); if (CanReceiveHitReaction()) ApplyHitReaction(damageTypeClass->DamageType); @@ -858,6 +875,23 @@ bool ACombatPlayerCharacter::PerformKnockdown() return true; } +bool ACombatPlayerCharacter::PerformBlock() +{ + if(!IsValid(CombatComponent->GetShieldWeapon())) + return false; + TArray hitMontage = CombatComponent->GetShieldWeapon()->GetActionMontage(FCombatGameplayTags::Get().Character_Action_Attack_Blocking); + if(hitMontage.Num() <= 0) + return false; + + int32 indexNum = FMath::RandRange(0, hitMontage.Num() - 1); + if(!hitMontage.IsValidIndex(indexNum)) + return false; + + StateManagerComponent->SetCurrentState(FCombatGameplayTags::Get().Character_State_Blocking); + PlayAnimMontage(hitMontage[indexNum]); + return true; +} + bool ACombatPlayerCharacter::CanPerformToggleCombat() { bool ReturnValue = true; @@ -952,6 +986,7 @@ bool ACombatPlayerCharacter::CanPerformBlock() ReturnValue &= !StateManagerComponent->IsCurrentStateEqualToAny(inputContainer); ReturnValue &= CombatComponent->GetCombatEnabled(); ReturnValue &= IsValid(CombatComponent->GetShieldWeapon()); + ReturnValue &= bIsBlockPressed; //Block Key를 눌렀는가? return ReturnValue; } @@ -970,4 +1005,12 @@ FGameplayTag ACombatPlayerCharacter::GetDesiredAttackType() return FCombatGameplayTags::Get().Character_Action_Attack_LightAttack; } +bool ACombatPlayerCharacter::WasHitBlocked() +{ + if(IsValid(CombatComponent)) + return (CombatComponent->GetIsBlocking() && bHitFront); + else + return false; +} + diff --git a/Source/D1/CombatPlayerCharacter.h b/Source/D1/CombatPlayerCharacter.h index 6aba6ee8..b7ce4f15 100644 --- a/Source/D1/CombatPlayerCharacter.h +++ b/Source/D1/CombatPlayerCharacter.h @@ -184,6 +184,7 @@ private: void PerformDeath(); bool PerformHitStun(); bool PerformKnockdown(); + bool PerformBlock(); protected: //Check Func bool CanPerformToggleCombat(); @@ -194,6 +195,7 @@ protected: //Check Func bool CanPerformSprint(); bool CanPerformBlock(); FGameplayTag GetDesiredAttackType(); + bool WasHitBlocked(); public: UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true")) @@ -235,6 +237,7 @@ public: TObjectPtr KnockdownBackMontage; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Montage|Death", meta = (AllowPrivateAccess = "true")) TArray> DeathAnimations; + private: //Timeline UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Timeline", meta = (AllowPrivateAccess = "true")) @@ -253,6 +256,7 @@ private: bool bCanMove = true; bool bHitFront; bool bEnableIFrame; + bool bIsBlockPressed; FHitResult LastHitInfo; FGameplayTagContainer OwnedGameplayTags; }; diff --git a/Source/D1/Components/CombatComponent.h b/Source/D1/Components/CombatComponent.h index b17de27c..a379e873 100644 --- a/Source/D1/Components/CombatComponent.h +++ b/Source/D1/Components/CombatComponent.h @@ -38,6 +38,7 @@ public: FORCEINLINE int32 GetAttackCount() { return AttackCount; } void SetBlockingState(bool enableBlocking); + FORCEINLINE bool GetIsBlocking() {return bIsBlocking; } FORCEINLINE void SetShieldWeapon(ABaseWeapon* inShield) { EquippedShield = inShield; } FORCEINLINE ABaseWeapon* GetShieldWeapon() { return EquippedShield; } diff --git a/Source/D1/Definitions/CombatGameplayTags.cpp b/Source/D1/Definitions/CombatGameplayTags.cpp index 158d66e7..65ed7175 100644 --- a/Source/D1/Definitions/CombatGameplayTags.cpp +++ b/Source/D1/Definitions/CombatGameplayTags.cpp @@ -32,6 +32,11 @@ void FCombatGameplayTags::InitializeNativeGameplayTags() FString("State Attacking") ); + GameplayTags.Character_State_Blocking = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.State.Blocking"), + FString("State Blocking") + ); + GameplayTags.Character_State_Dead = UGameplayTagsManager::Get().AddNativeGameplayTag( FName("Character.State.Dead"), FString("State Dead") @@ -119,4 +124,9 @@ void FCombatGameplayTags::InitializeNativeGameplayTags() FName("Character.Action.Attack.RareAttack"), FString("Action Attack RareAttack") ); + + GameplayTags.Character_Action_Attack_Blocking = UGameplayTagsManager::Get().AddNativeGameplayTag( + FName("Character.Action.Attack.Blocking"), + FString("Action Attack Blocking") + ); } diff --git a/Source/D1/Definitions/CombatGameplayTags.h b/Source/D1/Definitions/CombatGameplayTags.h index 82a3da82..ecdbe86d 100644 --- a/Source/D1/Definitions/CombatGameplayTags.h +++ b/Source/D1/Definitions/CombatGameplayTags.h @@ -18,6 +18,7 @@ public: //State FGameplayTag Character_State_Attacking; + FGameplayTag Character_State_Blocking; FGameplayTag Character_State_Dead; FGameplayTag Character_State_Disable; FGameplayTag Character_State_Dodging; @@ -37,6 +38,7 @@ public: FGameplayTag Character_Action_Attack_CloseRange; FGameplayTag Character_Action_Attack_MediumRange; FGameplayTag Character_Action_Attack_RareAttack; + FGameplayTag Character_Action_Attack_Blocking; private: static FCombatGameplayTags GameplayTags;