191 - Confirming Shotgun Hits

This commit is contained in:
Kingsmedia 2022-05-27 21:12:11 +02:00
parent eec38a37db
commit 067c83583c
2 changed files with 116 additions and 8 deletions

Binary file not shown.

View File

@ -119,11 +119,11 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag
HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly); HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
FHitResult ConfirmHitResult;
const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f; const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f;
UWorld* World = GetWorld(); UWorld* World = GetWorld();
if (World) if (World)
{ {
FHitResult ConfirmHitResult;
World->LineTraceSingleByChannel( World->LineTraceSingleByChannel(
ConfirmHitResult, ConfirmHitResult,
TraceStart, TraceStart,
@ -168,6 +168,120 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag
return FServerSideRewindResult{ false, false }; return FServerSideRewindResult{ false, false };
} }
FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(const TArray<FFramePackage>& FramePackages,
const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations)
{
for (auto& Frame : FramePackages)
{
if (Frame.Character == nullptr) return FShotgunServerSideRewindResult();
}
FShotgunServerSideRewindResult ShotgunResult;
TArray<FFramePackage> CurrentFrames;
for (auto& Frame : FramePackages)
{
FFramePackage CurrentFrame;
CurrentFrame.Character = Frame.Character;
CacheBoxPositions(Frame.Character, CurrentFrame);
MoveBoxes(Frame.Character, Frame);
EnableCharacterMeshCollision(Frame.Character, ECollisionEnabled::NoCollision);
CurrentFrames.Add(CurrentFrame);
}
for (auto& Frame : FramePackages)
{
// Enable collision for the head first
UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")];
HeadBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
HeadBox->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
}
UWorld* World = GetWorld();
// Check for headshots
for (auto& HitLocation : HitLocations)
{
const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f;
if (World)
{
FHitResult ConfirmHitResult;
World->LineTraceSingleByChannel(
ConfirmHitResult,
TraceStart,
TraceEnd,
ECC_Visibility
);
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ConfirmHitResult.GetActor());
if (BlasterCharacter)
{
if (ShotgunResult.Headshots.Contains(BlasterCharacter))
{
ShotgunResult.Headshots[BlasterCharacter]++;
}
else
{
ShotgunResult.Headshots.Emplace(BlasterCharacter, 1);
}
}
}
}
// Enable collision for all boxes, then disable for head box
for (auto& Frame :FramePackages)
{
for (auto& HitBoxPair : Frame.Character->HitCollisionBoxes)
{
if (HitBoxPair.Value != nullptr)
{
HitBoxPair.Value->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
HitBoxPair.Value->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
}
}
UBoxComponent* HeadBox = Frame.Character->HitCollisionBoxes[FName("head")];
HeadBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}
// Check for body shots
for (auto& HitLocation : HitLocations)
{
const FVector TraceEnd = TraceStart + (HitLocation - TraceStart) * 1.25f;
if (World)
{
FHitResult ConfirmHitResult;
World->LineTraceSingleByChannel(
ConfirmHitResult,
TraceStart,
TraceEnd,
ECC_Visibility
);
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(ConfirmHitResult.GetActor());
if (BlasterCharacter)
{
if (ShotgunResult.BodyShots.Contains(BlasterCharacter))
{
ShotgunResult.BodyShots[BlasterCharacter]++;
}
else
{
ShotgunResult.BodyShots.Emplace(BlasterCharacter, 1);
}
}
}
}
for (auto& CurrentFrame : CurrentFrames)
{
ResetHitBoxes(CurrentFrame.Character, CurrentFrame);
EnableCharacterMeshCollision(CurrentFrame.Character, ECollisionEnabled::QueryAndPhysics);
}
return ShotgunResult;
}
void ULagCompensationComponent::CacheBoxPositions(ABlasterCharacter* HitCharacter, FFramePackage& OutFramePackage) void ULagCompensationComponent::CacheBoxPositions(ABlasterCharacter* HitCharacter, FFramePackage& OutFramePackage)
{ {
if (HitCharacter == nullptr) return; if (HitCharacter == nullptr) return;
@ -249,13 +363,7 @@ FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunServerSideRewin
FramesToCheck.Add(GetFrameToCheck(HitCharacter, HitTime)); FramesToCheck.Add(GetFrameToCheck(HitCharacter, HitTime));
} }
return FShotgunServerSideRewindResult(); return ShotgunConfirmHit(FramesToCheck, TraceStart, HitLocations);
}
FShotgunServerSideRewindResult ULagCompensationComponent::ShotgunConfirmHit(const TArray<FFramePackage>& FramePackages,
const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations)
{
} }
FFramePackage ULagCompensationComponent::GetFrameToCheck(ABlasterCharacter* HitCharacter, float HitTime) FFramePackage ULagCompensationComponent::GetFrameToCheck(ABlasterCharacter* HitCharacter, float HitTime)