189 - Score Request
This commit is contained in:
parent
c455d1655d
commit
de7d73125b
Binary file not shown.
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
Loading…
Reference in New Issue