mirror of
https://github.com/Ed94/Cog.git
synced 2026-06-13 00:01:37 -07:00
CogAbility: Fix cheats not correctly saved when connected to a server
CogSample: Projectile progress
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include "CogSampleDefines.h"
|
||||
#include "CogSampleCharacter.h"
|
||||
#include "CogSampleLogCategories.h"
|
||||
#include "CogSampleProjectileComponent.h"
|
||||
#include "CogSampleTargetAcquisition.h"
|
||||
#include "GameFramework/PlayerState.h"
|
||||
#include "Net/UnrealNetwork.h"
|
||||
@@ -205,7 +206,14 @@ void ACogSamplePlayerController::Server_SetTarget_Implementation(AActor* Value)
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
const ACogSamplePlayerController* ACogSamplePlayerController::GetFirstLocalPlayerController(UObject* WorldContextObject)
|
||||
const ACogSamplePlayerController* ACogSamplePlayerController::GetFirstLocalPlayerControllerConst(UObject* WorldContextObject)
|
||||
{
|
||||
const ACogSamplePlayerController* PlayerController = GetFirstLocalPlayerController(WorldContextObject);
|
||||
return PlayerController;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
ACogSamplePlayerController* ACogSamplePlayerController::GetFirstLocalPlayerController(UObject* WorldContextObject)
|
||||
{
|
||||
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull);
|
||||
if (World == nullptr)
|
||||
@@ -231,3 +239,11 @@ float ACogSamplePlayerController::GetClientLag() const
|
||||
return HalfPingInSeconds;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void ACogSamplePlayerController::Server_ProjectileHit_Implementation(UCogSampleProjectileComponent* Projectile, const FHitResult& HitResult)
|
||||
{
|
||||
if (Projectile != nullptr)
|
||||
{
|
||||
Projectile->Server_Hit(HitResult);
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,9 @@ class ACogSamplePlayerController
|
||||
|
||||
public:
|
||||
|
||||
static const ACogSamplePlayerController* GetFirstLocalPlayerController(UObject* WorldContextObject);
|
||||
static const ACogSamplePlayerController* GetFirstLocalPlayerControllerConst(UObject* WorldContextObject);
|
||||
|
||||
static ACogSamplePlayerController* GetFirstLocalPlayerController(UObject* WorldContextObject);
|
||||
|
||||
ACogSamplePlayerController();
|
||||
|
||||
@@ -67,6 +69,12 @@ public:
|
||||
UPROPERTY()
|
||||
TArray<UCogSampleSpawnPredictionComponent*> SpawnPredictions;
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// Projectile Hit
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
UFUNCTION(Reliable, Server)
|
||||
void Server_ProjectileHit(UCogSampleProjectileComponent* Projectile, const FHitResult& HitResult);
|
||||
|
||||
private:
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
//
|
||||
// One client could be made responsible to detect hits received by a specific NPC.
|
||||
//
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
UCogSampleProjectileComponent::UCogSampleProjectileComponent(const FObjectInitializer& ObjectInitializer)
|
||||
: Super(ObjectInitializer)
|
||||
@@ -81,6 +83,7 @@ void UCogSampleProjectileComponent::BeginPlay()
|
||||
|
||||
Creator = UCogSampleFunctionLibrary_Gameplay::GetCreator(GetOwner());
|
||||
SpawnPrediction = GetOwner()->FindComponentByClass<UCogSampleSpawnPredictionComponent>();
|
||||
LocalPlayerController = ACogSamplePlayerController::GetFirstLocalPlayerController(this);
|
||||
|
||||
COG_LOG_OBJECT(LogCogProjectile, ELogVerbosity::Verbose, Creator.Get(), TEXT("Projectile:%s | Role:%s | IsActive:%d"), *GetNameSafe(GetOwner()), *GetRoleName(), IsActive());
|
||||
|
||||
@@ -107,6 +110,12 @@ void UCogSampleProjectileComponent::BeginPlay()
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void UCogSampleProjectileComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
|
||||
{
|
||||
Super::EndPlay(EndPlayReason);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void UCogSampleProjectileComponent::Activate(bool bReset)
|
||||
{
|
||||
@@ -146,9 +155,9 @@ void UCogSampleProjectileComponent::Activate(bool bReset)
|
||||
//--------------------------------------------------------------------------
|
||||
if (GetOwner()->GetLocalRole() != ROLE_Authority)
|
||||
{
|
||||
if (const ACogSamplePlayerController* Controller = ACogSamplePlayerController::GetFirstLocalPlayerController(this))
|
||||
if (LocalPlayerController != nullptr)
|
||||
{
|
||||
Catchup(Controller->GetClientLag());
|
||||
Catchup(LocalPlayerController->GetClientLag());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -510,6 +519,13 @@ void UCogSampleProjectileComponent::Hit_Implementation(const FHitResult& HitResu
|
||||
DrawDebugHitResult(HitResult);
|
||||
#endif //ENABLE_COG
|
||||
|
||||
if (LocalPlayerController == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LocalPlayerController->Server_ProjectileHit(this, HitResult);
|
||||
|
||||
Server_Hit(HitResult);
|
||||
}
|
||||
|
||||
@@ -525,7 +541,7 @@ FString UCogSampleProjectileComponent::GetRoleName() const
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
void UCogSampleProjectileComponent::Server_Hit_Implementation(const FHitResult& HitResult)
|
||||
void UCogSampleProjectileComponent::Server_Hit(const FHitResult& HitResult)
|
||||
{
|
||||
COG_LOG_OBJECT(LogCogProjectile, ELogVerbosity::Verbose, Creator.Get(), TEXT("Projectile:%s | Role:%s | Other:%s | Comp:%s | Bone:%s"),
|
||||
*GetNameSafe(GetOwner()),
|
||||
|
||||
@@ -53,12 +53,15 @@ public:
|
||||
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
||||
|
||||
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction);
|
||||
|
||||
virtual void Activate(bool bReset) override;
|
||||
|
||||
virtual void StopSimulating(const FHitResult& HitResult) override;
|
||||
|
||||
virtual void Server_Hit(const FHitResult& Hit);
|
||||
|
||||
UFUNCTION(BlueprintCallable)
|
||||
void ClearHitActors();
|
||||
@@ -79,8 +82,6 @@ protected:
|
||||
|
||||
virtual void TryHit(const FHitResult& Hit);
|
||||
|
||||
UFUNCTION(Server, Reliable)
|
||||
virtual void Server_Hit(const FHitResult& Hit);
|
||||
|
||||
UFUNCTION()
|
||||
virtual void OnCollisionOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool IsFromSweep, const FHitResult& SweepHit);
|
||||
@@ -129,6 +130,9 @@ protected:
|
||||
UPROPERTY(Replicated)
|
||||
FVector ServerSpawnVelocity = FVector::ZeroVector;
|
||||
|
||||
UPROPERTY()
|
||||
TWeakObjectPtr<ACogSamplePlayerController> LocalPlayerController = nullptr;
|
||||
|
||||
/** Re-entrancy guard */
|
||||
bool IsAlreadyProcessingAnOverlap = false;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user