191 - Confirming Shotgun Hits
This commit is contained in:
parent
eec38a37db
commit
067c83583c
Binary file not shown.
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue