Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RiskUIRevived v1.0.4
RiskUIRevived.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using MaterialHud; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod.Cil; using RoR2; using RoR2.Scripts.GameBehaviors.UI; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.EventSystems; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RiskUIRevived")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RiskUIRevived")] [assembly: AssemblyTitle("RiskUIRevived")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace RiskUIRevived { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(string data) { } internal static void Info(string data) { } internal static void Message(string data) { _logSource.LogMessage((object)data); } internal static void Warning(string data) { _logSource.LogWarning((object)data); } internal static void Error(string data) { _logSource.LogError((object)data); } internal static void Fatal(string data) { _logSource.LogFatal((object)data); } } [HarmonyPatch] public static class NewHarmonyPatches { [HarmonyILManipulator] [HarmonyPatch(typeof(CameraRigController), "UpdateHUD")] public static void ReplaceHUD(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); int num = default(int); MethodReference val2 = default(MethodReference); val.GotoNext((MoveType)1, new Func<Instruction, bool>[3] { (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, ref val2), (Instruction x) => ILPatternMatchingExt.MatchStsfld(x, typeof(CameraRigController), "HudPrefab") }); val.EmitDelegate<Func<GameObject>>((Func<GameObject>)RiskUIPlugin.CreateHud); val.RemoveRange(2); val.GotoNext((MoveType)1, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(CameraRigController), "HudPrefab") }); val.EmitDelegate<Func<GameObject>>((Func<GameObject>)RiskUIPlugin.CreateHud); val.Remove(); } [HarmonyILManipulator] [HarmonyPatch(typeof(HealthBar), "UpdateBarInfos")] public static void FixInfusionColor(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(HealthBar), "voidPanelColor") }); val.Remove(); val.EmitDelegate<Func<Color>>((Func<Color>)delegate { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) Color value3 = RiskUIPlugin.VoidColor.Value; return (value3 == Color.clear) ? Color.HSVToRGB(Mathf.Sin(Time.time) * 0.5f + 0.5f, 1f, 1f) : value3; }); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(HealthBar), "infusionPanelColor") }); val.Remove(); val.EmitDelegate<Func<Color>>((Func<Color>)delegate { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) Color value2 = RiskUIPlugin.InfusionColor.Value; return (value2 == Color.clear) ? Color.HSVToRGB(Mathf.Sin(Time.time) * 0.5f + 0.5f, 1f, 1f) : value2; }); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(HealthBar), "voidShieldsColor") }); val.Remove(); val.EmitDelegate<Func<Color>>((Func<Color>)delegate { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) Color value = RiskUIPlugin.VoidShieldColor.Value; return (value == Color.clear) ? Color.HSVToRGB(Mathf.Sin(Time.time) * 0.5f + 0.5f, 1f, 1f) : value; }); } [HarmonyPrefix] [HarmonyPatch(typeof(Run), "InstantiateUi")] public static bool OverwriteTracker(Run __instance, Transform uiRoot, ref GameObject __result) { if (!Object.op_Implicit((Object)(object)uiRoot)) { return true; } string nameToken = __instance.nameToken; if (nameToken == "ECLIPSE_GAMEMODE_NAME" || nameToken == "GAMEMODE_CLASSIC_RUN_NAME") { __result = Object.Instantiate<GameObject>(RiskUIPlugin.CreateClassicRunHud(), uiRoot); __instance.uiInstances.Add(__result); return false; } return true; } [HarmonyPrefix] [HarmonyPatch(typeof(DifficultyDef), "GetIconSprite")] public static bool SwapIcon(DifficultyDef __instance, ref Sprite __result) { if (__instance.nameToken == null || !RiskUIPlugin.DifficultyIconMap.ContainsKey(__instance.nameToken)) { return true; } __result = RiskUIPlugin.DifficultyIconMap[__instance.nameToken]; return false; } [HarmonyILManipulator] [HarmonyPatch(typeof(AllyCardManager), "Awake")] public static void ReplaceAllyCards(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdstr(x, "Prefabs/UI/AllyCard") }); val.RemoveRange(2); val.EmitDelegate<Func<GameObject>>((Func<GameObject>)RiskUIPlugin.CreateAllyCard); } public static void MoveVoidSurvivorController(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0), (Instruction x) => ILPatternMatchingExt.MatchLdfld<VoidSurvivorController>(x, "overlayChildLocatorEntry") }); val.RemoveRange(2); val.Emit(OpCodes.Ldstr, "BottomLeftCluster"); } [HarmonyPostfix] [HarmonyPatch(typeof(EnemyInfoPanel), "Init")] public static void ChangeMonsterInventory() { EnemyInfoPanel.panelPrefab = RiskUIPlugin.EnemyInfoPanel; } [HarmonyPrefix] [HarmonyPatch(typeof(ScoreboardStrip), "ResetNavIndicators")] public static bool ResetNav() { return false; } [HarmonyPostfix] [HarmonyPatch(typeof(HUD), "DeactivateScoreboard")] public static void Unselect(HUD __instance) { ScoreboardController val = default(ScoreboardController); if (Object.op_Implicit((Object)(object)__instance.scoreboardPanel) && __instance.scoreboardPanel.TryGetComponent<ScoreboardController>(ref val) && Object.op_Implicit((Object)(object)val.eventSystem)) { ((EventSystem)val.eventSystem).SetSelectedGameObject((GameObject)null); val.eventSystem.currentSelectedButton = null; } } [HarmonyILManipulator] [HarmonyPatch(typeof(ItemIcon), "SetItemIndex")] public static void ItemCount(ILContext il) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) ILCursor[] array = null; if (new ILCursor(il).TryFindNext(ref array, new Func<Instruction, bool>[4] { (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(ItemIcon), "spriteAsNumberManager"), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<SpriteAsNumberManager>(x, "SetItemCount"), (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(ItemIcon), "spriteAsNumberManager"), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<SpriteAsNumberManager>(x, "SetVisible") })) { array[0].Remove(); array[0].Emit<ItemIcon>(OpCodes.Ldfld, "stackText"); array[1].Remove(); array[1].EmitDelegate<Action<TextMeshProUGUI, int>>((Action<TextMeshProUGUI, int>)delegate(TextMeshProUGUI image, int num) { ((TMP_Text)image).text = "x" + num; ((Behaviour)image).enabled = true; }); array[2].Remove(); array[2].Emit<ItemIcon>(OpCodes.Ldfld, "stackText"); array[3].Remove(); array[3].EmitDelegate<Action<TextMeshProUGUI, bool>>((Action<TextMeshProUGUI, bool>)delegate(TextMeshProUGUI image, bool num) { ((TMP_Text)image).text = ""; ((Behaviour)image).enabled = false; }); } } [HarmonyPrefix] [HarmonyPatch(typeof(ScoreboardStrip), "UpdateItemCountText")] public static bool NoCount() { return false; } [HarmonyPrefix] [HarmonyPatch(typeof(InspectPanelLocator), "Awake")] public static bool NoPanel() { return false; } [HarmonyILManipulator] [HarmonyPatch(typeof(ContextManager), "Update")] public static void NoInspect(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); val.Index = val.Instrs.Count - 1; if (val.TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, typeof(GameObject), "SetActive") })) { val.Remove(); val.EmitDelegate<Action<GameObject, bool>>((Action<GameObject, bool>)Slurp2); } if (val.TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)AccessTools.PropertySetter(typeof(TMP_Text), "text")) })) { val.Remove(); val.EmitDelegate<Action<TMP_Text, string>>((Action<TMP_Text, string>)Slurp); } if (val.TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)AccessTools.PropertySetter(typeof(TMP_Text), "text")) })) { val.Remove(); val.EmitDelegate<Action<TMP_Text, string>>((Action<TMP_Text, string>)Slurp); } if (val.TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, typeof(GameObject), "SetActive") })) { val.Remove(); val.EmitDelegate<Action<GameObject, bool>>((Action<GameObject, bool>)Slurp2); } if (val.TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)AccessTools.PropertySetter(typeof(TMP_Text), "text")) })) { val.Remove(); val.EmitDelegate<Action<TMP_Text, string>>((Action<TMP_Text, string>)Slurp); } if (val.TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)AccessTools.PropertySetter(typeof(TMP_Text), "text")) })) { val.Remove(); val.EmitDelegate<Action<TMP_Text, string>>((Action<TMP_Text, string>)Slurp); } static void Slurp(TMP_Text _, string __) { if (Object.op_Implicit((Object)(object)_)) { _.text = __; } } static void Slurp2(GameObject _, bool __) { if (Object.op_Implicit((Object)(object)_)) { _.SetActive(__); } } } } [BepInPlugin("_score.RiskUIRevived", "RiskUIRevived", "1.0.4")] public class RiskUIRevivedPlugin : BaseUnityPlugin { public const string PluginGUID = "_score.RiskUIRevived"; public const string PluginAuthor = "score"; public const string PluginName = "RiskUIRevived"; public const string PluginVersion = "1.0.4"; public static RiskUIRevivedPlugin Instance { get; private set; } public void Awake() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) Instance = this; Log.Init(((BaseUnityPlugin)this).Logger); new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID).CreateClassProcessor(typeof(PatchPlugin)).Patch(); } } [HarmonyPatch] public class PatchPlugin { [HarmonyPatch(typeof(RiskUIPlugin), "Awake")] [HarmonyILManipulator] public static void ReplaceTarget(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); IMetadataTokenProvider val4 = default(IMetadataTokenProvider); MethodReference val3 = default(MethodReference); MethodReference val2 = default(MethodReference); val.GotoNext(new Func<Instruction, bool>[6] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0), (Instruction x) => ILPatternMatchingExt.MatchLdfld<RiskUIPlugin>(x, "harm"), (Instruction x) => ILPatternMatchingExt.MatchLdtoken(x, ref val4), (Instruction x) => ILPatternMatchingExt.MatchCall(x, ref val3), (Instruction x) => ILPatternMatchingExt.MatchNewobj(x, ref val2), (Instruction x) => ILPatternMatchingExt.MatchStfld<RiskUIPlugin>(x, "patcher") }); val.RemoveRange(6); val.EmitDelegate<Action<RiskUIPlugin>>((Action<RiskUIPlugin>)delegate(RiskUIPlugin instance) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown instance.patcher = new PatchClassProcessor(instance.harm, typeof(NewHarmonyPatches)); }); } [HarmonyPatch(typeof(RiskUIPlugin), "Awake")] [HarmonyPostfix] public static void EditShit(RiskUIPlugin __instance) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) AssetBundle assetBundle = __instance.assetBundle; HUD component = RiskUIPlugin._newHud.GetComponent<HUD>(); GameObject go = assetBundle.LoadAsset<GameObject>("SkillIconRoot"); GameObject go2 = assetBundle.LoadAsset<GameObject>("HealthBarSub"); GameObject go3 = assetBundle.LoadAsset<GameObject>("MaterialChatbox"); GameObject go4 = assetBundle.LoadAsset<GameObject>("MaterialArtifactStatusIcon"); GameObject val = assetBundle.LoadAsset<GameObject>("MaterialObjectiveStrip"); SkillIcon[] skillIcons = component.skillIcons; GameObject buffIconPrefab = component.buffDisplay.buffIconPrefab; GameObject gameObject = ((Component)component.itemInventoryDisplay).gameObject; EquipmentIcon[] equipmentIcons = component.equipmentIcons; val.TryAddComponent<UIInputPassthrough>(); val.TryAddComponent<MPEventSystemLocator>(); val.TryAddComponent<ObjectiveStripAnimationParams>().Params = new List<ObjectiveStripAnimationParam>(4) { new ObjectiveStripAnimationParam { Param = "enterAlphaStartPercent", Value = 0.25f }, new ObjectiveStripAnimationParam { Param = "enterAlphaEndPercent", Value = 0.5f }, new ObjectiveStripAnimationParam { Param = "enterHeightStartPercent", Value = 0f }, new ObjectiveStripAnimationParam { Param = "enterHeightEndPercent", Value = 0.25f } }; if (Object.op_Implicit((Object)(object)val.transform.Find("Checkbox"))) { val.transform.Find("Checkbox").SetParent(val.transform.Find("Label")); } buffIconPrefab.TryAddComponent<UIInputPassthrough>(); buffIconPrefab.TryAddComponent<MPEventSystemLocator>(); MPButton obj = buffIconPrefab.TryAddComponent<MPButton>(); obj.disableGamepadClick = true; obj.disablePointerClick = true; ((Component)equipmentIcons[0]).gameObject.TryAddComponent<MPEventSystemLocator>(); ((Component)equipmentIcons[0]).gameObject.TryAddComponent<UIInputPassthrough>(); MPButton obj2 = ((Component)equipmentIcons[0]).gameObject.TryAddComponent<MPButton>(); obj2.disableGamepadClick = true; obj2.disablePointerClick = true; ((Component)equipmentIcons[1]).gameObject.TryAddComponent<MPEventSystemLocator>(); ((Component)equipmentIcons[1]).gameObject.TryAddComponent<UIInputPassthrough>(); MPButton obj3 = ((Component)equipmentIcons[1]).gameObject.TryAddComponent<MPButton>(); obj3.disableGamepadClick = true; obj3.disablePointerClick = true; ((Component)skillIcons[0]).gameObject.TryAddComponent<MPEventSystemLocator>(); ((Component)skillIcons[0]).gameObject.TryAddComponent<UIInputPassthrough>(); MPButton obj4 = ((Component)skillIcons[0]).gameObject.TryAddComponent<MPButton>(); obj4.disableGamepadClick = true; obj4.disablePointerClick = true; ((Component)skillIcons[1]).gameObject.TryAddComponent<MPEventSystemLocator>(); ((Component)skillIcons[1]).gameObject.TryAddComponent<UIInputPassthrough>(); MPButton obj5 = ((Component)skillIcons[1]).gameObject.TryAddComponent<MPButton>(); obj5.disableGamepadClick = true; obj5.disablePointerClick = true; ((Component)skillIcons[2]).gameObject.TryAddComponent<MPEventSystemLocator>(); ((Component)skillIcons[2]).gameObject.TryAddComponent<UIInputPassthrough>(); MPButton obj6 = ((Component)skillIcons[2]).gameObject.TryAddComponent<MPButton>(); obj6.disableGamepadClick = true; obj6.disablePointerClick = true; ((Component)skillIcons[3]).gameObject.TryAddComponent<MPEventSystemLocator>(); ((Component)skillIcons[3]).gameObject.TryAddComponent<UIInputPassthrough>(); MPButton obj7 = ((Component)skillIcons[3]).gameObject.TryAddComponent<MPButton>(); obj7.disableGamepadClick = true; obj7.disablePointerClick = true; gameObject.TryAddComponent<UIInputPassthrough>(); gameObject.TryAddComponent<MPEventSystemLocator>(); MPButton obj8 = gameObject.TryAddComponent<MPButton>(); obj8.disableGamepadClick = true; obj8.disablePointerClick = true; component.scoreboardPanel.TryAddComponent<UIInputPassthrough>(); component.scoreboardPanel.TryAddComponent<MPEventSystemLocator>(); ScoreboardController component2 = component.scoreboardPanel.GetComponent<ScoreboardController>(); component2.stripPrefab.TryAddComponent<UIInputPassthrough>(); ScoreboardStrip component3 = component2.stripPrefab.GetComponent<ScoreboardStrip>(); component3.eventSystemLocator = component2.stripPrefab.TryAddComponent<MPEventSystemLocator>(); ((Component)component3.equipmentIcon).gameObject.TryAddComponent<UIInputPassthrough>(); ((Component)component3.equipmentIcon).gameObject.TryAddComponent<MPEventSystemLocator>(); MPButton obj9 = ((Component)component3).gameObject.TryAddComponent<MPButton>(); obj9.disableGamepadClick = true; obj9.disablePointerClick = true; go3.TryAddComponent<UIInputPassthrough>(); go3.TryAddComponent<MPEventSystemLocator>(); go4.TryAddComponent<UIInputPassthrough>(); go4.TryAddComponent<MPEventSystemLocator>(); go2.TryAddComponent<UIInputPassthrough>(); go2.TryAddComponent<MPEventSystemLocator>(); go.TryAddComponent<UIInputPassthrough>(); go.TryAddComponent<MPEventSystemLocator>(); RiskUIPlugin.EnemyInfoPanel.TryAddComponent<UIInputPassthrough>(); RiskUIPlugin.EnemyInfoPanel.TryAddComponent<MPEventSystemLocator>(); RiskUIPlugin._allyCard.TryAddComponent<UIInputPassthrough>(); RiskUIPlugin._allyCard.TryAddComponent<MPEventSystemLocator>(); RiskUIPlugin._newClassicRunHud.TryAddComponent<UIInputPassthrough>(); RiskUIPlugin._newClassicRunHud.TryAddComponent<MPEventSystemLocator>(); RiskUIPlugin._newSimulacrumHud.TryAddComponent<UIInputPassthrough>(); RiskUIPlugin._newSimulacrumHud.TryAddComponent<MPEventSystemLocator>(); RiskUIPlugin.BaseWaveUI.TryAddComponent<UIInputPassthrough>(); RiskUIPlugin.BaseWaveUI.TryAddComponent<MPEventSystemLocator>(); } } internal static class Utils { public static T TryAddComponent<T>(this GameObject go) where T : Component { T result = default(T); if (go.TryGetComponent<T>(ref result)) { return result; } return go.AddComponent<T>(); } public static void RemoveComponent<T>(this GameObject go) where T : Component { T val = default(T); if (go.TryGetComponent<T>(ref val)) { Object.Destroy((Object)(object)val); } } public static void RemoveComponents<T>(this GameObject go) where T : Component { T[] components = go.GetComponents<T>(); for (int i = 0; i < components.Length; i++) { Object.Destroy((Object)(object)components[i]); } } public static T GetCopyOf<T>(this Component comp, T other) where T : Component { Type type = ((object)comp).GetType(); if (type != ((object)other).GetType()) { return default(T); } BindingFlags bindingAttr = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanWrite) { try { propertyInfo.SetValue(comp, propertyInfo.GetValue(other, null), null); } catch { } } } FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { fieldInfo.SetValue(comp, fieldInfo.GetValue(other)); } return (T)(object)((comp is T) ? comp : null); } public static T GetCopyOf<T>(this ScriptableObject comp, T other) where T : ScriptableObject { Type type = ((object)comp).GetType(); if (type != ((object)other).GetType()) { return default(T); } BindingFlags bindingAttr = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; PropertyInfo[] properties = type.GetProperties(bindingAttr); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanWrite) { try { propertyInfo.SetValue(comp, propertyInfo.GetValue(other, null), null); } catch { } } } FieldInfo[] fields = type.GetFields(bindingAttr); foreach (FieldInfo fieldInfo in fields) { fieldInfo.SetValue(comp, fieldInfo.GetValue(other)); } return (T)(object)((comp is T) ? comp : null); } public static T AddComponentCopy<T>(this GameObject go, T toAdd) where T : Component { return ((Component)(object)go.AddComponent<T>()).GetCopyOf(toAdd); } } }