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 ChensHelpers v1.1.6
ChensHelpers.dll
Decompiled 10 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Chen.Helpers.CollectionHelpers; using Chen.Helpers.GeneralHelpers; using Chen.Helpers.LogHelpers; using Chen.Helpers.UnityHelpers; using On.RoR2.Networking; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.Utils; using RoR2; using RoR2.ContentManagement; using RoR2.Networking; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Rendering; [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("ChensHelpers")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.1.2.0")] [assembly: AssemblyInformationalVersion("1.1.2+dcfebc1819c431a4b6c93703cde76c81257036ce")] [assembly: AssemblyProduct("ChensHelpers")] [assembly: AssemblyTitle("ChensHelpers")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/cheeeeeeeeeen/RoR2-ChensHelpers")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.2.0")] [module: UnverifiableCode] namespace Chen.Helpers { [BepInPlugin("com.Chen.ChensHelpers", "ChensHelpers", "1.1.6")] [BepInDependency("com.bepis.r2api", "5.1.5")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [R2APISubmoduleDependency(new string[] { "SoundAPI", "NetworkingAPI" })] public class HelperPlugin : BaseUnityPlugin { public const string ModVer = "1.1.6"; public const string ModName = "ChensHelpers"; public const string ModGuid = "com.Chen.ChensHelpers"; internal static Log Log { get; private set; } private void Awake() { Log = new Log(((BaseUnityPlugin)this).Logger); NetworkingAPI.RegisterMessageType<MinionExtensions.SyncOwner>(); } } } namespace Chen.Helpers.UnityHelpers { public static class Extensions { public static T GetOrAddComponent<T>(this GameObject gameObject) where T : Component { T val = gameObject.GetComponent<T>(); if (!Object.op_Implicit((Object)(object)val)) { val = gameObject.AddComponent<T>(); } return val; } public static T GetOrAddComponent<T>(this Component component) where T : Component { return component.gameObject.GetOrAddComponent<T>(); } public static T GetOrAddComponent<T>(this GameObject gameObject, Action<T> action) where T : Component { T orAddComponent = gameObject.GetOrAddComponent<T>(); action(orAddComponent); return orAddComponent; } public static T GetOrAddComponent<T>(this Component component, Action<T> action) where T : Component { return component.gameObject.GetOrAddComponent(action); } public static T GetOrAddComponent<T>(this GameObject gameObject, Action<T> getAction, Action<T> addAction) where T : Component { T val = gameObject.GetComponent<T>(); if (Object.op_Implicit((Object)(object)val)) { getAction(val); } else { val = gameObject.AddComponent<T>(); addAction(val); } return val; } public static T GetOrAddComponent<T>(this Component component, Action<T> getAction, Action<T> addAction) where T : Component { return component.gameObject.GetOrAddComponent(getAction, addAction); } public static List<T> DeepCopyComponentsFrom<T>(this GameObject targetGameObject, GameObject sourceGameObject) where T : Component { List<T> list = new List<T>(); T[] components = sourceGameObject.GetComponents<T>(); T[] array = components; foreach (T originalComponent in array) { T item = originalComponent.DeepCopy(targetGameObject); list.Add(item); } return list; } public static List<T> DeepCopyComponentsTo<T>(this GameObject sourceGameObject, GameObject targetGameObject) where T : Component { return targetGameObject.DeepCopyComponentsFrom<T>(sourceGameObject); } public static T DeepCopy<T>(this T originalComponent, GameObject targetGameObject) where T : Component { T val = targetGameObject.AddComponent<T>(); FieldInfo[] fields = typeof(T).GetFields(); FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { fieldInfo.SetValue(val, fieldInfo.GetValue(originalComponent)); } return val; } } public abstract class ListProcessor<T> : MonoBehaviour { protected List<T> processList = new List<T>(); private float intervalTimer; private readonly List<T> failedItems = new List<T>(); protected abstract bool repeatUntilSuccess { get; set; } protected abstract float processInterval { get; set; } public virtual bool Add(T item) { return processList.ConditionalAdd(item, (T listItem) => item.Equals(listItem)); } protected abstract bool Process(T item); protected virtual void OnSuccess(T item) { } protected virtual void OnFailure(T item) { if (repeatUntilSuccess) { failedItems.Add(item); } } protected virtual void FixedUpdate() { intervalTimer += Time.fixedDeltaTime; if (!(intervalTimer >= processInterval)) { return; } while (processList.Count > 0) { foreach (T process in processList) { if (Process(process)) { OnSuccess(process); } else { OnFailure(process); } } if (!repeatUntilSuccess) { break; } processList.Clear(); processList.AddRange(failedItems); } intervalTimer -= processInterval; } } public abstract class QueueProcessor<T> : MonoBehaviour { protected readonly Queue<T> processQueue = new Queue<T>(); private float intervalTimer; protected abstract int itemsPerFrame { get; set; } protected abstract float processInterval { get; set; } public virtual void Add(T item) { processQueue.Enqueue(item); } protected abstract bool Process(T item); protected virtual void OnSuccess(T item) { } protected virtual void OnFailure(T item) { } protected virtual void FixedUpdate() { intervalTimer += Time.fixedDeltaTime; if (!(intervalTimer >= processInterval)) { return; } for (int i = 0; i < itemsPerFrame; i++) { if (processQueue.Count <= 0) { break; } T item = processQueue.Dequeue(); if (Process(item)) { OnSuccess(item); continue; } OnFailure(item); processQueue.Enqueue(item); } intervalTimer -= processInterval; } } public class TemporaryParticleSystem : MonoBehaviour { public bool detonate; public ParticleSystem particleSystem; protected virtual void Awake() { detonate = true; particleSystem = ((Component)this).gameObject.GetComponent<ParticleSystem>(); if (!Object.op_Implicit((Object)(object)particleSystem)) { Object.Destroy((Object)(object)this); } } protected virtual void FixedUpdate() { if (detonate && !particleSystem.isEmitting) { Object.Destroy((Object)(object)((Component)this).gameObject); } } } } namespace Chen.Helpers.MathHelpers { public static class Arithmetic { public static float SafeDivide(this float dividend, float divisor, float fallbackResult = float.PositiveInfinity) { if (divisor == 0f) { return fallbackResult; } return dividend / divisor; } public static int SafeDivide(this int dividend, int divisor, int fallbackResult = 0) { if (divisor == 0) { return fallbackResult; } return dividend / divisor; } public static int Sum(this int[] numbers, Func<int, int> preProcess = null) { int num = 0; foreach (int num2 in numbers) { int num3 = preProcess?.Invoke(num2) ?? num2; num += num3; } return num; } public static float Sum(this float[] numbers, Func<float, float> preProcess = null) { float num = 0f; foreach (float num2 in numbers) { float num3 = preProcess?.Invoke(num2) ?? num2; num += num3; } return num; } public static float Average(this int[] numbers, Func<int, int> preProcess = null) { return numbers.Sum(preProcess) / numbers.Length; } public static float Average(this float[] numbers, Func<float, float> preProcess = null) { return numbers.Sum(preProcess) / (float)numbers.Length; } } public static class Percent { private static readonly int[] groupSize = new int[1] { 3 }; private static readonly NumberFormatInfo numberFormatInfo = new NumberFormatInfo { PercentPositivePattern = 1, PercentNegativePattern = 1, NegativeSign = "-", PercentSymbol = "%", PercentDecimalDigits = 0, PercentDecimalSeparator = ".", PercentGroupSeparator = "", PercentGroupSizes = groupSize, NumberNegativePattern = 1, NumberGroupSizes = groupSize, NumberGroupSeparator = "", NumberDecimalSeparator = ".", NumberDecimalDigits = 0 }; public static float ToPercent(this float number) { return number * 100f; } public static string ToPercent(this float number, uint precision) { return number.ToString($"P{precision}", numberFormatInfo); } public static float ToDecimal(this float percentage) { return percentage / 100f; } public static string ToDecimal(this float percentage, uint precision) { return percentage.ToDecimal().ToString($"N{precision}", numberFormatInfo); } } public static class Wave { public static float Sine(float phase, float frequency, float amplitude, float baseValue) { float x = GetX(phase, frequency); float y = Mathf.Sin(x * 2f * MathF.PI); return Compute(y, amplitude, baseValue); } public static float Triangle(float phase, float frequency, float amplitude, float baseValue) { float x = GetX(phase, frequency); float y = ((!(x < 0.5f)) ? (-4f * x + 3f) : (4f * x - 1f)); return Compute(y, amplitude, baseValue); } public static float Square(float phase, float frequency, float amplitude, float baseValue) { float x = GetX(phase, frequency); float y = ((!(x < 0.5f)) ? (-1f) : 1f); return Compute(y, amplitude, baseValue); } public static float Sawtooth(float phase, float frequency, float amplitude, float baseValue) { return Compute(GetX(phase, frequency), amplitude, baseValue); } public static float InvertedSawtooth(float phase, float frequency, float amplitude, float baseValue) { return Compute(1f - GetX(phase, frequency), amplitude, baseValue); } public static float Noisy(float amplitude, float baseValue) { return Compute(1f - Random.value * 2f, amplitude, baseValue); } private static float GetX(float phase, float frequency) { float num = (Time.time + phase) * frequency; return num - Mathf.Floor(num); } private static float Compute(float y, float amplitude, float baseValue) { return y * amplitude + baseValue; } } } namespace Chen.Helpers.LogHelpers { public class Log { private readonly ManualLogSource logger; public Log(ManualLogSource logger) { this.logger = logger; } public void Debug(object data) { logger.LogDebug(data); } public void Error(object data) { logger.LogError(data); } public void Info(object data) { logger.LogInfo(data); } public void Message(object data) { logger.LogMessage(data); } public void Warning(object data) { logger.LogWarning(data); } } } namespace Chen.Helpers.LogHelpers.Collections { public static class Extensions { private const string defaultToken = "%DATA%"; public static void MessageArray<T>(this Log logger, T[] data, string format = "%DATA%", string representation = "%DATA%") { GenericLogging(data, format, representation, delegate(string item) { logger.Message(item); }); } public static void MessageArray<T>(this Log logger, T[] data, Func<T, string> formatter) { GenericLogging(data, formatter, delegate(string formatted) { logger.Message(formatted); }); } public static void InfoArray<T>(this Log logger, T[] data, string format = "%DATA%", string representation = "%DATA%") { GenericLogging(data, format, representation, delegate(string item) { logger.Info(item); }); } public static void InfoArray<T>(this Log logger, T[] data, Func<T, string> formatter) { GenericLogging(data, formatter, delegate(string formatted) { logger.Info(formatted); }); } public static void WarningArray<T>(this Log logger, T[] data, string format = "%DATA%", string representation = "%DATA%") { GenericLogging(data, format, representation, delegate(string item) { logger.Warning(item); }); } public static void WarningArray<T>(this Log logger, T[] data, Func<T, string> formatter) { GenericLogging(data, formatter, delegate(string formatted) { logger.Warning(formatted); }); } public static void ErrorArray<T>(this Log logger, T[] data, string format = "%DATA%", string representation = "%DATA%") { GenericLogging(data, format, representation, delegate(string item) { logger.Error(item); }); } public static void ErrorArray<T>(this Log logger, T[] data, Func<T, string> formatter) { GenericLogging(data, formatter, delegate(string formatted) { logger.Error(formatted); }); } public static void DebugArray<T>(this Log logger, T[] data, string format = "%DATA%", string representation = "%DATA%") { GenericLogging(data, format, representation, delegate(string item) { logger.Debug(item); }); } public static void DebugArray<T>(this Log logger, T[] data, Func<T, string> formatter) { GenericLogging(data, formatter, delegate(string formatted) { logger.Debug(formatted); }); } private static void GenericLogging<T>(T[] data, string format, string token, Action<string> logAction) { for (int i = 0; i < data.Length; i++) { T val = data[i]; string text = ""; string[] array = format.Split(new string[1] { token }, StringSplitOptions.None); int num = array.Length; for (int j = 0; j < num; j++) { text += array[j]; if (j != num - 1) { text += val.ToString(); } } logAction(text); } } private static void GenericLogging<T>(T[] data, Func<T, string> formatter, Action<string> logAction) { foreach (T arg in data) { logAction(formatter(arg)); } } } } namespace Chen.Helpers.GeneralHelpers { public class AssetsManager { public struct BundleInfo : IEquatable<BundleInfo> { public string source; public BundleType type; public BundleInfo(string source, BundleType type) { this.source = source; this.type = type; } public bool Equals(BundleInfo other) { return source == other.source; } } public enum BundleType : byte { UnityAssetBundle, WWiseSoundBank } private readonly BundleInfo bundleInfo; public AssetsManager(BundleInfo bundleInfo) { this.bundleInfo = bundleInfo; } public AssetBundle Register() { using Stream stream = Assembly.GetCallingAssembly().GetManifestResourceStream(bundleInfo.source); switch (bundleInfo.type) { case BundleType.UnityAssetBundle: return AssetBundle.LoadFromStream(stream); case BundleType.WWiseSoundBank: { byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); SoundBanks.Add(array); return null; } default: return null; } } } public class BlastAttack : BlastAttack { public struct HitPointAndResult { public HitPoint[] hitPoints; public Result result; } public HitPointAndResult InformativeFire() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) HitPoint[] array = ((BlastAttack)this).CollectHits(); ((BlastAttack)this).HandleHits(array); HitPointAndResult result = default(HitPointAndResult); result.hitPoints = array; result.result = new Result { hitCount = array.Length }; return result; } } public static class DefaultData { public static Dictionary<string, string> ShaderReplacements = new Dictionary<string, string> { { "fake ror/hopoo games/deferred/hgstandard", "shaders/deferred/hgstandard" }, { "fake ror/hopoo games/fx/hgcloud intersection remap", "shaders/fx/hgintersectioncloudremap" }, { "fake ror/hopoo games/fx/hgcloud remap", "shaders/fx/hgcloudremap" }, { "fake ror/hopoo games/fx/hgdistortion", "shaders/fx/hgdistortion" }, { "fake ror/hopoo games/deferred/hgsnow topped", "shaders/deferred/snow topped" } }; } public static class DropletGenerator { public static void Update() { } } public static class Extensions { public static RendererInfo[] BuildRendererInfos(this CharacterModel model, GameObject basisObject) { return model.BuildRendererInfos(basisObject, (ShadowCastingMode)1, ignoreOverlays: false); } public static RendererInfo[] BuildRendererInfos(this CharacterModel model, GameObject basisObject, ShadowCastingMode mode, bool ignoreOverlays) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) MeshRenderer[] componentsInChildren = basisObject.GetComponentsInChildren<MeshRenderer>(); model.baseRendererInfos = (RendererInfo[])(object)new RendererInfo[componentsInChildren.Length]; for (int i = 0; i < componentsInChildren.Length; i++) { model.baseRendererInfos[i] = new RendererInfo { defaultMaterial = ((Renderer)componentsInChildren[i]).material, renderer = (Renderer)(object)componentsInChildren[i], defaultShadowCastingMode = mode, ignoreOverlays = ignoreOverlays }; } return model.baseRendererInfos; } public static void ReplaceModel(this GameObject originalClonedObject, GameObject replacementModel, bool debug = false) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) ModelLocator component = originalClonedObject.GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component)) { Transform val; if (Object.op_Implicit((Object)(object)(val = originalClonedObject.transform.Find("ModelBase")))) { Object.Destroy((Object)(object)((Component)val).gameObject); } if (Object.op_Implicit((Object)(object)(val = originalClonedObject.transform.Find("Model Base")))) { Object.Destroy((Object)(object)((Component)val).gameObject); } GameObject val2 = new GameObject("ModelBase"); val2.transform.parent = originalClonedObject.transform; val2.transform.localPosition = Vector3.zero; val2.transform.localRotation = Quaternion.identity; val2.transform.localScale = Vector3.one; Transform transform = replacementModel.transform; transform.parent = val2.transform; transform.localPosition = Vector3.zero; transform.localRotation = Quaternion.identity; component.modelTransform = replacementModel.transform; component.modelBaseTransform = val2.transform; if (debug) { replacementModel.AddComponent<MaterialController>(); } } } public static void ConvertShaders(this AssetBundle assetBundle, Dictionary<string, string> replacementDictionary, string shaderPrefix) { IEnumerable<Material> enumerable = assetBundle.LoadAllAssets<Material>().Where(materialFilter); foreach (Material item in enumerable) { Shader val = Resources.Load<Shader>(replacementDictionary[((Object)item.shader).name.ToLower()]); if (Object.op_Implicit((Object)(object)val)) { item.shader = val; } } bool materialFilter(Material material) { return ((Object)material.shader).name.ToLower().StartsWith(shaderPrefix.ToLower()); } } public static void ConvertShaders(this AssetBundle assetBundle) { assetBundle.ConvertShaders(DefaultData.ShaderReplacements, "Fake RoR"); } } public abstract class GenericContentPackProvider : IContentPackProvider { protected ContentPack contentPack = new ContentPack(); public string identifier => ContentIdentifier(); public void Initialize() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)delegate(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); }; } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { contentPack.identifier = identifier; LoadStaticContentAsyncActions(args); args.ReportProgress(1f); yield break; } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } protected abstract string ContentIdentifier(); protected abstract void LoadStaticContentAsyncActions(LoadStaticContentAsyncArgs args); } public static class Instances { public static PlayerCharacterMasterController hostPcmc { get { PlayerCharacterMasterController val = PlayerCharacterMasterController.instances[0]; if (!Object.op_Implicit((Object)(object)val)) { HelperPlugin.Log.Debug("hostPcmc is null"); } return val; } } public static CharacterMaster hostMaster { get { CharacterMaster val = null; if (Object.op_Implicit((Object)(object)hostPcmc)) { val = hostPcmc.master; } if (!Object.op_Implicit((Object)(object)val)) { HelperPlugin.Log.Debug("hostMaster is null"); } return val; } } public static GameObject hostMasterObject { get { GameObject result = null; if (Object.op_Implicit((Object)(object)hostMaster)) { result = ((Component)hostMaster).gameObject; } return result; } } public static CharacterBody hostBody { get { CharacterBody val = null; if (Object.op_Implicit((Object)(object)hostMaster)) { val = hostMaster.GetBody(); } if (!Object.op_Implicit((Object)(object)val)) { HelperPlugin.Log.Debug("hostBody is null"); } return val; } } public static GameObject hostBodyObject { get { GameObject result = null; if (Object.op_Implicit((Object)(object)hostBody)) { result = ((Component)hostBody).gameObject; } return result; } } } public class MaterialController : MonoBehaviour { private void Start() { HelperPlugin.Log.Warning("Attached Material Controller to " + ((Object)((Component)this).gameObject).name + ". Ignore this if you are a mod developer debugging. Report otherwise."); Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<Renderer>(); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material val2 = null; MeshRenderer val3 = (MeshRenderer)(object)((val is MeshRenderer) ? val : null); if (val3 != null) { val2 = ((Renderer)val3).sharedMaterial; } else { SkinnedMeshRenderer val4 = (SkinnedMeshRenderer)(object)((val is SkinnedMeshRenderer) ? val : null); if (val4 != null) { val2 = ((Renderer)val4).sharedMaterials[0]; } } if (Object.op_Implicit((Object)(object)val2)) { GameObject gameObject = ((Component)val).gameObject; HGBaseController hGBaseController = null; switch (((Object)val2.shader).name) { case "Hopoo Games/Deferred/Standard": hGBaseController = gameObject.AddComponent<HGStandardController>(); break; case "Hopoo Games/FX/Cloud Remap": hGBaseController = gameObject.AddComponent<HGCloudRemapController>(); break; case "Hopoo Games/FX/Cloud Intersection Remap": hGBaseController = gameObject.AddComponent<HGIntersectionController>(); break; } if (Object.op_Implicit((Object)(object)hGBaseController)) { RecursivePathGeneration(gameObject); hGBaseController.Material = val2; hGBaseController.Renderer = val; HelperPlugin.Log.Warning(((object)hGBaseController).GetType().Name + " assigned to " + ((Object)gameObject).name + "."); } else { HelperPlugin.Log.Error("Shader Controller not implemented for " + ((Object)val2.shader).name + "."); } } } Object.Destroy((Object)(object)this); } private void RecursivePathGeneration(GameObject rendererGameObject, Transform parent = null) { if (Object.op_Implicit((Object)(object)parent)) { ((Object)rendererGameObject).name = ((Object)((Component)parent).gameObject).name + "." + ((Object)rendererGameObject).name; } parent = (Object.op_Implicit((Object)(object)parent) ? parent.parent : rendererGameObject.transform.parent); if (Object.op_Implicit((Object)(object)parent)) { RecursivePathGeneration(rendererGameObject, parent); } } } public class HGBaseController : MonoBehaviour { public Material Material; public Renderer Renderer; public string MaterialName; public void SetShaderKeywordBasedOnBool(bool enabled, string keyword) { if (!Object.op_Implicit((Object)(object)Material)) { HelperPlugin.Log.Error("Material field was null, cannot run shader keyword method."); } else if (enabled) { if (!Material.IsKeywordEnabled(keyword)) { Material.EnableKeyword(keyword); } } else if (Material.IsKeywordEnabled(keyword)) { Material.DisableKeyword(keyword); } } public void PutMaterialIntoMeshRenderer() { if (Object.op_Implicit((Object)(object)Material) && Object.op_Implicit((Object)(object)Renderer)) { Renderer renderer = Renderer; SkinnedMeshRenderer val = (SkinnedMeshRenderer)(object)((renderer is SkinnedMeshRenderer) ? renderer : null); if (val != null) { ((Renderer)val).sharedMaterials = (Material[])(object)new Material[1] { Material }; } Renderer renderer2 = Renderer; MeshRenderer val2 = (MeshRenderer)(object)((renderer2 is MeshRenderer) ? renderer2 : null); if (val2 != null) { ((Renderer)val2).material = Material; } } } } public class HGStandardController : HGBaseController { public enum _RampInfoEnum { TwoTone = 0, SmoothedTwoTone = 1, Unlitish = 3, Subsurface = 4, Grass = 5 } public enum _DecalLayerEnum { Default, Environment, Character, Misc } public enum _CullEnum { Off, Front, Back } public enum _PrintDirectionEnum { BottomUp = 0, TopDown = 1, BackToFront = 3 } public bool _EnableCutout; public Color _Color; public Texture _MainTex; public Vector2 _MainTexScale; public Vector2 _MainTexOffset; [Range(0f, 5f)] public float _NormalStrength; public Texture _NormalTex; public Vector2 _NormalTexScale; public Vector2 _NormalTexOffset; public Color _EmColor; public Texture _EmTex; [Range(0f, 10f)] public float _EmPower; [Range(0f, 1f)] public float _Smoothness; public bool _IgnoreDiffuseAlphaForSpeculars; public _RampInfoEnum _RampChoice; public _DecalLayerEnum _DecalLayer; [Range(0f, 1f)] public float _SpecularStrength; [Range(0.1f, 20f)] public float _SpecularExponent; public _CullEnum _Cull_Mode; public bool _EnableDither; [Range(0f, 1f)] public float _FadeBias; public bool _EnableFresnelEmission; public Texture _FresnelRamp; [Range(0.1f, 20f)] public float _FresnelPower; public Texture _FresnelMask; [Range(0f, 20f)] public float _FresnelBoost; public bool _EnablePrinting; [Range(-25f, 25f)] public float _SliceHeight; [Range(0f, 10f)] public float _PrintBandHeight; [Range(0f, 1f)] public float _PrintAlphaDepth; public Texture _PrintAlphaTexture; public Vector2 _PrintAlphaTextureScale; public Vector2 _PrintAlphaTextureOffset; [Range(0f, 10f)] public float _PrintColorBoost; [Range(0f, 4f)] public float _PrintAlphaBias; [Range(0f, 1f)] public float _PrintEmissionToAlbedoLerp; public _PrintDirectionEnum _PrintDirection; public Texture _PrintRamp; [Range(-10f, 10f)] public float _EliteBrightnessMin; [Range(-10f, 10f)] public float _EliteBrightnessMax; public bool _EnableSplatmap; public bool _UseVertexColorsInstead; [Range(0f, 1f)] public float _BlendDepth; public Texture _SplatmapTex; public Vector2 _SplatmapTexScale; public Vector2 _SplatmapTexOffset; [Range(0f, 20f)] public float _SplatmapTileScale; public Texture _GreenChannelTex; public Texture _GreenChannelNormalTex; [Range(0f, 1f)] public float _GreenChannelSmoothness; [Range(-2f, 5f)] public float _GreenChannelBias; public Texture _BlueChannelTex; public Texture _BlueChannelNormalTex; [Range(0f, 1f)] public float _BlueChannelSmoothness; [Range(-2f, 5f)] public float _BlueChannelBias; public bool _EnableFlowmap; public Texture _FlowTexture; public Texture _FlowHeightmap; public Vector2 _FlowHeightmapScale; public Vector2 _FlowHeightmapOffset; public Texture _FlowHeightRamp; public Vector2 _FlowHeightRampScale; public Vector2 _FlowHeightRampOffset; [Range(-1f, 1f)] public float _FlowHeightBias; [Range(0.1f, 20f)] public float _FlowHeightPower; [Range(0.1f, 20f)] public float _FlowEmissionStrength; [Range(0f, 15f)] public float _FlowSpeed; [Range(0f, 5f)] public float _MaskFlowStrength; [Range(0f, 5f)] public float _NormalFlowStrength; [Range(0f, 10f)] public float _FlowTextureScaleFactor; public bool _EnableLimbRemoval; public void Start() { GrabMaterialValues(); } public void GrabMaterialValues() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_03e8: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_0403: Unknown result type (might be due to invalid IL or missing references) //IL_051c: Unknown result type (might be due to invalid IL or missing references) //IL_0521: Unknown result type (might be due to invalid IL or missing references) //IL_0532: Unknown result type (might be due to invalid IL or missing references) //IL_0537: Unknown result type (might be due to invalid IL or missing references) //IL_055e: Unknown result type (might be due to invalid IL or missing references) //IL_0563: Unknown result type (might be due to invalid IL or missing references) //IL_0574: Unknown result type (might be due to invalid IL or missing references) //IL_0579: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Material)) { _EnableCutout = Material.IsKeywordEnabled("CUTOUT"); _Color = Material.GetColor("_Color"); _MainTex = Material.GetTexture("_MainTex"); _MainTexScale = Material.GetTextureScale("_MainTex"); _MainTexOffset = Material.GetTextureOffset("_MainTex"); _NormalStrength = Material.GetFloat("_NormalStrength"); _NormalTex = Material.GetTexture("_NormalTex"); _NormalTexScale = Material.GetTextureScale("_NormalTex"); _NormalTexOffset = Material.GetTextureOffset("_NormalTex"); _EmColor = Material.GetColor("_EmColor"); _EmTex = Material.GetTexture("_EmTex"); _EmPower = Material.GetFloat("_EmPower"); _Smoothness = Material.GetFloat("_Smoothness"); _IgnoreDiffuseAlphaForSpeculars = Material.IsKeywordEnabled("FORCE_SPEC"); _RampChoice = (_RampInfoEnum)Material.GetFloat("_RampInfo"); _DecalLayer = (_DecalLayerEnum)Material.GetFloat("_DecalLayer"); _SpecularStrength = Material.GetFloat("_SpecularStrength"); _SpecularExponent = Material.GetFloat("_SpecularExponent"); _Cull_Mode = (_CullEnum)Material.GetFloat("_Cull"); _EnableDither = Material.IsKeywordEnabled("DITHER"); _FadeBias = Material.GetFloat("_FadeBias"); _EnableFresnelEmission = Material.IsKeywordEnabled("FRESNEL_EMISSION"); _FresnelRamp = Material.GetTexture("_FresnelRamp"); _FresnelPower = Material.GetFloat("_FresnelPower"); _FresnelMask = Material.GetTexture("_FresnelMask"); _FresnelBoost = Material.GetFloat("_FresnelBoost"); _EnablePrinting = Material.IsKeywordEnabled("PRINT_CUTOFF"); _SliceHeight = Material.GetFloat("_SliceHeight"); _PrintBandHeight = Material.GetFloat("_SliceBandHeight"); _PrintAlphaDepth = Material.GetFloat("_SliceAlphaDepth"); _PrintAlphaTexture = Material.GetTexture("_SliceAlphaTex"); _PrintAlphaTextureScale = Material.GetTextureScale("_SliceAlphaTex"); _PrintAlphaTextureOffset = Material.GetTextureOffset("_SliceAlphaTex"); _PrintColorBoost = Material.GetFloat("_PrintBoost"); _PrintAlphaBias = Material.GetFloat("_PrintBias"); _PrintEmissionToAlbedoLerp = Material.GetFloat("_PrintEmissionToAlbedoLerp"); _PrintDirection = (_PrintDirectionEnum)Material.GetFloat("_PrintDirection"); _PrintRamp = Material.GetTexture("_PrintRamp"); _EliteBrightnessMin = Material.GetFloat("_EliteBrightnessMin"); _EliteBrightnessMax = Material.GetFloat("_EliteBrightnessMax"); _EnableSplatmap = Material.IsKeywordEnabled("SPLATMAP"); _UseVertexColorsInstead = Material.IsKeywordEnabled("USE_VERTEX_COLORS"); _BlendDepth = Material.GetFloat("_Depth"); _SplatmapTex = Material.GetTexture("_SplatmapTex"); _SplatmapTexScale = Material.GetTextureScale("_SplatmapTex"); _SplatmapTexOffset = Material.GetTextureOffset("_SplatmapTex"); _SplatmapTileScale = Material.GetFloat("_SplatmapTileScale"); _GreenChannelTex = Material.GetTexture("_GreenChannelTex"); _GreenChannelNormalTex = Material.GetTexture("_GreenChannelNormalTex"); _GreenChannelSmoothness = Material.GetFloat("_GreenChannelSmoothness"); _GreenChannelBias = Material.GetFloat("_GreenChannelBias"); _BlueChannelTex = Material.GetTexture("_BlueChannelTex"); _BlueChannelNormalTex = Material.GetTexture("_BlueChannelNormalTex"); _BlueChannelSmoothness = Material.GetFloat("_BlueChannelSmoothness"); _BlueChannelBias = Material.GetFloat("_BlueChannelBias"); _EnableFlowmap = Material.IsKeywordEnabled("FLOWMAP"); _FlowTexture = Material.GetTexture("_FlowTex"); _FlowHeightmap = Material.GetTexture("_FlowHeightmap"); _FlowHeightmapScale = Material.GetTextureScale("_FlowHeightmap"); _FlowHeightmapOffset = Material.GetTextureOffset("_FlowHeightmap"); _FlowHeightRamp = Material.GetTexture("_FlowHeightRamp"); _FlowHeightRampScale = Material.GetTextureScale("_FlowHeightRamp"); _FlowHeightRampOffset = Material.GetTextureOffset("_FlowHeightRamp"); _FlowHeightBias = Material.GetFloat("_FlowHeightBias"); _FlowHeightPower = Material.GetFloat("_FlowHeightPower"); _FlowEmissionStrength = Material.GetFloat("_FlowEmissionStrength"); _FlowSpeed = Material.GetFloat("_FlowSpeed"); _MaskFlowStrength = Material.GetFloat("_FlowMaskStrength"); _NormalFlowStrength = Material.GetFloat("_FlowNormalStrength"); _FlowTextureScaleFactor = Material.GetFloat("_FlowTextureScaleFactor"); _EnableLimbRemoval = Material.IsKeywordEnabled("LIMBREMOVAL"); MaterialName = ((Object)Material).name; } } public void Update() { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_03a9: Unknown result type (might be due to invalid IL or missing references) //IL_03bf: Unknown result type (might be due to invalid IL or missing references) //IL_0507: Unknown result type (might be due to invalid IL or missing references) //IL_051d: Unknown result type (might be due to invalid IL or missing references) //IL_06f6: Unknown result type (might be due to invalid IL or missing references) //IL_070c: Unknown result type (might be due to invalid IL or missing references) //IL_0758: Unknown result type (might be due to invalid IL or missing references) //IL_076e: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Material)) { if (((Object)Material).name != MaterialName && Object.op_Implicit((Object)(object)Renderer)) { GrabMaterialValues(); PutMaterialIntoMeshRenderer(); } SetShaderKeywordBasedOnBool(_EnableCutout, "CUTOUT"); Material.SetColor("_Color", _Color); if (Object.op_Implicit((Object)(object)_MainTex)) { Material.SetTexture("_MainTex", _MainTex); Material.SetTextureScale("_MainTex", _MainTexScale); Material.SetTextureOffset("_MainTex", _MainTexOffset); } else { Material.SetTexture("_MainTex", (Texture)null); } Material.SetFloat("_NormalStrength", _NormalStrength); if (Object.op_Implicit((Object)(object)_NormalTex)) { Material.SetTexture("_NormalTex", _NormalTex); Material.SetTextureScale("_NormalTex", _NormalTexScale); Material.SetTextureOffset("_NormalTex", _NormalTexOffset); } else { Material.SetTexture("_NormalTex", (Texture)null); } Material.SetColor("_EmColor", _EmColor); if (Object.op_Implicit((Object)(object)_EmTex)) { Material.SetTexture("_EmTex", _EmTex); } else { Material.SetTexture("_EmTex", (Texture)null); } Material.SetFloat("_EmPower", _EmPower); Material.SetFloat("_Smoothness", _Smoothness); SetShaderKeywordBasedOnBool(_IgnoreDiffuseAlphaForSpeculars, "FORCE_SPEC"); Material.SetFloat("_RampInfo", Convert.ToSingle(_RampChoice)); Material.SetFloat("_DecalLayer", Convert.ToSingle(_DecalLayer)); Material.SetFloat("_SpecularStrength", _SpecularStrength); Material.SetFloat("_SpecularExponent", _SpecularExponent); Material.SetFloat("_Cull", Convert.ToSingle(_Cull_Mode)); SetShaderKeywordBasedOnBool(_EnableDither, "DITHER"); Material.SetFloat("_FadeBias", _FadeBias); SetShaderKeywordBasedOnBool(_EnableFresnelEmission, "FRESNEL_EMISSION"); if (Object.op_Implicit((Object)(object)_FresnelRamp)) { Material.SetTexture("_FresnelRamp", _FresnelRamp); } else { Material.SetTexture("_FresnelRamp", (Texture)null); } Material.SetFloat("_FresnelPower", _FresnelPower); if (Object.op_Implicit((Object)(object)_FresnelMask)) { Material.SetTexture("_FresnelMask", _FresnelMask); } else { Material.SetTexture("_FresnelMask", (Texture)null); } Material.SetFloat("_FresnelBoost", _FresnelBoost); SetShaderKeywordBasedOnBool(_EnablePrinting, "PRINT_CUTOFF"); Material.SetFloat("_SliceHeight", _SliceHeight); Material.SetFloat("_SliceBandHeight", _PrintBandHeight); Material.SetFloat("_SliceAlphaDepth", _PrintAlphaDepth); if (Object.op_Implicit((Object)(object)_PrintAlphaTexture)) { Material.SetTexture("_SliceAlphaTex", _PrintAlphaTexture); Material.SetTextureScale("_SliceAlphaTex", _PrintAlphaTextureScale); Material.SetTextureOffset("_SliceAlphaTex", _PrintAlphaTextureOffset); } else { Material.SetTexture("_SliceAlphaTex", (Texture)null); } Material.SetFloat("_PrintBoost", _PrintColorBoost); Material.SetFloat("_PrintBias", _PrintAlphaBias); Material.SetFloat("_PrintEmissionToAlbedoLerp", _PrintEmissionToAlbedoLerp); Material.SetFloat("_PrintDirection", Convert.ToSingle(_PrintDirection)); if (Object.op_Implicit((Object)(object)_PrintRamp)) { Material.SetTexture("_PrintRamp", _PrintRamp); } else { Material.SetTexture("_PrintRamp", (Texture)null); } Material.SetFloat("_EliteBrightnessMin", _EliteBrightnessMin); Material.SetFloat("_EliteBrightnessMax", _EliteBrightnessMax); SetShaderKeywordBasedOnBool(_EnableSplatmap, "SPLATMAP"); SetShaderKeywordBasedOnBool(_UseVertexColorsInstead, "USE_VERTEX_COLORS"); Material.SetFloat("_Depth", _BlendDepth); if (Object.op_Implicit((Object)(object)_SplatmapTex)) { Material.SetTexture("_SplatmapTex", _SplatmapTex); Material.SetTextureScale("_SplatmapTex", _SplatmapTexScale); Material.SetTextureOffset("_SplatmapTex", _SplatmapTexOffset); } else { Material.SetTexture("_SplatmapTex", (Texture)null); } Material.SetFloat("_SplatmapTileScale", _SplatmapTileScale); if (Object.op_Implicit((Object)(object)_GreenChannelTex)) { Material.SetTexture("_GreenChannelTex", _GreenChannelTex); } else { Material.SetTexture("_GreenChannelTex", (Texture)null); } if (Object.op_Implicit((Object)(object)_GreenChannelNormalTex)) { Material.SetTexture("_GreenChannelNormalTex", _GreenChannelNormalTex); } else { Material.SetTexture("_GreenChannelNormalTex", (Texture)null); } Material.SetFloat("_GreenChannelSmoothness", _GreenChannelSmoothness); Material.SetFloat("_GreenChannelBias", _GreenChannelBias); if (Object.op_Implicit((Object)(object)_BlueChannelTex)) { Material.SetTexture("_BlueChannelTex", _BlueChannelTex); } else { Material.SetTexture("_BlueChannelTex", (Texture)null); } if (Object.op_Implicit((Object)(object)_BlueChannelNormalTex)) { Material.SetTexture("_BlueChannelNormalTex", _BlueChannelNormalTex); } else { Material.SetTexture("_BlueChannelNormalTex", (Texture)null); } Material.SetFloat("_BlueChannelSmoothness", _BlueChannelSmoothness); Material.SetFloat("_BlueChannelBias", _BlueChannelBias); SetShaderKeywordBasedOnBool(_EnableFlowmap, "FLOWMAP"); if (Object.op_Implicit((Object)(object)_FlowTexture)) { Material.SetTexture("_FlowTex", _FlowTexture); } else { Material.SetTexture("_FlowTex", (Texture)null); } if (Object.op_Implicit((Object)(object)_FlowHeightmap)) { Material.SetTexture("_FlowHeightmap", _FlowHeightmap); Material.SetTextureScale("_FlowHeightmap", _FlowHeightmapScale); Material.SetTextureOffset("_FlowHeightmap", _FlowHeightmapOffset); } else { Material.SetTexture("_FlowHeightmap", (Texture)null); } if (Object.op_Implicit((Object)(object)_FlowHeightRamp)) { Material.SetTexture("_FlowHeightRamp", _FlowHeightRamp); Material.SetTextureScale("_FlowHeightRamp", _FlowHeightRampScale); Material.SetTextureOffset("_FlowHeightRamp", _FlowHeightRampOffset); } else { Material.SetTexture("_FlowHeightRamp", (Texture)null); } Material.SetFloat("_FlowHeightBias", _FlowHeightBias); Material.SetFloat("_FlowHeightPower", _FlowHeightPower); Material.SetFloat("_FlowEmissionStrength", _FlowEmissionStrength); Material.SetFloat("_FlowSpeed", _FlowSpeed); Material.SetFloat("_FlowMaskStrength", _MaskFlowStrength); Material.SetFloat("_FlowNormalStrength", _NormalFlowStrength); Material.SetFloat("_FlowTextureScaleFactor", _FlowTextureScaleFactor); SetShaderKeywordBasedOnBool(_EnableLimbRemoval, "LIMBREMOVAL"); } } } public class HGCloudRemapController : HGBaseController { public enum _CullEnum { Off, Front, Back } public enum _ZTestEnum { Disabled, Never, Less, Equal, LessEqual, Greater, NotEqual, GreaterEqual, Always } public Color _Tint; public bool _DisableRemapping; public Texture _MainTex; public Vector2 _MainTexScale; public Vector2 _MainTexOffset; public Texture _RemapTex; public Vector2 _RemapTexScale; public Vector2 _RemapTexOffset; [Range(0f, 2f)] public float _SoftFactor; [Range(1f, 20f)] public float _BrightnessBoost; [Range(0f, 20f)] public float _AlphaBoost; [Range(0f, 1f)] public float _AlphaBias; public bool _UseUV1; public bool _FadeWhenNearCamera; [Range(0f, 1f)] public float _FadeCloseDistance; public _CullEnum _Cull_Mode; public _ZTestEnum _ZTest_Mode; [Range(-10f, 10f)] public float _DepthOffset; public bool _CloudRemapping; public bool _DistortionClouds; [Range(-2f, 2f)] public float _DistortionStrength; public Texture _Cloud1Tex; public Vector2 _Cloud1TexScale; public Vector2 _Cloud1TexOffset; public Texture _Cloud2Tex; public Vector2 _Cloud2TexScale; public Vector2 _Cloud2TexOffset; public Vector4 _CutoffScroll; public bool _VertexColors; public bool _LuminanceForVertexAlpha; public bool _LuminanceForTextureAlpha; public bool _VertexOffset; public bool _FresnelFade; public bool _SkyboxOnly; [Range(-20f, 20f)] public float _FresnelPower; [Range(0f, 3f)] public float _VertexOffsetAmount; public void Start() { GrabMaterialValues(); } public void GrabMaterialValues() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Material)) { _Tint = Material.GetColor("_TintColor"); _DisableRemapping = Material.IsKeywordEnabled("DISABLEREMAP"); _MainTex = Material.GetTexture("_MainTex"); _MainTexScale = Material.GetTextureScale("_MainTex"); _MainTexOffset = Material.GetTextureOffset("_MainTex"); _RemapTex = Material.GetTexture("_RemapTex"); _RemapTexScale = Material.GetTextureScale("_RemapTex"); _RemapTexOffset = Material.GetTextureOffset("_RemapTex"); _SoftFactor = Material.GetFloat("_InvFade"); _BrightnessBoost = Material.GetFloat("_Boost"); _AlphaBoost = Material.GetFloat("_AlphaBoost"); _AlphaBias = Material.GetFloat("_AlphaBias"); _UseUV1 = Material.IsKeywordEnabled("USE_UV1"); _FadeWhenNearCamera = Material.IsKeywordEnabled("FADECLOSE"); _FadeCloseDistance = Material.GetFloat("_FadeCloseDistance"); _Cull_Mode = (_CullEnum)Material.GetFloat("_Cull"); _ZTest_Mode = (_ZTestEnum)Material.GetFloat("_ZTest"); _DepthOffset = Material.GetFloat("_DepthOffset"); _CloudRemapping = Material.IsKeywordEnabled("USE_CLOUDS"); _DistortionClouds = Material.IsKeywordEnabled("CLOUDOFFSET"); _DistortionStrength = Material.GetFloat("_DistortionStrength"); _Cloud1Tex = Material.GetTexture("_Cloud1Tex"); _Cloud1TexScale = Material.GetTextureScale("_Cloud1Tex"); _Cloud1TexOffset = Material.GetTextureOffset("_Cloud1Tex"); _Cloud2Tex = Material.GetTexture("_Cloud2Tex"); _Cloud2TexScale = Material.GetTextureScale("_Cloud2Tex"); _Cloud2TexOffset = Material.GetTextureOffset("_Cloud2Tex"); _CutoffScroll = Material.GetVector("_CutoffScroll"); _VertexColors = Material.IsKeywordEnabled("VERTEXCOLOR"); _LuminanceForVertexAlpha = Material.IsKeywordEnabled("VERTEXALPHA"); _LuminanceForTextureAlpha = Material.IsKeywordEnabled("CALCTEXTUREALPHA"); _VertexOffset = Material.IsKeywordEnabled("VERTEXOFFSET"); _FresnelFade = Material.IsKeywordEnabled("FRESNEL"); _SkyboxOnly = Material.IsKeywordEnabled("SKYBOX_ONLY"); _FresnelPower = Material.GetFloat("_FresnelPower"); _VertexOffsetAmount = Material.GetFloat("_OffsetAmount"); MaterialName = ((Object)Material).name; } } public void Update() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Material)) { if (((Object)Material).name != MaterialName && Object.op_Implicit((Object)(object)Renderer)) { GrabMaterialValues(); PutMaterialIntoMeshRenderer(); } Material.SetColor("_TintColor", _Tint); SetShaderKeywordBasedOnBool(_DisableRemapping, "DISABLEREMAP"); if (Object.op_Implicit((Object)(object)_MainTex)) { Material.SetTexture("_MainTex", _MainTex); Material.SetTextureScale("_MainTex", _MainTexScale); Material.SetTextureOffset("_MainTex", _MainTexOffset); } else { Material.SetTexture("_MainTex", (Texture)null); } if (Object.op_Implicit((Object)(object)_RemapTex)) { Material.SetTexture("_RemapTex", _RemapTex); Material.SetTextureScale("_RemapTex", _RemapTexScale); Material.SetTextureOffset("_RemapTex", _RemapTexOffset); } else { Material.SetTexture("_RemapTex", (Texture)null); } Material.SetFloat("_InvFade", _SoftFactor); Material.SetFloat("_Boost", _BrightnessBoost); Material.SetFloat("_AlphaBoost", _AlphaBoost); Material.SetFloat("_AlphaBias", _AlphaBias); SetShaderKeywordBasedOnBool(_UseUV1, "USE_UV1"); SetShaderKeywordBasedOnBool(_FadeWhenNearCamera, "FADECLOSE"); Material.SetFloat("_FadeCloseDistance", _FadeCloseDistance); Material.SetFloat("_Cull", Convert.ToSingle(_Cull_Mode)); Material.SetFloat("_ZTest", Convert.ToSingle(_ZTest_Mode)); Material.SetFloat("_DepthOffset", _DepthOffset); SetShaderKeywordBasedOnBool(_CloudRemapping, "USE_CLOUDS"); SetShaderKeywordBasedOnBool(_DistortionClouds, "CLOUDOFFSET"); Material.SetFloat("_DistortionStrength", _DistortionStrength); if (Object.op_Implicit((Object)(object)_Cloud1Tex)) { Material.SetTexture("_Cloud1Tex", _Cloud1Tex); Material.SetTextureScale("_Cloud1Tex", _Cloud1TexScale); Material.SetTextureOffset("_Cloud1Tex", _Cloud1TexOffset); } else { Material.SetTexture("_Cloud1Tex", (Texture)null); } if (Object.op_Implicit((Object)(object)_Cloud2Tex)) { Material.SetTexture("_Cloud2Tex", _Cloud2Tex); Material.SetTextureScale("_Cloud2Tex", _Cloud2TexScale); Material.SetTextureOffset("_Cloud2Tex", _Cloud2TexOffset); } else { Material.SetTexture("_Cloud2Tex", (Texture)null); } Material.SetVector("_CutoffScroll", _CutoffScroll); SetShaderKeywordBasedOnBool(_VertexColors, "VERTEXCOLOR"); SetShaderKeywordBasedOnBool(_LuminanceForVertexAlpha, "VERTEXALPHA"); SetShaderKeywordBasedOnBool(_LuminanceForTextureAlpha, "CALCTEXTUREALPHA"); SetShaderKeywordBasedOnBool(_VertexOffset, "VERTEXOFFSET"); SetShaderKeywordBasedOnBool(_FresnelFade, "FRESNEL"); SetShaderKeywordBasedOnBool(_SkyboxOnly, "SKYBOX_ONLY"); Material.SetFloat("_FresnelPower", _FresnelPower); Material.SetFloat("_OffsetAmount", _VertexOffsetAmount); } } } public class HGIntersectionController : HGBaseController { public enum _SrcBlendFloatEnum { Zero, One, DstColor, SrcColor, OneMinusDstColor, SrcAlpha, OneMinusSrcColor, DstAlpha, OneMinusDstAlpha, SrcAlphaSaturate, OneMinusSrcAlpha } public enum _DstBlendFloatEnum { Zero, One, DstColor, SrcColor, OneMinusDstColor, SrcAlpha, OneMinusSrcColor, DstAlpha, OneMinusDstAlpha, SrcAlphaSaturate, OneMinusSrcAlpha } public enum _CullEnum { Off, Front, Back } public _SrcBlendFloatEnum _Source_Blend_Mode; public _DstBlendFloatEnum _Destination_Blend_Mode; public Color _Tint; public Texture _MainTex; public Vector2 _MainTexScale; public Vector2 _MainTexOffset; public Texture _Cloud1Tex; public Vector2 _Cloud1TexScale; public Vector2 _Cloud1TexOffset; public Texture _Cloud2Tex; public Vector2 _Cloud2TexScale; public Vector2 _Cloud2TexOffset; public Texture _RemapTex; public Vector2 _RemapTexScale; public Vector2 _RemapTexOffset; public Vector4 _CutoffScroll; [Range(0f, 30f)] public float _SoftFactor; [Range(0.1f, 20f)] public float _SoftPower; [Range(0f, 5f)] public float _BrightnessBoost; [Range(0.1f, 20f)] public float _RimPower; [Range(0f, 5f)] public float _RimStrength; [Range(0f, 20f)] public float _AlphaBoost; [Range(0f, 20f)] public float _IntersectionStrength; public _CullEnum _Cull_Mode; public bool _FadeFromVertexColorsOn; public bool _EnableTriplanarProjectionsForClouds; public void Start() { GrabMaterialValues(); } public void GrabMaterialValues() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Material)) { _Source_Blend_Mode = (_SrcBlendFloatEnum)Material.GetFloat("_SrcBlendFloat"); _Destination_Blend_Mode = (_DstBlendFloatEnum)Material.GetFloat("_DstBlendFloat"); _Tint = Material.GetColor("_TintColor"); _MainTex = Material.GetTexture("_MainTex"); _MainTexScale = Material.GetTextureScale("_MainTex"); _MainTexOffset = Material.GetTextureOffset("_MainTex"); _Cloud1Tex = Material.GetTexture("_Cloud1Tex"); _Cloud1TexScale = Material.GetTextureScale("_Cloud1Tex"); _Cloud1TexOffset = Material.GetTextureOffset("_Cloud1Tex"); _Cloud2Tex = Material.GetTexture("_Cloud2Tex"); _Cloud2TexScale = Material.GetTextureScale("_Cloud2Tex"); _Cloud2TexOffset = Material.GetTextureOffset("_Cloud2Tex"); _RemapTex = Material.GetTexture("_RemapTex"); _RemapTexScale = Material.GetTextureScale("_RemapTex"); _RemapTexOffset = Material.GetTextureOffset("_RemapTex"); _CutoffScroll = Material.GetVector("_CutoffScroll"); _SoftFactor = Material.GetFloat("_InvFade"); _SoftPower = Material.GetFloat("_SoftPower"); _BrightnessBoost = Material.GetFloat("_Boost"); _RimPower = Material.GetFloat("_RimPower"); _RimStrength = Material.GetFloat("_RimStrength"); _AlphaBoost = Material.GetFloat("_AlphaBoost"); _IntersectionStrength = Material.GetFloat("_IntersectionStrength"); _Cull_Mode = (_CullEnum)Material.GetFloat("_Cull"); _FadeFromVertexColorsOn = Material.IsKeywordEnabled("FADE_FROM_VERTEX_COLORS"); _EnableTriplanarProjectionsForClouds = Material.IsKeywordEnabled("TRIPLANAR"); MaterialName = ((Object)Material).name; } } public void Update() { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_0128: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)Material)) { if (((Object)Material).name != MaterialName && Object.op_Implicit((Object)(object)Renderer)) { GrabMaterialValues(); PutMaterialIntoMeshRenderer(); } Material.SetFloat("_SrcBlendFloat", Convert.ToSingle(_Source_Blend_Mode)); Material.SetFloat("_DstBlendFloat", Convert.ToSingle(_Destination_Blend_Mode)); Material.SetColor("_TintColor", _Tint); if (Object.op_Implicit((Object)(object)_MainTex)) { Material.SetTexture("_MainTex", _MainTex); Material.SetTextureScale("_MainTex", _MainTexScale); Material.SetTextureOffset("_MainTex", _MainTexOffset); } else { Material.SetTexture("_MainTex", (Texture)null); } if (Object.op_Implicit((Object)(object)_Cloud1Tex)) { Material.SetTexture("_Cloud1Tex", _Cloud1Tex); Material.SetTextureScale("_Cloud1Tex", _Cloud1TexScale); Material.SetTextureOffset("_Cloud1Tex", _Cloud1TexOffset); } else { Material.SetTexture("_Cloud1Tex", (Texture)null); } if (Object.op_Implicit((Object)(object)_Cloud2Tex)) { Material.SetTexture("_Cloud2Tex", _Cloud2Tex); Material.SetTextureScale("_Cloud2Tex", _Cloud2TexScale); Material.SetTextureOffset("_Cloud2Tex", _Cloud2TexOffset); } else { Material.SetTexture("_Cloud2Tex", (Texture)null); } if (Object.op_Implicit((Object)(object)_RemapTex)) { Material.SetTexture("_RemapTex", _RemapTex); Material.SetTextureScale("_RemapTex", _RemapTexScale); Material.SetTextureOffset("_RemapTex", _RemapTexOffset); } else { Material.SetTexture("_RemapTex", (Texture)null); } Material.SetVector("_CutoffScroll", _CutoffScroll); Material.SetFloat("_InvFade", _SoftFactor); Material.SetFloat("_SoftPower", _SoftPower); Material.SetFloat("_Boost", _BrightnessBoost); Material.SetFloat("_RimPower", _RimPower); Material.SetFloat("_RimStrength", _RimStrength); Material.SetFloat("_AlphaBoost", _AlphaBoost); Material.SetFloat("_IntersectionStrength", _IntersectionStrength); Material.SetFloat("_Cull", Convert.ToSingle(_Cull_Mode)); SetShaderKeywordBasedOnBool(_FadeFromVertexColorsOn, "FADE_FROM_VERTEX_COLORS"); SetShaderKeywordBasedOnBool(_EnableTriplanarProjectionsForClouds, "TRIPLANAR"); } } } public static class MinionExtensions { internal class SyncOwner : INetMessage, ISerializableObject { private NetworkInstanceId minionNetId; private NetworkInstanceId ownerNetId; private bool useQueue; public SyncOwner() { } public SyncOwner(NetworkInstanceId minionNetId, NetworkInstanceId ownerNetId, bool useQueue) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) this.minionNetId = minionNetId; this.ownerNetId = ownerNetId; this.useQueue = useQueue; } public void Serialize(NetworkWriter writer) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) writer.Write(minionNetId); writer.Write(ownerNetId); writer.Write(useQueue); } public void Deserialize(NetworkReader reader) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) minionNetId = reader.ReadNetworkId(); ownerNetId = reader.ReadNetworkId(); useQueue = reader.ReadBoolean(); } public void OnReceived() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { return; } if (useQueue) { OwnershipSyncer orAddComponent = ((Component)Run.instance).gameObject.GetOrAddComponent<OwnershipSyncer>(); orAddComponent.Add(new OwnershipSyncer.OwnerMinionPair(minionNetId, ownerNetId)); return; } GameObject val = Util.FindNetworkObject(minionNetId); GameObject val2 = Util.FindNetworkObject(ownerNetId); if (!Object.op_Implicit((Object)(object)val)) { HelperPlugin.Log.Warning("SyncOwner: minionObject or ownerObject is null."); } if (!Object.op_Implicit((Object)(object)val2)) { HelperPlugin.Log.Warning("SyncOwner: ownerObject is null."); } if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val2)) { ProcessAssignment(val, val2, "SyncOwner"); } } } internal class OwnershipSyncer : QueueProcessor<OwnershipSyncer.OwnerMinionPair> { internal struct OwnerMinionPair { public NetworkInstanceId minionNetId; public NetworkInstanceId ownerNetId; public OwnerMinionPair(NetworkInstanceId minionNetId, NetworkInstanceId ownerNetId) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) this.minionNetId = minionNetId; this.ownerNetId = ownerNetId; } } protected override int itemsPerFrame { get; set; } = 1; protected override float processInterval { get; set; } protected override bool Process(OwnerMinionPair pair) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) GameObject val = Util.FindNetworkObject(pair.minionNetId); GameObject val2 = Util.FindNetworkObject(pair.ownerNetId); if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2)) { return false; } ProcessAssignment(val, val2, "OwnershipSyncer"); return true; } protected override void FixedUpdate() { base.FixedUpdate(); if (processQueue.Count <= 0) { Object.Destroy((Object)(object)this); } } } public static void LoopMinions(this CharacterMaster ownerOrMinion, Action<CharacterMaster> logic) { MinionOwnership minionOwnership = ownerOrMinion.minionOwnership; if (!Object.op_Implicit((Object)(object)minionOwnership)) { return; } MinionOwnership[] array = Object.FindObjectsOfType<MinionOwnership>(); MinionOwnership[] array2 = array; foreach (MinionOwnership val in array2) { if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.ownerMaster)) { bool flag = !Object.op_Implicit((Object)(object)minionOwnership.ownerMaster) && (Object)(object)val.ownerMaster == (Object)(object)ownerOrMinion; bool flag2 = Object.op_Implicit((Object)(object)minionOwnership.ownerMaster) && (Object)(object)val.ownerMaster == (Object)(object)minionOwnership.ownerMaster; if (flag || flag2) { CharacterMaster component = ((Component)val).GetComponent<CharacterMaster>(); logic(component); } } } } public static List<T> GetAllMinionComponents<T>(this CharacterMaster ownerOrMinion) where T : Component { List<T> list = new List<T>(); ownerOrMinion.LoopMinions(delegate(CharacterMaster minion) { T component = ((Component)minion).gameObject.GetComponent<T>(); if (Object.op_Implicit((Object)(object)component)) { list.Add(component); } }); return list; } public static void AssignOwner(this CharacterMaster minion, CharacterMaster newOwner, bool transmit = false, bool useQueue = false) { //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { minion.minionOwnership.SetOwner(newOwner); if (transmit) { NetworkIdentity component = ((Component)minion).gameObject.GetComponent<NetworkIdentity>(); NetworkIdentity component2 = ((Component)newOwner).gameObject.GetComponent<NetworkIdentity>(); if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)component2)) { HelperPlugin.Log.Warning("AssignOwner with transmit: NetworkIdentity is missing."); } else { NetMessageExtensions.Send((INetMessage)(object)new SyncOwner(component.netId, component2.netId, useQueue), (NetworkDestination)1); } } } else { NetworkIdentity component3 = ((Component)newOwner).gameObject.GetComponent<NetworkIdentity>(); if (!Object.op_Implicit((Object)(object)component3)) { HelperPlugin.Log.Warning("AssignOwner: Network Identity is missing!"); return; } minion.minionOwnership.ownerMasterId = component3.netId; MinionGroup.SetMinionOwner(minion.minionOwnership, component3.netId); } } internal static void ProcessAssignment(GameObject minionObject, GameObject ownerObject, string caller) { CharacterMaster component = minionObject.GetComponent<CharacterMaster>(); if (!Object.op_Implicit((Object)(object)component)) { HelperPlugin.Log.Warning(caller + ": minion is null."); } CharacterMaster component2 = ownerObject.GetComponent<CharacterMaster>(); if (!Object.op_Implicit((Object)(object)component2)) { HelperPlugin.Log.Warning(caller + ": owner is null."); } if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component2)) { component.AssignOwner(component2); } } } public static class MultiplayerTest { private const string defaultEnableMessage = "Multiplayer Testing is enabled! If you see this message, report this as a bug to the mod developer!"; private const string defaultDisableMessage = "Multiplayer Testing disabled."; private static void OnClientConnect(orig_OnClientConnect orig, NetworkManagerSystem self, NetworkConnection conn) { } private static void Enable() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown NetworkManagerSystem.OnClientConnect += new hook_OnClientConnect(OnClientConnect); } private static void Disable() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown NetworkManagerSystem.OnClientConnect -= new hook_OnClientConnect(OnClientConnect); } public static void Enable(ManualLogSource logger, string message = "Multiplayer Testing is enabled! If you see this message, report this as a bug to the mod developer!") { if (logger != null) { logger.LogWarning((object)message); } Enable(); } public static void Enable(Log logger, string message = "Multiplayer Testing is enabled! If you see this message, report this as a bug to the mod developer!") { logger?.Warning(message); Enable(); } public static void Disable(ManualLogSource logger, string message = "Multiplayer Testing disabled.") { if (logger != null) { logger.LogWarning((object)message); } Disable(); } public static void Disable(Log logger, string message = "Multiplayer Testing disabled.") { logger?.Warning(message); Disable(); } } public class SoundPlayer { public struct EventPosterKey { public KeyCode key; public List<uint> eventIds; public EventPosterKey(KeyCode key, params uint[] eventIds) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) this.key = key; this.eventIds = new List<uint>(); this.eventIds.AddRange(eventIds); } } private readonly Dictionary<KeyCode, List<uint>> keybinds = new Dictionary<KeyCode, List<uint>>(); public SoundPlayer(params EventPosterKey[] eventPosterKeys) { foreach (EventPosterKey eventPosterKey in eventPosterKeys) { RegisterKeybind(eventPosterKey); } } public void Update() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) foreach (KeyValuePair<KeyCode, List<uint>> keybind in keybinds) { if (!Input.GetKeyDown(keybind.Key)) { continue; } foreach (uint item in keybind.Value) { AkSoundEngine.PostEvent(item, Instances.hostBodyObject); } } } public void RegisterKeybind(EventPosterKey eventPosterKey) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) keybinds[eventPosterKey.key] = eventPosterKey.eventIds; } public void RegisterKeybind(KeyCode key, params uint[] eventIds) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) keybinds[key] = eventIds.ToList(); } } } namespace Chen.Helpers.CollectionHelpers { public static class Extensions { public static bool ConditionalAdd<T>(this List<T> list, T value, Func<T, bool> condition) { if (list.Exists((T item) => condition(item))) { return false; } list.Add(value); return true; } public static bool ConditionalAddRange<T>(this List<T> list, T[] data, Func<T, T, bool> condition) { bool flag = true; foreach (T datum in data) { bool flag2 = list.ConditionalAdd(datum, (T item) => condition(item, datum)); if (flag && !flag2) { flag = false; } } return flag; } public static bool ConditionalRemove<T>(this List<T> list, T value) { if (!list.Contains(value)) { return false; } list.Remove(value); return true; } public static bool Contains<T>(this T[] array, T value) { for (int i = 0; i < array.Length; i++) { T val = array[i]; if (val.Equals(value)) { return true; } } return false; } public static List<T> ToList<T>(this T[] array) { List<T> list = new List<T>(); list.AddRange(array); return list; } } }