示例#1
0
FClassNetCache* UPackageMap::GetClassNetCache( UClass* Class )
{
	FClassNetCache* Result = ClassFieldIndices.FindRef(Class);
	if( !Result && SupportsObject(Class) )
	{
		Result                       = ClassFieldIndices.Add( Class, new FClassNetCache(Class) );
		Result->Super                = NULL;
		Result->FieldsBase           = 0;
		if( Class->GetSuperClass() )
		{
			Result->Super		         = GetClassNetCache(Class->GetSuperClass());
			Result->FieldsBase           = Result->Super->GetMaxIndex();
		}

		Result->Fields.Empty( Class->NetFields.Num() );
		for( int32 i=0; i<Class->NetFields.Num(); i++ )
		{
			// Add sandboxed items to net cache.  
			UField* Field = Class->NetFields[i];
			if( SupportsObject(Field ) )
			{
				int32 ThisIndex      = Result->GetMaxIndex();
 				new(Result->Fields)FFieldNetCache( Field, ThisIndex );
			}
		}

		Result->Fields.Shrink();
		for( TArray<FFieldNetCache>::TIterator It(Result->Fields); It; ++It )
		{
			Result->FieldMap.Add( It->Field, &*It );
		}
	}
	return Result;
}
示例#2
0
const FClassNetCache * FClassNetCacheMgr::GetClassNetCache( const UClass* Class )
{
	FClassNetCache * Result = ClassFieldIndices.FindRef( Class );

	if ( !Result )
	{
		Result					= ClassFieldIndices.Add( Class, new FClassNetCache( Class ) );
		Result->Super			= NULL;
		Result->FieldsBase		= 0;
		Result->ClassChecksum	= 0;

		if ( Class->GetSuperClass() )
		{
			Result->Super			= GetClassNetCache( Class->GetSuperClass() );
			Result->FieldsBase		= Result->Super->GetMaxIndex();
			Result->ClassChecksum	= Result->Super->ClassChecksum;
		}

		Result->Fields.Empty( Class->NetFields.Num() );

		TArray< UProperty* > Properties;

		for( int32 i = 0; i < Class->NetFields.Num(); i++ )
		{
			// Add each net field to cache, and assign index/checksum
			UField * Field = Class->NetFields[i];

			UProperty* Property = Cast< UProperty >( Field );
			
			if ( Property != NULL )
			{
				Properties.Add( Property );
			}

			// Get individual checksum
			const uint32 Checksum = GetFieldChecksum( Field, 0 );

			// Get index
			const int32 ThisIndex = Result->GetMaxIndex();

			// Add to cached fields on this class
			Result->Fields.Add( FFieldNetCache( Field, ThisIndex, Checksum ) );
		}

		Result->Fields.Shrink();

		// Add fields to the appropriate hash maps
		for ( TArray< FFieldNetCache >::TIterator It( Result->Fields ); It; ++It )
		{
			Result->FieldMap.Add( It->Field, &*It );

			if ( Result->FieldChecksumMap.Contains( It->FieldChecksum ) )
			{
				UE_LOG( LogCoreNet, Error, TEXT ( "Duplicate checksum: %s, %u" ), *It->Field->GetName(), It->FieldChecksum );
			}

			Result->FieldChecksumMap.Add( It->FieldChecksum, &*It );
		}

		// Initialize class checksum (just use properties for this)
		SortProperties( Properties );

		for ( auto Property : Properties )
		{
			Result->ClassChecksum = GetPropertyChecksum( Property, Result->ClassChecksum );
		}
	}
	return Result;
}