'NetSlime' Initial port finished and working with 2 players (at least)
This commit is contained in:
@ -1,67 +1,94 @@
|
||||
#include "GasaNetLibrary.h"
|
||||
#include "GasaNetLibrary_Inlines.h"
|
||||
#include "GasaObject.h"
|
||||
|
||||
#include "Kismet/KismetMathLibrary.h"
|
||||
#include "Kismet/KismetSystemLibrary.h"
|
||||
|
||||
DEFINE_LOG_CATEGORY(LogGasaNet);
|
||||
|
||||
void NetLog( UObject const* Context, FString Message, EGasaVerbosity Verbosity = EGasaVerbosity::Log
|
||||
, FLogCategoryBase& Category = LogGasaNet
|
||||
, bool DumpStack = false
|
||||
, int32 Line = __builtin_LINE()
|
||||
, const ANSICHAR* File = __builtin_FILE()
|
||||
, const ANSICHAR* Func = __builtin_FUNCTION() )
|
||||
namespace Gasa
|
||||
{
|
||||
#if !UE_BUILD_SHIPPING && !NO_LOGGING
|
||||
ELogVerbosity::Type EngineVerbosity = (ELogVerbosity::Type) Verbosity;
|
||||
if ((EngineVerbosity & ELogVerbosity::VerbosityMask) > ELogVerbosity::COMPILED_IN_MINIMUM_VERBOSITY)
|
||||
return;
|
||||
if ((EngineVerbosity & ELogVerbosity::VerbosityMask) > Category.GetVerbosity())
|
||||
return;
|
||||
if ( Category.IsSuppressed(EngineVerbosity))
|
||||
return;
|
||||
|
||||
AActor const* Actor = nullptr;
|
||||
FString ActorLevel;
|
||||
void DrawNetCullingSphere(const UObject* Context, float Duration, float Thickness)
|
||||
{
|
||||
if (Context != nullptr)
|
||||
{
|
||||
if (Context->GetClass()->IsChildOf(AActor::StaticClass()))
|
||||
Actor = Cast<AActor>(Context);
|
||||
else if (Context->GetClass()->IsChildOf(UActorComponent::StaticClass()))
|
||||
Actor = Cast<UActorComponent>(Context)->GetOwner();
|
||||
// Its assumed that all GasaObjects have an outer actor
|
||||
else if (Context->IsA(UGasaObject::StaticClass()))
|
||||
Actor = Cast<AActor>(Context->GetOuter());
|
||||
}
|
||||
if (Actor)
|
||||
{
|
||||
if (Actor->HasLocalNetOwner())
|
||||
ActorLevel = TEXT("Net Owner");
|
||||
|
||||
else if (Actor->HasAuthority())
|
||||
ActorLevel = TEXT("Server Authorized");
|
||||
|
||||
else
|
||||
ActorLevel = TEXT("No Authority");
|
||||
}
|
||||
else
|
||||
ActorLevel = TEXT("Local");
|
||||
const AActor* actor = nullptr;
|
||||
|
||||
if (Context->IsA(UGasaObject::StaticClass()))
|
||||
actor = Cast<AActor>(Context->GetOuter());
|
||||
|
||||
else if (Context->IsA(AActor::StaticClass()))
|
||||
actor = Cast<AActor>(Context);
|
||||
|
||||
if (actor)
|
||||
UKismetSystemLibrary::DrawDebugSphere(actor
|
||||
, actor->GetActorLocation()
|
||||
, UKismetMathLibrary::Sqrt(actor->NetCullDistanceSquared) * 2
|
||||
, 12
|
||||
, FLinearColor(FColor::Emerald)
|
||||
, Duration
|
||||
, Thickness);
|
||||
}
|
||||
|
||||
void NetLog( UObject const* Context, FString Message, EGasaVerbosity Verbosity
|
||||
, FLogCategoryBase& Category
|
||||
, bool DumpStack
|
||||
, int32 Line
|
||||
, const ANSICHAR* File
|
||||
, const ANSICHAR* Func )
|
||||
{
|
||||
#if !UE_BUILD_SHIPPING && !NO_LOGGING
|
||||
ELogVerbosity::Type EngineVerbosity = (ELogVerbosity::Type) Verbosity;
|
||||
if ((EngineVerbosity & ELogVerbosity::VerbosityMask) > ELogVerbosity::COMPILED_IN_MINIMUM_VERBOSITY)
|
||||
return;
|
||||
if ((EngineVerbosity & ELogVerbosity::VerbosityMask) > Category.GetVerbosity())
|
||||
return;
|
||||
if ( Category.IsSuppressed(EngineVerbosity))
|
||||
return;
|
||||
|
||||
FString NetMode = FString::Printf(TEXT("%-16s"), * GetNetworkModeStr(Context));
|
||||
ActorLevel = FString::Printf(TEXT("%-18s"), * ActorLevel);
|
||||
FString Name = FString::Printf(TEXT("%-40s"), * Context->GetName());
|
||||
FString FullMsg = NetMode + " " + ActorLevel + " " + Name + " : " + Message;
|
||||
|
||||
static UE::Logging::Private::FStaticBasicLogDynamicData LOG_Dynamic;
|
||||
static UE::Logging::Private::FStaticBasicLogRecord
|
||||
LOG_Static(TEXT("%s -- %hs %hs(%d)"), File, Line, EngineVerbosity, LOG_Dynamic);
|
||||
AActor const* Actor = nullptr;
|
||||
FString ActorLevel;
|
||||
{
|
||||
if (Context != nullptr)
|
||||
{
|
||||
if (Context->GetClass()->IsChildOf(AActor::StaticClass()))
|
||||
Actor = Cast<AActor>(Context);
|
||||
else if (Context->GetClass()->IsChildOf(UActorComponent::StaticClass()))
|
||||
Actor = Cast<UActorComponent>(Context)->GetOwner();
|
||||
// Its assumed that all GasaObjects have an outer actor
|
||||
else if (Context->IsA(UGasaObject::StaticClass()))
|
||||
Actor = Cast<AActor>(Context->GetOuter());
|
||||
}
|
||||
if (Actor)
|
||||
{
|
||||
if (Actor->HasLocalNetOwner())
|
||||
ActorLevel = TEXT("Net Owner");
|
||||
|
||||
else if (Actor->HasAuthority())
|
||||
ActorLevel = TEXT("Server Authorized");
|
||||
|
||||
else
|
||||
ActorLevel = TEXT("No Authority");
|
||||
}
|
||||
else
|
||||
ActorLevel = TEXT("Local");
|
||||
}
|
||||
|
||||
SET_WARN_COLOR(COLOR_PURPLE)
|
||||
FString NetMode = FString::Printf(TEXT("%-16s"), * GetNetworkModeStr(Context));
|
||||
ActorLevel = FString::Printf(TEXT("%-18s"), * ActorLevel);
|
||||
FString Name = FString::Printf(TEXT("%-40s"), * Context->GetName());
|
||||
FString FullMsg = NetMode + " " + ActorLevel + " " + Name + " : " + Message;
|
||||
|
||||
if (DumpStack)
|
||||
FDebug::DumpStackTraceToLog(EngineVerbosity);
|
||||
BasicLog(Category, &LOG_Static, * FullMsg, File, Func, Line);
|
||||
static UE::Logging::Private::FStaticBasicLogDynamicData LOG_Dynamic;
|
||||
static UE::Logging::Private::FStaticBasicLogRecord
|
||||
LOG_Static(TEXT("%s -- %hs %hs(%d)"), File, Line, EngineVerbosity, LOG_Dynamic);
|
||||
|
||||
// SET_WARN_COLOR(COLOR_PURPLE)
|
||||
|
||||
CLEAR_WARN_COLOR()
|
||||
#endif
|
||||
}
|
||||
if (DumpStack)
|
||||
FDebug::DumpStackTraceToLog(EngineVerbosity);
|
||||
BasicLog(Category, &LOG_Static, * FullMsg, File, Func, Line);
|
||||
|
||||
// CLEAR_WARN_COLOR()
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,34 @@
|
||||
|
||||
DECLARE_LOG_CATEGORY_EXTERN(LogGasaNet, Log, All);
|
||||
|
||||
#define NullGuard( Object_, Logger_, Message_ ) \
|
||||
do { \
|
||||
if ( ! IsValid(Object_) ) \
|
||||
{ \
|
||||
Logger_( (Message_) , ELogV::Error ); \
|
||||
ensure( IsValid(Object_) ); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define NetGuard( Condition_, Logger_, Message_ ) \
|
||||
do { \
|
||||
if ( Condition_ ) \
|
||||
{ \
|
||||
Logger_( (Message_) , ELogV::Error ); \
|
||||
ensure( Condition_ ); \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#if UE_BUILD_DEVELOPMENT
|
||||
# define NullGuard_DEV NullGuard
|
||||
# define NetGuard_DEV NetGuard
|
||||
#else
|
||||
# define NullGuard_DEV( Object_, Logger_, Message_)
|
||||
# define NetGuard_DEV( Object_, Logger_, Message_)
|
||||
#endif
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class ENetworkMode : uint8
|
||||
{
|
||||
@ -39,13 +67,11 @@ namespace Gasa
|
||||
bool IsListenServer(UObject const* Context);
|
||||
|
||||
bool IsNetOwner(UObject const* Context);
|
||||
bool IsNetOwner(UGasaObject const* Context);
|
||||
bool IsNetOwner(AActor const* Context);
|
||||
|
||||
bool IsServer(UObject const* Context);
|
||||
|
||||
bool IsSimulatedProxy(UObject const* Context);
|
||||
bool IsSimulatedProxy(UGasaObject const* Context);
|
||||
bool IsSimulatedProxy(AActor const* Context);
|
||||
|
||||
void NetLog( UObject const* Context, FString Message, EGasaVerbosity Verbosity = EGasaVerbosity::Log
|
||||
@ -56,6 +82,7 @@ namespace Gasa
|
||||
, const ANSICHAR* Func = __builtin_FUNCTION() );
|
||||
|
||||
bool ServerAuthorized(UObject const* Context);
|
||||
bool ServerAuthorized(UGasaObject const* Context);
|
||||
bool ServerAuthorized(AActor const* Context);
|
||||
}
|
||||
|
||||
#include "GasaNetLibrary_Inlines.h"
|
||||
|
@ -1,35 +1,12 @@
|
||||
#include "GasaNetLibrary.h"
|
||||
#include "GasaObject.h"
|
||||
#pragma once
|
||||
#include "GasaNetLibrary.h"
|
||||
#include "Engine/NetDriver.h"
|
||||
#include "Game/GasaGameMode.h"
|
||||
#include "Kismet/KismetMathLibrary.h"
|
||||
#include "Kismet/KismetSystemLibrary.h"
|
||||
#include "Engine/World.h"
|
||||
|
||||
namespace Gasa
|
||||
{
|
||||
// TODO(Ed): Profile these...
|
||||
|
||||
inline
|
||||
void DrawNetCullingSphere(const UObject* Context, float Duration, float Thickness)
|
||||
{
|
||||
const AActor* actor = nullptr;
|
||||
|
||||
if (Context->IsA(UGasaObject::StaticClass()))
|
||||
actor = Cast<AActor>(Context->GetOuter());
|
||||
|
||||
else if (Context->IsA(AActor::StaticClass()))
|
||||
actor = Cast<AActor>(Context);
|
||||
|
||||
if (actor)
|
||||
UKismetSystemLibrary::DrawDebugSphere(actor
|
||||
, actor->GetActorLocation()
|
||||
, UKismetMathLibrary::Sqrt(actor->NetCullDistanceSquared) * 2
|
||||
, 12
|
||||
, FLinearColor(FColor::Emerald)
|
||||
, Duration
|
||||
, Thickness);
|
||||
}
|
||||
|
||||
inline
|
||||
ENetworkMode GetNetworkMode(UObject const* Context)
|
||||
{
|
||||
@ -110,8 +87,6 @@ namespace Gasa
|
||||
else if (Context->GetClass()->IsChildOf(UActorComponent::StaticClass()))
|
||||
Actor = Cast<UActorComponent>(Context)->GetOwner();
|
||||
// Its assumed that all GasaObjects have an outer actor
|
||||
else if (Context->IsA(UGasaObject::StaticClass()))
|
||||
Actor = Cast<AActor>(Context->GetOuter());
|
||||
else
|
||||
{
|
||||
UObject const* Outermost = Context->GetOutermostObject();
|
||||
@ -127,23 +102,7 @@ namespace Gasa
|
||||
bool Result = Actor->HasLocalNetOwner();
|
||||
return Result;
|
||||
}
|
||||
|
||||
inline
|
||||
bool IsNetOwner(UGasaObject const* Context)
|
||||
{
|
||||
if (Context == nullptr || Context->GetWorld() == nullptr)
|
||||
return false;
|
||||
|
||||
AActor const* Actor = Cast<AActor>(Context->GetOuter());
|
||||
if (Actor == nullptr)
|
||||
{
|
||||
Log("Could not get actor reference", ELogV::Warning, LogGasaNet);
|
||||
return false;
|
||||
}
|
||||
bool Result = Actor->HasLocalNetOwner();
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
bool IsNetOwner(AActor const* Actor)
|
||||
{
|
||||
@ -177,8 +136,6 @@ namespace Gasa
|
||||
else if (Context->GetClass()->IsChildOf(UActorComponent::StaticClass()))
|
||||
Actor = Cast<UActorComponent>(Context)->GetOwner();
|
||||
// Its assumed that all GasaObjects have an outer actor
|
||||
else if (Context->IsA(UGasaObject::StaticClass()))
|
||||
Actor = Cast<AActor>(Context->GetOuter());
|
||||
else
|
||||
{
|
||||
UObject const* Outermost = Context->GetOutermostObject();
|
||||
@ -194,22 +151,6 @@ namespace Gasa
|
||||
bool Result = Actor->GetLocalRole() == ENetRole::ROLE_SimulatedProxy;
|
||||
return Result;
|
||||
}
|
||||
|
||||
inline
|
||||
bool IsSimulatedProxy(UGasaObject const* Context)
|
||||
{
|
||||
if (Context == nullptr || Context->GetWorld() == nullptr)
|
||||
return false;
|
||||
|
||||
AActor const* Actor = Cast<AActor>(Context->GetOuter());
|
||||
if (Actor == nullptr)
|
||||
{
|
||||
Log("Could not get actor reference", ELogV::Warning, LogGasaNet);
|
||||
return false;
|
||||
}
|
||||
bool Result = Actor->GetLocalRole() == ENetRole::ROLE_SimulatedProxy;
|
||||
return Result;
|
||||
}
|
||||
|
||||
inline
|
||||
bool IsSimulatedProxy(AActor const* Actor)
|
||||
@ -233,8 +174,6 @@ namespace Gasa
|
||||
else if (Context->GetClass()->IsChildOf(UActorComponent::StaticClass()))
|
||||
Actor = Cast<UActorComponent>(Context)->GetOwner();
|
||||
// Its assumed that all GasaObjects have an outer actor
|
||||
else if (Context->IsA(UGasaObject::StaticClass()))
|
||||
Actor = Cast<AActor>(Context->GetOuter());
|
||||
else
|
||||
{
|
||||
UObject const* Outermost = Context->GetOutermostObject();
|
||||
@ -251,22 +190,6 @@ namespace Gasa
|
||||
return Result;
|
||||
}
|
||||
|
||||
inline
|
||||
bool ServerAuthorized(UGasaObject const* Context)
|
||||
{
|
||||
if (Context == nullptr || Context->GetWorld() == nullptr)
|
||||
return false;
|
||||
|
||||
AActor const* Actor = Cast<AActor>(Context->GetOuter());
|
||||
if (Actor == nullptr)
|
||||
{
|
||||
Log("Could not get actor reference", ELogV::Warning, LogGasaNet);
|
||||
return false;
|
||||
}
|
||||
bool Result = Actor->HasAuthority();
|
||||
return Result;
|
||||
}
|
||||
|
||||
inline
|
||||
bool ServerAuthorized(AActor const* Actor)
|
||||
{
|
||||
|
Reference in New Issue
Block a user