189 - Score Request

This commit is contained in:
Kingsmedia 2022-05-27 18:36:56 +02:00
parent c455d1655d
commit de7d73125b
8 changed files with 90 additions and 28 deletions

Binary file not shown.

View File

@ -3,7 +3,9 @@
#include "LagCompensationComponent.h" #include "LagCompensationComponent.h"
#include "Blaster/Weapon/Weapon.h"
#include "Components/BoxComponent.h" #include "Components/BoxComponent.h"
#include "Kismet/GameplayStatics.h"
ULagCompensationComponent::ULagCompensationComponent() ULagCompensationComponent::ULagCompensationComponent()
{ {
@ -16,6 +18,24 @@ void ULagCompensationComponent::BeginPlay()
} }
void ULagCompensationComponent::ServerScoreRequest_Implementation(ABlasterCharacter* HitCharacter, const FVector_NetQuantize& TraceStart,
const FVector_NetQuantize& HitLocation, float HitTime, AWeapon* DamageCauser)
{
const FServerSideRewindResult Confirm = ServerSideRewind(HitCharacter, TraceStart, HitLocation, HitTime);
if (Character && HitCharacter && DamageCauser && Confirm.bHitConfirmed)
{
UGameplayStatics::ApplyDamage(
HitCharacter,
DamageCauser->GetDamage(),
Character->Controller,
DamageCauser,
UDamageType::StaticClass()
);
}
}
void ULagCompensationComponent::SaveFramePackage(FFramePackage& Package) void ULagCompensationComponent::SaveFramePackage(FFramePackage& Package)
{ {
Character = Character == nullptr ? Cast<ABlasterCharacter>(GetOwner()) : Character; Character = Character == nullptr ? Cast<ABlasterCharacter>(GetOwner()) : Character;
@ -116,12 +136,12 @@ FServerSideRewindResult ULagCompensationComponent::ConfirmHit(const FFramePackag
EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics); EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics);
return FServerSideRewindResult{ true, false }; return FServerSideRewindResult{ true, false };
} }
}
ResetHitBoxes(HitCharacter, CurrentFrame); ResetHitBoxes(HitCharacter, CurrentFrame);
EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics); EnableCharacterMeshCollision(HitCharacter, ECollisionEnabled::QueryAndPhysics);
return FServerSideRewindResult{ false, false }; return FServerSideRewindResult{ false, false };
} }
}
void ULagCompensationComponent::CacheBoxPositions(ABlasterCharacter* HitCharacter, FFramePackage& OutFramePackage) void ULagCompensationComponent::CacheBoxPositions(ABlasterCharacter* HitCharacter, FFramePackage& OutFramePackage)
{ {
@ -258,6 +278,12 @@ void ULagCompensationComponent::TickComponent(float DeltaTime, ELevelTick TickTy
{ {
Super::TickComponent(DeltaTime, TickType, ThisTickFunction); Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
SaveFramePackage();
}
void ULagCompensationComponent::SaveFramePackage()
{
if (Character == nullptr || !Character->HasAuthority()) return;
if (FrameHistory.Num() <= 1) if (FrameHistory.Num() <= 1)
{ {
FFramePackage ThisFrame; FFramePackage ThisFrame;
@ -275,7 +301,6 @@ void ULagCompensationComponent::TickComponent(float DeltaTime, ELevelTick TickTy
FFramePackage ThisFrame; FFramePackage ThisFrame;
SaveFramePackage(ThisFrame); SaveFramePackage(ThisFrame);
FrameHistory.AddHead(ThisFrame); FrameHistory.AddHead(ThisFrame);
ShowFramePackage(ThisFrame, FColor::Red); // ShowFramePackage(ThisFrame, FColor::Red);
} }
} }

View File

@ -57,8 +57,17 @@ public:
void ShowFramePackage(const FFramePackage& Package, const FColor Color); void ShowFramePackage(const FFramePackage& Package, const FColor Color);
FServerSideRewindResult ServerSideRewind(class ABlasterCharacter* HitCharacter, const FVector_NetQuantize& TraceStart, const FVector_NetQuantize& HitLocation, float HitTime); FServerSideRewindResult ServerSideRewind(class ABlasterCharacter* HitCharacter, const FVector_NetQuantize& TraceStart, const FVector_NetQuantize& HitLocation, float HitTime);
UFUNCTION(Server, Reliable)
void ServerScoreRequest(
ABlasterCharacter* HitCharacter,
const FVector_NetQuantize& TraceStart,
const FVector_NetQuantize& HitLocation,
float HitTime,
class AWeapon* DamageCauser
);
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;
void SaveFramePackage();
void SaveFramePackage(FFramePackage& Package); void SaveFramePackage(FFramePackage& Package);
FFramePackage InterpBetweenFrames(const FFramePackage& OlderFrame, const FFramePackage& YoungerFrame, float HitTime); FFramePackage InterpBetweenFrames(const FFramePackage& OlderFrame, const FFramePackage& YoungerFrame, float HitTime);
FServerSideRewindResult ConfirmHit(const FFramePackage& Package, ABlasterCharacter* HitCharacter, const FVector_NetQuantize& TraceStart, const FVector_NetQuantize HitLocation); FServerSideRewindResult ConfirmHit(const FFramePackage& Package, ABlasterCharacter* HitCharacter, const FVector_NetQuantize& TraceStart, const FVector_NetQuantize HitLocation);

View File

@ -468,7 +468,8 @@ void ABlasterPlayerController::ServerRequestServerTime_Implementation(float Time
void ABlasterPlayerController::ClientReportServerTime_Implementation(float TimeOfClientRequest, float TimeServerReceivedClientRequest) void ABlasterPlayerController::ClientReportServerTime_Implementation(float TimeOfClientRequest, float TimeServerReceivedClientRequest)
{ {
float RoundTripTime = GetWorld()->GetTimeSeconds() - TimeOfClientRequest; float RoundTripTime = GetWorld()->GetTimeSeconds() - TimeOfClientRequest;
float CurrentServerTime = TimeServerReceivedClientRequest + 0.5f * RoundTripTime; SingleTripTime = 0.5f * RoundTripTime;
float CurrentServerTime = TimeServerReceivedClientRequest + SingleTripTime;
ClientServerDelta = CurrentServerTime - GetWorld()->GetTimeSeconds(); ClientServerDelta = CurrentServerTime - GetWorld()->GetTimeSeconds();
} }

View File

@ -45,6 +45,8 @@ public:
void OnMatchStateSet(FName State); void OnMatchStateSet(FName State);
void HandleCooldown(); void HandleCooldown();
float SingleTripTime = 0.f;
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;

View File

@ -4,6 +4,8 @@
#include "HitScanWeapon.h" #include "HitScanWeapon.h"
#include "Blaster/Character/BlasterCharacter.h" #include "Blaster/Character/BlasterCharacter.h"
#include "Blaster/Components/LagCompensationComponent.h"
#include "Blaster/PlayerController/BlasterPlayerController.h"
#include "Engine/SkeletalMeshSocket.h" #include "Engine/SkeletalMeshSocket.h"
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
#include "Particles/ParticleSystemComponent.h" #include "Particles/ParticleSystemComponent.h"
@ -26,7 +28,9 @@ void AHitScanWeapon::Fire(const FVector& HitTarget)
WeaponTraceHit(Start, HitTarget, FireHit); WeaponTraceHit(Start, HitTarget, FireHit);
ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(FireHit.GetActor()); ABlasterCharacter* BlasterCharacter = Cast<ABlasterCharacter>(FireHit.GetActor());
if (BlasterCharacter && HasAuthority() && InstigatorController) if (BlasterCharacter && InstigatorController)
{
if (HasAuthority() && !bUseServerSideRewind)
{ {
UGameplayStatics::ApplyDamage( UGameplayStatics::ApplyDamage(
BlasterCharacter, BlasterCharacter,
@ -36,6 +40,23 @@ void AHitScanWeapon::Fire(const FVector& HitTarget)
UDamageType::StaticClass() UDamageType::StaticClass()
); );
} }
else if (!HasAuthority() && bUseServerSideRewind)
{
OwnerCharacter = OwnerCharacter == nullptr ? Cast<ABlasterCharacter>(OwnerPawn) : OwnerCharacter;
OwnerController = OwnerController == nullptr ? Cast<ABlasterPlayerController>(InstigatorController) : OwnerController;
if (OwnerCharacter && OwnerController && OwnerCharacter->GetLagCompensation())
{
OwnerCharacter->GetLagCompensation()->ServerScoreRequest(
BlasterCharacter,
Start,
HitTarget,
OwnerController->GetServerTime() - OwnerController->SingleTripTime,
this
);
}
}
}
if (ImpactParticles) if (ImpactParticles)
{ {
UGameplayStatics::SpawnEmitterAtLocation( UGameplayStatics::SpawnEmitterAtLocation(

View File

@ -26,9 +26,6 @@ protected:
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
USoundCue* HitSound; USoundCue* HitSound;
UPROPERTY(EditAnywhere)
float Damage = 20.f;
private: private:
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)

View File

@ -124,6 +124,18 @@ protected:
UPROPERTY(EditAnywhere, Category = "Weapon Scatter") UPROPERTY(EditAnywhere, Category = "Weapon Scatter")
float SphereRadius = 75.f; float SphereRadius = 75.f;
UPROPERTY(EditAnywhere)
float Damage = 20.f;
UPROPERTY(EditAnywhere)
bool bUseServerSideRewind = false;
UPROPERTY()
class ABlasterCharacter* OwnerCharacter;
UPROPERTY()
class ABlasterPlayerController* OwnerController;
private: private:
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties") UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
USkeletalMeshComponent* WeaponMesh; USkeletalMeshComponent* WeaponMesh;
@ -164,12 +176,6 @@ private:
// Incremented in SpendRound(), decremented in ClientUpdateAmmo() // Incremented in SpendRound(), decremented in ClientUpdateAmmo()
int32 Sequence = 0; int32 Sequence = 0;
UPROPERTY()
class ABlasterCharacter* OwnerCharacter;
UPROPERTY()
class ABlasterPlayerController* OwnerController;
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
EWeaponType WeaponType; EWeaponType WeaponType;
@ -184,6 +190,7 @@ public:
FORCEINLINE int32 GetMagCapacity() const { return MagCapacity; } FORCEINLINE int32 GetMagCapacity() const { return MagCapacity; }
bool IsEmpty(); bool IsEmpty();
bool IsFull(); bool IsFull();
FORCEINLINE float GetDamage() const { return Damage; }
// Convenience methods for WeaponType // Convenience methods for WeaponType
FORCEINLINE bool IsPistol() const { return WeaponType == EWeaponType::EWT_Pistol; } FORCEINLINE bool IsPistol() const { return WeaponType == EWeaponType::EWT_Pistol; }