diff --git a/Content/Blueprints/Character/BP_BlasterCharacter.uasset b/Content/Blueprints/Character/BP_BlasterCharacter.uasset index 5f6e8cd..7bb574b 100644 Binary files a/Content/Blueprints/Character/BP_BlasterCharacter.uasset and b/Content/Blueprints/Character/BP_BlasterCharacter.uasset differ diff --git a/Content/Maps/BlasterMap.umap b/Content/Maps/BlasterMap.umap index fac04cc..f09713c 100644 Binary files a/Content/Maps/BlasterMap.umap and b/Content/Maps/BlasterMap.umap differ diff --git a/Source/Blaster/Blaster.h b/Source/Blaster/Blaster.h index 2f59b81..8b48f21 100644 --- a/Source/Blaster/Blaster.h +++ b/Source/Blaster/Blaster.h @@ -5,4 +5,5 @@ #include "CoreMinimal.h" #define ECC_SkeletalMesh ECC_GameTraceChannel1 +#define ECC_HitBox ECC_GameTraceChannel2 diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 061a8e4..9c48be9 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -72,93 +72,86 @@ ABlasterCharacter::ABlasterCharacter() head = CreateDefaultSubobject(TEXT("head")); head->SetupAttachment(GetMesh(), FName("head")); - head->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("head"), head); pelvis = CreateDefaultSubobject(TEXT("pelvis")); pelvis->SetupAttachment(GetMesh(), FName("pelvis")); - pelvis->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("pelvis"), pelvis); spine_02 = CreateDefaultSubobject(TEXT("spine_02")); spine_02->SetupAttachment(GetMesh(), FName("spine_02")); - spine_02->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("spine_02"), spine_02); spine_03 = CreateDefaultSubobject(TEXT("spine_03")); spine_03->SetupAttachment(GetMesh(), FName("spine_03")); - spine_03->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("spine_03"), spine_03); upperarm_l = CreateDefaultSubobject(TEXT("upperarm_l")); upperarm_l->SetupAttachment(GetMesh(), FName("upperarm_l")); - upperarm_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("upperarm_l"), upperarm_l); upperarm_r = CreateDefaultSubobject(TEXT("upperarm_r")); upperarm_r->SetupAttachment(GetMesh(), FName("upperarm_r")); - upperarm_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("upperarm_r"), upperarm_r); lowerarm_l = CreateDefaultSubobject(TEXT("lowerarm_l")); lowerarm_l->SetupAttachment(GetMesh(), FName("lowerarm_l")); - lowerarm_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("lowerarm_l"), lowerarm_l); lowerarm_r = CreateDefaultSubobject(TEXT("lowerarm_r")); lowerarm_r->SetupAttachment(GetMesh(), FName("lowerarm_r")); - lowerarm_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("lowerarm_r"), lowerarm_r); hand_l = CreateDefaultSubobject(TEXT("hand_l")); hand_l->SetupAttachment(GetMesh(), FName("hand_l")); - hand_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("hand_l"), hand_l); hand_r = CreateDefaultSubobject(TEXT("hand_r")); hand_r->SetupAttachment(GetMesh(), FName("hand_r")); - hand_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("hand_r"), hand_r); backpack = CreateDefaultSubobject(TEXT("backpack")); backpack->SetupAttachment(GetMesh(), FName("backpack")); - backpack->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("backpack"), backpack); blanket = CreateDefaultSubobject(TEXT("blanket")); blanket->SetupAttachment(GetMesh(), FName("backpack")); - blanket->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("blanket"), blanket); thigh_l = CreateDefaultSubobject(TEXT("thigh_l")); thigh_l->SetupAttachment(GetMesh(), FName("thigh_l")); - thigh_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("thigh_l"), thigh_l); thigh_r = CreateDefaultSubobject(TEXT("thigh_r")); thigh_r->SetupAttachment(GetMesh(), FName("thigh_r")); - thigh_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("thigh_r"), thigh_r); calf_l = CreateDefaultSubobject(TEXT("calf_l")); calf_l->SetupAttachment(GetMesh(), FName("calf_l")); - calf_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("calf_l"), calf_l); calf_r = CreateDefaultSubobject(TEXT("calf_r")); calf_r->SetupAttachment(GetMesh(), FName("calf_r")); - calf_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("calf_r"), calf_r); foot_l = CreateDefaultSubobject(TEXT("foot_l")); foot_l->SetupAttachment(GetMesh(), FName("foot_l")); - foot_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("foot_l"), foot_l); foot_r = CreateDefaultSubobject(TEXT("foot_r")); foot_r->SetupAttachment(GetMesh(), FName("foot_r")); - foot_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); HitCollisionBoxes.Add(FName("foot_r"), foot_r); + + for (auto Box : HitCollisionBoxes) + { + if (Box.Value) + { + Box.Value->SetCollisionObjectType(ECC_HitBox); + Box.Value->SetCollisionResponseToAllChannels(ECR_Ignore); + Box.Value->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block); + Box.Value->SetCollisionEnabled(ECollisionEnabled::NoCollision); + } + } } void ABlasterCharacter::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const diff --git a/Source/Blaster/Components/LagCompensationComponent.cpp b/Source/Blaster/Components/LagCompensationComponent.cpp index 331b2ed..b5397fb 100644 --- a/Source/Blaster/Components/LagCompensationComponent.cpp +++ b/Source/Blaster/Components/LagCompensationComponent.cpp @@ -3,6 +3,7 @@ #include "LagCompensationComponent.h" +#include "Blaster/Blaster.h" #include "Blaster/Weapon/Weapon.h" #include "Components/BoxComponent.h" #include "Kismet/GameplayStatics.h" @@ -145,7 +146,7 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag // Enable collision for the head first UBoxComponent* HeadBox = HitCharacter->HitCollisionBoxes[FName("head")]; HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); + HeadBox->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block); const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f; UWorld* World = GetWorld(); @@ -156,11 +157,19 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag ConfirmHitResult, TraceStart, TraceEnd, - ECC_Visibility + ECC_HitBox ); if (ConfirmHitResult.bBlockingHit) // we hit the head, return early { + if (ConfirmHitResult.Component.IsValid()) + { + UBoxComponent* Box = Cast(ConfirmHitResult.Component); + if (Box) + { + DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Red, false, 8.f); + } + } ResetHitBoxes(HitCharacter, CurrentFrame); EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics); return FServerSideRewindResult{ true, true }; @@ -172,7 +181,7 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag if (HitBoxPair.Value != nullptr) { HitBoxPair.Value->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - HitBoxPair.Value->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); + HitBoxPair.Value->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block); } } @@ -180,11 +189,19 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag ConfirmHitResult, TraceStart, TraceEnd, - ECC_Visibility + ECC_HitBox ); if (ConfirmHitResult.bBlockingHit) { + if (ConfirmHitResult.Component.IsValid()) + { + UBoxComponent* Box = Cast(ConfirmHitResult.Component); + if (Box) + { + DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Blue, false, 8.f); + } + } ResetHitBoxes(HitCharacter, CurrentFrame); EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics); return FServerSideRewindResult{ true, false }; @@ -223,7 +240,7 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons // Enable collision for the head first UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")]; HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); + HeadBox->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block); } UWorld* World = GetWorld(); @@ -239,12 +256,20 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons ConfirmHitResult, TraceStart, TraceEnd, - ECC_Visibility + ECC_HitBox ); ABlasterCharacter* BlasterCharacter = Cast(ConfirmHitResult.GetActor()); if (BlasterCharacter) { + if (ConfirmHitResult.Component.IsValid()) + { + UBoxComponent* Box = Cast(ConfirmHitResult.Component); + if (Box) + { + DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Red, false, 8.f); + } + } if (ShotgunResult.Headshots.Contains(BlasterCharacter)) { ShotgunResult.Headshots[BlasterCharacter]++; @@ -265,7 +290,7 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons if (HitBoxPair.Value != nullptr) { HitBoxPair.Value->SetCollisionEnabled(ECollisionEnabled::QueryOnly); - HitBoxPair.Value->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); + HitBoxPair.Value->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block); } } UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")]; @@ -283,12 +308,20 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons ConfirmHitResult, TraceStart, TraceEnd, - ECC_Visibility + ECC_HitBox ); ABlasterCharacter* BlasterCharacter = Cast(ConfirmHitResult.GetActor()); if (BlasterCharacter) { + if (ConfirmHitResult.Component.IsValid()) + { + UBoxComponent* Box = Cast(ConfirmHitResult.Component); + if (Box) + { + DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Blue, false, 8.f); + } + } if (ShotgunResult.BodyShots.Contains(BlasterCharacter)) { ShotgunResult.BodyShots[BlasterCharacter]++;