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; }
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; }