diff --git a/Content/Blueprints/Character/BP_BlasterCharacter.uasset b/Content/Blueprints/Character/BP_BlasterCharacter.uasset index ad2d241..5f6e8cd 100644 Binary files a/Content/Blueprints/Character/BP_BlasterCharacter.uasset and b/Content/Blueprints/Character/BP_BlasterCharacter.uasset differ diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 97d7629..061a8e4 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -73,74 +73,92 @@ ABlasterCharacter::ABlasterCharacter() head = CreateDefaultSubobject(TEXT("head")); head->SetupAttachment(GetMesh(), FName("head")); head->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("head"), head); pelvis = CreateDefaultSubobject(TEXT("pelvis")); pelvis->SetupAttachment(GetMesh(), FName("pelvis")); pelvis->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("pelvis"), pelvis); spine_02 = CreateDefaultSubobject(TEXT("spine_02")); spine_02->SetupAttachment(GetMesh(), FName("spine_02")); spine_02->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("spine_02"), spine_02); spine_03 = CreateDefaultSubobject(TEXT("spine_03")); spine_03->SetupAttachment(GetMesh(), FName("spine_03")); spine_03->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("spine_03"), spine_03); upperarm_l = CreateDefaultSubobject(TEXT("upperarm_l")); upperarm_l->SetupAttachment(GetMesh(), FName("upperarm_l")); upperarm_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("upperarm_l"), upperarm_l); upperarm_r = CreateDefaultSubobject(TEXT("upperarm_r")); upperarm_r->SetupAttachment(GetMesh(), FName("upperarm_r")); upperarm_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("upperarm_r"), upperarm_r); lowerarm_l = CreateDefaultSubobject(TEXT("lowerarm_l")); lowerarm_l->SetupAttachment(GetMesh(), FName("lowerarm_l")); lowerarm_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("lowerarm_l"), lowerarm_l); lowerarm_r = CreateDefaultSubobject(TEXT("lowerarm_r")); lowerarm_r->SetupAttachment(GetMesh(), FName("lowerarm_r")); lowerarm_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("lowerarm_r"), lowerarm_r); hand_l = CreateDefaultSubobject(TEXT("hand_l")); hand_l->SetupAttachment(GetMesh(), FName("hand_l")); hand_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("hand_l"), hand_l); hand_r = CreateDefaultSubobject(TEXT("hand_r")); hand_r->SetupAttachment(GetMesh(), FName("hand_r")); hand_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("hand_r"), hand_r); backpack = CreateDefaultSubobject(TEXT("backpack")); backpack->SetupAttachment(GetMesh(), FName("backpack")); backpack->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("backpack"), backpack); blanket = CreateDefaultSubobject(TEXT("blanket")); blanket->SetupAttachment(GetMesh(), FName("backpack")); blanket->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("blanket"), blanket); thigh_l = CreateDefaultSubobject(TEXT("thigh_l")); thigh_l->SetupAttachment(GetMesh(), FName("thigh_l")); thigh_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("thigh_l"), thigh_l); thigh_r = CreateDefaultSubobject(TEXT("thigh_r")); thigh_r->SetupAttachment(GetMesh(), FName("thigh_r")); thigh_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("thigh_r"), thigh_r); calf_l = CreateDefaultSubobject(TEXT("calf_l")); calf_l->SetupAttachment(GetMesh(), FName("calf_l")); calf_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("calf_l"), calf_l); calf_r = CreateDefaultSubobject(TEXT("calf_r")); calf_r->SetupAttachment(GetMesh(), FName("calf_r")); calf_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("calf_r"), calf_r); foot_l = CreateDefaultSubobject(TEXT("foot_l")); foot_l->SetupAttachment(GetMesh(), FName("foot_l")); foot_l->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("foot_l"), foot_l); foot_r = CreateDefaultSubobject(TEXT("foot_r")); foot_r->SetupAttachment(GetMesh(), FName("foot_r")); foot_r->SetCollisionEnabled(ECollisionEnabled::NoCollision); + HitCollisionBoxes.Add(FName("foot_r"), foot_r); } void ABlasterCharacter::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index 2c7d8d9..c08d3e4 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -46,6 +46,35 @@ public: void UpdateHUDAmmo(); void SpawnDefaultWeapon(); + UPROPERTY() + TMap HitCollisionBoxes; + +protected: + virtual void BeginPlay() override; + + void MoveForward(float Value); + void MoveRight(float Value); + void Turn(float Value); + void LookUp(float Value); + void EquipButtonPressed(); + void ReloadButtonPressed(); + void CrouchButtonPressed(); + void AimButtonPressed(); + void AimButtonReleased(); + void GrenadeButtonPressed(); + void CalculateAO_Pitch(); + void AimOffset(float DeltaTime); + void SimProxiesTurn(); + virtual void Jump() override; + void FireButtonPressed(); + void FireButtonReleased(); + void PlayHitReactMontage(); + + UFUNCTION() + void ReceiveDamage(AActor* DamagedActor, float Damage, const UDamageType* DamageType, class AController* InstigatorController, AActor* DamageCauser); + + // Poll for any relevant classes and initialize them + void PollInit(); // Hit boxes used for server-side rewind @@ -102,34 +131,7 @@ public: UPROPERTY(EditAnywhere) UBoxComponent* foot_r; - -protected: - virtual void BeginPlay() override; - void MoveForward(float Value); - void MoveRight(float Value); - void Turn(float Value); - void LookUp(float Value); - void EquipButtonPressed(); - void ReloadButtonPressed(); - void CrouchButtonPressed(); - void AimButtonPressed(); - void AimButtonReleased(); - void GrenadeButtonPressed(); - void CalculateAO_Pitch(); - void AimOffset(float DeltaTime); - void SimProxiesTurn(); - virtual void Jump() override; - void FireButtonPressed(); - void FireButtonReleased(); - void PlayHitReactMontage(); - - UFUNCTION() - void ReceiveDamage(AActor* DamagedActor, float Damage, const UDamageType* DamageType, class AController* InstigatorController, AActor* DamageCauser); - - // Poll for any relevant classes and initialize them - void PollInit(); - private: UPROPERTY() diff --git a/Source/Blaster/Components/LagCompensationComponent.cpp b/Source/Blaster/Components/LagCompensationComponent.cpp index bcea332..91e754e 100644 --- a/Source/Blaster/Components/LagCompensationComponent.cpp +++ b/Source/Blaster/Components/LagCompensationComponent.cpp @@ -3,6 +3,8 @@ #include "LagCompensationComponent.h" +#include "Components/BoxComponent.h" + ULagCompensationComponent::ULagCompensationComponent() { PrimaryComponentTick.bCanEverTick = true; @@ -11,6 +13,43 @@ ULagCompensationComponent::ULagCompensationComponent() void ULagCompensationComponent::BeginPlay() { Super::BeginPlay(); + + FFramePackage Package; + SaveFramePackage(Package); + ShowFramePackage(Package, FColor::Orange); +} + +void ULagCompensationComponent::SaveFramePackage(FFramePackage& Package) +{ + Character = Character == nullptr ? Cast(GetOwner()) : Character; + if (Character) + { + Package.Time = GetWorld()->GetTimeSeconds(); + for (auto& BoxPair : Character->HitCollisionBoxes) + { + FBoxInformation BoxInformation; + BoxInformation.Location = BoxPair.Value->GetComponentLocation(); + BoxInformation.Rotation = BoxPair.Value->GetComponentRotation(); + BoxInformation.BoxExtend = BoxPair.Value->GetScaledBoxExtent(); + + Package.HitBoxInfo.Add(BoxPair.Key, BoxInformation); + } + } +} + +void ULagCompensationComponent::ShowFramePackage(const FFramePackage& Package, const FColor Color) +{ + for (auto& BoxInfo : Package.HitBoxInfo) + { + DrawDebugBox( + GetWorld(), + BoxInfo.Value.Location, + BoxInfo.Value.BoxExtend, + FQuat(BoxInfo.Value.Rotation), + Color, + true + ); + } } void ULagCompensationComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) diff --git a/Source/Blaster/Components/LagCompensationComponent.h b/Source/Blaster/Components/LagCompensationComponent.h index 6a34afa..324a6df 100644 --- a/Source/Blaster/Components/LagCompensationComponent.h +++ b/Source/Blaster/Components/LagCompensationComponent.h @@ -41,12 +41,13 @@ class BLASTER_API ULagCompensationComponent : public UActorComponent public: ULagCompensationComponent(); friend ABlasterCharacter; - virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; - + void ShowFramePackage(const FFramePackage& Package, const FColor Color); + protected: virtual void BeginPlay() override; - + void SaveFramePackage(FFramePackage& Package); + private: UPROPERTY()