From fe64e112817f7fd19194b1f6e4ff22fe034a0a2a Mon Sep 17 00:00:00 2001 From: Kingsmedia Date: Sat, 30 Apr 2022 12:26:25 +0200 Subject: [PATCH] 44 - Variable Replication --- Source/Blaster/Character/BlasterCharacter.cpp | 40 ++++++++++++++++++- Source/Blaster/Character/BlasterCharacter.h | 11 ++++- Source/Blaster/Weapon/Weapon.cpp | 23 ++++++++++- Source/Blaster/Weapon/Weapon.h | 11 ++++- 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index d0c0690..2171f54 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -3,10 +3,12 @@ #include "BlasterCharacter.h" +#include "Blaster/Weapon/Weapon.h" #include "Camera/CameraComponent.h" #include "Components/WidgetComponent.h" #include "GameFramework/CharacterMovementComponent.h" #include "GameFramework/SpringArmComponent.h" +#include "Net/UnrealNetwork.h" ABlasterCharacter::ABlasterCharacter() @@ -29,16 +31,21 @@ ABlasterCharacter::ABlasterCharacter() OverheadWidget->SetupAttachment(RootComponent); } +void ABlasterCharacter::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + + DOREPLIFETIME_CONDITION(ABlasterCharacter, OverlappingWeapon, COND_OwnerOnly); +} + void ABlasterCharacter::BeginPlay() { Super::BeginPlay(); - } void ABlasterCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); - } void ABlasterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) @@ -83,3 +90,32 @@ void ABlasterCharacter::LookUp(float Value) { AddControllerPitchInput(Value); } + +void ABlasterCharacter::SetOverlappingWeapon(AWeapon* Weapon) +{ + if (OverlappingWeapon) + { + OverlappingWeapon->ShowPickupWidget(false); + } + + OverlappingWeapon = Weapon; + if (IsLocallyControlled()) + { + if (OverlappingWeapon) + { + OverlappingWeapon->ShowPickupWidget(true); + } + } +} + +void ABlasterCharacter::OnRep_OverlappingWeapon(AWeapon* LastWeapon) +{ + if (OverlappingWeapon) + { + OverlappingWeapon->ShowPickupWidget(true); + } + if (LastWeapon) + { + LastWeapon->ShowPickupWidget(false); + } +} diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index 77d5aac..56dd6ca 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -15,7 +15,7 @@ public: ABlasterCharacter(); virtual void Tick(float DeltaTime) override; virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; - + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; protected: virtual void BeginPlay() override; @@ -33,6 +33,13 @@ private: UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) class UWidgetComponent* OverheadWidget; -public: + + UPROPERTY(ReplicatedUsing = OnRep_OverlappingWeapon) + class AWeapon* OverlappingWeapon; + + UFUNCTION() + void OnRep_OverlappingWeapon(AWeapon* LastWeapon); +public: + void SetOverlappingWeapon(AWeapon* Weapon); }; diff --git a/Source/Blaster/Weapon/Weapon.cpp b/Source/Blaster/Weapon/Weapon.cpp index 4bd0f6d..92759ae 100644 --- a/Source/Blaster/Weapon/Weapon.cpp +++ b/Source/Blaster/Weapon/Weapon.cpp @@ -39,6 +39,7 @@ void AWeapon::BeginPlay() AreaSphere->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); AreaSphere->SetCollisionResponseToChannel(ECollisionChannel::ECC_Pawn, ECollisionResponse::ECR_Overlap); AreaSphere->OnComponentBeginOverlap.AddDynamic(this, &AWeapon::OnSphereOverlap); + AreaSphere->OnComponentEndOverlap.AddDynamic(this, &AWeapon::OnSphereEndOverlap); } if (PickupWidget) @@ -55,8 +56,26 @@ void AWeapon::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, const FHitResult& SweepResult) { ABlasterCharacter* BlasterCharacter = Cast(OtherActor); - if (BlasterCharacter && PickupWidget) + if (BlasterCharacter) { - PickupWidget->SetVisibility(true); + BlasterCharacter->SetOverlappingWeapon(this); + } +} + +void AWeapon::OnSphereEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, + UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) +{ + ABlasterCharacter* BlasterCharacter = Cast(OtherActor); + if (BlasterCharacter) + { + BlasterCharacter->SetOverlappingWeapon(nullptr); + } +} + +void AWeapon::ShowPickupWidget(bool bShowWidget) +{ + if (PickupWidget) + { + PickupWidget->SetVisibility(bShowWidget); } } diff --git a/Source/Blaster/Weapon/Weapon.h b/Source/Blaster/Weapon/Weapon.h index 600648d..de54ee0 100644 --- a/Source/Blaster/Weapon/Weapon.h +++ b/Source/Blaster/Weapon/Weapon.h @@ -22,7 +22,8 @@ class BLASTER_API AWeapon : public AActor public: AWeapon(); - + void ShowPickupWidget(bool bShowWidget); + protected: virtual void BeginPlay() override; @@ -35,6 +36,14 @@ protected: bool bFromSweep, const FHitResult& SweepResult ); + + UFUNCTION() + virtual void OnSphereEndOverlap( + UPrimitiveComponent* OverlappedComponent, + AActor* OtherActor, + UPrimitiveComponent* OtherComp, + int32 OtherBodyIndex + ); private: UPROPERTY(VisibleAnywhere, Category="Weapon Properties")