private static string GetAdapterGameObjectName(FieldInformation fieldInformation) { string adapterName = ""; if (fieldInformation.FieldType.HasOneOfTheFlags(FieldType.Nested | FieldType.External)) { var eofi = fieldInformation.GetFieldInformationParamter <ExternallyOwnedFieldInformation>(); adapterName += $"{eofi.fieldInformation.FieldName}_"; if (eofi.fieldInformation.FieldType.HasOneOfTheFlags(FieldType.Arrayed | FieldType.Listed)) { var efi = eofi.fieldInformation.GetFieldInformationParamter <EnumerableFieldInformation>(); adapterName += $"i{efi.index}_"; } } adapterName += fieldInformation.FieldName; if (fieldInformation.FieldType.HasOneOfTheFlags(FieldType.Arrayed | FieldType.Listed)) { adapterName += $"_i{fieldInformation.GetFieldInformationParamter<EnumerableFieldInformation>().index}"; } return(adapterName); }
private static object GetFieldOwner(ReplaceUnit replaceUnit, GameObject root) { object fieldOwner = null; FieldInformation fieldInformation = replaceUnit.fieldInformation; Type monoType = fieldInformation.FieldOwnerType; Component mono = FabulousExtensions .GetGameObjectAtAddress(root, replaceUnit.MonoAddress) .GetComponent(monoType); if (mono == null) { throw new NullReferenceException($"Failed to find mono {monoType} for field {fieldInformation.FieldName} and type {fieldInformation.FieldType} by its address for prefab: {root} at path {replaceUnit.prefabPath} and address {string.Join(",", replaceUnit.MonoAddress.ToArray())}"); } if (fieldInformation.FieldType.HasOneOfTheFlags(FieldType.Nested | FieldType.External)) { ExternallyOwnedFieldInformation eofi = fieldInformation.GetFieldInformationParamter <ExternallyOwnedFieldInformation>(); FieldInfo externalObjectFieldInfo = monoType.GetField(eofi.ExternalOwnerFieldName, ReferenceFinder.GENEROUS_NONSTATIC_FIELD_SEARCH_FLAGS); if (eofi.fieldInformation.FieldType.HasOneOfTheFlags(FieldType.Arrayed | FieldType.Listed)) { var efi = eofi.fieldInformation.GetFieldInformationParamter <EnumerableFieldInformation>(); IEnumerable enumberableOwner = (IEnumerable)externalObjectFieldInfo.GetValue(mono); int index = 0; foreach (var item in enumberableOwner) { if (index == efi.index) { fieldOwner = item; } index++; } } else { fieldOwner = externalObjectFieldInfo.GetValue(mono); } } else { fieldOwner = mono; } return(fieldOwner); }
private static void SetAdapterAndTMProFieldValues(TMProAdapter tmProAdapter, ReplaceUnit replaceUnit, object fieldOwner, FieldInfo adapterFieldInfo, FieldInfo tmProFieldInfo) { FieldInformation fieldInformation = replaceUnit.fieldInformation; FieldType fieldType = fieldInformation.FieldType; if (fieldType.HasOneOfTheFlags(FieldType.Listed | FieldType.Arrayed)) { var adpaterField = adapterFieldInfo.GetValue(fieldOwner); var tmProField = tmProFieldInfo.GetValue(fieldOwner); EnumerableFieldInformation efi = fieldInformation.GetFieldInformationParamter <EnumerableFieldInformation>(); if (adpaterField != null && tmProField != null) { if (adpaterField is List <TMProAdapter> adapterList) { adapterList[efi.index] = tmProAdapter; (tmProField as List <TextMeshProUGUI>).Add(tmProAdapter.TMProText); } else if (adpaterField is TMProAdapter[] adapterArray) { adapterArray[efi.index] = tmProAdapter; //* We don't need to do the same with above adapterArray since it already has the correct size as it //* replaced the old array of text components TextMeshProUGUI[] tmproFieldArray = tmProField as TextMeshProUGUI[]; TextMeshProUGUI[] newTMProFieldArray = new TextMeshProUGUI[tmproFieldArray.Length + 1]; tmproFieldArray.CopyTo(newTMProFieldArray, 0); newTMProFieldArray[tmproFieldArray.Length] = tmProAdapter.TMProText; tmProFieldInfo.SetValue(fieldOwner, newTMProFieldArray); } else { Debug.LogError($"Huh? Thats weird"); } } else { Debug.LogError($"Either adapter field: {adpaterField} or tmpro field: {tmProField} is null."); } } else { adapterFieldInfo.SetValue(fieldOwner, tmProAdapter); tmProFieldInfo.SetValue(fieldOwner, tmProAdapter.TMProText); } }