From 7ae5c1f3493f1214744ee7838670b982625c8218 Mon Sep 17 00:00:00 2001 From: PHILIP WHITE Date: Fri, 15 Mar 2024 10:45:11 +0000 Subject: [PATCH] Update AI for Hit Location Damage, Dynamic Crosshair & Hit Markers --- EndlessVendetta/Config/DefaultEngine.ini | 1 + .../Basic/BP_BasicEnemyCharacterSwat.uasset | 4 +-- .../Content/Assets/Crosshair/Crosshair.uasset | 3 +++ .../Assets/Crosshair/CrosshairDot.uasset | 3 +++ .../Crosshair/CrosshairHitMarker.uasset | 3 +++ .../Blueprints/BP_MainCharacter.uasset | 4 +-- .../Blueprints/WBP_Crosshair.uasset | 4 +-- EndlessVendetta/Content/Levels/AITest.umap | 4 +-- .../AITest/4/DF/EI4FFQ2STMC3TRHBQOUNH5.uasset | 3 --- .../AITest/B/8N/O8PP5KE5USY7FTAE75J65R.uasset | 4 +-- .../AITest/B/O6/IM2ZR0FZ5KH20UIRPAQT2P.uasset | 2 +- .../AITest/E/4D/8WWZ3L89CIZXU8SGZKVRZ7.uasset | 3 +++ .../EndlessVendetta/AI/AI_RestrictedZone.cpp | 1 + .../EndlessVendettaCharacter.cpp | 5 ++++ .../EndlessVendettaCharacter.h | 7 +++++ .../WeaponSystem/BaseWeaponClass.cpp | 27 ++++++++++++++++--- 16 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 EndlessVendetta/Content/Assets/Crosshair/Crosshair.uasset create mode 100644 EndlessVendetta/Content/Assets/Crosshair/CrosshairDot.uasset create mode 100644 EndlessVendetta/Content/Assets/Crosshair/CrosshairHitMarker.uasset delete mode 100644 EndlessVendetta/Content/__ExternalActors__/Levels/AITest/4/DF/EI4FFQ2STMC3TRHBQOUNH5.uasset create mode 100644 EndlessVendetta/Content/__ExternalActors__/Levels/AITest/E/4D/8WWZ3L89CIZXU8SGZKVRZ7.uasset diff --git a/EndlessVendetta/Config/DefaultEngine.ini b/EndlessVendetta/Config/DefaultEngine.ini index f5b83756..8f502a71 100644 --- a/EndlessVendetta/Config/DefaultEngine.ini +++ b/EndlessVendetta/Config/DefaultEngine.ini @@ -40,6 +40,7 @@ +DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="Projectile") +DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="Waypoint") +DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False,Name="Player") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="Enemy") +EditProfiles=(Name="Trigger",CustomResponses=((Channel="Projectile",Response=ECR_Ignore))) -ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall") -ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn") diff --git a/EndlessVendetta/Content/AI/Enemy/Basic/BP_BasicEnemyCharacterSwat.uasset b/EndlessVendetta/Content/AI/Enemy/Basic/BP_BasicEnemyCharacterSwat.uasset index 361d0d40..222940e8 100644 --- a/EndlessVendetta/Content/AI/Enemy/Basic/BP_BasicEnemyCharacterSwat.uasset +++ b/EndlessVendetta/Content/AI/Enemy/Basic/BP_BasicEnemyCharacterSwat.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d35b41342c9550d5e5b4956552eb99ff17a3f4f2eed7857336d19966d87d99cb -size 184178 +oid sha256:1902cd971a6a15731d4b924f40519e2db262aa0a0ba32d02c4cf96f3adf42eca +size 184766 diff --git a/EndlessVendetta/Content/Assets/Crosshair/Crosshair.uasset b/EndlessVendetta/Content/Assets/Crosshair/Crosshair.uasset new file mode 100644 index 00000000..fd4a2e9a --- /dev/null +++ b/EndlessVendetta/Content/Assets/Crosshair/Crosshair.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3a005b7a9d58a6003d65cf2cab91b1eed03ade1440cc94f4f9c0c55e1e6b804 +size 26220 diff --git a/EndlessVendetta/Content/Assets/Crosshair/CrosshairDot.uasset b/EndlessVendetta/Content/Assets/Crosshair/CrosshairDot.uasset new file mode 100644 index 00000000..669d6a66 --- /dev/null +++ b/EndlessVendetta/Content/Assets/Crosshair/CrosshairDot.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3459c0519287a997f4c12ac906dd5f1c1d8e887806145657fcadb6d5d362ba8 +size 11532 diff --git a/EndlessVendetta/Content/Assets/Crosshair/CrosshairHitMarker.uasset b/EndlessVendetta/Content/Assets/Crosshair/CrosshairHitMarker.uasset new file mode 100644 index 00000000..d66886d0 --- /dev/null +++ b/EndlessVendetta/Content/Assets/Crosshair/CrosshairHitMarker.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff3b7ac42fabdc49f0ae8381a92823880da4e173bd1a67ba4db1de231ec5c4d8 +size 10885 diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/BP_MainCharacter.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/BP_MainCharacter.uasset index 137085e9..d5048f8b 100644 --- a/EndlessVendetta/Content/FirstPerson/Blueprints/BP_MainCharacter.uasset +++ b/EndlessVendetta/Content/FirstPerson/Blueprints/BP_MainCharacter.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7cf31dce784cf4ea992e77a94716d6163d618793fdec437d2b71c3fc26aa84f0 -size 1409388 +oid sha256:ae3dbf1aff7aa519cf442fc8ea57a843906803d1b370e1faf2f026a957aeae0a +size 1433603 diff --git a/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset b/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset index 4733d876..73e88203 100644 --- a/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset +++ b/EndlessVendetta/Content/FirstPerson/Blueprints/WBP_Crosshair.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e63da0bec22702c2595b0f18fcde7736c09338b1942964a304b7c40be4501f8 -size 140987 +oid sha256:2573f2e4d010431f1c923db033de819902b64bbeb4afb18081e9f36366c50b1d +size 216403 diff --git a/EndlessVendetta/Content/Levels/AITest.umap b/EndlessVendetta/Content/Levels/AITest.umap index 24f16649..76be3d13 100644 --- a/EndlessVendetta/Content/Levels/AITest.umap +++ b/EndlessVendetta/Content/Levels/AITest.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6199dd5f44070f4b738417f446127c0bdcf9884777285fdfce837fb67526936f -size 19354 +oid sha256:2ff6a75d2f29758748a6579991024118b4563c18f31d9c194ca16f998ade28cd +size 19409 diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/4/DF/EI4FFQ2STMC3TRHBQOUNH5.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/4/DF/EI4FFQ2STMC3TRHBQOUNH5.uasset deleted file mode 100644 index 900fb210..00000000 --- a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/4/DF/EI4FFQ2STMC3TRHBQOUNH5.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5885a7e31d81ffba0a3bf28ab1a637cdffd3c5147759edb8c13315524369eee6 -size 123293 diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/8N/O8PP5KE5USY7FTAE75J65R.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/8N/O8PP5KE5USY7FTAE75J65R.uasset index c1e62052..552e69ee 100644 --- a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/8N/O8PP5KE5USY7FTAE75J65R.uasset +++ b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/8N/O8PP5KE5USY7FTAE75J65R.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2ec8c02c25733c7a4a32c82f2d0e412cc84745c4400caf98507101420f833b0a -size 6554 +oid sha256:c4f4c10bc59ca71466d059379eb9f408e44a6adcea32a45cb197159734755db9 +size 7782 diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/O6/IM2ZR0FZ5KH20UIRPAQT2P.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/O6/IM2ZR0FZ5KH20UIRPAQT2P.uasset index 66fd1c98..e6635d8c 100644 --- a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/O6/IM2ZR0FZ5KH20UIRPAQT2P.uasset +++ b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/B/O6/IM2ZR0FZ5KH20UIRPAQT2P.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:32471663a90c365b24ba1d0f9625c4b79cb785c7fd0f036d09549079e6e77345 +oid sha256:b173eab6ce147e6e1c8e485f0f4910017efe9a7e0849351a9c39f6702cf4464d size 6568 diff --git a/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/E/4D/8WWZ3L89CIZXU8SGZKVRZ7.uasset b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/E/4D/8WWZ3L89CIZXU8SGZKVRZ7.uasset new file mode 100644 index 00000000..69a8f9f3 --- /dev/null +++ b/EndlessVendetta/Content/__ExternalActors__/Levels/AITest/E/4D/8WWZ3L89CIZXU8SGZKVRZ7.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5db3dd5b6d6946edd334b4576d796d3c1cc60900875a9f2031e6000de5badd1a +size 6574 diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/AI_RestrictedZone.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/AI_RestrictedZone.cpp index 7780b46a..de23fdad 100644 --- a/EndlessVendetta/Source/EndlessVendetta/AI/AI_RestrictedZone.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/AI/AI_RestrictedZone.cpp @@ -12,6 +12,7 @@ AAI_RestrictedZone::AAI_RestrictedZone() // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; BoxCollision = CreateDefaultSubobject(TEXT("BoxCollision")); + BoxCollision->SetCollisionResponseToChannel(ECC_EngineTraceChannel4, ECR_Overlap); } // Called when the game starts or when spawned diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp index 516f4f6a..e3920d92 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp @@ -70,6 +70,11 @@ void AEndlessVendettaCharacter::SetOverlayState(const EOverlayState OverlayState SetOverlayStateEvent.Broadcast(OverlayState); } +void AEndlessVendettaCharacter::SuccessfulHit(const bool bIsHeadshot) const +{ + SuccessfulHitEvent.Broadcast(bIsHeadshot); +} + void AEndlessVendettaCharacter::BeginPlay() { // Call the base class diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h index 01cc7651..27d10ec3 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h @@ -171,6 +171,13 @@ public: UPROPERTY(BlueprintAssignable, Category = "Restricted Area") FRestrictedAreaStatusChangedSignature RestrictedAreaStatusChanged; + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSuccessfulHitEvent, bool, bIsHeadshot); + + UPROPERTY(BlueprintAssignable, Category = "Weapons") + FSuccessfulHitEvent SuccessfulHitEvent; + + void SuccessfulHit(bool bIsHeadshot) const; + protected: virtual void BeginPlay() override; virtual void Tick(float DeltaTime) override; diff --git a/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp b/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp index f95e7714..d9eef0e5 100644 --- a/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp @@ -179,7 +179,11 @@ void ABaseWeaponClass::Fire() traceStart = Cast(GetComponentByClass(USkeletalMeshComponent::StaticClass()))->GetSocketLocation("Muzzle"); traceEnd = traceStart + Cast(GetWorld()->GetFirstPlayerController()->GetPawn())->GetFirstPersonCameraComponent()->GetForwardVector() * BulletDistance; if (GetWorldTimerManager().IsTimerActive(timerHandle)) return; - GetWorld()->LineTraceSingleByChannel(outHit, traceStart, traceEnd, ECC_Visibility, collisionParams); + FCollisionObjectQueryParams ObjectQueryParams; + ObjectQueryParams.AddObjectTypesToQuery(ECC_Pawn); + ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldStatic); + ObjectQueryParams.AddObjectTypesToQuery(ECC_WorldDynamic); + GetWorld()->LineTraceSingleByObjectType(outHit, traceStart, traceEnd, ObjectQueryParams, collisionParams); WeaponFired.Broadcast(); playerControllerRef->PlayerCameraManager->StartCameraShake(CameraShakeClass, 1); currentAmmoCount -= 1; @@ -197,9 +201,24 @@ void ABaseWeaponClass::Fire() { tempWeaponDamage = WeaponDamage; } - if (ATargetDummy* TargetDummy = Cast(outHit.GetActor())) TargetDummy->TargetShot(); - if (!Cast(outHit.GetActor())) return; - Cast(outHit.GetActor())->TakeDamage(tempWeaponDamage, FPointDamageEvent(), GetWorld()->GetFirstPlayerController(), this); + if (Cast(outHit.GetActor())) + { + if (outHit.BoneName.ToString().ToLower() == "head") + { + tempWeaponDamage *= 2; + endlessVendettaChar->SuccessfulHit(true); + } + else + { + endlessVendettaChar->SuccessfulHit(false); + } + Cast(outHit.GetActor())->TakeDamage(tempWeaponDamage, FPointDamageEvent(), GetWorld()->GetFirstPlayerController(), this); + } + if (ATargetDummy* TargetDummy = Cast(outHit.GetActor())) + { + TargetDummy->TargetShot(); + endlessVendettaChar->SuccessfulHit(false); + } } HideNeedReloadUI(); }