Please disclose if your mod was created primarily 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 Judes Equipment v2.3.0
plugins/JudesEquipment.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using JudesEquipment.ArmorSets; using JudesEquipment.Configuration; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using UnityEngine; using YamlDotNet.Serialization; [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("JudesEquipment")] [assembly: AssemblyProduct("JudesEquipment")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyTrademark("")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: ComVisible(false)] [assembly: Guid("f33c90df-d8e2-403e-b94c-001a58ff0821")] [assembly: AssemblyFileVersion("2.2.4")] [assembly: AssemblyCompany("")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.2.4.0")] [module: UnverifiableCode] namespace JudesEquipment { [HarmonyPatch] internal static class GenderSwitchPatch { [HarmonyPatch(typeof(VisEquipment), "AttachArmor")] [HarmonyPostfix] public static void PostFix(VisEquipment __instance, ref List<GameObject> __result) { SetEquipmentGender(ref __result, __instance); } public static void SetEquipmentGender(ref List<GameObject> equip, VisEquipment viseq) { foreach (GameObject item in equip) { if ((Object)(object)item == (Object)null) { continue; } for (int i = 0; i < item.transform.childCount; i++) { Transform child = item.transform.GetChild(i); if (!((Object)(object)child == (Object)null)) { if (((Object)((Component)child).gameObject).name == "female" && viseq.GetModelIndex() == 0) { ((Component)child).gameObject.SetActive(false); } if (((Object)((Component)child).gameObject).name == "male" && viseq.GetModelIndex() == 1) { ((Component)child).gameObject.SetActive(false); } } } } } } public static class ItemManager { public static Transform cloneContainer; public static List<PrefabConfig> prefabs = new List<PrefabConfig>(); public static List<StatusEffect> customSEs = new List<StatusEffect>(); public static List<BlacksmithsToolsConfig> bsmithCfgs = new List<BlacksmithsToolsConfig>(); public static Dictionary<string, Dictionary<string, string>> colorConfig = new Dictionary<string, Dictionary<string, string>> { { "ArmorBarbarianBronzeHelmetJD", new Dictionary<string, string> { { "Color 1", "#FF892A" }, { "Color 2", "#FFFFFF" } } }, { "ArmorBarbarianBronzeChestJD", new Dictionary<string, string> { { "Color 1", "#FF892A" }, { "Color 2", "#FFFFFF" } } }, { "ArmorBarbarianBronzeLegsJD", new Dictionary<string, string> { { "Color 1", "#FF892A" }, { "Color 2", "#FFFFFF" } } }, { "ArmorWarriorHelmet", new Dictionary<string, string> { { "Color 1", "#FF892A" } } }, { "ArmorWarriorChest", new Dictionary<string, string> { { "Color 1", "#FF892A" } } }, { "ArmorPlateIronHelmetJD", new Dictionary<string, string> { { "Color 1", "#FFFFFF" } } }, { "ArmorPlateIronChestJD", new Dictionary<string, string> { { "Color 1", "#FFFFFF" } } }, { "ArmorPlateIronLegsJD", new Dictionary<string, string> { { "Color 1", "#FFFFFF" } } }, { "ArmorDragonslayerHelmet", new Dictionary<string, string> { { "Color 1", "#373737" } } }, { "ArmorDragonslayerChest", new Dictionary<string, string> { { "Color 1", "#373737" } } }, { "ArmorDragonslayerLegs", new Dictionary<string, string> { { "Color 1", "#373737" } } }, { "ArmorWandererChest", new Dictionary<string, string> { { "Color 1", "#FFFFFF" } } }, { "ArmorWandererLegs", new Dictionary<string, string> { { "Color 1", "#FFFFFF" } } }, { "ArmorBlackmetalgarbHelmet", new Dictionary<string, string> { { "Color 1", "#264C35" } } }, { "ArmorBlackmetalgarbChest", new Dictionary<string, string> { { "Color 1", "#264C35" } } }, { "ArmorBlackmetalgarbLegs", new Dictionary<string, string> { { "Color 1", "#264C35" } } }, { "ArmorSerpentHelmet", new Dictionary<string, string> { { "Color 1", "#264C35" }, { "Color 2", "#FFFFFF" } } }, { "ArmorSerpentChest", new Dictionary<string, string> { { "Color 1", "#264C35" }, { "Color 2", "#FFFFFF" } } }, { "ArmorSerpentLegs", new Dictionary<string, string> { { "Color 1", "#264C35" }, { "Color 2", "#FFFFFF" } } }, { "ArmorMistlandsHelmet", new Dictionary<string, string> { { "Color 1", "#545454" }, { "Emission color", "#BF3000" } } }, { "ArmorMistlandsChest", new Dictionary<string, string> { { "Color 1", "#545454" }, { "Emission color", "#BF3000" } } }, { "ArmorMistlandsLegs", new Dictionary<string, string> { { "Color 1", "#545454" }, { "Emission color", "#BF3000" } } } }; public static readonly List<string> allPrefabs = new List<string> { "ArmorNobleHelmet", "ArmorNobleChest", "ArmorNobleLegs", "ArmorNobleCape", "ArmorBarbarianBronzeHelmetJD", "ArmorBarbarianBronzeChestJD", "ArmorBarbarianBronzeLegsJD", "ArmorBarbarianCapeJD", "ArmorWarriorHelmet", "ArmorWarriorChest", "ArmorWarriorLegs", "ArmorPlateIronHelmetJD", "ArmorPlateIronChestJD", "ArmorPlateIronLegsJD", "ArmorPlateCape", "ArmorDragonslayerHelmet", "ArmorDragonslayerChest", "ArmorDragonslayerLegs", "ArmorWandererHelmet", "ArmorWandererChest", "ArmorWandererLegs", "ArmorWandererCape", "ArmorBlackmetalgarbHelmet", "ArmorBlackmetalgarbChest", "ArmorBlackmetalgarbLegs", "ArmorSerpentHelmet", "ArmorSerpentChest", "ArmorSerpentLegs", "ArmorSerpentCape", "ArmorMistlandsHelmet", "ArmorMistlandsChest", "ArmorMistlandsLegs", "BackpackSimple", "BackpackHeavy" }; public static Transform GetCloneHolder() { if ((Object)(object)cloneContainer == (Object)null) { cloneContainer = GameObject.CreatePrimitive((PrimitiveType)3).transform; Object.DontDestroyOnLoad((Object)(object)cloneContainer); ((Component)cloneContainer).gameObject.SetActive(false); return cloneContainer; } return cloneContainer; } public static void AddItemsToDBs(ObjectDB odb) { LoadPrefabsFromBundle(); foreach (PrefabConfig prefab in prefabs) { if ((Object)(object)prefab.GetPrefab() == (Object)null) { continue; } if (!odb.m_itemByHash.ContainsKey(StringExtensionMethods.GetStableHashCode(((Object)prefab.GetPrefab()).name))) { odb.m_itemByHash.Add(StringExtensionMethods.GetStableHashCode(((Object)prefab.GetPrefab()).name), prefab.GetPrefab()); } if (!odb.m_items.Contains(prefab.GetPrefab())) { odb.m_items.Add(prefab.GetPrefab()); } if ((Object)(object)ZNetScene.instance != (Object)null) { if (!ZNetScene.instance.m_prefabs.Contains(prefab.GetPrefab())) { ZNetScene.instance.m_prefabs.Add(prefab.GetPrefab()); } if (!ZNetScene.instance.m_namedPrefabs.ContainsKey(StringExtensionMethods.GetStableHashCode(((Object)prefab.GetPrefab()).name))) { ZNetScene.instance.m_namedPrefabs.Add(StringExtensionMethods.GetStableHashCode(((Object)prefab.GetPrefab()).name), prefab.GetPrefab()); } } } customSEs.ForEach(delegate(StatusEffect se) { if (!odb.m_StatusEffects.Contains(se)) { odb.m_StatusEffects.Add(se); } }); } public static void InsertBsmithToolsCfgs() { if (!Main.bsmithAvailable) { return; } FieldInfo? field = Type.GetType("BlacksmithTools.BodypartSystem,BlacksmithTools").GetField("bodypartSettingsAsBones"); Dictionary<string, List<int>> dictionary = (Dictionary<string, List<int>>)field.GetValue(field); foreach (BlacksmithsToolsConfig bsmithCfg in bsmithCfgs) { if (dictionary.ContainsKey(bsmithCfg.itemName)) { dictionary[bsmithCfg.itemName] = new List<int>(bsmithCfg.bonesToHide); } else { dictionary.Add(bsmithCfg.itemName, new List<int>(bsmithCfg.bonesToHide)); } } } private static void LoadPrefabsFromBundle() { AssetBundle bundle = Util.LoadBundle("judeequipment"); prefabs.Clear(); allPrefabs.ForEach(delegate(string _prefab) { prefabs.Add(new PrefabConfig { prefab = bundle.LoadAsset<GameObject>(_prefab) }); }); bundle.Unload(false); } } public static class LocalizationManager { public static Localization localizationInstance; public static readonly List<string> languages = new List<string> { "English", "Swedish", "French", "Italian", "German", "Spanish", "Russian", "Romanian", "Bulgarian", "Macedonian", "Finnish", "Danish", "Norwegian", "Icelandic", "Turkish", "Lithuanian", "Czech", "Hungarian", "Slovak", "Polish", "Dutch", "Portuguese_European", "Portuguese_Brazilian", "Chinese", "Japanese", "Korean", "Hindi", "Thai", "Abenaki", "Croatian", "Georgian", "Greek", "Serbian", "Ukrainian" }; public static void LoadLocalization() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) List<string> list = Directory.GetFiles(Paths.ConfigPath, "GoldenJude_JudesEquipment_Localization.yml", SearchOption.AllDirectories).ToList(); if (list.Count == 0) { File.WriteAllText(Path.Combine(Paths.ConfigPath, "GoldenJude_JudesEquipment_Localization.yml"), new SerializerBuilder().Build().Serialize((object)Main.localization)); return; } try { IDeserializer obj = new DeserializerBuilder().Build(); Dictionary<string, Dictionary<string, string>> dictionary = new Dictionary<string, Dictionary<string, string>>(); dictionary = obj.Deserialize<Dictionary<string, Dictionary<string, string>>>(File.ReadAllText(list[0])); Main.localization.Clear(); Main.localization = dictionary; Main.syncedLocalization.Value = new SerializerBuilder().Build().Serialize((object)dictionary); } catch (Exception ex) { Main.log.LogWarning((object)"An error occured when loading localization"); Main.log.LogWarning((object)ex.Message); Main.log.LogWarning((object)ex.StackTrace); } } public static void InsertLocalization() { if (localizationInstance == null) { return; } string key = localizationInstance.GetSelectedLanguage(); if (!Main.localization.ContainsKey(key)) { key = "English"; } if (!Main.localization.ContainsKey(key)) { return; } foreach (KeyValuePair<string, string> item in Main.localization[key]) { localizationInstance.m_translations.Remove(item.Key); localizationInstance.m_translations.Add(item.Key, item.Value); } } } [HarmonyPatch] internal static class Patches { public static IEnumerator DelayedRecipeInsertion() { yield return null; Main.modConfig.ApplyRecipeConfigs(); } [HarmonyPostfix] [HarmonyPatch(typeof(ObjectDB), "CopyOtherDB")] private static void CopyOtherDb_patch(ObjectDB __instance, ObjectDB other) { List<GameObject> items = __instance.m_items; object creatureShader; if (items == null) { creatureShader = null; } else { GameObject? obj = items.Find((GameObject _item) => ((Object)_item).name == "ArmorIronChest"); if (obj == null) { creatureShader = null; } else { SkinnedMeshRenderer componentInChildren = obj.GetComponentInChildren<SkinnedMeshRenderer>(true); if (componentInChildren == null) { creatureShader = null; } else { Material material = ((Renderer)componentInChildren).material; creatureShader = ((material != null) ? material.shader : null); } } } Main.creatureShader = (Shader)creatureShader; ItemManager.AddItemsToDBs(__instance); } [HarmonyPatch(typeof(ObjectDB), "Awake")] [HarmonyPostfix] private static void DbAwake_patch(ObjectDB __instance) { List<GameObject> items = __instance.m_items; object creatureShader; if (items == null) { creatureShader = null; } else { GameObject? obj = items.Find((GameObject _item) => ((Object)_item).name == "ArmorIronChest"); if (obj == null) { creatureShader = null; } else { SkinnedMeshRenderer componentInChildren = obj.GetComponentInChildren<SkinnedMeshRenderer>(true); if (componentInChildren == null) { creatureShader = null; } else { Material material = ((Renderer)componentInChildren).material; creatureShader = ((material != null) ? material.shader : null); } } } Main.creatureShader = (Shader)creatureShader; if (Main.bsmithAvailable) { Main.CreateBlacksmithsTooslConfigs(); ItemManager.InsertBsmithToolsCfgs(); } ItemManager.AddItemsToDBs(__instance); Main.LoadModConfig(); LocalizationManager.LoadLocalization(); LocalizationManager.InsertLocalization(); } [HarmonyPostfix] [HarmonyPatch(typeof(FejdStartup), "Start")] private static void FejdSetupGui_patch() { LocalizationManager.localizationInstance = Localization.instance; } [HarmonyPostfix] [HarmonyPatch(typeof(Humanoid), "HaveSetEffect")] private static void shitpatch(ItemData item, Humanoid __instance, ref bool __result) { if (!__result && item != null && !((Object)(object)item.m_dropPrefab == (Object)null) && ItemManager.allPrefabs.Contains(((Object)item.m_dropPrefab).name)) { __result = item != null && !((Object)(object)item.m_shared.m_setStatusEffect == (Object)null) && item.m_shared.m_setName.Length != 0 && item.m_shared.m_setSize > 0 && __instance.GetSetCount(item.m_shared.m_setName) >= item.m_shared.m_setSize; } } } public static class Sync { public static ConfigSync configSync = new ConfigSync("GoldenJude_JudesEquipment") { DisplayName = "Jude's Equipment", CurrentVersion = "2.2.4", MinimumRequiredVersion = "2.2.4" }; public static ConfigEntry<T> SyncConfig<T>(ConfigEntry<T> entry) { configSync.AddConfigEntry<T>(entry).SynchronizedConfig = true; return entry; } } public static class Util { public static readonly int[] Torso = new int[6] { 0, 1, 2, 3, 7, 26 }; public static readonly int[] ArmUpperLeft = new int[1] { 8 }; public static readonly int[] ArmLowerLeft = new int[1] { 9 }; public static readonly int[] HandLeft = new int[17] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 }; public static readonly int[] ArmUpperRight = new int[1] { 27 }; public static readonly int[] ArmLowerRight = new int[1] { 28 }; public static readonly int[] HandRight = new int[16] { 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }; public static readonly int[] LegUpperLeft = new int[1] { 45 }; public static readonly int[] LegLowerLeft = new int[1] { 46 }; public static readonly int[] FootLeft = new int[2] { 47, 48 }; public static readonly int[] LegUpperRight = new int[1] { 49 }; public static readonly int[] LegLowerRight = new int[1] { 50 }; public static readonly int[] FootRight = new int[2] { 51, 52 }; public static readonly int[] TorsoUpperArms = Torso.Concat(ArmUpperLeft).Concat(ArmUpperRight).ToArray(); public static readonly int[] TorsoUpperLowerArms = Torso.Concat(ArmUpperLeft).Concat(ArmLowerLeft).Concat(ArmUpperRight) .Concat(ArmLowerRight) .ToArray(); public static readonly int[] CompleteLegs = LegUpperLeft.Concat(LegLowerLeft).Concat(FootLeft).Concat(LegUpperRight) .Concat(LegLowerRight) .Concat(FootRight) .ToArray(); public static AssetBundle LoadBundle(string bundleName) { return AssetBundle.LoadFromStream(Main.assembly.GetManifestResourceStream(Main.assembly.GetName().Name + ".Resources." + bundleName)); } public static bool IsModAvailable(string modName, string minVersion, bool printAllMods = false) { PluginInfo? obj = Chainloader.PluginInfos.Values.ToList().Find((PluginInfo _modName) => _modName.Metadata.Name == modName); return ((obj != null) ? obj.Metadata.Version : null) >= new Version(minVersion); } public static List<DamageModPair> ParseDmgModPairs(string def) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //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_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: 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_00b2: Unknown result type (might be due to invalid IL or missing references) try { if (string.IsNullOrEmpty(def)) { return new List<DamageModPair>(); } def = def.Trim(); List<DamageModPair> list = new List<DamageModPair>(); string[] array = def.Split(new char[1] { ';' }); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { ':' }); DamageType type = (DamageType)Enum.Parse(typeof(DamageType), array2[0].ToString().Trim()); DamageModifier modifier = (DamageModifier)Enum.Parse(typeof(DamageModifier), array2[1].ToString().Trim()); list.Add(new DamageModPair { m_type = type, m_modifier = modifier }); } return list; } catch (Exception ex) { Main.log.LogError((object)"An error occured when parsing damge modifiers"); Main.log.LogError((object)ex.Message); return new List<DamageModPair>(); } } } [BepInPlugin("GoldenJude_JudesEquipment", "JudesEquipment", "2.2.4")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Main : BaseUnityPlugin { public const string MODNAME = "JudesEquipment"; public const string AUTHOR = "GoldenJude"; public const string GUID = "GoldenJude_JudesEquipment"; public const string VERSION = "2.2.4"; public static ManualLogSource log; internal readonly Harmony harmony; public static Assembly assembly; public const string bundleName = "judeequipment"; public const string itemConfigName = "GoldenJude_JudesEquipment_ItemConfig.yml"; public const string localizationconfigName = "GoldenJude_JudesEquipment_Localization.yml"; public const string colorConfigName = "GoldenJude_JudesEquipment_Colors.yml"; public static CustomSyncedValue<string> syncedModConfig = new CustomSyncedValue<string>(Sync.configSync, Path.GetFileNameWithoutExtension("GoldenJude_JudesEquipment_ItemConfig.yml")); public static CustomSyncedValue<string> syncedLocalization = new CustomSyncedValue<string>(Sync.configSync, Path.GetFileNameWithoutExtension("GoldenJude_JudesEquipment_Localization.yml")); public static SyncedConfigEntry<int> lockingConfig; public static ConfigEntry<bool> neutralMetals; public static ConfigEntry<bool> smoothTextures; public static Shader creatureShader; public static bool bsmithAvailable = false; public static bool hugosCollidersAvaiable = false; public static ItemConfig modConfig = new ItemConfig(); public static Dictionary<string, Dictionary<string, string>> localization = new Dictionary<string, Dictionary<string, string>> { { "English", new Dictionary<string, string>() } }; public static FileSystemWatcher fsw = new FileSystemWatcher { Path = Paths.ConfigPath, IncludeSubdirectories = true, EnableRaisingEvents = true }; public Main() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown log = ((BaseUnityPlugin)this).Logger; harmony = new Harmony("GoldenJude_JudesEquipment"); assembly = Assembly.GetExecutingAssembly(); } public void Start() { harmony.PatchAll(assembly); bsmithAvailable = Util.IsModAvailable("BlacksmithTools", "2.0.0"); hugosCollidersAvaiable = Util.IsModAvailable("More Player Cloth Colliders", "3.0.0"); lockingConfig = Sync.configSync.AddLockingConfigEntry<int>(((BaseUnityPlugin)this).Config.Bind<int>("Sync", "Sync configs", 1, "1 = enabled, 0 = disabled")); neutralMetals = ((BaseUnityPlugin)this).Config.Bind<bool>("Appearance", "Neutral metals", false, "Makes all metals a neutral grey"); smoothTextures = ((BaseUnityPlugin)this).Config.Bind<bool>("Appearance", "Smooth textures", false, "Removes pixelization filter on all textures, overrides color config"); CreateDefaultLocalization(); LocalizationManager.LoadLocalization(); LoadColorConfig(); syncedModConfig.ValueChanged += delegate { //IL_0000: Unknown result type (might be due to invalid IL or missing references) modConfig = new DeserializerBuilder().Build().Deserialize<ItemConfig>(syncedModConfig.Value); modConfig.ApplyArmorConfigs(); modConfig.ApplyRecipeConfigs(); modConfig.ApplySetEffects(); }; syncedLocalization.ValueChanged += delegate { //IL_0000: Unknown result type (might be due to invalid IL or missing references) localization = new DeserializerBuilder().Build().Deserialize<Dictionary<string, Dictionary<string, string>>>(syncedLocalization.Value); LocalizationManager.InsertLocalization(); }; fsw.Changed += delegate(object sender, FileSystemEventArgs e) { if (Sync.configSync.IsSourceOfTruth) { if (Path.GetFileName(e.FullPath) == "GoldenJude_JudesEquipment_ItemConfig.yml") { LoadModConfig(); } if (Path.GetFileName(e.FullPath) == "GoldenJude_JudesEquipment_Localization.yml") { LocalizationManager.LoadLocalization(); } } }; } public static void LoadColorConfig() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) List<string> list = Directory.GetFiles(Paths.ConfigPath, "GoldenJude_JudesEquipment_Colors.yml", SearchOption.AllDirectories).ToList(); if (list.Count == 0) { File.WriteAllText(Path.Combine(Paths.ConfigPath, "GoldenJude_JudesEquipment_Colors.yml"), new SerializerBuilder().Build().Serialize((object)ItemManager.colorConfig)); return; } new Dictionary<string, Dictionary<string, string>>(); try { ItemManager.colorConfig = new DeserializerBuilder().Build().Deserialize<Dictionary<string, Dictionary<string, string>>>(File.ReadAllText(list[0])); } catch (Exception ex) { log.LogWarning((object)"An error occured when loading GoldenJude_JudesEquipment_Colors.yml, will use default values"); log.LogWarning((object)ex.Message); log.LogWarning((object)ex.StackTrace); } } public static void LoadModConfig() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) List<string> list = Directory.GetFiles(Paths.ConfigPath, "GoldenJude_JudesEquipment_ItemConfig.yml", SearchOption.AllDirectories).ToList(); if (list.Count == 0) { File.WriteAllText(Path.Combine(Paths.ConfigPath, "GoldenJude_JudesEquipment_ItemConfig.yml"), new SerializerBuilder().Build().Serialize((object)modConfig)); return; } ItemConfig itemConfig = new ItemConfig(); try { itemConfig = new DeserializerBuilder().Build().Deserialize<ItemConfig>(File.ReadAllText(list[0])); } catch (Exception ex) { log.LogWarning((object)"An error occured when loading GoldenJude_JudesEquipment_ItemConfig.yml, will use default values"); log.LogWarning((object)ex.Message); log.LogWarning((object)ex.StackTrace); } syncedModConfig.Value = new SerializerBuilder().Build().Serialize((object)itemConfig); try { if (!ConfigHasAllArmors(File.ReadAllText(list[0]))) { File.WriteAllText(Path.Combine(Paths.ConfigPath, "GoldenJude_JudesEquipment_ItemConfig.yml"), new SerializerBuilder().Build().Serialize((object)modConfig)); } } catch (Exception ex2) { log.LogWarning((object)("failed to validate if item config fil contains all sets, error: " + Environment.NewLine + ex2.Message)); } } private static bool ConfigHasAllArmors(string configJson) { foreach (FieldInfo item in (from field in typeof(ItemConfig).GetFields().ToList() where field.CustomAttributes.First((CustomAttributeData att) => att.AttributeType == typeof(YamlMemberAttribute)) != null select field).ToList()) { string value = (string)item.CustomAttributes.First((CustomAttributeData att) => att.AttributeType == typeof(YamlMemberAttribute)).NamedArguments.First((CustomAttributeNamedArgument na) => na.MemberName == "Alias").TypedValue.Value; if (!configJson.Contains(value)) { return false; } } return true; } private void CreateDefaultLocalization() { localization["English"].Add("ArmorNobleHelmet", "Fur hat"); localization["English"].Add("ArmorNobleHelmet_description", "Fashionable hat with fur lining"); localization["English"].Add("ArmorNobleChest", "Noble's banner garb"); localization["English"].Add("ArmorNobleChest_description", "A garb stitched together from banners torn from your burial chamber, a good alternative to roaming Valheim bare"); localization["English"].Add("ArmorNobleLegs", "Noble's pants"); localization["English"].Add("ArmorNobleLegs_description", "Worn, loose pants from a past life where one could afford to feast more often"); localization["English"].Add("ArmorNobleCape", "Vegvisir cape"); localization["English"].Add("ArmorNobleCape_description", "Cape fashioned from a vegvisir banner"); localization["English"].Add("ArmorBarbarianBronzeHelmetJD", "Barbarian's helmet"); localization["English"].Add("ArmorBarbarianBronzeHelmetJD_description", "Helmet made from a bronze alloy"); localization["English"].Add("ArmorBarbarianBronzeChestJD", "Barbarian's armor"); localization["English"].Add("ArmorBarbarianBronzeChestJD_description", "A bronze disc attached to leather straps, a true barbarian hurls himself into battle despite the lack of protection"); localization["English"].Add("ArmorBarbarianBronzeLegsJD", "Barbarian's boots"); localization["English"].Add("ArmorBarbarianBronzeLegsJD_description", "Thick hide wrapped around one's waist, fastened with a fashionable bronze belt"); localization["English"].Add("ArmorBarbarianCapeJD", "Barbarian's fur cape"); localization["English"].Add("ArmorBarbarianCapeJD_description", "Thick, short cape made from fur. Covers ones back when his drunk raidmates can't."); localization["English"].Add("ArmorWarriorHelmet", "Warrior's helmet"); localization["English"].Add("ArmorWarriorHelmet_description", "Chainmail wrapping around the neck provides good protection"); localization["English"].Add("ArmorWarriorChest", "Warrior's hauberk"); localization["English"].Add("ArmorWarriorChest_description", "Long vest made from linked chains"); localization["English"].Add("ArmorWarriorLegs", "Warrior's boots"); localization["English"].Add("ArmorWarriorLegs_description", "Multi-layered pants keep it's wearer warm and protected"); localization["English"].Add("ArmorPlateIronHelmetJD", "Sturdy helmet"); localization["English"].Add("ArmorPlateIronHelmetJD_description", "A sturdy helmet with a leather neckguard"); localization["English"].Add("ArmorPlateIronChestJD", "Plate mail"); localization["English"].Add("ArmorPlateIronChestJD_description", "Thick plates of metal riveted to a leather harness"); localization["English"].Add("ArmorPlateIronLegsJD", "Plate greaves"); localization["English"].Add("ArmorPlateIronLegsJD_description", "Reliable greaves and kneeguards"); localization["English"].Add("ArmorPlateCape", "Boar cape"); localization["English"].Add("ArmorPlateCape_description", "Reinforced boar hide worn around one's shoulders like a trophy"); localization["English"].Add("ArmorDragonslayerHelmet", "Horned helm"); localization["English"].Add("ArmorDragonslayerHelmet_description", "Dragon's tremble in fear when they see the blackened helmet adorned with the horns of their kin"); localization["English"].Add("ArmorDragonslayerChest", "Dragonslayer's armor"); localization["English"].Add("ArmorDragonslayerChest_description", "Obsidian layer over silver plates makes for reliable protection"); localization["English"].Add("ArmorDragonslayerLegs", "Spiked greaves"); localization["English"].Add("ArmorDragonslayerLegs_description", "Unlucky is he who finds himself in the way of these"); localization["English"].Add("ArmorWandererHelmet", "Straw hat"); localization["English"].Add("ArmorWandererHelmet_description", "A reinforced straw hat"); localization["English"].Add("ArmorWandererChest", "Coat of plates"); localization["English"].Add("ArmorWandererChest_description", "Small metal plates attached to a leather jerkin, easy to maintain during travels"); localization["English"].Add("ArmorWandererLegs", "Wanderer's pants"); localization["English"].Add("ArmorWandererLegs_description", "Durable pants with makeshift protection around the shins"); localization["English"].Add("ArmorWandererCape", "Straw cape"); localization["English"].Add("ArmorWandererCape_description", "Cheap to make cape made from straw collected in the plains, protects against the elements but is quick to catch fire"); localization["English"].Add("ArmorBlackmetalgarbHelmet", "Nomadic helmet"); localization["English"].Add("ArmorBlackmetalgarbHelmet_description", "Blackmetal helmet with colorful padding fit for a nomad"); localization["English"].Add("ArmorBlackmetalgarbChest", "Nomadic garb"); localization["English"].Add("ArmorBlackmetalgarbChest_description", "A nomadic garb adorned with protective elements made from blackmetal, found commonly in the nomad's homeland, the plains"); localization["English"].Add("ArmorBlackmetalgarbLegs", "Nomadic boots"); localization["English"].Add("ArmorBlackmetalgarbLegs_description", "Thick leather boots with blackmetal toe guard, helpful when one happens to get stomped on by a Lox"); localization["English"].Add("ArmorSerpentHelmet", "Finned helm"); localization["English"].Add("ArmorSerpentHelmet_description", "A thick blackmetal casque adorned by the fins of a mighty serpent. The style is popular with raiding knights of the South."); localization["English"].Add("ArmorSerpentChest", "Serpent armor"); localization["English"].Add("ArmorSerpentChest_description", "Plates of blackmetal overtop a surcoat of sea serpent scales. The perfect garb for spreading Odin's good word."); localization["English"].Add("ArmorSerpentLegs", "Serpent Cuisses"); localization["English"].Add("ArmorSerpentLegs_description", "Blackmetal cuisses, greaves and sabatons. Excellent protection with a slightly fishy smell."); localization["English"].Add("ArmorSerpentCape", "Serpent knight's cape"); localization["English"].Add("ArmorSerpentCape_description", "Heavy dark cape of the Serpent order."); localization["English"].Add("ArmorMistlandsHelmet", "Scorched sallet"); localization["English"].Add("ArmorMistlandsHelmet_description", "Helmet made from a rare material only found within the ashlands"); localization["English"].Add("ArmorMistlandsChest", "Scorched armor"); localization["English"].Add("ArmorMistlandsChest_description", "Thick, multi layered gambeson provides protection from the searing heat of flametal, which in turn protects from blows"); localization["English"].Add("ArmorMistlandsLegs", "Scorched greaves"); localization["English"].Add("ArmorMistlandsLegs_description", "One need not fear the cold while wearing these"); localization["English"].Add("BackpackSimple", "Simple backpack"); localization["English"].Add("BackpackSimple_description", "Leather container attached to a wooden frame"); localization["English"].Add("BackpackHeavy", "Heavy backpack"); localization["English"].Add("BackpackHeavy_description", "Large chest hauled on ones shoulders with a canvas bag for additional storage"); } public static void CreateBlacksmithsTooslConfigs() { if (bsmithAvailable) { ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorNobleChest", bonesToHide = Util.TorsoUpperLowerArms }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorNobleLegs", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorBlackmetalgarbChest", bonesToHide = Util.TorsoUpperArms }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorBlackmetalgarbLegs", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorBarbarianBronzeLegsJD", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorWarriorLegs", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorWandererChest", bonesToHide = Util.TorsoUpperArms }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorWandererLegs", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorDragonslayerChest", bonesToHide = Util.TorsoUpperArms }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorDragonslayerLegs", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorMistlandsChest", bonesToHide = Util.TorsoUpperLowerArms }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorMistlandsLegs", bonesToHide = Util.CompleteLegs }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorSerpentChest", bonesToHide = Util.TorsoUpperLowerArms }); ItemManager.bsmithCfgs.Add(new BlacksmithsToolsConfig { itemName = "ArmorSerpentLegs", bonesToHide = Util.CompleteLegs }); } } } } namespace JudesEquipment.Properties { [CompilerGenerated] [DebuggerNonUserCode] [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { resourceMan = new ResourceManager("JudesEquipment.Properties.Resources", typeof(Resources).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] judeequipment => (byte[])ResourceManager.GetObject("judeequipment", resourceCulture); internal Resources() { } } } namespace JudesEquipment.BlacksmithWares { [HarmonyPatch] internal class bodyhiding { public Texture2D GetTextureMask() { //IL_0019: 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) //IL_0044: Expected O, but got Unknown //IL_0055: Expected O, but got Unknown Main.log.LogWarning((object)"started creation"); Texture2D val = new Texture2D(256, 256); byte[] array = File.ReadAllBytes(Path.GetDirectoryName(Main.assembly.Location) + "\\playermask.png"); ImageConversion.LoadImage(val, array); Main.log.LogWarning((object)"ended creation"); return val; } } } namespace JudesEquipment.Configuration { public class ArmorConfig { [YamlMember(Alias = "item prefab name")] public string prefabName = string.Empty; [YamlMember(Alias = "required for set bonus")] public bool countsTowardsSetBonus = true; public int armor; [YamlMember(Alias = "armor per level")] public int armorPerLevel = 2; [YamlMember(Alias = "enable durability")] public bool enableDurability = true; public int baseDurability = 1000; [YamlMember(Alias = "durability per level")] public int durabilityPerLevel = 200; public bool repairable = true; [YamlMember(Alias = "destroy when broken")] public bool destroyBroken; public int weight; public bool teleportable = true; [YamlMember(Alias = "maximum upgrade level")] public int maxUpgradeLevel = 4; [YamlMember(Alias = "movement speed modifier")] public int movementSpeedModifier; [YamlMember(Alias = "damage modifiers")] public Dictionary<string, string> damageModifiers; [YamlMember(Alias = "recipe")] public RecipeConfig recipe; public void ApplyConfig() { PrefabConfig? prefabConfig = ItemManager.prefabs.Find((PrefabConfig prefab) => ((Object)prefab.GetPrefab()).name == prefabName); object obj; if (prefabConfig == null) { obj = null; } else { GameObject prefab2 = prefabConfig.GetPrefab(); obj = ((prefab2 != null) ? prefab2.GetComponent<ItemDrop>().m_itemData.m_shared : null); } SharedData val = (SharedData)obj; if (val != null) { val.m_weight = weight; val.m_armor = armor; val.m_armorPerLevel = armorPerLevel; val.m_damageModifiers = ParseModPairs(damageModifiers); val.m_maxDurability = baseDurability; val.m_durabilityPerLevel = durabilityPerLevel; val.m_destroyBroken = destroyBroken; val.m_canBeReparied = repairable; val.m_movementModifier = (float)movementSpeedModifier / 100f; val.m_equipDuration = 1f; val.m_maxQuality = maxUpgradeLevel; val.m_useDurability = enableDurability; } } public static List<DamageModPair> ParseModPairs(Dictionary<string, string> mods) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) List<DamageModPair> list = new List<DamageModPair>(); foreach (KeyValuePair<string, string> mod in mods) { if (!(mod.Value.ToLower() == "none")) { DamageType type = (DamageType)Enum.Parse(typeof(DamageType), mod.Key); DamageModifier modifier = (DamageModifier)Enum.Parse(typeof(DamageModifier), mod.Value); list.Add(new DamageModPair { m_type = type, m_modifier = modifier }); } } return list; } public ArmorConfig() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) Dictionary<string, string> dictionary = new Dictionary<string, string>(); DamageType val = (DamageType)1; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)2; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)4; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)8; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)32; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)64; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)128; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)256; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)512; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); damageModifiers = dictionary; recipe = new RecipeConfig(); base..ctor(); } } public class ArmorSetConfig { [YamlMember(Alias = "set effect")] public SetEffect setEffect = new SetEffect(); public Dictionary<string, ArmorConfig> items = new Dictionary<string, ArmorConfig>(); public void ApplyArmorConfigs() { items.Values.ToList().ForEach(delegate(ArmorConfig piece) { piece.ApplyConfig(); }); } public void ApplyRecipeConfigs() { items.Values.ToList().ForEach(delegate(ArmorConfig piece) { piece.recipe.ApplyConfig(piece.prefabName); }); } public void ApplySetConfig(string effectName) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ObjectDB.instance == (Object)null) { return; } SE_Stats effect = (SE_Stats)ItemManager.customSEs.Find((StatusEffect se) => ((Object)se).name == effectName); if ((Object)(object)effect == (Object)null) { effect = ScriptableObject.CreateInstance<SE_Stats>(); ((Object)effect).name = effectName; ((StatusEffect)effect).m_icon = ObjectDB.instance.m_items.Find((GameObject iconSource) => ((Object)iconSource).name == items.Values.ToList()[0].prefabName).GetComponent<ItemDrop>().m_itemData.m_shared.m_icons[0]; ObjectDB.instance.m_StatusEffects.Add((StatusEffect)(object)effect); ItemManager.customSEs.Add((StatusEffect)(object)effect); } effect.m_healthRegenMultiplier = (float)setEffect.healthRegenModifier / 100f + 1f; effect.m_staminaRegenMultiplier = (float)setEffect.staminaReregenModifier / 100f + 1f; effect.m_addMaxCarryWeight = setEffect.carryWeightModifier; effect.m_mods = ArmorConfig.ParseModPairs(setEffect.damageModifiers); effect.m_skillLevel = (SkillType)Enum.Parse(typeof(SkillType), setEffect.skillModifier.skill); effect.m_skillLevelModifier = setEffect.skillModifier.modifier; effect.m_runStaminaDrainModifier = (float)setEffect.runStaminaDrainModifier / 100f; effect.m_jumpStaminaUseModifier = (float)setEffect.jumpStaminaDrainModifier / 100f; items.Values.ToList().ForEach(delegate(ArmorConfig piece) { if (piece.countsTowardsSetBonus) { GameObject prefab = ItemManager.prefabs.Find((PrefabConfig armor) => ((Object)armor.GetPrefab()).name == piece.prefabName).GetPrefab(); ItemDrop obj = ((prefab != null) ? prefab.GetComponent<ItemDrop>() : null); obj.m_itemData.m_shared.m_setStatusEffect = (StatusEffect)(object)effect; obj.m_itemData.m_shared.m_setName = effectName; obj.m_itemData.m_shared.m_setSize = GetSetSize(); } }); } public int GetSetSize() { int num = 0; foreach (ArmorConfig value in items.Values) { if (value.countsTowardsSetBonus) { num++; } } return num; } } public class BlacksmithsToolsConfig { public string itemName; public int[] bonesToHide; } public class ItemConfig { [YamlMember(Alias = "noble's armor")] public Noble noble = new Noble(); [YamlMember(Alias = "barbarian's armor")] public Barbarian barbarian = new Barbarian(); [YamlMember(Alias = "warrior's armor")] public Warrior warrior = new Warrior(); [YamlMember(Alias = "plate armor")] public Plate plate = new Plate(); [YamlMember(Alias = "dragonslayer's armor")] public Dragonslayer dragonslayer = new Dragonslayer(); [YamlMember(Alias = "wanderer's armor")] public Wanderer wanderer = new Wanderer(); [YamlMember(Alias = "nomad's armor")] public Nomad nomad = new Nomad(); [YamlMember(Alias = "serpent armor")] public Serpent serpent = new Serpent(); [YamlMember(Alias = "scorched armor")] public Scorched scorched = new Scorched(); [YamlMember(Alias = "simple backpack")] public SimpleBackpack simpleBackpack = new SimpleBackpack(); [YamlMember(Alias = "heavy backpack")] public HeavyBackpack heavyBackpack = new HeavyBackpack(); [YamlIgnore] private List<ArmorSetConfig> Sets => new List<ArmorSetConfig> { noble, barbarian, warrior, plate, dragonslayer, wanderer, nomad, serpent, scorched, simpleBackpack, heavyBackpack }; public void ApplyArmorConfigs() { Sets.ForEach(delegate(ArmorSetConfig set) { set.ApplyArmorConfigs(); }); } public void ApplyRecipeConfigs() { Sets.ForEach(delegate(ArmorSetConfig set) { set.ApplyRecipeConfigs(); }); } public void ApplySetEffects() { Sets.ForEach(delegate(ArmorSetConfig set) { set.ApplySetConfig(set.items.Values.First().prefabName); }); } } public class PrefabConfig { public GameObject prefab; public bool replaceMat = true; public GameObject GetPrefab() { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Invalid comparison between Unknown and I4 if ((Object)(object)prefab == (Object)null) { Main.log.LogWarning((object)"prefab null"); return null; } prefab.layer = 12; ItemDrop component = prefab.GetComponent<ItemDrop>(); SharedData shared = component.m_itemData.m_shared; prefab.layer = 12; string name = "$" + ((Object)prefab).name; string description = "$" + ((Object)prefab).name + "_description"; shared.m_name = name; shared.m_description = description; if (replaceMat) { ReplaceMaterials(); } if (!Main.hugosCollidersAvaiable && (int)component.m_itemData.m_shared.m_itemType != 17) { prefab.GetComponentsInChildren<Cloth>(true).ToList().ForEach(delegate(Cloth cloth) { Object.Destroy((Object)(object)cloth); }); } return prefab; } public void ReplaceMaterials() { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)prefab == (Object)null || (Object)(object)Main.creatureShader == (Object)null) { return; } List<Renderer> list = new List<Renderer>(); list.AddRange((IEnumerable<Renderer>)(object)prefab.GetComponentsInChildren<MeshRenderer>(true)); list.AddRange((IEnumerable<Renderer>)(object)prefab.GetComponentsInChildren<SkinnedMeshRenderer>(true)); foreach (Renderer item in list) { List<Material> list2 = new List<Material>(); int num = 0; Material[] materials = item.materials; foreach (Material mat in materials) { string[] source = new string[4] { "_MainTex", "_BumpMap", "_MetallicGlossMap", "_EmissionMap" }; (new string[1])[0] = "_BumpMap"; Material replacerMat = new Material(Main.creatureShader); replacerMat.SetFloat("_Cull", 0f); replacerMat.SetFloat("_AddRain", 1f); replacerMat.SetFloat("_Glossiness", 0f); int num2 = (((Object)(object)mat.GetTexture("_MetallicGlossMap") != (Object)null) ? 1 : 0); replacerMat.SetFloat("_Metallic", (float)num2); replacerMat.SetFloat("_MetalGloss", mat.GetFloat("_GlossMapScale")); replacerMat.SetFloat("_TwoSidedNormals", 1f); Color val = mat.GetColor("_Color"); Color val2 = mat.GetColor("_EmissionColor"); if (Main.neutralMetals.Value) { val = Color.grey; val2 = Color.black; } else if (ItemManager.colorConfig.ContainsKey(((Object)prefab).name)) { string key = "Color " + (num + 1); if (ItemManager.colorConfig[((Object)prefab).name].ContainsKey(key)) { ColorUtility.TryParseHtmlString(ItemManager.colorConfig[((Object)prefab).name][key], ref val); } if (ItemManager.colorConfig[((Object)prefab).name].ContainsKey("Emission color")) { ColorUtility.TryParseHtmlString(ItemManager.colorConfig[((Object)prefab).name]["Emission color"], ref val2); } } replacerMat.SetColor("_Color", Color.white); replacerMat.SetColor("_MetalColor", val); replacerMat.SetColor("_EmissionColor", val2); replacerMat.EnableKeyword("_ADDRAIN_ON"); replacerMat.EnableKeyword("_TWOSIDEDNORMALS_ON"); source.ToList().ForEach(delegate(string tex) { Texture texture = mat.GetTexture(tex); if ((Object)(object)texture != (Object)null && Main.smoothTextures.Value) { texture.filterMode = (FilterMode)1; } replacerMat.SetTexture(tex, texture); }); list2.Add(replacerMat); num++; } item.materials = list2.ToArray(); } replaceMat = false; } } public class RecipeConfig { public class RequirementConfig { [YamlMember(Alias = "item")] public string item; [YamlMember(Alias = "amount")] public int amount; [YamlMember(Alias = "amount per level")] public int amountPerLevel; public Requirement GetRequirement() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown Requirement val = new Requirement(); GameObject? obj = ObjectDB.instance.m_items.Find((GameObject _item) => ((Object)_item).name == item); val.m_resItem = ((obj != null) ? obj.GetComponent<ItemDrop>() : null); if ((Object)(object)val.m_resItem == (Object)null) { return null; } val.m_amount = amount; val.m_amountPerLevel = amountPerLevel; val.m_recover = true; return val; } } [YamlMember(Alias = "enabled")] public bool enabled = true; [YamlIgnore] public int amount = 1; [YamlMember(Alias = "station")] public string station = string.Empty; [YamlMember(Alias = "minimum station level")] public int minimumStationLevel = 1; [YamlMember(Alias = "requirements")] public List<RequirementConfig> requirements = new List<RequirementConfig>(); public void ApplyConfig(string prefabName) { bool flag = false; string recipeName = prefabName + "_recipe"; if ((Object)(object)ObjectDB.instance == (Object)null || (Object)(object)ZNetScene.instance == (Object)null || !enabled) { return; } Recipe val = ObjectDB.instance.m_recipes?.Find((Recipe _recipe) => ((Object)_recipe).name == recipeName); if ((Object)(object)val == (Object)null) { flag = true; } PrefabConfig? prefabConfig = ItemManager.prefabs.Find((PrefabConfig _prefab) => ((Object)_prefab.GetPrefab()).name == prefabName); object obj; if (prefabConfig == null) { obj = null; } else { GameObject prefab = prefabConfig.GetPrefab(); obj = ((prefab != null) ? prefab.GetComponent<ItemDrop>() : null); } ItemDrop val2 = (ItemDrop)obj; if ((Object)(object)val2 == (Object)null) { return; } if (flag) { val = ScriptableObject.CreateInstance<Recipe>(); ((Object)val).name = recipeName; ObjectDB.instance.m_recipes.Add(val); } val.m_enabled = enabled; val.m_item = val2; val.m_amount = amount; Recipe obj2 = val; GameObject prefab2 = ZNetScene.instance.GetPrefab(station); obj2.m_craftingStation = ((prefab2 != null) ? prefab2.GetComponent<CraftingStation>() : null); val.m_repairStation = val.m_craftingStation; val.m_minStationLevel = minimumStationLevel; List<Requirement> resolvedRequirements = new List<Requirement>(); requirements.ForEach(delegate(RequirementConfig reqCfg) { Requirement requirement = reqCfg.GetRequirement(); if (requirement != null) { resolvedRequirements.Add(requirement); } }); val.m_resources = resolvedRequirements.ToArray(); } } public class SetEffect { [YamlMember(Alias = "health regen modifier")] public int healthRegenModifier; [YamlMember(Alias = "stamina regen modifier")] public int staminaReregenModifier; [YamlMember(Alias = "run stamina drain modifier")] public int runStaminaDrainModifier; [YamlMember(Alias = "jump stamina drain modifier")] public int jumpStaminaDrainModifier; [YamlMember(Alias = "carry weight modifier")] public int carryWeightModifier; [YamlMember(Alias = "skill modifier")] public SkillModifier skillModifier = new SkillModifier(); [YamlMember(Alias = "damage modifiers")] public Dictionary<string, string> damageModifiers; public SetEffect() { //IL_0013: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_00b5: 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_00f1: Unknown result type (might be due to invalid IL or missing references) Dictionary<string, string> dictionary = new Dictionary<string, string>(); DamageType val = (DamageType)1; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)2; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)4; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)8; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)32; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)64; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)128; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)256; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); val = (DamageType)512; dictionary.Add(((object)(DamageType)(ref val)).ToString(), "none"); damageModifiers = dictionary; base..ctor(); } } public class SkillModifier { public string skill = "None"; public int modifier; } } namespace JudesEquipment.ArmorSets { public class Barbarian : ArmorSetConfig { public Barbarian() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { staminaReregenModifier = 25 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)7; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 25; obj.skillModifier = skillModifier; setEffect = obj; int armor = 4; int weight = 10; ArmorConfig value = new ArmorConfig { prefabName = "ArmorBarbarianBronzeHelmetJD", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Bronze", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 2, amountPerLevel = 0 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorBarbarianBronzeChestJD", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Bronze", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 2, amountPerLevel = 0 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorBarbarianBronzeLegsJD", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Bronze", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 2, amountPerLevel = 0 } } } }; ArmorConfig value4 = new ArmorConfig { prefabName = "ArmorBarbarianCapeJD", armor = 4, weight = 6, movementSpeedModifier = -3, countsTowardsSetBonus = false, recipe = new RecipeConfig { station = "piece_workbench", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 8, amountPerLevel = 4 }, new RecipeConfig.RequirementConfig { item = "Bronze", amount = 1, amountPerLevel = 1 }, new RecipeConfig.RequirementConfig { item = "BoneFragments", amount = 5, amountPerLevel = 3 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); items.Add("cape", value4); } } public class Dragonslayer : ArmorSetConfig { public Dragonslayer() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { jumpStaminaDrainModifier = -25 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)100; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 30; obj.skillModifier = skillModifier; setEffect = obj; Dictionary<string, string> damageModifiers = setEffect.damageModifiers; DamageType val2 = (DamageType)64; string? key = ((object)(DamageType)(ref val2)).ToString(); DamageModifier val3 = (DamageModifier)1; damageModifiers[key] = ((object)(DamageModifier)(ref val3)).ToString(); int armor = 24; int weight = 20; int movementSpeedModifier = -5; ArmorConfig value = new ArmorConfig { prefabName = "ArmorDragonslayerHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Silver", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "WolfPelt", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "Obsidian", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "TrophyHatchling", amount = 2, amountPerLevel = 0 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorDragonslayerChest", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Silver", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "WolfPelt", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "Obsidian", amount = 10, amountPerLevel = 3 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorDragonslayerLegs", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Silver", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "WolfPelt", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "Obsidian", amount = 10, amountPerLevel = 3 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); } } public class HeavyBackpack : ArmorSetConfig { public HeavyBackpack() { setEffect = new SetEffect { carryWeightModifier = 200 }; ArmorConfig value = new ArmorConfig { prefabName = "BackpackHeavy", armor = 0, weight = 30, movementSpeedModifier = -5, baseDurability = 100, durabilityPerLevel = 100, recipe = new RecipeConfig { station = "piece_workbench", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Wood", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "IronNails", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "Iron", amount = 2, amountPerLevel = 1 } } } }; items.Add("backpack", value); } } public class Noble : ArmorSetConfig { public Noble() { setEffect = new SetEffect { staminaReregenModifier = 5, healthRegenModifier = 5, runStaminaDrainModifier = -5 }; int armor = 1; int weight = 5; string station = "piece_workbench"; string item = "LeatherScraps"; int amount = 5; int amountPerLevel = 1; string item2 = "DeerHide"; int amount2 = 2; int amountPerLevel2 = 1; ArmorConfig value = new ArmorConfig { prefabName = "ArmorNobleHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = station, requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = item, amount = amount, amountPerLevel = amountPerLevel }, new RecipeConfig.RequirementConfig { item = item2, amount = amount2, amountPerLevel = amountPerLevel2 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorNobleChest", armor = armor, weight = weight, recipe = new RecipeConfig { station = station, requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = item, amount = amount, amountPerLevel = amountPerLevel }, new RecipeConfig.RequirementConfig { item = item2, amount = amount2, amountPerLevel = amountPerLevel2 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorNobleLegs", armor = armor, weight = weight, recipe = new RecipeConfig { station = station, requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = item, amount = amount, amountPerLevel = amountPerLevel }, new RecipeConfig.RequirementConfig { item = item2, amount = amount2, amountPerLevel = amountPerLevel2 } } } }; ArmorConfig value4 = new ArmorConfig { prefabName = "ArmorNobleCape", armor = 1, weight = 1, countsTowardsSetBonus = false, recipe = new RecipeConfig { station = station, requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = item, amount = amount, amountPerLevel = amountPerLevel } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); items.Add("cape", value4); } } public class Nomad : ArmorSetConfig { public Nomad() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { runStaminaDrainModifier = -15 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)102; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 25; obj.skillModifier = skillModifier; setEffect = obj; Dictionary<string, string> damageModifiers = setEffect.damageModifiers; DamageType val2 = (DamageType)64; string key = ((object)(DamageType)(ref val2)).ToString().ToString(); DamageModifier val3 = (DamageModifier)1; damageModifiers[key] = ((object)(DamageModifier)(ref val3)).ToString(); int armor = 20; int weight = 10; ArmorConfig value = new ArmorConfig { prefabName = "ArmorBlackmetalgarbHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "BlackMetal", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 20, amountPerLevel = 5 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorBlackmetalgarbChest", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "BlackMetal", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 20, amountPerLevel = 5 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorBlackmetalgarbLegs", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "BlackMetal", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 20, amountPerLevel = 5 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); } } public class Plate : ArmorSetConfig { public Plate() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { healthRegenModifier = 10 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)6; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 20; obj.skillModifier = skillModifier; setEffect = obj; int armor = 18; int weight = 20; int movementSpeedModifier = -5; ArmorConfig value = new ArmorConfig { prefabName = "ArmorPlateIronHelmetJD", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Iron", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 5, amountPerLevel = 1 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorPlateIronChestJD", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Iron", amount = 25, amountPerLevel = 8 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 5, amountPerLevel = 1 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorPlateIronLegsJD", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Iron", amount = 25, amountPerLevel = 8 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 5, amountPerLevel = 1 } } } }; ArmorConfig value4 = new ArmorConfig { prefabName = "ArmorPlateCape", armor = 4, weight = 8, movementSpeedModifier = -3, countsTowardsSetBonus = false, recipe = new RecipeConfig { station = "piece_workbench", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "TrophyBoar", amount = 3, amountPerLevel = 1 }, new RecipeConfig.RequirementConfig { item = "Iron", amount = 2, amountPerLevel = 1 }, new RecipeConfig.RequirementConfig { item = "LeatherScraps", amount = 10, amountPerLevel = 5 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); items.Add("cape", value4); } } public class Scorched : ArmorSetConfig { public Scorched() { //IL_001c: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { healthRegenModifier = 10 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)1; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 15; obj.skillModifier = skillModifier; setEffect = obj; Dictionary<string, string> damageModifiers = setEffect.damageModifiers; DamageType val2 = (DamageType)32; string? key = ((object)(DamageType)(ref val2)).ToString(); DamageModifier val3 = (DamageModifier)1; damageModifiers[key] = ((object)(DamageModifier)(ref val3)).ToString(); Dictionary<string, string> damageModifiers2 = setEffect.damageModifiers; val2 = (DamageType)64; string? key2 = ((object)(DamageType)(ref val2)).ToString(); val3 = (DamageModifier)1; damageModifiers2[key2] = ((object)(DamageModifier)(ref val3)).ToString(); int armor = 34; int weight = 20; int movementSpeedModifier = -5; ArmorConfig value = new ArmorConfig { prefabName = "ArmorMistlandsHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "FlametalNew", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 10, amountPerLevel = 3 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorMistlandsChest", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "FlametalNew", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 10, amountPerLevel = 3 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorMistlandsLegs", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "FlametalNew", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 10, amountPerLevel = 3 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); } } public class Serpent : ArmorSetConfig { public Serpent() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_037e: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { staminaReregenModifier = 15, healthRegenModifier = 15 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)103; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 30; obj.skillModifier = skillModifier; setEffect = obj; int armor = 30; int weight = 20; int movementSpeedModifier = -5; ArmorConfig value = new ArmorConfig { prefabName = "ArmorSerpentHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "BlackMetal", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "Silver", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 10, amountPerLevel = 2 }, new RecipeConfig.RequirementConfig { item = "TrophySerpent", amount = 2, amountPerLevel = 0 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorSerpentChest", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "BlackMetal", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "Silver", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 5, amountPerLevel = 2 }, new RecipeConfig.RequirementConfig { item = "SerpentScale", amount = 5, amountPerLevel = 2 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorSerpentLegs", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "BlackMetal", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "Silver", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LoxPelt", amount = 5, amountPerLevel = 2 }, new RecipeConfig.RequirementConfig { item = "SerpentScale", amount = 5, amountPerLevel = 2 } } } }; ArmorConfig armorConfig = new ArmorConfig { prefabName = "ArmorSerpentCape", armor = 3, weight = 6, recipe = new RecipeConfig { station = "piece_workbench", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Silver", amount = 5, amountPerLevel = 1 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 20, amountPerLevel = 5 } } } }; Dictionary<string, string> damageModifiers = armorConfig.damageModifiers; DamageType val2 = (DamageType)64; string? key = ((object)(DamageType)(ref val2)).ToString(); DamageModifier val3 = (DamageModifier)1; damageModifiers[key] = ((object)(DamageModifier)(ref val3)).ToString(); items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); items.Add("cape", armorConfig); } } public class SimpleBackpack : ArmorSetConfig { public SimpleBackpack() { setEffect = new SetEffect { carryWeightModifier = 100 }; ArmorConfig value = new ArmorConfig { prefabName = "BackpackSimple", armor = 0, weight = 15, movementSpeedModifier = -5, baseDurability = 10, durabilityPerLevel = 10, recipe = new RecipeConfig { station = "piece_workbench", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Wood", amount = 20, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 5, amountPerLevel = 2 }, new RecipeConfig.RequirementConfig { item = "LeatherScraps", amount = 10, amountPerLevel = 5 } } } }; items.Add("backpack", value); } } public class Wanderer : ArmorSetConfig { public Wanderer() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) SetEffect obj = new SetEffect { staminaReregenModifier = 15, carryWeightModifier = 50 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)1; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 15; obj.skillModifier = skillModifier; setEffect = obj; int armor = 22; int weight = 10; int movementSpeedModifier = -3; ArmorConfig value = new ArmorConfig { prefabName = "ArmorWandererHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Flax", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "Iron", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 10, amountPerLevel = 3 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorWandererChest", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Iron", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 20, amountPerLevel = 10 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorWandererLegs", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Iron", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 20, amountPerLevel = 10 } } } }; ArmorConfig value4 = new ArmorConfig { prefabName = "ArmorWandererCape", armor = 2, weight = 5, countsTowardsSetBonus = false, recipe = new RecipeConfig { station = "piece_workbench", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Flax", amount = 15, amountPerLevel = 5 }, new RecipeConfig.RequirementConfig { item = "Iron", amount = 10, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "LinenThread", amount = 10, amountPerLevel = 3 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); items.Add("cape", value4); } } public class Warrior : ArmorSetConfig { public Warrior() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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) SetEffect obj = new SetEffect { healthRegenModifier = 10 }; SkillModifier skillModifier = new SkillModifier(); SkillType val = (SkillType)4; skillModifier.skill = ((object)(SkillType)(ref val)).ToString(); skillModifier.modifier = 15; obj.skillModifier = skillModifier; setEffect = obj; Dictionary<string, string> damageModifiers = setEffect.damageModifiers; DamageType val2 = (DamageType)2; string? key = ((object)(DamageType)(ref val2)).ToString(); DamageModifier val3 = (DamageModifier)1; damageModifiers[key] = ((object)(DamageModifier)(ref val3)).ToString(); int armor = 6; int weight = 15; int movementSpeedModifier = -5; ArmorConfig value = new ArmorConfig { prefabName = "ArmorWarriorHelmet", armor = armor, weight = weight, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Bronze", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 3, amountPerLevel = 1 } } } }; ArmorConfig value2 = new ArmorConfig { prefabName = "ArmorWarriorChest", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Bronze", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 3, amountPerLevel = 1 }, new RecipeConfig.RequirementConfig { item = "Stone", amount = 20, amountPerLevel = 0 }, new RecipeConfig.RequirementConfig { item = "Raspberry", amount = 20, amountPerLevel = 0 } } } }; ArmorConfig value3 = new ArmorConfig { prefabName = "ArmorWarriorLegs", armor = armor, weight = weight, movementSpeedModifier = movementSpeedModifier, recipe = new RecipeConfig { station = "forge", requirements = new List<RecipeConfig.RequirementConfig> { new RecipeConfig.RequirementConfig { item = "Bronze", amount = 5, amountPerLevel = 3 }, new RecipeConfig.RequirementConfig { item = "DeerHide", amount = 3, amountPerLevel = 1 } } } }; items.Add("helmet", value); items.Add("chest", value2); items.Add("legs", value3); } } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [Microsoft.CodeAnalysis.Embedded] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 ServerSync { [PublicAPI] internal abstract class OwnConfigEntryBase { public object? LocalBaseValue; public bool SynchronizedConfig = true; public abstract ConfigEntryBase BaseConfig { get; } } [PublicAPI] internal class SyncedConfigEntry<T> : OwnConfigEntryBase { public readonly ConfigEntry<T> SourceConfig; public override ConfigEntryBase BaseConfig => (ConfigEntryBase)(object)SourceConfig; public T Value { get { return SourceConfig.Value; } set { SourceConfig.Value = value; } } public SyncedConfigEntry(ConfigEntry<T> sourceConfig) { SourceConfig = sourceConfig; base..ctor(); } public void AssignLocalValue(T value) { if (LocalBaseValue == null) { Value = value; } else { LocalBaseValue = value; } } } internal abstract class CustomSyncedValueBase { public object? LocalBaseValue; public readonly string Identifier; public readonly Type Type; private object? boxedValue; protected bool localIsOwner; public readonly int Priority; public object? BoxedValue { get { return boxedValue; } set { boxedValue = value; this.ValueChanged?.Invoke(); } } public event Action? ValueChanged; protected CustomSyncedValueBase(ConfigSync configSync, string identifier, Type type, int priority) { Priority = priority; Identifier = identifier; Type = type; configSync.AddCustomValue(this); localIsOwner = configSync.IsSourceOfTruth; configSync.SourceOfTruthChanged += delegate(bool truth) { localIsOwner = truth; }; } } [PublicAPI] internal sealed class CustomSyncedValue<T> : CustomSyncedValueBase { public T Value { get { return (T)base.BoxedValue; } set { base.BoxedValue = value; } } public CustomSyncedValue(ConfigSync configSync, string identifier, T value = default(T), int priority = 0) : base(configSync, identifier, typeof(T), priority) { Value = value; } public void AssignLocalValue(T value) { if (localIsOwner) { Value = value; } else { LocalBaseValue = value; } } } internal class ConfigurationManagerAttributes { [UsedImplicitly] public bool? ReadOnly = false; } [PublicAPI] internal class ConfigSync { [HarmonyPatch(typeof(ZRpc), "HandlePackage")] private static class SnatchCurrentlyHandlingRPC { public static ZRpc? currentRpc; [HarmonyPrefix] private static void Prefix(ZRpc __instance) { currentRpc = __instance; } } [HarmonyPatch(typeof(ZNet), "Awake")] internal static class RegisterRPCPatch { [HarmonyPostfix] private static void Postfix(ZNet __instance) { isServer = __instance.IsServer(); foreach (ConfigSync configSync2 in configSyncs) { ZRoutedRpc.instance.Register<ZPackage>(configSync2.Name + " ConfigSync", (Action<long, ZPackage>)configSync2.RPC_FromOtherClientConfigSync); if (isServer) { configSync2.InitialSyncDone = true; Debug.Log((object)("Registered '" + configSync2.Name + " ConfigSync' RPC - waiting for incoming connections")); } } if (isServer) { ((MonoBehaviour)__instance).StartCoroutine(WatchAdminListChanges()); } static void SendAdmin(List<ZNetPeer> peers, bool isAdmin) { ZPackage package = ConfigsToPackage(null, null, new PackageEntry[1] { new PackageEntry { section = "Internal", key = "lockexempt", type = typeof(bool), value = isAdmin } }); ConfigSync configSync = configSyncs.First(); if (configSync != null) { ((MonoBehaviour)ZNet.instance).StartCoroutine(configSync.sendZPackage(peers, package)); } } static IEnumerator WatchAdminListChanges() { MethodInfo listContainsId = AccessTools.DeclaredMethod(typeof(ZNet), "ListContainsId", (Type[])null, (Type[])null); SyncedList adminList = (SyncedList)AccessTools.DeclaredField(typeof(ZNet), "m_adminList").GetValue(ZNet.instance); List<string> CurrentList = new List<string>(adminList.GetList()); while (true) { yield return (object)new WaitForSeconds(30f); if (!adminList.GetList().SequenceEqual(CurrentList)) { CurrentList = new List<string>(adminList.GetList()); List<ZNetPeer> adminPeer = ZNet.instance.GetPeers().Where(delegate(ZNetPeer p) { string hostName = p.m_rpc.GetSocket().GetHostName(); return ((object)listContainsId == null) ? adminList.Contains(hostName) : ((bool)listContainsId.Invoke(ZNet.instance, new object[2] { adminList, hostName })); }).ToList(); List<ZNetPeer> nonAdminPeer = ZNet.instance.GetPeers().Except(adminPeer).ToList(); SendAdmin(nonAdminPeer, isAdmin: false); SendAdmin(adminPeer, isAdmin: true); } } } } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] private static class RegisterClientRPCPatch { [HarmonyPostfix] private static void Postfix(ZNet __instance, ZNetPeer peer) { if (__instance.IsServer()) { return; } foreach (ConfigSync configSync in configSyncs) { peer.m_rpc.Register<ZPackage>(configSync.Name + " ConfigSync", (Action<ZRpc, ZPackage>)configSync.RPC_FromServerConfigSync); } } } private class ParsedConfigs { public readonly Dictionary<OwnConfigEntryBase, object?> configValues = new Dictionary<OwnConfigEntryBase, object>(); public readonly Dictionary<CustomSyncedValueBase, object?> customValues = new Dictionary<CustomSyncedValueBase, object>(); } [HarmonyPatch(typeof(ZNet), "Shutdown")] private class ResetConfigsOnShutdown { [HarmonyPostfix] private static void Postfix() { ProcessingServerUpdate = true; foreach (ConfigSync configSync in configSyncs) { configSync.resetConfigsFromServer(); configSync.IsSourceOfTruth = true; configSync.InitialSyncDone = false; } ProcessingServerUpdate = false; } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] private class SendConfigsAfterLogin { private class BufferingSocket : ZPlayFabSocket, ISocket { public volatile bool finished = false; public volatile int versionMatchQueued = -1; public readonly List<ZPackage> Package = new List<ZPackage>(); public readonly ISocket Original; public BufferingSocket(ISocket original) { Original = original; ((ZPlayFabSocket)this)..ctor(); } public bool IsConnected() { return Original.IsConnected(); } public ZPackage Recv() { return Original.Recv(); } public int GetSendQueueSize() { return Original.GetSendQueueSize(); } public int GetCurrentSendRate() { return Original.GetCurrentSendRate(); } public bool IsHost() { return Original.IsHost(); } public void Dispose() { Original.Dispose(); } public bool GotNewData() { return Original.GotNewData(); } public void Close() { Original.Close(); } public string GetEndPointString() { return Original.GetEndPointString(); } public void GetAndResetStats(out int totalSent, out int totalRecv) { Original.GetAndResetStats(ref totalSent, ref totalRecv); } public void GetConnectionQuality(out float localQuality, out float remoteQuality, out int ping, out float outByteSec, out float inByteSec) { Original.GetConnectionQuality(ref localQuality, ref remoteQuality, ref ping, ref outByteSec, ref inByteSec); } public ISocket Accept() { return Original.Accept(); } public int GetHostPort() { return Original.GetHostPort(); } public bool Flush() { return Original.Flush(); } public string GetHostName() { return Original.GetHostName(); } public void VersionMatch() { if (finished) { Original.VersionMatch(); } else { versionMatchQueued = Package.Count; } } public void Send(ZPackage pkg) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown int pos = pkg.GetPos(); pkg.SetPos(0); int num = pkg.ReadInt(); if ((num == StringExtensionMethods.GetStableHashCode("PeerInfo") || num == StringExtensionMethods.GetStableHashCode("RoutedRPC") || num == StringExtensionMethods.GetStableHashCode("ZDOData")) && !finished) { ZPackage val = new ZPackage(pkg.GetArray()); val.SetPos(pos); Package.Add(val); } else { pkg.SetPos(pos); Original.Send(pkg); } } } [HarmonyPriority(800)] [HarmonyPrefix] private static void Prefix(ref Dictionary<Assembly, BufferingSocket>? __state, ZNet __instance, ZRpc rpc) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Invalid comparison between Unknown and I4 if (!__instance.IsServer()) { return; } BufferingSocket bufferingSocket = new BufferingSocket(rpc.GetSocket()); AccessTools.DeclaredField(typeof(ZRpc), "m_socket").SetValue(rpc, bufferingSocket); object? obj = AccessTools.DeclaredMethod(typeof(ZNet), "GetPeer", new Type[1] { typeof(ZRpc) }, (Type[])null).Invoke(__instance, new object[1] { rpc }); ZNetPeer val = (ZNetPeer)((obj is ZNetPeer) ? obj : null); if (val != null && (int)ZNet.m_onlineBackend > 0) { FieldInfo fieldInfo = AccessTools.DeclaredField(typeof(ZNetPeer), "m_socket"); object? value = fieldInfo.GetValue(val); ZPlayFabSocket val2 = (ZPlayFabSocket)((value is ZPlayFabSocket) ? value : null); if (val2 != null) { typeof(ZPlayFabSocket).GetField("m_remotePlayerId").SetValue(bufferingSocket, val2.m_remotePlayerId); } fieldInfo.SetValue(val, bufferingSocket); } if (__state == null) { __state = new Dictionary<Assembly, BufferingSocket>(); } __state[Assembly.GetExecutingAssembly()] = bufferingSocket; } [HarmonyPostfix] private static void Postfix(Dictionary<Assembly, BufferingSocket> __state, ZNet __instance, ZRpc rpc) { ZRpc rpc2 = rpc; ZNet __instance2 = __instance; Dictionary<Assembly, BufferingSocket> __state2 = __state; ZNetPeer peer; if (__instance2.IsServer()) { object obj = AccessTools.DeclaredMethod(typeof(ZNet), "GetPeer", new Type[1] { typeof(ZRpc) }, (Type[])null).Invoke(__instance2, new object[1] { rpc2 }); peer = (ZNetPeer)((obj is ZNetPeer) ? obj : null); if (peer == null) { SendBufferedData(); } else { ((MonoBehaviour)__instance2).StartCoroutine(sendAsync()); } } void SendBufferedData() { if (rpc2.GetSocket() is BufferingSocket bufferingSocket) { AccessTools.DeclaredField(typeof(ZRpc), "m_socket").SetValue(rpc2, bufferingSocket.Original); object? obj2 = AccessTools.DeclaredMethod(typeof(ZNet), "GetPeer", new Type[1] { typeof(ZRpc) }, (Type[])null).Invoke(__instance2, new object[1] { rpc2 }); ZNetPeer val = (ZNetPeer)((obj2 is ZNetPeer) ? obj2 : null); if (val != null) { AccessTools.DeclaredField(typeof(ZNetPeer), "m_socket").SetValue(val, bufferingSocket.Original); } } BufferingSocket bufferingSocket2 = __state2[Assembly.GetExecutingAssembly()]; bufferingSocket2.finished = true; for (int i = 0; i < bufferingSocket2.Package.Count; i++) { if (i == bufferingSocket2.versionMatchQueued) { bufferingSocket2.Original.VersionMatch(); } bufferingSocket2.Original.Send(bufferingSocket2.Package[i]); } if (bufferingSocket2.Package.Count == bufferingSocket2.versionMatchQueued) { bufferingSocket2.Original.VersionMatch(); } } IEnumerator sendAsync() { f