FClassArchiveProxy::FClassArchiveProxy(FUHTMakefile& UHTMakefile, const UClass* Class)
    : FStructArchiveProxy(UHTMakefile, Class)
{
    ClassUnique = Class->ClassUnique;
    ClassFlags = Class->ClassFlags;
    ClassCastFlags = Class->ClassCastFlags;
    ClassWithinIndex = UHTMakefile.GetClassIndex(Class->ClassWithin);
    ClassGeneratedByIndex = UHTMakefile.GetObjectIndex(Class->ClassGeneratedBy);
    ClassConfigName = FNameArchiveProxy(UHTMakefile, Class->ClassConfigName);
    bCooked = Class->bCooked;
    ClassReps.Empty(Class->ClassReps.Num());
    for (FRepRecord RepRecord : Class->ClassReps)
    {
        ClassReps.Add(FRepRecordArchiveProxy(UHTMakefile, RepRecord));
    }

    NetFields.Empty(Class->NetFields.Num());
    for (UField* Field : Class->NetFields)
    {
        NetFields.Add(UHTMakefile.GetFieldIndex(Field));
    }

    FuncMap.Empty(Class->FuncMap.Num());
    for (auto& Kvp : Class->FuncMap)
    {
        FuncMap.Add(TPairInitializer<FNameArchiveProxy, int32>(FNameArchiveProxy(UHTMakefile, Kvp.Key), UHTMakefile.GetFunctionIndex(Kvp.Value)));
    }

    Interfaces.Empty(Class->Interfaces.Num());
    for (FImplementedInterface ImplementedInterface : Class->Interfaces)
    {
        Interfaces.Add(FImplementedInterfaceArchiveProxy(UHTMakefile, ImplementedInterface));
    }
}
FObjectBaseArchiveProxy::FObjectBaseArchiveProxy(FUHTMakefile& UHTMakefile, const UObjectBase* ObjectBase)
{
	ObjectFlagsUint32 = static_cast<uint32>(ObjectBase->ObjectFlags);
	ClassIndex = UHTMakefile.GetClassIndex(ObjectBase->Class);
	Name = FNameArchiveProxy(UHTMakefile, ObjectBase->Name);
	OuterIndex = UHTMakefile.GetObjectIndex(ObjectBase->Outer);
}
void FClassArchiveProxy::Resolve(UClass* Class, const FUHTMakefile& UHTMakefile) const
{
    FStructArchiveProxy::Resolve(Class, UHTMakefile);
    Class->SetSuperStruct(UHTMakefile.GetStructByIndex(SuperStructIndex));
    Class->ClassWithin = UHTMakefile.GetClassByIndex(ClassWithinIndex);
    Class->ClassGeneratedBy = UHTMakefile.GetObjectByIndex(ClassGeneratedByIndex);

    Class->NetFields.Empty(NetFields.Num());
    for (FSerializeIndex FieldIndex : NetFields)
    {
        Class->NetFields.Add(UHTMakefile.GetFieldByIndex(FieldIndex));
    }

    Class->FuncMap.Empty(FuncMap.Num());
    for (auto& Kvp : FuncMap)
    {
        Class->FuncMap.Add(Kvp.Key.CreateName(UHTMakefile), UHTMakefile.GetFunctionByIndex(Kvp.Value));
    }

    Class->Interfaces.Empty(Interfaces.Num());
    for (FImplementedInterfaceArchiveProxy ImplementedInterfaceArchiveProxy : Interfaces)
    {
        FImplementedInterface ImplementedInterface = ImplementedInterfaceArchiveProxy.CreateImplementedInterface(UHTMakefile);
        ImplementedInterfaceArchiveProxy.Resolve(ImplementedInterface, UHTMakefile);
        Class->Interfaces.Add(ImplementedInterface);
    }
    Class->ClassConfigName = ClassConfigName.CreateName(UHTMakefile);
}
void FClassArchiveProxy::AddReferencedNames(const UClass* Class, FUHTMakefile& UHTMakefile)
{
    FStructArchiveProxy::AddReferencedNames(Class, UHTMakefile);
    UHTMakefile.AddName(Class->ClassConfigName);
    for (auto& Kvp : Class->FuncMap)
    {
        UHTMakefile.AddName(Kvp.Key);
    }
}
void FScopeArchiveProxy::Resolve(FScope* Scope, const FUHTMakefile& UHTMakefile) const
{
	Scope->Parent = UHTMakefile.GetScopeByIndex(ParentIndex);
	for (auto& Kvp : TypeMap)
	{
		FName Name = Kvp.Key.CreateName(UHTMakefile);
		UField* Field = UHTMakefile.GetFieldByIndex(Kvp.Value);
		Scope->TypeMap.Add(Name, Field);
	}
}
void FScopeArchiveProxy::AddReferencedNames(const FScope* Scope, FUHTMakefile& UHTMakefile)
{
	for (auto& Kvp : Scope->TypeMap)
	{
		UHTMakefile.AddName(Kvp.Key);
	}
}
FScopeArchiveProxy::FScopeArchiveProxy(const FUHTMakefile& UHTMakefile, const FScope* Scope)
{
	ParentIndex = UHTMakefile.GetScopeIndex(Scope->GetParent());
	for (auto& Kvp : Scope->TypeMap)
	{
		TypeMap.Add(TPairInitializer<FNameArchiveProxy, FSerializeIndex>(FNameArchiveProxy(UHTMakefile, Kvp.Key), UHTMakefile.GetFieldIndex(Kvp.Value)));
	}
}
void FEnumArchiveProxy::AddReferencedNames(const UEnum* Enum, FUHTMakefile& UHTMakefile)
{
	FFieldArchiveProxy::AddReferencedNames(Enum, UHTMakefile);
	for (int32 i = 0; i < Enum->NumEnums(); ++i)
	{
		UHTMakefile.AddName(Enum->GetNameByIndex(i));
	}
}
void FObjectBaseArchiveProxy::AddReferencedNames(const UObjectBase* ObjectBase, FUHTMakefile& UHTMakefile)
{
	UHTMakefile.AddName(ObjectBase->Name);
}
void FObjectBaseArchiveProxy::Resolve(UObjectBase* ObjectBase, const FUHTMakefile& UHTMakefile) const
{
	ObjectBase->Class = UHTMakefile.GetClassByIndex(ClassIndex);
	ObjectBase->Outer = UHTMakefile.GetObjectByIndex(OuterIndex);
}
FFieldArchiveProxy::FFieldArchiveProxy(FUHTMakefile& UHTMakefile, const UField* Field)
	: FObjectBaseArchiveProxy(UHTMakefile, Field)
{
	NextIndex = UHTMakefile.GetFieldIndex(Field->Next);
}
void FFieldArchiveProxy::Resolve(UField* Field, const FUHTMakefile& UHTMakefile) const
{
	FObjectBaseArchiveProxy::Resolve(Field, UHTMakefile);
	Field->Next = UHTMakefile.GetFieldByIndex(NextIndex);
}