// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blaster/Character/BlasterCharacter.h" #include "Components/ActorComponent.h" #include "LagCompensationComponent.generated.h" USTRUCT(BlueprintType) struct FBoxInformation { GENERATED_BODY() UPROPERTY() FVector Location; UPROPERTY() FRotator Rotation; UPROPERTY() FVector BoxExtend; }; USTRUCT(BlueprintType) struct FFramePackage { GENERATED_BODY() UPROPERTY() float Time; TMap HitBoxInfo; }; USTRUCT(BlueprintType) struct FServerSideRewindResult { GENERATED_BODY() UPROPERTY() bool bHitConfirmed; UPROPERTY() bool bHeadShot; }; UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class BLASTER_API ULagCompensationComponent : public UActorComponent { GENERATED_BODY() public: ULagCompensationComponent(); friend ABlasterCharacter; virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; void ShowFramePackage(const FFramePackage& Package, const FColor Color); 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: virtual void BeginPlay() override; void SaveFramePackage(); void SaveFramePackage(FFramePackage& Package); 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); void CacheBoxPositions(ABlasterCharacter* HitCharacter, FFramePackage& OutFramePackage); void MoveBoxes(ABlasterCharacter* HitCharacter, const FFramePackage& Package); void ResetHitBoxes(ABlasterCharacter* HitCharacter, const FFramePackage& Package); void EnableCharacterMeshCollision(ABlasterCharacter* HitCharacter, ECollisionEnabled::Type CollisionEnabled); private: UPROPERTY() ABlasterCharacter* Character; UPROPERTY() ABlasterPlayerController* Controller; TDoubleLinkedList FrameHistory; UPROPERTY(EditAnywhere) float MaxRecordTime = 4.f; };