Code: Select all
/*=============================================================================
RevNet.h: Revision networking.
Copyright 2015 Sebastian Kaufel. All Rights Reserved.
Revision history:
* Created by Sebastian Kaufel
=============================================================================*/
/*-----------------------------------------------------------------------------
Replication (based on ut2004scripts3369).
-----------------------------------------------------------------------------*/
inline UBOOL NEQ( BITFIELD A, BITFIELD B, UPackageMap* Map )
{
return A!=B;
}
inline UBOOL NEQ( BYTE A, BYTE B, UPackageMap* Map )
{
return A!=B;
}
inline UBOOL NEQ( INT A, INT B, UPackageMap* Map )
{
return A!=B;
}
inline UBOOL NEQ( FLOAT& A, FLOAT& B, UPackageMap* Map)
{
return *(INT*)&A!=*(INT*)&B;
}
inline UBOOL NEQ( FVector& A, FVector& B, UPackageMap* Map)
{
return ((INT*)&A)[0]!=((INT*)&B)[0]
|| ((INT*)&A)[1]!=((INT*)&B)[1]
|| ((INT*)&A)[2]!=((INT*)&B)[2];
}
inline UBOOL NEQ( FRotator& A, FRotator& B, UPackageMap* Map)
{
return A.Pitch!=B.Pitch
|| A.Yaw !=B.Yaw
|| A.Roll !=B.Roll;
}
inline UBOOL NEQ( UObject* A, UObject* B, UPackageMap* Map)
{
return (Map->CanSerializeObject(A) ? A : NULL)!=B;
}
inline UBOOL NEQ( FName& A, FName B, UPackageMap* Map)
{
return *(INT*)&A!=*(INT*)&B;
}
inline UBOOL NEQ( FColor& A, FColor& B, UPackageMap* Map)
{
return *(INT*)&A!=*(INT*)&B;
}
inline UBOOL NEQ( FPlane& A, FPlane& B, UPackageMap* Map)
{
return ((INT*)&A)[0]!=((INT*)&B)[0]
|| ((INT*)&A)[1]!=((INT*)&B)[1]
|| ((INT*)&A)[2]!=((INT*)&B)[2]
|| ((INT*)&A)[3]!=((INT*)&B)[3];
}
inline UBOOL NEQ( const FString& A, const FString& B, UPackageMap* Map )
{
return A!=B;
}
#define DOREP(c,v) \
if( NEQ(v,((A##c*)Recent)->v,Map) ) \
{ \
static UProperty* sp##v = FindObjectChecked<UProperty>(A##c::StaticClass(),TEXT(#v)); \
*Ptr++ = sp##v->RepIndex; \
}
#define DOREPARRAY(c,v) \
{static UProperty* sp##v = FindObjectChecked<UProperty>(A##c::StaticClass(),TEXT(#v)); \
for( INT i=0; i<ARRAY_COUNT(v); i++ ) \
if( NEQ(v[i],((A##c*)Recent)->v[i],Map) ) \
*Ptr++ = sp##v->RepIndex+i;}
// Useful to replicate single BlendAnim slots.
#define DOREPARRAYINDEX(c,v,i) \
{static UProperty* sp##v = FindObjectChecked<UProperty>(A##c::StaticClass(),TEXT(#v)); \
if( NEQ(v[i],((A##c*)Recent)->v[i],Map) ) \
*Ptr++ = sp##v->RepIndex+i;}
/*-----------------------------------------------------------------------------
The End.
-----------------------------------------------------------------------------*/
For nativer replication basically four major functions which are important:
Code: Select all
// AActor interface.
INT* GetOptimizedRepList( BYTE* InDefault, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map );
void PreNetReceive();
void PostNetReceive();
INT* GetOptimizedRepList( BYTE* InDefault, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map );
Example:
Code: Select all
INT* AHXPlayerPawn::GetOptimizedRepList( BYTE* Recent, FPropertyRetirement* Retire, INT* Ptr, UPackageMap* Map )
{
guard(AHXPlayerPawn::GetOptimizedRepList)
Ptr = AActor::GetOptimizedRepList( Recent, Retire, Ptr, Map );
// Actor Overrides.
if ( Role==ROLE_Authority )
{
if( DrawType==DT_Mesh && ((RemoteRole<=ROLE_SimulatedProxy && (!bNetOwner || !bClientAnim)) || bDemoRecording) )
{
// Head Movement.
DOREPARRAYINDEX(Actor,BlendAnimSequence,3);
DOREPARRAYINDEX(Actor,SimBlendAnim,3);
DOREPARRAYINDEX(Actor,BlendAnimMinRate,3);
}
}
// [...]
// Check if native replication keyword is that. That way you can easily toggle by setting the uc nativereplication keyword to toggle between native and script replication.
if ( StaticClass()->ClassFlags & CLASS_NativeReplication )
{
}
return Ptr;
unguard;
}
Code: Select all
FPlane PreSimBlendAnim[4];
// NetReceive.
void AHXPlayerPawn::PreNetReceive()
{
guard(AHXPlayerPawn::PreNetReceive);
Super::PreNetReceive();
// Head Movement only.
PreSimBlendAnim[3] = SimBlendAnim[3];
unguard;
}
void AHXPlayerPawn::PostNetReceive()
{
guard(AHXPlayerPawn::PostNetReceive);
Super::PostNetReceive();
// Head Movement only.
if ( SimBlendAnim[3]!=PreSimBlendAnim[3] )
{
BlendAnimFrame[3] = SimBlendAnim[3].X * 0.0001;
BlendAnimRate[3] = SimBlendAnim[3].Y * 0.0001;
BlendTweenRate[3] = SimBlendAnim[3].Z * 0.001;
BlendAnimLast[3] = SimBlendAnim[3].W * 0.0001;
if ( BlendAnimLast[3]<0.0 )
{
BlendAnimLast[3] *= -1.0;
if ( BlendAnimMinRate[3]<0.5 )
BlendAnimMinRate[3] = 0.5;
}
}
unguard;
}