197 - Hit Box Collision Type
This commit is contained in:
parent
fb79d80215
commit
e619252c4c
Binary file not shown.
Binary file not shown.
|
@ -5,4 +5,5 @@
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
#define ECC_SkeletalMesh ECC_GameTraceChannel1
|
#define ECC_SkeletalMesh ECC_GameTraceChannel1
|
||||||
|
#define ECC_HitBox ECC_GameTraceChannel2
|
||||||
|
|
||||||
|
|
|
@ -72,93 +72,86 @@ ABlasterCharacter::ABlasterCharacter()
|
||||||
|
|
||||||
head = CreateDefaultSubobject<UBoxComponent>(TEXT("head"));
|
head = CreateDefaultSubobject<UBoxComponent>(TEXT("head"));
|
||||||
head->SetupAttachment(GetMesh(), FName("head"));
|
head->SetupAttachment(GetMesh(), FName("head"));
|
||||||
head->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("head"), head);
|
HitCollisionBoxes.Add(FName("head"), head);
|
||||||
|
|
||||||
pelvis = CreateDefaultSubobject<UBoxComponent>(TEXT("pelvis"));
|
pelvis = CreateDefaultSubobject<UBoxComponent>(TEXT("pelvis"));
|
||||||
pelvis->SetupAttachment(GetMesh(), FName("pelvis"));
|
pelvis->SetupAttachment(GetMesh(), FName("pelvis"));
|
||||||
pelvis->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("pelvis"), pelvis);
|
HitCollisionBoxes.Add(FName("pelvis"), pelvis);
|
||||||
|
|
||||||
spine_02 = CreateDefaultSubobject<UBoxComponent>(TEXT("spine_02"));
|
spine_02 = CreateDefaultSubobject<UBoxComponent>(TEXT("spine_02"));
|
||||||
spine_02->SetupAttachment(GetMesh(), FName("spine_02"));
|
spine_02->SetupAttachment(GetMesh(), FName("spine_02"));
|
||||||
spine_02->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("spine_02"), spine_02);
|
HitCollisionBoxes.Add(FName("spine_02"), spine_02);
|
||||||
|
|
||||||
spine_03 = CreateDefaultSubobject<UBoxComponent>(TEXT("spine_03"));
|
spine_03 = CreateDefaultSubobject<UBoxComponent>(TEXT("spine_03"));
|
||||||
spine_03->SetupAttachment(GetMesh(), FName("spine_03"));
|
spine_03->SetupAttachment(GetMesh(), FName("spine_03"));
|
||||||
spine_03->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("spine_03"), spine_03);
|
HitCollisionBoxes.Add(FName("spine_03"), spine_03);
|
||||||
|
|
||||||
upperarm_l = CreateDefaultSubobject<UBoxComponent>(TEXT("upperarm_l"));
|
upperarm_l = CreateDefaultSubobject<UBoxComponent>(TEXT("upperarm_l"));
|
||||||
upperarm_l->SetupAttachment(GetMesh(), FName("upperarm_l"));
|
upperarm_l->SetupAttachment(GetMesh(), FName("upperarm_l"));
|
||||||
upperarm_l->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("upperarm_l"), upperarm_l);
|
HitCollisionBoxes.Add(FName("upperarm_l"), upperarm_l);
|
||||||
|
|
||||||
upperarm_r = CreateDefaultSubobject<UBoxComponent>(TEXT("upperarm_r"));
|
upperarm_r = CreateDefaultSubobject<UBoxComponent>(TEXT("upperarm_r"));
|
||||||
upperarm_r->SetupAttachment(GetMesh(), FName("upperarm_r"));
|
upperarm_r->SetupAttachment(GetMesh(), FName("upperarm_r"));
|
||||||
upperarm_r->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("upperarm_r"), upperarm_r);
|
HitCollisionBoxes.Add(FName("upperarm_r"), upperarm_r);
|
||||||
|
|
||||||
lowerarm_l = CreateDefaultSubobject<UBoxComponent>(TEXT("lowerarm_l"));
|
lowerarm_l = CreateDefaultSubobject<UBoxComponent>(TEXT("lowerarm_l"));
|
||||||
lowerarm_l->SetupAttachment(GetMesh(), FName("lowerarm_l"));
|
lowerarm_l->SetupAttachment(GetMesh(), FName("lowerarm_l"));
|
||||||
lowerarm_l->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("lowerarm_l"), lowerarm_l);
|
HitCollisionBoxes.Add(FName("lowerarm_l"), lowerarm_l);
|
||||||
|
|
||||||
lowerarm_r = CreateDefaultSubobject<UBoxComponent>(TEXT("lowerarm_r"));
|
lowerarm_r = CreateDefaultSubobject<UBoxComponent>(TEXT("lowerarm_r"));
|
||||||
lowerarm_r->SetupAttachment(GetMesh(), FName("lowerarm_r"));
|
lowerarm_r->SetupAttachment(GetMesh(), FName("lowerarm_r"));
|
||||||
lowerarm_r->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("lowerarm_r"), lowerarm_r);
|
HitCollisionBoxes.Add(FName("lowerarm_r"), lowerarm_r);
|
||||||
|
|
||||||
hand_l = CreateDefaultSubobject<UBoxComponent>(TEXT("hand_l"));
|
hand_l = CreateDefaultSubobject<UBoxComponent>(TEXT("hand_l"));
|
||||||
hand_l->SetupAttachment(GetMesh(), FName("hand_l"));
|
hand_l->SetupAttachment(GetMesh(), FName("hand_l"));
|
||||||
hand_l->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("hand_l"), hand_l);
|
HitCollisionBoxes.Add(FName("hand_l"), hand_l);
|
||||||
|
|
||||||
hand_r = CreateDefaultSubobject<UBoxComponent>(TEXT("hand_r"));
|
hand_r = CreateDefaultSubobject<UBoxComponent>(TEXT("hand_r"));
|
||||||
hand_r->SetupAttachment(GetMesh(), FName("hand_r"));
|
hand_r->SetupAttachment(GetMesh(), FName("hand_r"));
|
||||||
hand_r->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("hand_r"), hand_r);
|
HitCollisionBoxes.Add(FName("hand_r"), hand_r);
|
||||||
|
|
||||||
backpack = CreateDefaultSubobject<UBoxComponent>(TEXT("backpack"));
|
backpack = CreateDefaultSubobject<UBoxComponent>(TEXT("backpack"));
|
||||||
backpack->SetupAttachment(GetMesh(), FName("backpack"));
|
backpack->SetupAttachment(GetMesh(), FName("backpack"));
|
||||||
backpack->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("backpack"), backpack);
|
HitCollisionBoxes.Add(FName("backpack"), backpack);
|
||||||
|
|
||||||
blanket = CreateDefaultSubobject<UBoxComponent>(TEXT("blanket"));
|
blanket = CreateDefaultSubobject<UBoxComponent>(TEXT("blanket"));
|
||||||
blanket->SetupAttachment(GetMesh(), FName("backpack"));
|
blanket->SetupAttachment(GetMesh(), FName("backpack"));
|
||||||
blanket->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("blanket"), blanket);
|
HitCollisionBoxes.Add(FName("blanket"), blanket);
|
||||||
|
|
||||||
thigh_l = CreateDefaultSubobject<UBoxComponent>(TEXT("thigh_l"));
|
thigh_l = CreateDefaultSubobject<UBoxComponent>(TEXT("thigh_l"));
|
||||||
thigh_l->SetupAttachment(GetMesh(), FName("thigh_l"));
|
thigh_l->SetupAttachment(GetMesh(), FName("thigh_l"));
|
||||||
thigh_l->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("thigh_l"), thigh_l);
|
HitCollisionBoxes.Add(FName("thigh_l"), thigh_l);
|
||||||
|
|
||||||
thigh_r = CreateDefaultSubobject<UBoxComponent>(TEXT("thigh_r"));
|
thigh_r = CreateDefaultSubobject<UBoxComponent>(TEXT("thigh_r"));
|
||||||
thigh_r->SetupAttachment(GetMesh(), FName("thigh_r"));
|
thigh_r->SetupAttachment(GetMesh(), FName("thigh_r"));
|
||||||
thigh_r->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("thigh_r"), thigh_r);
|
HitCollisionBoxes.Add(FName("thigh_r"), thigh_r);
|
||||||
|
|
||||||
calf_l = CreateDefaultSubobject<UBoxComponent>(TEXT("calf_l"));
|
calf_l = CreateDefaultSubobject<UBoxComponent>(TEXT("calf_l"));
|
||||||
calf_l->SetupAttachment(GetMesh(), FName("calf_l"));
|
calf_l->SetupAttachment(GetMesh(), FName("calf_l"));
|
||||||
calf_l->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("calf_l"), calf_l);
|
HitCollisionBoxes.Add(FName("calf_l"), calf_l);
|
||||||
|
|
||||||
calf_r = CreateDefaultSubobject<UBoxComponent>(TEXT("calf_r"));
|
calf_r = CreateDefaultSubobject<UBoxComponent>(TEXT("calf_r"));
|
||||||
calf_r->SetupAttachment(GetMesh(), FName("calf_r"));
|
calf_r->SetupAttachment(GetMesh(), FName("calf_r"));
|
||||||
calf_r->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("calf_r"), calf_r);
|
HitCollisionBoxes.Add(FName("calf_r"), calf_r);
|
||||||
|
|
||||||
foot_l = CreateDefaultSubobject<UBoxComponent>(TEXT("foot_l"));
|
foot_l = CreateDefaultSubobject<UBoxComponent>(TEXT("foot_l"));
|
||||||
foot_l->SetupAttachment(GetMesh(), FName("foot_l"));
|
foot_l->SetupAttachment(GetMesh(), FName("foot_l"));
|
||||||
foot_l->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("foot_l"), foot_l);
|
HitCollisionBoxes.Add(FName("foot_l"), foot_l);
|
||||||
|
|
||||||
foot_r = CreateDefaultSubobject<UBoxComponent>(TEXT("foot_r"));
|
foot_r = CreateDefaultSubobject<UBoxComponent>(TEXT("foot_r"));
|
||||||
foot_r->SetupAttachment(GetMesh(), FName("foot_r"));
|
foot_r->SetupAttachment(GetMesh(), FName("foot_r"));
|
||||||
foot_r->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
|
||||||
HitCollisionBoxes.Add(FName("foot_r"), foot_r);
|
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<FLifetimeProperty>& OutLifetimeProps) const
|
void ABlasterCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "LagCompensationComponent.h"
|
#include "LagCompensationComponent.h"
|
||||||
|
|
||||||
|
#include "Blaster/Blaster.h"
|
||||||
#include "Blaster/Weapon/Weapon.h"
|
#include "Blaster/Weapon/Weapon.h"
|
||||||
#include "Components/BoxComponent.h"
|
#include "Components/BoxComponent.h"
|
||||||
#include "Kismet/GameplayStatics.h"
|
#include "Kismet/GameplayStatics.h"
|
||||||
|
@ -145,7 +146,7 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag
|
||||||
// Enable collision for the head first
|
// Enable collision for the head first
|
||||||
UBoxComponent* HeadBox = HitCharacter->HitCollisionBoxes[FName("head")];
|
UBoxComponent* HeadBox = HitCharacter->HitCollisionBoxes[FName("head")];
|
||||||
HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
||||||
HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
|
HeadBox->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block);
|
||||||
|
|
||||||
const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f;
|
const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f;
|
||||||
UWorld* World = GetWorld();
|
UWorld* World = GetWorld();
|
||||||
|
@ -156,11 +157,19 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag
|
||||||
ConfirmHitResult,
|
ConfirmHitResult,
|
||||||
TraceStart,
|
TraceStart,
|
||||||
TraceEnd,
|
TraceEnd,
|
||||||
ECC_Visibility
|
ECC_HitBox
|
||||||
);
|
);
|
||||||
|
|
||||||
if (ConfirmHitResult.bBlockingHit) // we hit the head, return early
|
if (ConfirmHitResult.bBlockingHit) // we hit the head, return early
|
||||||
{
|
{
|
||||||
|
if (ConfirmHitResult.Component.IsValid())
|
||||||
|
{
|
||||||
|
UBoxComponent* Box = Cast<UBoxComponent>(ConfirmHitResult.Component);
|
||||||
|
if (Box)
|
||||||
|
{
|
||||||
|
DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Red, false, 8.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
ResetHitBoxes(HitCharacter, CurrentFrame);
|
ResetHitBoxes(HitCharacter, CurrentFrame);
|
||||||
EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics);
|
EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics);
|
||||||
return FServerSideRewindResult{ true, true };
|
return FServerSideRewindResult{ true, true };
|
||||||
|
@ -172,7 +181,7 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag
|
||||||
if (HitBoxPair.Value != nullptr)
|
if (HitBoxPair.Value != nullptr)
|
||||||
{
|
{
|
||||||
HitBoxPair.Value->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
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,
|
ConfirmHitResult,
|
||||||
TraceStart,
|
TraceStart,
|
||||||
TraceEnd,
|
TraceEnd,
|
||||||
ECC_Visibility
|
ECC_HitBox
|
||||||
);
|
);
|
||||||
|
|
||||||
if (ConfirmHitResult.bBlockingHit)
|
if (ConfirmHitResult.bBlockingHit)
|
||||||
{
|
{
|
||||||
|
if (ConfirmHitResult.Component.IsValid())
|
||||||
|
{
|
||||||
|
UBoxComponent* Box = Cast<UBoxComponent>(ConfirmHitResult.Component);
|
||||||
|
if (Box)
|
||||||
|
{
|
||||||
|
DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Blue, false, 8.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
ResetHitBoxes(HitCharacter, CurrentFrame);
|
ResetHitBoxes(HitCharacter, CurrentFrame);
|
||||||
EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics);
|
EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics);
|
||||||
return FServerSideRewindResult{ true, false };
|
return FServerSideRewindResult{ true, false };
|
||||||
|
@ -223,7 +240,7 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons
|
||||||
// Enable collision for the head first
|
// Enable collision for the head first
|
||||||
UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")];
|
UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")];
|
||||||
HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
||||||
HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
|
HeadBox->SetCollisionResponseToChannel(ECC_HitBox, ECR_Block);
|
||||||
}
|
}
|
||||||
|
|
||||||
UWorld* World = GetWorld();
|
UWorld* World = GetWorld();
|
||||||
|
@ -239,12 +256,20 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons
|
||||||
ConfirmHitResult,
|
ConfirmHitResult,
|
||||||
TraceStart,
|
TraceStart,
|
||||||
TraceEnd,
|
TraceEnd,
|
||||||
ECC_Visibility
|
ECC_HitBox
|
||||||
);
|
);
|
||||||
|
|
||||||
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ConfirmHitResult.GetActor());
|
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ConfirmHitResult.GetActor());
|
||||||
if (BlasterCharacter)
|
if (BlasterCharacter)
|
||||||
{
|
{
|
||||||
|
if (ConfirmHitResult.Component.IsValid())
|
||||||
|
{
|
||||||
|
UBoxComponent* Box = Cast<UBoxComponent>(ConfirmHitResult.Component);
|
||||||
|
if (Box)
|
||||||
|
{
|
||||||
|
DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Red, false, 8.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ShotgunResult.Headshots.Contains(BlasterCharacter))
|
if (ShotgunResult.Headshots.Contains(BlasterCharacter))
|
||||||
{
|
{
|
||||||
ShotgunResult.Headshots[BlasterCharacter]++;
|
ShotgunResult.Headshots[BlasterCharacter]++;
|
||||||
|
@ -265,7 +290,7 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons
|
||||||
if (HitBoxPair.Value != nullptr)
|
if (HitBoxPair.Value != nullptr)
|
||||||
{
|
{
|
||||||
HitBoxPair.Value->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
|
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")];
|
UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")];
|
||||||
|
@ -283,12 +308,20 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(cons
|
||||||
ConfirmHitResult,
|
ConfirmHitResult,
|
||||||
TraceStart,
|
TraceStart,
|
||||||
TraceEnd,
|
TraceEnd,
|
||||||
ECC_Visibility
|
ECC_HitBox
|
||||||
);
|
);
|
||||||
|
|
||||||
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ConfirmHitResult.GetActor());
|
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ConfirmHitResult.GetActor());
|
||||||
if (BlasterCharacter)
|
if (BlasterCharacter)
|
||||||
{
|
{
|
||||||
|
if (ConfirmHitResult.Component.IsValid())
|
||||||
|
{
|
||||||
|
UBoxComponent* Box = Cast<UBoxComponent>(ConfirmHitResult.Component);
|
||||||
|
if (Box)
|
||||||
|
{
|
||||||
|
DrawDebugBox(GetWorld(), Box->GetComponentLocation(), Box->GetScaledBoxExtent(), FQuat(Box->GetComponentRotation()), FColor::Blue, false, 8.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ShotgunResult.BodyShots.Contains(BlasterCharacter))
|
if (ShotgunResult.BodyShots.Contains(BlasterCharacter))
|
||||||
{
|
{
|
||||||
ShotgunResult.BodyShots[BlasterCharacter]++;
|
ShotgunResult.BodyShots[BlasterCharacter]++;
|
||||||
|
|
Loading…
Reference in New Issue