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 DyeHard v1.6.0
DyeHard.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using ComfyLib; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("DyeHard")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("DyeHard")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7c3156d5-b19a-467c-bf87-d37aeaccbc56")] [assembly: AssemblyFileVersion("1.6.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.6.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] 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 DyeHard { public static class PluginConfig { public static ConfigFile CurrentConfig { get; private set; } public static ConfigEntry<bool> IsModEnabled { get; private set; } public static ConfigEntry<bool> OverridePlayerHairColor { get; private set; } public static ConfigEntry<Color> PlayerHairColor { get; private set; } public static ConfigEntry<string> PlayerHairColorHex { get; private set; } public static ConfigEntry<float> PlayerHairGlow { get; private set; } public static ConfigEntry<bool> OverridePlayerHairItem { get; private set; } public static ConfigEntry<string> PlayerHairItem { get; private set; } public static ConfigEntry<bool> OverridePlayerBeardItem { get; private set; } public static ConfigEntry<string> PlayerBeardItem { get; private set; } public static ConfigEntry<Vector3> OffsetCharacterPreviewPosition { get; private set; } public static void BindConfig(ConfigFile config) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) CurrentConfig = config; IsModEnabled = config.BindInOrder("_Global", "isModEnabled", defaultValue: true, "Globally enable or disable this mod."); OverridePlayerHairColor = config.BindInOrder("HairColor", "overridePlayerHairColor", defaultValue: false, "Enable/disable overriding your player's hair color."); PlayerHairColor = config.BindInOrder<Color>("HairColor", "playerHairColor", Color.white, "Sets the color for your player's hair."); PlayerHairColorHex = config.BindInOrder("HairColor", "playerHairColorHex", "#FFFFFF", "Sets the color of player hair, in HTML hex form (alpha unsupported)."); PlayerHairGlow = config.BindInOrder("HairColor", "playerHairGlow", 1f, "Hair glow multiplier for the hair color. Zero removes all color.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 3f)); OffsetCharacterPreviewPosition = config.BindInOrder<Vector3>("Preview", "offsetCharacterPreviewPosition", new Vector3(1f, 0f, 1f), "Offsets the position of the character preview."); IsModEnabled.OnSettingChanged<bool>(DyeManager.SetPlayerZDOHairColor); OverridePlayerHairColor.OnSettingChanged<bool>(DyeManager.SetPlayerZDOHairColor); PlayerHairColor.OnSettingChanged<Color>(UpdatePlayerHairColorHexValue); PlayerHairColorHex.OnSettingChanged<string>(UpdatePlayerHairColorValue); PlayerHairGlow.OnSettingChanged<float>(DyeManager.SetPlayerZDOHairColor); IsModEnabled.OnSettingChanged<bool>(DyeManager.SetCharacterPreviewPosition); OffsetCharacterPreviewPosition.OnSettingChanged<Vector3>(DyeManager.SetCharacterPreviewPosition); } private static void UpdatePlayerHairColorHexValue() { //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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) Color value = PlayerHairColor.Value; value.a = 1f; PlayerHairColorHex.Value = "#" + ColorUtility.ToHtmlStringRGB(value); PlayerHairColor.Value = value; DyeManager.SetPlayerZDOHairColor(); } private static void UpdatePlayerHairColorValue() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) Color value = default(Color); if (ColorUtility.TryParseHtmlString(PlayerHairColorHex.Value, ref value)) { value.a = 1f; PlayerHairColor.Value = value; DyeManager.SetPlayerZDOHairColor(); } } public static void BindCustomizationConfig(ObjectDB objectDb, PlayerCustomizaton customization) { if (OverridePlayerHairItem == null && OverridePlayerBeardItem == null) { string[] array = (from item in objectDb.GetAllItems((ItemType)10, "Hair") select ((Object)item).name).AlphanumericSort().ToArray(); OverridePlayerHairItem = CurrentConfig.BindInOrder("Hair", "overridePlayerHairItem", defaultValue: false, "Enable/disable overriding your player's hair."); PlayerHairItem = CurrentConfig.BindInOrder("Hair", "playerHairItem", ((Object)customization.m_noHair).name, "If non-empty, sets/overrides the player's hair (if any).", (AcceptableValueBase)(object)new AcceptableValueList<string>(array)); IsModEnabled.OnSettingChanged<bool>(DyeManager.SetPlayerHairItem); OverridePlayerHairItem.OnSettingChanged<bool>(DyeManager.SetPlayerHairItem); PlayerHairItem.OnSettingChanged<string>(DyeManager.SetPlayerHairItem); string[] array2 = (from item in objectDb.GetAllItems((ItemType)10, "Beard") select ((Object)item).name).AlphanumericSort().ToArray(); OverridePlayerBeardItem = CurrentConfig.BindInOrder("Beard", "overridePlayerBeardItem", defaultValue: false, "Enable/disable overriding your player's beard."); PlayerBeardItem = CurrentConfig.BindInOrder("Beard", "playerBeardItem", ((Object)customization.m_noBeard).name, "If non-empty, sets/overrides the player's beard (if any).", (AcceptableValueBase)(object)new AcceptableValueList<string>(array2)); IsModEnabled.OnSettingChanged<bool>(DyeManager.SetPlayerBeardItem); OverridePlayerBeardItem.OnSettingChanged<bool>(DyeManager.SetPlayerBeardItem); PlayerBeardItem.OnSettingChanged<string>(DyeManager.SetPlayerBeardItem); } } public static IEnumerable<string> AlphanumericSort(this IEnumerable<string> text) { return text.OrderBy((string x) => Regex.Replace(x, "\\d+", (Match m) => m.Value.PadLeft(50, '0'))); } } public static class DyeManager { public static Player LocalPlayer { get; private set; } public static VisEquipment LocalVisEquipment { get; private set; } public static void SetLocalPlayer(Player player) { LocalPlayer = player; LocalVisEquipment = (Object.op_Implicit((Object)(object)player) ? ((Humanoid)player).m_visEquipment : null); } public static Vector3 GetPlayerHairColorVector() { //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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) Vector3 val = Utils.ColorToVec3(PluginConfig.PlayerHairColor.Value); if (val != Vector3.zero) { val *= PluginConfig.PlayerHairGlow.Value / ((Vector3)(ref val)).magnitude; } return val; } public static void SetPlayerBeardItem() { if (Object.op_Implicit((Object)(object)LocalPlayer) && Object.op_Implicit((Object)(object)((Humanoid)LocalPlayer).m_visEquipment)) { string beardItem = ((PluginConfig.IsModEnabled.Value && PluginConfig.OverridePlayerBeardItem.Value) ? PluginConfig.PlayerBeardItem.Value : ((Humanoid)LocalPlayer).m_beardItem); if (Object.op_Implicit((Object)(object)((Character)LocalPlayer).m_nview)) { ((Humanoid)LocalPlayer).m_visEquipment.SetBeardItem(beardItem); } ((Humanoid)LocalPlayer).m_visEquipment.m_beardItem = beardItem; } } public static void SetPlayerHairItem() { if (Object.op_Implicit((Object)(object)LocalPlayer) && Object.op_Implicit((Object)(object)((Humanoid)LocalPlayer).m_visEquipment)) { string hairItem = ((PluginConfig.IsModEnabled.Value && PluginConfig.OverridePlayerHairItem.Value) ? PluginConfig.PlayerHairItem.Value : ((Humanoid)LocalPlayer).m_hairItem); if (Object.op_Implicit((Object)(object)((Character)LocalPlayer).m_nview)) { ((Humanoid)LocalPlayer).m_visEquipment.SetHairItem(hairItem); } ((Humanoid)LocalPlayer).m_visEquipment.m_hairItem = hairItem; } } public static void SetPlayerZDOHairColor() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)LocalPlayer) && Object.op_Implicit((Object)(object)((Humanoid)LocalPlayer).m_visEquipment)) { Vector3 val = ((PluginConfig.IsModEnabled.Value && PluginConfig.OverridePlayerHairColor.Value) ? GetPlayerHairColorVector() : LocalPlayer.m_hairColor); ((Humanoid)LocalPlayer).m_visEquipment.m_hairColor = val; if (Object.op_Implicit((Object)(object)((Character)LocalPlayer).m_nview) && ((Character)LocalPlayer).m_nview.IsValid() && (!((Character)LocalPlayer).m_nview.m_zdo.TryGetVector3(ZDOVars.s_hairColor, out var value) || value != val)) { ((Character)LocalPlayer).m_nview.m_zdo.Set(ZDOVars.s_hairColor, val); } } } public static void SetCharacterPreviewPosition() { SetCharacterPreviewPosition(FejdStartup.m_instance); } private static void SetCharacterPreviewPosition(FejdStartup fejdStartup) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)fejdStartup) && Object.op_Implicit((Object)(object)fejdStartup.m_playerInstance)) { Vector3 val = fejdStartup.m_characterPreviewPoint.position; if (PluginConfig.IsModEnabled.Value) { val += PluginConfig.OffsetCharacterPreviewPosition.Value; } fejdStartup.m_playerInstance.transform.position = val; } } } [BepInPlugin("redseiko.valheim.dyehard", "DyeHard", "1.6.0")] public sealed class DyeHard : BaseUnityPlugin { public const string PluginGUID = "redseiko.valheim.dyehard"; public const string PluginName = "DyeHard"; public const string PluginVersion = "1.6.0"; private void Awake() { PluginConfig.BindConfig(((BaseUnityPlugin)this).Config); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "redseiko.valheim.dyehard"); } } [HarmonyPatch(typeof(FejdStartup))] internal static class FejdStartupPatch { [HarmonyPostfix] [HarmonyPatch("SetupObjectDB")] private static void SetupObjectDbPostfix(FejdStartup __instance) { PluginConfig.BindCustomizationConfig(((Component)__instance).GetComponent<ObjectDB>(), __instance.m_newCharacterPanel.GetComponent<PlayerCustomizaton>()); } [HarmonyPostfix] [HarmonyPatch("SetupCharacterPreview")] private static void SetupCharacterPreviewPostfix(FejdStartup __instance) { DyeManager.SetLocalPlayer(__instance.m_playerInstance.GetComponent<Player>()); if (PluginConfig.IsModEnabled.Value) { DyeManager.SetPlayerZDOHairColor(); DyeManager.SetPlayerHairItem(); DyeManager.SetPlayerBeardItem(); DyeManager.SetCharacterPreviewPosition(); } } [HarmonyPostfix] [HarmonyPatch("ShowCharacterSelection")] private static void ShowCharacterSelectionPostfix() { DyeManager.SetCharacterPreviewPosition(); } } [HarmonyPatch(typeof(Player))] internal static class PlayerPatch { [HarmonyPostfix] [HarmonyPatch("SetLocalPlayer")] private static void SetLocalPlayerPostfix(Player __instance) { DyeManager.SetLocalPlayer(__instance); DyeManager.SetPlayerZDOHairColor(); DyeManager.SetPlayerHairItem(); DyeManager.SetPlayerBeardItem(); } [HarmonyPostfix] [HarmonyPatch("OnSpawned")] private static void OnSpawnedPostfix(Player __instance) { DyeManager.SetLocalPlayer(__instance); DyeManager.SetPlayerZDOHairColor(); DyeManager.SetPlayerHairItem(); DyeManager.SetPlayerBeardItem(); } } [HarmonyPatch(typeof(VisEquipment))] internal static class VisEquipmentPatch { [HarmonyPrefix] [HarmonyPatch("SetHairColor")] private static void SetHairColorPrefix(VisEquipment __instance, ref Vector3 color) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (PluginConfig.IsModEnabled.Value && PluginConfig.OverridePlayerHairColor.Value && (Object)(object)__instance == (Object)(object)DyeManager.LocalVisEquipment) { color = DyeManager.GetPlayerHairColorVector(); } } [HarmonyPrefix] [HarmonyPatch("SetHairItem")] private static void SetHairItemPrefix(VisEquipment __instance, ref string name) { if (PluginConfig.IsModEnabled.Value && PluginConfig.OverridePlayerHairItem.Value && (Object)(object)__instance == (Object)(object)DyeManager.LocalVisEquipment) { name = PluginConfig.PlayerHairItem.Value; } } [HarmonyPrefix] [HarmonyPatch("SetBeardItem")] private static void SetBeardItemPrefix(VisEquipment __instance, ref string name) { if (PluginConfig.IsModEnabled.Value && PluginConfig.OverridePlayerBeardItem.Value && (Object)(object)__instance == (Object)(object)DyeManager.LocalVisEquipment) { name = PluginConfig.PlayerBeardItem.Value; } } } } namespace ComfyLib { public static class ConfigFileExtensions { internal sealed class ConfigurationManagerAttributes { public Action<ConfigEntryBase> CustomDrawer; public bool? Browsable; public bool? HideDefaultButton; public bool? HideSettingName; public bool? IsAdvanced; public int? Order; public bool? ReadOnly; } private static readonly Dictionary<string, int> _sectionToSettingOrder = new Dictionary<string, int>(); private static int GetSettingOrder(string section) { if (!_sectionToSettingOrder.TryGetValue(section, out var value)) { value = 0; } _sectionToSettingOrder[section] = value - 1; return value; } public static ConfigEntry<T> BindInOrder<T>(this ConfigFile config, string section, string key, T defaultValue, string description, AcceptableValueBase acceptableValues, bool browsable = true, bool hideDefaultButton = false, bool hideSettingName = false, bool isAdvanced = false, bool readOnly = false) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown return config.Bind<T>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, new object[1] { new ConfigurationManagerAttributes { Browsable = browsable, CustomDrawer = null, HideDefaultButton = hideDefaultButton, HideSettingName = hideSettingName, IsAdvanced = isAdvanced, Order = GetSettingOrder(section), ReadOnly = readOnly } })); } public static ConfigEntry<T> BindInOrder<T>(this ConfigFile config, string section, string key, T defaultValue, string description, Action<ConfigEntryBase> customDrawer = null, bool browsable = true, bool hideDefaultButton = false, bool hideSettingName = false, bool isAdvanced = false, bool readOnly = false) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown return config.Bind<T>(section, key, defaultValue, new ConfigDescription(description, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Browsable = browsable, CustomDrawer = customDrawer, HideDefaultButton = hideDefaultButton, HideSettingName = hideSettingName, IsAdvanced = isAdvanced, Order = GetSettingOrder(section), ReadOnly = readOnly } })); } public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action settingChangedHandler) { configEntry.SettingChanged += delegate { settingChangedHandler(); }; } public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action<T> settingChangedHandler) { configEntry.SettingChanged += delegate(object _, EventArgs eventArgs) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) settingChangedHandler((T)((SettingChangedEventArgs)eventArgs).ChangedSetting.BoxedValue); }; } public static void OnSettingChanged<T>(this ConfigEntry<T> configEntry, Action<ConfigEntry<T>> settingChangedHandler) { configEntry.SettingChanged += delegate(object _, EventArgs eventArgs) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) settingChangedHandler((ConfigEntry<T>)((SettingChangedEventArgs)eventArgs).ChangedSetting.BoxedValue); }; } } public static class ObjectExtensions { public static T Ref<T>(this T unityObject) where T : Object { if (!Object.op_Implicit((Object)(object)unityObject)) { return default(T); } return unityObject; } } public static class ZDOExtensions { public static bool TryGetVector3(this ZDO zdo, int hash, out Vector3 value) { //IL_0006: 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) if (ZDOExtraData.s_vec3.TryGetValue(zdo.m_uid, out var value2) && value2.TryGetValue(hash, ref value)) { return true; } value = default(Vector3); return false; } } }